react-native-platform-override 1.5.0 → 1.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin.js +0 -0
- package/lib-commonjs/Api.d.ts +1 -0
- package/lib-commonjs/Api.js +14 -13
- package/lib-commonjs/Api.js.map +1 -1
- package/lib-commonjs/BatchingQueue.js.map +1 -1
- package/lib-commonjs/Cli.js +30 -30
- package/lib-commonjs/Cli.js.map +1 -1
- package/lib-commonjs/CrossProcessLock.js +5 -5
- package/lib-commonjs/CrossProcessLock.js.map +1 -1
- package/lib-commonjs/FileRepository.js +3 -3
- package/lib-commonjs/FileRepository.js.map +1 -1
- package/lib-commonjs/FileSearch.js +6 -23
- package/lib-commonjs/FileSearch.js.map +1 -1
- package/lib-commonjs/FileSystemRepository.js +7 -7
- package/lib-commonjs/FileSystemRepository.js.map +1 -1
- package/lib-commonjs/GitReactFileRepository.d.ts +0 -2
- package/lib-commonjs/GitReactFileRepository.js +8 -42
- package/lib-commonjs/GitReactFileRepository.js.map +1 -1
- package/lib-commonjs/Hash.js +4 -7
- package/lib-commonjs/Hash.js.map +1 -1
- package/lib-commonjs/Manifest.js +10 -10
- package/lib-commonjs/Manifest.js.map +1 -1
- package/lib-commonjs/Override.js +13 -13
- package/lib-commonjs/Override.js.map +1 -1
- package/lib-commonjs/OverrideFactory.js +1 -1
- package/lib-commonjs/OverrideFactory.js.map +1 -1
- package/lib-commonjs/OverridePrompt.js +6 -6
- package/lib-commonjs/OverridePrompt.js.map +1 -1
- package/lib-commonjs/PackageUtils.js +3 -4
- package/lib-commonjs/PackageUtils.js.map +1 -1
- package/lib-commonjs/Serialized.js +5 -5
- package/lib-commonjs/Serialized.js.map +1 -1
- package/lib-commonjs/UpgradeStrategy.js +7 -7
- package/lib-commonjs/UpgradeStrategy.js.map +1 -1
- package/lib-commonjs/ValidationStrategy.js +5 -5
- package/lib-commonjs/ValidationStrategy.js.map +1 -1
- package/lib-commonjs/refFromVersion.d.ts +10 -0
- package/lib-commonjs/refFromVersion.js +92 -0
- package/lib-commonjs/refFromVersion.js.map +1 -0
- package/lib-commonjs/scripts/generateManifest.js +9 -9
- package/lib-commonjs/scripts/generateManifest.js.map +1 -1
- package/lib-commonjs/scripts/hashFile.js +3 -3
- package/lib-commonjs/scripts/hashFile.js.map +1 -1
- package/package.json +10 -9
- package/CHANGELOG.json +0 -895
- package/CHANGELOG.md +0 -371
|
@@ -10,7 +10,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.findThisPackage = exports.findAllManifests = exports.findManifest = void 0;
|
|
13
|
-
const fs_1 = __importDefault(require("fs"));
|
|
13
|
+
const fs_1 = __importDefault(require("@react-native-windows/fs"));
|
|
14
14
|
const path_1 = __importDefault(require("path"));
|
|
15
15
|
const package_utils_1 = require("@react-native-windows/package-utils");
|
|
16
16
|
/**
|
|
@@ -23,7 +23,7 @@ async function findManifest(cwd) {
|
|
|
23
23
|
throw new Error('This command must be run within a package');
|
|
24
24
|
}
|
|
25
25
|
const manifestPath = path_1.default.join(path_1.default.dirname(packagePath), 'overrides.json');
|
|
26
|
-
if (!(await exists(manifestPath))) {
|
|
26
|
+
if (!(await fs_1.default.exists(manifestPath))) {
|
|
27
27
|
throw new Error('Expected an "overrides.json" file at the root of the current package');
|
|
28
28
|
}
|
|
29
29
|
return manifestPath;
|
|
@@ -40,11 +40,11 @@ async function findAllManifests() {
|
|
|
40
40
|
throw new Error('This command must be run within a package');
|
|
41
41
|
}
|
|
42
42
|
const packageDir = path_1.default.dirname(packagePath);
|
|
43
|
-
if (await exists(path_1.default.join(packageDir, 'overrides.json'))) {
|
|
43
|
+
if (await fs_1.default.exists(path_1.default.join(packageDir, 'overrides.json'))) {
|
|
44
44
|
return [path_1.default.join(packageDir, 'overrides.json')];
|
|
45
45
|
}
|
|
46
|
-
const localPackages = await package_utils_1.enumerateRepoPackages(pkg => exists(path_1.default.join(pkg.path, 'overrides.json')));
|
|
47
|
-
return localPackages.map(pkg => path_1.default.join(pkg.path, 'overrides.json'));
|
|
46
|
+
const localPackages = await (0, package_utils_1.enumerateRepoPackages)((pkg) => fs_1.default.exists(path_1.default.join(pkg.path, 'overrides.json')));
|
|
47
|
+
return localPackages.map((pkg) => path_1.default.join(pkg.path, 'overrides.json'));
|
|
48
48
|
}
|
|
49
49
|
exports.findAllManifests = findAllManifests;
|
|
50
50
|
/**
|
|
@@ -64,7 +64,7 @@ exports.findThisPackage = findThisPackage;
|
|
|
64
64
|
async function findFileAbove(base, target) {
|
|
65
65
|
const searchPath = path_1.default.resolve(base);
|
|
66
66
|
const fullPath = path_1.default.join(searchPath, target);
|
|
67
|
-
if (await exists(fullPath)) {
|
|
67
|
+
if (await fs_1.default.exists(fullPath)) {
|
|
68
68
|
return fullPath;
|
|
69
69
|
}
|
|
70
70
|
const searchPathParent = path_1.default.resolve(path_1.default.join(searchPath, '..'));
|
|
@@ -75,21 +75,4 @@ async function findFileAbove(base, target) {
|
|
|
75
75
|
return findFileAbove(searchPathParent, target);
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
|
-
/**
|
|
79
|
-
* Asyncrhonusly tests if a file exists
|
|
80
|
-
*/
|
|
81
|
-
async function exists(filepath) {
|
|
82
|
-
try {
|
|
83
|
-
await fs_1.default.promises.access(filepath);
|
|
84
|
-
return true;
|
|
85
|
-
}
|
|
86
|
-
catch (ex) {
|
|
87
|
-
if (ex.code === 'ENOENT') {
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
throw ex;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
78
|
//# sourceMappingURL=FileSearch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileSearch.js","sourceRoot":"","sources":["../src/FileSearch.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;AAEH,
|
|
1
|
+
{"version":3,"file":"FileSearch.js","sourceRoot":"","sources":["../src/FileSearch.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;AAEH,kEAA0C;AAC1C,gDAAwB;AACxB,uEAA0E;AAE1E;;;GAGG;AACI,KAAK,UAAU,YAAY,CAAC,GAAY;IAC7C,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IAC9E,IAAI,CAAC,WAAW,EAAE;QAChB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;KAC9D;IAED,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,cAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAC5E,IAAI,CAAC,CAAC,MAAM,YAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE;QACpC,MAAM,IAAI,KAAK,CACb,sEAAsE,CACvE,CAAC;KACH;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAdD,oCAcC;AAED;;;;GAIG;AACI,KAAK,UAAU,gBAAgB;IACpC,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IACvE,IAAI,CAAC,WAAW,EAAE;QAChB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;KAC9D;IAED,MAAM,UAAU,GAAG,cAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7C,IAAI,MAAM,YAAE,CAAC,MAAM,CAAC,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC,EAAE;QAC5D,OAAO,CAAC,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC;KAClD;IAED,MAAM,aAAa,GAAG,MAAM,IAAA,qCAAqB,EAAC,CAAC,GAAG,EAAE,EAAE,CACxD,YAAE,CAAC,MAAM,CAAC,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CACjD,CAAC;IAEF,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAC3E,CAAC;AAhBD,4CAgBC;AAED;;GAEG;AACI,KAAK,UAAU,eAAe;IACnC,MAAM,eAAe,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACvE,IAAI,CAAC,eAAe,EAAE;QACpB,MAAM,IAAI,KAAK,CACb,sFAAsF,CACvF,CAAC;KACH;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AATD,0CASC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CAC1B,IAAY,EACZ,MAAc;IAEd,MAAM,UAAU,GAAG,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC/C,IAAI,MAAM,YAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;QAC7B,OAAO,QAAQ,CAAC;KACjB;IAED,MAAM,gBAAgB,GAAG,cAAI,CAAC,OAAO,CAAC,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;IACnE,IAAI,gBAAgB,KAAK,UAAU,EAAE;QACnC,OAAO,IAAI,CAAC;KACb;SAAM;QACL,OAAO,aAAa,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;KAChD;AACH,CAAC","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * @format\n */\n\nimport fs from '@react-native-windows/fs';\nimport path from 'path';\nimport {enumerateRepoPackages} from '@react-native-windows/package-utils';\n\n/**\n * Search for a single manifest adjacent to the package above a directory or\n * CWD\n */\nexport async function findManifest(cwd?: string): Promise<string> {\n const packagePath = await findFileAbove(cwd || process.cwd(), 'package.json');\n if (!packagePath) {\n throw new Error('This command must be run within a package');\n }\n\n const manifestPath = path.join(path.dirname(packagePath), 'overrides.json');\n if (!(await fs.exists(manifestPath))) {\n throw new Error(\n 'Expected an \"overrides.json\" file at the root of the current package',\n );\n }\n\n return manifestPath;\n}\n\n/**\n * Enumerate the override manifests reachable from CWD, prefering the local\n * package if run within a package with an override manifest, otherwise\n * searching for packages in a monorepo\n */\nexport async function findAllManifests(): Promise<string[]> {\n const packagePath = await findFileAbove(process.cwd(), 'package.json');\n if (!packagePath) {\n throw new Error('This command must be run within a package');\n }\n\n const packageDir = path.dirname(packagePath);\n if (await fs.exists(path.join(packageDir, 'overrides.json'))) {\n return [path.join(packageDir, 'overrides.json')];\n }\n\n const localPackages = await enumerateRepoPackages((pkg) =>\n fs.exists(path.join(pkg.path, 'overrides.json')),\n );\n\n return localPackages.map((pkg) => path.join(pkg.path, 'overrides.json'));\n}\n\n/**\n * Seatch for the package.json for this package (react-native-platform-override)\n */\nexport async function findThisPackage(): Promise<string> {\n const thisPackagePath = await findFileAbove(__dirname, 'package.json');\n if (!thisPackagePath) {\n throw new Error(\n 'Unable to find a package.json about our source code. Did directory structure change?',\n );\n }\n\n return thisPackagePath;\n}\n\n/**\n * Search for the target path segment in all directories above the base\n */\nasync function findFileAbove(\n base: string,\n target: string,\n): Promise<string | null> {\n const searchPath = path.resolve(base);\n const fullPath = path.join(searchPath, target);\n if (await fs.exists(fullPath)) {\n return fullPath;\n }\n\n const searchPathParent = path.resolve(path.join(searchPath, '..'));\n if (searchPathParent === searchPath) {\n return null;\n } else {\n return findFileAbove(searchPathParent, target);\n }\n}\n"]}
|
|
@@ -9,7 +9,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
9
9
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
const fs_1 = __importDefault(require("fs"));
|
|
12
|
+
const fs_1 = __importDefault(require("@react-native-windows/fs"));
|
|
13
13
|
const globby_1 = __importDefault(require("globby"));
|
|
14
14
|
const path_1 = __importDefault(require("path"));
|
|
15
15
|
/**
|
|
@@ -20,7 +20,7 @@ class FileSystemRepository {
|
|
|
20
20
|
this.baseDir = baseDir;
|
|
21
21
|
}
|
|
22
22
|
async listFiles(globs = ['**']) {
|
|
23
|
-
return await globby_1.default(globs, {
|
|
23
|
+
return await (0, globby_1.default)(globs, {
|
|
24
24
|
cwd: this.baseDir,
|
|
25
25
|
dot: true,
|
|
26
26
|
});
|
|
@@ -28,7 +28,7 @@ class FileSystemRepository {
|
|
|
28
28
|
async readFile(filename) {
|
|
29
29
|
const filePath = path_1.default.join(this.baseDir, filename);
|
|
30
30
|
try {
|
|
31
|
-
return await fs_1.default.
|
|
31
|
+
return await fs_1.default.readFile(filePath);
|
|
32
32
|
}
|
|
33
33
|
catch (_a) {
|
|
34
34
|
return null;
|
|
@@ -37,7 +37,7 @@ class FileSystemRepository {
|
|
|
37
37
|
async stat(filename) {
|
|
38
38
|
const filePath = path_1.default.join(this.baseDir, filename);
|
|
39
39
|
try {
|
|
40
|
-
const stats = await fs_1.default.
|
|
40
|
+
const stats = await fs_1.default.stat(filePath);
|
|
41
41
|
return stats.isDirectory() ? 'directory' : 'file';
|
|
42
42
|
}
|
|
43
43
|
catch (ex) {
|
|
@@ -51,12 +51,12 @@ class FileSystemRepository {
|
|
|
51
51
|
}
|
|
52
52
|
async writeFile(filename, content) {
|
|
53
53
|
const filePath = path_1.default.join(this.baseDir, filename);
|
|
54
|
-
await fs_1.default.
|
|
55
|
-
return fs_1.default.
|
|
54
|
+
await fs_1.default.mkdir(path_1.default.dirname(filePath), { recursive: true });
|
|
55
|
+
return fs_1.default.writeFile(filePath, content);
|
|
56
56
|
}
|
|
57
57
|
async deleteFile(filename) {
|
|
58
58
|
const filePath = path_1.default.join(this.baseDir, filename);
|
|
59
|
-
await fs_1.default.
|
|
59
|
+
await fs_1.default.unlink(filePath);
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
exports.default = FileSystemRepository;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileSystemRepository.js","sourceRoot":"","sources":["../src/FileSystemRepository.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;AAEH,
|
|
1
|
+
{"version":3,"file":"FileSystemRepository.js","sourceRoot":"","sources":["../src/FileSystemRepository.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;AAEH,kEAA0C;AAC1C,oDAA4B;AAC5B,gDAAwB;AAIxB;;GAEG;AACH,MAAqB,oBAAoB;IAGvC,YAAY,OAAe;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAkB,CAAC,IAAI,CAAC;QACtC,OAAO,MAAM,IAAA,gBAAM,EAAC,KAAK,EAAE;YACzB,GAAG,EAAE,IAAI,CAAC,OAAO;YACjB,GAAG,EAAE,IAAI;SACV,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAC7B,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACnD,IAAI;YACF,OAAO,MAAM,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;SACpC;QAAC,WAAM;YACN,OAAO,IAAI,CAAC;SACb;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAgB;QACzB,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACnD,IAAI;YACF,MAAM,KAAK,GAAG,MAAM,YAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;SACnD;QAAC,OAAO,EAAE,EAAE;YACX,IAAK,EAA4B,CAAC,IAAI,KAAK,QAAQ,EAAE;gBACnD,OAAO,MAAM,CAAC;aACf;iBAAM;gBACL,MAAM,EAAE,CAAC;aACV;SACF;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,OAAwB;QACxD,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACnD,MAAM,YAAE,CAAC,KAAK,CAAC,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;QAC1D,OAAO,YAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACnD,MAAM,YAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;CACF;AA/CD,uCA+CC","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * @format\n */\n\nimport fs from '@react-native-windows/fs';\nimport globby from 'globby';\nimport path from 'path';\n\nimport {WritableFileRepository} from './FileRepository';\n\n/**\n * Allows reading phsyical files based on a passed in directory\n */\nexport default class FileSystemRepository implements WritableFileRepository {\n private readonly baseDir: string;\n\n constructor(baseDir: string) {\n this.baseDir = baseDir;\n }\n\n async listFiles(globs: string[] = ['**']): Promise<string[]> {\n return await globby(globs, {\n cwd: this.baseDir,\n dot: true,\n });\n }\n\n async readFile(filename: string): Promise<Buffer | null> {\n const filePath = path.join(this.baseDir, filename);\n try {\n return await fs.readFile(filePath);\n } catch {\n return null;\n }\n }\n\n async stat(filename: string): Promise<'file' | 'directory' | 'none'> {\n const filePath = path.join(this.baseDir, filename);\n try {\n const stats = await fs.stat(filePath);\n return stats.isDirectory() ? 'directory' : 'file';\n } catch (ex) {\n if ((ex as NodeJS.ErrnoException).code === 'ENOENT') {\n return 'none';\n } else {\n throw ex;\n }\n }\n }\n\n async writeFile(filename: string, content: Buffer | string) {\n const filePath = path.join(this.baseDir, filename);\n await fs.mkdir(path.dirname(filePath), {recursive: true});\n return fs.writeFile(filePath, content);\n }\n\n async deleteFile(filename: string): Promise<void> {\n const filePath = path.join(this.baseDir, filename);\n await fs.unlink(filePath);\n }\n}\n"]}
|
|
@@ -51,8 +51,6 @@ export default class GitReactFileRepository implements VersionedReactFileReposit
|
|
|
51
51
|
private checkoutVersion;
|
|
52
52
|
private tryCheckoutLocal;
|
|
53
53
|
private fetchAndCheckout;
|
|
54
|
-
private refFromVersion;
|
|
55
|
-
private longCommitHash;
|
|
56
54
|
private static defaultGitDirectory;
|
|
57
55
|
private ensureFile;
|
|
58
56
|
}
|
|
@@ -9,16 +9,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
9
9
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
const fs_1 = __importDefault(require("fs"));
|
|
12
|
+
const fs_1 = __importDefault(require("@react-native-windows/fs"));
|
|
13
13
|
const os_1 = __importDefault(require("os"));
|
|
14
14
|
const path_1 = __importDefault(require("path"));
|
|
15
|
-
const semver_1 = __importDefault(require("semver"));
|
|
16
15
|
const promise_1 = __importDefault(require("simple-git/promise"));
|
|
17
16
|
const BatchingQueue_1 = __importDefault(require("./BatchingQueue"));
|
|
18
17
|
const FileSystemRepository_1 = __importDefault(require("./FileSystemRepository"));
|
|
19
|
-
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
20
18
|
const PackageUtils_1 = require("./PackageUtils");
|
|
21
|
-
const
|
|
19
|
+
const refFromVersion_1 = require("./refFromVersion");
|
|
22
20
|
const RN_GITHUB_URL = 'https://github.com/facebook/react-native.git';
|
|
23
21
|
/**
|
|
24
22
|
* Retrives React Native files using the React Native Github repo. Switching
|
|
@@ -36,8 +34,8 @@ class GitReactFileRepository {
|
|
|
36
34
|
*/
|
|
37
35
|
static async createAndInit(gitDirectory) {
|
|
38
36
|
const dir = gitDirectory || (await this.defaultGitDirectory());
|
|
39
|
-
await fs_1.default.
|
|
40
|
-
const gitClient = promise_1.default(dir);
|
|
37
|
+
await fs_1.default.mkdir(dir, { recursive: true });
|
|
38
|
+
const gitClient = (0, promise_1.default)(dir);
|
|
41
39
|
gitClient.silent(true);
|
|
42
40
|
if (!(await gitClient.checkIsRepo())) {
|
|
43
41
|
await gitClient.init();
|
|
@@ -154,7 +152,9 @@ class GitReactFileRepository {
|
|
|
154
152
|
}
|
|
155
153
|
}
|
|
156
154
|
async fetchAndCheckout(reactNativeVersion) {
|
|
157
|
-
const
|
|
155
|
+
const githubToken = GitReactFileRepository.githubToken ||
|
|
156
|
+
process.env.PLATFORM_OVERRIDE_GITHUB_TOKEN;
|
|
157
|
+
const gitRef = await (0, refFromVersion_1.fetchFullRef)(reactNativeVersion, { githubToken });
|
|
158
158
|
try {
|
|
159
159
|
await this.gitClient.fetch([
|
|
160
160
|
RN_GITHUB_URL,
|
|
@@ -167,42 +167,8 @@ class GitReactFileRepository {
|
|
|
167
167
|
}
|
|
168
168
|
await this.gitClient.checkout([reactNativeVersion, '--force']);
|
|
169
169
|
}
|
|
170
|
-
async refFromVersion(reactNativeVersion) {
|
|
171
|
-
if (!semver_1.default.valid(reactNativeVersion)) {
|
|
172
|
-
throw new Error(`${reactNativeVersion} is not a valid semver version`);
|
|
173
|
-
}
|
|
174
|
-
// Nightly builds are in the form of either 0.0.0-<commitHash> or
|
|
175
|
-
// 0.0.0-<commitHash>-<date>-<time>.
|
|
176
|
-
if (semver_1.default.lt(reactNativeVersion, '0.0.0', { includePrerelease: true })) {
|
|
177
|
-
const preSegment = semver_1.default.prerelease(reactNativeVersion)[0];
|
|
178
|
-
const abbrevHash = preSegment.split('-')[0];
|
|
179
|
-
// We cannot do a shallow fetch of an abbreviated commit hash
|
|
180
|
-
return this.longCommitHash(abbrevHash);
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
// Stable builds have tags matching their version
|
|
184
|
-
return `refs/tags/v${reactNativeVersion}`;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
async longCommitHash(shortHash) {
|
|
188
|
-
const githubToken = GitReactFileRepository.githubToken ||
|
|
189
|
-
process.env.PLATFORM_OVERRIDE_GITHUB_TOKEN;
|
|
190
|
-
// We cannot get abbreviated hash directly from a remote, so query Github's
|
|
191
|
-
// API for it.
|
|
192
|
-
const commitInfo = await node_fetch_1.default(`${RN_COMMIT_ENDPOINT}/${shortHash}`, {
|
|
193
|
-
headers: {
|
|
194
|
-
'Content-Type': 'application/json',
|
|
195
|
-
'User-Agent': 'react-native-platform-override',
|
|
196
|
-
...(githubToken && { Authorization: `Token ${githubToken}` }),
|
|
197
|
-
},
|
|
198
|
-
});
|
|
199
|
-
if (!commitInfo.ok) {
|
|
200
|
-
throw new Error(`Unable to query Github for commit '${shortHash}' Status: '${commitInfo.statusText}'`);
|
|
201
|
-
}
|
|
202
|
-
return (await commitInfo.json()).sha;
|
|
203
|
-
}
|
|
204
170
|
static async defaultGitDirectory() {
|
|
205
|
-
return path_1.default.join(os_1.default.tmpdir(), (await PackageUtils_1.getNpmPackage()).name, 'git');
|
|
171
|
+
return path_1.default.join(os_1.default.tmpdir(), (await (0, PackageUtils_1.getNpmPackage)()).name, 'git');
|
|
206
172
|
}
|
|
207
173
|
async ensureFile(filename) {
|
|
208
174
|
const stat = await this.fileRepo.stat(filename);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GitReactFileRepository.js","sourceRoot":"","sources":["../src/GitReactFileRepository.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * @format\n */\n\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport semver from 'semver';\nimport simplegit from 'simple-git/promise';\n\nimport BatchingQueue from './BatchingQueue';\nimport FileSystemRepository from './FileSystemRepository';\nimport {VersionedReactFileRepository} from './FileRepository';\nimport fetch from 'node-fetch';\nimport {getNpmPackage} from './PackageUtils';\n\nconst RN_COMMIT_ENDPOINT =\n 'https://api.github.com/repos/facebook/react-native/commits';\nconst RN_GITHUB_URL = 'https://github.com/facebook/react-native.git';\n\n/**\n * Retrives React Native files using the React Native Github repo. Switching\n * between getting file contents of different versions may be slow.\n */\nexport default class GitReactFileRepository\n implements VersionedReactFileRepository {\n private readonly fileRepo: FileSystemRepository;\n private readonly gitClient: simplegit.SimpleGit;\n private checkedOutVersion?: string;\n private static githubToken?: string;\n\n // We need to ensure it is impossible to check out a new React Native\n // version while an operation hasn't yet finished. We queue each operation to\n // ensure they are performed atomically.\n private readonly batchingQueue: BatchingQueue<string>;\n\n private constructor(gitDirectory: string, gitClient: simplegit.SimpleGit) {\n this.batchingQueue = new BatchingQueue();\n this.fileRepo = new FileSystemRepository(gitDirectory);\n this.gitClient = gitClient;\n }\n\n /**\n * Asynchronusly initialize the scratch repository, creating a new Git repo is needed\n * @param gitDirectory optional repo directory\n */\n static async createAndInit(\n gitDirectory?: string,\n ): Promise<GitReactFileRepository> {\n const dir = gitDirectory || (await this.defaultGitDirectory());\n await fs.promises.mkdir(dir, {recursive: true});\n\n const gitClient = simplegit(dir);\n gitClient.silent(true);\n\n if (!(await gitClient.checkIsRepo())) {\n await gitClient.init();\n await gitClient.addConfig('core.autocrlf', 'input');\n await gitClient.addConfig('core.filemode', 'false');\n await gitClient.addConfig('core.ignorecase', 'true');\n }\n\n return new GitReactFileRepository(dir, gitClient);\n }\n\n /**\n * Set a GitHub API token for all instances of GitReactFileRepository to use\n * when making requests.\n * @param token a GitHub PAT\n */\n static setGithubToken(token: string) {\n GitReactFileRepository.githubToken = token;\n }\n\n async listFiles(\n globs: string[] | undefined,\n reactNativeVersion: string,\n ): Promise<string[]> {\n return this.usingVersion(reactNativeVersion, () =>\n this.fileRepo.listFiles(globs),\n );\n }\n\n async readFile(\n filename: string,\n reactNativeVersion: string,\n ): Promise<Buffer | null> {\n return this.usingVersion(reactNativeVersion, () =>\n this.fileRepo.readFile(filename),\n );\n }\n\n async stat(\n filename: string,\n reactNativeVersion: string,\n ): Promise<'file' | 'directory' | 'none'> {\n return this.usingVersion(reactNativeVersion, () =>\n this.fileRepo.stat(filename),\n );\n }\n\n /**\n * Generate a Git-style patch to transform the given file into the given\n * content.\n */\n async generatePatch(\n filename: string,\n reactNativeVersion: string,\n newContent: Buffer,\n ): Promise<string> {\n return this.usingVersion(reactNativeVersion, async () => {\n await this.ensureFile(filename);\n\n try {\n await this.fileRepo.writeFile(filename, newContent);\n const patch = await this.gitClient.diff([\n '--patch',\n '--ignore-space-at-eol',\n '--binary',\n '--',\n filename,\n ]);\n\n return patch;\n } finally {\n await this.gitClient.reset('hard');\n }\n });\n }\n\n /**\n * Apply a patch to the given file, returning the merged result, which may\n * include conflict markers. The underlying file is not mutated.\n *\n * Git is unable to generate a representation with conflict markers in the\n * event of binary merge conflicts. In this case a null Buffer is returned.\n */\n async getPatchedFile(\n filename: string,\n reactNativeVersion: string,\n patchContent: string,\n ): Promise<{patchedFile: Buffer | null; hasConflicts: boolean}> {\n return this.usingVersion(reactNativeVersion, async () => {\n await this.ensureFile(filename);\n\n try {\n await this.fileRepo.writeFile('rnwgit.patch', patchContent);\n\n let hasConflicts = false;\n let binaryConflicts = false;\n\n try {\n await this.gitClient.raw([\n 'apply',\n '--3way',\n '--whitespace=nowarn',\n 'rnwgit.patch',\n ]);\n } catch (ex) {\n // Hack alert: simple-git doesn't populate exception information from\n // conflicts when we're using raw commands (which we need to since it\n // doesn't support apply). Try to detect if Git gave us a bad exit code\n // because of merge conflicts, which we explicitly want to allow.\n if (!ex.message.includes('with conflicts')) {\n throw ex;\n }\n\n hasConflicts = true;\n binaryConflicts = ex.message.includes('Cannot merge binary files');\n }\n\n const patchedFile = binaryConflicts\n ? null\n : await this.fileRepo.readFile(filename);\n\n return {patchedFile, hasConflicts};\n } finally {\n await this.gitClient.reset('hard');\n }\n });\n }\n\n private async usingVersion<T>(\n reactNativeVersion: string,\n fn: () => Promise<T>,\n ): Promise<T> {\n return await this.batchingQueue.enqueue(reactNativeVersion, async () => {\n await this.checkoutVersion(reactNativeVersion);\n return await fn();\n });\n }\n\n private async checkoutVersion(reactNativeVersion: string) {\n if (reactNativeVersion !== this.checkedOutVersion) {\n if (!(await this.tryCheckoutLocal(reactNativeVersion))) {\n await this.fetchAndCheckout(reactNativeVersion);\n }\n\n this.checkedOutVersion = reactNativeVersion;\n }\n }\n\n private async tryCheckoutLocal(reactNativeVersion: string): Promise<boolean> {\n try {\n await this.gitClient.checkout([reactNativeVersion, '--force']);\n return true;\n } catch {\n return false;\n }\n }\n\n private async fetchAndCheckout(reactNativeVersion: string) {\n const gitRef = await this.refFromVersion(reactNativeVersion);\n\n try {\n await this.gitClient.fetch([\n RN_GITHUB_URL,\n `${gitRef}:${reactNativeVersion}`,\n '--depth=1',\n ]);\n } catch (ex) {\n throw new Error(\n `Failed to fetch '${gitRef}'. Does it exist? (${ex.message})`,\n );\n }\n\n await this.gitClient.checkout([reactNativeVersion, '--force']);\n }\n\n private async refFromVersion(reactNativeVersion: string): Promise<string> {\n if (!semver.valid(reactNativeVersion)) {\n throw new Error(`${reactNativeVersion} is not a valid semver version`);\n }\n\n // Nightly builds are in the form of either 0.0.0-<commitHash> or\n // 0.0.0-<commitHash>-<date>-<time>.\n if (semver.lt(reactNativeVersion, '0.0.0', {includePrerelease: true})) {\n const preSegment = semver.prerelease(reactNativeVersion)![0];\n const abbrevHash = preSegment.split('-')[0];\n\n // We cannot do a shallow fetch of an abbreviated commit hash\n return this.longCommitHash(abbrevHash);\n } else {\n // Stable builds have tags matching their version\n return `refs/tags/v${reactNativeVersion}`;\n }\n }\n\n private async longCommitHash(shortHash: string): Promise<string> {\n const githubToken =\n GitReactFileRepository.githubToken ||\n process.env.PLATFORM_OVERRIDE_GITHUB_TOKEN;\n\n // We cannot get abbreviated hash directly from a remote, so query Github's\n // API for it.\n const commitInfo = await fetch(`${RN_COMMIT_ENDPOINT}/${shortHash}`, {\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': 'react-native-platform-override',\n ...(githubToken && {Authorization: `Token ${githubToken}`}),\n },\n });\n if (!commitInfo.ok) {\n throw new Error(\n `Unable to query Github for commit '${shortHash}' Status: '${commitInfo.statusText}'`,\n );\n }\n\n return (await commitInfo.json()).sha;\n }\n\n private static async defaultGitDirectory(): Promise<string> {\n return path.join(os.tmpdir(), (await getNpmPackage()).name, 'git');\n }\n\n private async ensureFile(filename: string): Promise<void> {\n const stat = await this.fileRepo.stat(filename);\n if (stat === 'none') {\n throw new Error(\n `Cannot find file \"${filename}\" in react-native@${this.checkedOutVersion}`,\n );\n } else if (stat === 'directory') {\n throw new Error(`\"${filename}\" refers to a directory`);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"GitReactFileRepository.js","sourceRoot":"","sources":["../src/GitReactFileRepository.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * @format\n */\n\nimport fs from '@react-native-windows/fs';\nimport os from 'os';\nimport path from 'path';\nimport simplegit from 'simple-git/promise';\n\nimport BatchingQueue from './BatchingQueue';\nimport FileSystemRepository from './FileSystemRepository';\nimport {VersionedReactFileRepository} from './FileRepository';\nimport {getNpmPackage} from './PackageUtils';\nimport {fetchFullRef} from './refFromVersion';\n\nconst RN_GITHUB_URL = 'https://github.com/facebook/react-native.git';\n\n/**\n * Retrives React Native files using the React Native Github repo. Switching\n * between getting file contents of different versions may be slow.\n */\nexport default class GitReactFileRepository\n implements VersionedReactFileRepository\n{\n private readonly fileRepo: FileSystemRepository;\n private readonly gitClient: simplegit.SimpleGit;\n private checkedOutVersion?: string;\n private static githubToken?: string;\n\n // We need to ensure it is impossible to check out a new React Native\n // version while an operation hasn't yet finished. We queue each operation to\n // ensure they are performed atomically.\n private readonly batchingQueue: BatchingQueue<string>;\n\n private constructor(gitDirectory: string, gitClient: simplegit.SimpleGit) {\n this.batchingQueue = new BatchingQueue();\n this.fileRepo = new FileSystemRepository(gitDirectory);\n this.gitClient = gitClient;\n }\n\n /**\n * Asynchronusly initialize the scratch repository, creating a new Git repo is needed\n * @param gitDirectory optional repo directory\n */\n static async createAndInit(\n gitDirectory?: string,\n ): Promise<GitReactFileRepository> {\n const dir = gitDirectory || (await this.defaultGitDirectory());\n await fs.mkdir(dir, {recursive: true});\n\n const gitClient = simplegit(dir);\n gitClient.silent(true);\n\n if (!(await gitClient.checkIsRepo())) {\n await gitClient.init();\n await gitClient.addConfig('core.autocrlf', 'input');\n await gitClient.addConfig('core.filemode', 'false');\n await gitClient.addConfig('core.ignorecase', 'true');\n }\n\n return new GitReactFileRepository(dir, gitClient);\n }\n\n /**\n * Set a GitHub API token for all instances of GitReactFileRepository to use\n * when making requests.\n * @param token a GitHub PAT\n */\n static setGithubToken(token: string) {\n GitReactFileRepository.githubToken = token;\n }\n\n async listFiles(\n globs: string[] | undefined,\n reactNativeVersion: string,\n ): Promise<string[]> {\n return this.usingVersion(reactNativeVersion, () =>\n this.fileRepo.listFiles(globs),\n );\n }\n\n async readFile(\n filename: string,\n reactNativeVersion: string,\n ): Promise<Buffer | null> {\n return this.usingVersion(reactNativeVersion, () =>\n this.fileRepo.readFile(filename),\n );\n }\n\n async stat(\n filename: string,\n reactNativeVersion: string,\n ): Promise<'file' | 'directory' | 'none'> {\n return this.usingVersion(reactNativeVersion, () =>\n this.fileRepo.stat(filename),\n );\n }\n\n /**\n * Generate a Git-style patch to transform the given file into the given\n * content.\n */\n async generatePatch(\n filename: string,\n reactNativeVersion: string,\n newContent: Buffer,\n ): Promise<string> {\n return this.usingVersion(reactNativeVersion, async () => {\n await this.ensureFile(filename);\n\n try {\n await this.fileRepo.writeFile(filename, newContent);\n const patch = await this.gitClient.diff([\n '--patch',\n '--ignore-space-at-eol',\n '--binary',\n '--',\n filename,\n ]);\n\n return patch;\n } finally {\n await this.gitClient.reset('hard');\n }\n });\n }\n\n /**\n * Apply a patch to the given file, returning the merged result, which may\n * include conflict markers. The underlying file is not mutated.\n *\n * Git is unable to generate a representation with conflict markers in the\n * event of binary merge conflicts. In this case a null Buffer is returned.\n */\n async getPatchedFile(\n filename: string,\n reactNativeVersion: string,\n patchContent: string,\n ): Promise<{patchedFile: Buffer | null; hasConflicts: boolean}> {\n return this.usingVersion(reactNativeVersion, async () => {\n await this.ensureFile(filename);\n\n try {\n await this.fileRepo.writeFile('rnwgit.patch', patchContent);\n\n let hasConflicts = false;\n let binaryConflicts = false;\n\n try {\n await this.gitClient.raw([\n 'apply',\n '--3way',\n '--whitespace=nowarn',\n 'rnwgit.patch',\n ]);\n } catch (ex) {\n // Hack alert: simple-git doesn't populate exception information from\n // conflicts when we're using raw commands (which we need to since it\n // doesn't support apply). Try to detect if Git gave us a bad exit code\n // because of merge conflicts, which we explicitly want to allow.\n if (!(ex as Error).message.includes('with conflicts')) {\n throw ex;\n }\n\n hasConflicts = true;\n binaryConflicts = (ex as Error).message.includes(\n 'Cannot merge binary files',\n );\n }\n\n const patchedFile = binaryConflicts\n ? null\n : await this.fileRepo.readFile(filename);\n\n return {patchedFile, hasConflicts};\n } finally {\n await this.gitClient.reset('hard');\n }\n });\n }\n\n private async usingVersion<T>(\n reactNativeVersion: string,\n fn: () => Promise<T>,\n ): Promise<T> {\n return await this.batchingQueue.enqueue(reactNativeVersion, async () => {\n await this.checkoutVersion(reactNativeVersion);\n return await fn();\n });\n }\n\n private async checkoutVersion(reactNativeVersion: string) {\n if (reactNativeVersion !== this.checkedOutVersion) {\n if (!(await this.tryCheckoutLocal(reactNativeVersion))) {\n await this.fetchAndCheckout(reactNativeVersion);\n }\n\n this.checkedOutVersion = reactNativeVersion;\n }\n }\n\n private async tryCheckoutLocal(reactNativeVersion: string): Promise<boolean> {\n try {\n await this.gitClient.checkout([reactNativeVersion, '--force']);\n return true;\n } catch {\n return false;\n }\n }\n\n private async fetchAndCheckout(reactNativeVersion: string) {\n const githubToken =\n GitReactFileRepository.githubToken ||\n process.env.PLATFORM_OVERRIDE_GITHUB_TOKEN;\n const gitRef = await fetchFullRef(reactNativeVersion, {githubToken});\n\n try {\n await this.gitClient.fetch([\n RN_GITHUB_URL,\n `${gitRef}:${reactNativeVersion}`,\n '--depth=1',\n ]);\n } catch (ex) {\n throw new Error(\n `Failed to fetch '${gitRef}'. Does it exist? (${\n (ex as Error).message\n })`,\n );\n }\n\n await this.gitClient.checkout([reactNativeVersion, '--force']);\n }\n\n private static async defaultGitDirectory(): Promise<string> {\n return path.join(os.tmpdir(), (await getNpmPackage()).name, 'git');\n }\n\n private async ensureFile(filename: string): Promise<void> {\n const stat = await this.fileRepo.stat(filename);\n if (stat === 'none') {\n throw new Error(\n `Cannot find file \"${filename}\" in react-native@${this.checkedOutVersion}`,\n );\n } else if (stat === 'directory') {\n throw new Error(`\"${filename}\" refers to a directory`);\n }\n }\n}\n"]}
|
package/lib-commonjs/Hash.js
CHANGED
|
@@ -19,7 +19,7 @@ const isutf8_1 = __importDefault(require("isutf8"));
|
|
|
19
19
|
*/
|
|
20
20
|
function normalizeContent(content, opts) {
|
|
21
21
|
if (opts.insensitivity === 'none' ||
|
|
22
|
-
(typeof content !== 'string' && !isutf8_1.default(content))) {
|
|
22
|
+
(typeof content !== 'string' && !(0, isutf8_1.default)(content))) {
|
|
23
23
|
return content;
|
|
24
24
|
}
|
|
25
25
|
switch (opts.insensitivity || 'line-ending') {
|
|
@@ -27,10 +27,7 @@ function normalizeContent(content, opts) {
|
|
|
27
27
|
// Convert to CRLF for legacy hash stability
|
|
28
28
|
return content.toString('utf8').replace(/(?<!\r)\n/g, '\r\n');
|
|
29
29
|
case 'whitespace':
|
|
30
|
-
return content
|
|
31
|
-
.toString('utf8')
|
|
32
|
-
.trim()
|
|
33
|
-
.replace(/\s+/g, ' ');
|
|
30
|
+
return content.toString('utf8').trim().replace(/\s+/g, ' ');
|
|
34
31
|
}
|
|
35
32
|
}
|
|
36
33
|
/**
|
|
@@ -70,12 +67,12 @@ async function hashFileOrDirectory(name, repo, opts) {
|
|
|
70
67
|
}
|
|
71
68
|
else {
|
|
72
69
|
const hasher = new Hasher(opts);
|
|
73
|
-
const subfiles = await repo.listFiles([`${PathUtils_1.unixPath(name)}/**`]);
|
|
70
|
+
const subfiles = await repo.listFiles([`${(0, PathUtils_1.unixPath)(name)}/**`]);
|
|
74
71
|
for (const file of subfiles.sort()) {
|
|
75
72
|
const contents = await repo.readFile(file);
|
|
76
73
|
hasher.feedContent(contents);
|
|
77
74
|
// Incorporate the filename to detect if renames happen
|
|
78
|
-
const platformIndependentPath = PathUtils_1.unixPath(path_1.default.relative(name, PathUtils_1.normalizePath(file)));
|
|
75
|
+
const platformIndependentPath = (0, PathUtils_1.unixPath)(path_1.default.relative(name, (0, PathUtils_1.normalizePath)(file)));
|
|
79
76
|
hasher.feedContent(platformIndependentPath);
|
|
80
77
|
}
|
|
81
78
|
return hasher.digest();
|
package/lib-commonjs/Hash.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Hash.js","sourceRoot":"","sources":["../src/Hash.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;AAEH,oDAA4B;AAC5B,gDAAwB;AACxB,2CAAoD;AAEpD,oDAA4B;AAU5B;;GAEG;AACH,SAAS,gBAAgB,CACvB,OAAwB,EACxB,IAAc;IAEd,IACE,IAAI,CAAC,aAAa,KAAK,MAAM;QAC7B,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,gBAAM,
|
|
1
|
+
{"version":3,"file":"Hash.js","sourceRoot":"","sources":["../src/Hash.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;AAEH,oDAA4B;AAC5B,gDAAwB;AACxB,2CAAoD;AAEpD,oDAA4B;AAU5B;;GAEG;AACH,SAAS,gBAAgB,CACvB,OAAwB,EACxB,IAAc;IAEd,IACE,IAAI,CAAC,aAAa,KAAK,MAAM;QAC7B,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,IAAA,gBAAM,EAAC,OAAO,CAAC,CAAC,EACjD;QACA,OAAO,OAAO,CAAC;KAChB;IAED,QAAQ,IAAI,CAAC,aAAa,IAAI,aAAa,EAAE;QAC3C,KAAK,aAAa;YAChB,4CAA4C;YAC5C,OAAO,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAEhE,KAAK,YAAY;YACf,OAAO,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC/D;AACH,CAAC;AAED;;GAEG;AACH,MAAa,MAAM;IAIjB,YAAY,QAAmB;QAC7B,IAAI,CAAC,IAAI,GAAG,gBAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,EAAE,CAAC;IACjC,CAAC;IAED,WAAW,CAAC,OAAwB;QAClC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;CACF;AAjBD,wBAiBC;AAED;;GAEG;AACH,SAAgB,WAAW,CAAC,OAAwB,EAAE,IAAe;IACnE,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;AACxD,CAAC;AAFD,kCAEC;AAED;;GAEG;AACI,KAAK,UAAU,mBAAmB,CACvC,IAAY,EACZ,IAAoB,EACpB,IAAe;IAEf,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,IAAI,KAAK,MAAM,EAAE;QACnB,OAAO,IAAI,CAAC;KACb;IAED,IAAI,IAAI,KAAK,MAAM,EAAE;QACnB,OAAO,WAAW,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAE,EAAE,IAAI,CAAC,CAAC;KACxD;SAAM;QACL,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAA,oBAAQ,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAEhE,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE;YAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,CAAC,WAAW,CAAC,QAAS,CAAC,CAAC;YAE9B,uDAAuD;YACvD,MAAM,uBAAuB,GAAG,IAAA,oBAAQ,EACtC,cAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAA,yBAAa,EAAC,IAAI,CAAC,CAAC,CACzC,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;SAC7C;QACD,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC;KACxB;AACH,CAAC;AA5BD,kDA4BC","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * @format\n */\n\nimport crypto from 'crypto';\nimport path from 'path';\nimport {normalizePath, unixPath} from './PathUtils';\nimport FileRepository from './FileRepository';\nimport isUtf8 from 'isutf8';\n\nexport type HashOpts = {\n /**\n * What differences between files should we be insensitive to when generating\n * a hash? Defaults to line-ending insensitivity\n */\n insensitivity?: 'none' | 'line-ending' | 'whitespace';\n};\n\n/**\n * Normalize content according to insensitivty rules\n */\nfunction normalizeContent(\n content: string | Buffer,\n opts: HashOpts,\n): string | Buffer {\n if (\n opts.insensitivity === 'none' ||\n (typeof content !== 'string' && !isUtf8(content))\n ) {\n return content;\n }\n\n switch (opts.insensitivity || 'line-ending') {\n case 'line-ending':\n // Convert to CRLF for legacy hash stability\n return content.toString('utf8').replace(/(?<!\\r)\\n/g, '\\r\\n');\n\n case 'whitespace':\n return content.toString('utf8').trim().replace(/\\s+/g, ' ');\n }\n}\n\n/**\n * Creates a hash from content, attempting to normalize for line-feeds\n */\nexport class Hasher {\n private readonly hash: crypto.Hash;\n private readonly hashOpts: HashOpts;\n\n constructor(hashOpts?: HashOpts) {\n this.hash = crypto.createHash('sha1');\n this.hashOpts = hashOpts || {};\n }\n\n feedContent(content: string | Buffer): Hasher {\n this.hash.update(normalizeContent(content, this.hashOpts));\n return this;\n }\n\n digest(): string {\n return this.hash.digest('hex');\n }\n}\n\n/**\n * Convenience helper which hashes a single buffer\n */\nexport function hashContent(content: string | Buffer, opts?: HashOpts): string {\n return new Hasher(opts).feedContent(content).digest();\n}\n\n/**\n * Helper to hash a file/directory belonging to a repository\n */\nexport async function hashFileOrDirectory(\n name: string,\n repo: FileRepository,\n opts?: HashOpts,\n): Promise<string | null> {\n const type = await repo.stat(name);\n if (type === 'none') {\n return null;\n }\n\n if (type === 'file') {\n return hashContent((await repo.readFile(name))!, opts);\n } else {\n const hasher = new Hasher(opts);\n const subfiles = await repo.listFiles([`${unixPath(name)}/**`]);\n\n for (const file of subfiles.sort()) {\n const contents = await repo.readFile(file);\n hasher.feedContent(contents!);\n\n // Incorporate the filename to detect if renames happen\n const platformIndependentPath = unixPath(\n path.relative(name, normalizePath(file)),\n );\n hasher.feedContent(platformIndependentPath);\n }\n return hasher.digest();\n }\n}\n"]}
|
package/lib-commonjs/Manifest.js
CHANGED
|
@@ -27,7 +27,7 @@ class Manifest {
|
|
|
27
27
|
* exist in the manifest
|
|
28
28
|
*/
|
|
29
29
|
constructor(overrides, opts = {}) {
|
|
30
|
-
const uniquelyNamed = lodash_1.default.uniqBy(overrides, ovr => ovr.name());
|
|
30
|
+
const uniquelyNamed = lodash_1.default.uniqBy(overrides, (ovr) => ovr.name());
|
|
31
31
|
if (uniquelyNamed.length !== overrides.length) {
|
|
32
32
|
throw new Error('Cannot construct a manifest with duplicate overrides');
|
|
33
33
|
}
|
|
@@ -37,7 +37,7 @@ class Manifest {
|
|
|
37
37
|
this.overrides = lodash_1.default.clone(overrides);
|
|
38
38
|
}
|
|
39
39
|
static fromSerialized(man) {
|
|
40
|
-
const overrides = man.overrides.map(ovr => Override_1.deserializeOverride(ovr, { defaultBaseVersion: man.baseVersion }));
|
|
40
|
+
const overrides = man.overrides.map((ovr) => (0, Override_1.deserializeOverride)(ovr, { defaultBaseVersion: man.baseVersion }));
|
|
41
41
|
return new Manifest(overrides, {
|
|
42
42
|
includePatterns: man.includePatterns,
|
|
43
43
|
excludePatterns: man.excludePatterns,
|
|
@@ -53,18 +53,18 @@ class Manifest {
|
|
|
53
53
|
const errors = [];
|
|
54
54
|
const globs = [
|
|
55
55
|
...(this.includePatterns || ['**']),
|
|
56
|
-
...(this.excludePatterns || []).map(p => '!' + p),
|
|
56
|
+
...(this.excludePatterns || []).map((p) => '!' + p),
|
|
57
57
|
];
|
|
58
58
|
const overrideFiles = await overrideRepo.listFiles(globs);
|
|
59
|
-
const missingFromManifest = overrideFiles.filter(file => file !== 'overrides.json' &&
|
|
59
|
+
const missingFromManifest = overrideFiles.filter((file) => file !== 'overrides.json' &&
|
|
60
60
|
path_1.default.relative('node_modules', file).startsWith('..') &&
|
|
61
|
-
!this.overrides.some(override => override.includesFile(file)));
|
|
61
|
+
!this.overrides.some((override) => override.includesFile(file)));
|
|
62
62
|
for (const missingFile of missingFromManifest) {
|
|
63
63
|
errors.push({ type: 'missingFromManifest', overrideName: missingFile });
|
|
64
64
|
}
|
|
65
|
-
const validationTasks = lodash_1.default.flatMap(this.overrides, ovr => ovr.validationStrategies());
|
|
65
|
+
const validationTasks = lodash_1.default.flatMap(this.overrides, (ovr) => ovr.validationStrategies());
|
|
66
66
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
67
|
-
await async_1.eachLimit(validationTasks, 30, async (task) => {
|
|
67
|
+
await (0, async_1.eachLimit)(validationTasks, 30, async (task) => {
|
|
68
68
|
errors.push(...(await task.validate(overrideRepo, reactRepo)));
|
|
69
69
|
});
|
|
70
70
|
return errors.sort((a, b) => a.overrideName.localeCompare(b.overrideName, 'en'));
|
|
@@ -82,7 +82,7 @@ class Manifest {
|
|
|
82
82
|
* Whether the manifest contains a given override
|
|
83
83
|
*/
|
|
84
84
|
hasOverride(overrideName) {
|
|
85
|
-
return this.overrides.some(ovr => ovr.name() === PathUtils_1.normalizePath(overrideName));
|
|
85
|
+
return this.overrides.some((ovr) => ovr.name() === (0, PathUtils_1.normalizePath)(overrideName));
|
|
86
86
|
}
|
|
87
87
|
/**
|
|
88
88
|
* Try to remove an override.
|
|
@@ -131,7 +131,7 @@ class Manifest {
|
|
|
131
131
|
baseVersion: this.baseVersion,
|
|
132
132
|
overrides: this.overrides
|
|
133
133
|
.sort((a, b) => a.name().localeCompare(b.name(), 'en'))
|
|
134
|
-
.map(override => override.serialize({ defaultBaseVersion: this.baseVersion })),
|
|
134
|
+
.map((override) => override.serialize({ defaultBaseVersion: this.baseVersion })),
|
|
135
135
|
};
|
|
136
136
|
}
|
|
137
137
|
/**
|
|
@@ -151,7 +151,7 @@ class Manifest {
|
|
|
151
151
|
* @returns -1 if it cannot be found
|
|
152
152
|
*/
|
|
153
153
|
findOverrideIndex(overrideName) {
|
|
154
|
-
return this.overrides.findIndex(ovr => ovr.name() === PathUtils_1.normalizePath(overrideName));
|
|
154
|
+
return this.overrides.findIndex((ovr) => ovr.name() === (0, PathUtils_1.normalizePath)(overrideName));
|
|
155
155
|
}
|
|
156
156
|
}
|
|
157
157
|
exports.default = Manifest;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Manifest.js","sourceRoot":"","sources":["../src/Manifest.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * @format\n */\n\nimport * as Serialized from './Serialized';\nimport _ from 'lodash';\nimport path from 'path';\n\nimport Override, {deserializeOverride} from './Override';\nimport {ReactFileRepository, WritableFileRepository} from './FileRepository';\nimport OverrideFactory from './OverrideFactory';\nimport {ValidationError} from './ValidationStrategy';\nimport {eachLimit} from 'async';\nimport {normalizePath} from './PathUtils';\n\n/**\n * Represents a collection of overrides listed in an on-disk manifest. Allows\n * performing aggregate operations on the overrides.\n */\nexport default class Manifest {\n private readonly includePatterns?: string[];\n private readonly excludePatterns?: string[];\n private baseVersion?: string;\n private readonly overrides: Override[];\n\n /**\n * Construct the manifest\n *\n * @param overrides List of overrides to evaluate\n * @param opts Allows specifying globs to include or exclude paths to enforce\n * exist in the manifest\n */\n constructor(\n overrides: Override[],\n opts: {\n includePatterns?: string[];\n excludePatterns?: string[];\n baseVersion?: string;\n } = {},\n ) {\n const uniquelyNamed = _.uniqBy(overrides, ovr => ovr.name());\n if (uniquelyNamed.length !== overrides.length) {\n throw new Error('Cannot construct a manifest with duplicate overrides');\n }\n\n this.includePatterns = opts.includePatterns;\n this.excludePatterns = opts.excludePatterns;\n this.baseVersion = opts.baseVersion;\n this.overrides = _.clone(overrides);\n }\n\n static fromSerialized(man: Serialized.Manifest): Manifest {\n const overrides = man.overrides.map(ovr =>\n deserializeOverride(ovr, {defaultBaseVersion: man.baseVersion}),\n );\n return new Manifest(overrides, {\n includePatterns: man.includePatterns,\n excludePatterns: man.excludePatterns,\n baseVersion: man.baseVersion,\n });\n }\n\n /**\n * Check that overrides are accurately accounted for in the manifest. E.g.\n * all files should be accounted for, and base files should be up to date\n * with upstream.\n */\n async validate(\n overrideRepo: WritableFileRepository,\n reactRepo: ReactFileRepository,\n ): Promise<ValidationError[]> {\n const errors: ValidationError[] = [];\n\n const globs = [\n ...(this.includePatterns || ['**']),\n ...(this.excludePatterns || []).map(p => '!' + p),\n ];\n\n const overrideFiles = await overrideRepo.listFiles(globs);\n const missingFromManifest = overrideFiles.filter(\n file =>\n file !== 'overrides.json' &&\n path.relative('node_modules', file).startsWith('..') &&\n !this.overrides.some(override => override.includesFile(file)),\n );\n for (const missingFile of missingFromManifest) {\n errors.push({type: 'missingFromManifest', overrideName: missingFile});\n }\n\n const validationTasks = _.flatMap(this.overrides, ovr =>\n ovr.validationStrategies(),\n );\n\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n await eachLimit(validationTasks, 30, async task => {\n errors.push(...(await task.validate(overrideRepo, reactRepo)));\n });\n\n return errors.sort((a, b) =>\n a.overrideName.localeCompare(b.overrideName, 'en'),\n );\n }\n\n /**\n * Add an override to the manifest\n */\n addOverride(override: Override) {\n if (this.hasOverride(override.name())) {\n throw new Error(`Trying to add duplicate override '${override.name()}'`);\n }\n\n this.overrides.push(override);\n }\n\n /**\n * Whether the manifest contains a given override\n */\n hasOverride(overrideName: string): boolean {\n return this.overrides.some(\n ovr => ovr.name() === normalizePath(overrideName),\n );\n }\n\n /**\n * Try to remove an override.\n * @returns false if none is found with the given name\n */\n removeOverride(overrideName: string): boolean {\n const idx = this.findOverrideIndex(overrideName);\n if (idx === -1) {\n return false;\n }\n\n this.overrides.splice(idx, 1);\n return true;\n }\n\n /**\n * Returns the entry corresponding to the given override path, or null if none\n * exists.\n */\n findOverride(overrideName: string): Override | null {\n const idx = this.findOverrideIndex(overrideName);\n if (idx === -1) {\n return null;\n }\n\n return this.overrides[idx];\n }\n\n /**\n * Updates an override entry to mark it as up-to-date in regards to its\n * current base file.\n */\n async markUpToDate(overrideName: string, overrideFactory: OverrideFactory) {\n const override = this.findOverride(overrideName);\n if (override === null) {\n throw new Error(`Override '${overrideName}' does not exist`);\n }\n\n // Mutate the object instead of replacing by index because the index may no\n // longer be the same after awaiting.\n const upToDateOverride = await override.createUpdated(overrideFactory);\n Object.assign(override, upToDateOverride);\n }\n\n /**\n * Return a serialized representation of the manifest\n */\n serialize(): Serialized.Manifest {\n return {\n includePatterns: this.includePatterns,\n excludePatterns: this.excludePatterns,\n baseVersion: this.baseVersion,\n overrides: this.overrides\n .sort((a, b) => a.name().localeCompare(b.name(), 'en'))\n .map(override =>\n override.serialize({defaultBaseVersion: this.baseVersion}),\n ),\n };\n }\n\n /**\n * Returns the overrides in the manfest\n */\n listOverrides(): Override[] {\n return _.clone(this.overrides);\n }\n\n /**\n * Set the default baseVersion for the manifest\n */\n setBaseVersion(baseVersion?: string) {\n this.baseVersion = baseVersion;\n }\n\n /**\n * Find the index to a given override.\n * @returns -1 if it cannot be found\n */\n private findOverrideIndex(overrideName: string): number {\n return this.overrides.findIndex(\n ovr => ovr.name() === normalizePath(overrideName),\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Manifest.js","sourceRoot":"","sources":["../src/Manifest.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * @format\n */\n\nimport * as Serialized from './Serialized';\nimport _ from 'lodash';\nimport path from 'path';\n\nimport Override, {deserializeOverride} from './Override';\nimport {ReactFileRepository, WritableFileRepository} from './FileRepository';\nimport OverrideFactory from './OverrideFactory';\nimport {ValidationError} from './ValidationStrategy';\nimport {eachLimit} from 'async';\nimport {normalizePath} from './PathUtils';\n\n/**\n * Represents a collection of overrides listed in an on-disk manifest. Allows\n * performing aggregate operations on the overrides.\n */\nexport default class Manifest {\n private readonly includePatterns?: string[];\n private readonly excludePatterns?: string[];\n private baseVersion?: string;\n private readonly overrides: Override[];\n\n /**\n * Construct the manifest\n *\n * @param overrides List of overrides to evaluate\n * @param opts Allows specifying globs to include or exclude paths to enforce\n * exist in the manifest\n */\n constructor(\n overrides: Override[],\n opts: {\n includePatterns?: string[];\n excludePatterns?: string[];\n baseVersion?: string;\n } = {},\n ) {\n const uniquelyNamed = _.uniqBy(overrides, (ovr) => ovr.name());\n if (uniquelyNamed.length !== overrides.length) {\n throw new Error('Cannot construct a manifest with duplicate overrides');\n }\n\n this.includePatterns = opts.includePatterns;\n this.excludePatterns = opts.excludePatterns;\n this.baseVersion = opts.baseVersion;\n this.overrides = _.clone(overrides);\n }\n\n static fromSerialized(man: Serialized.Manifest): Manifest {\n const overrides = man.overrides.map((ovr) =>\n deserializeOverride(ovr, {defaultBaseVersion: man.baseVersion}),\n );\n return new Manifest(overrides, {\n includePatterns: man.includePatterns,\n excludePatterns: man.excludePatterns,\n baseVersion: man.baseVersion,\n });\n }\n\n /**\n * Check that overrides are accurately accounted for in the manifest. E.g.\n * all files should be accounted for, and base files should be up to date\n * with upstream.\n */\n async validate(\n overrideRepo: WritableFileRepository,\n reactRepo: ReactFileRepository,\n ): Promise<ValidationError[]> {\n const errors: ValidationError[] = [];\n\n const globs = [\n ...(this.includePatterns || ['**']),\n ...(this.excludePatterns || []).map((p) => '!' + p),\n ];\n\n const overrideFiles = await overrideRepo.listFiles(globs);\n const missingFromManifest = overrideFiles.filter(\n (file) =>\n file !== 'overrides.json' &&\n path.relative('node_modules', file).startsWith('..') &&\n !this.overrides.some((override) => override.includesFile(file)),\n );\n for (const missingFile of missingFromManifest) {\n errors.push({type: 'missingFromManifest', overrideName: missingFile});\n }\n\n const validationTasks = _.flatMap(this.overrides, (ovr) =>\n ovr.validationStrategies(),\n );\n\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n await eachLimit(validationTasks, 30, async (task) => {\n errors.push(...(await task.validate(overrideRepo, reactRepo)));\n });\n\n return errors.sort((a, b) =>\n a.overrideName.localeCompare(b.overrideName, 'en'),\n );\n }\n\n /**\n * Add an override to the manifest\n */\n addOverride(override: Override) {\n if (this.hasOverride(override.name())) {\n throw new Error(`Trying to add duplicate override '${override.name()}'`);\n }\n\n this.overrides.push(override);\n }\n\n /**\n * Whether the manifest contains a given override\n */\n hasOverride(overrideName: string): boolean {\n return this.overrides.some(\n (ovr) => ovr.name() === normalizePath(overrideName),\n );\n }\n\n /**\n * Try to remove an override.\n * @returns false if none is found with the given name\n */\n removeOverride(overrideName: string): boolean {\n const idx = this.findOverrideIndex(overrideName);\n if (idx === -1) {\n return false;\n }\n\n this.overrides.splice(idx, 1);\n return true;\n }\n\n /**\n * Returns the entry corresponding to the given override path, or null if none\n * exists.\n */\n findOverride(overrideName: string): Override | null {\n const idx = this.findOverrideIndex(overrideName);\n if (idx === -1) {\n return null;\n }\n\n return this.overrides[idx];\n }\n\n /**\n * Updates an override entry to mark it as up-to-date in regards to its\n * current base file.\n */\n async markUpToDate(overrideName: string, overrideFactory: OverrideFactory) {\n const override = this.findOverride(overrideName);\n if (override === null) {\n throw new Error(`Override '${overrideName}' does not exist`);\n }\n\n // Mutate the object instead of replacing by index because the index may no\n // longer be the same after awaiting.\n const upToDateOverride = await override.createUpdated(overrideFactory);\n Object.assign(override, upToDateOverride);\n }\n\n /**\n * Return a serialized representation of the manifest\n */\n serialize(): Serialized.Manifest {\n return {\n includePatterns: this.includePatterns,\n excludePatterns: this.excludePatterns,\n baseVersion: this.baseVersion,\n overrides: this.overrides\n .sort((a, b) => a.name().localeCompare(b.name(), 'en'))\n .map((override) =>\n override.serialize({defaultBaseVersion: this.baseVersion}),\n ),\n };\n }\n\n /**\n * Returns the overrides in the manfest\n */\n listOverrides(): Override[] {\n return _.clone(this.overrides);\n }\n\n /**\n * Set the default baseVersion for the manifest\n */\n setBaseVersion(baseVersion?: string) {\n this.baseVersion = baseVersion;\n }\n\n /**\n * Find the index to a given override.\n * @returns -1 if it cannot be found\n */\n private findOverrideIndex(overrideName: string): number {\n return this.overrides.findIndex(\n (ovr) => ovr.name() === normalizePath(overrideName),\n );\n }\n}\n"]}
|
package/lib-commonjs/Override.js
CHANGED
|
@@ -20,19 +20,19 @@ const PathUtils_1 = require("./PathUtils");
|
|
|
20
20
|
*/
|
|
21
21
|
class PlatformOverride {
|
|
22
22
|
constructor(args) {
|
|
23
|
-
this.overrideFile = PathUtils_1.normalizePath(args.file);
|
|
23
|
+
this.overrideFile = (0, PathUtils_1.normalizePath)(args.file);
|
|
24
24
|
}
|
|
25
25
|
static fromSerialized(serialized, _opts) {
|
|
26
26
|
return new PlatformOverride(serialized);
|
|
27
27
|
}
|
|
28
28
|
serialize() {
|
|
29
|
-
return { type: 'platform', file: PathUtils_1.unixPath(this.overrideFile) };
|
|
29
|
+
return { type: 'platform', file: (0, PathUtils_1.unixPath)(this.overrideFile) };
|
|
30
30
|
}
|
|
31
31
|
name() {
|
|
32
32
|
return this.overrideFile;
|
|
33
33
|
}
|
|
34
34
|
includesFile(filename) {
|
|
35
|
-
return PathUtils_1.normalizePath(filename) === this.overrideFile;
|
|
35
|
+
return (0, PathUtils_1.normalizePath)(filename) === this.overrideFile;
|
|
36
36
|
}
|
|
37
37
|
async createUpdated(factory) {
|
|
38
38
|
return factory.createPlatformOverride(this.overrideFile);
|
|
@@ -53,8 +53,8 @@ exports.PlatformOverride = PlatformOverride;
|
|
|
53
53
|
*/
|
|
54
54
|
class BaseFileOverride {
|
|
55
55
|
constructor(args) {
|
|
56
|
-
this.overrideFile = PathUtils_1.normalizePath(args.file);
|
|
57
|
-
this.baseFile = PathUtils_1.normalizePath(args.baseFile);
|
|
56
|
+
this.overrideFile = (0, PathUtils_1.normalizePath)(args.file);
|
|
57
|
+
this.baseFile = (0, PathUtils_1.normalizePath)(args.baseFile);
|
|
58
58
|
this.baseVersion = args.baseVersion;
|
|
59
59
|
this.baseHash = args.baseHash;
|
|
60
60
|
this.issueNumber = args.issue;
|
|
@@ -63,7 +63,7 @@ class BaseFileOverride {
|
|
|
63
63
|
return this.overrideFile;
|
|
64
64
|
}
|
|
65
65
|
includesFile(filename) {
|
|
66
|
-
return PathUtils_1.normalizePath(filename) === this.overrideFile;
|
|
66
|
+
return (0, PathUtils_1.normalizePath)(filename) === this.overrideFile;
|
|
67
67
|
}
|
|
68
68
|
validationStrategies() {
|
|
69
69
|
return [
|
|
@@ -78,8 +78,8 @@ class BaseFileOverride {
|
|
|
78
78
|
serializeBase(type, opts) {
|
|
79
79
|
return {
|
|
80
80
|
type,
|
|
81
|
-
file: PathUtils_1.unixPath(this.overrideFile),
|
|
82
|
-
baseFile: PathUtils_1.unixPath(this.baseFile),
|
|
81
|
+
file: (0, PathUtils_1.unixPath)(this.overrideFile),
|
|
82
|
+
baseFile: (0, PathUtils_1.unixPath)(this.baseFile),
|
|
83
83
|
baseVersion: (opts === null || opts === void 0 ? void 0 : opts.defaultBaseVersion) === this.baseVersion
|
|
84
84
|
? undefined
|
|
85
85
|
: this.baseVersion,
|
|
@@ -176,8 +176,8 @@ exports.PatchOverride = PatchOverride;
|
|
|
176
176
|
*/
|
|
177
177
|
class DirectoryCopyOverride {
|
|
178
178
|
constructor(args) {
|
|
179
|
-
this.directory = PathUtils_1.normalizePath(args.directory);
|
|
180
|
-
this.baseDirectory = PathUtils_1.normalizePath(args.baseDirectory);
|
|
179
|
+
this.directory = (0, PathUtils_1.normalizePath)(args.directory);
|
|
180
|
+
this.baseDirectory = (0, PathUtils_1.normalizePath)(args.baseDirectory);
|
|
181
181
|
this.baseVersion = args.baseVersion;
|
|
182
182
|
this.baseHash = args.baseHash;
|
|
183
183
|
this.issue = args.issue;
|
|
@@ -188,8 +188,8 @@ class DirectoryCopyOverride {
|
|
|
188
188
|
serialize(opts) {
|
|
189
189
|
return {
|
|
190
190
|
type: 'copy',
|
|
191
|
-
directory: PathUtils_1.unixPath(this.directory),
|
|
192
|
-
baseDirectory: PathUtils_1.unixPath(this.baseDirectory),
|
|
191
|
+
directory: (0, PathUtils_1.unixPath)(this.directory),
|
|
192
|
+
baseDirectory: (0, PathUtils_1.unixPath)(this.baseDirectory),
|
|
193
193
|
baseVersion: (opts === null || opts === void 0 ? void 0 : opts.defaultBaseVersion) === this.baseVersion
|
|
194
194
|
? undefined
|
|
195
195
|
: this.baseVersion,
|
|
@@ -201,7 +201,7 @@ class DirectoryCopyOverride {
|
|
|
201
201
|
return this.directory;
|
|
202
202
|
}
|
|
203
203
|
includesFile(filename) {
|
|
204
|
-
const relativeToDir = path_1.default.relative(this.directory, PathUtils_1.normalizePath(filename));
|
|
204
|
+
const relativeToDir = path_1.default.relative(this.directory, (0, PathUtils_1.normalizePath)(filename));
|
|
205
205
|
return relativeToDir.split(path_1.default.sep)[0] !== '..';
|
|
206
206
|
}
|
|
207
207
|
async createUpdated(factory) {
|