react-native-platform-override 1.6.7 → 1.6.10

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.
@@ -121,8 +121,8 @@ async function upgradeOverrides(manifestPath, opts) {
121
121
  const ctx = await createManifestContext(manifestPath, opts);
122
122
  const validationErrors = await ctx.manifest.validate(ctx.overrideRepo, ctx.reactRepo);
123
123
  const outOfDateOverrides = validationErrors
124
- .filter((err) => err.type === 'outOfDate')
125
- .map((err) => ctx.manifest.findOverride(err.overrideName));
124
+ .filter(err => err.type === 'outOfDate')
125
+ .map(err => ctx.manifest.findOverride(err.overrideName));
126
126
  // Perform upgrades concurrently so we can take advantage of
127
127
  // GitReactFileRepository optimizations when multiple requests are queued at
128
128
  // once.
@@ -140,10 +140,10 @@ async function upgradeOverrides(manifestPath, opts) {
140
140
  // to current. This helps to minimize the numbers of versions we have to
141
141
  // check out for future upgrades.
142
142
  const upToDateOverrides = [
143
- ...lodash_1.default.difference(ctx.manifest.listOverrides(), validationErrors.map((err) => ctx.manifest.findOverride(err.overrideName))).map((ovr) => ovr.name()),
143
+ ...lodash_1.default.difference(ctx.manifest.listOverrides(), validationErrors.map(err => ctx.manifest.findOverride(err.overrideName))).map(ovr => ovr.name()),
144
144
  ...upgradeResults
145
- .filter((res) => res.filesWritten)
146
- .map((res) => res.overrideName),
145
+ .filter(res => res.filesWritten)
146
+ .map(res => res.overrideName),
147
147
  ];
148
148
  await (0, async_1.eachLimit)(upToDateOverrides, MAX_CONCURRENT_TASKS, async (name) => {
149
149
  await ctx.manifest.markUpToDate(name, ctx.overrideFactory);
@@ -1 +1 @@
1
- {"version":3,"file":"Api.js","sourceRoot":"","sources":["../src/Api.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * @format\n */\n\n// Typings for \"async\" confuse this rule\n/* eslint-disable @typescript-eslint/no-misused-promises */\n\nimport * as Serialized from './Serialized';\nimport _ from 'lodash';\nimport fs from '@react-native-windows/fs';\nimport path from 'path';\n\nimport OverrideFactory, {OverrideFactoryImpl} from './OverrideFactory';\nimport {\n ReactFileRepository,\n WritableFileRepository,\n bindVersion,\n} from './FileRepository';\nimport {eachLimit, mapLimit} from 'async';\nimport FileSystemRepository from './FileSystemRepository';\nimport GitReactFileRepository from './GitReactFileRepository';\nimport Manifest from './Manifest';\nimport Override from './Override';\nimport {UpgradeResult} from './UpgradeStrategy';\nimport {ValidationError} from './ValidationStrategy';\nimport {getInstalledRNVersion} from './PackageUtils';\n\n// Re-export types used in the public API so external packages don't have to\n// reach into our guts to import them.\nexport * from './OverrideFactory';\nexport * from './Override';\nexport * from './refFromVersion';\nexport {UpgradeResult, ValidationError};\n\nconst MAX_CONCURRENT_TASKS = 30;\n\n/**\n * Check that the given manifest correctly describe overrides and that all\n * overrides are up to date\n */\nexport async function validateManifest(\n manifestPath: string,\n opts?: {\n reactNativeVersion?: string;\n },\n): Promise<ValidationError[]> {\n const {manifest, overrideRepo, reactRepo} = await createManifestContext(\n manifestPath,\n opts,\n );\n return await manifest.validate(overrideRepo, reactRepo);\n}\n\n/**\n * Return whether the override exists in the manifest\n */\nexport async function hasOverride(\n overrideName: string,\n manifestPath: string,\n): Promise<boolean> {\n const {manifest} = await createManifestContext(manifestPath);\n return manifest.hasOverride(overrideName);\n}\n\n/**\n * Removes an override from the manifest if it exists.\n * @returns whether the override was removed\n */\nexport async function removeOverride(\n overrideName: string,\n manifestPath: string,\n): Promise<boolean> {\n const {manifest} = await createManifestContext(manifestPath);\n const removed = manifest.removeOverride(overrideName);\n if (removed) {\n await Serialized.writeManifestToFile(manifest.serialize(), manifestPath);\n }\n\n return removed;\n}\n\n/**\n * Returns a factory to create overrides which may be added to the manifest\n */\nexport async function getOverrideFactory(\n manifestPath: string,\n opts?: {\n reactNativeVersion?: string;\n },\n): Promise<OverrideFactory> {\n return (await createManifestContext(manifestPath, opts)).overrideFactory;\n}\n\n/**\n * Adds an override to the manifest\n */\nexport async function addOverride(\n override: Override,\n manifestPath: string,\n): Promise<void> {\n const {manifest} = await createManifestContext(manifestPath);\n manifest.addOverride(override);\n await Serialized.writeManifestToFile(manifest.serialize(), manifestPath);\n}\n\n/**\n * Ouputs a patch-style diff of an override compared to its original source\n */\nexport async function diffOverride(\n overrideName: string,\n manifestPath: string,\n): Promise<string> {\n const ctx = await createManifestContext(manifestPath);\n\n const override = ctx.manifest.findOverride(overrideName);\n if (!override) {\n throw new Error(`Could not find override with name \"${overrideName}\"`);\n }\n\n return override.diffStrategy().diff(ctx.gitReactRepo, ctx.overrideRepo);\n}\n\n/**\n * Receives notifications on progress during overide upgrades\n */\nexport type UpgradeProgressListener = (\n currentOverride: number,\n totalOverrides: number,\n) => void;\n\n/**\n * Attempts to automatically merge changes from the current version into\n * out-of-date overrides.\n */\nexport async function upgradeOverrides(\n manifestPath: string,\n opts: {\n allowConflicts: boolean;\n reactNativeVersion?: string;\n progressListener?: UpgradeProgressListener;\n },\n): Promise<UpgradeResult[]> {\n const ctx = await createManifestContext(manifestPath, opts);\n\n const validationErrors = await ctx.manifest.validate(\n ctx.overrideRepo,\n ctx.reactRepo,\n );\n\n const outOfDateOverrides = validationErrors\n .filter((err) => err.type === 'outOfDate')\n .map((err) => ctx.manifest.findOverride(err.overrideName)!);\n\n // Perform upgrades concurrently so we can take advantage of\n // GitReactFileRepository optimizations when multiple requests are queued at\n // once.\n let i = 0;\n const upgradeResults = await mapLimit<Override, UpgradeResult>(\n outOfDateOverrides,\n MAX_CONCURRENT_TASKS,\n async (override) => {\n const upgradeResult = await override\n .upgradeStrategy()\n .upgrade(\n ctx.gitReactRepo,\n ctx.overrideRepo,\n ctx.reactNativeVersion,\n opts.allowConflicts,\n );\n\n if (opts.progressListener) {\n opts.progressListener(++i, outOfDateOverrides.length);\n }\n\n return upgradeResult;\n },\n );\n\n // Regenerate overrides that are already up to date to update the baseVersion\n // to current. This helps to minimize the numbers of versions we have to\n // check out for future upgrades.\n const upToDateOverrides = [\n ..._.difference(\n ctx.manifest.listOverrides(),\n validationErrors.map(\n (err) => ctx.manifest.findOverride(err.overrideName)!,\n ),\n ).map((ovr) => ovr.name()),\n\n ...upgradeResults\n .filter((res) => res.filesWritten)\n .map((res) => res.overrideName),\n ];\n\n await eachLimit(upToDateOverrides, MAX_CONCURRENT_TASKS, async (name) => {\n await ctx.manifest.markUpToDate(name, ctx.overrideFactory);\n });\n\n ctx.manifest.setBaseVersion(ctx.reactNativeVersion);\n await Serialized.writeManifestToFile(ctx.manifest.serialize(), manifestPath);\n\n return upgradeResults.sort((a, b) =>\n a.overrideName.localeCompare(b.overrideName, 'en'),\n );\n}\n\n/**\n * Throw if a file doesn't exist, printing an error message on the way\n */\nasync function checkFileExists(friendlyName: string, filePath: string) {\n try {\n await fs.access(filePath);\n } catch (ex) {\n throw new Error(`Could not find ${friendlyName} at path '${filePath}'`);\n }\n}\n\n/**\n * Context describing state centered around a single manifest\n */\ninterface ManifestContext {\n overrideRepo: WritableFileRepository;\n reactRepo: ReactFileRepository;\n gitReactRepo: GitReactFileRepository;\n overrideFactory: OverrideFactory;\n manifest: Manifest;\n reactNativeVersion: string;\n}\n\n/**\n * Sets up state for a manifest describing overrides at a specified RN version\n */\nasync function createManifestContext(\n manifestPath: string,\n opts?: {\n reactNativeVersion?: string;\n },\n): Promise<ManifestContext> {\n await checkFileExists('manifest', manifestPath);\n const reactNativeVersion =\n opts?.reactNativeVersion || (await getInstalledRNVersion());\n\n const overrideDir = path.dirname(manifestPath);\n const overrideRepo = new FileSystemRepository(overrideDir);\n\n const gitReactRepo = await GitReactFileRepository.createAndInit();\n const reactRepo = bindVersion(gitReactRepo, reactNativeVersion);\n\n const overrideFactory = new OverrideFactoryImpl(reactRepo, overrideRepo);\n const manifest = Manifest.fromSerialized(\n await Serialized.readManifestFromFile(manifestPath),\n );\n\n return {\n overrideRepo,\n reactRepo,\n gitReactRepo,\n overrideFactory,\n manifest,\n reactNativeVersion,\n };\n}\n"]}
1
+ {"version":3,"file":"Api.js","sourceRoot":"","sources":["../src/Api.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * @format\n */\n\n// Typings for \"async\" confuse this rule\n/* eslint-disable @typescript-eslint/no-misused-promises */\n\nimport * as Serialized from './Serialized';\nimport _ from 'lodash';\nimport fs from '@react-native-windows/fs';\nimport path from 'path';\n\nimport OverrideFactory, {OverrideFactoryImpl} from './OverrideFactory';\nimport {\n ReactFileRepository,\n WritableFileRepository,\n bindVersion,\n} from './FileRepository';\nimport {eachLimit, mapLimit} from 'async';\nimport FileSystemRepository from './FileSystemRepository';\nimport GitReactFileRepository from './GitReactFileRepository';\nimport Manifest from './Manifest';\nimport Override from './Override';\nimport {UpgradeResult} from './UpgradeStrategy';\nimport {ValidationError} from './ValidationStrategy';\nimport {getInstalledRNVersion} from './PackageUtils';\n\n// Re-export types used in the public API so external packages don't have to\n// reach into our guts to import them.\nexport * from './OverrideFactory';\nexport * from './Override';\nexport * from './refFromVersion';\nexport {UpgradeResult, ValidationError};\n\nconst MAX_CONCURRENT_TASKS = 30;\n\n/**\n * Check that the given manifest correctly describe overrides and that all\n * overrides are up to date\n */\nexport async function validateManifest(\n manifestPath: string,\n opts?: {\n reactNativeVersion?: string;\n },\n): Promise<ValidationError[]> {\n const {manifest, overrideRepo, reactRepo} = await createManifestContext(\n manifestPath,\n opts,\n );\n return await manifest.validate(overrideRepo, reactRepo);\n}\n\n/**\n * Return whether the override exists in the manifest\n */\nexport async function hasOverride(\n overrideName: string,\n manifestPath: string,\n): Promise<boolean> {\n const {manifest} = await createManifestContext(manifestPath);\n return manifest.hasOverride(overrideName);\n}\n\n/**\n * Removes an override from the manifest if it exists.\n * @returns whether the override was removed\n */\nexport async function removeOverride(\n overrideName: string,\n manifestPath: string,\n): Promise<boolean> {\n const {manifest} = await createManifestContext(manifestPath);\n const removed = manifest.removeOverride(overrideName);\n if (removed) {\n await Serialized.writeManifestToFile(manifest.serialize(), manifestPath);\n }\n\n return removed;\n}\n\n/**\n * Returns a factory to create overrides which may be added to the manifest\n */\nexport async function getOverrideFactory(\n manifestPath: string,\n opts?: {\n reactNativeVersion?: string;\n },\n): Promise<OverrideFactory> {\n return (await createManifestContext(manifestPath, opts)).overrideFactory;\n}\n\n/**\n * Adds an override to the manifest\n */\nexport async function addOverride(\n override: Override,\n manifestPath: string,\n): Promise<void> {\n const {manifest} = await createManifestContext(manifestPath);\n manifest.addOverride(override);\n await Serialized.writeManifestToFile(manifest.serialize(), manifestPath);\n}\n\n/**\n * Ouputs a patch-style diff of an override compared to its original source\n */\nexport async function diffOverride(\n overrideName: string,\n manifestPath: string,\n): Promise<string> {\n const ctx = await createManifestContext(manifestPath);\n\n const override = ctx.manifest.findOverride(overrideName);\n if (!override) {\n throw new Error(`Could not find override with name \"${overrideName}\"`);\n }\n\n return override.diffStrategy().diff(ctx.gitReactRepo, ctx.overrideRepo);\n}\n\n/**\n * Receives notifications on progress during overide upgrades\n */\nexport type UpgradeProgressListener = (\n currentOverride: number,\n totalOverrides: number,\n) => void;\n\n/**\n * Attempts to automatically merge changes from the current version into\n * out-of-date overrides.\n */\nexport async function upgradeOverrides(\n manifestPath: string,\n opts: {\n allowConflicts: boolean;\n reactNativeVersion?: string;\n progressListener?: UpgradeProgressListener;\n },\n): Promise<UpgradeResult[]> {\n const ctx = await createManifestContext(manifestPath, opts);\n\n const validationErrors = await ctx.manifest.validate(\n ctx.overrideRepo,\n ctx.reactRepo,\n );\n\n const outOfDateOverrides = validationErrors\n .filter(err => err.type === 'outOfDate')\n .map(err => ctx.manifest.findOverride(err.overrideName)!);\n\n // Perform upgrades concurrently so we can take advantage of\n // GitReactFileRepository optimizations when multiple requests are queued at\n // once.\n let i = 0;\n const upgradeResults = await mapLimit<Override, UpgradeResult>(\n outOfDateOverrides,\n MAX_CONCURRENT_TASKS,\n async override => {\n const upgradeResult = await override\n .upgradeStrategy()\n .upgrade(\n ctx.gitReactRepo,\n ctx.overrideRepo,\n ctx.reactNativeVersion,\n opts.allowConflicts,\n );\n\n if (opts.progressListener) {\n opts.progressListener(++i, outOfDateOverrides.length);\n }\n\n return upgradeResult;\n },\n );\n\n // Regenerate overrides that are already up to date to update the baseVersion\n // to current. This helps to minimize the numbers of versions we have to\n // check out for future upgrades.\n const upToDateOverrides = [\n ..._.difference(\n ctx.manifest.listOverrides(),\n validationErrors.map(err => ctx.manifest.findOverride(err.overrideName)!),\n ).map(ovr => ovr.name()),\n\n ...upgradeResults\n .filter(res => res.filesWritten)\n .map(res => res.overrideName),\n ];\n\n await eachLimit(upToDateOverrides, MAX_CONCURRENT_TASKS, async name => {\n await ctx.manifest.markUpToDate(name, ctx.overrideFactory);\n });\n\n ctx.manifest.setBaseVersion(ctx.reactNativeVersion);\n await Serialized.writeManifestToFile(ctx.manifest.serialize(), manifestPath);\n\n return upgradeResults.sort((a, b) =>\n a.overrideName.localeCompare(b.overrideName, 'en'),\n );\n}\n\n/**\n * Throw if a file doesn't exist, printing an error message on the way\n */\nasync function checkFileExists(friendlyName: string, filePath: string) {\n try {\n await fs.access(filePath);\n } catch (ex) {\n throw new Error(`Could not find ${friendlyName} at path '${filePath}'`);\n }\n}\n\n/**\n * Context describing state centered around a single manifest\n */\ninterface ManifestContext {\n overrideRepo: WritableFileRepository;\n reactRepo: ReactFileRepository;\n gitReactRepo: GitReactFileRepository;\n overrideFactory: OverrideFactory;\n manifest: Manifest;\n reactNativeVersion: string;\n}\n\n/**\n * Sets up state for a manifest describing overrides at a specified RN version\n */\nasync function createManifestContext(\n manifestPath: string,\n opts?: {\n reactNativeVersion?: string;\n },\n): Promise<ManifestContext> {\n await checkFileExists('manifest', manifestPath);\n const reactNativeVersion =\n opts?.reactNativeVersion || (await getInstalledRNVersion());\n\n const overrideDir = path.dirname(manifestPath);\n const overrideRepo = new FileSystemRepository(overrideDir);\n\n const gitReactRepo = await GitReactFileRepository.createAndInit();\n const reactRepo = bindVersion(gitReactRepo, reactNativeVersion);\n\n const overrideFactory = new OverrideFactoryImpl(reactRepo, overrideRepo);\n const manifest = Manifest.fromSerialized(\n await Serialized.readManifestFromFile(manifestPath),\n );\n\n return {\n overrideRepo,\n reactRepo,\n gitReactRepo,\n overrideFactory,\n manifest,\n reactNativeVersion,\n };\n}\n"]}
@@ -46,7 +46,7 @@ void doMain(async () => {
46
46
  const npmPackage = await (0, PackageUtils_1.getNpmPackage)();
47
47
  return new Promise((resolve, _reject) => {
48
48
  yargs_1.default
49
- .command('validate', 'Verify that overrides are recorded and up-to-date', (cmdYargs) => cmdYargs.options({
49
+ .command('validate', 'Verify that overrides are recorded and up-to-date', cmdYargs => cmdYargs.options({
50
50
  manifest: {
51
51
  type: 'string',
52
52
  describe: 'Optional path to the override manifest to validate',
@@ -57,26 +57,26 @@ void doMain(async () => {
57
57
  },
58
58
  }),
59
59
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
60
- (cmdArgv) => validateManifests({
60
+ cmdArgv => validateManifests({
61
61
  manifestPath: cmdArgv.manifest,
62
62
  reactNativeVersion: cmdArgv.version,
63
63
  }))
64
- .command('add <override>', 'Add an override to the manifest', (cmdYargs) => cmdYargs.options({
64
+ .command('add <override>', 'Add an override to the manifest', cmdYargs => cmdYargs.options({
65
65
  override: { type: 'string', describe: 'The override to add' },
66
66
  }),
67
67
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
68
- (cmdArgv) => addOverride(cmdArgv.override))
69
- .command('remove <override>', 'Remove an override from the manifest', (cmdYargs) => cmdYargs.options({
68
+ cmdArgv => addOverride(cmdArgv.override))
69
+ .command('remove <override>', 'Remove an override from the manifest', cmdYargs => cmdYargs.options({
70
70
  override: { type: 'string', describe: 'The override to remove' },
71
71
  }),
72
72
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
73
- (cmdArgv) => removeOverride(cmdArgv.override))
74
- .command('diff <override>', 'Compares an override to the base file of its current version', (cmdYargs) => cmdYargs.options({
73
+ cmdArgv => removeOverride(cmdArgv.override))
74
+ .command('diff <override>', 'Compares an override to the base file of its current version', cmdYargs => cmdYargs.options({
75
75
  override: { type: 'string', describe: 'The override to add' },
76
76
  }),
77
77
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
78
- (cmdArgv) => diffOverride(cmdArgv.override))
79
- .command('upgrade', 'Attempts to automatically merge new changes into out-of-date overrides', (cmdYargs) => cmdYargs.options({
78
+ cmdArgv => diffOverride(cmdArgv.override))
79
+ .command('upgrade', 'Attempts to automatically merge new changes into out-of-date overrides', cmdYargs => cmdYargs.options({
80
80
  manifest: {
81
81
  type: 'string',
82
82
  describe: 'Optional path to the override manifests to validate',
@@ -92,7 +92,7 @@ void doMain(async () => {
92
92
  },
93
93
  }),
94
94
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
95
- (cmdArgv) => upgrade({
95
+ cmdArgv => upgrade({
96
96
  manifestPath: cmdArgv.manifest,
97
97
  reactNativeVersion: cmdArgv.version,
98
98
  allowConflicts: cmdArgv.conflicts,
@@ -103,7 +103,7 @@ void doMain(async () => {
103
103
  description: 'Optional PAT to use for GitHub API calls',
104
104
  type: 'string',
105
105
  })
106
- .middleware((argv) => {
106
+ .middleware(argv => {
107
107
  if (argv.githubToken) {
108
108
  GitReactFileRepository_1.default.setGithubToken(argv.githubToken);
109
109
  }
@@ -138,7 +138,7 @@ async function validateManifests(opts) {
138
138
  if (manifestErrors.length !== 0) {
139
139
  errors.push(
140
140
  // Add the manifest path to the override name to disambiguate between different packages
141
- ...manifestErrors.map((e) => ({
141
+ ...manifestErrors.map(e => ({
142
142
  ...e,
143
143
  overrideName: path_1.default.join(path_1.default.dirname(manifest), e.overrideName),
144
144
  })));
@@ -200,7 +200,7 @@ async function diffOverride(overridePath) {
200
200
  const diff = await Api.diffOverride(overrideName, manifestPath);
201
201
  const colorizedDiff = diff
202
202
  .split('\n')
203
- .map((line) => line.startsWith('+')
203
+ .map(line => line.startsWith('+')
204
204
  ? chalk_1.default.green(line)
205
205
  : line.startsWith('-')
206
206
  ? chalk_1.default.red(line)
@@ -236,7 +236,7 @@ async function upgradeManifest(manifestPath, opts) {
236
236
  */
237
237
  function printUpgradeStats(results, allowConflicts) {
238
238
  const numTotal = results.length;
239
- const numConflicts = results.filter((res) => res.hasConflicts).length;
239
+ const numConflicts = results.filter(res => res.hasConflicts).length;
240
240
  const numAutoPatched = numTotal - numConflicts;
241
241
  if (numTotal === 0) {
242
242
  console.log(chalk_1.default.greenBright('No out-of-date overrides detected'));
@@ -271,11 +271,11 @@ async function printValidationErrors(errors) {
271
271
  * Print validation errors of a speccific type
272
272
  */
273
273
  function printErrorType(type, errors, message) {
274
- const filteredErrors = errors.filter((err) => err.type === type);
274
+ const filteredErrors = errors.filter(err => err.type === type);
275
275
  filteredErrors.sort((a, b) => a.overrideName.localeCompare(b.overrideName, 'en'));
276
276
  if (filteredErrors.length > 0) {
277
277
  console.error(chalk_1.default.red(message));
278
- filteredErrors.forEach((err) => {
278
+ filteredErrors.forEach(err => {
279
279
  console.error(` - ${err.overrideName}`);
280
280
  });
281
281
  console.error();
@@ -1 +1 @@
1
- {"version":3,"file":"Cli.js","sourceRoot":"","sources":["../src/Cli.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 Api from './Api';\n\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport path from 'path';\nimport yargs from 'yargs';\n\nimport {findAllManifests, findManifest} from './FileSearch';\nimport {overrideFromDetails, promptForOverrideDetails} from './OverridePrompt';\n\nimport CrossProcessLock from './CrossProcessLock';\nimport GitReactFileRepository from './GitReactFileRepository';\nimport {UpgradeResult} from './UpgradeStrategy';\nimport {ValidationError} from './ValidationStrategy';\nimport {getNpmPackage} from './PackageUtils';\n\nvoid doMain(async () => {\n const npmPackage = await getNpmPackage();\n\n return new Promise((resolve, _reject) => {\n yargs\n .command(\n 'validate',\n 'Verify that overrides are recorded and up-to-date',\n (cmdYargs) =>\n cmdYargs.options({\n manifest: {\n type: 'string',\n describe: 'Optional path to the override manifest to validate',\n },\n version: {\n type: 'string',\n describe: 'Optional React Native version to check against',\n },\n }),\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n (cmdArgv) =>\n validateManifests({\n manifestPath: cmdArgv.manifest,\n reactNativeVersion: cmdArgv.version,\n }),\n )\n .command(\n 'add <override>',\n 'Add an override to the manifest',\n (cmdYargs) =>\n cmdYargs.options({\n override: {type: 'string', describe: 'The override to add'},\n }),\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n (cmdArgv) => addOverride(cmdArgv.override!),\n )\n .command(\n 'remove <override>',\n 'Remove an override from the manifest',\n (cmdYargs) =>\n cmdYargs.options({\n override: {type: 'string', describe: 'The override to remove'},\n }),\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n (cmdArgv) => removeOverride(cmdArgv.override!),\n )\n .command(\n 'diff <override>',\n 'Compares an override to the base file of its current version',\n (cmdYargs) =>\n cmdYargs.options({\n override: {type: 'string', describe: 'The override to add'},\n }),\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n (cmdArgv) => diffOverride(cmdArgv.override!),\n )\n .command(\n 'upgrade',\n 'Attempts to automatically merge new changes into out-of-date overrides',\n (cmdYargs) =>\n cmdYargs.options({\n manifest: {\n type: 'string',\n describe: 'Optional path to the override manifests to validate',\n },\n conflicts: {\n type: 'boolean',\n default: true,\n describe: 'Whether to allow merge conflicts to be written',\n },\n version: {\n type: 'string',\n describe: 'Optional React Native version to check against',\n },\n }),\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n (cmdArgv) =>\n upgrade({\n manifestPath: cmdArgv.manifest,\n reactNativeVersion: cmdArgv.version,\n allowConflicts: cmdArgv.conflicts,\n }),\n )\n .epilogue(npmPackage.description)\n .option('color', {hidden: true})\n .option('githubToken', {\n description: 'Optional PAT to use for GitHub API calls',\n type: 'string',\n })\n .middleware((argv) => {\n if (argv.githubToken) {\n GitReactFileRepository.setGithubToken(argv.githubToken);\n }\n })\n .demandCommand()\n .recommendCommands()\n .strict()\n .showHelpOnFail(false)\n .wrap(yargs.terminalWidth())\n .version(false)\n .scriptName(npmPackage.name)\n .onFinishCommand(resolve).argv;\n });\n});\n\n/**\n * Check that the given manifest correctly describe overrides and that all\n * overrides are up to date\n */\nasync function validateManifests(opts: {\n manifestPath?: string;\n reactNativeVersion?: string;\n}) {\n const manifests = opts.manifestPath\n ? [opts.manifestPath]\n : await enumerateManifests();\n\n const spinner = ora();\n await spinnerGuard(spinner, async () => {\n // Perform validation sequentially because validation has internal\n // concurrency\n const errors: ValidationError[] = [];\n for (const manifest of manifests) {\n spinner.text = `Validating ${manifest}`;\n spinner.start();\n\n const manifestErrors = await Api.validateManifest(manifest, opts);\n if (manifestErrors.length !== 0) {\n errors.push(\n // Add the manifest path to the override name to disambiguate between different packages\n ...manifestErrors.map((e) => ({\n ...e,\n overrideName: path.join(path.dirname(manifest), e.overrideName),\n })),\n );\n }\n }\n\n if (errors.length === 0) {\n spinner.text = 'Validation succeeded';\n spinner.succeed();\n } else {\n spinner.text = 'Validation failed';\n spinner.fail();\n await printValidationErrors(errors);\n process.exitCode = 1;\n }\n });\n}\n\n/**\n * Add an override to the manifest\n */\nasync function addOverride(overridePath: string) {\n const manifestPath = await findManifest(path.dirname(overridePath));\n const manifestDir = path.dirname(manifestPath);\n const overrideName = path.relative(manifestDir, path.resolve(overridePath));\n\n if (await Api.hasOverride(overrideName, manifestPath)) {\n console.warn(\n chalk.yellow(\n 'Warning: override already exists in manifest and will be overwritten',\n ),\n );\n }\n\n const overrideDetails = await promptForOverrideDetails();\n\n const spinner = ora('Adding override').start();\n await spinnerGuard(spinner, async () => {\n const override = await overrideFromDetails(\n overridePath,\n overrideDetails,\n await Api.getOverrideFactory(manifestPath),\n );\n\n await Api.removeOverride(overrideName, manifestPath);\n await Api.addOverride(override, manifestPath);\n spinner.succeed();\n });\n}\n\n/**\n * Remove an override from the manifest\n */\nasync function removeOverride(overridePath: string) {\n const manifestPath = await findManifest(path.dirname(overridePath));\n const manifestDir = path.dirname(manifestPath);\n const overrideName = path.relative(manifestDir, path.resolve(overridePath));\n\n if (await Api.removeOverride(overrideName, manifestPath)) {\n console.log(chalk.greenBright('Override successfully removed'));\n } else {\n console.error(\n chalk.red('Could not remove override. Is it part of the manifest?'),\n );\n process.exit(1);\n }\n}\n\n/**\n * Diffs an override against its base file\n */\nasync function diffOverride(overridePath: string) {\n const manifestPath = await findManifest(path.dirname(overridePath));\n const manifestDir = path.dirname(manifestPath);\n const overrideName = path.relative(manifestDir, path.resolve(overridePath));\n const diff = await Api.diffOverride(overrideName, manifestPath);\n\n const colorizedDiff = diff\n .split('\\n')\n .map((line) =>\n line.startsWith('+')\n ? chalk.green(line)\n : line.startsWith('-')\n ? chalk.red(line)\n : line,\n )\n .join('\\n');\n\n console.log(colorizedDiff);\n}\n\n/**\n * Attempts to automatically merge changes from the current version into\n * out-of-date overrides.\n */\nasync function upgrade(opts: {\n manifestPath?: string;\n reactNativeVersion?: string;\n allowConflicts: boolean;\n}) {\n const manifests = opts.manifestPath\n ? [opts.manifestPath]\n : await enumerateManifests();\n\n for (const manifest of manifests) {\n await upgradeManifest(manifest, opts);\n }\n}\n\nasync function upgradeManifest(\n manifestPath: string,\n opts: {\n reactNativeVersion?: string;\n allowConflicts: boolean;\n },\n) {\n const spinner = ora(`Merging overrides in ${manifestPath}`).start();\n await spinnerGuard(spinner, async () => {\n const upgradeResults = await Api.upgradeOverrides(manifestPath, {\n ...opts,\n progressListener: (currentOverride, totalOverrides) =>\n (spinner.text = `Merging overrides in ${manifestPath} (${currentOverride}/${totalOverrides})`),\n });\n\n spinner.succeed();\n printUpgradeStats(upgradeResults, opts.allowConflicts);\n });\n}\n\n/**\n * Print statistics about an attempt to upgrade out-of-date-overrides.\n */\nfunction printUpgradeStats(\n results: Array<UpgradeResult>,\n allowConflicts: boolean,\n) {\n const numTotal = results.length;\n const numConflicts = results.filter((res) => res.hasConflicts).length;\n const numAutoPatched = numTotal - numConflicts;\n\n if (numTotal === 0) {\n console.log(chalk.greenBright('No out-of-date overrides detected'));\n } else {\n console.log(\n chalk.greenBright(\n `${numAutoPatched}/${numTotal} out-of-date overrides automatically merged`,\n ),\n );\n }\n if (allowConflicts && numConflicts > 0) {\n console.log(\n chalk.yellowBright(`${numConflicts} overrides require manual resolution`),\n );\n }\n}\n\n/**\n * Prints validation errors in a user-readable form to stderr\n */\nasync function printValidationErrors(errors: ValidationError[]) {\n if (errors.length === 0) {\n return;\n }\n\n const npmPackage = await getNpmPackage();\n\n // Add an initial line of separation\n console.error();\n\n printErrorType(\n 'missingFromManifest',\n errors,\n `Found override files that aren't listed in the manifest. Overrides can be added to the manifest by using 'npx ${npmPackage.name} add <override>':`,\n );\n\n printErrorType(\n 'overrideNotFound',\n errors,\n `Found overrides in the manifest that don't exist on disk. Remove existing overrides using 'npx ${npmPackage.name} remove <override>':`,\n );\n\n printErrorType(\n 'baseNotFound',\n errors,\n `Found overrides whose base files do not exist. Remove existing overrides using 'npx ${npmPackage.name} remove <override>':`,\n );\n\n printErrorType(\n 'outOfDate',\n errors,\n `Found overrides whose original files have changed. Upgrade overrides using 'npx ${npmPackage.name} upgrade':`,\n );\n\n printErrorType(\n 'overrideDifferentFromBase',\n errors,\n 'The following overrides should be an exact copy of their base files. Ensure overrides are up to date or revert changes:',\n );\n\n printErrorType(\n 'overrideSameAsBase',\n errors,\n 'The following overrides are identical to their base files. Please remove them or set their type to \"copy\":',\n );\n\n printErrorType(\n 'expectedFile',\n errors,\n 'The following overrides should operate on files, but list directories:',\n );\n\n printErrorType(\n 'expectedDirectory',\n errors,\n 'The following overrides should operate on directories, but listed files:',\n );\n}\n\n/**\n * Print validation errors of a speccific type\n */\nfunction printErrorType(\n type: ValidationError['type'],\n errors: ValidationError[],\n message: string,\n) {\n const filteredErrors = errors.filter((err) => err.type === type);\n filteredErrors.sort((a, b) =>\n a.overrideName.localeCompare(b.overrideName, 'en'),\n );\n\n if (filteredErrors.length > 0) {\n console.error(chalk.red(message));\n filteredErrors.forEach((err) => {\n console.error(` - ${err.overrideName}`);\n });\n console.error();\n }\n}\n\n/**\n * Wraps the function in a try/catch, failing the spinner if an exception is\n * thrown to allow unmangled output\n */\nasync function spinnerGuard<T>(\n spinner: ora.Ora,\n fn: () => Promise<T>,\n): Promise<T> {\n try {\n return await fn();\n } catch (ex) {\n if (spinner.isSpinning) {\n spinner.fail();\n }\n throw ex;\n }\n}\n\n/**\n * Wrap the main function around a barrier to ensure only one copy of the\n * override tool is running at once. This is needed to avoid multiple tools\n * accessing the same local Git repo at the same time.\n */\nasync function doMain(fn: () => Promise<void>): Promise<void> {\n const lock = new CrossProcessLock(`${(await getNpmPackage()).name}-cli-lock`);\n\n if (!(await lock.tryLock())) {\n const spinner = ora(\n 'Waiting for other instances of the override CLI to finish',\n ).start();\n await lock.lock();\n spinner.stop();\n }\n\n await fn();\n await lock.unlock();\n}\n\n/**\n * Check that a manifest exists, and return all that are found\n */\nasync function enumerateManifests(): Promise<string[]> {\n const manifests = await findAllManifests();\n if (manifests.length === 0) {\n throw new Error(\n 'No override manifests were found relative to the current directory',\n );\n }\n\n return manifests;\n}\n"]}
1
+ {"version":3,"file":"Cli.js","sourceRoot":"","sources":["../src/Cli.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 Api from './Api';\n\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport path from 'path';\nimport yargs from 'yargs';\n\nimport {findAllManifests, findManifest} from './FileSearch';\nimport {overrideFromDetails, promptForOverrideDetails} from './OverridePrompt';\n\nimport CrossProcessLock from './CrossProcessLock';\nimport GitReactFileRepository from './GitReactFileRepository';\nimport {UpgradeResult} from './UpgradeStrategy';\nimport {ValidationError} from './ValidationStrategy';\nimport {getNpmPackage} from './PackageUtils';\n\nvoid doMain(async () => {\n const npmPackage = await getNpmPackage();\n\n return new Promise((resolve, _reject) => {\n yargs\n .command(\n 'validate',\n 'Verify that overrides are recorded and up-to-date',\n cmdYargs =>\n cmdYargs.options({\n manifest: {\n type: 'string',\n describe: 'Optional path to the override manifest to validate',\n },\n version: {\n type: 'string',\n describe: 'Optional React Native version to check against',\n },\n }),\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n cmdArgv =>\n validateManifests({\n manifestPath: cmdArgv.manifest,\n reactNativeVersion: cmdArgv.version,\n }),\n )\n .command(\n 'add <override>',\n 'Add an override to the manifest',\n cmdYargs =>\n cmdYargs.options({\n override: {type: 'string', describe: 'The override to add'},\n }),\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n cmdArgv => addOverride(cmdArgv.override!),\n )\n .command(\n 'remove <override>',\n 'Remove an override from the manifest',\n cmdYargs =>\n cmdYargs.options({\n override: {type: 'string', describe: 'The override to remove'},\n }),\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n cmdArgv => removeOverride(cmdArgv.override!),\n )\n .command(\n 'diff <override>',\n 'Compares an override to the base file of its current version',\n cmdYargs =>\n cmdYargs.options({\n override: {type: 'string', describe: 'The override to add'},\n }),\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n cmdArgv => diffOverride(cmdArgv.override!),\n )\n .command(\n 'upgrade',\n 'Attempts to automatically merge new changes into out-of-date overrides',\n cmdYargs =>\n cmdYargs.options({\n manifest: {\n type: 'string',\n describe: 'Optional path to the override manifests to validate',\n },\n conflicts: {\n type: 'boolean',\n default: true,\n describe: 'Whether to allow merge conflicts to be written',\n },\n version: {\n type: 'string',\n describe: 'Optional React Native version to check against',\n },\n }),\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n cmdArgv =>\n upgrade({\n manifestPath: cmdArgv.manifest,\n reactNativeVersion: cmdArgv.version,\n allowConflicts: cmdArgv.conflicts,\n }),\n )\n .epilogue(npmPackage.description)\n .option('color', {hidden: true})\n .option('githubToken', {\n description: 'Optional PAT to use for GitHub API calls',\n type: 'string',\n })\n .middleware(argv => {\n if (argv.githubToken) {\n GitReactFileRepository.setGithubToken(argv.githubToken);\n }\n })\n .demandCommand()\n .recommendCommands()\n .strict()\n .showHelpOnFail(false)\n .wrap(yargs.terminalWidth())\n .version(false)\n .scriptName(npmPackage.name)\n .onFinishCommand(resolve).argv;\n });\n});\n\n/**\n * Check that the given manifest correctly describe overrides and that all\n * overrides are up to date\n */\nasync function validateManifests(opts: {\n manifestPath?: string;\n reactNativeVersion?: string;\n}) {\n const manifests = opts.manifestPath\n ? [opts.manifestPath]\n : await enumerateManifests();\n\n const spinner = ora();\n await spinnerGuard(spinner, async () => {\n // Perform validation sequentially because validation has internal\n // concurrency\n const errors: ValidationError[] = [];\n for (const manifest of manifests) {\n spinner.text = `Validating ${manifest}`;\n spinner.start();\n\n const manifestErrors = await Api.validateManifest(manifest, opts);\n if (manifestErrors.length !== 0) {\n errors.push(\n // Add the manifest path to the override name to disambiguate between different packages\n ...manifestErrors.map(e => ({\n ...e,\n overrideName: path.join(path.dirname(manifest), e.overrideName),\n })),\n );\n }\n }\n\n if (errors.length === 0) {\n spinner.text = 'Validation succeeded';\n spinner.succeed();\n } else {\n spinner.text = 'Validation failed';\n spinner.fail();\n await printValidationErrors(errors);\n process.exitCode = 1;\n }\n });\n}\n\n/**\n * Add an override to the manifest\n */\nasync function addOverride(overridePath: string) {\n const manifestPath = await findManifest(path.dirname(overridePath));\n const manifestDir = path.dirname(manifestPath);\n const overrideName = path.relative(manifestDir, path.resolve(overridePath));\n\n if (await Api.hasOverride(overrideName, manifestPath)) {\n console.warn(\n chalk.yellow(\n 'Warning: override already exists in manifest and will be overwritten',\n ),\n );\n }\n\n const overrideDetails = await promptForOverrideDetails();\n\n const spinner = ora('Adding override').start();\n await spinnerGuard(spinner, async () => {\n const override = await overrideFromDetails(\n overridePath,\n overrideDetails,\n await Api.getOverrideFactory(manifestPath),\n );\n\n await Api.removeOverride(overrideName, manifestPath);\n await Api.addOverride(override, manifestPath);\n spinner.succeed();\n });\n}\n\n/**\n * Remove an override from the manifest\n */\nasync function removeOverride(overridePath: string) {\n const manifestPath = await findManifest(path.dirname(overridePath));\n const manifestDir = path.dirname(manifestPath);\n const overrideName = path.relative(manifestDir, path.resolve(overridePath));\n\n if (await Api.removeOverride(overrideName, manifestPath)) {\n console.log(chalk.greenBright('Override successfully removed'));\n } else {\n console.error(\n chalk.red('Could not remove override. Is it part of the manifest?'),\n );\n process.exit(1);\n }\n}\n\n/**\n * Diffs an override against its base file\n */\nasync function diffOverride(overridePath: string) {\n const manifestPath = await findManifest(path.dirname(overridePath));\n const manifestDir = path.dirname(manifestPath);\n const overrideName = path.relative(manifestDir, path.resolve(overridePath));\n const diff = await Api.diffOverride(overrideName, manifestPath);\n\n const colorizedDiff = diff\n .split('\\n')\n .map(line =>\n line.startsWith('+')\n ? chalk.green(line)\n : line.startsWith('-')\n ? chalk.red(line)\n : line,\n )\n .join('\\n');\n\n console.log(colorizedDiff);\n}\n\n/**\n * Attempts to automatically merge changes from the current version into\n * out-of-date overrides.\n */\nasync function upgrade(opts: {\n manifestPath?: string;\n reactNativeVersion?: string;\n allowConflicts: boolean;\n}) {\n const manifests = opts.manifestPath\n ? [opts.manifestPath]\n : await enumerateManifests();\n\n for (const manifest of manifests) {\n await upgradeManifest(manifest, opts);\n }\n}\n\nasync function upgradeManifest(\n manifestPath: string,\n opts: {\n reactNativeVersion?: string;\n allowConflicts: boolean;\n },\n) {\n const spinner = ora(`Merging overrides in ${manifestPath}`).start();\n await spinnerGuard(spinner, async () => {\n const upgradeResults = await Api.upgradeOverrides(manifestPath, {\n ...opts,\n progressListener: (currentOverride, totalOverrides) =>\n (spinner.text = `Merging overrides in ${manifestPath} (${currentOverride}/${totalOverrides})`),\n });\n\n spinner.succeed();\n printUpgradeStats(upgradeResults, opts.allowConflicts);\n });\n}\n\n/**\n * Print statistics about an attempt to upgrade out-of-date-overrides.\n */\nfunction printUpgradeStats(\n results: Array<UpgradeResult>,\n allowConflicts: boolean,\n) {\n const numTotal = results.length;\n const numConflicts = results.filter(res => res.hasConflicts).length;\n const numAutoPatched = numTotal - numConflicts;\n\n if (numTotal === 0) {\n console.log(chalk.greenBright('No out-of-date overrides detected'));\n } else {\n console.log(\n chalk.greenBright(\n `${numAutoPatched}/${numTotal} out-of-date overrides automatically merged`,\n ),\n );\n }\n if (allowConflicts && numConflicts > 0) {\n console.log(\n chalk.yellowBright(`${numConflicts} overrides require manual resolution`),\n );\n }\n}\n\n/**\n * Prints validation errors in a user-readable form to stderr\n */\nasync function printValidationErrors(errors: ValidationError[]) {\n if (errors.length === 0) {\n return;\n }\n\n const npmPackage = await getNpmPackage();\n\n // Add an initial line of separation\n console.error();\n\n printErrorType(\n 'missingFromManifest',\n errors,\n `Found override files that aren't listed in the manifest. Overrides can be added to the manifest by using 'npx ${npmPackage.name} add <override>':`,\n );\n\n printErrorType(\n 'overrideNotFound',\n errors,\n `Found overrides in the manifest that don't exist on disk. Remove existing overrides using 'npx ${npmPackage.name} remove <override>':`,\n );\n\n printErrorType(\n 'baseNotFound',\n errors,\n `Found overrides whose base files do not exist. Remove existing overrides using 'npx ${npmPackage.name} remove <override>':`,\n );\n\n printErrorType(\n 'outOfDate',\n errors,\n `Found overrides whose original files have changed. Upgrade overrides using 'npx ${npmPackage.name} upgrade':`,\n );\n\n printErrorType(\n 'overrideDifferentFromBase',\n errors,\n 'The following overrides should be an exact copy of their base files. Ensure overrides are up to date or revert changes:',\n );\n\n printErrorType(\n 'overrideSameAsBase',\n errors,\n 'The following overrides are identical to their base files. Please remove them or set their type to \"copy\":',\n );\n\n printErrorType(\n 'expectedFile',\n errors,\n 'The following overrides should operate on files, but list directories:',\n );\n\n printErrorType(\n 'expectedDirectory',\n errors,\n 'The following overrides should operate on directories, but listed files:',\n );\n}\n\n/**\n * Print validation errors of a speccific type\n */\nfunction printErrorType(\n type: ValidationError['type'],\n errors: ValidationError[],\n message: string,\n) {\n const filteredErrors = errors.filter(err => err.type === type);\n filteredErrors.sort((a, b) =>\n a.overrideName.localeCompare(b.overrideName, 'en'),\n );\n\n if (filteredErrors.length > 0) {\n console.error(chalk.red(message));\n filteredErrors.forEach(err => {\n console.error(` - ${err.overrideName}`);\n });\n console.error();\n }\n}\n\n/**\n * Wraps the function in a try/catch, failing the spinner if an exception is\n * thrown to allow unmangled output\n */\nasync function spinnerGuard<T>(\n spinner: ora.Ora,\n fn: () => Promise<T>,\n): Promise<T> {\n try {\n return await fn();\n } catch (ex) {\n if (spinner.isSpinning) {\n spinner.fail();\n }\n throw ex;\n }\n}\n\n/**\n * Wrap the main function around a barrier to ensure only one copy of the\n * override tool is running at once. This is needed to avoid multiple tools\n * accessing the same local Git repo at the same time.\n */\nasync function doMain(fn: () => Promise<void>): Promise<void> {\n const lock = new CrossProcessLock(`${(await getNpmPackage()).name}-cli-lock`);\n\n if (!(await lock.tryLock())) {\n const spinner = ora(\n 'Waiting for other instances of the override CLI to finish',\n ).start();\n await lock.lock();\n spinner.stop();\n }\n\n await fn();\n await lock.unlock();\n}\n\n/**\n * Check that a manifest exists, and return all that are found\n */\nasync function enumerateManifests(): Promise<string[]> {\n const manifests = await findAllManifests();\n if (manifests.length === 0) {\n throw new Error(\n 'No override manifests were found relative to the current directory',\n );\n }\n\n return manifests;\n}\n"]}
@@ -39,7 +39,7 @@ class CrossProcessLock {
39
39
  }
40
40
  this.server = net_1.default.createServer();
41
41
  this.connections = new Set();
42
- this.server.on('connection', (conn) => {
42
+ this.server.on('connection', conn => {
43
43
  this.connections.add(conn);
44
44
  conn.on('close', () => this.connections.delete(conn));
45
45
  });
@@ -104,7 +104,7 @@ class CrossProcessLock {
104
104
  // Treat some errors as potential pipe death, since it could have died
105
105
  // between the time to create a server and attempting to connect to the
106
106
  // existing.
107
- socket.once('error', (err) => {
107
+ socket.once('error', err => {
108
108
  // @ts-ignore Typings for EventEmitter only know about generic JS errors
109
109
  if (err.code === 'ECONNREFUSED' || err.code === 'ECONNRESET') {
110
110
  resolve();
@@ -140,7 +140,7 @@ class CrossProcessLock {
140
140
  // ones. Manually destroy all existing connections to let them retry the
141
141
  // lock.
142
142
  this.server.close();
143
- this.connections.forEach((conn) => conn.destroy());
143
+ this.connections.forEach(conn => conn.destroy());
144
144
  });
145
145
  }
146
146
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CrossProcessLock.js","sourceRoot":"","sources":["../src/CrossProcessLock.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 net from 'net';\nimport path from 'path';\nimport {platform, tmpdir} from 'os';\n\n/**\n * CrossProcessLock implements a non-polling cross-process asynchronous barrier.\n *\n * - The lock is acquired by creating a named pipe\n *\n * - If named pipe creation fails due to an existing pipe, the process\n * subscribes to the pipe, waiting asynchronously until it dies.\n *\n * - Once the pipe dies, any subscribers will race to acquire the lock (create\n * the pipe server)\n */\nexport default class CrossProcessLock {\n private readonly ipcPath: string;\n private readonly server: net.Server;\n private readonly connections: Set<net.Socket>;\n\n /**\n * Create the lock instance. Does not yet allocate any resources.\n *\n * @param lockName unique name of the shared resource. Must be under 256\n * chars and not use special characters.\n */\n constructor(lockName: string) {\n if (platform() === 'win32') {\n this.ipcPath = `\\\\\\\\.\\\\pipe\\\\${lockName}`;\n } else {\n this.ipcPath = path.join(tmpdir(), `${lockName}`);\n }\n\n this.server = net.createServer();\n\n this.connections = new Set();\n this.server.on('connection', (conn) => {\n this.connections.add(conn);\n conn.on('close', () => this.connections.delete(conn));\n });\n }\n\n /**\n * Try to acquire the shared resource. Returns false if it is already in use\n * without acquiring the resource. Subsequent tryLock calls after obtaining a\n * lock will return false.\n */\n tryLock(): Promise<boolean> {\n if (this.server.listening) {\n return Promise.resolve(false);\n }\n\n return new Promise((resolve, reject) => {\n const onListening = () => {\n this.server.off('error', onError);\n resolve(true);\n };\n\n const onError = (err: Error) => {\n this.server.off('listening', onListening);\n // @ts-ignore Typings for EventEmitter only know about generic JS errors\n if (err.code === 'EADDRINUSE') {\n resolve(false);\n } else {\n reject(err);\n }\n };\n\n this.server.once('listening', onListening);\n this.server.once('error', onError);\n\n try {\n this.server.listen({\n path: this.ipcPath,\n exclusive: true,\n readableAll: true,\n });\n } catch (ex) {\n // Old versions of Node will throw an extra TypeError when address is\n // in use that we need to ignore https://github.com/nodejs/node/issues/23917\n if ((ex as Error).name !== 'TypeError') {\n throw ex;\n }\n }\n });\n }\n\n /**\n * Acquire the shared resource, waiting for it to be available.\n */\n async lock(): Promise<void> {\n if (this.server.listening) {\n return;\n }\n\n if (!(await this.tryLock())) {\n await this.waitUntilPipeDeath();\n return this.lock();\n }\n }\n\n private waitUntilPipeDeath(): Promise<void> {\n return new Promise((resolve, reject) => {\n const socket = new net.Socket();\n\n // Treat some errors as potential pipe death, since it could have died\n // between the time to create a server and attempting to connect to the\n // existing.\n socket.once('error', (err) => {\n // @ts-ignore Typings for EventEmitter only know about generic JS errors\n if (err.code === 'ECONNREFUSED' || err.code === 'ECONNRESET') {\n resolve();\n } else {\n reject(err);\n }\n });\n\n socket.once('close', () => resolve());\n\n socket.setTimeout(0);\n socket.connect({path: this.ipcPath});\n });\n }\n\n /**\n * Release the shared resource\n */\n unlock(): Promise<void> {\n if (!this.server.listening) {\n return Promise.resolve();\n }\n\n return new Promise((resolve, reject) => {\n const onClose = () => {\n this.server.off('error', onError);\n resolve();\n };\n const onError = (err: Error) => {\n this.server.off('close', onClose);\n reject(err);\n };\n\n this.server.once('close', onClose);\n this.server.once('error', onError);\n\n // Closing will only prevent new connections, instead of killing old\n // ones. Manually destroy all existing connections to let them retry the\n // lock.\n this.server.close();\n this.connections.forEach((conn) => conn.destroy());\n });\n }\n}\n"]}
1
+ {"version":3,"file":"CrossProcessLock.js","sourceRoot":"","sources":["../src/CrossProcessLock.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 net from 'net';\nimport path from 'path';\nimport {platform, tmpdir} from 'os';\n\n/**\n * CrossProcessLock implements a non-polling cross-process asynchronous barrier.\n *\n * - The lock is acquired by creating a named pipe\n *\n * - If named pipe creation fails due to an existing pipe, the process\n * subscribes to the pipe, waiting asynchronously until it dies.\n *\n * - Once the pipe dies, any subscribers will race to acquire the lock (create\n * the pipe server)\n */\nexport default class CrossProcessLock {\n private readonly ipcPath: string;\n private readonly server: net.Server;\n private readonly connections: Set<net.Socket>;\n\n /**\n * Create the lock instance. Does not yet allocate any resources.\n *\n * @param lockName unique name of the shared resource. Must be under 256\n * chars and not use special characters.\n */\n constructor(lockName: string) {\n if (platform() === 'win32') {\n this.ipcPath = `\\\\\\\\.\\\\pipe\\\\${lockName}`;\n } else {\n this.ipcPath = path.join(tmpdir(), `${lockName}`);\n }\n\n this.server = net.createServer();\n\n this.connections = new Set();\n this.server.on('connection', conn => {\n this.connections.add(conn);\n conn.on('close', () => this.connections.delete(conn));\n });\n }\n\n /**\n * Try to acquire the shared resource. Returns false if it is already in use\n * without acquiring the resource. Subsequent tryLock calls after obtaining a\n * lock will return false.\n */\n tryLock(): Promise<boolean> {\n if (this.server.listening) {\n return Promise.resolve(false);\n }\n\n return new Promise((resolve, reject) => {\n const onListening = () => {\n this.server.off('error', onError);\n resolve(true);\n };\n\n const onError = (err: Error) => {\n this.server.off('listening', onListening);\n // @ts-ignore Typings for EventEmitter only know about generic JS errors\n if (err.code === 'EADDRINUSE') {\n resolve(false);\n } else {\n reject(err);\n }\n };\n\n this.server.once('listening', onListening);\n this.server.once('error', onError);\n\n try {\n this.server.listen({\n path: this.ipcPath,\n exclusive: true,\n readableAll: true,\n });\n } catch (ex) {\n // Old versions of Node will throw an extra TypeError when address is\n // in use that we need to ignore https://github.com/nodejs/node/issues/23917\n if ((ex as Error).name !== 'TypeError') {\n throw ex;\n }\n }\n });\n }\n\n /**\n * Acquire the shared resource, waiting for it to be available.\n */\n async lock(): Promise<void> {\n if (this.server.listening) {\n return;\n }\n\n if (!(await this.tryLock())) {\n await this.waitUntilPipeDeath();\n return this.lock();\n }\n }\n\n private waitUntilPipeDeath(): Promise<void> {\n return new Promise((resolve, reject) => {\n const socket = new net.Socket();\n\n // Treat some errors as potential pipe death, since it could have died\n // between the time to create a server and attempting to connect to the\n // existing.\n socket.once('error', err => {\n // @ts-ignore Typings for EventEmitter only know about generic JS errors\n if (err.code === 'ECONNREFUSED' || err.code === 'ECONNRESET') {\n resolve();\n } else {\n reject(err);\n }\n });\n\n socket.once('close', () => resolve());\n\n socket.setTimeout(0);\n socket.connect({path: this.ipcPath});\n });\n }\n\n /**\n * Release the shared resource\n */\n unlock(): Promise<void> {\n if (!this.server.listening) {\n return Promise.resolve();\n }\n\n return new Promise((resolve, reject) => {\n const onClose = () => {\n this.server.off('error', onError);\n resolve();\n };\n const onError = (err: Error) => {\n this.server.off('close', onClose);\n reject(err);\n };\n\n this.server.once('close', onClose);\n this.server.once('error', onError);\n\n // Closing will only prevent new connections, instead of killing old\n // ones. Manually destroy all existing connections to let them retry the\n // lock.\n this.server.close();\n this.connections.forEach(conn => conn.destroy());\n });\n }\n}\n"]}
@@ -12,9 +12,9 @@ exports.bindVersion = void 0;
12
12
  */
13
13
  function bindVersion(repository, version) {
14
14
  return {
15
- listFiles: (globs) => repository.listFiles(globs, version),
16
- readFile: (filename) => repository.readFile(filename, version),
17
- stat: (filename) => repository.stat(filename, version),
15
+ listFiles: globs => repository.listFiles(globs, version),
16
+ readFile: filename => repository.readFile(filename, version),
17
+ stat: filename => repository.stat(filename, version),
18
18
  getVersion: () => version,
19
19
  };
20
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FileRepository.js","sourceRoot":"","sources":["../src/FileRepository.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAkEH;;GAEG;AACH,SAAgB,WAAW,CACzB,UAAwC,EACxC,OAAe;IAEf,OAAO;QACL,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC;QAC1D,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC9D,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC;QACtD,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO;KAC1B,CAAC;AACJ,CAAC;AAVD,kCAUC","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * @format\n */\n\n/**\n * A filesystem abstraction that allows listing and reading files\n */\nexport default interface FileRepository {\n /**\n * Return the repository-relative path to files\n * @param globs optional list of globs which files must match\n */\n listFiles(globs?: string[]): Promise<Array<string>>;\n\n /**\n * Read the contents of a patch file.\n * @param filename is expected to be relative to the repository root.\n */\n readFile(filename: string): Promise<Buffer | null>;\n\n /**\n * Check whether a file exists, and if so whether its a file or directory\n */\n stat(filename: string): Promise<'file' | 'directory' | 'none'>;\n}\n\n/**\n * Provides access to files\n */\nexport interface WritableFileRepository extends FileRepository {\n /**\n * Sets the contents of a file. Rejects the promise if the file doesn't\n * exist.\n */\n writeFile(filename: string, content: Buffer | string): Promise<void>;\n\n /**\n * Deletes the file/directory, rejecting the promise if it doesn't exist.\n */\n deleteFile(filename: string): Promise<void>;\n}\n\n/**\n * Provides access to React Native source files\n */\nexport interface ReactFileRepository extends FileRepository {\n /**\n * Get the React Native version the repo is exploring\n */\n getVersion(): string;\n}\n\n/**\n * Provides access to React Native source files of arbitrary version\n * {@see ReactFileRepository} for more details\n */\nexport interface VersionedReactFileRepository {\n listFiles(\n globs: string[] | undefined,\n version: string,\n ): Promise<Array<string>>;\n readFile(filename: string, version: string): Promise<Buffer | null>;\n stat(\n filename: string,\n version: string,\n ): Promise<'file' | 'directory' | 'none'>;\n}\n\n/**\n * Convert from a VersionedReactFileRepository to ReactFileRepository\n */\nexport function bindVersion(\n repository: VersionedReactFileRepository,\n version: string,\n): ReactFileRepository {\n return {\n listFiles: (globs) => repository.listFiles(globs, version),\n readFile: (filename) => repository.readFile(filename, version),\n stat: (filename) => repository.stat(filename, version),\n getVersion: () => version,\n };\n}\n"]}
1
+ {"version":3,"file":"FileRepository.js","sourceRoot":"","sources":["../src/FileRepository.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAkEH;;GAEG;AACH,SAAgB,WAAW,CACzB,UAAwC,EACxC,OAAe;IAEf,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC;QACxD,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC5D,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC;QACpD,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO;KAC1B,CAAC;AACJ,CAAC;AAVD,kCAUC","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * @format\n */\n\n/**\n * A filesystem abstraction that allows listing and reading files\n */\nexport default interface FileRepository {\n /**\n * Return the repository-relative path to files\n * @param globs optional list of globs which files must match\n */\n listFiles(globs?: string[]): Promise<Array<string>>;\n\n /**\n * Read the contents of a patch file.\n * @param filename is expected to be relative to the repository root.\n */\n readFile(filename: string): Promise<Buffer | null>;\n\n /**\n * Check whether a file exists, and if so whether its a file or directory\n */\n stat(filename: string): Promise<'file' | 'directory' | 'none'>;\n}\n\n/**\n * Provides access to files\n */\nexport interface WritableFileRepository extends FileRepository {\n /**\n * Sets the contents of a file. Rejects the promise if the file doesn't\n * exist.\n */\n writeFile(filename: string, content: Buffer | string): Promise<void>;\n\n /**\n * Deletes the file/directory, rejecting the promise if it doesn't exist.\n */\n deleteFile(filename: string): Promise<void>;\n}\n\n/**\n * Provides access to React Native source files\n */\nexport interface ReactFileRepository extends FileRepository {\n /**\n * Get the React Native version the repo is exploring\n */\n getVersion(): string;\n}\n\n/**\n * Provides access to React Native source files of arbitrary version\n * {@see ReactFileRepository} for more details\n */\nexport interface VersionedReactFileRepository {\n listFiles(\n globs: string[] | undefined,\n version: string,\n ): Promise<Array<string>>;\n readFile(filename: string, version: string): Promise<Buffer | null>;\n stat(\n filename: string,\n version: string,\n ): Promise<'file' | 'directory' | 'none'>;\n}\n\n/**\n * Convert from a VersionedReactFileRepository to ReactFileRepository\n */\nexport function bindVersion(\n repository: VersionedReactFileRepository,\n version: string,\n): ReactFileRepository {\n return {\n listFiles: globs => repository.listFiles(globs, version),\n readFile: filename => repository.readFile(filename, version),\n stat: filename => repository.stat(filename, version),\n getVersion: () => version,\n };\n}\n"]}
@@ -43,8 +43,8 @@ async function findAllManifests() {
43
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 (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'));
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
  /**
@@ -1 +1 @@
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"]}
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,GAAG,CAAC,EAAE,CACtD,YAAE,CAAC,MAAM,CAAC,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CACjD,CAAC;IAEF,OAAO,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC;AACzE,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"]}
@@ -5,6 +5,29 @@
5
5
  *
6
6
  * @format
7
7
  */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || function (mod) {
25
+ if (mod && mod.__esModule) return mod;
26
+ var result = {};
27
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
28
+ __setModuleDefault(result, mod);
29
+ return result;
30
+ };
8
31
  var __importDefault = (this && this.__importDefault) || function (mod) {
9
32
  return (mod && mod.__esModule) ? mod : { "default": mod };
10
33
  };
@@ -12,7 +35,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
35
  const fs_1 = __importDefault(require("@react-native-windows/fs"));
13
36
  const os_1 = __importDefault(require("os"));
14
37
  const path_1 = __importDefault(require("path"));
15
- const promise_1 = __importDefault(require("simple-git/promise"));
38
+ const simple_git_1 = __importStar(require("simple-git"));
16
39
  const BatchingQueue_1 = __importDefault(require("./BatchingQueue"));
17
40
  const FileSystemRepository_1 = __importDefault(require("./FileSystemRepository"));
18
41
  const PackageUtils_1 = require("./PackageUtils");
@@ -35,8 +58,7 @@ class GitReactFileRepository {
35
58
  static async createAndInit(gitDirectory) {
36
59
  const dir = gitDirectory || (await this.defaultGitDirectory());
37
60
  await fs_1.default.mkdir(dir, { recursive: true });
38
- const gitClient = (0, promise_1.default)(dir);
39
- gitClient.silent(true);
61
+ const gitClient = (0, simple_git_1.default)(dir);
40
62
  if (!(await gitClient.checkIsRepo())) {
41
63
  await gitClient.init();
42
64
  await gitClient.addConfig('core.autocrlf', 'input');
@@ -81,7 +103,7 @@ class GitReactFileRepository {
81
103
  return patch;
82
104
  }
83
105
  finally {
84
- await this.gitClient.reset('hard');
106
+ await this.gitClient.reset(simple_git_1.ResetMode.HARD);
85
107
  }
86
108
  });
87
109
  }
@@ -124,7 +146,7 @@ class GitReactFileRepository {
124
146
  return { patchedFile, hasConflicts };
125
147
  }
126
148
  finally {
127
- await this.gitClient.reset('hard');
149
+ await this.gitClient.reset(simple_git_1.ResetMode.HARD);
128
150
  }
129
151
  });
130
152
  }
@@ -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 '@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([RN_GITHUB_URL, gitRef, '--depth=1']);\n await this.gitClient.checkout(['-b', reactNativeVersion, 'FETCH_HEAD']);\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"]}
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, {SimpleGit, ResetMode} from 'simple-git';\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;\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) {\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\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(ResetMode.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(ResetMode.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([RN_GITHUB_URL, gitRef, '--depth=1']);\n await this.gitClient.checkout(['-b', reactNativeVersion, 'FETCH_HEAD']);\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"]}
@@ -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) => (0, 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,16 +53,16 @@ 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
67
  await (0, async_1.eachLimit)(validationTasks, 30, async (task) => {
68
68
  errors.push(...(await task.validate(overrideRepo, reactRepo)));
@@ -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() === (0, 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() === (0, 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"]}
@@ -90,14 +90,14 @@ async function promptForOverrideDetails() {
90
90
  ],
91
91
  },
92
92
  {
93
- when: (res) => res.type === 'derived',
93
+ when: res => res.type === 'derived',
94
94
  type: 'confirm',
95
95
  name: 'codeCopied',
96
96
  default: true,
97
97
  message: 'Does the derived file copy code from upstream?',
98
98
  },
99
99
  {
100
- when: (res) => (res.type === 'derived' && res.codeCopied) ||
100
+ when: res => (res.type === 'derived' && res.codeCopied) ||
101
101
  ['copy', 'directoryCopy', 'patch'].includes(res.type),
102
102
  type: 'input',
103
103
  validate: validateIssueNumber,
@@ -107,13 +107,13 @@ async function promptForOverrideDetails() {
107
107
  message: 'Issue number tracking removal:',
108
108
  },
109
109
  {
110
- when: (res) => ['copy', 'patch', 'derived'].includes(res.type),
110
+ when: res => ['copy', 'patch', 'derived'].includes(res.type),
111
111
  type: 'input',
112
112
  name: 'baseFile',
113
113
  message: 'What file is this override based off of?',
114
114
  },
115
115
  {
116
- when: (res) => res.type === 'directoryCopy',
116
+ when: res => res.type === 'directoryCopy',
117
117
  type: 'input',
118
118
  name: 'baseDirectory',
119
119
  message: 'What directory are you copying from?',
@@ -1 +1 @@
1
- {"version":3,"file":"OverridePrompt.js","sourceRoot":"","sources":["../src/OverridePrompt.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 FileSearch from './FileSearch';\nimport inquirer from 'inquirer';\nimport path from 'path';\n\nimport Override from './Override';\nimport OverrideFactory from './OverrideFactory';\nimport {normalizePath} from './PathUtils';\n\nexport type OverridePromptAnswers =\n | {type: 'derived'; baseFile: string; codeCopied: boolean; issue?: number}\n | {type: 'patch'; baseFile: string; issue: number}\n | {type: 'platform'}\n | {type: 'copy'; baseFile: string; issue: number}\n | {type: 'directoryCopy'; baseDirectory: string; issue: number};\n\nexport async function overrideFromDetails(\n overridePath: string,\n answers: OverridePromptAnswers,\n factory: OverrideFactory,\n): Promise<Override> {\n const manifestPath = await FileSearch.findManifest(overridePath);\n const manifestDir = path.dirname(manifestPath);\n const overrideName = normalizePath(path.relative(manifestDir, overridePath));\n\n switch (answers.type) {\n case 'derived':\n return factory.createDerivedOverride(\n overrideName,\n answers.baseFile,\n answers.issue,\n );\n case 'patch':\n return factory.createPatchOverride(\n overrideName,\n answers.baseFile,\n answers.issue,\n );\n case 'platform':\n return factory.createPlatformOverride(overridePath);\n case 'copy':\n return factory.createCopyOverride(\n overrideName,\n answers.baseFile,\n answers.issue,\n );\n case 'directoryCopy':\n return factory.createDirectoryCopyOverride(\n overrideName,\n answers.baseDirectory,\n answers.issue,\n );\n }\n}\n\nexport async function promptForOverrideDetails(): Promise<OverridePromptAnswers> {\n return inquirer.prompt([\n {\n type: 'list',\n name: 'type',\n message: 'Override type:',\n choices: [\n {\n name: 'Derived from upstream (E.g. a Windows implementation of an existing component)',\n value: 'derived',\n short: 'Derived',\n },\n {\n name: 'Patches to upstream (E.g. commenting out code)',\n value: 'patch',\n short: 'Patch',\n },\n {\n name: 'Independent platform logic (E.g. Windows-specific modules)',\n value: 'platform',\n short: 'Platform',\n },\n {\n name: 'Copy of an upstream file',\n value: 'copy',\n short: 'Copy',\n },\n {\n name: 'Copy of an upstream directory',\n value: 'directoryCopy',\n short: 'Directory Copy',\n },\n ],\n },\n {\n when: (res) => res.type === 'derived',\n type: 'confirm',\n name: 'codeCopied',\n default: true,\n message: 'Does the derived file copy code from upstream?',\n },\n {\n when: (res) =>\n (res.type === 'derived' && res.codeCopied) ||\n ['copy', 'directoryCopy', 'patch'].includes(res.type),\n type: 'input',\n validate: validateIssueNumber,\n filter: filterIssueNumber,\n askAnswered: true,\n name: 'issue',\n message: 'Issue number tracking removal:',\n },\n {\n when: (res) => ['copy', 'patch', 'derived'].includes(res.type),\n type: 'input',\n name: 'baseFile',\n message: 'What file is this override based off of?',\n },\n {\n when: (res) => res.type === 'directoryCopy',\n type: 'input',\n name: 'baseDirectory',\n message: 'What directory are you copying from?',\n },\n ]);\n}\n\nfunction filterIssueNumber(answer: string): number | string {\n const parsedInt = Number.parseInt(answer, 10);\n return Number.isInteger(parsedInt) ? parsedInt : '';\n}\n\nfunction validateIssueNumber(answer: string): boolean | string {\n return (\n Number.isInteger(Number.parseInt(answer, 10)) || 'Issue must be a number'\n );\n}\n"]}
1
+ {"version":3,"file":"OverridePrompt.js","sourceRoot":"","sources":["../src/OverridePrompt.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 FileSearch from './FileSearch';\nimport inquirer from 'inquirer';\nimport path from 'path';\n\nimport Override from './Override';\nimport OverrideFactory from './OverrideFactory';\nimport {normalizePath} from './PathUtils';\n\nexport type OverridePromptAnswers =\n | {type: 'derived'; baseFile: string; codeCopied: boolean; issue?: number}\n | {type: 'patch'; baseFile: string; issue: number}\n | {type: 'platform'}\n | {type: 'copy'; baseFile: string; issue: number}\n | {type: 'directoryCopy'; baseDirectory: string; issue: number};\n\nexport async function overrideFromDetails(\n overridePath: string,\n answers: OverridePromptAnswers,\n factory: OverrideFactory,\n): Promise<Override> {\n const manifestPath = await FileSearch.findManifest(overridePath);\n const manifestDir = path.dirname(manifestPath);\n const overrideName = normalizePath(path.relative(manifestDir, overridePath));\n\n switch (answers.type) {\n case 'derived':\n return factory.createDerivedOverride(\n overrideName,\n answers.baseFile,\n answers.issue,\n );\n case 'patch':\n return factory.createPatchOverride(\n overrideName,\n answers.baseFile,\n answers.issue,\n );\n case 'platform':\n return factory.createPlatformOverride(overridePath);\n case 'copy':\n return factory.createCopyOverride(\n overrideName,\n answers.baseFile,\n answers.issue,\n );\n case 'directoryCopy':\n return factory.createDirectoryCopyOverride(\n overrideName,\n answers.baseDirectory,\n answers.issue,\n );\n }\n}\n\nexport async function promptForOverrideDetails(): Promise<OverridePromptAnswers> {\n return inquirer.prompt([\n {\n type: 'list',\n name: 'type',\n message: 'Override type:',\n choices: [\n {\n name: 'Derived from upstream (E.g. a Windows implementation of an existing component)',\n value: 'derived',\n short: 'Derived',\n },\n {\n name: 'Patches to upstream (E.g. commenting out code)',\n value: 'patch',\n short: 'Patch',\n },\n {\n name: 'Independent platform logic (E.g. Windows-specific modules)',\n value: 'platform',\n short: 'Platform',\n },\n {\n name: 'Copy of an upstream file',\n value: 'copy',\n short: 'Copy',\n },\n {\n name: 'Copy of an upstream directory',\n value: 'directoryCopy',\n short: 'Directory Copy',\n },\n ],\n },\n {\n when: res => res.type === 'derived',\n type: 'confirm',\n name: 'codeCopied',\n default: true,\n message: 'Does the derived file copy code from upstream?',\n },\n {\n when: res =>\n (res.type === 'derived' && res.codeCopied) ||\n ['copy', 'directoryCopy', 'patch'].includes(res.type),\n type: 'input',\n validate: validateIssueNumber,\n filter: filterIssueNumber,\n askAnswered: true,\n name: 'issue',\n message: 'Issue number tracking removal:',\n },\n {\n when: res => ['copy', 'patch', 'derived'].includes(res.type),\n type: 'input',\n name: 'baseFile',\n message: 'What file is this override based off of?',\n },\n {\n when: res => res.type === 'directoryCopy',\n type: 'input',\n name: 'baseDirectory',\n message: 'What directory are you copying from?',\n },\n ]);\n}\n\nfunction filterIssueNumber(answer: string): number | string {\n const parsedInt = Number.parseInt(answer, 10);\n return Number.isInteger(parsedInt) ? parsedInt : '';\n}\n\nfunction validateIssueNumber(answer: string): boolean | string {\n return (\n Number.isInteger(Number.parseInt(answer, 10)) || 'Issue must be a number'\n );\n}\n"]}
@@ -75,11 +75,11 @@ exports.UpgradeStrategies = {
75
75
  */
76
76
  copyDirectory: (overrideDirectory, baseDirectory) => ({
77
77
  upgrade: async (gitReactRepo, overrideRepo, newVersion) => {
78
- const baseFiles = (await gitReactRepo.listFiles([`${baseDirectory}/**`], newVersion)).map((f) => path_1.default.relative(baseDirectory, f));
79
- const overrideFiles = (await overrideRepo.listFiles([`${overrideDirectory}/**`])).map((f) => path_1.default.relative(overrideDirectory, f));
78
+ const baseFiles = (await gitReactRepo.listFiles([`${baseDirectory}/**`], newVersion)).map(f => path_1.default.relative(baseDirectory, f));
79
+ const overrideFiles = (await overrideRepo.listFiles([`${overrideDirectory}/**`])).map(f => path_1.default.relative(overrideDirectory, f));
80
80
  // Note that this logic can lead emopty directories. This shouldn't
81
81
  // matter in practice as Git won't track them.
82
- const deleteTasks = lodash_1.default.difference(overrideFiles, baseFiles).map((f) => overrideRepo.deleteFile(path_1.default.join(overrideDirectory, f)));
82
+ const deleteTasks = lodash_1.default.difference(overrideFiles, baseFiles).map(f => overrideRepo.deleteFile(path_1.default.join(overrideDirectory, f)));
83
83
  const baseRepo = (0, FileRepository_1.bindVersion)(gitReactRepo, newVersion);
84
84
  const copyTasks = baseFiles.map(async (f) => {
85
85
  const basePath = path_1.default.join(baseDirectory, f);
@@ -1 +1 @@
1
- {"version":3,"file":"UpgradeStrategy.js","sourceRoot":"","sources":["../src/UpgradeStrategy.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;AAEH,oDAAuB;AACvB,gDAAwB;AACxB,qDAAqE;AAErE,iCAA2C;AAC3C,oDAA4B;AAqBf,QAAA,iBAAiB,GAAG;IAC/B;;OAEG;IACH,cAAc,EAAE,CAAC,YAAoB,EAAmB,EAAE,CAAC,CAAC;QAC1D,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YACpB,YAAY;YACZ,YAAY,EAAE,KAAK;YACnB,YAAY,EAAE,KAAK;SACpB,CAAC;KACH,CAAC;IAEF;;;OAGG;IACH,aAAa,EAAE,CACb,YAAoB,EACpB,QAAgB,EAChB,WAAmB,EACF,EAAE,CAAC,CAAC;QACrB,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,EAAE;YACxE,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC7D,IAAI,UAAU,KAAK,IAAI,EAAE;gBACvB,MAAM,IAAI,KAAK,CAAC,kBAAkB,YAAY,EAAE,CAAC,CAAC;aACnD;YAED,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,aAAa,CACjD,QAAQ,EACR,WAAW,EACX,UAAU,CACX,CAAC;YAEF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC3B,MAAM,IAAI,KAAK,CAAC,uBAAuB,YAAY,YAAY,CAAC,CAAC;aAClE;YAED,MAAM,EAAC,WAAW,EAAE,YAAY,EAAC,GAAG,MAAM,YAAY,CAAC,cAAc,CACnE,QAAQ,EACR,UAAU,EACV,UAAU,CACX,CAAC;YAEF,IAAI,CAAC,WAAW,EAAE;gBAChB,OAAO,EAAC,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAC,CAAC;aAC1D;YAED,MAAM,aAAa,GACjB,YAAY,IAAI,IAAA,gBAAM,EAAC,WAAW,CAAC;gBACjC,CAAC,CAAC,WAAW;qBACR,QAAQ,CAAC,MAAM,CAAC;qBAChB,OAAO,CAAC,eAAe,EAAE,kBAAkB,CAAC;qBAC5C,OAAO,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;gBACnD,CAAC,CAAC,WAAW,CAAC;YAElB,IAAI,CAAC,YAAY,IAAI,cAAc,EAAE;gBACnC,MAAM,YAAY,CAAC,SAAS,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;gBAC1D,OAAO,EAAC,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAC,CAAC;aACzD;YAED,OAAO,EAAC,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAC,CAAC;QAC3D,CAAC;KACF,CAAC;IAEF;;OAEG;IACH,QAAQ,EAAE,CAAC,YAAoB,EAAE,QAAgB,EAAmB,EAAE,CAAC,CAAC;QACtE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE;YACxD,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACrE,IAAI,UAAU,KAAK,IAAI,EAAE;gBACvB,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,IAAI,UAAU,EAAE,CAAC,CAAC;aAC7D;YAED,MAAM,YAAY,CAAC,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;YACvD,OAAO,EAAC,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAC,CAAC;QACjE,CAAC;KACF,CAAC;IAEF;;OAEG;IACH,aAAa,EAAE,CACb,iBAAyB,EACzB,aAAqB,EACJ,EAAE,CAAC,CAAC;QACrB,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE;YACxD,MAAM,SAAS,GAAG,CAChB,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC,GAAG,aAAa,KAAK,CAAC,EAAE,UAAU,CAAC,CAClE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;YAE9C,MAAM,aAAa,GAAG,CACpB,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC,GAAG,iBAAiB,KAAK,CAAC,CAAC,CAC1D,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC;YAElD,mEAAmE;YACnE,8CAA8C;YAC9C,MAAM,WAAW,GAAG,gBAAC,CAAC,UAAU,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACnE,YAAY,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,CACzD,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAA,4BAAW,EAAC,YAAY,EAAE,UAAU,CAAC,CAAC;YACvD,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC1C,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;gBAC7C,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;gBAErD,qEAAqE;gBACrE,IACE,CAAC,MAAM,IAAA,0BAAmB,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBAC/C,CAAC,MAAM,IAAA,0BAAmB,EAAC,YAAY,EAAE,YAAY,CAAC,CAAC,EACvD;oBACA,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAClD,MAAM,YAAY,CAAC,SAAS,CAAC,YAAY,EAAE,OAAQ,CAAC,CAAC;iBACtD;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;YAElD,OAAO;gBACL,YAAY,EAAE,iBAAiB;gBAC/B,YAAY,EAAE,IAAI;gBAClB,YAAY,EAAE,KAAK;aACpB,CAAC;QACJ,CAAC;KACF,CAAC;CACH,CAAC","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * @format\n */\n\nimport _ from 'lodash';\nimport path from 'path';\nimport {WritableFileRepository, bindVersion} from './FileRepository';\nimport GitReactFileRepository from './GitReactFileRepository';\nimport {hashFileOrDirectory} from './Hash';\nimport isUtf8 from 'isutf8';\n\nexport interface UpgradeResult {\n overrideName: string;\n filesWritten: boolean;\n hasConflicts: boolean;\n}\n\n/**\n * An UpgradeStrategy describes the process to upgrade an individual override\n * to a new version of the React Native source tree.\n */\nexport default interface UpgradeStrategy {\n upgrade(\n gitReactRepo: GitReactFileRepository,\n overrideRepo: WritableFileRepository,\n newVersion: string,\n allowConflicts: boolean,\n ): Promise<UpgradeResult>;\n}\n\nexport const UpgradeStrategies = {\n /**\n * No work needed to upgrade\n */\n assumeUpToDate: (overrideName: string): UpgradeStrategy => ({\n upgrade: async () => ({\n overrideName,\n filesWritten: false,\n hasConflicts: false,\n }),\n }),\n\n /**\n * Perform a three way merge of the original base file, the overriden version\n * of it, and the base file from a newwer version of React Native.\n */\n threeWayMerge: (\n overrideName: string,\n baseFile: string,\n baseVersion: string,\n ): UpgradeStrategy => ({\n upgrade: async (gitReactRepo, overrideRepo, newVersion, allowConflicts) => {\n const ovrContent = await overrideRepo.readFile(overrideName);\n if (ovrContent === null) {\n throw new Error(`Could not read ${overrideName}`);\n }\n\n const ovrAsPatch = await gitReactRepo.generatePatch(\n baseFile,\n baseVersion,\n ovrContent,\n );\n\n if (ovrAsPatch.length === 0) {\n throw new Error(`Generated patch for ${overrideName} was empty`);\n }\n\n const {patchedFile, hasConflicts} = await gitReactRepo.getPatchedFile(\n baseFile,\n newVersion,\n ovrAsPatch,\n );\n\n if (!patchedFile) {\n return {overrideName, filesWritten: false, hasConflicts};\n }\n\n const prettyPatched =\n hasConflicts && isUtf8(patchedFile)\n ? patchedFile\n .toString('utf8')\n .replace(/<<<<<<< ours/g, '<<<<<<< Upstream')\n .replace(/>>>>>>> theirs/g, '>>>>>>> Override')\n : patchedFile;\n\n if (!hasConflicts || allowConflicts) {\n await overrideRepo.writeFile(overrideName, prettyPatched);\n return {overrideName, filesWritten: true, hasConflicts};\n }\n\n return {overrideName, filesWritten: false, hasConflicts};\n },\n }),\n\n /**\n * Overwrite our override with base file contents\n */\n copyFile: (overrideName: string, baseFile: string): UpgradeStrategy => ({\n upgrade: async (gitReactRepo, overrideRepo, newVersion) => {\n const newContent = await gitReactRepo.readFile(baseFile, newVersion);\n if (newContent === null) {\n throw new Error(`Could not read ${baseFile}@${newVersion}`);\n }\n\n await overrideRepo.writeFile(overrideName, newContent);\n return {overrideName, filesWritten: true, hasConflicts: false};\n },\n }),\n\n /**\n * Overwrite our override with base file contents\n */\n copyDirectory: (\n overrideDirectory: string,\n baseDirectory: string,\n ): UpgradeStrategy => ({\n upgrade: async (gitReactRepo, overrideRepo, newVersion) => {\n const baseFiles = (\n await gitReactRepo.listFiles([`${baseDirectory}/**`], newVersion)\n ).map((f) => path.relative(baseDirectory, f));\n\n const overrideFiles = (\n await overrideRepo.listFiles([`${overrideDirectory}/**`])\n ).map((f) => path.relative(overrideDirectory, f));\n\n // Note that this logic can lead emopty directories. This shouldn't\n // matter in practice as Git won't track them.\n const deleteTasks = _.difference(overrideFiles, baseFiles).map((f) =>\n overrideRepo.deleteFile(path.join(overrideDirectory, f)),\n );\n\n const baseRepo = bindVersion(gitReactRepo, newVersion);\n const copyTasks = baseFiles.map(async (f) => {\n const basePath = path.join(baseDirectory, f);\n const overridePath = path.join(overrideDirectory, f);\n\n // Con't replace files of the same content but different line endings\n if (\n (await hashFileOrDirectory(basePath, baseRepo)) !==\n (await hashFileOrDirectory(overridePath, overrideRepo))\n ) {\n const content = await baseRepo.readFile(basePath);\n await overrideRepo.writeFile(overridePath, content!);\n }\n });\n\n await Promise.all([...deleteTasks, ...copyTasks]);\n\n return {\n overrideName: overrideDirectory,\n filesWritten: true,\n hasConflicts: false,\n };\n },\n }),\n};\n"]}
1
+ {"version":3,"file":"UpgradeStrategy.js","sourceRoot":"","sources":["../src/UpgradeStrategy.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 _ from 'lodash';\nimport path from 'path';\nimport {WritableFileRepository, bindVersion} from './FileRepository';\nimport GitReactFileRepository from './GitReactFileRepository';\nimport {hashFileOrDirectory} from './Hash';\nimport isUtf8 from 'isutf8';\n\nexport interface UpgradeResult {\n overrideName: string;\n filesWritten: boolean;\n hasConflicts: boolean;\n}\n\n/**\n * An UpgradeStrategy describes the process to upgrade an individual override\n * to a new version of the React Native source tree.\n */\nexport default interface UpgradeStrategy {\n upgrade(\n gitReactRepo: GitReactFileRepository,\n overrideRepo: WritableFileRepository,\n newVersion: string,\n allowConflicts: boolean,\n ): Promise<UpgradeResult>;\n}\n\nexport const UpgradeStrategies = {\n /**\n * No work needed to upgrade\n */\n assumeUpToDate: (overrideName: string): UpgradeStrategy => ({\n upgrade: async () => ({\n overrideName,\n filesWritten: false,\n hasConflicts: false,\n }),\n }),\n\n /**\n * Perform a three way merge of the original base file, the overriden version\n * of it, and the base file from a newwer version of React Native.\n */\n threeWayMerge: (\n overrideName: string,\n baseFile: string,\n baseVersion: string,\n ): UpgradeStrategy => ({\n upgrade: async (gitReactRepo, overrideRepo, newVersion, allowConflicts) => {\n const ovrContent = await overrideRepo.readFile(overrideName);\n if (ovrContent === null) {\n throw new Error(`Could not read ${overrideName}`);\n }\n\n const ovrAsPatch = await gitReactRepo.generatePatch(\n baseFile,\n baseVersion,\n ovrContent,\n );\n\n if (ovrAsPatch.length === 0) {\n throw new Error(`Generated patch for ${overrideName} was empty`);\n }\n\n const {patchedFile, hasConflicts} = await gitReactRepo.getPatchedFile(\n baseFile,\n newVersion,\n ovrAsPatch,\n );\n\n if (!patchedFile) {\n return {overrideName, filesWritten: false, hasConflicts};\n }\n\n const prettyPatched =\n hasConflicts && isUtf8(patchedFile)\n ? patchedFile\n .toString('utf8')\n .replace(/<<<<<<< ours/g, '<<<<<<< Upstream')\n .replace(/>>>>>>> theirs/g, '>>>>>>> Override')\n : patchedFile;\n\n if (!hasConflicts || allowConflicts) {\n await overrideRepo.writeFile(overrideName, prettyPatched);\n return {overrideName, filesWritten: true, hasConflicts};\n }\n\n return {overrideName, filesWritten: false, hasConflicts};\n },\n }),\n\n /**\n * Overwrite our override with base file contents\n */\n copyFile: (overrideName: string, baseFile: string): UpgradeStrategy => ({\n upgrade: async (gitReactRepo, overrideRepo, newVersion) => {\n const newContent = await gitReactRepo.readFile(baseFile, newVersion);\n if (newContent === null) {\n throw new Error(`Could not read ${baseFile}@${newVersion}`);\n }\n\n await overrideRepo.writeFile(overrideName, newContent);\n return {overrideName, filesWritten: true, hasConflicts: false};\n },\n }),\n\n /**\n * Overwrite our override with base file contents\n */\n copyDirectory: (\n overrideDirectory: string,\n baseDirectory: string,\n ): UpgradeStrategy => ({\n upgrade: async (gitReactRepo, overrideRepo, newVersion) => {\n const baseFiles = (\n await gitReactRepo.listFiles([`${baseDirectory}/**`], newVersion)\n ).map(f => path.relative(baseDirectory, f));\n\n const overrideFiles = (\n await overrideRepo.listFiles([`${overrideDirectory}/**`])\n ).map(f => path.relative(overrideDirectory, f));\n\n // Note that this logic can lead emopty directories. This shouldn't\n // matter in practice as Git won't track them.\n const deleteTasks = _.difference(overrideFiles, baseFiles).map(f =>\n overrideRepo.deleteFile(path.join(overrideDirectory, f)),\n );\n\n const baseRepo = bindVersion(gitReactRepo, newVersion);\n const copyTasks = baseFiles.map(async f => {\n const basePath = path.join(baseDirectory, f);\n const overridePath = path.join(overrideDirectory, f);\n\n // Con't replace files of the same content but different line endings\n if (\n (await hashFileOrDirectory(basePath, baseRepo)) !==\n (await hashFileOrDirectory(overridePath, overrideRepo))\n ) {\n const content = await baseRepo.readFile(basePath);\n await overrideRepo.writeFile(overridePath, content!);\n }\n });\n\n await Promise.all([...deleteTasks, ...copyTasks]);\n\n return {\n overrideName: overrideDirectory,\n filesWritten: true,\n hasConflicts: false,\n };\n },\n }),\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ValidationStrategy.js","sourceRoot":"","sources":["../src/ValidationStrategy.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 {HashOpts, hashFileOrDirectory} from './Hash';\nimport {ReactFileRepository, WritableFileRepository} from './FileRepository';\n\nexport interface ValidationError {\n /**\n * Why did validation fail?\n */\n type:\n | 'missingFromManifest' // An override was found that isn't listed in the manifest\n | 'overrideNotFound' // The manifest describes a file which does not exist\n | 'baseNotFound' // The base file for a manifest entry cannot be found\n | 'expectedFile' // Expected the override to be a file but found a directory\n | 'expectedDirectory' // Expected the override to be a directory but found a file\n | 'outOfDate' // A base file has changed since the manifested version\n | 'overrideDifferentFromBase' // An override file is not an exact copy of the base file\n | 'overrideSameAsBase'; // An override file is an exact copy of the base file\n\n /**\n * What override failed validation\n */\n overrideName: string;\n}\n\n/**\n * A ValidationStrategy allows describing a process to ensure a specific\n * override meets constraints such as ensuring file existence, preventing\n * content modification, or being up to date.\n */\nexport default interface ValidationStrategy {\n validate(\n overrideRepo: WritableFileRepository,\n reactRepo: ReactFileRepository,\n ): Promise<ValidationError[]>;\n}\n\nexport const ValidationStrategies = {\n /**\n * Validate that an override file exists\n */\n overrideFileExists: (overrideName: string): ValidationStrategy => ({\n validate: async (overrideRepo) => {\n switch (await overrideRepo.stat(overrideName)) {\n case 'file':\n return [];\n case 'directory':\n return [{type: 'expectedFile', overrideName}];\n case 'none':\n return [{type: 'overrideNotFound', overrideName}];\n }\n },\n }),\n\n /**\n * Validate that a base file exists\n */\n baseFileExists: (\n overrideName: string,\n baseFile: string,\n ): ValidationStrategy => ({\n validate: async (_, reactRepo) => {\n switch (await reactRepo.stat(baseFile)) {\n case 'file':\n return [];\n case 'directory':\n return [{type: 'expectedFile', overrideName}];\n case 'none':\n return [{type: 'baseNotFound', overrideName}];\n }\n },\n }),\n\n /**\n * Validate that an override directory exists\n */\n overrideDirectoryExists: (overrideName: string): ValidationStrategy => ({\n validate: async (overrideRepo) => {\n switch (await overrideRepo.stat(overrideName)) {\n case 'file':\n return [{type: 'expectedDirectory', overrideName}];\n case 'directory':\n return [];\n case 'none':\n return [{type: 'overrideNotFound', overrideName}];\n }\n },\n }),\n\n /**\n * Validate that a base directory exists\n */\n baseDirectoryExists: (\n overrideName: string,\n baseDirectory: string,\n ): ValidationStrategy => ({\n validate: async (_, reactRepo) => {\n switch (await reactRepo.stat(baseDirectory)) {\n case 'file':\n return [{type: 'expectedDirectory', overrideName}];\n case 'directory':\n return [];\n case 'none':\n return [{type: 'baseNotFound', overrideName}];\n }\n },\n }),\n\n /**\n * Validate that a base file/folder matches an expected hash if it exists\n */\n baseUpToDate: (\n overrideName: string,\n base: string,\n expectedBaseHash: string,\n ): ValidationStrategy => ({\n validate: async (_, reactRepo) => {\n const hash = await hashFileOrDirectory(base, reactRepo);\n if (!hash) {\n return [];\n }\n\n return hash === expectedBaseHash\n ? []\n : [{type: 'outOfDate', overrideName}];\n },\n }),\n\n /**\n * Validate that an override meant to be a copy of a base file/folder has not\n * been tampered with\n */\n overrideCopyOfBase: (\n overrideName: string,\n base: string,\n ): ValidationStrategy => ({\n validate: async (overrideRepo, reactRepo) => {\n if (\n (await overrideRepo.stat(overrideName)) === 'none' ||\n (await reactRepo.stat(base)) === 'none'\n ) {\n return [];\n }\n\n const overrideHash = await hashFileOrDirectory(\n overrideName,\n overrideRepo,\n );\n const baseHash = await hashFileOrDirectory(base, reactRepo);\n return overrideHash === baseHash\n ? []\n : [{type: 'overrideDifferentFromBase', overrideName}];\n },\n }),\n\n /**\n * Validate that an override assumed to be different from its base is not\n * identical.\n */\n overrideDifferentFromBase: (\n overrideName: string,\n base: string,\n ): ValidationStrategy => ({\n validate: async (overrideRepo, reactRepo) => {\n if (\n (await overrideRepo.stat(overrideName)) === 'none' ||\n (await reactRepo.stat(base)) === 'none'\n ) {\n return [];\n }\n\n // There can be whitespace differences from merges that lead to\n // semantically indentical files. Do a whitespace insensitive compare to\n // determine if there is a difference.\n const hashOpts: HashOpts = {insensitivity: 'whitespace'};\n\n const overrideHash = await hashFileOrDirectory(\n overrideName,\n overrideRepo,\n hashOpts,\n );\n const baseHash = await hashFileOrDirectory(base, reactRepo, hashOpts);\n return overrideHash === baseHash\n ? [{type: 'overrideSameAsBase', overrideName}]\n : [];\n },\n }),\n};\n"]}
1
+ {"version":3,"file":"ValidationStrategy.js","sourceRoot":"","sources":["../src/ValidationStrategy.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 {HashOpts, hashFileOrDirectory} from './Hash';\nimport {ReactFileRepository, WritableFileRepository} from './FileRepository';\n\nexport interface ValidationError {\n /**\n * Why did validation fail?\n */\n type:\n | 'missingFromManifest' // An override was found that isn't listed in the manifest\n | 'overrideNotFound' // The manifest describes a file which does not exist\n | 'baseNotFound' // The base file for a manifest entry cannot be found\n | 'expectedFile' // Expected the override to be a file but found a directory\n | 'expectedDirectory' // Expected the override to be a directory but found a file\n | 'outOfDate' // A base file has changed since the manifested version\n | 'overrideDifferentFromBase' // An override file is not an exact copy of the base file\n | 'overrideSameAsBase'; // An override file is an exact copy of the base file\n\n /**\n * What override failed validation\n */\n overrideName: string;\n}\n\n/**\n * A ValidationStrategy allows describing a process to ensure a specific\n * override meets constraints such as ensuring file existence, preventing\n * content modification, or being up to date.\n */\nexport default interface ValidationStrategy {\n validate(\n overrideRepo: WritableFileRepository,\n reactRepo: ReactFileRepository,\n ): Promise<ValidationError[]>;\n}\n\nexport const ValidationStrategies = {\n /**\n * Validate that an override file exists\n */\n overrideFileExists: (overrideName: string): ValidationStrategy => ({\n validate: async overrideRepo => {\n switch (await overrideRepo.stat(overrideName)) {\n case 'file':\n return [];\n case 'directory':\n return [{type: 'expectedFile', overrideName}];\n case 'none':\n return [{type: 'overrideNotFound', overrideName}];\n }\n },\n }),\n\n /**\n * Validate that a base file exists\n */\n baseFileExists: (\n overrideName: string,\n baseFile: string,\n ): ValidationStrategy => ({\n validate: async (_, reactRepo) => {\n switch (await reactRepo.stat(baseFile)) {\n case 'file':\n return [];\n case 'directory':\n return [{type: 'expectedFile', overrideName}];\n case 'none':\n return [{type: 'baseNotFound', overrideName}];\n }\n },\n }),\n\n /**\n * Validate that an override directory exists\n */\n overrideDirectoryExists: (overrideName: string): ValidationStrategy => ({\n validate: async overrideRepo => {\n switch (await overrideRepo.stat(overrideName)) {\n case 'file':\n return [{type: 'expectedDirectory', overrideName}];\n case 'directory':\n return [];\n case 'none':\n return [{type: 'overrideNotFound', overrideName}];\n }\n },\n }),\n\n /**\n * Validate that a base directory exists\n */\n baseDirectoryExists: (\n overrideName: string,\n baseDirectory: string,\n ): ValidationStrategy => ({\n validate: async (_, reactRepo) => {\n switch (await reactRepo.stat(baseDirectory)) {\n case 'file':\n return [{type: 'expectedDirectory', overrideName}];\n case 'directory':\n return [];\n case 'none':\n return [{type: 'baseNotFound', overrideName}];\n }\n },\n }),\n\n /**\n * Validate that a base file/folder matches an expected hash if it exists\n */\n baseUpToDate: (\n overrideName: string,\n base: string,\n expectedBaseHash: string,\n ): ValidationStrategy => ({\n validate: async (_, reactRepo) => {\n const hash = await hashFileOrDirectory(base, reactRepo);\n if (!hash) {\n return [];\n }\n\n return hash === expectedBaseHash\n ? []\n : [{type: 'outOfDate', overrideName}];\n },\n }),\n\n /**\n * Validate that an override meant to be a copy of a base file/folder has not\n * been tampered with\n */\n overrideCopyOfBase: (\n overrideName: string,\n base: string,\n ): ValidationStrategy => ({\n validate: async (overrideRepo, reactRepo) => {\n if (\n (await overrideRepo.stat(overrideName)) === 'none' ||\n (await reactRepo.stat(base)) === 'none'\n ) {\n return [];\n }\n\n const overrideHash = await hashFileOrDirectory(\n overrideName,\n overrideRepo,\n );\n const baseHash = await hashFileOrDirectory(base, reactRepo);\n return overrideHash === baseHash\n ? []\n : [{type: 'overrideDifferentFromBase', overrideName}];\n },\n }),\n\n /**\n * Validate that an override assumed to be different from its base is not\n * identical.\n */\n overrideDifferentFromBase: (\n overrideName: string,\n base: string,\n ): ValidationStrategy => ({\n validate: async (overrideRepo, reactRepo) => {\n if (\n (await overrideRepo.stat(overrideName)) === 'none' ||\n (await reactRepo.stat(base)) === 'none'\n ) {\n return [];\n }\n\n // There can be whitespace differences from merges that lead to\n // semantically indentical files. Do a whitespace insensitive compare to\n // determine if there is a difference.\n const hashOpts: HashOpts = {insensitivity: 'whitespace'};\n\n const overrideHash = await hashFileOrDirectory(\n overrideName,\n overrideRepo,\n hashOpts,\n );\n const baseHash = await hashFileOrDirectory(base, reactRepo, hashOpts);\n return overrideHash === baseHash\n ? [{type: 'overrideSameAsBase', overrideName}]\n : [];\n },\n }),\n};\n"]}
@@ -57,7 +57,7 @@ const { extensions, directory } = yargs_1.default
57
57
  },
58
58
  })
59
59
  .version(false).argv;
60
- const extensionsRegex = new RegExp(extensions.map((e) => `\\.${e}`).join('|'));
60
+ const extensionsRegex = new RegExp(extensions.map(e => `\\.${e}`).join('|'));
61
61
  (async () => {
62
62
  const spinner = (0, ora_1.default)();
63
63
  spinner.start('Creating manifest');
@@ -1 +1 @@
1
- {"version":3,"file":"generateManifest.js","sourceRoot":"","sources":["../../src/scripts/generateManifest.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 FileRepository from '../FileRepository';\nimport * as Serialized from '../Serialized';\n\nimport ora from 'ora';\nimport path from 'path';\nimport yargs from 'yargs';\n\nimport FileSystemRepository from '../FileSystemRepository';\nimport GitReactFileRepository from '../GitReactFileRepository';\n\nimport {diff_match_patch} from 'diff-match-patch';\nimport {getInstalledRNVersion} from '../PackageUtils';\nimport {hashContent} from '../Hash';\n\nimport isUtf8 from 'isutf8';\n\nconst {extensions, directory} = yargs\n .options({\n directory: {\n description:\n 'The directory containing files that should be in the manifest',\n type: 'string',\n demandOption: true,\n },\n extensions: {\n description: 'A list of platform specific JS extensions to include',\n type: 'array',\n demandOption: true,\n },\n })\n .version(false).argv;\n\nconst extensionsRegex = new RegExp(extensions.map((e) => `\\\\.${e}`).join('|'));\n\n(async () => {\n const spinner = ora();\n spinner.start('Creating manifest');\n\n const version = await getInstalledRNVersion();\n const [overrides, reactSources] = await getFileRepos(directory, version);\n const manifest: Serialized.Manifest = {\n includePatterns: undefined,\n excludePatterns: undefined,\n baseVersion: version,\n overrides: [],\n };\n const overrideFiles = await overrides.listFiles();\n\n let i = 0;\n for (const file of overrideFiles) {\n spinner.text = `Creating manifest (${++i}/${overrideFiles.length})`;\n\n const contents = (await overrides.readFile(file))!;\n (await tryAddCopy(file, contents, reactSources, manifest)) ||\n (await tryAddPatch(file, contents, reactSources, manifest)) ||\n (await tryAddDerived(file, contents, reactSources, manifest)) ||\n addUnknown(file, manifest);\n }\n\n const ovrFile = path.join(directory, 'overrides.json');\n await Serialized.writeManifestToFile(manifest, ovrFile);\n\n spinner.succeed();\n})();\n\nasync function tryAddCopy(\n filename: string,\n overrideContent: Buffer,\n reactSources: FileRepository.ReactFileRepository,\n manifest: Serialized.Manifest,\n): Promise<boolean> {\n const baseContent = await reactSources.readFile(filename);\n if (!baseContent) {\n return false;\n }\n\n if (hashContent(baseContent) !== hashContent(overrideContent)) {\n return false;\n }\n\n manifest.overrides.push({\n type: 'copy',\n file: filename,\n baseFile: filename,\n baseVersion: undefined,\n baseHash: hashContent(baseContent),\n issue: undefined,\n });\n\n return true;\n}\n\nasync function tryAddPatch(\n filename: string,\n overrideContent: Buffer,\n reactSources: FileRepository.ReactFileRepository,\n manifest: Serialized.Manifest,\n): Promise<boolean> {\n const baseFile = filename.replace(extensionsRegex, '');\n const baseContent = await reactSources.readFile(baseFile);\n\n if (!baseContent) {\n return false;\n }\n\n const {similar} = computeSimilarity(overrideContent, baseContent);\n if (similar) {\n manifest.overrides.push({\n type: 'patch',\n file: filename,\n baseFile: baseFile,\n baseVersion: undefined,\n baseHash: hashContent(baseContent),\n issue: undefined,\n });\n } else {\n addUnknown(filename, manifest);\n }\n\n return true;\n}\n\nasync function tryAddDerived(\n filename: string,\n overrideContent: Buffer,\n reactSources: FileRepository.ReactFileRepository,\n manifest: Serialized.Manifest,\n): Promise<boolean> {\n const matches: Array<{file: string; contents: Buffer; dist: number}> = [];\n\n const droidFile = filename.replace(extensionsRegex, '.android');\n const droidContents = await reactSources.readFile(droidFile);\n const droidSim =\n droidContents && computeSimilarity(overrideContent, droidContents);\n if (droidSim && droidSim.similar) {\n matches.push({\n file: droidFile,\n contents: droidContents!,\n dist: droidSim.editDistance,\n });\n }\n\n const iosFile = filename.replace(extensionsRegex, '.ios');\n const iosContents = await reactSources.readFile(iosFile);\n const iosSim = iosContents && computeSimilarity(overrideContent, iosContents);\n if (iosSim && iosSim.similar) {\n matches.push({\n file: iosFile,\n contents: iosContents!,\n dist: iosSim.editDistance,\n });\n }\n\n if (matches.length === 0) {\n return false;\n }\n\n const bestMatch = matches.reduce((a, b) => (a.dist < b.dist ? a : b));\n manifest.overrides.push({\n type: 'derived',\n file: filename,\n baseFile: bestMatch.file,\n baseVersion: undefined,\n baseHash: hashContent(bestMatch.contents),\n issue: undefined,\n });\n\n return true;\n}\n\nfunction addUnknown(filename: string, manifest: Serialized.Manifest) {\n (manifest.overrides as Array<any>).push({\n type: '???',\n file: filename,\n baseFile: '???',\n baseHash: '???',\n });\n}\n\nasync function getFileRepos(\n overrideovrPath: string,\n rnVersion: string,\n): Promise<\n [FileRepository.WritableFileRepository, FileRepository.ReactFileRepository]\n> {\n const overrides = new FileSystemRepository(overrideovrPath);\n\n const versionedReactSources = await GitReactFileRepository.createAndInit();\n const reactSources = FileRepository.bindVersion(\n versionedReactSources,\n rnVersion,\n );\n\n return [overrides, reactSources];\n}\n\nfunction computeSimilarity(\n override: Buffer,\n source: Buffer,\n): {similar: boolean; editDistance: number} {\n if (!isUtf8(override) || !isUtf8(source)) {\n return {similar: false, editDistance: NaN};\n }\n\n let overrideStr = override.toString();\n let sourceStr = source.toString();\n\n overrideStr = stripCopyrightHeaders(overrideStr);\n sourceStr = stripCopyrightHeaders(sourceStr);\n\n const differ = new diff_match_patch();\n const diffs = differ.diff_main(sourceStr, overrideStr);\n\n const editDistance = differ.diff_levenshtein(diffs);\n const similar =\n editDistance / Math.max(overrideStr.length, sourceStr.length) < 0.8;\n return {similar, editDistance};\n}\n\nfunction stripCopyrightHeaders(str: string): string {\n if (!str.startsWith('/*')) {\n return str;\n }\n\n const headerEnd = str.indexOf('*/') + 1;\n return str.slice(headerEnd);\n}\n"]}
1
+ {"version":3,"file":"generateManifest.js","sourceRoot":"","sources":["../../src/scripts/generateManifest.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,kEAAoD;AACpD,0DAA4C;AAE5C,8CAAsB;AACtB,gDAAwB;AACxB,kDAA0B;AAE1B,mFAA2D;AAC3D,uFAA+D;AAE/D,uDAAkD;AAClD,kDAAsD;AACtD,kCAAoC;AAEpC,oDAA4B;AAE5B,MAAM,EAAC,UAAU,EAAE,SAAS,EAAC,GAAG,eAAK;KAClC,OAAO,CAAC;IACP,SAAS,EAAE;QACT,WAAW,EACT,+DAA+D;QACjE,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,IAAI;KACnB;IACD,UAAU,EAAE;QACV,WAAW,EAAE,sDAAsD;QACnE,IAAI,EAAE,OAAO;QACb,YAAY,EAAE,IAAI;KACnB;CACF,CAAC;KACD,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;AAEvB,MAAM,eAAe,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE7E,CAAC,KAAK,IAAI,EAAE;IACV,MAAM,OAAO,GAAG,IAAA,aAAG,GAAE,CAAC;IACtB,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAEnC,MAAM,OAAO,GAAG,MAAM,IAAA,oCAAqB,GAAE,CAAC;IAC9C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAwB;QACpC,eAAe,EAAE,SAAS;QAC1B,eAAe,EAAE,SAAS;QAC1B,WAAW,EAAE,OAAO;QACpB,SAAS,EAAE,EAAE;KACd,CAAC;IACF,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,SAAS,EAAE,CAAC;IAElD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE;QAChC,OAAO,CAAC,IAAI,GAAG,sBAAsB,EAAE,CAAC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC;QAEpE,MAAM,QAAQ,GAAG,CAAC,MAAM,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAE,CAAC;QACnD,CAAC,MAAM,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;YACxD,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;YAC3D,CAAC,MAAM,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;YAC7D,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;KAC9B;IAED,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IACvD,MAAM,UAAU,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAExD,OAAO,CAAC,OAAO,EAAE,CAAC;AACpB,CAAC,CAAC,EAAE,CAAC;AAEL,KAAK,UAAU,UAAU,CACvB,QAAgB,EAChB,eAAuB,EACvB,YAAgD,EAChD,QAA6B;IAE7B,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC1D,IAAI,CAAC,WAAW,EAAE;QAChB,OAAO,KAAK,CAAC;KACd;IAED,IAAI,IAAA,kBAAW,EAAC,WAAW,CAAC,KAAK,IAAA,kBAAW,EAAC,eAAe,CAAC,EAAE;QAC7D,OAAO,KAAK,CAAC;KACd;IAED,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC;QACtB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,SAAS;QACtB,QAAQ,EAAE,IAAA,kBAAW,EAAC,WAAW,CAAC;QAClC,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,QAAgB,EAChB,eAAuB,EACvB,YAAgD,EAChD,QAA6B;IAE7B,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAE1D,IAAI,CAAC,WAAW,EAAE;QAChB,OAAO,KAAK,CAAC;KACd;IAED,MAAM,EAAC,OAAO,EAAC,GAAG,iBAAiB,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;IAClE,IAAI,OAAO,EAAE;QACX,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC;YACtB,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,QAAQ;YAClB,WAAW,EAAE,SAAS;YACtB,QAAQ,EAAE,IAAA,kBAAW,EAAC,WAAW,CAAC;YAClC,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;KACJ;SAAM;QACL,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;KAChC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,QAAgB,EAChB,eAAuB,EACvB,YAAgD,EAChD,QAA6B;IAE7B,MAAM,OAAO,GAA0D,EAAE,CAAC;IAE1E,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAChE,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC7D,MAAM,QAAQ,GACZ,aAAa,IAAI,iBAAiB,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;IACrE,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE;QAChC,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,aAAc;YACxB,IAAI,EAAE,QAAQ,CAAC,YAAY;SAC5B,CAAC,CAAC;KACJ;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,WAAW,IAAI,iBAAiB,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;IAC9E,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE;QAC5B,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,WAAY;YACtB,IAAI,EAAE,MAAM,CAAC,YAAY;SAC1B,CAAC,CAAC;KACJ;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;QACxB,OAAO,KAAK,CAAC;KACd;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC;QACtB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,SAAS,CAAC,IAAI;QACxB,WAAW,EAAE,SAAS;QACtB,QAAQ,EAAE,IAAA,kBAAW,EAAC,SAAS,CAAC,QAAQ,CAAC;QACzC,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,QAAgB,EAAE,QAA6B;IAChE,QAAQ,CAAC,SAAwB,CAAC,IAAI,CAAC;QACtC,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,KAAK;QACf,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,eAAuB,EACvB,SAAiB;IAIjB,MAAM,SAAS,GAAG,IAAI,8BAAoB,CAAC,eAAe,CAAC,CAAC;IAE5D,MAAM,qBAAqB,GAAG,MAAM,gCAAsB,CAAC,aAAa,EAAE,CAAC;IAC3E,MAAM,YAAY,GAAG,cAAc,CAAC,WAAW,CAC7C,qBAAqB,EACrB,SAAS,CACV,CAAC;IAEF,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,iBAAiB,CACxB,QAAgB,EAChB,MAAc;IAEd,IAAI,CAAC,IAAA,gBAAM,EAAC,QAAQ,CAAC,IAAI,CAAC,IAAA,gBAAM,EAAC,MAAM,CAAC,EAAE;QACxC,OAAO,EAAC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAC,CAAC;KAC5C;IAED,IAAI,WAAW,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;IACtC,IAAI,SAAS,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAElC,WAAW,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACjD,SAAS,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAE7C,MAAM,MAAM,GAAG,IAAI,mCAAgB,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAEvD,MAAM,YAAY,GAAG,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,OAAO,GACX,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;IACtE,OAAO,EAAC,OAAO,EAAE,YAAY,EAAC,CAAC;AACjC,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAW;IACxC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;QACzB,OAAO,GAAG,CAAC;KACZ;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,OAAO,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAC9B,CAAC","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * @format\n */\n\nimport * as FileRepository from '../FileRepository';\nimport * as Serialized from '../Serialized';\n\nimport ora from 'ora';\nimport path from 'path';\nimport yargs from 'yargs';\n\nimport FileSystemRepository from '../FileSystemRepository';\nimport GitReactFileRepository from '../GitReactFileRepository';\n\nimport {diff_match_patch} from 'diff-match-patch';\nimport {getInstalledRNVersion} from '../PackageUtils';\nimport {hashContent} from '../Hash';\n\nimport isUtf8 from 'isutf8';\n\nconst {extensions, directory} = yargs\n .options({\n directory: {\n description:\n 'The directory containing files that should be in the manifest',\n type: 'string',\n demandOption: true,\n },\n extensions: {\n description: 'A list of platform specific JS extensions to include',\n type: 'array',\n demandOption: true,\n },\n })\n .version(false).argv;\n\nconst extensionsRegex = new RegExp(extensions.map(e => `\\\\.${e}`).join('|'));\n\n(async () => {\n const spinner = ora();\n spinner.start('Creating manifest');\n\n const version = await getInstalledRNVersion();\n const [overrides, reactSources] = await getFileRepos(directory, version);\n const manifest: Serialized.Manifest = {\n includePatterns: undefined,\n excludePatterns: undefined,\n baseVersion: version,\n overrides: [],\n };\n const overrideFiles = await overrides.listFiles();\n\n let i = 0;\n for (const file of overrideFiles) {\n spinner.text = `Creating manifest (${++i}/${overrideFiles.length})`;\n\n const contents = (await overrides.readFile(file))!;\n (await tryAddCopy(file, contents, reactSources, manifest)) ||\n (await tryAddPatch(file, contents, reactSources, manifest)) ||\n (await tryAddDerived(file, contents, reactSources, manifest)) ||\n addUnknown(file, manifest);\n }\n\n const ovrFile = path.join(directory, 'overrides.json');\n await Serialized.writeManifestToFile(manifest, ovrFile);\n\n spinner.succeed();\n})();\n\nasync function tryAddCopy(\n filename: string,\n overrideContent: Buffer,\n reactSources: FileRepository.ReactFileRepository,\n manifest: Serialized.Manifest,\n): Promise<boolean> {\n const baseContent = await reactSources.readFile(filename);\n if (!baseContent) {\n return false;\n }\n\n if (hashContent(baseContent) !== hashContent(overrideContent)) {\n return false;\n }\n\n manifest.overrides.push({\n type: 'copy',\n file: filename,\n baseFile: filename,\n baseVersion: undefined,\n baseHash: hashContent(baseContent),\n issue: undefined,\n });\n\n return true;\n}\n\nasync function tryAddPatch(\n filename: string,\n overrideContent: Buffer,\n reactSources: FileRepository.ReactFileRepository,\n manifest: Serialized.Manifest,\n): Promise<boolean> {\n const baseFile = filename.replace(extensionsRegex, '');\n const baseContent = await reactSources.readFile(baseFile);\n\n if (!baseContent) {\n return false;\n }\n\n const {similar} = computeSimilarity(overrideContent, baseContent);\n if (similar) {\n manifest.overrides.push({\n type: 'patch',\n file: filename,\n baseFile: baseFile,\n baseVersion: undefined,\n baseHash: hashContent(baseContent),\n issue: undefined,\n });\n } else {\n addUnknown(filename, manifest);\n }\n\n return true;\n}\n\nasync function tryAddDerived(\n filename: string,\n overrideContent: Buffer,\n reactSources: FileRepository.ReactFileRepository,\n manifest: Serialized.Manifest,\n): Promise<boolean> {\n const matches: Array<{file: string; contents: Buffer; dist: number}> = [];\n\n const droidFile = filename.replace(extensionsRegex, '.android');\n const droidContents = await reactSources.readFile(droidFile);\n const droidSim =\n droidContents && computeSimilarity(overrideContent, droidContents);\n if (droidSim && droidSim.similar) {\n matches.push({\n file: droidFile,\n contents: droidContents!,\n dist: droidSim.editDistance,\n });\n }\n\n const iosFile = filename.replace(extensionsRegex, '.ios');\n const iosContents = await reactSources.readFile(iosFile);\n const iosSim = iosContents && computeSimilarity(overrideContent, iosContents);\n if (iosSim && iosSim.similar) {\n matches.push({\n file: iosFile,\n contents: iosContents!,\n dist: iosSim.editDistance,\n });\n }\n\n if (matches.length === 0) {\n return false;\n }\n\n const bestMatch = matches.reduce((a, b) => (a.dist < b.dist ? a : b));\n manifest.overrides.push({\n type: 'derived',\n file: filename,\n baseFile: bestMatch.file,\n baseVersion: undefined,\n baseHash: hashContent(bestMatch.contents),\n issue: undefined,\n });\n\n return true;\n}\n\nfunction addUnknown(filename: string, manifest: Serialized.Manifest) {\n (manifest.overrides as Array<any>).push({\n type: '???',\n file: filename,\n baseFile: '???',\n baseHash: '???',\n });\n}\n\nasync function getFileRepos(\n overrideovrPath: string,\n rnVersion: string,\n): Promise<\n [FileRepository.WritableFileRepository, FileRepository.ReactFileRepository]\n> {\n const overrides = new FileSystemRepository(overrideovrPath);\n\n const versionedReactSources = await GitReactFileRepository.createAndInit();\n const reactSources = FileRepository.bindVersion(\n versionedReactSources,\n rnVersion,\n );\n\n return [overrides, reactSources];\n}\n\nfunction computeSimilarity(\n override: Buffer,\n source: Buffer,\n): {similar: boolean; editDistance: number} {\n if (!isUtf8(override) || !isUtf8(source)) {\n return {similar: false, editDistance: NaN};\n }\n\n let overrideStr = override.toString();\n let sourceStr = source.toString();\n\n overrideStr = stripCopyrightHeaders(overrideStr);\n sourceStr = stripCopyrightHeaders(sourceStr);\n\n const differ = new diff_match_patch();\n const diffs = differ.diff_main(sourceStr, overrideStr);\n\n const editDistance = differ.diff_levenshtein(diffs);\n const similar =\n editDistance / Math.max(overrideStr.length, sourceStr.length) < 0.8;\n return {similar, editDistance};\n}\n\nfunction stripCopyrightHeaders(str: string): string {\n if (!str.startsWith('/*')) {\n return str;\n }\n\n const headerEnd = str.indexOf('*/') + 1;\n return str.slice(headerEnd);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-platform-override",
3
- "version": "1.6.7",
3
+ "version": "1.6.10",
4
4
  "description": "react-native-platform-override offers CLI tools to manage Javascript overrides in out-of-tree React Native platforms",
5
5
  "license": "MIT",
6
6
  "main": "./lib-commonjs/Api.js",
@@ -22,9 +22,9 @@
22
22
  "react-native-platform-override": "./bin.js"
23
23
  },
24
24
  "dependencies": {
25
- "@react-native-windows/fs": "^0.0.0-canary.1",
26
- "@react-native-windows/package-utils": "^0.0.0-canary.27",
27
- "async": "^3.2.0",
25
+ "@react-native-windows/fs": "^0.0.0-canary.2",
26
+ "@react-native-windows/package-utils": "^0.0.0-canary.28",
27
+ "async": "^3.2.3",
28
28
  "chalk": "^4.1.0",
29
29
  "fp-ts": "^2.5.0",
30
30
  "globby": "^9.2.0",
@@ -35,7 +35,7 @@
35
35
  "node-fetch": "^2.6.7",
36
36
  "ora": "^3.4.0",
37
37
  "semver": "^7.3.2",
38
- "simple-git": "^1.131.0",
38
+ "simple-git": "^3.3.0",
39
39
  "source-map-support": "^0.5.19",
40
40
  "upath": "^1.2.0",
41
41
  "yargs": "^16.2.0"
@@ -44,7 +44,7 @@
44
44
  "@babel/core": "^7.14.0",
45
45
  "@babel/preset-env": "^7.8.4",
46
46
  "@babel/preset-typescript": "^7.8.3",
47
- "@react-native-windows/package-utils": "0.0.0-canary.27",
47
+ "@react-native-windows/package-utils": "0.0.0-canary.28",
48
48
  "@rnw-scripts/eslint-config": "1.1.11",
49
49
  "@rnw-scripts/jest-unittest-config": "1.2.6",
50
50
  "@rnw-scripts/just-task": "2.2.3",