@ms-cloudpack/package-utilities 2.4.4 → 3.0.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.
Files changed (60) hide show
  1. package/lib/createImportMap.d.ts +1 -1
  2. package/lib/createImportMap.d.ts.map +1 -1
  3. package/lib/createImportMap.js.map +1 -1
  4. package/lib/createResolveMap/PackageMap.d.ts +7 -0
  5. package/lib/createResolveMap/PackageMap.d.ts.map +1 -0
  6. package/lib/createResolveMap/PackageMap.js +2 -0
  7. package/lib/createResolveMap/PackageMap.js.map +1 -0
  8. package/lib/createResolveMap/ResolveMap.d.ts +3 -0
  9. package/lib/createResolveMap/ResolveMap.d.ts.map +1 -0
  10. package/lib/createResolveMap/ResolveMap.js +2 -0
  11. package/lib/createResolveMap/ResolveMap.js.map +1 -0
  12. package/lib/createResolveMap/ResolveMapEntry.d.ts +13 -0
  13. package/lib/createResolveMap/ResolveMapEntry.d.ts.map +1 -0
  14. package/lib/createResolveMap/ResolveMapEntry.js +2 -0
  15. package/lib/createResolveMap/ResolveMapEntry.js.map +1 -0
  16. package/lib/createResolveMap/addLinkedEntryDependencies.d.ts +15 -0
  17. package/lib/createResolveMap/addLinkedEntryDependencies.d.ts.map +1 -0
  18. package/lib/createResolveMap/addLinkedEntryDependencies.js +66 -0
  19. package/lib/createResolveMap/addLinkedEntryDependencies.js.map +1 -0
  20. package/lib/createResolveMap/convertToResolveMap.d.ts +10 -0
  21. package/lib/createResolveMap/convertToResolveMap.d.ts.map +1 -0
  22. package/lib/createResolveMap/convertToResolveMap.js +25 -0
  23. package/lib/createResolveMap/convertToResolveMap.js.map +1 -0
  24. package/lib/createResolveMap/createResolveMap.d.ts +21 -0
  25. package/lib/createResolveMap/createResolveMap.d.ts.map +1 -0
  26. package/lib/createResolveMap/createResolveMap.js +31 -0
  27. package/lib/createResolveMap/createResolveMap.js.map +1 -0
  28. package/lib/createResolveMap/detachEntry.d.ts +10 -0
  29. package/lib/createResolveMap/detachEntry.d.ts.map +1 -0
  30. package/lib/createResolveMap/detachEntry.js +32 -0
  31. package/lib/createResolveMap/detachEntry.js.map +1 -0
  32. package/lib/createResolveMap/entrySorter.d.ts +6 -0
  33. package/lib/createResolveMap/entrySorter.d.ts.map +1 -0
  34. package/lib/createResolveMap/entrySorter.js +16 -0
  35. package/lib/createResolveMap/entrySorter.js.map +1 -0
  36. package/lib/createResolveMap/findPackagesFromPath.d.ts +32 -0
  37. package/lib/createResolveMap/findPackagesFromPath.d.ts.map +1 -0
  38. package/lib/createResolveMap/findPackagesFromPath.js +101 -0
  39. package/lib/createResolveMap/findPackagesFromPath.js.map +1 -0
  40. package/lib/createResolveMap/linkPath.d.ts +12 -0
  41. package/lib/createResolveMap/linkPath.d.ts.map +1 -0
  42. package/lib/createResolveMap/linkPath.js +54 -0
  43. package/lib/createResolveMap/linkPath.js.map +1 -0
  44. package/lib/findPackagePath.d.ts +11 -1
  45. package/lib/findPackagePath.d.ts.map +1 -1
  46. package/lib/findPackagePath.js +7 -4
  47. package/lib/findPackagePath.js.map +1 -1
  48. package/lib/findResolveMapEntry.d.ts +4 -2
  49. package/lib/findResolveMapEntry.d.ts.map +1 -1
  50. package/lib/findResolveMapEntry.js +16 -4
  51. package/lib/findResolveMapEntry.js.map +1 -1
  52. package/lib/index.d.ts +3 -2
  53. package/lib/index.d.ts.map +1 -1
  54. package/lib/index.js +1 -1
  55. package/lib/index.js.map +1 -1
  56. package/package.json +4 -2
  57. package/lib/createResolveMap.d.ts +0 -20
  58. package/lib/createResolveMap.d.ts.map +0 -1
  59. package/lib/createResolveMap.js +0 -88
  60. package/lib/createResolveMap.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import type { PackageDefinitionsCache } from '@ms-cloudpack/bundler-types';
