|
1 |
| -const { join, isAbsolute, resolve } = require("path"); |
2 |
| -const fs = require("fs"); |
3 |
| -const os = require("os"); |
| 1 | +const { dirname, isAbsolute, join, resolve } = require("path"); |
| 2 | +const { existsSync, readFileSync, writeFileSync } = require("fs"); |
4 | 3 |
|
5 | 4 | const shelljs = require("shelljs");
|
6 | 5 | const semver = require("semver");
|
7 | 6 |
|
8 | 7 | const SnapshotGenerator = require("./snapshot-generator");
|
9 | 8 | const TnsJavaClassesGenerator = require("./tns-java-classes-generator");
|
10 |
| -const { getJsonFile } = require("./utils"); |
| 9 | +const { |
| 10 | + CONSTANTS, |
| 11 | + createDirectory, |
| 12 | + getJsonFile, |
| 13 | +} = require("./utils"); |
11 | 14 | const { getPackageJson } = require("../../projectHelpers");
|
12 | 15 |
|
13 | 16 | const MIN_ANDROID_RUNTIME_VERSION = "3.0.0";
|
14 | 17 | const VALID_ANDROID_RUNTIME_TAGS = Object.freeze(["next", "rc"]);
|
15 |
| -const V8_VERSIONS_URL = "https://raw.githubusercontent.com/NativeScript/android-runtime/master/v8-versions.json"; |
| 18 | +const V8_VERSIONS_FILE_NAME = "v8-versions.json"; |
| 19 | +const V8_VERSIONS_URL = `https://raw.githubusercontent.com/NativeScript/android-runtime/master/${V8_VERSIONS_FILE_NAME}`; |
| 20 | +const V8_VERSIONS_LOCAL_PATH = resolve(CONSTANTS.SNAPSHOT_TMP_DIR, V8_VERSIONS_FILE_NAME); |
16 | 21 |
|
17 | 22 | const resolveRelativePath = (path) => {
|
18 | 23 | if (path)
|
@@ -91,37 +96,80 @@ ProjectSnapshotGenerator.installSnapshotArtefacts = function(projectRoot) {
|
91 | 96 | shelljs.exec("find " + blobsDestinationPath + " -name '*.blob' -execdir mv {} snapshot.blob ';'");
|
92 | 97 |
|
93 | 98 | // Update the package.json file
|
94 |
| - const appPackageJson = shelljs.test("-e", appPackageJsonPath) ? JSON.parse(fs.readFileSync(appPackageJsonPath, 'utf8')) : {}; |
| 99 | + const appPackageJson = shelljs.test("-e", appPackageJsonPath) ? JSON.parse(readFileSync(appPackageJsonPath, 'utf8')) : {}; |
95 | 100 | appPackageJson["android"] = appPackageJson["android"] || {};
|
96 | 101 | appPackageJson["android"]["heapSnapshotBlob"] = "../snapshots";
|
97 |
| - fs.writeFileSync(appPackageJsonPath, JSON.stringify(appPackageJson, null, 2)); |
| 102 | + writeFileSync(appPackageJsonPath, JSON.stringify(appPackageJson, null, 2)); |
98 | 103 | }
|
99 | 104 | }
|
100 | 105 |
|
| 106 | +const versionIsPrerelease = version => version.indexOf("-") > -1; |
| 107 | +const v8VersionsFileExists = () => existsSync(V8_VERSIONS_LOCAL_PATH); |
| 108 | +const saveV8VersionsFile = versionsMap => |
| 109 | + writeFileSync(V8_VERSIONS_LOCAL_PATH, JSON.stringify(versionsMap)); |
| 110 | +const readV8VersionsFile = () => JSON.parse(readFileSync(V8_VERSIONS_LOCAL_PATH)); |
| 111 | +const fetchV8VersionsFile = () => |
| 112 | + new Promise((resolve, reject) => { |
| 113 | + getJsonFile(V8_VERSIONS_URL) |
| 114 | + .then(versionsMap => { |
| 115 | + createDirectory(dirname(V8_VERSIONS_LOCAL_PATH)); |
| 116 | + saveV8VersionsFile(versionsMap); |
| 117 | + return resolve(versionsMap); |
| 118 | + }) |
| 119 | + .catch(reject); |
| 120 | + }); |
| 121 | + |
| 122 | +const findV8Version = (runtimeVersion, v8VersionsMap) => { |
| 123 | + const runtimeReleaseVersion = runtimeVersion.replace(/-.*/, ""); |
| 124 | + const runtimeRange = Object.keys(v8VersionsMap) |
| 125 | + .find(range => semver.satisfies(runtimeReleaseVersion, range)); |
| 126 | + |
| 127 | + return v8VersionsMap[runtimeRange]; |
| 128 | +} |
| 129 | + |
| 130 | +const getV8VersionsMap = runtimeVersion => |
| 131 | + new Promise((resolve, reject) => { |
| 132 | + if (!v8VersionsFileExists() || versionIsPrerelease(runtimeVersion)) { |
| 133 | + fetchV8VersionsFile() |
| 134 | + .then(versionsMap => resolve({ versionsMap, latest: true })) |
| 135 | + .catch(reject); |
| 136 | + } else { |
| 137 | + const versionsMap = readV8VersionsFile(); |
| 138 | + return resolve({ versionsMap, latest: false }); |
| 139 | + } |
| 140 | + }); |
| 141 | + |
101 | 142 | ProjectSnapshotGenerator.prototype.getV8Version = function(generationOptions) {
|
102 | 143 | return new Promise((resolve, reject) => {
|
103 | 144 | const maybeV8Version = generationOptions.v8Version;
|
104 | 145 | if (maybeV8Version) {
|
105 | 146 | return resolve(maybeV8Version);
|
106 | 147 | }
|
107 | 148 |
|
108 |
| - getJsonFile(V8_VERSIONS_URL).then(v8VersionsMap => { |
109 |
| - const runtimeVersion = this.getAndroidRuntimeVersion().replace(/-.*/, ""); |
110 |
| - |
111 |
| - const runtimeRange = Object.keys(v8VersionsMap) |
112 |
| - .find(range => semver.satisfies(runtimeVersion, range)); |
113 |
| - const v8Version = v8VersionsMap[runtimeRange]; |
114 |
| - |
115 |
| - return resolve(v8Version); |
116 |
| - }).catch(reject); |
| 149 | + const runtimeVersion = this.getAndroidRuntimeVersion(); |
| 150 | + getV8VersionsMap(runtimeVersion) |
| 151 | + .then(({ versionsMap, latest}) => { |
| 152 | + const v8Version = findV8Version(runtimeVersion, versionsMap); |
| 153 | + |
| 154 | + if (!v8Version && !latest) { |
| 155 | + fetchV8VersionsFile().then(latestVersionsMap => { |
| 156 | + const version = findV8Version(runtimeVersion, latestVersionsMap) |
| 157 | + return resolve(version); |
| 158 | + }) |
| 159 | + .catch(reject); |
| 160 | + } else { |
| 161 | + return resolve(v8Version); |
| 162 | + } |
| 163 | + }) |
| 164 | + .catch(reject); |
117 | 165 | });
|
118 | 166 | }
|
119 | 167 |
|
120 | 168 | ProjectSnapshotGenerator.prototype.validateAndroidRuntimeVersion = function() {
|
121 | 169 | const currentRuntimeVersion = this.getAndroidRuntimeVersion();
|
122 | 170 |
|
123 | 171 | if (!currentRuntimeVersion ||
|
124 |
| - !fs.existsSync(join(this.options.projectRoot, "platforms/android"))) { |
| 172 | + !existsSync(join(this.options.projectRoot, "platforms/android"))) { |
125 | 173 |
|
126 | 174 | 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\".");
|
127 | 175 | }
|
@@ -174,7 +222,7 @@ ProjectSnapshotGenerator.prototype.generate = function(generationOptions) {
|
174 | 222 | this.generateTnsJavaClassesFile({ output: tnsJavaClassesDestination, options: generationOptions.tnsJavaClassesOptions });
|
175 | 223 | }
|
176 | 224 |
|
177 |
| - const snapshotToolsPath = resolveRelativePath(generationOptions.snapshotToolsPath) || join(os.tmpdir(), "snapshot-tools"); |
| 225 | + const snapshotToolsPath = resolveRelativePath(generationOptions.snapshotToolsPath) || CONSTANTS.SNAPSHOT_TMP_DIR; |
178 | 226 | const androidNdkPath = generationOptions.androidNdkPath || process.env.ANDROID_NDK_HOME;
|
179 | 227 |
|
180 | 228 | console.log("Snapshot tools path: " + snapshotToolsPath);
|
@@ -206,4 +254,3 @@ ProjectSnapshotGenerator.prototype.generate = function(generationOptions) {
|
206 | 254 | throw new Error(`Cannot find suitable v8 version! Original error: ${error.message || error}`);
|
207 | 255 | });
|
208 | 256 | }
|
209 |
| - |
|
0 commit comments