@ms-cloudpack/package-utilities 5.5.2 → 5.6.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.
@@ -26,5 +26,9 @@ export declare class PackageDefinitions implements PackageDefinitionsCache {
26
26
  reset(options?: {
27
27
  newConfig?: unknown;
28
28
  }): void;
29
+ /**
30
+ * Remove one package from the cache.
31
+ */
32
+ resetPackage(packagePath: string): void;
29
33
  }
30
34
  //# sourceMappingURL=PackageDefinitions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PackageDefinitions.d.ts","sourceRoot":"","sources":["../src/PackageDefinitions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,0BAA0B,EAC1B,uBAAuB,EACvB,2BAA2B,EAC5B,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAG9D,qBAAa,kBAAmB,YAAW,uBAAuB;IAChE,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,uBAAuB,CAA8B;IAC7D,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,mBAAmB,CAAuD;IAElF;;;;;OAKG;gBACS,eAAe,GAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAM,EAAE,MAAM,CAAC,EAAE,OAAO;IAQzE,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,2BAAgC,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IA+C3G;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,0BAA0B;IAO3E;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE;CAcxC"}
1
+ {"version":3,"file":"PackageDefinitions.d.ts","sourceRoot":"","sources":["../src/PackageDefinitions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,0BAA0B,EAC1B,uBAAuB,EACvB,2BAA2B,EAC5B,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAU9D,qBAAa,kBAAmB,YAAW,uBAAuB;IAChE,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,uBAAuB,CAA8B;IAC7D,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,mBAAmB,CAAuD;IAElF;;;;;OAKG;gBACS,eAAe,GAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAM,EAAE,MAAM,CAAC,EAAE,OAAO;IAQzE,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,2BAAgC,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IA+C3G;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,0BAA0B;IAO3E;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE;IAYvC;;OAEG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM;CAIjC"}
@@ -1,6 +1,12 @@
1
1
  import path from 'path';
2
2
  import { readJson } from '@ms-cloudpack/json-utilities';
3
3
  import { getApplyOverridesTransform } from '@ms-cloudpack/package-overrides';
4
+ import { getNonSemverTransform } from './getNonSemverTransform.js';
5
+ /**
6
+ * `nonSemverTransform` has state defined when the function is called, so we need a wrapper function
7
+ * which returns new transforms to ensure that state is cleared when resetting.
8
+ */
9
+ const getDefaultTransforms = () => [getNonSemverTransform(), getApplyOverridesTransform()];
4
10
  export class PackageDefinitions {
5
11
  /**
6
12
  * Constructor for PackageDefinitions.
@@ -13,13 +19,13 @@ export class PackageDefinitions {
13
19
  this._definitions = definitionCache;
14
20
  this._transformedDefinitions = {};
15
21
  this._config = config;
16
- this._transforms = [getApplyOverridesTransform()];
22
+ this._transforms = [...getDefaultTransforms()];
17
23
  this._transformFactories = [];
18
24
  }
19
25
  async get(packagePath, options = {}) {
20
26
  let definition = this._definitions[packagePath];
21
27
  let transformedDefinition = this._transformedDefinitions[packagePath];
22
- const { refresh, disableTransforms } = options;
28
+ const { refresh, disableTransforms, importerContext } = options;
23
29
  // If we already have the answer they need, return immediately.
24
30
  if (!refresh) {
25
31
  if (disableTransforms && definition) {
@@ -45,7 +51,7 @@ export class PackageDefinitions {
45
51
  transformedDefinition = definition;
46
52
  for (const transform of this._transforms) {
47
53
  transformedDefinition =
48
- (await transform({ definition: transformedDefinition, packagePath, packages: this })) ||
54
+ (await transform({ definition: transformedDefinition, packagePath, packages: this, importerContext })) ||
49
55
  transformedDefinition;
50
56
  }
51
57
  this._transformedDefinitions[packagePath] = transformedDefinition;
@@ -71,11 +77,15 @@ export class PackageDefinitions {
71
77
  const { newConfig } = options || {};
72
78
  if (newConfig) {
73
79
  this._config = newConfig;
74
- this._transforms = [
75
- getApplyOverridesTransform(),
76
- ...this._transformFactories.map((factory) => factory(newConfig)),
77
- ];
80
+ this._transforms = [...getDefaultTransforms(), ...this._transformFactories.map((factory) => factory(newConfig))];
78
81
  }
79
82
  }
83
+ /**
84
+ * Remove one package from the cache.
85
+ */
86
+ resetPackage(packagePath) {
87
+ delete this._definitions[packagePath];
88
+ delete this._transformedDefinitions[packagePath];
89
+ }
80
90
  }
81
91
  //# sourceMappingURL=PackageDefinitions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PackageDefinitions.js","sourceRoot":"","sources":["../src/PackageDefinitions.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\nimport type {\n PackageDefinitionTransform,\n PackageDefinitionsCache,\n GetPackageDefinitionOptions,\n} from '@ms-cloudpack/bundler-types';\nimport { readJson } from '@ms-cloudpack/json-utilities';\nimport type { PackageJson } from '@ms-cloudpack/config-types';\nimport { getApplyOverridesTransform } from '@ms-cloudpack/package-overrides';\n\nexport class PackageDefinitions implements PackageDefinitionsCache {\n private _definitions: Record<string, PackageJson>;\n private _transformedDefinitions: Record<string, PackageJson>;\n private _config: unknown;\n private _transforms: PackageDefinitionTransform[] = [];\n private _transformFactories: ((config?: unknown) => PackageDefinitionTransform)[];\n\n /**\n * Constructor for PackageDefinitions.\n * @param definitionCache - The map of package paths to package definitions, used mainly for testing.\n * @param config - The optional config object to pass to transforms. When `reset` is called with a new value, the\n * transforms will be re-created using the new config.\n */\n constructor(definitionCache: Record<string, PackageJson> = {}, config?: unknown) {\n this._definitions = definitionCache;\n this._transformedDefinitions = {};\n this._config = config;\n this._transforms = [getApplyOverridesTransform()];\n this._transformFactories = [];\n }\n\n async get(packagePath: string, options: GetPackageDefinitionOptions = {}): Promise<PackageJson | undefined> {\n let definition: PackageJson | undefined = this._definitions[packagePath];\n let transformedDefinition: PackageJson | undefined = this._transformedDefinitions[packagePath];\n const { refresh, disableTransforms } = options;\n\n // If we already have the answer they need, return immediately.\n if (!refresh) {\n if (disableTransforms && definition) {\n return definition;\n }\n\n if (!disableTransforms && transformedDefinition) {\n return transformedDefinition;\n }\n }\n\n // If we don't have the definition, try to load it.\n if (!definition || refresh) {\n definition = await readJson(path.join(packagePath, 'package.json'));\n\n if (!definition) {\n return undefined;\n }\n\n this._definitions[packagePath] = definition;\n }\n\n if (disableTransforms) {\n return definition;\n }\n\n // If we don't want to skip the transform, transform the definition.\n if (!transformedDefinition || refresh) {\n transformedDefinition = definition;\n\n for (const transform of this._transforms) {\n transformedDefinition =\n (await transform({ definition: transformedDefinition, packagePath, packages: this })) ||\n transformedDefinition;\n }\n\n this._transformedDefinitions[packagePath] = transformedDefinition;\n }\n\n return transformedDefinition;\n }\n\n /**\n * Registers a transform factory function, which will be called on initialization, and when reset, to re-generate\n * the transform function. Transform functions are called only when the package definition hasn't been loaded before,\n * and the result will be cached. Calling `reset` will reset the cache.\n */\n registerTransform(factory: (config?: unknown) => PackageDefinitionTransform) {\n this._transformFactories.push(factory);\n this._transforms.push(factory(this._config));\n\n this.reset();\n }\n\n /**\n * Resets the cache of package definitions. This is useful when testing, to ensure that the cache is empty.\n */\n reset(options?: { newConfig?: unknown }) {\n this._definitions = {};\n this._transformedDefinitions = {};\n\n const { newConfig } = options || {};\n\n if (newConfig) {\n this._config = newConfig;\n this._transforms = [\n getApplyOverridesTransform(),\n ...this._transformFactories.map((factory) => factory(newConfig)),\n ];\n }\n }\n}\n"]}
1
+ {"version":3,"file":"PackageDefinitions.js","sourceRoot":"","sources":["../src/PackageDefinitions.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\nimport type {\n PackageDefinitionTransform,\n PackageDefinitionsCache,\n GetPackageDefinitionOptions,\n} from '@ms-cloudpack/bundler-types';\nimport { readJson } from '@ms-cloudpack/json-utilities';\nimport type { PackageJson } from '@ms-cloudpack/config-types';\nimport { getApplyOverridesTransform } from '@ms-cloudpack/package-overrides';\nimport { getNonSemverTransform } from './getNonSemverTransform.js';\n\n/**\n * `nonSemverTransform` has state defined when the function is called, so we need a wrapper function\n * which returns new transforms to ensure that state is cleared when resetting.\n */\nconst getDefaultTransforms = () => [getNonSemverTransform(), getApplyOverridesTransform()];\n\nexport class PackageDefinitions implements PackageDefinitionsCache {\n private _definitions: Record<string, PackageJson>;\n private _transformedDefinitions: Record<string, PackageJson>;\n private _config: unknown;\n private _transforms: PackageDefinitionTransform[] = [];\n private _transformFactories: ((config?: unknown) => PackageDefinitionTransform)[];\n\n /**\n * Constructor for PackageDefinitions.\n * @param definitionCache - The map of package paths to package definitions, used mainly for testing.\n * @param config - The optional config object to pass to transforms. When `reset` is called with a new value, the\n * transforms will be re-created using the new config.\n */\n constructor(definitionCache: Record<string, PackageJson> = {}, config?: unknown) {\n this._definitions = definitionCache;\n this._transformedDefinitions = {};\n this._config = config;\n this._transforms = [...getDefaultTransforms()];\n this._transformFactories = [];\n }\n\n async get(packagePath: string, options: GetPackageDefinitionOptions = {}): Promise<PackageJson | undefined> {\n let definition: PackageJson | undefined = this._definitions[packagePath];\n let transformedDefinition: PackageJson | undefined = this._transformedDefinitions[packagePath];\n const { refresh, disableTransforms, importerContext } = options;\n\n // If we already have the answer they need, return immediately.\n if (!refresh) {\n if (disableTransforms && definition) {\n return definition;\n }\n\n if (!disableTransforms && transformedDefinition) {\n return transformedDefinition;\n }\n }\n\n // If we don't have the definition, try to load it.\n if (!definition || refresh) {\n definition = await readJson(path.join(packagePath, 'package.json'));\n\n if (!definition) {\n return undefined;\n }\n\n this._definitions[packagePath] = definition;\n }\n\n if (disableTransforms) {\n return definition;\n }\n\n // If we don't want to skip the transform, transform the definition.\n if (!transformedDefinition || refresh) {\n transformedDefinition = definition;\n\n for (const transform of this._transforms) {\n transformedDefinition =\n (await transform({ definition: transformedDefinition, packagePath, packages: this, importerContext })) ||\n transformedDefinition;\n }\n\n this._transformedDefinitions[packagePath] = transformedDefinition;\n }\n\n return transformedDefinition;\n }\n\n /**\n * Registers a transform factory function, which will be called on initialization, and when reset, to re-generate\n * the transform function. Transform functions are called only when the package definition hasn't been loaded before,\n * and the result will be cached. Calling `reset` will reset the cache.\n */\n registerTransform(factory: (config?: unknown) => PackageDefinitionTransform) {\n this._transformFactories.push(factory);\n this._transforms.push(factory(this._config));\n\n this.reset();\n }\n\n /**\n * Resets the cache of package definitions. This is useful when testing, to ensure that the cache is empty.\n */\n reset(options?: { newConfig?: unknown }) {\n this._definitions = {};\n this._transformedDefinitions = {};\n\n const { newConfig } = options || {};\n\n if (newConfig) {\n this._config = newConfig;\n this._transforms = [...getDefaultTransforms(), ...this._transformFactories.map((factory) => factory(newConfig))];\n }\n }\n\n /**\n * Remove one package from the cache.\n */\n resetPackage(packagePath: string) {\n delete this._definitions[packagePath];\n delete this._transformedDefinitions[packagePath];\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"createExportsMap.d.ts","sourceRoot":"","sources":["../src/createExportsMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAItF;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE;IACP,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,EACD,OAAO,EAAE;IAAE,QAAQ,EAAE,uBAAuB,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GACtE,OAAO,CAAC,kBAAkB,CAAC,CAoF7B"}
1
+ {"version":3,"file":"createExportsMap.d.ts","sourceRoot":"","sources":["../src/createExportsMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAItF;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE;IACP,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,EACD,OAAO,EAAE;IAAE,QAAQ,EAAE,uBAAuB,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GACtE,OAAO,CAAC,kBAAkB,CAAC,CAsF7B"}
@@ -41,21 +41,22 @@ export async function createExportsMap(options, context) {
41
41
  }
42
42
  else if (typeof definition.browser === 'object') {
43
43
  for (const [key, value] of Object.entries(definition.browser)) {
44
- if (value && typeof value === 'string') {
45
- const isDefaultImport = safeRelativePath(module || main) === safeRelativePath(key);
46
- const importPaths = isDefaultImport ? ['.'] : [key];
47
- if (!isDefaultImport && key.endsWith('.js')) {
48
- importPaths.push(key.replace(/\.js$/, ''));
49
- }
50
- for (const importPath of importPaths) {
51
- await addExportsMapEntry({
52
- exports,
53
- packagePath,
54
- importPath,
55
- filePath: value,
56
- condition: 'browser',
57
- }, context);
58
- }
44
+ if (!value || typeof value !== 'string') {
45
+ continue;
46
+ }
47
+ const isDefaultImport = safeRelativePath(module || main) === safeRelativePath(key);
48
+ const importPaths = isDefaultImport ? ['.'] : [key];
49
+ if (!isDefaultImport && key.endsWith('.js')) {
50
+ importPaths.push(key.replace(/\.js$/, ''));
51
+ }
52
+ for (const importPath of importPaths) {
53
+ await addExportsMapEntry({
54
+ exports,
55
+ packagePath,
56
+ importPath,
57
+ filePath: value,
58
+ condition: 'browser',
59
+ }, context);
59
60
  }
60
61
  }
61
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"createExportsMap.js","sourceRoot":"","sources":["../src/createExportsMap.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PackageDefinitionsCache } from '@ms-cloudpack/bundler-types';\nimport type { PackageJsonExports, CloudpackConfig } from '@ms-cloudpack/config-types';\nimport { addExportsMapEntry } from './addExportsMapEntry.js';\nimport { safeRelativePath } from '@ms-cloudpack/path-string-parsing';\n\n/**\n * Given a package path, generates an export map for the package.\n */\nexport async function createExportsMap(\n options: {\n packagePath: string;\n disableTransforms?: boolean;\n },\n context: { packages: PackageDefinitionsCache; config: CloudpackConfig },\n): Promise<PackageJsonExports> {\n const { packagePath } = options;\n const { packages } = context;\n const definition = await packages.get(packagePath, { disableTransforms: options.disableTransforms });\n\n if (!definition) {\n throw new Error(`Package definition not found for ${packagePath}`);\n }\n\n // Don't create an exports map for a definition that already has one.\n if (definition.exports) {\n return definition.exports;\n }\n\n const { browser, main, module, types, typings, type } = definition;\n const exports = {};\n const typesPath = types || typings;\n\n await addExportsMapEntry(\n {\n exports,\n packagePath,\n filePath: 'index.js',\n typesPath,\n condition: type === 'module' ? 'import' : 'default',\n },\n context,\n );\n main &&\n (await addExportsMapEntry(\n {\n exports,\n packagePath,\n filePath: main,\n typesPath,\n condition: type === 'module' ? 'import' : 'default',\n },\n context,\n ),\n context);\n module &&\n (await addExportsMapEntry({ exports, packagePath, filePath: module, typesPath, condition: 'import' }, context));\n\n if (browser) {\n if (typeof definition.browser === 'string') {\n await addExportsMapEntry({ exports, packagePath, filePath: definition.browser, condition: 'browser' }, context);\n } else if (typeof definition.browser === 'object') {\n for (const [key, value] of Object.entries(definition.browser)) {\n if (value && typeof value === 'string') {\n const isDefaultImport = safeRelativePath(module || main) === safeRelativePath(key);\n\n const importPaths = isDefaultImport ? ['.'] : [key];\n\n if (!isDefaultImport && key.endsWith('.js')) {\n importPaths.push(key.replace(/\\.js$/, ''));\n }\n\n for (const importPath of importPaths) {\n await addExportsMapEntry(\n {\n exports,\n packagePath,\n importPath,\n filePath: value,\n condition: 'browser',\n },\n context,\n );\n }\n }\n }\n }\n }\n\n // If we couldn't infer the exports map shape from existing metadata,\n // formulate based off inferred file structure.\n // Note: CRA defaults to src/index.js, Vite defaults to src/main.js\n if (Object.keys(exports).length === 0) {\n (await addExportsMapEntry({ exports, packagePath, filePath: './lib/index.js' }, context)) ||\n (await addExportsMapEntry({ exports, packagePath, filePath: './lib/main.js' }, context)) ||\n (await addExportsMapEntry({ exports, packagePath, filePath: './index.js' }, context));\n }\n\n return exports;\n}\n"]}
1
+ {"version":3,"file":"createExportsMap.js","sourceRoot":"","sources":["../src/createExportsMap.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PackageDefinitionsCache } from '@ms-cloudpack/bundler-types';\nimport type { PackageJsonExports, CloudpackConfig } from '@ms-cloudpack/config-types';\nimport { addExportsMapEntry } from './addExportsMapEntry.js';\nimport { safeRelativePath } from '@ms-cloudpack/path-string-parsing';\n\n/**\n * Given a package path, generates an export map for the package.\n */\nexport async function createExportsMap(\n options: {\n packagePath: string;\n disableTransforms?: boolean;\n },\n context: { packages: PackageDefinitionsCache; config: CloudpackConfig },\n): Promise<PackageJsonExports> {\n const { packagePath } = options;\n const { packages } = context;\n const definition = await packages.get(packagePath, { disableTransforms: options.disableTransforms });\n\n if (!definition) {\n throw new Error(`Package definition not found for ${packagePath}`);\n }\n\n // Don't create an exports map for a definition that already has one.\n if (definition.exports) {\n return definition.exports;\n }\n\n const { browser, main, module, types, typings, type } = definition;\n const exports = {};\n const typesPath = types || typings;\n\n await addExportsMapEntry(\n {\n exports,\n packagePath,\n filePath: 'index.js',\n typesPath,\n condition: type === 'module' ? 'import' : 'default',\n },\n context,\n );\n main &&\n (await addExportsMapEntry(\n {\n exports,\n packagePath,\n filePath: main,\n typesPath,\n condition: type === 'module' ? 'import' : 'default',\n },\n context,\n ),\n context);\n module &&\n (await addExportsMapEntry({ exports, packagePath, filePath: module, typesPath, condition: 'import' }, context));\n\n if (browser) {\n if (typeof definition.browser === 'string') {\n await addExportsMapEntry({ exports, packagePath, filePath: definition.browser, condition: 'browser' }, context);\n } else if (typeof definition.browser === 'object') {\n for (const [key, value] of Object.entries(definition.browser)) {\n if (!value || typeof value !== 'string') {\n continue;\n }\n\n const isDefaultImport = safeRelativePath(module || main) === safeRelativePath(key);\n\n const importPaths = isDefaultImport ? ['.'] : [key];\n\n if (!isDefaultImport && key.endsWith('.js')) {\n importPaths.push(key.replace(/\\.js$/, ''));\n }\n\n for (const importPath of importPaths) {\n await addExportsMapEntry(\n {\n exports,\n packagePath,\n importPath,\n filePath: value,\n condition: 'browser',\n },\n context,\n );\n }\n }\n }\n }\n\n // If we couldn't infer the exports map shape from existing metadata,\n // formulate based off inferred file structure.\n // Note: CRA defaults to src/index.js, Vite defaults to src/main.js\n if (Object.keys(exports).length === 0) {\n (await addExportsMapEntry({ exports, packagePath, filePath: './lib/index.js' }, context)) ||\n (await addExportsMapEntry({ exports, packagePath, filePath: './lib/main.js' }, context)) ||\n (await addExportsMapEntry({ exports, packagePath, filePath: './index.js' }, context));\n }\n\n return exports;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"findPackagesFromPath.d.ts","sourceRoot":"","sources":["../../src/createResolveMap/findPackagesFromPath.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAQ3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIzD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE;IACP;;OAEG;IACH,WAAW,EAAE,MAAM,EAAE,CAAC;IAEtB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,EACD,OAAO,EAAE;IACP;;OAEG;IACH,QAAQ,EAAE,uBAAuB,CAAC;CACnC,GACA,OAAO,CAAC,UAAU,CAAC,CA0CrB"}
1
+ {"version":3,"file":"findPackagesFromPath.d.ts","sourceRoot":"","sources":["../../src/createResolveMap/findPackagesFromPath.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAA0B,MAAM,6BAA6B,CAAC;AAQnG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAMzD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE;IACP;;OAEG;IACH,WAAW,EAAE,MAAM,EAAE,CAAC;IAEtB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,EACD,OAAO,EAAE;IACP;;OAEG;IACH,QAAQ,EAAE,uBAAuB,CAAC;CACnC,GACA,OAAO,CAAC,UAAU,CAAC,CAkDrB"}
@@ -29,17 +29,24 @@ export async function findPackagesFromPath(options, context) {
29
29
  let pathsToVisit;
30
30
  if (discoverPackages) {
31
31
  const packagePaths = await glob('**/package.json', { cwd: searchPath, ignore: ['**/node_modules/**'] });
32
- pathsToVisit = packagePaths.map((p) => path.dirname(path.join(searchPath, p)));
32
+ pathsToVisit = packagePaths.map((p) => ({ packagePath: path.dirname(path.join(searchPath, p)) }));
33
33
  }
34
34
  else {
35
- pathsToVisit = [searchPath];
35
+ pathsToVisit = [{ packagePath: searchPath }];
36
36
  }
37
37
  while (pathsToVisit.length) {
38
38
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- already checked length
39
- const packagePath = pathsToVisit.shift();
39
+ const { packagePath, importerContext } = pathsToVisit.shift();
40
+ // There's a very slight possibility (not yet observed even in large repos) that both semver
41
+ // and non-semver dependencies could resolve to the same package name and version and therefore
42
+ // be installed at the same path. (If the non-semver dependency was encountered first, the
43
+ // version and possibly name in the package definition would have been transformed to match by
44
+ // getNonSemverTransform.) It would be possible to detect this case if needed, but for now we're
45
+ // not going to bother because it's so rare/theoretical and the effect in practice will probably
46
+ // be the same as a dependency that's forced with `resolutions` to a version violating semver.
40
47
  if (!visitedPaths.has(packagePath)) {
41
48
  visitedPaths.add(packagePath);
42
- const dependencyPaths = await visitPackage({ packagePath, packageMap, gitRootPath }, context);
49
+ const dependencyPaths = await visitPackage({ packagePath, packageMap, gitRootPath, importerContext }, context);
43
50
  pathsToVisit.push(...dependencyPaths);
44
51
  }
45
52
  }
@@ -51,9 +58,9 @@ export async function findPackagesFromPath(options, context) {
51
58
  * Returns a list of additional dependency paths to visit.
52
59
  */
53
60
  async function visitPackage(options, context) {
54
- const { packagePath, packageMap, gitRootPath } = options;
61
+ const { packagePath, packageMap, gitRootPath, importerContext } = options;
55
62
  const { packages } = context;
56
- const packageDefinition = await packages.get(packagePath);
63
+ const packageDefinition = await packages.get(packagePath, { importerContext });
57
64
  if (!packageDefinition) {
58
65
  throw new Error(`Could not find package definition at "${packagePath}".`);
59
66
  }
@@ -66,7 +73,13 @@ async function visitPackage(options, context) {
66
73
  const dependencies = getDependencies(packageDefinition);
67
74
  const dependencyPaths = [];
68
75
  for (const [dependencyName, versionRequirement] of Object.entries(dependencies)) {
69
- const dependencyPackage = await findPackage({ dependencyName, startPath: packagePath, gitRootPath }, context);
76
+ const depImporterContext = {
77
+ parentName: name,
78
+ parentVersion: version,
79
+ importedName: dependencyName,
80
+ versionRequirement,
81
+ };
82
+ const dependencyPackage = await findPackage({ dependencyName, startPath: packagePath, gitRootPath, importerContext: depImporterContext }, context);
70
83
  if (!dependencyPackage) {
71
84
  if (packageDefinition.peerDependencies?.[dependencyName]) {
72
85
  // Ignore missing peer dependencies
@@ -85,7 +98,10 @@ async function visitPackage(options, context) {
85
98
  });
86
99
  entry.dependencies[dependencyDefinition.name] = dependencyDefinition.version;
87
100
  dependencyEntry.requiredBy[`${name}@${version}`] = versionRequirement;
88
- dependencyPaths.push(dependencyPath);
101
+ dependencyPaths.push({
102
+ packagePath: dependencyPath,
103
+ importerContext: depImporterContext,
104
+ });
89
105
  }
90
106
  return dependencyPaths;
91
107
  }
@@ -95,7 +111,8 @@ async function visitPackage(options, context) {
95
111
  */
96
112
  function ensurePackageEntry(options) {
97
113
  const { packagePath = '', packageMap, definition } = options;
98
- const { name = '_no_name_', version = '*' } = definition;
114
+ // the caller verified that these are set
115
+ const { name, version } = definition;
99
116
  packageMap[name] ??= {};
100
117
  let entry = packageMap[name][version];
101
118
  if (!entry) {
@@ -1 +1 @@
1
- {"version":3,"file":"findPackagesFromPath.js","sourceRoot":"","sources":["../../src/createResolveMap/findPackagesFromPath.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PackageDefinitionsCache } from '@ms-cloudpack/bundler-types';\nimport type { PackageJson } from '@ms-cloudpack/config-types';\nimport { isFolder } from '@ms-cloudpack/path-utilities';\nimport glob from 'fast-glob';\nimport path from 'path';\nimport { findGitRoot } from 'workspace-tools';\nimport { findPackage } from '../findPackage.js';\nimport { isExternalPackage } from '../isExternalPackage.js';\nimport type { PackageMap } from '../types/PackageMap.js';\nimport type { ResolveMapEntry } from '../types/ResolveMapEntry.js';\nimport { getDependencies } from '../getDependencies.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(\n options: {\n /**\n * Paths to search for package.json files and traverse their dependencies to build a PackageMap.\n */\n searchPaths: string[];\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 glob for all package.json files in the path and add them to the map.\n */\n discoverPackages?: boolean;\n },\n context: {\n /**\n * Package cache.\n */\n packages: PackageDefinitionsCache;\n },\n): Promise<PackageMap> {\n const { searchPaths, discoverPackages } = options;\n const packageMap: PackageMap = {};\n const visitedPaths = new Set<string>();\n\n for (const searchPath of searchPaths) {\n if (!(await isFolder(searchPath))) {\n throw new Error(`Path ${searchPath} is not a folder.`);\n }\n\n let { gitRootPath } = options;\n if (!gitRootPath) {\n try {\n gitRootPath = findGitRoot(searchPath);\n } catch (e) {\n /* ignore */\n }\n }\n\n let pathsToVisit: string[];\n\n if (discoverPackages) {\n const packagePaths = await glob('**/package.json', { cwd: searchPath, ignore: ['**/node_modules/**'] });\n\n pathsToVisit = packagePaths.map((p) => path.dirname(path.join(searchPath, p)));\n } else {\n pathsToVisit = [searchPath];\n }\n\n while (pathsToVisit.length) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- already checked length\n const packagePath = pathsToVisit.shift()!;\n if (!visitedPaths.has(packagePath)) {\n visitedPaths.add(packagePath);\n\n const dependencyPaths = await visitPackage({ packagePath, packageMap, gitRootPath }, context);\n pathsToVisit.push(...dependencyPaths);\n }\n }\n }\n\n return packageMap;\n}\n\n/**\n * Visit a package path, and add entries for the package and its dependencies to `packageMap`.\n * Returns a list of additional dependency paths to visit.\n */\nasync function visitPackage(\n options: {\n packagePath: string;\n packageMap: PackageMap;\n gitRootPath: string | undefined;\n },\n context: Parameters<typeof findPackage>[1],\n) {\n const { packagePath, packageMap, gitRootPath } = options;\n const { packages } = context;\n\n const packageDefinition = await packages.get(packagePath);\n if (!packageDefinition) {\n throw new Error(`Could not find package definition at \"${packagePath}\".`);\n }\n if (!(packageDefinition.name && packageDefinition.version)) {\n return [];\n }\n\n const { name, version } = packageDefinition;\n const entry = ensurePackageEntry({ packagePath: packagePath, packageMap, definition: packageDefinition });\n\n // Add all dependencies to the list of paths to visit.\n const dependencies = getDependencies(packageDefinition) as Record<string, string>;\n\n const dependencyPaths: string[] = [];\n\n for (const [dependencyName, versionRequirement] of Object.entries(dependencies)) {\n const dependencyPackage = await findPackage({ dependencyName, startPath: packagePath, gitRootPath }, context);\n if (!dependencyPackage) {\n if (packageDefinition.peerDependencies?.[dependencyName]) {\n // Ignore missing peer dependencies\n continue;\n }\n throw new Error(`Could not find dependency \"${dependencyName}\" at \"${packagePath}\".`);\n }\n\n const { packagePath: dependencyPath, definition: dependencyDefinition } = dependencyPackage;\n\n if (!(dependencyDefinition.name && dependencyDefinition.version)) {\n throw new Error(`\"${dependencyPath}/package.json\" is missing a name or version.`);\n }\n\n const dependencyEntry = ensurePackageEntry({\n packagePath: dependencyPath,\n packageMap,\n definition: dependencyDefinition,\n });\n\n entry.dependencies[dependencyDefinition.name] = dependencyDefinition.version;\n dependencyEntry.requiredBy[`${name}@${version}`] = versionRequirement;\n\n dependencyPaths.push(dependencyPath);\n }\n\n return dependencyPaths;\n}\n\n/**\n * If `packageMap` doesn't already have an entry for this package name and version, create one\n * and add it to `packageMap`. Returns the entry.\n */\nfunction ensurePackageEntry(options: {\n packagePath: string;\n packageMap: PackageMap;\n definition: PackageJson;\n}): ResolveMapEntry {\n const { packagePath = '', packageMap, definition } = options;\n const { name = '_no_name_', version = '*' } = definition;\n\n packageMap[name] ??= {};\n\n let entry = packageMap[name][version];\n if (!entry) {\n entry = packageMap[name][version] = {\n name,\n version,\n path: packagePath,\n dependencies: {},\n requiredBy: {},\n };\n\n if (isExternalPackage(packagePath)) {\n entry.isExternal = true;\n }\n }\n\n return entry;\n}\n"]}
1
+ {"version":3,"file":"findPackagesFromPath.js","sourceRoot":"","sources":["../../src/createResolveMap/findPackagesFromPath.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG5D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAIxD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAgBC,EACD,OAKC;IAED,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC;IAClD,MAAM,UAAU,GAAe,EAAE,CAAC;IAClC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IAEvC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;QACpC,IAAI,CAAC,CAAC,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE;YACjC,MAAM,IAAI,KAAK,CAAC,QAAQ,UAAU,mBAAmB,CAAC,CAAC;SACxD;QAED,IAAI,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;QAC9B,IAAI,CAAC,WAAW,EAAE;YAChB,IAAI;gBACF,WAAW,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;aACvC;YAAC,OAAO,CAAC,EAAE;gBACV,YAAY;aACb;SACF;QAED,IAAI,YAA+B,CAAC;QAEpC,IAAI,gBAAgB,EAAE;YACpB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;YAExG,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACnG;aAAM;YACL,YAAY,GAAG,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC;SAC9C;QAED,OAAO,YAAY,CAAC,MAAM,EAAE;YAC1B,8FAA8F;YAC9F,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,YAAY,CAAC,KAAK,EAAG,CAAC;YAE/D,4FAA4F;YAC5F,+FAA+F;YAC/F,0FAA0F;YAC1F,8FAA8F;YAC9F,gGAAgG;YAChG,gGAAgG;YAChG,8FAA8F;YAC9F,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;gBAClC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBAE9B,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,EAAE,OAAO,CAAC,CAAC;gBAC/G,YAAY,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;aACvC;SACF;KACF;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,YAAY,CACzB,OAGC,EACD,OAAmD;IAEnD,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IAC1E,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE7B,MAAM,iBAAiB,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;IAC/E,IAAI,CAAC,iBAAiB,EAAE;QACtB,MAAM,IAAI,KAAK,CAAC,yCAAyC,WAAW,IAAI,CAAC,CAAC;KAC3E;IACD,IAAI,CAAC,CAAC,iBAAiB,CAAC,IAAI,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE;QAC1D,OAAO,EAAE,CAAC;KACX;IAED,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,iBAAiB,CAAC;IAC5C,MAAM,KAAK,GAAG,kBAAkB,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAE1G,sDAAsD;IACtD,MAAM,YAAY,GAAG,eAAe,CAAC,iBAAiB,CAA2B,CAAC;IAElF,MAAM,eAAe,GAAsB,EAAE,CAAC;IAE9C,KAAK,MAAM,CAAC,cAAc,EAAE,kBAAkB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;QAC/E,MAAM,kBAAkB,GAA2B;YACjD,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,OAAO;YACtB,YAAY,EAAE,cAAc;YAC5B,kBAAkB;SACnB,CAAC;QAEF,MAAM,iBAAiB,GAAG,MAAM,WAAW,CACzC,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,EAC5F,OAAO,CACR,CAAC;QACF,IAAI,CAAC,iBAAiB,EAAE;YACtB,IAAI,iBAAiB,CAAC,gBAAgB,EAAE,CAAC,cAAc,CAAC,EAAE;gBACxD,mCAAmC;gBACnC,SAAS;aACV;YACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,cAAc,SAAS,WAAW,IAAI,CAAC,CAAC;SACvF;QAED,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,oBAAoB,EAAE,GAAG,iBAAiB,CAAC;QAE5F,IAAI,CAAC,CAAC,oBAAoB,CAAC,IAAI,IAAI,oBAAoB,CAAC,OAAO,CAAC,EAAE;YAChE,MAAM,IAAI,KAAK,CAAC,IAAI,cAAc,8CAA8C,CAAC,CAAC;SACnF;QAED,MAAM,eAAe,GAAG,kBAAkB,CAAC;YACzC,WAAW,EAAE,cAAc;YAC3B,UAAU;YACV,UAAU,EAAE,oBAAoB;SACjC,CAAC,CAAC;QAEH,KAAK,CAAC,YAAY,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,OAAO,CAAC;QAC7E,eAAe,CAAC,UAAU,CAAC,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC,GAAG,kBAAkB,CAAC;QAEtE,eAAe,CAAC,IAAI,CAAC;YACnB,WAAW,EAAE,cAAc;YAC3B,eAAe,EAAE,kBAAkB;SACpC,CAAC,CAAC;KACJ;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB,CAAC,OAI3B;IACC,MAAM,EAAE,WAAW,GAAG,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAC7D,yCAAyC;IACzC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAmC,CAAC;IAE9D,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAExB,IAAI,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK,EAAE;QACV,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG;YAClC,IAAI;YACJ,OAAO;YACP,IAAI,EAAE,WAAW;YACjB,YAAY,EAAE,EAAE;YAChB,UAAU,EAAE,EAAE;SACf,CAAC;QAEF,IAAI,iBAAiB,CAAC,WAAW,CAAC,EAAE;YAClC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;SACzB;KACF;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import type { PackageDefinitionsCache, PackageImporterContext } from '@ms-cloudpack/bundler-types';\nimport type { PackageJson } from '@ms-cloudpack/config-types';\nimport { isFolder } from '@ms-cloudpack/path-utilities';\nimport glob from 'fast-glob';\nimport path from 'path';\nimport { findGitRoot } from 'workspace-tools';\nimport { findPackage } from '../findPackage.js';\nimport { isExternalPackage } from '../isExternalPackage.js';\nimport type { PackageMap } from '../types/PackageMap.js';\nimport type { ResolveMapEntry } from '../types/ResolveMapEntry.js';\nimport { getDependencies } from '../getDependencies.js';\n\ntype PackagePathInfo = { packagePath: string; importerContext?: PackageImporterContext };\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(\n options: {\n /**\n * Paths to search for package.json files and traverse their dependencies to build a PackageMap.\n */\n searchPaths: string[];\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 glob for all package.json files in the path and add them to the map.\n */\n discoverPackages?: boolean;\n },\n context: {\n /**\n * Package cache.\n */\n packages: PackageDefinitionsCache;\n },\n): Promise<PackageMap> {\n const { searchPaths, discoverPackages } = options;\n const packageMap: PackageMap = {};\n const visitedPaths = new Set<string>();\n\n for (const searchPath of searchPaths) {\n if (!(await isFolder(searchPath))) {\n throw new Error(`Path ${searchPath} is not a folder.`);\n }\n\n let { gitRootPath } = options;\n if (!gitRootPath) {\n try {\n gitRootPath = findGitRoot(searchPath);\n } catch (e) {\n /* ignore */\n }\n }\n\n let pathsToVisit: PackagePathInfo[];\n\n if (discoverPackages) {\n const packagePaths = await glob('**/package.json', { cwd: searchPath, ignore: ['**/node_modules/**'] });\n\n pathsToVisit = packagePaths.map((p) => ({ packagePath: path.dirname(path.join(searchPath, p)) }));\n } else {\n pathsToVisit = [{ packagePath: searchPath }];\n }\n\n while (pathsToVisit.length) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- already checked length\n const { packagePath, importerContext } = pathsToVisit.shift()!;\n\n // There's a very slight possibility (not yet observed even in large repos) that both semver\n // and non-semver dependencies could resolve to the same package name and version and therefore\n // be installed at the same path. (If the non-semver dependency was encountered first, the\n // version and possibly name in the package definition would have been transformed to match by\n // getNonSemverTransform.) It would be possible to detect this case if needed, but for now we're\n // not going to bother because it's so rare/theoretical and the effect in practice will probably\n // be the same as a dependency that's forced with `resolutions` to a version violating semver.\n if (!visitedPaths.has(packagePath)) {\n visitedPaths.add(packagePath);\n\n const dependencyPaths = await visitPackage({ packagePath, packageMap, gitRootPath, importerContext }, context);\n pathsToVisit.push(...dependencyPaths);\n }\n }\n }\n\n return packageMap;\n}\n\n/**\n * Visit a package path, and add entries for the package and its dependencies to `packageMap`.\n * Returns a list of additional dependency paths to visit.\n */\nasync function visitPackage(\n options: PackagePathInfo & {\n packageMap: PackageMap;\n gitRootPath: string | undefined;\n },\n context: Parameters<typeof findPackagesFromPath>[1],\n) {\n const { packagePath, packageMap, gitRootPath, importerContext } = options;\n const { packages } = context;\n\n const packageDefinition = await packages.get(packagePath, { importerContext });\n if (!packageDefinition) {\n throw new Error(`Could not find package definition at \"${packagePath}\".`);\n }\n if (!(packageDefinition.name && packageDefinition.version)) {\n return [];\n }\n\n const { name, version } = packageDefinition;\n const entry = ensurePackageEntry({ packagePath: packagePath, packageMap, definition: packageDefinition });\n\n // Add all dependencies to the list of paths to visit.\n const dependencies = getDependencies(packageDefinition) as Record<string, string>;\n\n const dependencyPaths: PackagePathInfo[] = [];\n\n for (const [dependencyName, versionRequirement] of Object.entries(dependencies)) {\n const depImporterContext: PackageImporterContext = {\n parentName: name,\n parentVersion: version,\n importedName: dependencyName,\n versionRequirement,\n };\n\n const dependencyPackage = await findPackage(\n { dependencyName, startPath: packagePath, gitRootPath, importerContext: depImporterContext },\n context,\n );\n if (!dependencyPackage) {\n if (packageDefinition.peerDependencies?.[dependencyName]) {\n // Ignore missing peer dependencies\n continue;\n }\n throw new Error(`Could not find dependency \"${dependencyName}\" at \"${packagePath}\".`);\n }\n\n const { packagePath: dependencyPath, definition: dependencyDefinition } = dependencyPackage;\n\n if (!(dependencyDefinition.name && dependencyDefinition.version)) {\n throw new Error(`\"${dependencyPath}/package.json\" is missing a name or version.`);\n }\n\n const dependencyEntry = ensurePackageEntry({\n packagePath: dependencyPath,\n packageMap,\n definition: dependencyDefinition,\n });\n\n entry.dependencies[dependencyDefinition.name] = dependencyDefinition.version;\n dependencyEntry.requiredBy[`${name}@${version}`] = versionRequirement;\n\n dependencyPaths.push({\n packagePath: dependencyPath,\n importerContext: depImporterContext,\n });\n }\n\n return dependencyPaths;\n}\n\n/**\n * If `packageMap` doesn't already have an entry for this package name and version, create one\n * and add it to `packageMap`. Returns the entry.\n */\nfunction ensurePackageEntry(options: {\n packagePath: string;\n packageMap: PackageMap;\n definition: PackageJson;\n}): ResolveMapEntry {\n const { packagePath = '', packageMap, definition } = options;\n // the caller verified that these are set\n const { name, version } = definition as Required<PackageJson>;\n\n packageMap[name] ??= {};\n\n let entry = packageMap[name][version];\n if (!entry) {\n entry = packageMap[name][version] = {\n name,\n version,\n path: packagePath,\n dependencies: {},\n requiredBy: {},\n };\n\n if (isExternalPackage(packagePath)) {\n entry.isExternal = true;\n }\n }\n\n return entry;\n}\n"]}
@@ -1,12 +1,10 @@
1
- export type ModuleType = 'esm' | 'cjs';
2
1
  /**
3
- * Determines if the given source is commonjs or esm.
4
- * @returns "esm" | "cjs" | undefined
2
+ * Module type of a source file. Undefined implies that we can not determine the module type.
5
3
  */
6
- export declare function detectModuleTypeFromSource(source: string): ModuleType | undefined;
4
+ export type ModuleType = 'esm' | 'cjs' | undefined;
5
+ export declare function detectModuleTypeFromSource(source: string): ModuleType;
7
6
  /**
8
7
  * Determines if the given file is commonjs or esm.
9
- * @returns "esm" | "cjs" | undefined
10
8
  */
11
- export declare function detectModuleType(filePath: string): Promise<ModuleType | undefined>;
9
+ export declare function detectModuleType(filePath: string): Promise<ModuleType>;
12
10
  //# sourceMappingURL=detectModuleType.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"detectModuleType.d.ts","sourceRoot":"","sources":["../src/detectModuleType.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC;AAEvC;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAYjF;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAUxF"}
1
+ {"version":3,"file":"detectModuleType.d.ts","sourceRoot":"","sources":["../src/detectModuleType.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC;AAEnD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAoGrE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAU5E"}
@@ -1,26 +1,102 @@
1
1
  import fsPromises from 'fs/promises';
2
- function removeComments(source) {
3
- // Takes a string of code, not an actual function.
4
- return source.replace(/\/\*[\s\S]*?\*\/|\/\/.*/g, '').trim(); // Strip comments
5
- }
6
- /**
7
- * Determines if the given source is commonjs or esm.
8
- * @returns "esm" | "cjs" | undefined
9
- */
2
+ import { parse } from 'acorn';
3
+ import { simple } from 'acorn-walk';
10
4
  export function detectModuleTypeFromSource(source) {
11
- let result;
12
- const content = removeComments(source);
13
- if (content.match(/\b(?:import|export)\s+[*{_$a-zA-Z]/)) {
14
- result = 'esm';
5
+ let ast;
6
+ try {
7
+ ast = parse(source, {
8
+ ecmaVersion: 'latest',
9
+ sourceType: 'module', // Try to parse as a module first.
10
+ });
11
+ }
12
+ catch (err) {
13
+ // If the parse fails, try again as a script.
14
+ try {
15
+ ast = parse(source, {
16
+ ecmaVersion: 'latest',
17
+ sourceType: 'script', // Parse as a script for CommonJS.
18
+ });
19
+ }
20
+ catch (e) {
21
+ // If parsing fails again, the code is not valid JavaScript or too complex for a simple parse.
22
+ return undefined;
23
+ }
24
+ }
25
+ let isCJS = false;
26
+ let isESM = false;
27
+ const returnESM = () => {
28
+ isESM = true;
29
+ throw new Error('Found moduleType.');
30
+ };
31
+ const returnCJS = () => {
32
+ isCJS = true;
33
+ // Note, we do not throw for CJS and instead parse the full file. Sometimes ESM output can still have checks
34
+ // for CommonJS, and short circuiting too soon might miss ESM syntax.
35
+ };
36
+ try {
37
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
38
+ simple(ast, {
39
+ // ESM checks
40
+ ImportDeclaration: returnESM,
41
+ ExportNamedDeclaration: returnESM,
42
+ ExportAllDeclaration: returnESM,
43
+ ExportDefaultDeclaration: returnESM,
44
+ // CommonJS checks
45
+ CallExpression(node) {
46
+ if (isCallExpression(node) && node.callee.type === 'Identifier' && node.callee.name === 'require') {
47
+ returnCJS();
48
+ }
49
+ },
50
+ Identifier(node) {
51
+ if (isIdentifier(node) && node.name === 'exports') {
52
+ returnCJS();
53
+ }
54
+ },
55
+ UnaryExpression(node) {
56
+ if (isUnaryExpression(node) && node.operator === 'typeof') {
57
+ const argument = node.argument;
58
+ // Handle expressions like `typeof exports`
59
+ if (isIdentifier(argument) && argument.name === 'exports') {
60
+ returnCJS();
61
+ }
62
+ }
63
+ },
64
+ AssignmentExpression(node) {
65
+ if (isAssignmentExpression(node)) {
66
+ const left = node.left;
67
+ // Handle expressions like `module.exports = ...`
68
+ if (isMemberExpression(left)) {
69
+ if ('object' in left &&
70
+ left.object.type === 'Identifier' &&
71
+ left.object.name === 'module' &&
72
+ isIdentifier(left.property) &&
73
+ left.property.name === 'exports') {
74
+ returnCJS();
75
+ }
76
+ // Handle expressions like `exports.someProperty = ...`
77
+ else if ('object' in left && left.object.type === 'Identifier' && left.object.name === 'exports') {
78
+ returnCJS();
79
+ }
80
+ }
81
+ }
82
+ },
83
+ });
84
+ }
85
+ catch {
86
+ /* no-op */
87
+ }
88
+ if (isESM) {
89
+ // Note: While it's possible for a file to include both styles, we'll prefer ESM if we find it.
90
+ return 'esm';
15
91
  }
16
- else if (content.match(/module\.exports[ =]+|exports\.|typeof exports|require\(['"]+/)) {
17
- result = 'cjs';
92
+ else if (isCJS) {
93
+ return 'cjs';
18
94
  }
19
- return result;
95
+ // We didn't find either.
96
+ return undefined;
20
97
  }
21
98
  /**
22
99
  * Determines if the given file is commonjs or esm.
23
- * @returns "esm" | "cjs" | undefined
24
100
  */
25
101
  export async function detectModuleType(filePath) {
26
102
  let source;
@@ -32,4 +108,34 @@ export async function detectModuleType(filePath) {
32
108
  }
33
109
  return detectModuleTypeFromSource(source);
34
110
  }
111
+ /**
112
+ * Type guard for CallExpression.
113
+ */
114
+ function isCallExpression(node) {
115
+ return node.type === 'CallExpression';
116
+ }
117
+ /**
118
+ * Type guard for AssignmentExpression.
119
+ */
120
+ function isAssignmentExpression(node) {
121
+ return node.type === 'AssignmentExpression';
122
+ }
123
+ /**
124
+ * Type guard for MemberExpression.
125
+ */
126
+ function isMemberExpression(node) {
127
+ return node.type === 'MemberExpression';
128
+ }
129
+ /**
130
+ * Type guard for Identifier.
131
+ */
132
+ function isIdentifier(node) {
133
+ return node.type === 'Identifier';
134
+ }
135
+ /**
136
+ * Type guard for UnaryExpression.
137
+ */
138
+ function isUnaryExpression(node) {
139
+ return node.type === 'UnaryExpression';
140
+ }
35
141
  //# sourceMappingURL=detectModuleType.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"detectModuleType.js","sourceRoot":"","sources":["../src/detectModuleType.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,aAAa,CAAC;AAErC,SAAS,cAAc,CAAC,MAAc;IACpC,kDAAkD;IAClD,OAAO,MAAM,CAAC,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,iBAAiB;AACjF,CAAC;AAID;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAc;IACvD,IAAI,MAA8B,CAAC;IAEnC,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAEvC,IAAI,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,EAAE;QACvD,MAAM,GAAG,KAAK,CAAC;KAChB;SAAM,IAAI,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,EAAE;QACxF,MAAM,GAAG,KAAK,CAAC;KAChB;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB;IACrD,IAAI,MAAc,CAAC;IAEnB,IAAI;QACF,MAAM,GAAG,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;KACnE;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,SAAS,CAAC;KAClB;IAED,OAAO,0BAA0B,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["import fsPromises from 'fs/promises';\n\nfunction removeComments(source: string) {\n // Takes a string of code, not an actual function.\n return source.replace(/\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*/g, '').trim(); // Strip comments\n}\n\nexport type ModuleType = 'esm' | 'cjs';\n\n/**\n * Determines if the given source is commonjs or esm.\n * @returns \"esm\" | \"cjs\" | undefined\n */\nexport function detectModuleTypeFromSource(source: string): ModuleType | undefined {\n let result: ModuleType | undefined;\n\n const content = removeComments(source);\n\n if (content.match(/\\b(?:import|export)\\s+[*{_$a-zA-Z]/)) {\n result = 'esm';\n } else if (content.match(/module\\.exports[ =]+|exports\\.|typeof exports|require\\(['\"]+/)) {\n result = 'cjs';\n }\n\n return result;\n}\n\n/**\n * Determines if the given file is commonjs or esm.\n * @returns \"esm\" | \"cjs\" | undefined\n */\nexport async function detectModuleType(filePath: string): Promise<ModuleType | undefined> {\n let source: string;\n\n try {\n source = (await fsPromises.readFile(filePath, 'utf8')).toString();\n } catch (e) {\n return undefined;\n }\n\n return detectModuleTypeFromSource(source);\n}\n"]}
1
+ {"version":3,"file":"detectModuleType.js","sourceRoot":"","sources":["../src/detectModuleType.ts"],"names":[],"mappings":"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","sourcesContent":["import fsPromises from 'fs/promises';\nimport type { AssignmentExpression, CallExpression, Identifier, MemberExpression, Node, UnaryExpression } from 'acorn';\nimport { parse } from 'acorn';\nimport { simple } from 'acorn-walk';\n\n/**\n * Module type of a source file. Undefined implies that we can not determine the module type.\n */\nexport type ModuleType = 'esm' | 'cjs' | undefined;\n\nexport function detectModuleTypeFromSource(source: string): ModuleType {\n let ast: Node;\n\n try {\n ast = parse(source, {\n ecmaVersion: 'latest',\n sourceType: 'module', // Try to parse as a module first.\n });\n } catch (err) {\n // If the parse fails, try again as a script.\n try {\n ast = parse(source, {\n ecmaVersion: 'latest',\n sourceType: 'script', // Parse as a script for CommonJS.\n });\n } catch (e) {\n // If parsing fails again, the code is not valid JavaScript or too complex for a simple parse.\n return undefined;\n }\n }\n\n let isCJS = false;\n let isESM = false;\n\n const returnESM = () => {\n isESM = true;\n throw new Error('Found moduleType.');\n };\n\n const returnCJS = () => {\n isCJS = true;\n // Note, we do not throw for CJS and instead parse the full file. Sometimes ESM output can still have checks\n // for CommonJS, and short circuiting too soon might miss ESM syntax.\n };\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n simple(ast, {\n // ESM checks\n ImportDeclaration: returnESM,\n ExportNamedDeclaration: returnESM,\n ExportAllDeclaration: returnESM,\n ExportDefaultDeclaration: returnESM,\n\n // CommonJS checks\n CallExpression(node: Node) {\n if (isCallExpression(node) && node.callee.type === 'Identifier' && node.callee.name === 'require') {\n returnCJS();\n }\n },\n Identifier(node: Node) {\n if (isIdentifier(node) && node.name === 'exports') {\n returnCJS();\n }\n },\n UnaryExpression(node: Node) {\n if (isUnaryExpression(node) && node.operator === 'typeof') {\n const argument = node.argument;\n\n // Handle expressions like `typeof exports`\n if (isIdentifier(argument) && argument.name === 'exports') {\n returnCJS();\n }\n }\n },\n AssignmentExpression(node: Node) {\n if (isAssignmentExpression(node)) {\n const left = node.left;\n // Handle expressions like `module.exports = ...`\n if (isMemberExpression(left)) {\n if (\n 'object' in left &&\n left.object.type === 'Identifier' &&\n left.object.name === 'module' &&\n isIdentifier(left.property) &&\n left.property.name === 'exports'\n ) {\n returnCJS();\n }\n // Handle expressions like `exports.someProperty = ...`\n else if ('object' in left && left.object.type === 'Identifier' && left.object.name === 'exports') {\n returnCJS();\n }\n }\n }\n },\n });\n } catch {\n /* no-op */\n }\n\n if (isESM) {\n // Note: While it's possible for a file to include both styles, we'll prefer ESM if we find it.\n return 'esm';\n } else if (isCJS) {\n return 'cjs';\n }\n\n // We didn't find either.\n return undefined;\n}\n\n/**\n * Determines if the given file is commonjs or esm.\n */\nexport async function detectModuleType(filePath: string): Promise<ModuleType> {\n let source: string;\n\n try {\n source = (await fsPromises.readFile(filePath, 'utf8')).toString();\n } catch (e) {\n return undefined;\n }\n\n return detectModuleTypeFromSource(source);\n}\n\n/**\n * Type guard for CallExpression.\n */\nfunction isCallExpression(node: Node): node is CallExpression {\n return node.type === 'CallExpression';\n}\n\n/**\n * Type guard for AssignmentExpression.\n */\nfunction isAssignmentExpression(node: Node): node is AssignmentExpression {\n return node.type === 'AssignmentExpression';\n}\n\n/**\n * Type guard for MemberExpression.\n */\nfunction isMemberExpression(node: Node): node is MemberExpression {\n return node.type === 'MemberExpression';\n}\n\n/**\n * Type guard for Identifier.\n */\nfunction isIdentifier(node: Node): node is Identifier {\n return node.type === 'Identifier';\n}\n\n/**\n * Type guard for UnaryExpression.\n */\nfunction isUnaryExpression(node: Node): node is UnaryExpression {\n return node.type === 'UnaryExpression';\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { PackageJson } from '@ms-cloudpack/config-types';
2
- import type { PackageDefinitionsCache } from '@ms-cloudpack/bundler-types';
2
+ import type { PackageDefinitionsCache, PackageImporterContext } from '@ms-cloudpack/bundler-types';
3
3
  /**
4
4
  * Find the package.json contents for `dependencyName`, searching up under `node_modules` folders
5
5
  * starting at `startPath` and ending at `gitRootPath` or the filesystem root.
@@ -7,6 +7,7 @@ import type { PackageDefinitionsCache } from '@ms-cloudpack/bundler-types';
7
7
  export declare function findPackage(options: {
8
8
  dependencyName: string;
9
9
  startPath: string;
10
+ importerContext?: PackageImporterContext;
10
11
  gitRootPath?: string;
11
12
  }, context: {
12
13
  packages: PackageDefinitionsCache;
@@ -1 +1 @@
1
- {"version":3,"file":"findPackage.d.ts","sourceRoot":"","sources":["../src/findPackage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAE3E;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE;IACP,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,EACD,OAAO,EAAE;IACP,QAAQ,EAAE,uBAAuB,CAAC;CACnC,GACA,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,WAAW,CAAA;CAAE,GAAG,SAAS,CAAC,CA6BvE"}
1
+ {"version":3,"file":"findPackage.d.ts","sourceRoot":"","sources":["../src/findPackage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAEnG;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE;IACP,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,EACD,OAAO,EAAE;IACP,QAAQ,EAAE,uBAAuB,CAAC;CACnC,GACA,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,WAAW,CAAA;CAAE,GAAG,SAAS,CAAC,CA6BvE"}
@@ -5,12 +5,12 @@ import fsPromises from 'fs/promises';
5
5
  * starting at `startPath` and ending at `gitRootPath` or the filesystem root.
6
6
  */
7
7
  export async function findPackage(options, context) {
8
- const { dependencyName, gitRootPath, startPath } = options;
8
+ const { dependencyName, gitRootPath, startPath, importerContext } = options;
9
9
  const { packages } = context;
10
10
  let packagePath = startPath;
11
11
  do {
12
12
  const resolvedPath = path.join(packagePath, 'node_modules', dependencyName);
13
- const definition = await packages.get(resolvedPath);
13
+ const definition = await packages.get(resolvedPath, { importerContext });
14
14
  if (definition) {
15
15
  return { packagePath: await fsPromises.realpath(resolvedPath), definition };
16
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"findPackage.js","sourceRoot":"","sources":["../src/findPackage.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,UAAU,MAAM,aAAa,CAAC;AAIrC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAIC,EACD,OAEC;IAED,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAC3D,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE7B,IAAI,WAAW,GAAG,SAAS,CAAC;IAE5B,GAAG;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;QAC5E,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAEpD,IAAI,UAAU,EAAE;YACd,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC;SAC7E;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 type { PackageJson } from '@ms-cloudpack/config-types';\nimport type { PackageDefinitionsCache } from '@ms-cloudpack/bundler-types';\n\n/**\n * Find the package.json contents for `dependencyName`, searching up under `node_modules` folders\n * starting at `startPath` and ending at `gitRootPath` or the filesystem root.\n */\nexport async function findPackage(\n options: {\n dependencyName: string;\n startPath: string;\n gitRootPath?: string;\n },\n context: {\n packages: PackageDefinitionsCache;\n },\n): Promise<{ packagePath: string; definition: PackageJson } | undefined> {\n const { dependencyName, gitRootPath, startPath } = options;\n const { packages } = context;\n\n let packagePath = startPath;\n\n do {\n const resolvedPath = path.join(packagePath, 'node_modules', dependencyName);\n const definition = await packages.get(resolvedPath);\n\n if (definition) {\n return { packagePath: await fsPromises.realpath(resolvedPath), definition };\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
+ {"version":3,"file":"findPackage.js","sourceRoot":"","sources":["../src/findPackage.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,UAAU,MAAM,aAAa,CAAC;AAIrC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAKC,EACD,OAEC;IAED,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IAC5E,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE7B,IAAI,WAAW,GAAG,SAAS,CAAC;IAE5B,GAAG;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;QAC5E,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;QAEzE,IAAI,UAAU,EAAE;YACd,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC;SAC7E;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 type { PackageJson } from '@ms-cloudpack/config-types';\nimport type { PackageDefinitionsCache, PackageImporterContext } from '@ms-cloudpack/bundler-types';\n\n/**\n * Find the package.json contents for `dependencyName`, searching up under `node_modules` folders\n * starting at `startPath` and ending at `gitRootPath` or the filesystem root.\n */\nexport async function findPackage(\n options: {\n dependencyName: string;\n startPath: string;\n importerContext?: PackageImporterContext;\n gitRootPath?: string;\n },\n context: {\n packages: PackageDefinitionsCache;\n },\n): Promise<{ packagePath: string; definition: PackageJson } | undefined> {\n const { dependencyName, gitRootPath, startPath, importerContext } = options;\n const { packages } = context;\n\n let packagePath = startPath;\n\n do {\n const resolvedPath = path.join(packagePath, 'node_modules', dependencyName);\n const definition = await packages.get(resolvedPath, { importerContext });\n\n if (definition) {\n return { packagePath: await fsPromises.realpath(resolvedPath), definition };\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"]}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Convert a non-semver version to a `0.0.0-` prerelease version.
3
+ * e.g. `npm:@custom/foo@^1.0.0` -> `0.0.0-npm--custom-foo--1-0-0`
4
+ *
5
+ * NOTE: This function does not verify that the input is a non-semver version.
6
+ * It's expected that the caller has already checked this.
7
+ */
8
+ export declare function generateVersionFromNonSemver(version: string): string;
9
+ //# sourceMappingURL=generateVersionFromNonSemver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateVersionFromNonSemver.d.ts","sourceRoot":"","sources":["../src/generateVersionFromNonSemver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIpE"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Convert a non-semver version to a `0.0.0-` prerelease version.
3
+ * e.g. `npm:@custom/foo@^1.0.0` -> `0.0.0-npm--custom-foo--1-0-0`
4
+ *
5
+ * NOTE: This function does not verify that the input is a non-semver version.
6
+ * It's expected that the caller has already checked this.
7
+ */
8
+ export function generateVersionFromNonSemver(version) {
9
+ // Only letters, numbers, and hyphens are allowed in prerelease suffixes.
10
+ // (Periods are also allowed but potentially have special meaning, so remove them.)
11
+ return `0.0.0-${version.replace(/[^-a-zA-Z0-9]/g, '-')}`;
12
+ }
13
+ //# sourceMappingURL=generateVersionFromNonSemver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateVersionFromNonSemver.js","sourceRoot":"","sources":["../src/generateVersionFromNonSemver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAAC,OAAe;IAC1D,yEAAyE;IACzE,mFAAmF;IACnF,OAAO,SAAS,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAAE,CAAC;AAC3D,CAAC","sourcesContent":["/**\n * Convert a non-semver version to a `0.0.0-` prerelease version.\n * e.g. `npm:@custom/foo@^1.0.0` -> `0.0.0-npm--custom-foo--1-0-0`\n *\n * NOTE: This function does not verify that the input is a non-semver version.\n * It's expected that the caller has already checked this.\n */\nexport function generateVersionFromNonSemver(version: string): string {\n // Only letters, numbers, and hyphens are allowed in prerelease suffixes.\n // (Periods are also allowed but potentially have special meaning, so remove them.)\n return `0.0.0-${version.replace(/[^-a-zA-Z0-9]/g, '-')}`;\n}\n"]}
@@ -16,10 +16,10 @@ const internalExtensionMap = {
16
16
  '.cjs': ['.cjs', '.js'],
17
17
  };
18
18
  const externalExtensionMap = {
19
- '.ts': ['.ts', '.js'],
19
+ '.ts': ['.js'],
20
20
  '.tsx': ['.js'],
21
- '.mts': ['.mjs', '.js'],
22
- '.cts': ['.mts', '.cts'],
21
+ '.mts': ['.mjs'],
22
+ '.cts': ['.cjs'],
23
23
  '.jsx': ['.js'],
24
24
  '.js': ['.js'],
25
25
  };
@@ -1 +1 @@
1
- {"version":3,"file":"getCandidates.js","sourceRoot":"","sources":["../src/getCandidates.ts"],"names":[],"mappings":"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","sourcesContent":["import { safeRelativePath } from '@ms-cloudpack/path-string-parsing';\nimport { type CloudpackConfig } from '@ms-cloudpack/config-types';\nimport path from 'path';\nimport { isExternalPackage } from './isExternalPackage.js';\n\n// Mappings to possible candidate extensions for a given input extension.\nconst externalExtensions = ['.js', '.mjs', '.cjs'];\nconst internalExtensions = ['.ts', '.tsx', '.mts', '.cts', '.jsx', '.js', '.mjs', '.cjs'];\nconst internalExtensionMap: Record<string, string[]> = {\n '.ts': ['.ts', '.js'],\n '.tsx': ['.tsx', '.js'],\n '.mts': ['.mts', '.mjs', '.js'],\n '.cts': ['.cts', '.cjs', '.js'],\n '.jsx': ['.jsx', '.js'],\n '.js': ['.ts', '.tsx', '.mts', '.cts', '.jsx', '.js'],\n '.mjs': ['.mjs', '.js'],\n '.cjs': ['.cjs', '.js'],\n};\nconst externalExtensionMap: Record<string, string[]> = {\n '.ts': ['.ts', '.js'],\n '.tsx': ['.js'],\n '.mts': ['.mjs', '.js'],\n '.cts': ['.mts', '.cts'],\n '.jsx': ['.js'],\n '.js': ['.js'],\n};\n\n/**\n * Given a packagePath and a filePath from its exports map (or main/module), build candidate paths\n * to look for the physical file in order of priority. For internal packages, we try to discover\n * source files first, and then fallback to the original file name. We also search for index files\n * and expand folder paths as well for ambiguous references. For external packages, we prioritize\n * intermediate paths.\n */\nexport function getCandidates(\n options: { filePath: string; packagePath: string },\n context: { config: CloudpackConfig },\n) {\n const { filePath, packagePath } = options;\n const resolveWebExtensions = Boolean(context.config.features?.resolveWebExtensions);\n const isBlankPath = !filePath || filePath === '.';\n const originalPath = isBlankPath ? './index' : safeRelativePath(filePath);\n const originalExt = path.extname(originalPath);\n const isInternal = !isExternalPackage(packagePath);\n const endsWithSlash = originalPath.endsWith('/');\n const candidates = [];\n const defaultExtensions = isInternal ? internalExtensions : externalExtensions;\n const defaultExtensionsWithSuffixes = resolveWebExtensions\n ? [...defaultExtensions.map((ext) => `.web${ext}`), ...defaultExtensions]\n : defaultExtensions;\n const extensions =\n (isInternal ? internalExtensionMap : externalExtensionMap)[originalExt] || defaultExtensionsWithSuffixes;\n const pathsToAdd = [originalPath];\n\n if (isInternal && originalPath.startsWith('./lib')) {\n pathsToAdd.unshift(originalPath.replace(/^\\.\\/lib/, './src'));\n }\n\n for (let currentPath of pathsToAdd) {\n const unrecognizedExt = originalExt && !extensions.includes(path.extname(currentPath));\n\n // For internal packages, we try and resolve the original file name first.\n if (isInternal && unrecognizedExt) {\n candidates.push(currentPath);\n }\n\n // If the path doesn't end with a slash, it could be a file. Add extensions.\n if (!endsWithSlash) {\n candidates.push(...expandExtensions(currentPath, extensions));\n }\n\n // For non-extension references, we might be referring to a folder, or a barrel file within a folder. Add the\n // appropriate extensions for the barrel file, and fall back to a package.json in the case of nested definitions.\n if (!originalExt) {\n if (isBlankPath) {\n candidates.push('./package.json');\n } else {\n // Trim trailing slash\n if (endsWithSlash) {\n currentPath = currentPath.slice(0, -1);\n }\n\n candidates.push(...expandExtensions(currentPath + '/index', extensions));\n candidates.push(currentPath + '/package.json');\n }\n }\n\n // For external packages, we try and resolve the original file name last.\n if (!isInternal && unrecognizedExt) {\n candidates.push(currentPath);\n }\n }\n\n return candidates;\n}\n\n/**\n * Given a filepath and list of extensions, maps extensions to prepend the filepath. In the case that\n * the filepath has an extension already in the list, avoids appending the extension twice.\n *\n * For example, filePath = './foo/bar.js' with extensions ['.ts', '.js'] would result in:\n *\n * ['./foo/bar.ts.js', './foo/bar.js'].\n *\n */\nfunction expandExtensions(filePath: string, extensions: string[]) {\n const result: string[] = [];\n const ext = path.extname(filePath);\n\n if (extensions.includes(ext)) {\n filePath = `${filePath.slice(0, -ext.length)}`;\n }\n\n for (const currentExt of extensions) {\n result.push(filePath + currentExt);\n }\n\n return result;\n}\n"]}
1
+ {"version":3,"file":"getCandidates.js","sourceRoot":"","sources":["../src/getCandidates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAwB,MAAM,4BAA4B,CAAC;AAClE,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,yEAAyE;AACzE,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACnD,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC1F,MAAM,oBAAoB,GAA6B;IACrD,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;IACrB,MAAM,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;IACvB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;IAC/B,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;IAC/B,MAAM,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;IACvB,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;IACrD,MAAM,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;IACvB,MAAM,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;CACxB,CAAC;AACF,MAAM,oBAAoB,GAA6B;IACrD,KAAK,EAAE,CAAC,KAAK,CAAC;IACd,MAAM,EAAE,CAAC,KAAK,CAAC;IACf,MAAM,EAAE,CAAC,MAAM,CAAC;IAChB,MAAM,EAAE,CAAC,MAAM,CAAC;IAChB,MAAM,EAAE,CAAC,KAAK,CAAC;IACf,KAAK,EAAE,CAAC,KAAK,CAAC;CACf,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAkD,EAClD,OAAoC;IAEpC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAC1C,MAAM,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IACpF,MAAM,WAAW,GAAG,CAAC,QAAQ,IAAI,QAAQ,KAAK,GAAG,CAAC;IAClD,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC1E,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,EAAE,CAAC;IACtB,MAAM,iBAAiB,GAAG,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAC/E,MAAM,6BAA6B,GAAG,oBAAoB;QACxD,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,EAAE,CAAC,EAAE,GAAG,iBAAiB,CAAC;QACzE,CAAC,CAAC,iBAAiB,CAAC;IACtB,MAAM,UAAU,GACd,CAAC,UAAU,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,WAAW,CAAC,IAAI,6BAA6B,CAAC;IAC3G,MAAM,UAAU,GAAG,CAAC,YAAY,CAAC,CAAC;IAElC,IAAI,UAAU,IAAI,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;QAClD,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;KAC/D;IAED,KAAK,IAAI,WAAW,IAAI,UAAU,EAAE;QAClC,MAAM,eAAe,GAAG,WAAW,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QAEvF,0EAA0E;QAC1E,IAAI,UAAU,IAAI,eAAe,EAAE;YACjC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SAC9B;QAED,4EAA4E;QAC5E,IAAI,CAAC,aAAa,EAAE;YAClB,UAAU,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;SAC/D;QAED,6GAA6G;QAC7G,iHAAiH;QACjH,IAAI,CAAC,WAAW,EAAE;YAChB,IAAI,WAAW,EAAE;gBACf,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;aACnC;iBAAM;gBACL,sBAAsB;gBACtB,IAAI,aAAa,EAAE;oBACjB,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;iBACxC;gBAED,UAAU,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,WAAW,GAAG,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;gBACzE,UAAU,CAAC,IAAI,CAAC,WAAW,GAAG,eAAe,CAAC,CAAC;aAChD;SACF;QAED,yEAAyE;QACzE,IAAI,CAAC,UAAU,IAAI,eAAe,EAAE;YAClC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SAC9B;KACF;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,gBAAgB,CAAC,QAAgB,EAAE,UAAoB;IAC9D,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEnC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QAC5B,QAAQ,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;KAChD;IAED,KAAK,MAAM,UAAU,IAAI,UAAU,EAAE;QACnC,MAAM,CAAC,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,CAAC;KACpC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { safeRelativePath } from '@ms-cloudpack/path-string-parsing';\nimport { type CloudpackConfig } from '@ms-cloudpack/config-types';\nimport path from 'path';\nimport { isExternalPackage } from './isExternalPackage.js';\n\n// Mappings to possible candidate extensions for a given input extension.\nconst externalExtensions = ['.js', '.mjs', '.cjs'];\nconst internalExtensions = ['.ts', '.tsx', '.mts', '.cts', '.jsx', '.js', '.mjs', '.cjs'];\nconst internalExtensionMap: Record<string, string[]> = {\n '.ts': ['.ts', '.js'],\n '.tsx': ['.tsx', '.js'],\n '.mts': ['.mts', '.mjs', '.js'],\n '.cts': ['.cts', '.cjs', '.js'],\n '.jsx': ['.jsx', '.js'],\n '.js': ['.ts', '.tsx', '.mts', '.cts', '.jsx', '.js'],\n '.mjs': ['.mjs', '.js'],\n '.cjs': ['.cjs', '.js'],\n};\nconst externalExtensionMap: Record<string, string[]> = {\n '.ts': ['.js'],\n '.tsx': ['.js'],\n '.mts': ['.mjs'],\n '.cts': ['.cjs'],\n '.jsx': ['.js'],\n '.js': ['.js'],\n};\n\n/**\n * Given a packagePath and a filePath from its exports map (or main/module), build candidate paths\n * to look for the physical file in order of priority. For internal packages, we try to discover\n * source files first, and then fallback to the original file name. We also search for index files\n * and expand folder paths as well for ambiguous references. For external packages, we prioritize\n * intermediate paths.\n */\nexport function getCandidates(\n options: { filePath: string; packagePath: string },\n context: { config: CloudpackConfig },\n) {\n const { filePath, packagePath } = options;\n const resolveWebExtensions = Boolean(context.config.features?.resolveWebExtensions);\n const isBlankPath = !filePath || filePath === '.';\n const originalPath = isBlankPath ? './index' : safeRelativePath(filePath);\n const originalExt = path.extname(originalPath);\n const isInternal = !isExternalPackage(packagePath);\n const endsWithSlash = originalPath.endsWith('/');\n const candidates = [];\n const defaultExtensions = isInternal ? internalExtensions : externalExtensions;\n const defaultExtensionsWithSuffixes = resolveWebExtensions\n ? [...defaultExtensions.map((ext) => `.web${ext}`), ...defaultExtensions]\n : defaultExtensions;\n const extensions =\n (isInternal ? internalExtensionMap : externalExtensionMap)[originalExt] || defaultExtensionsWithSuffixes;\n const pathsToAdd = [originalPath];\n\n if (isInternal && originalPath.startsWith('./lib')) {\n pathsToAdd.unshift(originalPath.replace(/^\\.\\/lib/, './src'));\n }\n\n for (let currentPath of pathsToAdd) {\n const unrecognizedExt = originalExt && !extensions.includes(path.extname(currentPath));\n\n // For internal packages, we try and resolve the original file name first.\n if (isInternal && unrecognizedExt) {\n candidates.push(currentPath);\n }\n\n // If the path doesn't end with a slash, it could be a file. Add extensions.\n if (!endsWithSlash) {\n candidates.push(...expandExtensions(currentPath, extensions));\n }\n\n // For non-extension references, we might be referring to a folder, or a barrel file within a folder. Add the\n // appropriate extensions for the barrel file, and fall back to a package.json in the case of nested definitions.\n if (!originalExt) {\n if (isBlankPath) {\n candidates.push('./package.json');\n } else {\n // Trim trailing slash\n if (endsWithSlash) {\n currentPath = currentPath.slice(0, -1);\n }\n\n candidates.push(...expandExtensions(currentPath + '/index', extensions));\n candidates.push(currentPath + '/package.json');\n }\n }\n\n // For external packages, we try and resolve the original file name last.\n if (!isInternal && unrecognizedExt) {\n candidates.push(currentPath);\n }\n }\n\n return candidates;\n}\n\n/**\n * Given a filepath and list of extensions, maps extensions to prepend the filepath. In the case that\n * the filepath has an extension already in the list, avoids appending the extension twice.\n *\n * For example, filePath = './foo/bar.js' with extensions ['.ts', '.js'] would result in:\n *\n * ['./foo/bar.ts.js', './foo/bar.js'].\n *\n */\nfunction expandExtensions(filePath: string, extensions: string[]) {\n const result: string[] = [];\n const ext = path.extname(filePath);\n\n if (extensions.includes(ext)) {\n filePath = `${filePath.slice(0, -ext.length)}`;\n }\n\n for (const currentExt of extensions) {\n result.push(filePath + currentExt);\n }\n\n return result;\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import type { PackageDefinitionTransform } from '@ms-cloudpack/bundler-types';
2
+ /**
3
+ * Get a transform which handles non-semver dependencies:
4
+ * - In a parent package, if a dependency is specified with a non-semver version, change the dep
5
+ * to a special `0.0.0-<original-version>` prerelease version.
6
+ * - In a child package, if the package was pulled in as a non-semver dependency by a parent
7
+ * (per the `importerContext`), change its version to the special prerelease version as above.
8
+ */
9
+ export declare function getNonSemverTransform(): PackageDefinitionTransform;
10
+ //# sourceMappingURL=getNonSemverTransform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getNonSemverTransform.d.ts","sourceRoot":"","sources":["../src/getNonSemverTransform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAO9E;;;;;;GAMG;AACH,wBAAgB,qBAAqB,IAAI,0BAA0B,CA6ElE"}
@@ -0,0 +1,71 @@
1
+ import semver from 'semver';
2
+ import { generateVersionFromNonSemver } from './generateVersionFromNonSemver.js';
3
+ const depTypes = ['dependencies', 'peerDependencies'];
4
+ /**
5
+ * Get a transform which handles non-semver dependencies:
6
+ * - In a parent package, if a dependency is specified with a non-semver version, change the dep
7
+ * to a special `0.0.0-<original-version>` prerelease version.
8
+ * - In a child package, if the package was pulled in as a non-semver dependency by a parent
9
+ * (per the `importerContext`), change its version to the special prerelease version as above.
10
+ */
11
+ export function getNonSemverTransform() {
12
+ /**
13
+ * Cached info about parent packages with non-semver dependencies:
14
+ * Map from parent name/version => dep type => non-semver dependency names
15
+ */
16
+ const nonSemverDeps = {};
17
+ return ({ definition, packagePath, importerContext }) => {
18
+ const result = {};
19
+ // Check for non-semver dependencies
20
+ for (const depType of depTypes) {
21
+ const deps = definition[depType] || {};
22
+ for (const [depName, depVersion] of Object.entries(deps)) {
23
+ if (!depVersion || semver.validRange(depVersion)) {
24
+ continue;
25
+ }
26
+ console.warn(`Non-semver dependency found: ${depName}@${depVersion} ` +
27
+ `(in ${definition.name}@${definition.version} at ${packagePath}). ` +
28
+ "Cloudpack will attempt to handle this, but it's recommended to use semantic versions only if possible.");
29
+ // Update the version in the returned dependencies:
30
+ // "bar": "npm:@custom/bar@^1" => "0.0.0-npm--custom-bar--1"
31
+ const resultDeps = (result[depType] ??= { ...deps });
32
+ resultDeps[depName] = generateVersionFromNonSemver(depVersion);
33
+ // Save that this was a non-semver dep
34
+ const record = (nonSemverDeps[`${definition.name}@${definition.version}`] ??= {});
35
+ (record[depType] ??= []).push(depName);
36
+ }
37
+ }
38
+ // If this package's parent pulled it in with a non-semver dependency, make some more updates
39
+ // (see below)
40
+ const nonSemverParentInfo = importerContext && nonSemverDeps[`${importerContext.parentName}@${importerContext.parentVersion}`];
41
+ // TODO: maybe this could also be used for resolutions if we have problems there:
42
+ // adding a check for !semver.satisfies(requiredAs, definition.version) and forcing the package version?
43
+ if (nonSemverParentInfo) {
44
+ // Example: the parent depended on this package as "bar": "npm:@custom/bar@^1"
45
+ // importedName = bar
46
+ // versionRequirement = 0.0.0-npm--custom-bar--1 (was modified when this transform ran on the parent definition)
47
+ const { importedName, versionRequirement } = importerContext;
48
+ for (const depType of depTypes) {
49
+ if (!nonSemverParentInfo[depType]?.includes(importedName)) {
50
+ continue;
51
+ }
52
+ // To ensure other code handles this package properly, change its name and version to
53
+ // the ones used by the parent (after transforms). This ensures it works properly with
54
+ // the resolve map and isn't accidentally used by other packages which depend on this
55
+ // package under its real name.
56
+ result.name = importedName;
57
+ result.version = versionRequirement;
58
+ result.cloudpackRemapped = {
59
+ originalName: definition.name || '',
60
+ originalVersion: definition.version || '',
61
+ };
62
+ break;
63
+ }
64
+ }
65
+ if (Object.keys(result).length) {
66
+ return { ...definition, ...result };
67
+ }
68
+ return undefined;
69
+ };
70
+ }
71
+ //# sourceMappingURL=getNonSemverTransform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getNonSemverTransform.js","sourceRoot":"","sources":["../src/getNonSemverTransform.ts"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AAEjF,MAAM,QAAQ,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAU,CAAC;AAE/D;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB;IACnC;;;OAGG;IACH,MAAM,aAAa,GAGf,EAAE,CAAC;IAEP,OAAO,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,EAAE,EAAE;QACtD,MAAM,MAAM,GAAyB,EAAE,CAAC;QAExC,oCAAoC;QACpC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC9B,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAEvC,KAAK,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACxD,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;oBAChD,SAAS;iBACV;gBAED,OAAO,CAAC,IAAI,CACV,gCAAgC,OAAO,IAAI,UAAU,GAAG;oBACtD,OAAO,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,OAAO,OAAO,WAAW,KAAK;oBACnE,wGAAwG,CAC3G,CAAC;gBAEF,mDAAmD;gBACnD,gEAAgE;gBAChE,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;gBACrD,UAAU,CAAC,OAAO,CAAC,GAAG,4BAA4B,CAAC,UAAU,CAAC,CAAC;gBAE/D,sCAAsC;gBACtC,MAAM,MAAM,GAAG,CAAC,aAAa,CAAC,GAAG,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;gBAClF,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aACxC;SACF;QAED,6FAA6F;QAC7F,cAAc;QACd,MAAM,mBAAmB,GACvB,eAAe,IAAI,aAAa,CAAC,GAAG,eAAe,CAAC,UAAU,IAAI,eAAe,CAAC,aAAa,EAAE,CAAC,CAAC;QAErG,iFAAiF;QACjF,wGAAwG;QAExG,IAAI,mBAAmB,EAAE;YACvB,8EAA8E;YAC9E,uBAAuB;YACvB,kHAAkH;YAClH,MAAM,EAAE,YAAY,EAAE,kBAAkB,EAAE,GAAG,eAAe,CAAC;YAE7D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;gBAC9B,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE;oBACzD,SAAS;iBACV;gBAED,qFAAqF;gBACrF,sFAAsF;gBACtF,qFAAqF;gBACrF,+BAA+B;gBAC/B,MAAM,CAAC,IAAI,GAAG,YAAY,CAAC;gBAC3B,MAAM,CAAC,OAAO,GAAG,kBAAkB,CAAC;gBACpC,MAAM,CAAC,iBAAiB,GAAG;oBACzB,YAAY,EAAE,UAAU,CAAC,IAAI,IAAI,EAAE;oBACnC,eAAe,EAAE,UAAU,CAAC,OAAO,IAAI,EAAE;iBAC1C,CAAC;gBACF,MAAM;aACP;SACF;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE;YAC9B,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,MAAM,EAAE,CAAC;SACrC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { PackageDefinitionTransform } from '@ms-cloudpack/bundler-types';\nimport type { PackageJson } from '@ms-cloudpack/config-types';\nimport semver from 'semver';\nimport { generateVersionFromNonSemver } from './generateVersionFromNonSemver.js';\n\nconst depTypes = ['dependencies', 'peerDependencies'] as const;\n\n/**\n * Get a transform which handles non-semver dependencies:\n * - In a parent package, if a dependency is specified with a non-semver version, change the dep\n * to a special `0.0.0-<original-version>` prerelease version.\n * - In a child package, if the package was pulled in as a non-semver dependency by a parent\n * (per the `importerContext`), change its version to the special prerelease version as above.\n */\nexport function getNonSemverTransform(): PackageDefinitionTransform {\n /**\n * Cached info about parent packages with non-semver dependencies:\n * Map from parent name/version => dep type => non-semver dependency names\n */\n const nonSemverDeps: Record<\n `${string}@${string}`,\n Partial<Record<'dependencies' | 'peerDependencies', string[]>>\n > = {};\n\n return ({ definition, packagePath, importerContext }) => {\n const result: Partial<PackageJson> = {};\n\n // Check for non-semver dependencies\n for (const depType of depTypes) {\n const deps = definition[depType] || {};\n\n for (const [depName, depVersion] of Object.entries(deps)) {\n if (!depVersion || semver.validRange(depVersion)) {\n continue;\n }\n\n console.warn(\n `Non-semver dependency found: ${depName}@${depVersion} ` +\n `(in ${definition.name}@${definition.version} at ${packagePath}). ` +\n \"Cloudpack will attempt to handle this, but it's recommended to use semantic versions only if possible.\",\n );\n\n // Update the version in the returned dependencies:\n // \"bar\": \"npm:@custom/bar@^1\" => \"0.0.0-npm--custom-bar--1\"\n const resultDeps = (result[depType] ??= { ...deps });\n resultDeps[depName] = generateVersionFromNonSemver(depVersion);\n\n // Save that this was a non-semver dep\n const record = (nonSemverDeps[`${definition.name}@${definition.version}`] ??= {});\n (record[depType] ??= []).push(depName);\n }\n }\n\n // If this package's parent pulled it in with a non-semver dependency, make some more updates\n // (see below)\n const nonSemverParentInfo =\n importerContext && nonSemverDeps[`${importerContext.parentName}@${importerContext.parentVersion}`];\n\n // TODO: maybe this could also be used for resolutions if we have problems there:\n // adding a check for !semver.satisfies(requiredAs, definition.version) and forcing the package version?\n\n if (nonSemverParentInfo) {\n // Example: the parent depended on this package as \"bar\": \"npm:@custom/bar@^1\"\n // importedName = bar\n // versionRequirement = 0.0.0-npm--custom-bar--1 (was modified when this transform ran on the parent definition)\n const { importedName, versionRequirement } = importerContext;\n\n for (const depType of depTypes) {\n if (!nonSemverParentInfo[depType]?.includes(importedName)) {\n continue;\n }\n\n // To ensure other code handles this package properly, change its name and version to\n // the ones used by the parent (after transforms). This ensures it works properly with\n // the resolve map and isn't accidentally used by other packages which depend on this\n // package under its real name.\n result.name = importedName;\n result.version = versionRequirement;\n result.cloudpackRemapped = {\n originalName: definition.name || '',\n originalVersion: definition.version || '',\n };\n break;\n }\n }\n\n if (Object.keys(result).length) {\n return { ...definition, ...result };\n }\n return undefined;\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ms-cloudpack/package-utilities",
3
- "version": "5.5.2",
3
+ "version": "5.6.0",
4
4
  "description": "Utilities for resolving/parsing packages and their imports.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -14,12 +14,14 @@
14
14
  }
15
15
  },
16
16
  "dependencies": {
17
- "@ms-cloudpack/bundler-types": "^0.22.0",
18
- "@ms-cloudpack/config-types": "^0.1.0",
17
+ "@ms-cloudpack/bundler-types": "^0.23.0",
18
+ "@ms-cloudpack/config-types": "^0.1.1",
19
19
  "@ms-cloudpack/json-utilities": "^0.1.2",
20
- "@ms-cloudpack/package-overrides": "^0.6.1",
20
+ "@ms-cloudpack/package-overrides": "^0.6.2",
21
21
  "@ms-cloudpack/path-utilities": "^2.3.5",
22
22
  "@ms-cloudpack/path-string-parsing": "^1.1.1",
23
+ "acorn": "^8.11.2",
24
+ "acorn-walk": "^8.2.1",
23
25
  "fast-glob": "^3.2.12",
24
26
  "merge": "^2.1.1",
25
27
  "resolve": "^1.22.0",