diff --git a/androidProjectHelpers.js b/androidProjectHelpers.js new file mode 100644 index 00000000..2ea1a6bc --- /dev/null +++ b/androidProjectHelpers.js @@ -0,0 +1,52 @@ +const { join, resolve } = require("path"); +const { existsSync, readFileSync } = require("fs"); + +const { getPackageJson } = require("./projectHelpers"); + +const PLATFORMS_ANDROID = "platforms/android"; +const ANDROID_PROJECT_DIR = join(PLATFORMS_ANDROID, "app"); +const ANDROID_APP_PATH = join(ANDROID_PROJECT_DIR, "src/main/assets/app"); +const ANDROID_CONFIGURATIONS_PATH = join(ANDROID_PROJECT_DIR, "build/configurations"); + +const getAndroidRuntimeVersion = (projectDir) => { + try { + const projectPackageJSON = getPackageJson(projectDir); + + const version = projectPackageJSON["nativescript"]["tns-android"]["version"]; + return version && toReleaseVersion(version); + } catch (e) { + return null; + } +} + +const toReleaseVersion = version => version.replace(/-.*/, ""); + +const getAndroidV8Version = (projectDir) => { + try { + const androidSettingsJSON = getAndroidSettingsJson(projectDir); + if (androidSettingsJSON !== null) { + return androidSettingsJSON.v8Version; + } else { + return null; + } + } catch (e) { + return null; + } +} + +const getAndroidSettingsJson = projectDir => { + const androidSettingsJsonPath = resolve(projectDir, PLATFORMS_ANDROID, "settings.json"); + if (existsSync(androidSettingsJsonPath)) { + return JSON.parse(readFileSync(androidSettingsJsonPath, "utf8")); + } else { + return null; + } +}; + +module.exports = { + ANDROID_PROJECT_DIR, + ANDROID_APP_PATH, + ANDROID_CONFIGURATIONS_PATH, + getAndroidRuntimeVersion, + getAndroidV8Version, +}; \ No newline at end of file diff --git a/index.js b/index.js index 7c5aa25f..d11a6317 100644 --- a/index.js +++ b/index.js @@ -1,12 +1,12 @@ const path = require("path"); const { existsSync } = require("fs"); +const { ANDROID_APP_PATH } = require("./androidProjectHelpers"); const { getPackageJson, isAngular, isAndroid, isIos, - resolveAndroidAppPath, } = require("./projectHelpers"); Object.assign(exports, require('./plugins')); @@ -54,7 +54,7 @@ exports.getAppPath = (platform, projectDir) => { return `platforms/ios/${sanitizedName}/app`; } else if (isAndroid(platform)) { - return resolveAndroidAppPath(projectDir); + return ANDROID_APP_PATH; } else { throw new Error(`Invalid platform: ${platform}`); } diff --git a/plugins/NativeScriptSnapshotPlugin/index.js b/plugins/NativeScriptSnapshotPlugin/index.js index f489aa14..8abb0cef 100644 --- a/plugins/NativeScriptSnapshotPlugin/index.js +++ b/plugins/NativeScriptSnapshotPlugin/index.js @@ -3,7 +3,10 @@ const { closeSync, openSync, writeFileSync } = require("fs"); const validateOptions = require("schema-utils"); const ProjectSnapshotGenerator = require("../../snapshot/android/project-snapshot-generator"); -const { resolveAndroidAppPath, getAndroidProjectPath } = require("../../projectHelpers"); +const { + ANDROID_PROJECT_DIR, + ANDROID_APP_PATH, +} = require("../../androidProjectHelpers"); const schema = require("./options.json"); const SNAPSHOT_ENTRY_NAME = "snapshot-entry"; @@ -34,10 +37,9 @@ exports.NativeScriptSnapshotPlugin = (function() { } NativeScriptSnapshotPlugin.ensureSnapshotModuleEntry = function(options) { - const { webpackConfig, requireModules, chunks, projectRoot, includeApplicationCss } = options; + const { webpackConfig, requireModules, chunks, includeApplicationCss } = options; - const androidProjectPath = getAndroidProjectPath({ projectRoot: projectRoot }); - const snapshotEntryPath = join(androidProjectPath, SNAPSHOT_ENTRY_MODULE); + const snapshotEntryPath = join(ANDROID_PROJECT_DIR, SNAPSHOT_ENTRY_MODULE); let snapshotEntryContent = ""; if (includeApplicationCss) { @@ -81,10 +83,13 @@ exports.NativeScriptSnapshotPlugin = (function() { NativeScriptSnapshotPlugin.prototype.generate = function (webpackChunks) { const options = this.options; const inputFiles = webpackChunks.map(chunk => join(options.webpackConfig.output.path, chunk.files[0])); - console.log(`\n Snapshotting bundle from ${inputFiles}`); + const preprocessedInputFile = join( + this.options.projectRoot, + ANDROID_APP_PATH, + "_embedded_script_.js" + ); - const preparedAppRootPath = resolveAndroidAppPath(this.options.projectRoot); - const preprocessedInputFile = join(preparedAppRootPath, "_embedded_script_.js"); + console.log(`\n Snapshotting bundle from ${inputFiles}`); return ProjectSnapshotGenerator.prototype.generate.call(this, { inputFiles, diff --git a/projectHelpers.js b/projectHelpers.js index 2984491c..67108138 100644 --- a/projectHelpers.js +++ b/projectHelpers.js @@ -1,7 +1,7 @@ -const path = require("path"); -const fs = require("fs"); -const semver = require("semver"); +const { resolve } = require("path"); +const { readFileSync, writeFileSync } = require("fs"); const { EOL } = require("os"); + const hook = require("nativescript-hook")(__dirname); const PROJECT_DATA_GETTERS = { @@ -9,9 +9,6 @@ const PROJECT_DATA_GETTERS = { appResourcesPath: "getAppResourcesRelativeDirectoryPath", }; -const APP_DIR = "app"; -const ANDROID_PROJECT_PATH = "platforms/android"; - const isTypeScript = ({ projectDir, packageJson } = {}) => { packageJson = packageJson || getPackageJson(projectDir); @@ -33,42 +30,19 @@ const isAngular = ({ projectDir, packageJson } = {}) => { const isSass = ({ projectDir, packageJson } = {}) => { packageJson = packageJson || getPackageJson(projectDir); + const SASS_PLUGIN_NAME = "nativescript-dev-sass"; return ( packageJson.dependencies && - packageJson.dependencies.hasOwnProperty("nativescript-dev-sass") + packageJson.dependencies.hasOwnProperty(SASS_PLUGIN_NAME) ) || ( - packageJson.devDependencies && - packageJson.devDependencies.hasOwnProperty("nativescript-dev-sass") - ); + packageJson.devDependencies && + packageJson.devDependencies.hasOwnProperty(SASS_PLUGIN_NAME) + ); }; -const getAndroidRuntimeVersion = (projectDir) => { - try { - const projectPackageJSON = getPackageJson(projectDir); - - const version = projectPackageJSON["nativescript"]["tns-android"]["version"]; - return version && toReleaseVersion(version); - } catch (e) { - return null; - } -} - -const getAndroidV8Version = (projectDir) => { - try { - const androidSettingsJSON = getAndroidSettingsJson(projectDir); - if(androidSettingsJSON != null) { - return androidSettingsJSON.v8Version; - } else { - return null; - } - } catch (e) { - return null; - } -} - const getWebpackConfig = (projectDir, env, configPath = "webpack.config.js") => { - const configAbsolutePath = path.resolve(projectDir, configPath); + const configAbsolutePath = resolve(projectDir, configPath); let config; try { @@ -92,59 +66,16 @@ const getWebpackConfig = (projectDir, env, configPath = "webpack.config.js") => const getPackageJson = projectDir => { const packageJsonPath = getPackageJsonPath(projectDir); - return JSON.parse(fs.readFileSync(packageJsonPath, "utf8")); -}; - -const getAndroidSettingsJson = projectDir => { - const androidSettingsJsonPath = path.resolve(projectDir, ANDROID_PROJECT_PATH, "settings.json"); - if (fs.existsSync(androidSettingsJsonPath)) { - return JSON.parse(fs.readFileSync(androidSettingsJsonPath, "utf8")); - } else { - return null; - } + return JSON.parse(readFileSync(packageJsonPath, "utf8")); }; const writePackageJson = (content, projectDir) => { const packageJsonPath = getPackageJsonPath(projectDir); - fs.writeFileSync(packageJsonPath, JSON.stringify(content, null, 2)) + writeFileSync(packageJsonPath, JSON.stringify(content, null, 2)) } const getProjectDir = hook.findProjectDir; -const toReleaseVersion = version => - version.replace(/-.*/, ""); - -const getAndroidProjectPath = ({androidPackageVersion, projectRoot}) => { - if (projectRoot) { - androidPackageVersion = getAndroidRuntimeVersion(projectRoot); - } - - return semver.lt(androidPackageVersion, "3.4.0") ? - ANDROID_PROJECT_PATH : - path.join(ANDROID_PROJECT_PATH, APP_DIR); -}; - - -const resolveAndroidAppPath = projectDir => { - const RESOURCES_PATH = "src/main/assets/app"; - const androidPackageVersion = getAndroidRuntimeVersion(projectDir); - const androidProjectPath = getAndroidProjectPath({androidPackageVersion}); - - return path.join(projectDir, androidProjectPath, RESOURCES_PATH); -}; - -const resolveAndroidConfigurationsPath = projectDir => { - const CONFIGURATIONS_DIR = "configurations"; - const androidPackageVersion = getAndroidRuntimeVersion(projectDir); - const androidProjectPath = getAndroidProjectPath({androidPackageVersion}); - - const configurationsPath = semver.lt(androidPackageVersion, "3.3.0") ? - path.join(androidProjectPath, CONFIGURATIONS_DIR): - path.join(androidProjectPath, "build", CONFIGURATIONS_DIR); - - return path.join(projectDir, configurationsPath); -}; - -const getPackageJsonPath = projectDir => path.resolve(projectDir, "package.json"); +const getPackageJsonPath = projectDir => resolve(projectDir, "package.json"); const isAndroid = platform => /android/i.test(platform); const isIos = platform => /ios/i.test(platform); @@ -173,12 +104,8 @@ function safeGet(object, property, ...args) { } module.exports = { - APP_DIR, getAppPathFromProjectData, getAppResourcesPathFromProjectData, - getAndroidProjectPath, - getAndroidRuntimeVersion, - getAndroidV8Version, getPackageJson, getProjectDir, getWebpackConfig, @@ -187,7 +114,5 @@ module.exports = { isAngular, isSass, isTypeScript, - resolveAndroidAppPath, - resolveAndroidConfigurationsPath, writePackageJson, }; diff --git a/snapshot/android/project-snapshot-generator.js b/snapshot/android/project-snapshot-generator.js index 267e7cb9..051fdc53 100644 --- a/snapshot/android/project-snapshot-generator.js +++ b/snapshot/android/project-snapshot-generator.js @@ -10,14 +10,14 @@ const { createDirectory, getJsonFile, } = require("./utils"); +const { getPackageJson } = require("../../projectHelpers"); const { - getPackageJson, + ANDROID_PROJECT_DIR, + ANDROID_APP_PATH, + ANDROID_CONFIGURATIONS_PATH, getAndroidRuntimeVersion, - getAndroidProjectPath, getAndroidV8Version, - resolveAndroidAppPath, - resolveAndroidConfigurationsPath, -} = require("../../projectHelpers"); +} = require("../../androidProjectHelpers"); const MIN_ANDROID_RUNTIME_VERSION = "3.0.0"; const VALID_ANDROID_RUNTIME_TAGS = Object.freeze(["next", "rc"]); @@ -55,8 +55,15 @@ ProjectSnapshotGenerator.prototype.getBuildPath = function () { } ProjectSnapshotGenerator.calculateProjectPath = function (projectRoot) { - const projectPath = getAndroidProjectPath({projectRoot}); - return join(projectRoot, projectPath); + return join(projectRoot, ANDROID_PROJECT_DIR); +} + +ProjectSnapshotGenerator.calculateConfigurationsPath = function (projectRoot) { + return join(projectRoot, ANDROID_CONFIGURATIONS_PATH); +} + +ProjectSnapshotGenerator.calculateAppPath = function (projectRoot) { + return join(projectRoot, ANDROID_APP_PATH); } ProjectSnapshotGenerator.prototype.getProjectPath = function () { @@ -70,7 +77,7 @@ ProjectSnapshotGenerator.cleanSnapshotArtefacts = function (projectRoot) { shelljs.rm("-rf", join(platformPath, "src/main/assets/snapshots")); // Remove prepared include.gradle configurations - const configurationsPath = resolveAndroidConfigurationsPath(projectRoot); + const configurationsPath = ProjectSnapshotGenerator.calculateConfigurationsPath(projectRoot); shelljs.rm("-rf", join(configurationsPath, SnapshotGenerator.SNAPSHOT_PACKAGE_NANE)); } @@ -78,8 +85,8 @@ ProjectSnapshotGenerator.installSnapshotArtefacts = function (projectRoot) { const buildPath = ProjectSnapshotGenerator.calculateBuildPath(projectRoot); const platformPath = ProjectSnapshotGenerator.calculateProjectPath(projectRoot); - const appPath = resolveAndroidAppPath(projectRoot); - const configurationsPath = resolveAndroidConfigurationsPath(projectRoot); + const appPath = ProjectSnapshotGenerator.calculateAppPath(projectRoot); + const configurationsPath = ProjectSnapshotGenerator.calculateConfigurationsPath(projectRoot); const configDestinationPath = join(configurationsPath, SnapshotGenerator.SNAPSHOT_PACKAGE_NANE); // Remove build folder to make sure that the apk will be fully rebuild @@ -96,8 +103,7 @@ ProjectSnapshotGenerator.installSnapshotArtefacts = function (projectRoot) { // Copy the libs to the specified destination in the platforms folder shelljs.mkdir("-p", libsDestinationPath); shelljs.cp("-R", join(buildPath, "ndk-build/libs") + "/", libsDestinationPath); - } - else { + } else { // useLibs = false const blobsSrcPath = join(buildPath, "snapshots/blobs"); const blobsDestinationPath = resolve(appPath, "../snapshots");