Skip to content
This repository was archived by the owner on Aug 7, 2021. It is now read-only.

Commit fc45d4f

Browse files
Plamen5kovsis0k0
authored andcommitted
refactor: update Android project path to support next runtime (#310)
1 parent 13a78dd commit fc45d4f

File tree

4 files changed

+111
-52
lines changed

4 files changed

+111
-52
lines changed

Diff for: index.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
const path = require("path");
22
const { existsSync } = require("fs");
33

4-
const { getPackageJson, getProjectDir, isAngular } = require("./projectHelpers");
4+
const { getPackageJson, getProjectDir, isAngular, resolveAndroidAppPath } = require("./projectHelpers");
55

66
const PROJECT_DIR = getProjectDir({ nestingLvl: 2 });
77
const APP_DIR = path.join(PROJECT_DIR, "app");
88

99
Object.assign(exports, require('./plugins'));
1010

11-
if (isAngular({projectDir: PROJECT_DIR})) {
11+
if (isAngular({ projectDir: PROJECT_DIR })) {
1212
Object.assign(exports, require('./plugins/angular'));
1313
}
1414

@@ -31,7 +31,7 @@ exports.getAppPath = platform => {
3131

3232
return `platforms/ios/${sanitizedName}/app`;
3333
} else if (/android/i.test(platform)) {
34-
return path.join(PROJECT_DIR, "platforms/android/src/main/assets/app");
34+
return resolveAndroidAppPath(PROJECT_DIR);
3535
} else {
3636
throw new Error(`Invalid platform: ${platform}`);
3737
}

Diff for: plugins/NativeScriptSnapshotPlugin.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const { resolve, join } = require("path");
22
const { closeSync, openSync } = require("fs");
33

44
const ProjectSnapshotGenerator = require("../snapshot/android/project-snapshot-generator");
5+
const { resolveAndroidAppPath } = require("../projectHelpers");
56

67
exports.NativeScriptSnapshotPlugin = (function() {
78
function NativeScriptSnapshotPlugin(options) {
@@ -43,16 +44,16 @@ exports.NativeScriptSnapshotPlugin = (function() {
4344

4445
console.log(`\n Snapshotting bundle at ${inputFile}`);
4546

46-
const preparedAppRootPath = join(options.projectRoot, "platforms/android/src/main/assets");
47-
const preprocessedInputFile = join(preparedAppRootPath, "app/_embedded_script_.js");
47+
const preparedAppRootPath = resolveAndroidAppPath(this.options.projectRoot);
48+
const preprocessedInputFile = join(preparedAppRootPath, "_embedded_script_.js");
4849

4950
return ProjectSnapshotGenerator.prototype.generate.call(this, {
5051
inputFile,
5152
preprocessedInputFile,
5253
targetArchs: options.targetArchs,
5354
useLibs: options.useLibs,
5455
androidNdkPath: options.androidNdkPath,
55-
tnsJavaClassesPath: join(preparedAppRootPath, "app/tns-java-classes.js")
56+
tnsJavaClassesPath: join(preparedAppRootPath, "tns-java-classes.js")
5657
}).then(() => {
5758
// Make the original file empty
5859
if (inputFile !== preprocessedInputFile) {

Diff for: projectHelpers.js

+56-6
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,37 @@
11
const path = require("path");
22
const fs = require("fs");
3+
const semver = require("semver");
34

4-
const isTypeScript = ({projectDir, packageJson} = {}) => {
5+
const isTypeScript = ({ projectDir, packageJson } = {}) => {
56
packageJson = packageJson || getPackageJson(projectDir);
67

78
return (
89
packageJson.dependencies &&
910
packageJson.dependencies.hasOwnProperty("typescript")
1011
) || (
11-
packageJson.devDependencies &&
12-
packageJson.devDependencies.hasOwnProperty("typescript")
13-
) || isAngular({packageJson});
12+
packageJson.devDependencies &&
13+
packageJson.devDependencies.hasOwnProperty("typescript")
14+
) || isAngular({ packageJson });
1415
};
1516

16-
const isAngular = ({projectDir, packageJson} = {}) => {
17+
const isAngular = ({ projectDir, packageJson } = {}) => {
1718
packageJson = packageJson || getPackageJson(projectDir);
1819

1920
return packageJson.dependencies && Object.keys(packageJson.dependencies)
2021
.some(dependency => /^@angular\b/.test(dependency));
2122
};
2223

24+
const getAndroidRuntimeVersion = (projectDir) => {
25+
try {
26+
const projectPackageJSON = getPackageJson(projectDir);
27+
28+
const version = projectPackageJSON["nativescript"]["tns-android"]["version"];
29+
return version && toReleaseVersion(version);
30+
} catch (e) {
31+
return null;
32+
}
33+
}
34+
2335
const getPackageJson = projectDir => {
2436
const packageJsonPath = getPackageJsonPath(projectDir);
2537
return JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
@@ -29,7 +41,6 @@ const writePackageJson = (content, projectDir) => {
2941
const packageJsonPath = getPackageJsonPath(projectDir);
3042
fs.writeFileSync(packageJsonPath, JSON.stringify(content, null, 2))
3143
}
32-
3344
const getProjectDir = ({ nestingLvl } = { nestingLvl: 0 }) => {
3445
// INIT_CWD is available since npm 5.4
3546
const initCwd = process.env.INIT_CWD;
@@ -54,6 +65,41 @@ const getProjectDir = ({ nestingLvl } = { nestingLvl: 0 }) => {
5465
.reduce(dir => path.dirname(dir), __dirname);
5566
};
5667

68+
const toReleaseVersion = version =>
69+
version.replace(/-.*/, "");
70+
71+
const getAndroidProjectPath = ({androidPackageVersion, projectRoot}) => {
72+
const ANDROID_PROJECT_PATH = "platforms/android";
73+
if (projectRoot) {
74+
androidPackageVersion = getAndroidRuntimeVersion(projectRoot);
75+
}
76+
77+
return semver.lt(androidPackageVersion, "3.4.0") ?
78+
ANDROID_PROJECT_PATH :
79+
path.join(ANDROID_PROJECT_PATH, "app");
80+
};
81+
82+
83+
const resolveAndroidAppPath = projectDir => {
84+
const RESOURCES_PATH = "src/main/assets/app";
85+
const androidPackageVersion = getAndroidRuntimeVersion(projectDir);
86+
const androidProjectPath = getAndroidProjectPath({androidPackageVersion});
87+
88+
return path.join(projectDir, androidProjectPath, RESOURCES_PATH);
89+
};
90+
91+
const resolveAndroidConfigurationsPath = projectDir => {
92+
const CONFIGURATIONS_DIR = "configurations";
93+
const androidPackageVersion = getAndroidRuntimeVersion(projectDir);
94+
const androidProjectPath = getAndroidProjectPath({androidPackageVersion});
95+
96+
const configurationsPath = semver.lt(androidPackageVersion, "3.3.0") ?
97+
path.join(androidProjectPath, CONFIGURATIONS_DIR):
98+
path.join(androidProjectPath, "build", CONFIGURATIONS_DIR);
99+
100+
return path.join(projectDir, configurationsPath);
101+
};
102+
57103
const getPackageJsonPath = projectDir => path.resolve(projectDir, "package.json");
58104

59105
module.exports = {
@@ -62,4 +108,8 @@ module.exports = {
62108
writePackageJson,
63109
getPackageJson,
64110
getProjectDir,
111+
getAndroidRuntimeVersion,
112+
getAndroidProjectPath,
113+
resolveAndroidAppPath,
114+
resolveAndroidConfigurationsPath,
65115
};

Diff for: snapshot/android/project-snapshot-generator.js

+48-40
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,13 @@ const {
1111
createDirectory,
1212
getJsonFile,
1313
} = require("./utils");
14-
const { getPackageJson } = require("../../projectHelpers");
14+
const {
15+
getPackageJson,
16+
getAndroidRuntimeVersion,
17+
getAndroidProjectPath,
18+
resolveAndroidAppPath,
19+
resolveAndroidConfigurationsPath,
20+
} = require("../../projectHelpers");
1521

1622
const MIN_ANDROID_RUNTIME_VERSION = "3.0.0";
1723
const VALID_ANDROID_RUNTIME_TAGS = Object.freeze(["next", "rc"]);
@@ -25,10 +31,9 @@ const resolveRelativePath = (path) => {
2531
return null;
2632
};
2733

28-
function ProjectSnapshotGenerator (options) {
34+
function ProjectSnapshotGenerator(options) {
2935
this.options = options = options || {};
30-
31-
options.projectRoot = resolveRelativePath(options.projectRoot) || process.cwd();
36+
options.projectRoot = resolveRelativePath(options.projectRoot) || process.cwd();
3237

3338
console.log("Project root: " + options.projectRoot);
3439
console.log("Snapshots build directory: " + this.getBuildPath());
@@ -37,29 +42,45 @@ function ProjectSnapshotGenerator (options) {
3742
}
3843
module.exports = ProjectSnapshotGenerator;
3944

40-
ProjectSnapshotGenerator.calculateBuildPath = function(projectRoot) {
41-
return join(projectRoot, "platforms/android/snapshot-build/build");
45+
ProjectSnapshotGenerator.calculateBuildPath = function (projectRoot) {
46+
return join(
47+
ProjectSnapshotGenerator.calculateProjectPath(projectRoot),
48+
"snapshot-build",
49+
"build"
50+
);
4251
}
4352

44-
ProjectSnapshotGenerator.prototype.getBuildPath = function() {
53+
ProjectSnapshotGenerator.prototype.getBuildPath = function () {
4554
return ProjectSnapshotGenerator.calculateBuildPath(this.options.projectRoot);
4655
}
4756

48-
ProjectSnapshotGenerator.cleanSnapshotArtefacts = function(projectRoot) {
49-
const platformPath = join(projectRoot, "platforms/android");
57+
ProjectSnapshotGenerator.calculateProjectPath = function (projectRoot) {
58+
const projectPath = getAndroidProjectPath({projectRoot});
59+
return join(projectRoot, projectPath);
60+
}
61+
62+
ProjectSnapshotGenerator.prototype.getProjectPath = function () {
63+
return ProjectSnapshotGenerator.calculateProjectPath(this.options.projectRoot);
64+
}
65+
66+
ProjectSnapshotGenerator.cleanSnapshotArtefacts = function (projectRoot) {
67+
const platformPath = ProjectSnapshotGenerator.calculateProjectPath(projectRoot);
5068

5169
// Remove blob files from prepared folder
5270
shelljs.rm("-rf", join(platformPath, "src/main/assets/snapshots"));
5371

5472
// Remove prepared include.gradle configurations
55-
shelljs.rm("-rf", join(platformPath, "configurations/", SnapshotGenerator.SNAPSHOT_PACKAGE_NANE));
73+
const configurationsPath = resolveAndroidConfigurationsPath(projectRoot);
74+
shelljs.rm("-rf", join(configurationsPath, SnapshotGenerator.SNAPSHOT_PACKAGE_NANE));
5675
}
5776

58-
ProjectSnapshotGenerator.installSnapshotArtefacts = function(projectRoot) {
77+
ProjectSnapshotGenerator.installSnapshotArtefacts = function (projectRoot) {
5978
const buildPath = ProjectSnapshotGenerator.calculateBuildPath(projectRoot);
60-
const platformPath = join(projectRoot, "platforms/android");
61-
const assetsPath = join(platformPath, "src/main/assets");
62-
const configDestinationPath = join(platformPath, "configurations", SnapshotGenerator.SNAPSHOT_PACKAGE_NANE);
79+
const platformPath = ProjectSnapshotGenerator.calculateProjectPath(projectRoot);
80+
81+
const appPath = resolveAndroidAppPath(projectRoot);
82+
const configurationsPath = resolveAndroidConfigurationsPath(projectRoot);
83+
const configDestinationPath = join(configurationsPath, SnapshotGenerator.SNAPSHOT_PACKAGE_NANE);
6384

6485
// Remove build folder to make sure that the apk will be fully rebuild
6586
shelljs.rm("-rf", join(platformPath, "build"));
@@ -70,7 +91,7 @@ ProjectSnapshotGenerator.installSnapshotArtefacts = function(projectRoot) {
7091

7192
// Copy tns-java-classes.js
7293
if (shelljs.test("-e", join(buildPath, "tns-java-classes.js"))) {
73-
shelljs.cp(join(buildPath, "tns-java-classes.js"), join(assetsPath, "app/tns-java-classes.js"));
94+
shelljs.cp(join(buildPath, "tns-java-classes.js"), join(appPath, "tns-java-classes.js"));
7495
}
7596

7697
if (shelljs.test("-e", join(buildPath, "ndk-build/libs"))) {
@@ -84,11 +105,11 @@ ProjectSnapshotGenerator.installSnapshotArtefacts = function(projectRoot) {
84105
else {
85106
// useLibs = false
86107
const blobsSrcPath = join(buildPath, "snapshots/blobs");
87-
const blobsDestinationPath = join(assetsPath, "snapshots");
88-
const appPackageJsonPath = join(assetsPath, "app/package.json");
108+
const blobsDestinationPath = resolve(appPath, "../snapshots");
109+
const appPackageJsonPath = join(appPath, "package.json");
89110

90111
// Copy the blobs in the prepared app folder
91-
shelljs.cp("-R", blobsSrcPath + "/", join(assetsPath, "snapshots"));
112+
shelljs.cp("-R", blobsSrcPath + "/", resolve(appPath, "../snapshots"));
92113

93114
/*
94115
Rename TNSSnapshot.blob files to snapshot.blob files. The xxd tool uses the file name for the name of the static array. This is why the *.blob files are initially named TNSSnapshot.blob. After the xxd step, they must be renamed to snapshot.blob, because this is the filename that the Android runtime is looking for.
@@ -120,9 +141,8 @@ const fetchV8VersionsFile = () =>
120141
});
121142

122143
const findV8Version = (runtimeVersion, v8VersionsMap) => {
123-
const runtimeReleaseVersion = runtimeVersion.replace(/-.*/, "");
124144
const runtimeRange = Object.keys(v8VersionsMap)
125-
.find(range => semver.satisfies(runtimeReleaseVersion, range));
145+
.find(range => semver.satisfies(runtimeVersion, range));
126146

127147
return v8VersionsMap[runtimeRange];
128148
}
@@ -139,16 +159,16 @@ const getV8VersionsMap = runtimeVersion =>
139159
}
140160
});
141161

142-
ProjectSnapshotGenerator.prototype.getV8Version = function(generationOptions) {
162+
ProjectSnapshotGenerator.prototype.getV8Version = function (generationOptions) {
143163
return new Promise((resolve, reject) => {
144164
const maybeV8Version = generationOptions.v8Version;
145165
if (maybeV8Version) {
146166
return resolve(maybeV8Version);
147167
}
148168

149-
const runtimeVersion = this.getAndroidRuntimeVersion();
169+
const runtimeVersion = getAndroidRuntimeVersion(this.options.projectRoot);
150170
getV8VersionsMap(runtimeVersion)
151-
.then(({ versionsMap, latest}) => {
171+
.then(({ versionsMap, latest }) => {
152172
const v8Version = findV8Version(runtimeVersion, versionsMap);
153173

154174
if (!v8Version && !latest) {
@@ -165,12 +185,10 @@ ProjectSnapshotGenerator.prototype.getV8Version = function(generationOptions) {
165185
});
166186
}
167187

168-
ProjectSnapshotGenerator.prototype.validateAndroidRuntimeVersion = function() {
169-
const currentRuntimeVersion = this.getAndroidRuntimeVersion();
170-
171-
if (!currentRuntimeVersion ||
172-
!existsSync(join(this.options.projectRoot, "platforms/android"))) {
188+
ProjectSnapshotGenerator.prototype.validateAndroidRuntimeVersion = function () {
189+
const currentRuntimeVersion = getAndroidRuntimeVersion(this.options.projectRoot);
173190

191+
if (!currentRuntimeVersion || !this.getProjectPath()) {
174192
throw new Error("In order to generate a V8 snapshot you must have the \"android\" platform installed - to do so please run \"tns platform add android\".");
175193
}
176194

@@ -182,17 +200,7 @@ ProjectSnapshotGenerator.prototype.validateAndroidRuntimeVersion = function() {
182200
}
183201
}
184202

185-
ProjectSnapshotGenerator.prototype.getAndroidRuntimeVersion = function() {
186-
try {
187-
const projectPackageJSON = getPackageJson(this.options.projectRoot);
188-
189-
return projectPackageJSON["nativescript"]["tns-android"]["version"];
190-
} catch(e) {
191-
return null;
192-
}
193-
}
194-
195-
ProjectSnapshotGenerator.prototype.generateTnsJavaClassesFile = function(generationOptions) {
203+
ProjectSnapshotGenerator.prototype.generateTnsJavaClassesFile = function (generationOptions) {
196204
const tnsJavaClassesGenerator = new TnsJavaClassesGenerator();
197205
return tnsJavaClassesGenerator.generate({
198206
projectRoot: this.options.projectRoot,
@@ -201,7 +209,7 @@ ProjectSnapshotGenerator.prototype.generateTnsJavaClassesFile = function(generat
201209
});
202210
}
203211

204-
ProjectSnapshotGenerator.prototype.generate = function(generationOptions) {
212+
ProjectSnapshotGenerator.prototype.generate = function (generationOptions) {
205213
generationOptions = generationOptions || {};
206214

207215
console.log("Running snapshot generation with the following arguments: ");

0 commit comments

Comments
 (0)