@rushstack/rush-resolver-cache-plugin 5.158.0 → 5.158.1-pr5355.0

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.
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.52.11"
8
+ "packageVersion": "7.52.13"
9
9
  }
10
10
  ]
11
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"afterInstallAsync.d.ts","sourceRoot":"","sources":["../src/afterInstallAsync.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EAEjB,OAAO,EAEP,QAAQ,EACT,MAAM,qBAAqB,CAAC;AAwC7B;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,iBAAiB,EACpC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,IAAI,CAAC,CA8Lf"}
1
+ {"version":3,"file":"afterInstallAsync.d.ts","sourceRoot":"","sources":["../src/afterInstallAsync.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EAEjB,OAAO,EAEP,QAAQ,EACT,MAAM,qBAAqB,CAAC;AAmD7B;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,iBAAiB,EACpC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,IAAI,CAAC,CAgNf"}
@@ -24,7 +24,7 @@ function getPlatformInfo() {
24
24
  };
25
25
  }
26
26
  const END_TOKEN = '/package.json":';
27
- const SUBPACKAGE_CACHE_FILE_VERSION = 1;
27
+ const RESOLVER_CACHE_FILE_VERSION = 2;
28
28
  /**
29
29
  * Plugin entry point for after install.
30
30
  * @param rushSession - The Rush Session
@@ -40,15 +40,29 @@ async function afterInstallAsync(rushSession, rushConfiguration, subspace, varia
40
40
  const pnpmStoreDir = `${rushConfiguration.pnpmOptions.pnpmStorePath}/v3/files/`;
41
41
  terminal.writeLine(`Using pnpm-lock from: ${lockFilePath}`);
42
42
  terminal.writeLine(`Using pnpm store folder: ${pnpmStoreDir}`);
43
+ const workspaceRoot = subspace.getSubspaceTempFolderPath();
44
+ const cacheFilePath = `${workspaceRoot}/resolver-cache.json`;
43
45
  const lockFile = externals_1.PnpmShrinkwrapFile.loadFromFile(lockFilePath, {
44
46
  withCaching: true
45
47
  });
46
48
  if (!lockFile) {
47
49
  throw new Error(`Failed to load shrinkwrap file: ${lockFilePath}`);
48
50
  }
49
- const workspaceRoot = subspace.getSubspaceTempFolderPath();
51
+ if (!lockFile.hash) {
52
+ throw new Error(`Shrinkwrap file does not have a hash. This indicates linking to an old version of Rush.`);
53
+ }
54
+ try {
55
+ const oldCacheFileContent = await externals_1.FileSystem.readFileAsync(cacheFilePath);
56
+ const oldCache = JSON.parse(oldCacheFileContent);
57
+ if (oldCache.version === RESOLVER_CACHE_FILE_VERSION && oldCache.shrinkwrapHash === lockFile.hash) {
58
+ // Cache is valid, use it
59
+ return;
60
+ }
61
+ }
62
+ catch (err) {
63
+ // Ignore
64
+ }
50
65
  const projectByImporterPath = rushConfiguration.getProjectLookupForRoot(workspaceRoot);
51
- const cacheFilePath = `${workspaceRoot}/resolver-cache.json`;
52
66
  const subPackageCacheFilePath = `${workspaceRoot}/subpackage-entry-cache.json`;
53
67
  terminal.writeLine(`Resolver cache will be written at ${cacheFilePath}`);
54
68
  let oldSubPackagesByIntegrity;
@@ -56,8 +70,8 @@ async function afterInstallAsync(rushSession, rushConfiguration, subspace, varia
56
70
  try {
57
71
  const cacheContent = await externals_1.FileSystem.readFileAsync(subPackageCacheFilePath);
58
72
  const cacheJson = JSON.parse(cacheContent);
59
- if (cacheJson.version !== SUBPACKAGE_CACHE_FILE_VERSION) {
60
- terminal.writeLine(`Expected subpackage cache version ${SUBPACKAGE_CACHE_FILE_VERSION}, got ${cacheJson.version}`);
73
+ if (cacheJson.version !== RESOLVER_CACHE_FILE_VERSION) {
74
+ terminal.writeLine(`Expected subpackage cache version ${RESOLVER_CACHE_FILE_VERSION}, got ${cacheJson.version}`);
61
75
  }
62
76
  else {
63
77
  oldSubPackagesByIntegrity = new Map(cacheJson.subPackagesByIntegrity);
@@ -145,9 +159,8 @@ async function afterInstallAsync(rushSession, rushConfiguration, subspace, varia
145
159
  }
146
160
  else {
147
161
  terminal.writeDebugLine(`Nested "package.json" files found for package at ${descriptionFileRoot}: ${result.join(', ')}`);
148
- // Clone this array to ensure that mutations don't affect the subpackage cache.
149
162
  // eslint-disable-next-line require-atomic-updates
150
- context.nestedPackageDirs = [...result];
163
+ context.nestedPackageDirs = result;
151
164
  }
152
165
  }
153
166
  // For external packages, update the contexts with data from the pnpm store
@@ -157,17 +170,7 @@ async function afterInstallAsync(rushSession, rushConfiguration, subspace, varia
157
170
  concurrency: 20
158
171
  });
159
172
  }
160
- // Serialize this before `computeResolverCacheFromLockfileAsync` because bundledDependencies get removed
161
- // from the `nestedPackageDirs` array. We clone above for safety, but this is making doubly sure.
162
- const newSubPackageCache = {
163
- version: SUBPACKAGE_CACHE_FILE_VERSION,
164
- subPackagesByIntegrity: Array.from(subPackagesByIntegrity)
165
- };
166
- const serializedSubpackageCache = JSON.stringify(newSubPackageCache);
167
- const writeSubPackageCachePromise = externals_1.FileSystem.writeFileAsync(subPackageCacheFilePath, serializedSubpackageCache, {
168
- ensureFolderExists: true
169
- });
170
- const cacheFile = await (0, computeResolverCacheFromLockfileAsync_1.computeResolverCacheFromLockfileAsync)({
173
+ const rawCacheFile = await (0, computeResolverCacheFromLockfileAsync_1.computeResolverCacheFromLockfileAsync)({
171
174
  workspaceRoot,
172
175
  commonPrefixToTrim: rushRoot,
173
176
  platformInfo: getPlatformInfo(),
@@ -175,13 +178,27 @@ async function afterInstallAsync(rushSession, rushConfiguration, subspace, varia
175
178
  lockfile: lockFile,
176
179
  afterExternalPackagesAsync
177
180
  });
178
- const serialized = JSON.stringify(cacheFile);
181
+ const extendedCacheFile = {
182
+ version: RESOLVER_CACHE_FILE_VERSION,
183
+ shrinkwrapHash: lockFile.hash,
184
+ ...rawCacheFile
185
+ };
186
+ const newSubPackageCache = {
187
+ version: RESOLVER_CACHE_FILE_VERSION,
188
+ subPackagesByIntegrity: Array.from(subPackagesByIntegrity)
189
+ };
190
+ const serializedSubpackageCache = JSON.stringify(newSubPackageCache);
191
+ const serialized = JSON.stringify(extendedCacheFile);
179
192
  await Promise.all([
180
193
  externals_1.FileSystem.writeFileAsync(cacheFilePath, serialized, {
181
194
  ensureFolderExists: true
182
195
  }),
183
- writeSubPackageCachePromise
196
+ externals_1.FileSystem.writeFileAsync(subPackageCacheFilePath, serializedSubpackageCache, {
197
+ ensureFolderExists: true
198
+ })
184
199
  ]);
200
+ // Free the memory used by the lockfiles, since nothing should read the lockfile from this point on.
201
+ externals_1.PnpmShrinkwrapFile.clearCache();
185
202
  terminal.writeLine(`Resolver cache written.`);
186
203
  }
187
204
  //# sourceMappingURL=afterInstallAsync.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"afterInstallAsync.js","sourceRoot":"","sources":["../src/afterInstallAsync.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type {\n RushSession,\n RushConfiguration,\n RushConfigurationProject,\n ILogger,\n LookupByPath,\n Subspace\n} from '@rushstack/rush-sdk';\nimport type { IResolverCacheFile } from '@rushstack/webpack-workspace-resolve-plugin';\n\nimport { Async, FileSystem, PnpmShrinkwrapFile } from './externals';\nimport {\n computeResolverCacheFromLockfileAsync,\n type IPlatformInfo\n} from './computeResolverCacheFromLockfileAsync';\nimport type { IResolverContext } from './types';\n\n/**\n * Gets information used to determine compatibility of optional dependencies.\n * @returns Information about the platform Rush is running on\n */\nfunction getPlatformInfo(): IPlatformInfo {\n // Acquiring the libc version is a bit more obnoxious than platform and arch,\n // but all of them are ultimately on the same object.\n const {\n platform: os,\n arch: cpu,\n glibcVersionRuntime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } = (process.report?.getReport() as any)?.header ?? process;\n const libc: 'glibc' | 'musl' = glibcVersionRuntime ? 'glibc' : 'musl';\n\n return {\n os,\n cpu,\n libc\n };\n}\n\nconst END_TOKEN: string = '/package.json\":';\nconst SUBPACKAGE_CACHE_FILE_VERSION: 1 = 1;\n\ninterface INestedPackageJsonCache {\n subPackagesByIntegrity: [string, string[] | boolean][];\n version: number;\n}\n\n/**\n * Plugin entry point for after install.\n * @param rushSession - The Rush Session\n * @param rushConfiguration - The Rush Configuration\n * @param subspace - The subspace that was just installed\n * @param variant - The variant that was just installed\n * @param logger - The initialized logger\n */\nexport async function afterInstallAsync(\n rushSession: RushSession,\n rushConfiguration: RushConfiguration,\n subspace: Subspace,\n variant: string | undefined,\n logger: ILogger\n): Promise<void> {\n const { terminal } = logger;\n const rushRoot: string = `${rushConfiguration.rushJsonFolder}/`;\n\n const lockFilePath: string = subspace.getCommittedShrinkwrapFilePath(variant);\n\n const pnpmStoreDir: string = `${rushConfiguration.pnpmOptions.pnpmStorePath}/v3/files/`;\n\n terminal.writeLine(`Using pnpm-lock from: ${lockFilePath}`);\n terminal.writeLine(`Using pnpm store folder: ${pnpmStoreDir}`);\n\n const lockFile: PnpmShrinkwrapFile | undefined = PnpmShrinkwrapFile.loadFromFile(lockFilePath, {\n withCaching: true\n });\n if (!lockFile) {\n throw new Error(`Failed to load shrinkwrap file: ${lockFilePath}`);\n }\n\n const workspaceRoot: string = subspace.getSubspaceTempFolderPath();\n\n const projectByImporterPath: LookupByPath<RushConfigurationProject> =\n rushConfiguration.getProjectLookupForRoot(workspaceRoot);\n\n const cacheFilePath: string = `${workspaceRoot}/resolver-cache.json`;\n const subPackageCacheFilePath: string = `${workspaceRoot}/subpackage-entry-cache.json`;\n\n terminal.writeLine(`Resolver cache will be written at ${cacheFilePath}`);\n\n let oldSubPackagesByIntegrity: Map<string, string[] | boolean> | undefined;\n const subPackagesByIntegrity: Map<string, string[] | boolean> = new Map();\n try {\n const cacheContent: string = await FileSystem.readFileAsync(subPackageCacheFilePath);\n const cacheJson: INestedPackageJsonCache = JSON.parse(cacheContent);\n if (cacheJson.version !== SUBPACKAGE_CACHE_FILE_VERSION) {\n terminal.writeLine(\n `Expected subpackage cache version ${SUBPACKAGE_CACHE_FILE_VERSION}, got ${cacheJson.version}`\n );\n } else {\n oldSubPackagesByIntegrity = new Map(cacheJson.subPackagesByIntegrity);\n terminal.writeLine(`Loaded subpackage cache from ${subPackageCacheFilePath}`);\n }\n } catch (err) {\n // Ignore\n }\n\n async function afterExternalPackagesAsync(\n contexts: Map<string, IResolverContext>,\n missingOptionalDependencies: Set<string>\n ): Promise<void> {\n /**\n * Loads the index file from the pnpm store to discover nested package.json files in an external package\n * For internal packages, assumes there are no nested package.json files.\n * @param context - The context to find nested package.json files for\n * @returns A promise that resolves to the nested package.json paths, false if the package fails to load, or true if the package has no nested package.json files.\n */\n async function tryFindNestedPackageJsonsForContextAsync(\n context: IResolverContext\n ): Promise<string[] | boolean> {\n const { descriptionFileRoot, descriptionFileHash } = context;\n\n if (descriptionFileHash === undefined) {\n // Assume this package has no nested package json files for now.\n terminal.writeDebugLine(\n `Package at ${descriptionFileRoot} does not have a file list. Assuming no nested \"package.json\" files.`\n );\n return true;\n }\n\n // Convert an integrity hash like\n // sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw==\n // To its hex representation, e.g.\n // 0baba219027e1ade11c875d762dfaff5ff92375bfcdf1ebc511c20c4d43df1cbc7f24c62bb2c1618fe1778d675a5a3b367adda6377137220844093455258e52f\n const prefixIndex: number = descriptionFileHash.indexOf('-');\n const hash: string = Buffer.from(descriptionFileHash.slice(prefixIndex + 1), 'base64').toString('hex');\n\n // The pnpm store directory has index files of package contents at paths:\n // <store>/v3/files/<hash (0-2)>/<hash (2-)>-index.json\n // See https://github.com/pnpm/pnpm/blob/f394cfccda7bc519ceee8c33fc9b68a0f4235532/store/cafs/src/getFilePathInCafs.ts#L33\n const indexPath: string = `${pnpmStoreDir}${hash.slice(0, 2)}/${hash.slice(2)}-index.json`;\n\n try {\n const indexContent: string = await FileSystem.readFileAsync(indexPath);\n let endIndex: number = indexContent.lastIndexOf(END_TOKEN);\n if (endIndex > 0) {\n const nestedPackageDirs: string[] = [];\n do {\n const startIndex: number = indexContent.lastIndexOf('\"', endIndex);\n if (startIndex < 0) {\n throw new Error(\n `Malformed index file at ${indexPath}: missing starting quote for nested package.json path`\n );\n }\n const nestedPath: string = indexContent.slice(startIndex + 1, endIndex);\n nestedPackageDirs.push(nestedPath);\n endIndex = indexContent.lastIndexOf(END_TOKEN, startIndex - 1);\n } while (endIndex > 0);\n return nestedPackageDirs;\n }\n return true;\n } catch (error) {\n if (!context.optional) {\n throw new Error(\n `Error reading index file for: \"${context.descriptionFileRoot}\" (${descriptionFileHash}): ${error.toString()}`\n );\n }\n return false;\n }\n }\n /**\n * Loads the index file from the pnpm store to discover nested package.json files in an external package\n * For internal packages, assumes there are no nested package.json files.\n * @param context - The context to find nested package.json files for\n * @returns A promise that resolves when the nested package.json files are found, if applicable\n */\n async function findNestedPackageJsonsForContextAsync(context: IResolverContext): Promise<void> {\n const { descriptionFileRoot, descriptionFileHash } = context;\n\n if (descriptionFileHash === undefined) {\n // Assume this package has no nested package json files for now.\n terminal.writeDebugLine(\n `Package at ${descriptionFileRoot} does not have a file list. Assuming no nested \"package.json\" files.`\n );\n return;\n }\n\n let result: string[] | boolean | undefined =\n oldSubPackagesByIntegrity?.get(descriptionFileHash) ??\n subPackagesByIntegrity.get(descriptionFileHash);\n if (result === undefined) {\n result = await tryFindNestedPackageJsonsForContextAsync(context);\n }\n subPackagesByIntegrity.set(descriptionFileHash, result);\n if (result === true) {\n // Default case. Do nothing.\n } else if (result === false) {\n terminal.writeLine(`Trimming missing optional dependency at: ${descriptionFileRoot}`);\n contexts.delete(descriptionFileRoot);\n missingOptionalDependencies.add(descriptionFileRoot);\n } else {\n terminal.writeDebugLine(\n `Nested \"package.json\" files found for package at ${descriptionFileRoot}: ${result.join(', ')}`\n );\n // Clone this array to ensure that mutations don't affect the subpackage cache.\n // eslint-disable-next-line require-atomic-updates\n context.nestedPackageDirs = [...result];\n }\n }\n\n // For external packages, update the contexts with data from the pnpm store\n // This gives us the list of nested package.json files, as well as the actual package name\n // We could also cache package.json contents, but that proves to be inefficient.\n await Async.forEachAsync(contexts.values(), findNestedPackageJsonsForContextAsync, {\n concurrency: 20\n });\n }\n\n // Serialize this before `computeResolverCacheFromLockfileAsync` because bundledDependencies get removed\n // from the `nestedPackageDirs` array. We clone above for safety, but this is making doubly sure.\n const newSubPackageCache: INestedPackageJsonCache = {\n version: SUBPACKAGE_CACHE_FILE_VERSION,\n subPackagesByIntegrity: Array.from(subPackagesByIntegrity)\n };\n const serializedSubpackageCache: string = JSON.stringify(newSubPackageCache);\n const writeSubPackageCachePromise: Promise<void> = FileSystem.writeFileAsync(\n subPackageCacheFilePath,\n serializedSubpackageCache,\n {\n ensureFolderExists: true\n }\n );\n\n const cacheFile: IResolverCacheFile = await computeResolverCacheFromLockfileAsync({\n workspaceRoot,\n commonPrefixToTrim: rushRoot,\n platformInfo: getPlatformInfo(),\n projectByImporterPath,\n lockfile: lockFile,\n afterExternalPackagesAsync\n });\n\n const serialized: string = JSON.stringify(cacheFile);\n\n await Promise.all([\n FileSystem.writeFileAsync(cacheFilePath, serialized, {\n ensureFolderExists: true\n }),\n writeSubPackageCachePromise\n ]);\n\n terminal.writeLine(`Resolver cache written.`);\n}\n"]}
1
+ {"version":3,"file":"afterInstallAsync.js","sourceRoot":"","sources":["../src/afterInstallAsync.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type {\n RushSession,\n RushConfiguration,\n RushConfigurationProject,\n ILogger,\n LookupByPath,\n Subspace\n} from '@rushstack/rush-sdk';\nimport type { IResolverCacheFile } from '@rushstack/webpack-workspace-resolve-plugin';\n\nimport { Async, FileSystem, PnpmShrinkwrapFile } from './externals';\nimport {\n computeResolverCacheFromLockfileAsync,\n type IPlatformInfo\n} from './computeResolverCacheFromLockfileAsync';\nimport type { IResolverContext } from './types';\n\n/**\n * Gets information used to determine compatibility of optional dependencies.\n * @returns Information about the platform Rush is running on\n */\nfunction getPlatformInfo(): IPlatformInfo {\n // Acquiring the libc version is a bit more obnoxious than platform and arch,\n // but all of them are ultimately on the same object.\n const {\n platform: os,\n arch: cpu,\n glibcVersionRuntime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } = (process.report?.getReport() as any)?.header ?? process;\n const libc: 'glibc' | 'musl' = glibcVersionRuntime ? 'glibc' : 'musl';\n\n return {\n os,\n cpu,\n libc\n };\n}\n\nconst END_TOKEN: string = '/package.json\":';\nconst RESOLVER_CACHE_FILE_VERSION: 2 = 2;\n\ninterface IExtendedResolverCacheFile extends IResolverCacheFile {\n /**\n * The hash of the shrinkwrap file this cache file was generated from.\n */\n shrinkwrapHash: string;\n /**\n * The version of the resolver cache file.\n */\n version: number;\n}\n\ninterface INestedPackageJsonCache {\n subPackagesByIntegrity: [string, string[] | boolean][];\n version: number;\n}\n\n/**\n * Plugin entry point for after install.\n * @param rushSession - The Rush Session\n * @param rushConfiguration - The Rush Configuration\n * @param subspace - The subspace that was just installed\n * @param variant - The variant that was just installed\n * @param logger - The initialized logger\n */\nexport async function afterInstallAsync(\n rushSession: RushSession,\n rushConfiguration: RushConfiguration,\n subspace: Subspace,\n variant: string | undefined,\n logger: ILogger\n): Promise<void> {\n const { terminal } = logger;\n const rushRoot: string = `${rushConfiguration.rushJsonFolder}/`;\n\n const lockFilePath: string = subspace.getCommittedShrinkwrapFilePath(variant);\n\n const pnpmStoreDir: string = `${rushConfiguration.pnpmOptions.pnpmStorePath}/v3/files/`;\n\n terminal.writeLine(`Using pnpm-lock from: ${lockFilePath}`);\n terminal.writeLine(`Using pnpm store folder: ${pnpmStoreDir}`);\n\n const workspaceRoot: string = subspace.getSubspaceTempFolderPath();\n const cacheFilePath: string = `${workspaceRoot}/resolver-cache.json`;\n\n const lockFile: PnpmShrinkwrapFile | undefined = PnpmShrinkwrapFile.loadFromFile(lockFilePath, {\n withCaching: true\n });\n if (!lockFile) {\n throw new Error(`Failed to load shrinkwrap file: ${lockFilePath}`);\n }\n\n if (!lockFile.hash) {\n throw new Error(\n `Shrinkwrap file does not have a hash. This indicates linking to an old version of Rush.`\n );\n }\n\n try {\n const oldCacheFileContent: string = await FileSystem.readFileAsync(cacheFilePath);\n const oldCache: IExtendedResolverCacheFile = JSON.parse(oldCacheFileContent);\n if (oldCache.version === RESOLVER_CACHE_FILE_VERSION && oldCache.shrinkwrapHash === lockFile.hash) {\n // Cache is valid, use it\n return;\n }\n } catch (err) {\n // Ignore\n }\n\n const projectByImporterPath: LookupByPath<RushConfigurationProject> =\n rushConfiguration.getProjectLookupForRoot(workspaceRoot);\n\n const subPackageCacheFilePath: string = `${workspaceRoot}/subpackage-entry-cache.json`;\n\n terminal.writeLine(`Resolver cache will be written at ${cacheFilePath}`);\n\n let oldSubPackagesByIntegrity: Map<string, string[] | boolean> | undefined;\n const subPackagesByIntegrity: Map<string, string[] | boolean> = new Map();\n try {\n const cacheContent: string = await FileSystem.readFileAsync(subPackageCacheFilePath);\n const cacheJson: INestedPackageJsonCache = JSON.parse(cacheContent);\n if (cacheJson.version !== RESOLVER_CACHE_FILE_VERSION) {\n terminal.writeLine(\n `Expected subpackage cache version ${RESOLVER_CACHE_FILE_VERSION}, got ${cacheJson.version}`\n );\n } else {\n oldSubPackagesByIntegrity = new Map(cacheJson.subPackagesByIntegrity);\n terminal.writeLine(`Loaded subpackage cache from ${subPackageCacheFilePath}`);\n }\n } catch (err) {\n // Ignore\n }\n\n async function afterExternalPackagesAsync(\n contexts: Map<string, IResolverContext>,\n missingOptionalDependencies: Set<string>\n ): Promise<void> {\n /**\n * Loads the index file from the pnpm store to discover nested package.json files in an external package\n * For internal packages, assumes there are no nested package.json files.\n * @param context - The context to find nested package.json files for\n * @returns A promise that resolves to the nested package.json paths, false if the package fails to load, or true if the package has no nested package.json files.\n */\n async function tryFindNestedPackageJsonsForContextAsync(\n context: IResolverContext\n ): Promise<string[] | boolean> {\n const { descriptionFileRoot, descriptionFileHash } = context;\n\n if (descriptionFileHash === undefined) {\n // Assume this package has no nested package json files for now.\n terminal.writeDebugLine(\n `Package at ${descriptionFileRoot} does not have a file list. Assuming no nested \"package.json\" files.`\n );\n return true;\n }\n\n // Convert an integrity hash like\n // sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw==\n // To its hex representation, e.g.\n // 0baba219027e1ade11c875d762dfaff5ff92375bfcdf1ebc511c20c4d43df1cbc7f24c62bb2c1618fe1778d675a5a3b367adda6377137220844093455258e52f\n const prefixIndex: number = descriptionFileHash.indexOf('-');\n const hash: string = Buffer.from(descriptionFileHash.slice(prefixIndex + 1), 'base64').toString('hex');\n\n // The pnpm store directory has index files of package contents at paths:\n // <store>/v3/files/<hash (0-2)>/<hash (2-)>-index.json\n // See https://github.com/pnpm/pnpm/blob/f394cfccda7bc519ceee8c33fc9b68a0f4235532/store/cafs/src/getFilePathInCafs.ts#L33\n const indexPath: string = `${pnpmStoreDir}${hash.slice(0, 2)}/${hash.slice(2)}-index.json`;\n\n try {\n const indexContent: string = await FileSystem.readFileAsync(indexPath);\n let endIndex: number = indexContent.lastIndexOf(END_TOKEN);\n if (endIndex > 0) {\n const nestedPackageDirs: string[] = [];\n do {\n const startIndex: number = indexContent.lastIndexOf('\"', endIndex);\n if (startIndex < 0) {\n throw new Error(\n `Malformed index file at ${indexPath}: missing starting quote for nested package.json path`\n );\n }\n const nestedPath: string = indexContent.slice(startIndex + 1, endIndex);\n nestedPackageDirs.push(nestedPath);\n endIndex = indexContent.lastIndexOf(END_TOKEN, startIndex - 1);\n } while (endIndex > 0);\n return nestedPackageDirs;\n }\n return true;\n } catch (error) {\n if (!context.optional) {\n throw new Error(\n `Error reading index file for: \"${context.descriptionFileRoot}\" (${descriptionFileHash}): ${error.toString()}`\n );\n }\n return false;\n }\n }\n /**\n * Loads the index file from the pnpm store to discover nested package.json files in an external package\n * For internal packages, assumes there are no nested package.json files.\n * @param context - The context to find nested package.json files for\n * @returns A promise that resolves when the nested package.json files are found, if applicable\n */\n async function findNestedPackageJsonsForContextAsync(context: IResolverContext): Promise<void> {\n const { descriptionFileRoot, descriptionFileHash } = context;\n\n if (descriptionFileHash === undefined) {\n // Assume this package has no nested package json files for now.\n terminal.writeDebugLine(\n `Package at ${descriptionFileRoot} does not have a file list. Assuming no nested \"package.json\" files.`\n );\n return;\n }\n\n let result: string[] | boolean | undefined =\n oldSubPackagesByIntegrity?.get(descriptionFileHash) ??\n subPackagesByIntegrity.get(descriptionFileHash);\n if (result === undefined) {\n result = await tryFindNestedPackageJsonsForContextAsync(context);\n }\n subPackagesByIntegrity.set(descriptionFileHash, result);\n if (result === true) {\n // Default case. Do nothing.\n } else if (result === false) {\n terminal.writeLine(`Trimming missing optional dependency at: ${descriptionFileRoot}`);\n contexts.delete(descriptionFileRoot);\n missingOptionalDependencies.add(descriptionFileRoot);\n } else {\n terminal.writeDebugLine(\n `Nested \"package.json\" files found for package at ${descriptionFileRoot}: ${result.join(', ')}`\n );\n // eslint-disable-next-line require-atomic-updates\n context.nestedPackageDirs = result;\n }\n }\n\n // For external packages, update the contexts with data from the pnpm store\n // This gives us the list of nested package.json files, as well as the actual package name\n // We could also cache package.json contents, but that proves to be inefficient.\n await Async.forEachAsync(contexts.values(), findNestedPackageJsonsForContextAsync, {\n concurrency: 20\n });\n }\n\n const rawCacheFile: IResolverCacheFile = await computeResolverCacheFromLockfileAsync({\n workspaceRoot,\n commonPrefixToTrim: rushRoot,\n platformInfo: getPlatformInfo(),\n projectByImporterPath,\n lockfile: lockFile,\n afterExternalPackagesAsync\n });\n\n const extendedCacheFile: IExtendedResolverCacheFile = {\n version: RESOLVER_CACHE_FILE_VERSION,\n shrinkwrapHash: lockFile.hash,\n ...rawCacheFile\n };\n\n const newSubPackageCache: INestedPackageJsonCache = {\n version: RESOLVER_CACHE_FILE_VERSION,\n subPackagesByIntegrity: Array.from(subPackagesByIntegrity)\n };\n const serializedSubpackageCache: string = JSON.stringify(newSubPackageCache);\n\n const serialized: string = JSON.stringify(extendedCacheFile);\n\n await Promise.all([\n FileSystem.writeFileAsync(cacheFilePath, serialized, {\n ensureFolderExists: true\n }),\n FileSystem.writeFileAsync(subPackageCacheFilePath, serializedSubpackageCache, {\n ensureFolderExists: true\n })\n ]);\n\n // Free the memory used by the lockfiles, since nothing should read the lockfile from this point on.\n PnpmShrinkwrapFile.clearCache();\n\n terminal.writeLine(`Resolver cache written.`);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"computeResolverCacheFromLockfileAsync.d.ts","sourceRoot":"","sources":["../src/computeResolverCacheFromLockfileAsync.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,KAAK,EAEV,kBAAkB,EACnB,MAAM,6CAA6C,CAAC;AAErD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,OAAO,CAAC,QAAQ,CAAC;IAC5B,GAAG,EAAE,OAAO,OAAO,CAAC,IAAI,CAAC;IACzB,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;CACxB;AAuED;;GAEG;AACH,MAAM,WAAW,wCAAwC;IACvD;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAC3B;;OAEG;IACH,YAAY,EAAE,aAAa,CAAC;IAC5B;;OAEG;IACH,qBAAqB,EAAE,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,EAAE,eAAe,CAAC,CAAC;IAChF;;OAEG;IACH,QAAQ,EAAE,kBAAkB,CAAC;IAC7B;;;;;;;OAOG;IACH,0BAA0B,CAAC,EAAE,CAC3B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,EACvC,2BAA2B,EAAE,GAAG,CAAC,MAAM,CAAC,KACrC,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB;AAWD;;;;GAIG;AACH,wBAAsB,qCAAqC,CACzD,MAAM,EAAE,wCAAwC,GAC/C,OAAO,CAAC,kBAAkB,CAAC,CAoH7B"}
1
+ {"version":3,"file":"computeResolverCacheFromLockfileAsync.d.ts","sourceRoot":"","sources":["../src/computeResolverCacheFromLockfileAsync.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,KAAK,EAEV,kBAAkB,EACnB,MAAM,6CAA6C,CAAC;AAErD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,OAAO,CAAC,QAAQ,CAAC;IAC5B,GAAG,EAAE,OAAO,OAAO,CAAC,IAAI,CAAC;IACzB,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;CACxB;AA8ED;;GAEG;AACH,MAAM,WAAW,wCAAwC;IACvD;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAC3B;;OAEG;IACH,YAAY,EAAE,aAAa,CAAC;IAC5B;;OAEG;IACH,qBAAqB,EAAE,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,EAAE,eAAe,CAAC,CAAC;IAChF;;OAEG;IACH,QAAQ,EAAE,kBAAkB,CAAC;IAC7B;;;;;;;OAOG;IACH,0BAA0B,CAAC,EAAE,CAC3B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,EACvC,2BAA2B,EAAE,GAAG,CAAC,MAAM,CAAC,KACrC,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB;AAWD;;;;GAIG;AACH,wBAAsB,qCAAqC,CACzD,MAAM,EAAE,wCAAwC,GAC/C,OAAO,CAAC,kBAAkB,CAAC,CAoH7B"}
@@ -19,10 +19,11 @@ function isPackageCompatible(pack, platformInfo) {
19
19
  }
20
20
  function extractBundledDependencies(contexts, context) {
21
21
  var _a;
22
- const { nestedPackageDirs } = context;
22
+ let { nestedPackageDirs } = context;
23
23
  if (!nestedPackageDirs) {
24
24
  return;
25
25
  }
26
+ let foundBundledDependencies = false;
26
27
  for (let i = nestedPackageDirs.length - 1; i >= 0; i--) {
27
28
  const nestedDir = nestedPackageDirs[i];
28
29
  if (!nestedDir.startsWith('node_modules/')) {
@@ -37,6 +38,12 @@ function extractBundledDependencies(contexts, context) {
37
38
  if (name.startsWith('.')) {
38
39
  continue;
39
40
  }
41
+ if (!foundBundledDependencies) {
42
+ foundBundledDependencies = true;
43
+ // Make a copy of the nestedPackageDirs array so that we don't mutate the version being
44
+ // saved into the subpackage index cache.
45
+ context.nestedPackageDirs = nestedPackageDirs = nestedPackageDirs.slice(0);
46
+ }
40
47
  // Remove this nested package from the list
41
48
  nestedPackageDirs.splice(i, 1);
42
49
  const remainder = index === -1 ? '' : nestedDir.slice(index + 1);
@@ -1 +1 @@
1
- {"version":3,"file":"computeResolverCacheFromLockfileAsync.js","sourceRoot":"","sources":["../src/computeResolverCacheFromLockfileAsync.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type { LookupByPath } from '@rushstack/rush-sdk';\nimport type { IPnpmShrinkwrapDependencyYaml } from '@rushstack/rush-sdk/lib/logic/pnpm/PnpmShrinkwrapFile';\nimport type {\n ISerializedResolveContext,\n IResolverCacheFile\n} from '@rushstack/webpack-workspace-resolve-plugin';\n\nimport type { PnpmShrinkwrapFile } from './externals';\nimport { getDescriptionFileRootFromKey, resolveDependencies, createContextSerializer } from './helpers';\nimport type { IResolverContext } from './types';\n\n/**\n * The only parts of a RushConfigurationProject needed by this tool.\n * Reduced for unit test typings.\n */\nexport interface IPartialRushProject {\n projectFolder: string;\n packageJson: {\n name: string;\n };\n}\n\nexport interface IPlatformInfo {\n os: typeof process.platform;\n cpu: typeof process.arch;\n libc: 'glibc' | 'musl';\n}\n\nfunction isPackageCompatible(\n pack: Pick<IPnpmShrinkwrapDependencyYaml, 'os' | 'cpu' | 'libc'>,\n platformInfo: IPlatformInfo\n): boolean {\n if (pack.os?.every((value) => value.toLowerCase() !== platformInfo.os)) {\n return false;\n }\n if (pack.cpu?.every((value) => value.toLowerCase() !== platformInfo.cpu)) {\n return false;\n }\n if (pack.libc?.every((value) => value.toLowerCase() !== platformInfo.libc)) {\n return false;\n }\n return true;\n}\n\nfunction extractBundledDependencies(\n contexts: Map<string, IResolverContext>,\n context: IResolverContext\n): void {\n const { nestedPackageDirs } = context;\n if (!nestedPackageDirs) {\n return;\n }\n\n for (let i: number = nestedPackageDirs.length - 1; i >= 0; i--) {\n const nestedDir: string = nestedPackageDirs[i];\n if (!nestedDir.startsWith('node_modules/')) {\n continue;\n }\n\n const isScoped: boolean = nestedDir.charAt(/* 'node_modules/'.length */ 13) === '@';\n let index: number = nestedDir.indexOf('/', 13);\n if (isScoped) {\n index = nestedDir.indexOf('/', index + 1);\n }\n\n const name: string = index === -1 ? nestedDir.slice(13) : nestedDir.slice(13, index);\n if (name.startsWith('.')) {\n continue;\n }\n\n // Remove this nested package from the list\n nestedPackageDirs.splice(i, 1);\n\n const remainder: string = index === -1 ? '' : nestedDir.slice(index + 1);\n const nestedRoot: string = `${context.descriptionFileRoot}/node_modules/${name}`;\n let nestedContext: IResolverContext | undefined = contexts.get(nestedRoot);\n if (!nestedContext) {\n nestedContext = {\n descriptionFileRoot: nestedRoot,\n descriptionFileHash: undefined,\n isProject: false,\n name,\n deps: new Map(),\n ordinal: -1\n };\n contexts.set(nestedRoot, nestedContext);\n }\n\n context.deps.set(name, nestedRoot);\n\n if (remainder) {\n nestedContext.nestedPackageDirs ??= [];\n nestedContext.nestedPackageDirs.push(remainder);\n }\n }\n}\n\n/**\n * Options for computing the resolver cache from a lockfile.\n */\nexport interface IComputeResolverCacheFromLockfileOptions {\n /**\n * The root folder of the workspace being installed\n */\n workspaceRoot: string;\n /**\n * The common root path to trim from the description file roots for brevity\n */\n commonPrefixToTrim: string;\n /**\n * Information about the platform Rush is running on\n */\n platformInfo: IPlatformInfo;\n /**\n * A lookup of projects by their importer path\n */\n projectByImporterPath: Pick<LookupByPath<IPartialRushProject>, 'findChildPath'>;\n /**\n * The lockfile to compute the cache from\n */\n lockfile: PnpmShrinkwrapFile;\n /**\n * A callback to process external packages after they have been enumerated.\n * Broken out as a separate function to facilitate testing without hitting the disk.\n * @remarks This is useful for fetching additional data from the pnpm store\n * @param contexts - The current context information per description file root\n * @param missingOptionalDependencies - The set of optional dependencies that were not installed\n * @returns A promise that resolves when the external packages have been processed\n */\n afterExternalPackagesAsync?: (\n contexts: Map<string, IResolverContext>,\n missingOptionalDependencies: Set<string>\n ) => Promise<void>;\n}\n\n/**\n * Copied from `@rushstack/node-core-library/src/Path.ts` to avoid expensive dependency\n * @param path - Path using backslashes as path separators\n * @returns The same string using forward slashes as path separators\n */\nfunction convertToSlashes(path: string): string {\n return path.replace(/\\\\/g, '/');\n}\n\n/**\n * Given a lockfile and information about the workspace and platform, computes the resolver cache file.\n * @param params - The options for computing the resolver cache\n * @returns A promise that resolves with the resolver cache file\n */\nexport async function computeResolverCacheFromLockfileAsync(\n params: IComputeResolverCacheFromLockfileOptions\n): Promise<IResolverCacheFile> {\n const { platformInfo, projectByImporterPath, lockfile, afterExternalPackagesAsync } = params;\n // Needs to be normalized to `/` for path.posix.join to work correctly\n const workspaceRoot: string = convertToSlashes(params.workspaceRoot);\n // Needs to be normalized to `/` for path.posix.join to work correctly\n const commonPrefixToTrim: string = convertToSlashes(params.commonPrefixToTrim);\n\n const contexts: Map<string, IResolverContext> = new Map();\n const missingOptionalDependencies: Set<string> = new Set();\n\n // Enumerate external dependencies first, to simplify looping over them for store data\n for (const [key, pack] of lockfile.packages) {\n let name: string | undefined = pack.name;\n const descriptionFileRoot: string = getDescriptionFileRootFromKey(workspaceRoot, key, name);\n\n // Skip optional dependencies that are incompatible with the current environment\n if (pack.optional && !isPackageCompatible(pack, platformInfo)) {\n missingOptionalDependencies.add(descriptionFileRoot);\n continue;\n }\n\n const integrity: string | undefined = pack.resolution?.integrity;\n\n if (!name && key.startsWith('/')) {\n const versionIndex: number = key.indexOf('@', 2);\n name = key.slice(1, versionIndex);\n }\n\n if (!name) {\n throw new Error(`Missing name for ${key}`);\n }\n\n const context: IResolverContext = {\n descriptionFileRoot,\n descriptionFileHash: integrity,\n isProject: false,\n name,\n deps: new Map(),\n ordinal: -1,\n optional: pack.optional\n };\n\n contexts.set(descriptionFileRoot, context);\n\n if (pack.dependencies) {\n resolveDependencies(workspaceRoot, pack.dependencies, context);\n }\n if (pack.optionalDependencies) {\n resolveDependencies(workspaceRoot, pack.optionalDependencies, context);\n }\n }\n\n if (afterExternalPackagesAsync) {\n await afterExternalPackagesAsync(contexts, missingOptionalDependencies);\n }\n\n for (const context of contexts.values()) {\n if (context.nestedPackageDirs) {\n extractBundledDependencies(contexts, context);\n }\n }\n\n // Add the data for workspace projects\n for (const [importerPath, importer] of lockfile.importers) {\n // Ignore the root project. This plugin assumes you don't have one.\n // A non-empty root project results in global dependency hoisting, and that's bad for strictness.\n if (importerPath === '.') {\n continue;\n }\n\n const project: IPartialRushProject | undefined = projectByImporterPath.findChildPath(importerPath);\n if (!project) {\n throw new Error(`Missing project for importer ${importerPath}`);\n }\n\n const descriptionFileRoot: string = convertToSlashes(project.projectFolder);\n\n const context: IResolverContext = {\n descriptionFileRoot,\n descriptionFileHash: undefined, // Not needed anymore\n name: project.packageJson.name,\n isProject: true,\n deps: new Map(),\n ordinal: -1\n };\n\n contexts.set(descriptionFileRoot, context);\n\n if (importer.dependencies) {\n resolveDependencies(workspaceRoot, importer.dependencies, context);\n }\n if (importer.devDependencies) {\n resolveDependencies(workspaceRoot, importer.devDependencies, context);\n }\n if (importer.optionalDependencies) {\n resolveDependencies(workspaceRoot, importer.optionalDependencies, context);\n }\n }\n\n let ordinal: number = 0;\n for (const context of contexts.values()) {\n context.ordinal = ordinal++;\n }\n\n // Convert the intermediate representation to the final cache file\n const serializedContexts: ISerializedResolveContext[] = Array.from(\n contexts,\n createContextSerializer(missingOptionalDependencies, contexts, commonPrefixToTrim)\n );\n\n const cacheFile: IResolverCacheFile = {\n basePath: commonPrefixToTrim,\n contexts: serializedContexts\n };\n\n return cacheFile;\n}\n"]}
1
+ {"version":3,"file":"computeResolverCacheFromLockfileAsync.js","sourceRoot":"","sources":["../src/computeResolverCacheFromLockfileAsync.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type { LookupByPath } from '@rushstack/rush-sdk';\nimport type { IPnpmShrinkwrapDependencyYaml } from '@rushstack/rush-sdk/lib/logic/pnpm/PnpmShrinkwrapFile';\nimport type {\n ISerializedResolveContext,\n IResolverCacheFile\n} from '@rushstack/webpack-workspace-resolve-plugin';\n\nimport type { PnpmShrinkwrapFile } from './externals';\nimport { getDescriptionFileRootFromKey, resolveDependencies, createContextSerializer } from './helpers';\nimport type { IResolverContext } from './types';\n\n/**\n * The only parts of a RushConfigurationProject needed by this tool.\n * Reduced for unit test typings.\n */\nexport interface IPartialRushProject {\n projectFolder: string;\n packageJson: {\n name: string;\n };\n}\n\nexport interface IPlatformInfo {\n os: typeof process.platform;\n cpu: typeof process.arch;\n libc: 'glibc' | 'musl';\n}\n\nfunction isPackageCompatible(\n pack: Pick<IPnpmShrinkwrapDependencyYaml, 'os' | 'cpu' | 'libc'>,\n platformInfo: IPlatformInfo\n): boolean {\n if (pack.os?.every((value) => value.toLowerCase() !== platformInfo.os)) {\n return false;\n }\n if (pack.cpu?.every((value) => value.toLowerCase() !== platformInfo.cpu)) {\n return false;\n }\n if (pack.libc?.every((value) => value.toLowerCase() !== platformInfo.libc)) {\n return false;\n }\n return true;\n}\n\nfunction extractBundledDependencies(\n contexts: Map<string, IResolverContext>,\n context: IResolverContext\n): void {\n let { nestedPackageDirs } = context;\n if (!nestedPackageDirs) {\n return;\n }\n\n let foundBundledDependencies: boolean = false;\n for (let i: number = nestedPackageDirs.length - 1; i >= 0; i--) {\n const nestedDir: string = nestedPackageDirs[i];\n if (!nestedDir.startsWith('node_modules/')) {\n continue;\n }\n\n const isScoped: boolean = nestedDir.charAt(/* 'node_modules/'.length */ 13) === '@';\n let index: number = nestedDir.indexOf('/', 13);\n if (isScoped) {\n index = nestedDir.indexOf('/', index + 1);\n }\n\n const name: string = index === -1 ? nestedDir.slice(13) : nestedDir.slice(13, index);\n if (name.startsWith('.')) {\n continue;\n }\n\n if (!foundBundledDependencies) {\n foundBundledDependencies = true;\n // Make a copy of the nestedPackageDirs array so that we don't mutate the version being\n // saved into the subpackage index cache.\n context.nestedPackageDirs = nestedPackageDirs = nestedPackageDirs.slice(0);\n }\n // Remove this nested package from the list\n nestedPackageDirs.splice(i, 1);\n\n const remainder: string = index === -1 ? '' : nestedDir.slice(index + 1);\n const nestedRoot: string = `${context.descriptionFileRoot}/node_modules/${name}`;\n let nestedContext: IResolverContext | undefined = contexts.get(nestedRoot);\n if (!nestedContext) {\n nestedContext = {\n descriptionFileRoot: nestedRoot,\n descriptionFileHash: undefined,\n isProject: false,\n name,\n deps: new Map(),\n ordinal: -1\n };\n contexts.set(nestedRoot, nestedContext);\n }\n\n context.deps.set(name, nestedRoot);\n\n if (remainder) {\n nestedContext.nestedPackageDirs ??= [];\n nestedContext.nestedPackageDirs.push(remainder);\n }\n }\n}\n\n/**\n * Options for computing the resolver cache from a lockfile.\n */\nexport interface IComputeResolverCacheFromLockfileOptions {\n /**\n * The root folder of the workspace being installed\n */\n workspaceRoot: string;\n /**\n * The common root path to trim from the description file roots for brevity\n */\n commonPrefixToTrim: string;\n /**\n * Information about the platform Rush is running on\n */\n platformInfo: IPlatformInfo;\n /**\n * A lookup of projects by their importer path\n */\n projectByImporterPath: Pick<LookupByPath<IPartialRushProject>, 'findChildPath'>;\n /**\n * The lockfile to compute the cache from\n */\n lockfile: PnpmShrinkwrapFile;\n /**\n * A callback to process external packages after they have been enumerated.\n * Broken out as a separate function to facilitate testing without hitting the disk.\n * @remarks This is useful for fetching additional data from the pnpm store\n * @param contexts - The current context information per description file root\n * @param missingOptionalDependencies - The set of optional dependencies that were not installed\n * @returns A promise that resolves when the external packages have been processed\n */\n afterExternalPackagesAsync?: (\n contexts: Map<string, IResolverContext>,\n missingOptionalDependencies: Set<string>\n ) => Promise<void>;\n}\n\n/**\n * Copied from `@rushstack/node-core-library/src/Path.ts` to avoid expensive dependency\n * @param path - Path using backslashes as path separators\n * @returns The same string using forward slashes as path separators\n */\nfunction convertToSlashes(path: string): string {\n return path.replace(/\\\\/g, '/');\n}\n\n/**\n * Given a lockfile and information about the workspace and platform, computes the resolver cache file.\n * @param params - The options for computing the resolver cache\n * @returns A promise that resolves with the resolver cache file\n */\nexport async function computeResolverCacheFromLockfileAsync(\n params: IComputeResolverCacheFromLockfileOptions\n): Promise<IResolverCacheFile> {\n const { platformInfo, projectByImporterPath, lockfile, afterExternalPackagesAsync } = params;\n // Needs to be normalized to `/` for path.posix.join to work correctly\n const workspaceRoot: string = convertToSlashes(params.workspaceRoot);\n // Needs to be normalized to `/` for path.posix.join to work correctly\n const commonPrefixToTrim: string = convertToSlashes(params.commonPrefixToTrim);\n\n const contexts: Map<string, IResolverContext> = new Map();\n const missingOptionalDependencies: Set<string> = new Set();\n\n // Enumerate external dependencies first, to simplify looping over them for store data\n for (const [key, pack] of lockfile.packages) {\n let name: string | undefined = pack.name;\n const descriptionFileRoot: string = getDescriptionFileRootFromKey(workspaceRoot, key, name);\n\n // Skip optional dependencies that are incompatible with the current environment\n if (pack.optional && !isPackageCompatible(pack, platformInfo)) {\n missingOptionalDependencies.add(descriptionFileRoot);\n continue;\n }\n\n const integrity: string | undefined = pack.resolution?.integrity;\n\n if (!name && key.startsWith('/')) {\n const versionIndex: number = key.indexOf('@', 2);\n name = key.slice(1, versionIndex);\n }\n\n if (!name) {\n throw new Error(`Missing name for ${key}`);\n }\n\n const context: IResolverContext = {\n descriptionFileRoot,\n descriptionFileHash: integrity,\n isProject: false,\n name,\n deps: new Map(),\n ordinal: -1,\n optional: pack.optional\n };\n\n contexts.set(descriptionFileRoot, context);\n\n if (pack.dependencies) {\n resolveDependencies(workspaceRoot, pack.dependencies, context);\n }\n if (pack.optionalDependencies) {\n resolveDependencies(workspaceRoot, pack.optionalDependencies, context);\n }\n }\n\n if (afterExternalPackagesAsync) {\n await afterExternalPackagesAsync(contexts, missingOptionalDependencies);\n }\n\n for (const context of contexts.values()) {\n if (context.nestedPackageDirs) {\n extractBundledDependencies(contexts, context);\n }\n }\n\n // Add the data for workspace projects\n for (const [importerPath, importer] of lockfile.importers) {\n // Ignore the root project. This plugin assumes you don't have one.\n // A non-empty root project results in global dependency hoisting, and that's bad for strictness.\n if (importerPath === '.') {\n continue;\n }\n\n const project: IPartialRushProject | undefined = projectByImporterPath.findChildPath(importerPath);\n if (!project) {\n throw new Error(`Missing project for importer ${importerPath}`);\n }\n\n const descriptionFileRoot: string = convertToSlashes(project.projectFolder);\n\n const context: IResolverContext = {\n descriptionFileRoot,\n descriptionFileHash: undefined, // Not needed anymore\n name: project.packageJson.name,\n isProject: true,\n deps: new Map(),\n ordinal: -1\n };\n\n contexts.set(descriptionFileRoot, context);\n\n if (importer.dependencies) {\n resolveDependencies(workspaceRoot, importer.dependencies, context);\n }\n if (importer.devDependencies) {\n resolveDependencies(workspaceRoot, importer.devDependencies, context);\n }\n if (importer.optionalDependencies) {\n resolveDependencies(workspaceRoot, importer.optionalDependencies, context);\n }\n }\n\n let ordinal: number = 0;\n for (const context of contexts.values()) {\n context.ordinal = ordinal++;\n }\n\n // Convert the intermediate representation to the final cache file\n const serializedContexts: ISerializedResolveContext[] = Array.from(\n contexts,\n createContextSerializer(missingOptionalDependencies, contexts, commonPrefixToTrim)\n );\n\n const cacheFile: IResolverCacheFile = {\n basePath: commonPrefixToTrim,\n contexts: serializedContexts\n };\n\n return cacheFile;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"externals.d.ts","sourceRoot":"","sources":["../src/externals.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,IAAI,aAAa,EAAE,eAAe,IAAI,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC9G,OAAO,KAAK,EAAE,kBAAkB,IAAI,sBAAsB,EAAE,MAAM,uDAAuD,CAAC;AAO1H,QAAA,MAAQ,SAAS,wBAAE,eAAe,4BAA4B,CAAC;AAE/D,KAAK,SAAS,GAAG,aAAa,CAAC;AAE/B,KAAK,eAAe,GAAG,mBAAmB,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;AAgBtC,eAAO,MAAQ,kBAAkB,+BAEyB,CAAC;AAE3D,MAAM,MAAM,kBAAkB,GAAG,sBAAsB,CAAC;AAGxD,eAAO,MAAQ,KAAK,+DAEnB,CAAC;AACF,eAAO,MAAQ,UAAU,yEAExB,CAAC"}
1
+ {"version":3,"file":"externals.d.ts","sourceRoot":"","sources":["../src/externals.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,IAAI,aAAa,EAAE,eAAe,IAAI,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC9G,OAAO,KAAK,EAAE,kBAAkB,IAAI,sBAAsB,EAAE,MAAM,uDAAuD,CAAC;AAO1H,QAAA,MAAQ,SAAS,wBAAE,eAAe,4BAA4B,CAAC;AAE/D,KAAK,SAAS,GAAG,aAAa,CAAC;AAE/B,KAAK,eAAe,GAAG,mBAAmB,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;AAmBtC,eAAO,MAAQ,kBAAkB,+BAEyB,CAAC;AAE3D,MAAM,MAAM,kBAAkB,GAAG,sBAAsB,CAAC;AAGxD,eAAO,MAAQ,KAAK,+DAEnB,CAAC;AACF,eAAO,MAAQ,UAAU,yEAExB,CAAC"}
package/lib/externals.js CHANGED
@@ -8,17 +8,19 @@ exports.Operation = Operation;
8
8
  exports.OperationStatus = OperationStatus;
9
9
  // Support this plugin being webpacked.
10
10
  const req = typeof __non_webpack_require__ === 'function' ? __non_webpack_require__ : require;
11
- const entryModule = req.main;
12
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
- function getExternal(name) {
11
+ const rushLibPath = process.env._RUSH_LIB_PATH;
12
+ function importDependency(name) {
13
+ if (!rushLibPath) {
14
+ throw new Error(`_RUSH_LIB_PATH variable is not set, cannot resolve rush-lib.`);
15
+ }
14
16
  const externalPath = req.resolve(name, {
15
- paths: entryModule === null || entryModule === void 0 ? void 0 : entryModule.paths
17
+ paths: [rushLibPath]
16
18
  });
17
19
  return req(externalPath);
18
20
  }
19
21
  // Private Rush APIs
20
- exports.PnpmShrinkwrapFile = getExternal('@microsoft/rush-lib/lib/logic/pnpm/PnpmShrinkwrapFile').PnpmShrinkwrapFile;
22
+ exports.PnpmShrinkwrapFile = importDependency('@microsoft/rush-lib/lib/logic/pnpm/PnpmShrinkwrapFile').PnpmShrinkwrapFile;
21
23
  // Avoid bundling expensive stuff that's already part of Rush.
22
- exports.Async = getExternal(`@rushstack/node-core-library/lib/Async`).Async;
23
- exports.FileSystem = getExternal(`@rushstack/node-core-library/lib/FileSystem`).FileSystem;
24
+ exports.Async = importDependency(`@rushstack/node-core-library/lib/Async`).Async;
25
+ exports.FileSystem = importDependency(`@rushstack/node-core-library/lib/FileSystem`).FileSystem;
24
26
  //# sourceMappingURL=externals.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"externals.js","sourceRoot":"","sources":["../src/externals.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAY3D,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,uBAAuB,CAAC;AAMtD,8BAAS;AAAE,0CAAe;AAEnC,uCAAuC;AACvC,MAAM,GAAG,GAAmB,OAAO,uBAAuB,KAAK,UAAU,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO,CAAC;AAE9G,MAAM,WAAW,GAAuB,GAAG,CAAC,IAAI,CAAC;AACjD,8DAA8D;AAC9D,SAAS,WAAW,CAAgB,IAAY;IAC9C,MAAM,YAAY,GAAW,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;QAC7C,KAAK,EAAE,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,KAAK;KAC1B,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC,YAAY,CAAC,CAAC;AAC3B,CAAC;AAED,oBAAoB;AACL,0BAAkB,GAAK,WAAW,CAE/C,uDAAuD,CAAC,oBAAC;AAI3D,8DAA8D;AAC/C,aAAK,GAAK,WAAW,CAClC,wCAAwC,CACzC,OAAC;AACa,kBAAU,GAAK,WAAW,CACvC,6CAA6C,CAC9C,YAAC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type Module from 'node:module';\n\nimport type { Operation as OperationType, OperationStatus as OperationStatusType } from '@rushstack/rush-sdk';\nimport type { PnpmShrinkwrapFile as PnpmShrinkwrapFileType } from '@rushstack/rush-sdk/lib/logic/pnpm/PnpmShrinkwrapFile';\nimport type * as rushSdkType from '@rushstack/rush-sdk';\n\n// Ultra-cheap \"I am a Rush plugin\" import of rush-lib\n// eslint-disable-next-line @typescript-eslint/naming-convention\ndeclare const ___rush___rushLibModule: typeof rushSdkType;\n\nconst { Operation, OperationStatus } = ___rush___rushLibModule;\n// eslint-disable-next-line @typescript-eslint/no-redeclare\ntype Operation = OperationType;\n// eslint-disable-next-line @typescript-eslint/no-redeclare\ntype OperationStatus = OperationStatusType;\n\nexport { Operation, OperationStatus };\n\n// Support this plugin being webpacked.\nconst req: typeof require = typeof __non_webpack_require__ === 'function' ? __non_webpack_require__ : require;\n\nconst entryModule: Module | undefined = req.main;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getExternal<TResult = any>(name: string): TResult {\n const externalPath: string = req.resolve(name, {\n paths: entryModule?.paths\n });\n\n return req(externalPath);\n}\n\n// Private Rush APIs\nexport const { PnpmShrinkwrapFile } = getExternal<\n typeof import('@rushstack/rush-sdk/lib/logic/pnpm/PnpmShrinkwrapFile')\n>('@microsoft/rush-lib/lib/logic/pnpm/PnpmShrinkwrapFile');\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport type PnpmShrinkwrapFile = PnpmShrinkwrapFileType;\n\n// Avoid bundling expensive stuff that's already part of Rush.\nexport const { Async } = getExternal<typeof import('@rushstack/node-core-library/lib/Async')>(\n `@rushstack/node-core-library/lib/Async`\n);\nexport const { FileSystem } = getExternal<typeof import('@rushstack/node-core-library/lib/FileSystem')>(\n `@rushstack/node-core-library/lib/FileSystem`\n);\n"]}
1
+ {"version":3,"file":"externals.js","sourceRoot":"","sources":["../src/externals.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAU3D,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,uBAAuB,CAAC;AAMtD,8BAAS;AAAE,0CAAe;AAEnC,uCAAuC;AACvC,MAAM,GAAG,GAAmB,OAAO,uBAAuB,KAAK,UAAU,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO,CAAC;AAE9G,MAAM,WAAW,GAAuB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AAEnE,SAAS,gBAAgB,CAAU,IAAY;IAC7C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,YAAY,GAAW,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;QAC7C,KAAK,EAAE,CAAC,WAAW,CAAC;KACrB,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC,YAAY,CAAC,CAAC;AAC3B,CAAC;AAED,oBAAoB;AACL,0BAAkB,GAAK,gBAAgB,CAEpD,uDAAuD,CAAC,oBAAC;AAI3D,8DAA8D;AAC/C,aAAK,GAAK,gBAAgB,CACvC,wCAAwC,CACzC,OAAC;AACa,kBAAU,GAAK,gBAAgB,CAC5C,6CAA6C,CAC9C,YAAC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type { Operation as OperationType, OperationStatus as OperationStatusType } from '@rushstack/rush-sdk';\nimport type { PnpmShrinkwrapFile as PnpmShrinkwrapFileType } from '@rushstack/rush-sdk/lib/logic/pnpm/PnpmShrinkwrapFile';\nimport type * as rushSdkType from '@rushstack/rush-sdk';\n\n// Ultra-cheap \"I am a Rush plugin\" import of rush-lib\n// eslint-disable-next-line @typescript-eslint/naming-convention\ndeclare const ___rush___rushLibModule: typeof rushSdkType;\n\nconst { Operation, OperationStatus } = ___rush___rushLibModule;\n// eslint-disable-next-line @typescript-eslint/no-redeclare\ntype Operation = OperationType;\n// eslint-disable-next-line @typescript-eslint/no-redeclare\ntype OperationStatus = OperationStatusType;\n\nexport { Operation, OperationStatus };\n\n// Support this plugin being webpacked.\nconst req: typeof require = typeof __non_webpack_require__ === 'function' ? __non_webpack_require__ : require;\n\nconst rushLibPath: string | undefined = process.env._RUSH_LIB_PATH;\n\nfunction importDependency<TResult>(name: string): TResult {\n if (!rushLibPath) {\n throw new Error(`_RUSH_LIB_PATH variable is not set, cannot resolve rush-lib.`);\n }\n const externalPath: string = req.resolve(name, {\n paths: [rushLibPath]\n });\n\n return req(externalPath);\n}\n\n// Private Rush APIs\nexport const { PnpmShrinkwrapFile } = importDependency<\n typeof import('@rushstack/rush-sdk/lib/logic/pnpm/PnpmShrinkwrapFile')\n>('@microsoft/rush-lib/lib/logic/pnpm/PnpmShrinkwrapFile');\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport type PnpmShrinkwrapFile = PnpmShrinkwrapFileType;\n\n// Avoid bundling expensive stuff that's already part of Rush.\nexport const { Async } = importDependency<typeof import('@rushstack/node-core-library/lib/Async')>(\n `@rushstack/node-core-library/lib/Async`\n);\nexport const { FileSystem } = importDependency<typeof import('@rushstack/node-core-library/lib/FileSystem')>(\n `@rushstack/node-core-library/lib/FileSystem`\n);\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rushstack/rush-resolver-cache-plugin",
3
- "version": "5.158.0",
3
+ "version": "5.158.1-pr5355.0",
4
4
  "description": "A Rush plugin that generates a resolver cache file after successful install.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -11,17 +11,17 @@
11
11
  "main": "lib-commonjs/index.js",
12
12
  "types": "dist/rush-resolver-cache-plugin.d.ts",
13
13
  "dependencies": {
14
- "@rushstack/rush-sdk": "5.158.0"
14
+ "@rushstack/rush-sdk": "5.158.1-pr5355.0"
15
15
  },
16
16
  "devDependencies": {
17
17
  "@types/webpack-env": "1.18.8",
18
18
  "eslint": "~9.25.1",
19
- "@rushstack/node-core-library": "5.14.0",
20
- "@rushstack/terminal": "0.15.4",
21
- "@rushstack/lookup-by-path": "0.7.4",
22
- "@rushstack/webpack-workspace-resolve-plugin": "0.4.28",
19
+ "@rushstack/lookup-by-path": "0.7.6",
20
+ "@rushstack/node-core-library": "5.14.0-pr5355.0",
23
21
  "local-node-rig": "1.0.0",
24
- "@rushstack/heft": "0.74.3"
22
+ "@rushstack/heft": "0.74.5",
23
+ "@rushstack/terminal": "0.16.0",
24
+ "@rushstack/webpack-workspace-resolve-plugin": "0.4.30"
25
25
  },
26
26
  "exports": {
27
27
  ".": {