2
- import type { ResolveMap } from './createResolveMap.js';
2
+ import type { ResolveMap } from './createResolveMap/ResolveMap.js';
3
3
  export interface ImportMap {
4
4
  imports: Record<string, string>;
5
5
  scopes?: Record<string, Record<string, string>>;
@@ -1 +1 @@
1
- {"version":3,"file":"createImportMap.d.ts","sourceRoot":"","sources":["../src/createImportMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,uBAAuB,CAAC;AAQzE,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACjD;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,MAAM,EACvB,OAAO,GAAE;IACP,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC,GACL,OAAO,CAAC,SAAS,CAAC,CAkCpB"}
1
+ {"version":3,"file":"createImportMap.d.ts","sourceRoot":"","sources":["../src/createImportMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AASnE,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACjD;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,MAAM,EACvB,OAAO,GAAE;IACP,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC,GACL,OAAO,CAAC,SAAS,CAAC,CAkCpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"createImportMap.js","sourceRoot":"","sources":["../src/createImportMap.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PackageDefinitionsCache } from '@ms-cloudpack/bundler-types';\nimport type { ResolveMap, ResolveMapEntry } from './createResolveMap.js';\nimport { PackageDefinitions } from './PackageDefinitions.js';\nimport { merge } from 'merge';\nimport { flattenExportsMap } from './flattenExportsMap.js';\nimport path from 'path';\nimport { getExportsMap } from './getExportsMap.js';\nimport { isExternalPackage } from './isExternalPackage.js';\n\nexport interface ImportMap {\n imports: Record<string, string>;\n scopes?: Record<string, Record<string, string>>;\n}\n\n/**\n * Given a resolve ma and a bundleServerUrl, returns an import map to be used in the browser.\n */\nexport async function createImportMap(\n resolveMap: ResolveMap,\n bundleServerUrl: string,\n options: {\n sessionVersion?: number;\n packages?: PackageDefinitionsCache;\n targetVersions?: Record<string, number>;\n } = {},\n): Promise<ImportMap> {\n const { packages = PackageDefinitions.getInstance(), sessionVersion = 0, targetVersions } = options;\n const importMap: ImportMap = {\n imports: {},\n };\n\n for (const resolveEntry of Object.values(resolveMap)) {\n merge(\n importMap.imports,\n await getImportMapFromEntry(resolveEntry, bundleServerUrl, packages, sessionVersion, targetVersions),\n );\n\n if (resolveEntry.scopedVersions) {\n // Initialize scopes\n importMap.scopes ??= {};\n\n for (const scopedEntry of Object.values(resolveEntry.scopedVersions)) {\n const importMapForEntry = await getImportMapFromEntry(\n scopedEntry,\n bundleServerUrl,\n packages,\n sessionVersion,\n targetVersions,\n );\n\n for (const requiredById of Object.keys(scopedEntry.requiredBy)) {\n const scopes = (importMap.scopes[`${bundleServerUrl}/${requiredById}/`] ??= {});\n merge(scopes, importMapForEntry);\n }\n }\n }\n }\n\n return importMap;\n}\n\nasync function getImportMapFromEntry(\n entry: ResolveMapEntry,\n bundleServerUrl: string,\n packages: PackageDefinitionsCache,\n sessionVersion: number,\n targetVersions?: Record<string, number>,\n): Promise<Record<string, string>> {\n const importMap: Record<string, string> = {};\n const definition = await packages.get(entry.path);\n const exportsMap = await getExportsMap(entry.path, { packages });\n\n if (\n !definition ||\n !definition.name ||\n !definition.version ||\n !exportsMap ||\n Object.keys(exportsMap).length === 0 ||\n definition.name.startsWith('@types/')\n ) {\n return importMap;\n }\n\n // Get both the unbundled entries from the exports map\n const unbundledExportsMap = flattenExportsMap(exportsMap, {\n conditions: ['browser-esm'],\n requiredConditions: ['browser-esm'],\n });\n const bundledExportsMap = flattenExportsMap(exportsMap);\n const packagePrefix = `${definition.name}@${definition.version}/`;\n const baseUrl = `${bundleServerUrl}/${packagePrefix}`;\n\n // Add the bundled entries to the import map, but prefer unbundled if the entry exists.\n for (const [importPath, bundledFilePath] of Object.entries(bundledExportsMap)) {\n const isExternal = isExternalPackage(entry.path);\n const unbundledFilePath = isExternal ? unbundledExportsMap[importPath] : undefined;\n let resolvedFilePath = unbundledFilePath ? `unbundled/${unbundledFilePath}` : `bundled/${bundledFilePath}`;\n const targetVersion = targetVersions?.[entry.path];\n const cacheBuster = `v${sessionVersion ?? 0}${targetVersion ? `.${targetVersion}` : ''}/`;\n\n resolvedFilePath = `${cacheBuster}${resolvedFilePath}`;\n const ext = path.extname(resolvedFilePath);\n\n // For bundled files:\n if (!unbundledFilePath) {\n // Ignore .d.ts entries\n if (resolvedFilePath.endsWith('.d.ts')) {\n continue;\n }\n\n // We always expect responses to come back as javascript (.js extensions.)\n if (ext !== '.js') {\n resolvedFilePath = path.join(\n path.dirname(resolvedFilePath),\n path.basename(resolvedFilePath, ext) + (ext === '.mjs' ? '.js' : ext + '.js'),\n );\n }\n\n // Plus signs should be replaced with underscores.\n resolvedFilePath = resolvedFilePath.replace(/\\+/g, '_');\n }\n\n importMap[importPath.replace('.', `${definition.name}`)] = new URL(resolvedFilePath, baseUrl).href;\n }\n\n // Finally add a fallback for all other unexpected bundle entries. (Note, this should point to a script\n // which logs this as an error to the user and offers a way to add the entry to exports overrides.)\n // importMap[definition.name + '/'] = baseUrl + 'missing/';\n\n return importMap;\n}\n"]}
1
+ {"version":3,"file":"createImportMap.js","sourceRoot":"","sources":["../src/createImportMap.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PackageDefinitionsCache } from '@ms-cloudpack/bundler-types';\nimport type { ResolveMap } from './createResolveMap/ResolveMap.js';\nimport type { ResolveMapEntry } from './createResolveMap/ResolveMapEntry.js';\nimport { PackageDefinitions } from './PackageDefinitions.js';\nimport { merge } from 'merge';\nimport { flattenExportsMap } from './flattenExportsMap.js';\nimport path from 'path';\nimport { getExportsMap } from './getExportsMap.js';\nimport { isExternalPackage } from './isExternalPackage.js';\n\nexport interface ImportMap {\n imports: Record<string, string>;\n scopes?: Record<string, Record<string, string>>;\n}\n\n/**\n * Given a resolve ma and a bundleServerUrl, returns an import map to be used in the browser.\n */\nexport async function createImportMap(\n resolveMap: ResolveMap,\n bundleServerUrl: string,\n options: {\n sessionVersion?: number;\n packages?: PackageDefinitionsCache;\n targetVersions?: Record<string, number>;\n } = {},\n): Promise<ImportMap> {\n const { packages = PackageDefinitions.getInstance(), sessionVersion = 0, targetVersions } = options;\n const importMap: ImportMap = {\n imports: {},\n };\n\n for (const resolveEntry of Object.values(resolveMap)) {\n merge(\n importMap.imports,\n await getImportMapFromEntry(resolveEntry, bundleServerUrl, packages, sessionVersion, targetVersions),\n );\n\n if (resolveEntry.scopedVersions) {\n // Initialize scopes\n importMap.scopes ??= {};\n\n for (const scopedEntry of Object.values(resolveEntry.scopedVersions)) {\n const importMapForEntry = await getImportMapFromEntry(\n scopedEntry,\n bundleServerUrl,\n packages,\n sessionVersion,\n targetVersions,\n );\n\n for (const requiredById of Object.keys(scopedEntry.requiredBy)) {\n const scopes = (importMap.scopes[`${bundleServerUrl}/${requiredById}/`] ??= {});\n merge(scopes, importMapForEntry);\n }\n }\n }\n }\n\n return importMap;\n}\n\nasync function getImportMapFromEntry(\n entry: ResolveMapEntry,\n bundleServerUrl: string,\n packages: PackageDefinitionsCache,\n sessionVersion: number,\n targetVersions?: Record<string, number>,\n): Promise<Record<string, string>> {\n const importMap: Record<string, string> = {};\n const definition = await packages.get(entry.path);\n const exportsMap = await getExportsMap(entry.path, { packages });\n\n if (\n !definition ||\n !definition.name ||\n !definition.version ||\n !exportsMap ||\n Object.keys(exportsMap).length === 0 ||\n definition.name.startsWith('@types/')\n ) {\n return importMap;\n }\n\n // Get both the unbundled entries from the exports map\n const unbundledExportsMap = flattenExportsMap(exportsMap, {\n conditions: ['browser-esm'],\n requiredConditions: ['browser-esm'],\n });\n const bundledExportsMap = flattenExportsMap(exportsMap);\n const packagePrefix = `${definition.name}@${definition.version}/`;\n const baseUrl = `${bundleServerUrl}/${packagePrefix}`;\n\n // Add the bundled entries to the import map, but prefer unbundled if the entry exists.\n for (const [importPath, bundledFilePath] of Object.entries(bundledExportsMap)) {\n const isExternal = isExternalPackage(entry.path);\n const unbundledFilePath = isExternal ? unbundledExportsMap[importPath] : undefined;\n let resolvedFilePath = unbundledFilePath ? `unbundled/${unbundledFilePath}` : `bundled/${bundledFilePath}`;\n const targetVersion = targetVersions?.[entry.path];\n const cacheBuster = `v${sessionVersion ?? 0}${targetVersion ? `.${targetVersion}` : ''}/`;\n\n resolvedFilePath = `${cacheBuster}${resolvedFilePath}`;\n const ext = path.extname(resolvedFilePath);\n\n // For bundled files:\n if (!unbundledFilePath) {\n // Ignore .d.ts entries\n if (resolvedFilePath.endsWith('.d.ts')) {\n continue;\n }\n\n // We always expect responses to come back as javascript (.js extensions.)\n if (ext !== '.js') {\n resolvedFilePath = path.join(\n path.dirname(resolvedFilePath),\n path.basename(resolvedFilePath, ext) + (ext === '.mjs' ? '.js' : ext + '.js'),\n );\n }\n\n // Plus signs should be replaced with underscores.\n resolvedFilePath = resolvedFilePath.replace(/\\+/g, '_');\n }\n\n importMap[importPath.replace('.', `${definition.name}`)] = new URL(resolvedFilePath, baseUrl).href;\n }\n\n // Finally add a fallback for all other unexpected bundle entries. (Note, this should point to a script\n // which logs this as an error to the user and offers a way to add the entry to exports overrides.)\n // importMap[definition.name + '/'] = baseUrl + 'missing/';\n\n return importMap;\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import type { ResolveMapEntry } from './ResolveMapEntry.js';
2
+ export type PackageMap = {
3
+ [name: string]: {
4
+ [version: string]: ResolveMapEntry;
5
+ };
6
+ };
7
+ //# sourceMappingURL=PackageMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackageMap.d.ts","sourceRoot":"","sources":["../../src/createResolveMap/PackageMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,MAAM,UAAU,GAAG;IACvB,CAAC,IAAI,EAAE,MAAM,GAAG;QACd,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAAC;KACpC,CAAC;CACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=PackageMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackageMap.js","sourceRoot":"","sources":["../../src/createResolveMap/PackageMap.ts"],"names":[],"mappings":"","sourcesContent":["import type { ResolveMapEntry } from './ResolveMapEntry.js';\n\nexport type PackageMap = {\n [name: string]: {\n [version: string]: ResolveMapEntry;\n };\n};\n"]}
@@ -0,0 +1,3 @@
1
+ import type { ResolveMapEntry } from './ResolveMapEntry.js';
2
+ export type ResolveMap = Record<string, ResolveMapEntry>;
3
+ //# sourceMappingURL=ResolveMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResolveMap.d.ts","sourceRoot":"","sources":["../../src/createResolveMap/ResolveMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ResolveMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResolveMap.js","sourceRoot":"","sources":["../../src/createResolveMap/ResolveMap.ts"],"names":[],"mappings":"","sourcesContent":["import type { ResolveMapEntry } from './ResolveMapEntry.js';\n\nexport type ResolveMap = Record<string, ResolveMapEntry>;\n"]}
@@ -0,0 +1,13 @@
1
+ export type ResolveMapEntry = {
2
+ name: string;
3
+ version: string;
4
+ path: string;
5
+ dependencies: Record<string, string>;
6
+ requiredBy: Record<`${string}@${string}`, string>;
7
+ isLinked?: boolean;
8
+ isExternal?: boolean;
9
+ scopedVersions?: {
10
+ [version: string]: ResolveMapEntry;
11
+ };
12
+ };
13
+ //# sourceMappingURL=ResolveMapEntry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResolveMapEntry.d.ts","sourceRoot":"","sources":["../../src/createResolveMap/ResolveMapEntry.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IAEb,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC,GAAG,MAAM,IAAI,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC;IAElD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,cAAc,CAAC,EAAE;QACf,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAAC;KACpC,CAAC;CACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ResolveMapEntry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResolveMapEntry.js","sourceRoot":"","sources":["../../src/createResolveMap/ResolveMapEntry.ts"],"names":[],"mappings":"","sourcesContent":["export type ResolveMapEntry = {\n name: string;\n version: string;\n path: string;\n\n dependencies: Record<string, string>;\n requiredBy: Record<`${string}@${string}`, string>;\n\n isLinked?: boolean;\n isExternal?: boolean;\n\n scopedVersions?: {\n [version: string]: ResolveMapEntry;\n };\n};\n"]}
@@ -0,0 +1,15 @@
1
+ import { PackageDefinitions } from '../PackageDefinitions.js';
2
+ import type { ResolveMapEntry } from './ResolveMapEntry.js';
3
+ import type { PackageMap } from './PackageMap.js';
4
+ /**
5
+ * Given a linkedEntry, iterates through dependencies to ensure they are added to the packageMap,
6
+ * preferring packageMap dependencies over linkedMap dependencies.
7
+ * @param options
8
+ */
9
+ export declare function addLinkedEntryDependencies(options: {
10
+ appMap: PackageMap;
11
+ linkMap: PackageMap;
12
+ linkedEntry: ResolveMapEntry;
13
+ packages?: PackageDefinitions;
14
+ }): Promise<void>;
15
+ //# sourceMappingURL=addLinkedEntryDependencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addLinkedEntryDependencies.d.ts","sourceRoot":"","sources":["../../src/createResolveMap/addLinkedEntryDependencies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlD;;;;GAIG;AAEH,wBAAsB,0BAA0B,CAAC,OAAO,EAAE;IACxD,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,UAAU,CAAC;IACpB,WAAW,EAAE,eAAe,CAAC;IAC7B,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CAC/B,iBAiEA"}
@@ -0,0 +1,66 @@
1
+ import { PackageDefinitions } from '../PackageDefinitions.js';
2
+ import { satisfies } from 'semver';
3
+ /**
4
+ * Given a linkedEntry, iterates through dependencies to ensure they are added to the packageMap,
5
+ * preferring packageMap dependencies over linkedMap dependencies.
6
+ * @param options
7
+ */
8
+ export async function addLinkedEntryDependencies(options) {
9
+ const { appMap, linkMap, linkedEntry, packages = PackageDefinitions.getInstance() } = options;
10
+ const { name, version, dependencies } = linkedEntry;
11
+ const linkDefinition = await packages.get(linkedEntry.path);
12
+ const versionRequirements = {
13
+ ...(linkDefinition?.dependencies || {}),
14
+ ...(linkDefinition?.peerDependencies || {}),
15
+ };
16
+ // Iterate through the dependencies of the linked package.
17
+ for (const [dependencyName, linkedDependencyVersion] of Object.entries(dependencies)) {
18
+ const appVersions = appMap[dependencyName];
19
+ const versionRequirement = versionRequirements[dependencyName];
20
+ let isSatisfied = false;
21
+ if (!appVersions) {
22
+ // The app does not have any version of this dependency, we need to bring over the version
23
+ // used by the linkedEntry.
24
+ const dependencyEntry = linkMap[dependencyName]?.[linkedDependencyVersion];
25
+ appMap[dependencyName] = { [dependencyEntry.isExternal ? linkedDependencyVersion : '*']: dependencyEntry };
26
+ dependencyEntry.requiredBy = { [`${name}@${version}`]: versionRequirement };
27
+ if (!dependencyEntry.isExternal) {
28
+ dependencyEntry.isLinked = true;
29
+ dependencyEntry.version = '*';
30
+ }
31
+ // Recursive through the dependency's dependencies.
32
+ await addLinkedEntryDependencies({ appMap, linkMap, linkedEntry: dependencyEntry, packages });
33
+ isSatisfied = true;
34
+ }
35
+ else {
36
+ // We have at least 1 or more versions of this dependency already. If a sufficient version
37
+ // of the dependency is already in the appMap, we we just need to update the linkedEntry's
38
+ // dependency and the dependency's requiredBy record for the parent.
39
+ const appDependencyVersions = appMap[dependencyName];
40
+ for (const appDependencyEntry of Object.values(appDependencyVersions)) {
41
+ if (satisfies(appDependencyEntry.version, versionRequirement)) {
42
+ linkedEntry.dependencies[dependencyName] = appDependencyEntry.version;
43
+ appDependencyEntry.requiredBy[`${name}@${version}`] = versionRequirement;
44
+ await addLinkedEntryDependencies({ appMap, linkMap, linkedEntry: appDependencyEntry, packages });
45
+ isSatisfied = true;
46
+ break;
47
+ }
48
+ }
49
+ }
50
+ if (!isSatisfied) {
51
+ // We have at least 1 version of this dependency but nothing satisfies the requirement. We
52
+ // need to introduce a duplicate. During the final pass, we will remove non-required deps.
53
+ const dependencyEntry = linkMap[dependencyName]?.[linkedDependencyVersion];
54
+ appMap[dependencyName][linkedDependencyVersion] = dependencyEntry;
55
+ linkedEntry.dependencies[dependencyName] = linkedDependencyVersion;
56
+ dependencyEntry.requiredBy = { [`${name}@${linkedEntry.isExternal ? version : '*'}`]: versionRequirement };
57
+ if (!dependencyEntry.isExternal) {
58
+ dependencyEntry.isLinked = true;
59
+ dependencyEntry.version = '*';
60
+ }
61
+ // Recursive through the dependency's dependencies.
62
+ await addLinkedEntryDependencies({ appMap, linkMap, linkedEntry: dependencyEntry, packages });
63
+ }
64
+ }
65
+ }
66
+ //# sourceMappingURL=addLinkedEntryDependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addLinkedEntryDependencies.js","sourceRoot":"","sources":["../../src/createResolveMap/addLinkedEntryDependencies.ts"],"names":[],"mappings":"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","sourcesContent":["import { PackageDefinitions } from '../PackageDefinitions.js';\nimport type { ResolveMapEntry } from './ResolveMapEntry.js';\nimport type { PackageMap } from './PackageMap.js';\nimport { satisfies } from 'semver';\n\n/**\n * Given a linkedEntry, iterates through dependencies to ensure they are added to the packageMap,\n * preferring packageMap dependencies over linkedMap dependencies.\n * @param options\n */\n\nexport async function addLinkedEntryDependencies(options: {\n appMap: PackageMap;\n linkMap: PackageMap;\n linkedEntry: ResolveMapEntry;\n packages?: PackageDefinitions;\n}) {\n const { appMap, linkMap, linkedEntry, packages = PackageDefinitions.getInstance() } = options;\n const { name, version, dependencies } = linkedEntry;\n const linkDefinition = await packages.get(linkedEntry.path);\n const versionRequirements = {\n ...(linkDefinition?.dependencies || {}),\n ...(linkDefinition?.peerDependencies || {}),\n };\n\n // Iterate through the dependencies of the linked package.\n for (const [dependencyName, linkedDependencyVersion] of Object.entries(dependencies)) {\n const appVersions = appMap[dependencyName];\n const versionRequirement = versionRequirements[dependencyName] as string;\n let isSatisfied = false;\n\n if (!appVersions) {\n // The app does not have any version of this dependency, we need to bring over the version\n // used by the linkedEntry.\n const dependencyEntry = linkMap[dependencyName]?.[linkedDependencyVersion];\n appMap[dependencyName] = { [dependencyEntry.isExternal ? linkedDependencyVersion : '*']: dependencyEntry };\n dependencyEntry.requiredBy = { [`${name}@${version}`]: versionRequirement };\n\n if (!dependencyEntry.isExternal) {\n dependencyEntry.isLinked = true;\n dependencyEntry.version = '*';\n }\n\n // Recursive through the dependency's dependencies.\n await addLinkedEntryDependencies({ appMap, linkMap, linkedEntry: dependencyEntry, packages });\n isSatisfied = true;\n } else {\n // We have at least 1 or more versions of this dependency already. If a sufficient version\n // of the dependency is already in the appMap, we we just need to update the linkedEntry's\n // dependency and the dependency's requiredBy record for the parent.\n const appDependencyVersions = appMap[dependencyName];\n\n for (const appDependencyEntry of Object.values(appDependencyVersions)) {\n if (satisfies(appDependencyEntry.version, versionRequirement)) {\n linkedEntry.dependencies[dependencyName] = appDependencyEntry.version;\n appDependencyEntry.requiredBy[`${name}@${version}`] = versionRequirement;\n\n await addLinkedEntryDependencies({ appMap, linkMap, linkedEntry: appDependencyEntry, packages });\n isSatisfied = true;\n break;\n }\n }\n }\n\n if (!isSatisfied) {\n // We have at least 1 version of this dependency but nothing satisfies the requirement. We\n // need to introduce a duplicate. During the final pass, we will remove non-required deps.\n const dependencyEntry = linkMap[dependencyName]?.[linkedDependencyVersion];\n appMap[dependencyName][linkedDependencyVersion] = dependencyEntry;\n linkedEntry.dependencies[dependencyName] = linkedDependencyVersion;\n dependencyEntry.requiredBy = { [`${name}@${linkedEntry.isExternal ? version : '*'}`]: versionRequirement };\n\n if (!dependencyEntry.isExternal) {\n dependencyEntry.isLinked = true;\n dependencyEntry.version = '*';\n }\n\n // Recursive through the dependency's dependencies.\n await addLinkedEntryDependencies({ appMap, linkMap, linkedEntry: dependencyEntry, packages });\n }\n }\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import type { ResolveMap } from './ResolveMap.js';
2
+ import type { PackageMap } from './PackageMap.js';
3
+ /**
4
+ * Given a PackageMap and all root paths (appPath and linked paths), returns a ResolveMap.
5
+ */
6
+ export declare function convertToResolveMap(options: {
7
+ appMap: PackageMap;
8
+ paths: string[];
9
+ }): ResolveMap;
10
+ //# sourceMappingURL=convertToResolveMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convertToResolveMap.d.ts","sourceRoot":"","sources":["../../src/createResolveMap/convertToResolveMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,UAAU,CAsBhG"}
@@ -0,0 +1,25 @@
1
+ import { entrySorter } from './entrySorter.js';
2
+ /**
3
+ * Given a PackageMap and all root paths (appPath and linked paths), returns a ResolveMap.
4
+ */
5
+ export function convertToResolveMap(options) {
6
+ const { paths, appMap } = options;
7
+ const resolveMap = {};
8
+ for (const [packageName, packageEntries] of Object.entries(appMap)) {
9
+ // Filter to root packages and packages which are required by other packages.
10
+ const sortedPackageEntries = Object.values(packageEntries)
11
+ .filter((e) => paths.indexOf(e.path) >= 0 || Object.keys(e.requiredBy).length)
12
+ .sort(entrySorter);
13
+ // Get the sorted package entries based on the most to least requiredBy references. This
14
+ // ends up reducing the size of the resolve map by minimizing scoped cases.
15
+ if (sortedPackageEntries.length) {
16
+ const entry = (resolveMap[packageName] = sortedPackageEntries[0]);
17
+ // Update scoped versions (version to resolve map entry)
18
+ if (sortedPackageEntries.length > 1) {
19
+ entry.scopedVersions = Object.fromEntries(sortedPackageEntries.slice(1).map((entry) => [entry.version, entry]));
20
+ }
21
+ }
22
+ }
23
+ return resolveMap;
24
+ }
25
+ //# sourceMappingURL=convertToResolveMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convertToResolveMap.js","sourceRoot":"","sources":["../../src/createResolveMap/convertToResolveMap.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAgD;IAClF,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAClC,MAAM,UAAU,GAAe,EAAE,CAAC;IAElC,KAAK,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QAClE,6EAA6E;QAC7E,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC;aACvD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;aAC7E,IAAI,CAAC,WAAW,CAAC,CAAC;QACrB,wFAAwF;QACxF,2EAA2E;QAC3E,IAAI,oBAAoB,CAAC,MAAM,EAAE;YAC/B,MAAM,KAAK,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;YAElE,wDAAwD;YACxD,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnC,KAAK,CAAC,cAAc,GAAG,MAAM,CAAC,WAAW,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;aACjH;SACF;KACF;IAED,OAAO,UAAU,CAAC;AACpB,CAAC","sourcesContent":["import type { ResolveMap } from './ResolveMap.js';\nimport type { PackageMap } from './PackageMap.js';\nimport { entrySorter } from './entrySorter.js';\n\n/**\n * Given a PackageMap and all root paths (appPath and linked paths), returns a ResolveMap.\n */\nexport function convertToResolveMap(options: { appMap: PackageMap; paths: string[] }): ResolveMap {\n const { paths, appMap } = options;\n const resolveMap: ResolveMap = {};\n\n for (const [packageName, packageEntries] of Object.entries(appMap)) {\n // Filter to root packages and packages which are required by other packages.\n const sortedPackageEntries = Object.values(packageEntries)\n .filter((e) => paths.indexOf(e.path) >= 0 || Object.keys(e.requiredBy).length)\n .sort(entrySorter);\n // Get the sorted package entries based on the most to least requiredBy references. This\n // ends up reducing the size of the resolve map by minimizing scoped cases.\n if (sortedPackageEntries.length) {\n const entry = (resolveMap[packageName] = sortedPackageEntries[0]);\n\n // Update scoped versions (version to resolve map entry)\n if (sortedPackageEntries.length > 1) {\n entry.scopedVersions = Object.fromEntries(sortedPackageEntries.slice(1).map((entry) => [entry.version, entry]));\n }\n }\n }\n\n return resolveMap;\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import { PackageDefinitions } from '../PackageDefinitions.js';
2
+ import type { ResolveMap } from './ResolveMap.js';
3
+ /**
4
+ * Create a resolve map for a given app path. We do this by walking the dependency tree
5
+ * of the app to build a map of all packages and their dependencies. We then sort the
6
+ * dependencies by the number of other packages that depend on them. The package with the
7
+ * most dependencies is considered the dominant version and is the one that will be used
8
+ * by the bundler. Once this has been resolved, linkedPaths are evaluated separately by
9
+ * discovering their dependencies and redirecting any existing dependencies to the linked
10
+ * package. Transitive dependencies of the linked package are validated and any dependencies
11
+ * which aren't already in the resolve map are added as scoped versions.
12
+ */
13
+ export declare function createResolveMap(options: {
14
+ appPath: string;
15
+ additionalPaths?: string[];
16
+ linkedPaths?: string[];
17
+ gitRootPath?: string;
18
+ useStrictVersioning?: boolean;
19
+ packages?: PackageDefinitions;
20
+ }): Promise<ResolveMap>;
21
+ //# sourceMappingURL=createResolveMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createResolveMap.d.ts","sourceRoot":"","sources":["../../src/createResolveMap/createResolveMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAKlD;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CAC/B,GAAG,OAAO,CAAC,UAAU,CAAC,CAyBtB"}
@@ -0,0 +1,31 @@
1
+ import { PackageDefinitions } from '../PackageDefinitions.js';
2
+ import { findPackagesFromPath } from './findPackagesFromPath.js';
3
+ import { convertToResolveMap } from './convertToResolveMap.js';
4
+ import { linkPath } from './linkPath.js';
5
+ /**
6
+ * Create a resolve map for a given app path. We do this by walking the dependency tree
7
+ * of the app to build a map of all packages and their dependencies. We then sort the
8
+ * dependencies by the number of other packages that depend on them. The package with the
9
+ * most dependencies is considered the dominant version and is the one that will be used
10
+ * by the bundler. Once this has been resolved, linkedPaths are evaluated separately by
11
+ * discovering their dependencies and redirecting any existing dependencies to the linked
12
+ * package. Transitive dependencies of the linked package are validated and any dependencies
13
+ * which aren't already in the resolve map are added as scoped versions.
14
+ */
15
+ export async function createResolveMap(options) {
16
+ const { appPath, additionalPaths = [], linkedPaths = [], useStrictVersioning, packages = PackageDefinitions.getInstance(), gitRootPath, } = options;
17
+ // First we discover the dependencies for the app.
18
+ const appMap = await findPackagesFromPath({
19
+ paths: [appPath, ...additionalPaths],
20
+ packages,
21
+ gitRootPath,
22
+ useStrictVersioning,
23
+ });
24
+ // Next, we iterate through linked paths to inject them into the packageMap.
25
+ for (const linkedPath of linkedPaths) {
26
+ await linkPath({ linkedPath, appMap, packages });
27
+ }
28
+ // Finally we condense into a resolve map.
29
+ return convertToResolveMap({ appMap, paths: [appPath, ...additionalPaths] });
30
+ }
31
+ //# sourceMappingURL=createResolveMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createResolveMap.js","sourceRoot":"","sources":["../../src/createResolveMap/createResolveMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAOtC;IACC,MAAM,EACJ,OAAO,EACP,eAAe,GAAG,EAAE,EACpB,WAAW,GAAG,EAAE,EAChB,mBAAmB,EACnB,QAAQ,GAAG,kBAAkB,CAAC,WAAW,EAAE,EAC3C,WAAW,GACZ,GAAG,OAAO,CAAC;IAEZ,kDAAkD;IAClD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC;QACxC,KAAK,EAAE,CAAC,OAAO,EAAE,GAAG,eAAe,CAAC;QACpC,QAAQ;QACR,WAAW;QACX,mBAAmB;KACpB,CAAC,CAAC;IAEH,4EAA4E;IAC5E,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;QACpC,MAAM,QAAQ,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;KAClD;IAED,0CAA0C;IAC1C,OAAO,mBAAmB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;AAC/E,CAAC","sourcesContent":["import { PackageDefinitions } from '../PackageDefinitions.js';\nimport type { ResolveMap } from './ResolveMap.js';\nimport { findPackagesFromPath } from './findPackagesFromPath.js';\nimport { convertToResolveMap } from './convertToResolveMap.js';\nimport { linkPath } from './linkPath.js';\n\n/**\n * Create a resolve map for a given app path. We do this by walking the dependency tree\n * of the app to build a map of all packages and their dependencies. We then sort the\n * dependencies by the number of other packages that depend on them. The package with the\n * most dependencies is considered the dominant version and is the one that will be used\n * by the bundler. Once this has been resolved, linkedPaths are evaluated separately by\n * discovering their dependencies and redirecting any existing dependencies to the linked\n * package. Transitive dependencies of the linked package are validated and any dependencies\n * which aren't already in the resolve map are added as scoped versions.\n */\nexport async function createResolveMap(options: {\n appPath: string;\n additionalPaths?: string[];\n linkedPaths?: string[];\n gitRootPath?: string;\n useStrictVersioning?: boolean;\n packages?: PackageDefinitions;\n}): Promise<ResolveMap> {\n const {\n appPath,\n additionalPaths = [],\n linkedPaths = [],\n useStrictVersioning,\n packages = PackageDefinitions.getInstance(),\n gitRootPath,\n } = options;\n\n // First we discover the dependencies for the app.\n const appMap = await findPackagesFromPath({\n paths: [appPath, ...additionalPaths],\n packages,\n gitRootPath,\n useStrictVersioning,\n });\n\n // Next, we iterate through linked paths to inject them into the packageMap.\n for (const linkedPath of linkedPaths) {\n await linkPath({ linkedPath, appMap, packages });\n }\n\n // Finally we condense into a resolve map.\n return convertToResolveMap({ appMap, paths: [appPath, ...additionalPaths] });\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import type { ResolveMapEntry } from './ResolveMapEntry.js';
2
+ import type { PackageMap } from './PackageMap.js';
3
+ /**
4
+ * Removes requiredBy references for an entry being removed.
5
+ */
6
+ export declare function detachEntry(options: {
7
+ appMap: PackageMap;
8
+ entry: ResolveMapEntry;
9
+ }): void;
10
+ //# sourceMappingURL=detachEntry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detachEntry.d.ts","sourceRoot":"","sources":["../../src/createResolveMap/detachEntry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;GAEG;AAEH,wBAAgB,WAAW,CAAC,OAAO,EAAE;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,QAgClF"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Removes requiredBy references for an entry being removed.
3
+ */
4
+ export function detachEntry(options) {
5
+ const { appMap, entry } = options;
6
+ const dependenciesToDetach = [entry];
7
+ while (dependenciesToDetach.length) {
8
+ const entry = dependenciesToDetach.pop();
9
+ const { name, version, requiredBy } = entry;
10
+ if (appMap[name]?.[version]) {
11
+ // Disconnect the entry from consumers.
12
+ for (const requiredByName of Object.keys(requiredBy)) {
13
+ const [parentName, parentVersion] = requiredByName.split('@');
14
+ const parentEntry = appMap[parentName]?.[parentVersion];
15
+ if (parentEntry) {
16
+ delete parentEntry.dependencies[name];
17
+ }
18
+ }
19
+ // Disconnect dependencies from the entry.
20
+ for (const [dependencyName, dependencyVersion] of Object.entries(entry.dependencies)) {
21
+ const dependencyEntry = appMap[dependencyName]?.[dependencyVersion];
22
+ if (dependencyEntry) {
23
+ delete dependencyEntry.requiredBy[`${name}@${version}`];
24
+ if (Object.keys(dependencyEntry.requiredBy).length === 0) {
25
+ dependenciesToDetach.push(dependencyEntry);
26
+ }
27
+ }
28
+ }
29
+ }
30
+ }
31
+ }
32
+ //# sourceMappingURL=detachEntry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detachEntry.js","sourceRoot":"","sources":["../../src/createResolveMap/detachEntry.ts"],"names":[],"mappings":"AAGA;;GAEG;AAEH,MAAM,UAAU,WAAW,CAAC,OAAuD;IACjF,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAClC,MAAM,oBAAoB,GAAsB,CAAC,KAAK,CAAC,CAAC;IAExD,OAAO,oBAAoB,CAAC,MAAM,EAAE;QAClC,MAAM,KAAK,GAAG,oBAAoB,CAAC,GAAG,EAAqB,CAAC;QAC5D,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;QAE5C,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;YAC3B,uCAAuC;YACvC,KAAK,MAAM,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;gBACpD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC9D,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;gBAExD,IAAI,WAAW,EAAE;oBACf,OAAO,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;iBACvC;aACF;YAED,0CAA0C;YAC1C,KAAK,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE;gBACpF,MAAM,eAAe,GAAG,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC;gBAEpE,IAAI,eAAe,EAAE;oBACnB,OAAO,eAAe,CAAC,UAAU,CAAC,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;oBACxD,IAAI,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;wBACxD,oBAAoB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;qBAC5C;iBACF;aACF;SACF;KACF;AACH,CAAC","sourcesContent":["import type { ResolveMapEntry } from './ResolveMapEntry.js';\nimport type { PackageMap } from './PackageMap.js';\n\n/**\n * Removes requiredBy references for an entry being removed.\n */\n\nexport function detachEntry(options: { appMap: PackageMap; entry: ResolveMapEntry }) {\n const { appMap, entry } = options;\n const dependenciesToDetach: ResolveMapEntry[] = [entry];\n\n while (dependenciesToDetach.length) {\n const entry = dependenciesToDetach.pop() as ResolveMapEntry;\n const { name, version, requiredBy } = entry;\n\n if (appMap[name]?.[version]) {\n // Disconnect the entry from consumers.\n for (const requiredByName of Object.keys(requiredBy)) {\n const [parentName, parentVersion] = requiredByName.split('@');\n const parentEntry = appMap[parentName]?.[parentVersion];\n\n if (parentEntry) {\n delete parentEntry.dependencies[name];\n }\n }\n\n // Disconnect dependencies from the entry.\n for (const [dependencyName, dependencyVersion] of Object.entries(entry.dependencies)) {\n const dependencyEntry = appMap[dependencyName]?.[dependencyVersion];\n\n if (dependencyEntry) {\n delete dependencyEntry.requiredBy[`${name}@${version}`];\n if (Object.keys(dependencyEntry.requiredBy).length === 0) {\n dependenciesToDetach.push(dependencyEntry);\n }\n }\n }\n }\n }\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import type { ResolveMapEntry } from './ResolveMapEntry.js';
2
+ /**
3
+ * Returns the array of entries, sorted by most required.
4
+ */
5
+ export declare function entrySorter(a: ResolveMapEntry, b: ResolveMapEntry): 1 | -1;
6
+ //# sourceMappingURL=entrySorter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entrySorter.d.ts","sourceRoot":"","sources":["../../src/createResolveMap/entrySorter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D;;GAEG;AAEH,wBAAgB,WAAW,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,eAAe,UAajE"}
@@ -0,0 +1,16 @@
1
+ import { gt } from 'semver';
2
+ /**
3
+ * Returns the array of entries, sorted by most required.
4
+ */
5
+ export function entrySorter(a, b) {
6
+ const aRequiredBy = Object.keys(a.requiredBy).length;
7
+ const bRequiredBy = Object.keys(b.requiredBy).length;
8
+ if (aRequiredBy > bRequiredBy) {
9
+ return -1;
10
+ }
11
+ if (aRequiredBy < bRequiredBy) {
12
+ return 1;
13
+ }
14
+ return gt(a.version, b.version) ? -1 : 1;
15
+ }
16
+ //# sourceMappingURL=entrySorter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entrySorter.js","sourceRoot":"","sources":["../../src/createResolveMap/entrySorter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE5B;;GAEG;AAEH,MAAM,UAAU,WAAW,CAAC,CAAkB,EAAE,CAAkB;IAChE,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;IACrD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;IAErD,IAAI,WAAW,GAAG,WAAW,EAAE;QAC7B,OAAO,CAAC,CAAC,CAAC;KACX;IAED,IAAI,WAAW,GAAG,WAAW,EAAE;QAC7B,OAAO,CAAC,CAAC;KACV;IAED,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC","sourcesContent":["import type { ResolveMapEntry } from './ResolveMapEntry.js';\nimport { gt } from 'semver';\n\n/**\n * Returns the array of entries, sorted by most required.\n */\n\nexport function entrySorter(a: ResolveMapEntry, b: ResolveMapEntry) {\n const aRequiredBy = Object.keys(a.requiredBy).length;\n const bRequiredBy = Object.keys(b.requiredBy).length;\n\n if (aRequiredBy > bRequiredBy) {\n return -1;\n }\n\n if (aRequiredBy < bRequiredBy) {\n return 1;\n }\n\n return gt(a.version, b.version) ? -1 : 1;\n}\n"]}
@@ -0,0 +1,32 @@
1
+ import { PackageDefinitions } from '../PackageDefinitions.js';
2
+ import type { PackageMap } from './PackageMap.js';
3
+ /**
4
+ * Find all packages from a given path. We do this by walking the dependency tree
5
+ * of the app to build a map of all packages and their dependencies.
6
+ */
7
+ export declare function findPackagesFromPath(options: {
8
+ /**
9
+ * Paths to search for package.json files and traverse their dependencies to build a PackageMap.
10
+ */
11
+ paths: string[];
12
+ /**
13
+ * Package cache.
14
+ */
15
+ packages?: PackageDefinitions;
16
+ /**
17
+ * Where to stop looking for packages. If not specified, will look for a git root. If one is not
18
+ * found, will use the first path in the paths array.
19
+ */
20
+ gitRootPath?: string;
21
+ /**
22
+ * If true will check semver requirements for all dependencies. Note that if the workspace
23
+ * uses resolutions to force a particular version of a dependency, this could cause a failure.
24
+ * TODO: read resolutions from package.json and use them to allow mismatches.
25
+ **/
26
+ useStrictVersioning?: boolean;
27
+ /**
28
+ * If true will glob for all package.json files in the path and add them to the map.
29
+ **/
30
+ discoverPackages?: boolean;
31
+ }): Promise<PackageMap>;
32
+ //# sourceMappingURL=findPackagesFromPath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findPackagesFromPath.d.ts","sourceRoot":"","sources":["../../src/createResolveMap/findPackagesFromPath.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlD;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE;IAClD;;OAEG;IACH,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhB;;OAEG;IACH,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAE9B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;QAII;IACJ,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;QAEI;IACJ,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GAAG,OAAO,CAAC,UAAU,CAAC,CAwFtB"}
@@ -0,0 +1,101 @@
1
+ import { isFolder } from '@ms-cloudpack/path-utilities';
2
+ import glob from 'fast-glob';
3
+ import { dirname, join } from 'path';
4
+ import { findGitRoot } from 'workspace-tools';
5
+ import { PackageDefinitions } from '../PackageDefinitions.js';
6
+ import { findPackagePath } from '../findPackagePath.js';
7
+ import { isExternalPackage } from '../isExternalPackage.js';
8
+ /**
9
+ * Find all packages from a given path. We do this by walking the dependency tree
10
+ * of the app to build a map of all packages and their dependencies.
11
+ */
12
+ export async function findPackagesFromPath(options) {
13
+ const { paths, discoverPackages, useStrictVersioning, packages = PackageDefinitions.getInstance() } = options;
14
+ const packageMap = {};
15
+ const visitedPaths = new Set();
16
+ const pathsToVisit = [];
17
+ for (const path of paths) {
18
+ if (!(await isFolder(path))) {
19
+ throw new Error(`Path ${path} is not a folder.`);
20
+ }
21
+ let { gitRootPath } = options;
22
+ if (!gitRootPath) {
23
+ gitRootPath = path;
24
+ try {
25
+ gitRootPath = findGitRoot(path);
26
+ }
27
+ catch (e) {
28
+ /* ignore */
29
+ }
30
+ }
31
+ if (discoverPackages) {
32
+ const packagePaths = await glob('**/package.json', { cwd: path, ignore: ['**/node_modules/**'] });
33
+ pathsToVisit.push(...packagePaths.map((p) => dirname(join(path, p))));
34
+ }
35
+ else {
36
+ pathsToVisit.push(path);
37
+ }
38
+ while (pathsToVisit.length) {
39
+ const packagePath = pathsToVisit.shift();
40
+ if (packagePath && !visitedPaths.has(packagePath)) {
41
+ visitedPaths.add(packagePath);
42
+ const packageDefinition = await packages.get(packagePath);
43
+ if (!packageDefinition) {
44
+ throw new Error(`Could not find package definition at "${packagePath}".`);
45
+ }
46
+ if (packageDefinition?.name && packageDefinition.version) {
47
+ const { name, version } = packageDefinition;
48
+ const entry = initPackageEntry({ path: packagePath, packageMap, definition: packageDefinition });
49
+ // Add all dependencies to the list of paths to visit.
50
+ const dependencies = {
51
+ ...(packageDefinition.dependencies || {}),
52
+ ...(packageDefinition.peerDependencies || {}),
53
+ };
54
+ for (const [dependencyName, versionRequirement] of Object.entries(dependencies)) {
55
+ const isPeerDependency = !!packageDefinition.peerDependencies?.[dependencyName];
56
+ const dependencyPath = await findPackagePath({
57
+ dependencyName,
58
+ versionRequirement: useStrictVersioning && !isPeerDependency ? versionRequirement : undefined,
59
+ cwd: packagePath,
60
+ gitRootPath,
61
+ });
62
+ if (dependencyPath) {
63
+ const dependencyDefinition = await packages.get(dependencyPath);
64
+ if (dependencyDefinition?.name && dependencyDefinition.version) {
65
+ const dependencyEntry = initPackageEntry({
66
+ path: dependencyPath,
67
+ packageMap,
68
+ definition: dependencyDefinition,
69
+ });
70
+ entry.dependencies[dependencyDefinition.name] = dependencyDefinition.version;
71
+ dependencyEntry.requiredBy[`${name}@${version}`] = versionRequirement;
72
+ pathsToVisit.push(dependencyPath);
73
+ }
74
+ }
75
+ else if (!isPeerDependency) {
76
+ throw new Error(`Could not find dependency "${dependencyName}" at "${packagePath}" with version requirement "${versionRequirement}".`);
77
+ }
78
+ }
79
+ }
80
+ }
81
+ }
82
+ }
83
+ return packageMap;
84
+ }
85
+ function initPackageEntry(options) {
86
+ const { path = '', packageMap, definition } = options;
87
+ const { name = '_no_name_', version = '*' } = definition;
88
+ const mapEntry = (packageMap[name] || (packageMap[name] = {}));
89
+ const entry = (mapEntry[version] || (mapEntry[version] = {
90
+ name,
91
+ version,
92
+ path,
93
+ dependencies: {},
94
+ requiredBy: {},
95
+ }));
96
+ if (isExternalPackage(path)) {
97
+ entry.isExternal = true;
98
+ }
99
+ return entry;
100
+ }
101
+ //# sourceMappingURL=findPackagesFromPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findPackagesFromPath.js","sourceRoot":"","sources":["../../src/createResolveMap/findPackagesFromPath.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PackageJson } from '@ms-cloudpack/bundler-types';\nimport { isFolder } from '@ms-cloudpack/path-utilities';\nimport glob from 'fast-glob';\nimport { dirname, join } from 'path';\nimport { findGitRoot } from 'workspace-tools';\nimport { PackageDefinitions } from '../PackageDefinitions.js';\nimport { findPackagePath } from '../findPackagePath.js';\nimport { isExternalPackage } from '../isExternalPackage.js';\nimport type { PackageMap } from './PackageMap.js';\nimport type { ResolveMapEntry } from './ResolveMapEntry.js';\n\n/**\n * Find all packages from a given path. We do this by walking the dependency tree\n * of the app to build a map of all packages and their dependencies.\n */\nexport async function findPackagesFromPath(options: {\n /**\n * Paths to search for package.json files and traverse their dependencies to build a PackageMap.\n */\n paths: string[];\n\n /**\n * Package cache.\n */\n packages?: PackageDefinitions;\n\n /**\n * Where to stop looking for packages. If not specified, will look for a git root. If one is not\n * found, will use the first path in the paths array.\n */\n gitRootPath?: string;\n\n /**\n * If true will check semver requirements for all dependencies. Note that if the workspace\n * uses resolutions to force a particular version of a dependency, this could cause a failure.\n * TODO: read resolutions from package.json and use them to allow mismatches.\n **/\n useStrictVersioning?: boolean;\n\n /**\n * If true will glob for all package.json files in the path and add them to the map.\n **/\n discoverPackages?: boolean;\n}): Promise<PackageMap> {\n const { paths, discoverPackages, useStrictVersioning, packages = PackageDefinitions.getInstance() } = options;\n const packageMap: PackageMap = {};\n const visitedPaths = new Set<string>();\n const pathsToVisit: string[] = [];\n\n for (const path of paths) {\n if (!(await isFolder(path))) {\n throw new Error(`Path ${path} is not a folder.`);\n }\n\n let { gitRootPath } = options;\n\n if (!gitRootPath) {\n gitRootPath = path;\n try {\n gitRootPath = findGitRoot(path);\n } catch (e) {\n /* ignore */\n }\n }\n\n if (discoverPackages) {\n const packagePaths = await glob('**/package.json', { cwd: path, ignore: ['**/node_modules/**'] });\n\n pathsToVisit.push(...packagePaths.map((p) => dirname(join(path, p))));\n } else {\n pathsToVisit.push(path);\n }\n\n while (pathsToVisit.length) {\n const packagePath = pathsToVisit.shift();\n\n if (packagePath && !visitedPaths.has(packagePath)) {\n visitedPaths.add(packagePath);\n\n const packageDefinition = await packages.get(packagePath);\n\n if (!packageDefinition) {\n throw new Error(`Could not find package definition at \"${packagePath}\".`);\n }\n\n if (packageDefinition?.name && packageDefinition.version) {\n const { name, version } = packageDefinition;\n const entry = initPackageEntry({ path: packagePath, packageMap, definition: packageDefinition });\n\n // Add all dependencies to the list of paths to visit.\n const dependencies = {\n ...(packageDefinition.dependencies || {}),\n ...(packageDefinition.peerDependencies || {}),\n } as Record<string, string>;\n\n for (const [dependencyName, versionRequirement] of Object.entries(dependencies)) {\n const isPeerDependency = !!packageDefinition.peerDependencies?.[dependencyName];\n\n const dependencyPath = await findPackagePath({\n dependencyName,\n versionRequirement: useStrictVersioning && !isPeerDependency ? versionRequirement : undefined,\n cwd: packagePath,\n gitRootPath,\n });\n\n if (dependencyPath) {\n const dependencyDefinition = await packages.get(dependencyPath);\n if (dependencyDefinition?.name && dependencyDefinition.version) {\n const dependencyEntry = initPackageEntry({\n path: dependencyPath,\n packageMap,\n definition: dependencyDefinition,\n });\n\n entry.dependencies[dependencyDefinition.name] = dependencyDefinition.version;\n dependencyEntry.requiredBy[`${name}@${version}`] = versionRequirement;\n\n pathsToVisit.push(dependencyPath);\n }\n } else if (!isPeerDependency) {\n throw new Error(\n `Could not find dependency \"${dependencyName}\" at \"${packagePath}\" with version requirement \"${versionRequirement}\".`,\n );\n }\n }\n }\n }\n }\n }\n\n return packageMap;\n}\n\nfunction initPackageEntry(options: { path: string; packageMap: PackageMap; definition: PackageJson }): ResolveMapEntry {\n const { path = '', packageMap, definition } = options;\n const { name = '_no_name_', version = '*' } = definition;\n\n const mapEntry = (packageMap[name] ||= {}) as Record<string, ResolveMapEntry>;\n const entry = (mapEntry[version] ||= {\n name,\n version,\n path,\n dependencies: {},\n requiredBy: {},\n });\n\n if (isExternalPackage(path)) {\n entry.isExternal = true;\n }\n\n return entry;\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import type { PackageDefinitions } from '../PackageDefinitions.js';
2
+ import type { PackageMap } from './PackageMap.js';
3
+ /**
4
+ * Given a linked path, an appMap, find packages from the linked path and add them to the appMap.
5
+ * @param options
6
+ */
7
+ export declare function linkPath(options: {
8
+ linkedPath: string;
9
+ appMap: PackageMap;
10
+ packages: PackageDefinitions;
11
+ }): Promise<void>;
12
+ //# sourceMappingURL=linkPath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linkPath.d.ts","sourceRoot":"","sources":["../../src/createResolveMap/linkPath.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAKlD;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,kBAAkB,CAAA;CAAE,iBAuD/G"}
@@ -0,0 +1,54 @@
1
+ import { findPackagesFromPath } from './findPackagesFromPath.js';
2
+ import { addLinkedEntryDependencies } from './addLinkedEntryDependencies.js';
3
+ import { detachEntry } from './detachEntry.js';
4
+ /**
5
+ * Given a linked path, an appMap, find packages from the linked path and add them to the appMap.
6
+ * @param options
7
+ */
8
+ export async function linkPath(options) {
9
+ const { linkedPath, appMap, packages } = options;
10
+ const linkMap = await findPackagesFromPath({
11
+ paths: [linkedPath],
12
+ packages,
13
+ discoverPackages: true,
14
+ });
15
+ // Iterate through the linkMap, looking for internal packages to link to the appMap.
16
+ for (const [packageName, packageVersions] of Object.entries(linkMap)) {
17
+ if (appMap[packageName]) {
18
+ const linkedVersions = Object.keys(packageVersions);
19
+ if (linkedVersions.length == 1) {
20
+ const linkedEntry = packageVersions[linkedVersions[0]];
21
+ if (!linkedEntry.isExternal) {
22
+ // Combine all requiredBy references from all appMap entries for this package so that we can
23
+ // set it on the linked package entry.
24
+ const requiredBy = Object.values(appMap[packageName]).reduce((acc, p) => {
25
+ Object.assign(acc, p.requiredBy);
26
+ return acc;
27
+ }, {});
28
+ // Linked packages use an asterisk for the version description. This keeps it semver compatible with
29
+ // anything.
30
+ linkedEntry.version = '*';
31
+ linkedEntry.isLinked = true;
32
+ linkedEntry.requiredBy = requiredBy;
33
+ // Remove all existing requiredBy references to the entry we're about to replace.
34
+ const existingVersions = Object.values(appMap[packageName]);
35
+ for (const existingEntry of existingVersions) {
36
+ detachEntry({ appMap, entry: existingEntry });
37
+ }
38
+ // Add the linked entry
39
+ appMap[packageName] = { '*': linkedEntry };
40
+ // Ensure that the parent entry depends on the linked entry.
41
+ for (const parentId of Object.keys(requiredBy)) {
42
+ const [name, version] = parentId.split('@');
43
+ const parentEntry = appMap[name]?.[version];
44
+ parentEntry.dependencies[packageName] = '*';
45
+ }
46
+ // We've now linked a package in. We need to assess its dependencies to determine if they are already
47
+ // satisfied by existing dependencies.
48
+ await addLinkedEntryDependencies({ linkedEntry, appMap: appMap, linkMap, packages });
49
+ }
50
+ }
51
+ }
52
+ }
53
+ }
54
+ //# sourceMappingURL=linkPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linkPath.js","sourceRoot":"","sources":["../../src/createResolveMap/linkPath.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAiF;IAC9G,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACjD,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC;QACzC,KAAK,EAAE,CAAC,UAAU,CAAC;QACnB,QAAQ;QACR,gBAAgB,EAAE,IAAI;KACvB,CAAC,CAAC;IAEH,oFAAoF;IACpF,KAAK,MAAM,CAAC,WAAW,EAAE,eAAe,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QACpE,IAAI,MAAM,CAAC,WAAW,CAAC,EAAE;YACvB,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAEpD,IAAI,cAAc,CAAC,MAAM,IAAI,CAAC,EAAE;gBAC9B,MAAM,WAAW,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEvD,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE;oBAC3B,4FAA4F;oBAC5F,sCAAsC;oBACtC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;wBACtE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;wBACjC,OAAO,GAAG,CAAC;oBACb,CAAC,EAAE,EAAE,CAAC,CAAC;oBAEP,oGAAoG;oBACpG,YAAY;oBACZ,WAAW,CAAC,OAAO,GAAG,GAAG,CAAC;oBAC1B,WAAW,CAAC,QAAQ,GAAG,IAAI,CAAC;oBAC5B,WAAW,CAAC,UAAU,GAAG,UAAU,CAAC;oBAEpC,iFAAiF;oBACjF,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;oBAE5D,KAAK,MAAM,aAAa,IAAI,gBAAgB,EAAE;wBAC5C,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;qBAC/C;oBAED,uBAAuB;oBACvB,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;oBAE3C,4DAA4D;oBAC5D,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;wBAC9C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;wBAE5C,WAAW,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC;qBAC7C;oBAED,qGAAqG;oBACrG,sCAAsC;oBACtC,MAAM,0BAA0B,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;iBACtF;aACF;SACF;KACF;AACH,CAAC","sourcesContent":["import type { PackageDefinitions } from '../PackageDefinitions.js';\nimport type { PackageMap } from './PackageMap.js';\nimport { findPackagesFromPath } from './findPackagesFromPath.js';\nimport { addLinkedEntryDependencies } from './addLinkedEntryDependencies.js';\nimport { detachEntry } from './detachEntry.js';\n\n/**\n * Given a linked path, an appMap, find packages from the linked path and add them to the appMap.\n * @param options\n */\nexport async function linkPath(options: { linkedPath: string; appMap: PackageMap; packages: PackageDefinitions }) {\n const { linkedPath, appMap, packages } = options;\n const linkMap = await findPackagesFromPath({\n paths: [linkedPath],\n packages,\n discoverPackages: true,\n });\n\n // Iterate through the linkMap, looking for internal packages to link to the appMap.\n for (const [packageName, packageVersions] of Object.entries(linkMap)) {\n if (appMap[packageName]) {\n const linkedVersions = Object.keys(packageVersions);\n\n if (linkedVersions.length == 1) {\n const linkedEntry = packageVersions[linkedVersions[0]];\n\n if (!linkedEntry.isExternal) {\n // Combine all requiredBy references from all appMap entries for this package so that we can\n // set it on the linked package entry.\n const requiredBy = Object.values(appMap[packageName]).reduce((acc, p) => {\n Object.assign(acc, p.requiredBy);\n return acc;\n }, {});\n\n // Linked packages use an asterisk for the version description. This keeps it semver compatible with\n // anything.\n linkedEntry.version = '*';\n linkedEntry.isLinked = true;\n linkedEntry.requiredBy = requiredBy;\n\n // Remove all existing requiredBy references to the entry we're about to replace.\n const existingVersions = Object.values(appMap[packageName]);\n\n for (const existingEntry of existingVersions) {\n detachEntry({ appMap, entry: existingEntry });\n }\n\n // Add the linked entry\n appMap[packageName] = { '*': linkedEntry };\n\n // Ensure that the parent entry depends on the linked entry.\n for (const parentId of Object.keys(requiredBy)) {\n const [name, version] = parentId.split('@');\n const parentEntry = appMap[name]?.[version];\n\n parentEntry.dependencies[packageName] = '*';\n }\n\n // We've now linked a package in. We need to assess its dependencies to determine if they are already\n // satisfied by existing dependencies.\n await addLinkedEntryDependencies({ linkedEntry, appMap: appMap, linkMap, packages });\n }\n }\n }\n }\n}\n"]}
@@ -1,2 +1,12 @@
1
- export declare function findPackagePath(dependencyName: string, versionRequirement: string | undefined, cwd: string, gitRootPath?: string, isOptional?: boolean): Promise<string | undefined>;
1
+ /**
2
+ *
3
+ * @param options
4
+ * @returns
5
+ */
6
+ export declare function findPackagePath(options: {
7
+ dependencyName: string;
8
+ versionRequirement: string | undefined;
9
+ cwd: string;
10
+ gitRootPath?: string;
11
+ }): Promise<string | undefined>;
2
12
  //# sourceMappingURL=findPackagePath.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"findPackagePath.d.ts","sourceRoot":"","sources":["../src/findPackagePath.ts"],"names":[],"mappings":"AAKA,wBAAsB,eAAe,CACnC,cAAc,EAAE,MAAM,EACtB,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,GAAG,EAAE,MAAM,EACX,WAAW,CAAC,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,OAAO,GACnB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAkC7B"}
1
+ {"version":3,"file":"findPackagePath.d.ts","sourceRoot":"","sources":["../src/findPackagePath.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA2B9B"}
@@ -2,7 +2,13 @@ import path from 'path';
2
2
  import fsPromises from 'fs/promises';
3
3
  import semver from 'semver';
4
4
  import { PackageDefinitions } from './PackageDefinitions.js';
5
- export async function findPackagePath(dependencyName, versionRequirement, cwd, gitRootPath, isOptional) {
5
+ /**
6
+ *
7
+ * @param options
8
+ * @returns
9
+ */
10
+ export async function findPackagePath(options) {
11
+ const { dependencyName, versionRequirement, cwd, gitRootPath } = options;
6
12
  let packagePath = cwd;
7
13
  do {
8
14
  const resolvedPath = path.join(packagePath, 'node_modules', dependencyName);
@@ -21,9 +27,6 @@ export async function findPackagePath(dependencyName, versionRequirement, cwd, g
21
27
  packagePath = path.dirname(packagePath);
22
28
  }
23
29
  } while ((!gitRootPath || packagePath.length >= gitRootPath.length) && path.dirname(packagePath) !== packagePath);
24
- if (!isOptional) {
25
- throw new Error(`Could not resolve "${dependencyName}${versionRequirement ? `@${versionRequirement}` : ``}" from "${cwd}". Make sure you have installed the latest dependencies.`);
26
- }
27
30
  return undefined;
28
31
  }
29
32
  //# sourceMappingURL=findPackagePath.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"findPackagePath.js","sourceRoot":"","sources":["../src/findPackagePath.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,cAAsB,EACtB,kBAAsC,EACtC,GAAW,EACX,WAAoB,EACpB,UAAoB;IAEpB,IAAI,WAAW,GAAG,GAAG,CAAC;IAEtB,GAAG;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;QAC5E,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAE5E,IAAI,UAAU,EAAE,OAAO,IAAI,CAAC,CAAC,kBAAkB,IAAI,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC,EAAE;YAC5G,OAAO,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;SAC1C;QAED,mDAAmD;QACnD,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAExC,oDAAoD;QACpD,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YAC9C,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;SACzC;QAED,yCAAyC;QACzC,IAAI,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE;YACxC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;SACzC;KACF,QAAQ,CAAC,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,WAAW,EAAE;IAElH,IAAI,CAAC,UAAU,EAAE;QACf,MAAM,IAAI,KAAK,CACb,sBAAsB,cAAc,GAClC,kBAAkB,CAAC,CAAC,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAClD,WAAW,GAAG,0DAA0D,CACzE,CAAC;KACH;IAED,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import path from 'path';\nimport fsPromises from 'fs/promises';\nimport semver from 'semver';\nimport { PackageDefinitions } from './PackageDefinitions.js';\n\nexport async function findPackagePath(\n dependencyName: string,\n versionRequirement: string | undefined,\n cwd: string,\n gitRootPath?: string,\n isOptional?: boolean,\n): Promise<string | undefined> {\n let packagePath = cwd;\n\n do {\n const resolvedPath = path.join(packagePath, 'node_modules', dependencyName);\n const definition = await PackageDefinitions.getInstance().get(resolvedPath);\n\n if (definition?.version && (!versionRequirement || semver.satisfies(definition.version, versionRequirement))) {\n return fsPromises.realpath(resolvedPath);\n }\n\n // We haven't found it. Try to move up a directory.\n packagePath = path.dirname(packagePath);\n\n // If we moved up into a scope folder, skip over it.\n if (path.basename(packagePath).startsWith('@')) {\n packagePath = path.dirname(packagePath);\n }\n\n // Skip over nested node_modules folders.\n if (packagePath.endsWith('node_modules')) {\n packagePath = path.dirname(packagePath);\n }\n } while ((!gitRootPath || packagePath.length >= gitRootPath.length) && path.dirname(packagePath) !== packagePath);\n\n if (!isOptional) {\n throw new Error(\n `Could not resolve \"${dependencyName}${\n versionRequirement ? `@${versionRequirement}` : ``\n }\" from \"${cwd}\". Make sure you have installed the latest dependencies.`,\n );\n }\n\n return undefined;\n}\n"]}
1
+ {"version":3,"file":"findPackagePath.js","sourceRoot":"","sources":["../src/findPackagePath.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAKrC;IACC,MAAM,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IACzE,IAAI,WAAW,GAAG,GAAG,CAAC;IAEtB,GAAG;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;QAC5E,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAE5E,IAAI,UAAU,EAAE,OAAO,IAAI,CAAC,CAAC,kBAAkB,IAAI,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC,EAAE;YAC5G,OAAO,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;SAC1C;QAED,mDAAmD;QACnD,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAExC,oDAAoD;QACpD,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YAC9C,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;SACzC;QAED,yCAAyC;QACzC,IAAI,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE;YACxC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;SACzC;KACF,QAAQ,CAAC,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,WAAW,EAAE;IAElH,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import path from 'path';\nimport fsPromises from 'fs/promises';\nimport semver from 'semver';\nimport { PackageDefinitions } from './PackageDefinitions.js';\n\n/**\n *\n * @param options\n * @returns\n */\nexport async function findPackagePath(options: {\n dependencyName: string;\n versionRequirement: string | undefined;\n cwd: string;\n gitRootPath?: string;\n}): Promise<string | undefined> {\n const { dependencyName, versionRequirement, cwd, gitRootPath } = options;\n let packagePath = cwd;\n\n do {\n const resolvedPath = path.join(packagePath, 'node_modules', dependencyName);\n const definition = await PackageDefinitions.getInstance().get(resolvedPath);\n\n if (definition?.version && (!versionRequirement || semver.satisfies(definition.version, versionRequirement))) {\n return fsPromises.realpath(resolvedPath);\n }\n\n // We haven't found it. Try to move up a directory.\n packagePath = path.dirname(packagePath);\n\n // If we moved up into a scope folder, skip over it.\n if (path.basename(packagePath).startsWith('@')) {\n packagePath = path.dirname(packagePath);\n }\n\n // Skip over nested node_modules folders.\n if (packagePath.endsWith('node_modules')) {\n packagePath = path.dirname(packagePath);\n }\n } while ((!gitRootPath || packagePath.length >= gitRootPath.length) && path.dirname(packagePath) !== packagePath);\n\n return undefined;\n}\n"]}
@@ -1,11 +1,13 @@
1
- import type { ResolveMap, ResolveMapEntry } from './createResolveMap.js';
1
+ import type { ResolveMap } from './createResolveMap/ResolveMap.js';
2
+ import type { ResolveMapEntry } from './createResolveMap/ResolveMapEntry.js';
2
3
  import type { PackageJson } from '@ms-cloudpack/bundler-types';
3
4
  /**
4
5
  * Helper which, given a definition/resolveMap/dependency name, returns the resolve map entry for the dependency.
5
6
  */
6
- export declare function findResolveMapEntry({ packageName, resolveMap, definition, }: {
7
+ export declare function findResolveMapEntry({ packageName, resolveMap, definition, version, }: {
7
8
  packageName: string;
8
9
  resolveMap: ResolveMap;
10
+ version?: string;
9
11
  definition?: PackageJson;
10
12
  }): ResolveMapEntry | undefined;
11
13
  //# sourceMappingURL=findResolveMapEntry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"findResolveMapEntry.d.ts","sourceRoot":"","sources":["../src/findResolveMapEntry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE/D;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,WAAW,EACX,UAAU,EACV,UAAU,GACX,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,CAAC,EAAE,WAAW,CAAC;CAC1B,GAAG,eAAe,GAAG,SAAS,CAgB9B"}
1
+ {"version":3,"file":"findResolveMapEntry.d.ts","sourceRoot":"","sources":["../src/findResolveMapEntry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE/D;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,WAAW,EACX,UAAU,EACV,UAAU,EACV,OAAO,GACR,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,WAAW,CAAC;CAC1B,GAAG,eAAe,GAAG,SAAS,CA8B9B"}
@@ -1,15 +1,27 @@
1
1
  /**
2
2
  * Helper which, given a definition/resolveMap/dependency name, returns the resolve map entry for the dependency.
3
3
  */
4
- export function findResolveMapEntry({ packageName, resolveMap, definition, }) {
4
+ export function findResolveMapEntry({ packageName, resolveMap, definition, version, }) {
5
5
  const resolveEntry = resolveMap[packageName];
6
6
  if (!resolveEntry) {
7
7
  return undefined;
8
8
  }
9
- if (!definition) {
9
+ if (!definition && !version) {
10
10
  return resolveEntry;
11
11
  }
12
- const scopedEntry = Object.values(resolveEntry?.scopedVersions || {}).filter((e) => !!e.requiredBy[`${definition.name}@${definition.version}`])[0];
13
- return scopedEntry || resolveEntry;
12
+ if (version) {
13
+ if (resolveEntry.version === version) {
14
+ return resolveEntry;
15
+ }
16
+ return resolveEntry.scopedVersions?.[version];
17
+ }
18
+ if (definition) {
19
+ const requiredById = `${definition.name}@${definition.version}`;
20
+ if (resolveEntry.requiredBy[requiredById]) {
21
+ return resolveEntry;
22
+ }
23
+ return Object.values(resolveEntry.scopedVersions || {}).find((e) => !!e.requiredBy[requiredById]);
24
+ }
25
+ return undefined;
14
26
  }
15
27
  //# sourceMappingURL=findResolveMapEntry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"findResolveMapEntry.js","sourceRoot":"","sources":["../src/findResolveMapEntry.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAClC,WAAW,EACX,UAAU,EACV,UAAU,GAKX;IACC,MAAM,YAAY,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAE7C,IAAI,CAAC,YAAY,EAAE;QACjB,OAAO,SAAS,CAAC;KAClB;IAED,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,YAAY,CAAC;KACrB;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,cAAc,IAAI,EAAE,CAAC,CAAC,MAAM,CAC1E,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC,CAClE,CAAC,CAAC,CAAC,CAAC;IAEL,OAAO,WAAW,IAAI,YAAY,CAAC;AACrC,CAAC","sourcesContent":["import type { ResolveMap, ResolveMapEntry } from './createResolveMap.js';\nimport type { PackageJson } from '@ms-cloudpack/bundler-types';\n\n/**\n * Helper which, given a definition/resolveMap/dependency name, returns the resolve map entry for the dependency.\n */\nexport function findResolveMapEntry({\n packageName,\n resolveMap,\n definition,\n}: {\n packageName: string;\n resolveMap: ResolveMap;\n definition?: PackageJson;\n}): ResolveMapEntry | undefined {\n const resolveEntry = resolveMap[packageName];\n\n if (!resolveEntry) {\n return undefined;\n }\n\n if (!definition) {\n return resolveEntry;\n }\n\n const scopedEntry = Object.values(resolveEntry?.scopedVersions || {}).filter(\n (e) => !!e.requiredBy[`${definition.name}@${definition.version}`],\n )[0];\n\n return scopedEntry || resolveEntry;\n}\n"]}
1
+ {"version":3,"file":"findResolveMapEntry.js","sourceRoot":"","sources":["../src/findResolveMapEntry.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAClC,WAAW,EACX,UAAU,EACV,UAAU,EACV,OAAO,GAMR;IACC,MAAM,YAAY,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAE7C,IAAI,CAAC,YAAY,EAAE;QACjB,OAAO,SAAS,CAAC;KAClB;IAED,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO,EAAE;QAC3B,OAAO,YAAY,CAAC;KACrB;IAED,IAAI,OAAO,EAAE;QACX,IAAI,YAAY,CAAC,OAAO,KAAK,OAAO,EAAE;YACpC,OAAO,YAAY,CAAC;SACrB;QAED,OAAO,YAAY,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC;KAC/C;IAED,IAAI,UAAU,EAAE;QACd,MAAM,YAAY,GAA0B,GAAG,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QAEvF,IAAI,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;YACzC,OAAO,YAAY,CAAC;SACrB;QAED,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;KACnG;IAED,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import type { ResolveMap } from './createResolveMap/ResolveMap.js';\nimport type { ResolveMapEntry } from './createResolveMap/ResolveMapEntry.js';\nimport type { PackageJson } from '@ms-cloudpack/bundler-types';\n\n/**\n * Helper which, given a definition/resolveMap/dependency name, returns the resolve map entry for the dependency.\n */\nexport function findResolveMapEntry({\n packageName,\n resolveMap,\n definition,\n version,\n}: {\n packageName: string;\n resolveMap: ResolveMap;\n version?: string;\n definition?: PackageJson;\n}): ResolveMapEntry | undefined {\n const resolveEntry = resolveMap[packageName];\n\n if (!resolveEntry) {\n return undefined;\n }\n\n if (!definition && !version) {\n return resolveEntry;\n }\n\n if (version) {\n if (resolveEntry.version === version) {\n return resolveEntry;\n }\n\n return resolveEntry.scopedVersions?.[version];\n }\n\n if (definition) {\n const requiredById: `${string}@${string}` = `${definition.name}@${definition.version}`;\n\n if (resolveEntry.requiredBy[requiredById]) {\n return resolveEntry;\n }\n\n return Object.values(resolveEntry.scopedVersions || {}).find((e) => !!e.requiredBy[requiredById]);\n }\n\n return undefined;\n}\n"]}
package/lib/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export { PackageDefinitions } from './PackageDefinitions.js';
2
- export { createResolveMap } from './createResolveMap.js';
3
- export type { ResolveMapEntry, ResolveMap } from './createResolveMap.js';
2
+ export { createResolveMap } from './createResolveMap/createResolveMap.js';
3
+ export type { ResolveMap } from './createResolveMap/ResolveMap.js';
4
+ export type { ResolveMapEntry } from './createResolveMap/ResolveMapEntry.js';
4
5
  export { findResolveMapEntry } from './findResolveMapEntry.js';
5
6
  export { flattenExportsMap } from './flattenExportsMap.js';
6
7
  export { createExportsMap } from './createExportsMap.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,KAAK,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGvE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,KAAK,wBAAwB,EAAE,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACxH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC1E,YAAY,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AACnE,YAAY,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,KAAK,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGvE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,KAAK,wBAAwB,EAAE,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACxH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
package/lib/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // Package definition parsing
2
2
  export { PackageDefinitions } from './PackageDefinitions.js';
3
3
  // ResolveMap creation
4
- export { createResolveMap } from './createResolveMap.js';
4
+ export { createResolveMap } from './createResolveMap/createResolveMap.js';
5
5
  export { findResolveMapEntry } from './findResolveMapEntry.js';
6
6
  // ExportsMap parsing and creation
7
7
  export { flattenExportsMap } from './flattenExportsMap.js';
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,sBAAsB;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,kCAAkC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAkC,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,qBAAqB;AACrB,OAAO,EAAE,eAAe,EAAkB,MAAM,sBAAsB,CAAC;AAEvE,8BAA8B;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,0BAA0B;AAC1B,OAAO,EAAE,gBAAgB,EAAmB,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAA+D,MAAM,wBAAwB,CAAC;AACxH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC","sourcesContent":["// Package definition parsing\nexport { PackageDefinitions } from './PackageDefinitions.js';\n\n// ResolveMap creation\nexport { createResolveMap } from './createResolveMap.js';\nexport type { ResolveMapEntry, ResolveMap } from './createResolveMap.js';\nexport { findResolveMapEntry } from './findResolveMapEntry.js';\n\n// ExportsMap parsing and creation\nexport { flattenExportsMap } from './flattenExportsMap.js';\nexport { createExportsMap } from './createExportsMap.js';\nexport { addExportsMapEntry, type AddExportsMapEntryOptions } from './addExportsMapEntry.js';\nexport { getExportsMap } from './getExportsMap.js';\n\n// ImportMap creation\nexport { createImportMap, type ImportMap } from './createImportMap.js';\n\n// Import resolution utilities\nexport { resolve } from './resolve.js';\n\n// Other package utilities\nexport { detectModuleType, type ModuleType } from './detectModuleType.js';\nexport { isExternalPackage } from './isExternalPackage.js';\nexport { findFileInPackage, type FindFileInPackageOptions, type FindFileInPackageResult } from './findFileInPackage.js';\nexport { getVersion } from './getVersion.js';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,sBAAsB;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAG1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,kCAAkC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAkC,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,qBAAqB;AACrB,OAAO,EAAE,eAAe,EAAkB,MAAM,sBAAsB,CAAC;AAEvE,8BAA8B;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,0BAA0B;AAC1B,OAAO,EAAE,gBAAgB,EAAmB,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAA+D,MAAM,wBAAwB,CAAC;AACxH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC","sourcesContent":["// Package definition parsing\nexport { PackageDefinitions } from './PackageDefinitions.js';\n\n// ResolveMap creation\nexport { createResolveMap } from './createResolveMap/createResolveMap.js';\nexport type { ResolveMap } from './createResolveMap/ResolveMap.js';\nexport type { ResolveMapEntry } from './createResolveMap/ResolveMapEntry.js';\nexport { findResolveMapEntry } from './findResolveMapEntry.js';\n\n// ExportsMap parsing and creation\nexport { flattenExportsMap } from './flattenExportsMap.js';\nexport { createExportsMap } from './createExportsMap.js';\nexport { addExportsMapEntry, type AddExportsMapEntryOptions } from './addExportsMapEntry.js';\nexport { getExportsMap } from './getExportsMap.js';\n\n// ImportMap creation\nexport { createImportMap, type ImportMap } from './createImportMap.js';\n\n// Import resolution utilities\nexport { resolve } from './resolve.js';\n\n// Other package utilities\nexport { detectModuleType, type ModuleType } from './detectModuleType.js';\nexport { isExternalPackage } from './isExternalPackage.js';\nexport { findFileInPackage, type FindFileInPackageOptions, type FindFileInPackageResult } from './findFileInPackage.js';\nexport { getVersion } from './getVersion.js';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ms-cloudpack/package-utilities",
3
- "version": "2.4.4",
3
+ "version": "3.0.0",
4
4
  "description": "Utilities for resolving/parsing packages and their imports.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -20,8 +20,10 @@
20
20
  "@ms-cloudpack/package-overrides": "^0.3.6",
21
21
  "@ms-cloudpack/path-utilities": "^2.2.2",
22
22
  "@ms-cloudpack/path-string-parsing": "^1.0.1",
23
+ "fast-glob": "^3.2.12",
23
24
  "merge": "^2.1.1",
24
- "resolve": "^1.22.0"
25
+ "resolve": "^1.22.0",
26
+ "workspace-tools": "^0.32.0"
25
27
  },
26
28
  "devDependencies": {
27
29
  "@ms-cloudpack/scripts": "*",
@@ -1,20 +0,0 @@
1
- import type { PackageDefinitionsCache } from '@ms-cloudpack/bundler-types';
2
- export type PackageNameVersion = `${string}@${string}`;
3
- export type ResolveMapEntry = {
4
- name: string;
5
- version: string;
6
- path: string;
7
- requiredBy: Record<string, string>;
8
- scopedVersions?: {
9
- [version: string]: ResolveMapEntry;
10
- };
11
- };
12
- export type ResolveMap = Record<string, ResolveMapEntry>;
13
- export declare function createResolveMap(options: {
14
- appPath: string;
15
- additionalPaths?: string[];
16
- gitRootPath?: string;
17
- strictVersioning?: boolean;
18
- packages?: PackageDefinitionsCache;
19
- }): Promise<ResolveMap>;
20
- //# sourceMappingURL=createResolveMap.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createResolveMap.d.ts","sourceRoot":"","sources":["../src/createResolveMap.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAe,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAGxF,MAAM,MAAM,kBAAkB,GAAG,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;AAEvD,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,cAAc,CAAC,EAAE;QACf,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAAC;KACpC,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAEzD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,uBAAuB,CAAC;CACpC,GAAG,OAAO,CAAC,UAAU,CAAC,CA+GtB"}
@@ -1,88 +0,0 @@
1
- import { PackageDefinitions } from './PackageDefinitions.js';
2
- import { findPackagePath } from './findPackagePath.js';
3
- import fsPromises from 'fs/promises';
4
- export async function createResolveMap(options) {
5
- var _a, _b, _c, _d;
6
- const { appPath, additionalPaths = [], gitRootPath, strictVersioning, packages = PackageDefinitions.getInstance(), } = options;
7
- const visitedPaths = new Set([appPath, ...additionalPaths]);
8
- const allEntries = {};
9
- const appDefinition = await packages.get(appPath);
10
- if (!appDefinition) {
11
- throw new Error(`Could not find package.json for ${appPath}`);
12
- }
13
- if (!appDefinition.name || !appDefinition.version) {
14
- throw new Error(`package.json for ${appPath} is missing a name or version`);
15
- }
16
- const appId = `${appDefinition.name}@${appDefinition.version}`;
17
- for (const rootPath of [appPath, ...additionalPaths]) {
18
- const pathsToVisit = [rootPath];
19
- while (pathsToVisit.length) {
20
- let packagePath = pathsToVisit.shift();
21
- if (packagePath) {
22
- packagePath = await fsPromises.realpath(packagePath);
23
- const definition = await packages.get(packagePath);
24
- if (definition && definition.name && definition.version) {
25
- const packageId = `${definition.name}@${definition.version}`;
26
- const namedEntries = (allEntries[_a = definition.name] ?? (allEntries[_a] = {}));
27
- namedEntries[_b = definition.version] ?? (namedEntries[_b] = createMapEntry(definition, packagePath));
28
- const packageDependencies = [
29
- ...Object.keys(definition?.dependencies || {}),
30
- ...Object.keys(definition?.peerDependencies || {}),
31
- ];
32
- for (const depName of packageDependencies) {
33
- const requiredVersion = definition?.dependencies?.[depName] || definition?.peerDependencies?.[depName];
34
- const dependencyPath = await findPackagePath(depName, strictVersioning ? requiredVersion : undefined, packagePath, gitRootPath, !!definition?.peerDependencies?.[depName]);
35
- if (dependencyPath) {
36
- const dependencyDefinition = await packages.get(dependencyPath);
37
- if (dependencyDefinition?.name && dependencyDefinition.version) {
38
- const dependencyNamedEntries = (allEntries[_c = dependencyDefinition.name] ?? (allEntries[_c] = {}));
39
- const dependencyEntry = (dependencyNamedEntries[_d = dependencyDefinition.version] ?? (dependencyNamedEntries[_d] = createMapEntry(dependencyDefinition, dependencyPath)));
40
- dependencyEntry.requiredBy[packageId] = requiredVersion;
41
- if (!visitedPaths.has(dependencyPath)) {
42
- visitedPaths.add(dependencyPath);
43
- pathsToVisit.push(dependencyPath);
44
- }
45
- }
46
- }
47
- }
48
- }
49
- }
50
- }
51
- }
52
- // Now we have all entries and relationships. Iterate through the relationships to build
53
- // The final resolve map.
54
- const resolveMap = {};
55
- for (const [name, versions] of Object.entries(allEntries)) {
56
- const [dominantVersion, ...otherVersions] = Object.keys(versions).sort((a, b) => {
57
- if (versions[a].requiredBy[appId]) {
58
- return -1;
59
- }
60
- if (versions[b].requiredBy[appId]) {
61
- return 1;
62
- }
63
- // If both are transitive to the app, sort by the number of dependencies.
64
- const aDependentCount = Object.keys(versions[a].requiredBy).length;
65
- const bDependentCount = Object.keys(versions[b].requiredBy).length;
66
- return aDependentCount > bDependentCount ? -1 : 1;
67
- });
68
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
69
- const entry = (resolveMap[name] = allEntries[name][dominantVersion]);
70
- if (otherVersions?.length) {
71
- entry.scopedVersions = otherVersions.reduce((scopedVersions, version) => {
72
- scopedVersions[version] = allEntries[name][version];
73
- return scopedVersions;
74
- }, {});
75
- }
76
- }
77
- return resolveMap;
78
- }
79
- function createMapEntry(packageDefinition, packagePath) {
80
- const { name = '', version = '' } = packageDefinition;
81
- return {
82
- name,
83
- version,
84
- path: packagePath,
85
- requiredBy: {},
86
- };
87
- }
88
- //# sourceMappingURL=createResolveMap.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createResolveMap.js","sourceRoot":"","sources":["../src/createResolveMap.ts"],"names":[],"mappings":"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","sourcesContent":["import { PackageDefinitions } from './PackageDefinitions.js';\nimport { findPackagePath } from './findPackagePath.js';\nimport type { PackageJson, PackageDefinitionsCache } from '@ms-cloudpack/bundler-types';\nimport fsPromises from 'fs/promises';\n\nexport type PackageNameVersion = `${string}@${string}`;\n\nexport type ResolveMapEntry = {\n name: string;\n version: string;\n path: string;\n requiredBy: Record<string, string>;\n scopedVersions?: {\n [version: string]: ResolveMapEntry;\n };\n};\n\nexport type ResolveMap = Record<string, ResolveMapEntry>;\n\nexport async function createResolveMap(options: {\n appPath: string;\n additionalPaths?: string[];\n gitRootPath?: string;\n strictVersioning?: boolean;\n packages?: PackageDefinitionsCache;\n}): Promise<ResolveMap> {\n const {\n appPath,\n additionalPaths = [],\n gitRootPath,\n strictVersioning,\n packages = PackageDefinitions.getInstance(),\n } = options;\n const visitedPaths = new Set<string>([appPath, ...additionalPaths]);\n const allEntries: Record<string, Record<string, ResolveMapEntry>> = {};\n const appDefinition = await packages.get(appPath);\n\n if (!appDefinition) {\n throw new Error(`Could not find package.json for ${appPath}`);\n }\n if (!appDefinition.name || !appDefinition.version) {\n throw new Error(`package.json for ${appPath} is missing a name or version`);\n }\n\n const appId = `${appDefinition.name}@${appDefinition.version}`;\n\n for (const rootPath of [appPath, ...additionalPaths]) {\n const pathsToVisit: string[] = [rootPath];\n\n while (pathsToVisit.length) {\n let packagePath = pathsToVisit.shift();\n\n if (packagePath) {\n packagePath = await fsPromises.realpath(packagePath);\n\n const definition = await packages.get(packagePath);\n\n if (definition && definition.name && definition.version) {\n const packageId: PackageNameVersion = `${definition.name}@${definition.version}`;\n\n const namedEntries = (allEntries[definition.name] ??= {});\n\n namedEntries[definition.version] ??= createMapEntry(definition, packagePath);\n\n const packageDependencies = [\n ...Object.keys(definition?.dependencies || {}),\n ...Object.keys(definition?.peerDependencies || {}),\n ];\n for (const depName of packageDependencies) {\n const requiredVersion =\n definition?.dependencies?.[depName] || (definition?.peerDependencies?.[depName] as string);\n const dependencyPath = await findPackagePath(\n depName,\n strictVersioning ? requiredVersion : undefined,\n packagePath,\n gitRootPath,\n !!definition?.peerDependencies?.[depName],\n );\n\n if (dependencyPath) {\n const dependencyDefinition = await packages.get(dependencyPath);\n\n if (dependencyDefinition?.name && dependencyDefinition.version) {\n const dependencyNamedEntries = (allEntries[dependencyDefinition.name] ??= {});\n const dependencyEntry = (dependencyNamedEntries[dependencyDefinition.version] ??= createMapEntry(\n dependencyDefinition,\n dependencyPath,\n ));\n\n dependencyEntry.requiredBy[packageId] = requiredVersion;\n\n if (!visitedPaths.has(dependencyPath)) {\n visitedPaths.add(dependencyPath);\n pathsToVisit.push(dependencyPath);\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Now we have all entries and relationships. Iterate through the relationships to build\n // The final resolve map.\n const resolveMap: ResolveMap = {};\n\n for (const [name, versions] of Object.entries(allEntries)) {\n const [dominantVersion, ...otherVersions] = Object.keys(versions).sort((a, b) => {\n if (versions[a].requiredBy[appId]) {\n return -1;\n }\n\n if (versions[b].requiredBy[appId]) {\n return 1;\n }\n\n // If both are transitive to the app, sort by the number of dependencies.\n const aDependentCount = Object.keys(versions[a].requiredBy).length;\n const bDependentCount = Object.keys(versions[b].requiredBy).length;\n\n return aDependentCount > bDependentCount ? -1 : 1;\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const entry = (resolveMap[name] = allEntries[name][dominantVersion] as any as ResolveMapEntry);\n\n if (otherVersions?.length) {\n entry.scopedVersions = otherVersions.reduce((scopedVersions, version) => {\n scopedVersions[version] = allEntries[name][version];\n return scopedVersions;\n }, {} as Record<string, ResolveMapEntry>);\n }\n }\n\n return resolveMap;\n}\n\nfunction createMapEntry(packageDefinition: PackageJson, packagePath: string): ResolveMapEntry {\n const { name = '', version = '' } = packageDefinition;\n\n return {\n name,\n version,\n path: packagePath,\n requiredBy: {},\n };\n}\n"]}