@ms-cloudpack/package-utilities 11.3.6 → 12.0.1

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.
@@ -35,6 +35,10 @@ export interface AddExportsMapEntryOptions {
35
35
  * - `node` is used for server rendering.
36
36
  */
37
37
  environmentCondition?: 'browser' | 'node';
38
+ /**
39
+ * Whether to resolve web extensions (e.g. `.web.js`).
40
+ */
41
+ resolveWebExtensions: boolean;
38
42
  }
39
43
  /**
40
44
  * Add an import path to an exports map. This is intended for use with generated exports maps,
@@ -1 +1 @@
1
- {"version":3,"file":"addExportsMapEntry.d.ts","sourceRoot":"","sources":["../../src/exportsMap/addExportsMapEntry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE7G,OAAO,EAAqB,KAAK,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AAE5G;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC;;OAEG;IACH,OAAO,EAAE,gBAAgB,CAAC;IAE1B;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IAEpD;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;CAC3C;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE;IAAE,QAAQ,EAAE,uBAAuB,CAAC;IAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAA;CAAE,GACxF,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,IAAI,CAAC,yBAAyB,EAAE,aAAa,GAAG,UAAU,CAAC,EACpE,SAAS,EAAE,uBAAuB,GACjC,OAAO,CAgDT"}
1
+ {"version":3,"file":"addExportsMapEntry.d.ts","sourceRoot":"","sources":["../../src/exportsMap/addExportsMapEntry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE7G,OAAO,EAAqB,KAAK,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AAE5G;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC;;OAEG;IACH,OAAO,EAAE,gBAAgB,CAAC;IAE1B;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IAEpD;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAE1C;;OAEG;IACH,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE;IAAE,QAAQ,EAAE,uBAAuB,CAAC;IAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAA;CAAE,GACxF,OAAO,CAAC,OAAO,CAAC,CAmBlB;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,IAAI,CAAC,yBAAyB,EAAE,aAAa,GAAG,UAAU,CAAC,EACpE,SAAS,EAAE,uBAAuB,GACjC,OAAO,CAgDT"}
@@ -9,7 +9,7 @@ import { findFileInPackage } from '../findFileInPackage/findFileInPackage.js';
9
9
  * being updated is an array (it should have been normalized to object format before calling).
10
10
  */
11
11
  export async function addExportsMapEntry(options, context) {
12
- const { exports, packagePath } = options;
12
+ const { exports, packagePath, resolveWebExtensions } = options;
13
13
  // We try to enforce these conditions in the types, but also do an explicit check in case of
14
14
  // casting or other unexpected input.
15
15
  if (exports === null || Array.isArray(exports) || typeof exports === 'string') {
@@ -18,6 +18,7 @@ export async function addExportsMapEntry(options, context) {
18
18
  const foundFile = await findFileInPackage({
19
19
  packagePath,
20
20
  filePath: options.filePath || options.importPath || '',
21
+ resolveWebExtensions,
21
22
  }, context);
22
23
  return _addEntry(options, foundFile);
23
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"addExportsMapEntry.js","sourceRoot":"","sources":["../../src/exportsMap/addExportsMapEntry.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CloudpackConfig, PackageDefinitionsCache, GeneratedExports } from '@ms-cloudpack/common-types';\nimport { normalizeRelativePath } from '@ms-cloudpack/path-string-parsing';\nimport { findFileInPackage, type FindFileInPackageResult } from '../findFileInPackage/findFileInPackage.js';\n\n/**\n * Options for `addExportsMapEntry`.\n */\nexport interface AddExportsMapEntryOptions {\n /**\n * The generated exports map to add the entry to.\n */\n exports: GeneratedExports;\n\n /**\n * The package path to add the entry for. This is used to resolve relative paths.\n */\n packagePath: string;\n\n /**\n * The import path to add the entry for. This is used as the key in the exports map.\n * Defaults to `'.'` (the package import).\n */\n importPath?: string;\n\n /**\n * The relative path to the physical file location, representing the \"key\" in the exports map.\n * Can be a partial location, in which case we'll search for the file and associated source/d.ts files.\n * Defaults to `importPath` if provided, or `'index.js'`.\n */\n filePath?: string;\n\n /**\n * Module type condition to add the entry for.\n * @default 'default'\n */\n requestCondition?: 'import' | 'require' | 'default';\n\n /**\n * The condition that describes the environment the entry is for.\n * Unspecified implies environmentally agnostic.\n * - `browser` is used for cases such as `browser` entries in package.json or implicit exports defined in routes.\n * - `node` is used for server rendering.\n */\n environmentCondition?: 'browser' | 'node';\n}\n\n/**\n * Add an import path to an exports map. This is intended for use with generated exports maps,\n * either in the context of the generated config, or generated for a package which doesn't have\n * an exports map.\n *\n * Throws an error if the exports map passed in is not an object, or if the value of the key\n * being updated is an array (it should have been normalized to object format before calling).\n */\nexport async function addExportsMapEntry(\n options: AddExportsMapEntryOptions,\n context: { packages: PackageDefinitionsCache; config: Pick<CloudpackConfig, 'features'> },\n): Promise<boolean> {\n const { exports, packagePath } = options;\n\n // We try to enforce these conditions in the types, but also do an explicit check in case of\n // casting or other unexpected input.\n if (exports === null || Array.isArray(exports) || typeof exports === 'string') {\n throw new Error(`Exports passed to addExportsMapEntry must be an object; received: ${JSON.stringify(exports)}`);\n }\n\n const foundFile = await findFileInPackage(\n {\n packagePath,\n filePath: options.filePath || options.importPath || '',\n },\n context,\n );\n\n return _addEntry(options, foundFile);\n}\n\n/**\n * Internal logic of adding an entry to an exports map.\n * Exported for testing this logic separately from the filesystem parts.\n * @internal\n */\nexport function _addEntry(\n options: Omit<AddExportsMapEntryOptions, 'packagePath' | 'filePath'>,\n foundFile: FindFileInPackageResult,\n): boolean {\n const { exports, environmentCondition, requestCondition = 'default' } = options;\n const { filePath, sourcePath } = foundFile;\n\n // Only do work if a file path was found.\n if (!filePath) {\n return false;\n }\n\n // Normalize the import path (this also converts undefined to '.')\n const importPath = normalizeRelativePath(options.importPath);\n\n const oldEntry = exports[importPath];\n if (Array.isArray(oldEntry)) {\n // This should never happen with the standardized generated exports map format.\n // In theory we could handle it by pushing to the array, but nesting conditions inside arrays\n // isn't valid in the exports map spec.\n throw new Error(`Cannot add to an array of exports for \"${importPath}\"`);\n }\n\n let exportValue: string | Record<string, string>;\n\n if (!sourcePath && !requestCondition) {\n // If this is the only entry we're adding, set it to a string to minimize the exports map.\n exportValue = filePath;\n } else {\n exportValue = {};\n\n if (sourcePath) {\n exportValue['source'] = sourcePath;\n }\n\n // Add the entry for the condition.\n exportValue[requestCondition] = filePath;\n\n if (requestCondition === 'default' && Object.keys(exportValue).length === 1) {\n // Only the default condition is present, so flatten to a string\n exportValue = filePath;\n }\n }\n\n const newEntry: GeneratedExports[string] = environmentCondition\n ? { [environmentCondition]: exportValue }\n : exportValue;\n\n exports[importPath] = mergeEntries({ oldEntry, newEntry });\n\n return true;\n}\n\n/**\n * This handles the merging of potential nested environment and request conditions, and ensures that\n * the `default` key is in the correct order (always last).\n */\nfunction mergeEntries<T extends string | Record<string, T>>(params: {\n oldEntry: T | null | undefined;\n newEntry: T;\n}): T {\n const { oldEntry, newEntry } = params;\n\n if (!oldEntry) {\n return newEntry;\n }\n\n // If oldEntry is a string... (using !== object instead of === string so TS infers the correct type later)\n if (typeof oldEntry !== 'object') {\n // If newEntry is an object without a default, use oldEntry as the default.\n if (typeof newEntry === 'object' && !newEntry.default) {\n return { ...newEntry, default: oldEntry };\n }\n // Otherwise ignore oldEntry.\n return newEntry;\n }\n\n if (typeof newEntry !== 'object') {\n // oldEntry object, newEntry string => use newEntry as default\n return { ...oldEntry, default: newEntry };\n }\n\n // both objects => full merge (the typings get imprecise here)\n const merged: Record<string, T> = {};\n // put the new keys first in the merged object (this could be made configurable later if needed)\n const allKeys = new Set([...Object.keys(newEntry), ...Object.keys(oldEntry)]);\n for (const key of allKeys) {\n if (newEntry[key]) {\n merged[key] = mergeEntries({ oldEntry: oldEntry[key], newEntry: newEntry[key] });\n } else {\n merged[key] = oldEntry[key];\n }\n }\n\n const defaultValue = merged.default;\n if (defaultValue) {\n if (Object.keys(merged).length === 1) {\n // flatten out the default condition\n return defaultValue;\n }\n\n // ensure the default is last (exports maps keys are ordered)\n delete merged.default;\n merged.default = defaultValue;\n }\n\n return merged as T;\n}\n"]}
1
+ {"version":3,"file":"addExportsMapEntry.js","sourceRoot":"","sources":["../../src/exportsMap/addExportsMapEntry.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CloudpackConfig, PackageDefinitionsCache, GeneratedExports } from '@ms-cloudpack/common-types';\nimport { normalizeRelativePath } from '@ms-cloudpack/path-string-parsing';\nimport { findFileInPackage, type FindFileInPackageResult } from '../findFileInPackage/findFileInPackage.js';\n\n/**\n * Options for `addExportsMapEntry`.\n */\nexport interface AddExportsMapEntryOptions {\n /**\n * The generated exports map to add the entry to.\n */\n exports: GeneratedExports;\n\n /**\n * The package path to add the entry for. This is used to resolve relative paths.\n */\n packagePath: string;\n\n /**\n * The import path to add the entry for. This is used as the key in the exports map.\n * Defaults to `'.'` (the package import).\n */\n importPath?: string;\n\n /**\n * The relative path to the physical file location, representing the \"key\" in the exports map.\n * Can be a partial location, in which case we'll search for the file and associated source/d.ts files.\n * Defaults to `importPath` if provided, or `'index.js'`.\n */\n filePath?: string;\n\n /**\n * Module type condition to add the entry for.\n * @default 'default'\n */\n requestCondition?: 'import' | 'require' | 'default';\n\n /**\n * The condition that describes the environment the entry is for.\n * Unspecified implies environmentally agnostic.\n * - `browser` is used for cases such as `browser` entries in package.json or implicit exports defined in routes.\n * - `node` is used for server rendering.\n */\n environmentCondition?: 'browser' | 'node';\n\n /**\n * Whether to resolve web extensions (e.g. `.web.js`).\n */\n resolveWebExtensions: boolean;\n}\n\n/**\n * Add an import path to an exports map. This is intended for use with generated exports maps,\n * either in the context of the generated config, or generated for a package which doesn't have\n * an exports map.\n *\n * Throws an error if the exports map passed in is not an object, or if the value of the key\n * being updated is an array (it should have been normalized to object format before calling).\n */\nexport async function addExportsMapEntry(\n options: AddExportsMapEntryOptions,\n context: { packages: PackageDefinitionsCache; config: Pick<CloudpackConfig, 'features'> },\n): Promise<boolean> {\n const { exports, packagePath, resolveWebExtensions } = options;\n\n // We try to enforce these conditions in the types, but also do an explicit check in case of\n // casting or other unexpected input.\n if (exports === null || Array.isArray(exports) || typeof exports === 'string') {\n throw new Error(`Exports passed to addExportsMapEntry must be an object; received: ${JSON.stringify(exports)}`);\n }\n\n const foundFile = await findFileInPackage(\n {\n packagePath,\n filePath: options.filePath || options.importPath || '',\n resolveWebExtensions,\n },\n context,\n );\n\n return _addEntry(options, foundFile);\n}\n\n/**\n * Internal logic of adding an entry to an exports map.\n * Exported for testing this logic separately from the filesystem parts.\n * @internal\n */\nexport function _addEntry(\n options: Omit<AddExportsMapEntryOptions, 'packagePath' | 'filePath'>,\n foundFile: FindFileInPackageResult,\n): boolean {\n const { exports, environmentCondition, requestCondition = 'default' } = options;\n const { filePath, sourcePath } = foundFile;\n\n // Only do work if a file path was found.\n if (!filePath) {\n return false;\n }\n\n // Normalize the import path (this also converts undefined to '.')\n const importPath = normalizeRelativePath(options.importPath);\n\n const oldEntry = exports[importPath];\n if (Array.isArray(oldEntry)) {\n // This should never happen with the standardized generated exports map format.\n // In theory we could handle it by pushing to the array, but nesting conditions inside arrays\n // isn't valid in the exports map spec.\n throw new Error(`Cannot add to an array of exports for \"${importPath}\"`);\n }\n\n let exportValue: string | Record<string, string>;\n\n if (!sourcePath && !requestCondition) {\n // If this is the only entry we're adding, set it to a string to minimize the exports map.\n exportValue = filePath;\n } else {\n exportValue = {};\n\n if (sourcePath) {\n exportValue['source'] = sourcePath;\n }\n\n // Add the entry for the condition.\n exportValue[requestCondition] = filePath;\n\n if (requestCondition === 'default' && Object.keys(exportValue).length === 1) {\n // Only the default condition is present, so flatten to a string\n exportValue = filePath;\n }\n }\n\n const newEntry: GeneratedExports[string] = environmentCondition\n ? { [environmentCondition]: exportValue }\n : exportValue;\n\n exports[importPath] = mergeEntries({ oldEntry, newEntry });\n\n return true;\n}\n\n/**\n * This handles the merging of potential nested environment and request conditions, and ensures that\n * the `default` key is in the correct order (always last).\n */\nfunction mergeEntries<T extends string | Record<string, T>>(params: {\n oldEntry: T | null | undefined;\n newEntry: T;\n}): T {\n const { oldEntry, newEntry } = params;\n\n if (!oldEntry) {\n return newEntry;\n }\n\n // If oldEntry is a string... (using !== object instead of === string so TS infers the correct type later)\n if (typeof oldEntry !== 'object') {\n // If newEntry is an object without a default, use oldEntry as the default.\n if (typeof newEntry === 'object' && !newEntry.default) {\n return { ...newEntry, default: oldEntry };\n }\n // Otherwise ignore oldEntry.\n return newEntry;\n }\n\n if (typeof newEntry !== 'object') {\n // oldEntry object, newEntry string => use newEntry as default\n return { ...oldEntry, default: newEntry };\n }\n\n // both objects => full merge (the typings get imprecise here)\n const merged: Record<string, T> = {};\n // put the new keys first in the merged object (this could be made configurable later if needed)\n const allKeys = new Set([...Object.keys(newEntry), ...Object.keys(oldEntry)]);\n for (const key of allKeys) {\n if (newEntry[key]) {\n merged[key] = mergeEntries({ oldEntry: oldEntry[key], newEntry: newEntry[key] });\n } else {\n merged[key] = oldEntry[key];\n }\n }\n\n const defaultValue = merged.default;\n if (defaultValue) {\n if (Object.keys(merged).length === 1) {\n // flatten out the default condition\n return defaultValue;\n }\n\n // ensure the default is last (exports maps keys are ordered)\n delete merged.default;\n merged.default = defaultValue;\n }\n\n return merged as T;\n}\n"]}
@@ -7,6 +7,7 @@ import type { CloudpackConfig, PackageDefinitionsCache, PackageJsonExports } fro
7
7
  export declare function createExportsMap(options: {
8
8
  packagePath: string;
9
9
  disableTransforms?: boolean;
10
+ resolveWebExtensions: boolean;
10
11
  }, context: {
11
12
  packages: PackageDefinitionsCache;
12
13
  config: Pick<CloudpackConfig, 'features'>;
@@ -1 +1 @@
1
- {"version":3,"file":"createExportsMap.d.ts","sourceRoot":"","sources":["../../src/exportsMap/createExportsMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,uBAAuB,EACvB,kBAAkB,EAEnB,MAAM,4BAA4B,CAAC;AAIpC;;;;GAIG;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,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAA;CAAE,GACxF,OAAO,CAAC,kBAAkB,CAAC,CAqG7B"}
1
+ {"version":3,"file":"createExportsMap.d.ts","sourceRoot":"","sources":["../../src/exportsMap/createExportsMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,uBAAuB,EACvB,kBAAkB,EAEnB,MAAM,4BAA4B,CAAC;AAIpC;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE;IACP,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;CAC/B,EACD,OAAO,EAAE;IAAE,QAAQ,EAAE,uBAAuB,CAAC;IAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAA;CAAE,GACxF,OAAO,CAAC,kBAAkB,CAAC,CAyG7B"}
@@ -6,7 +6,7 @@ import { addExportsMapEntry } from './addExportsMapEntry.js';
6
6
  * exports map based on other fields in the package definition.
7
7
  */
8
8
  export async function createExportsMap(options, context) {
9
- const { packagePath } = options;
9
+ const { packagePath, resolveWebExtensions } = options;
10
10
  const { packages } = context;
11
11
  const definition = await packages.get(packagePath, { disableTransforms: options.disableTransforms });
12
12
  // Don't create an exports map for a definition that already has one.
@@ -24,6 +24,7 @@ export async function createExportsMap(options, context) {
24
24
  packagePath,
25
25
  filePath: 'index.js',
26
26
  requestCondition: type === 'module' ? 'import' : undefined,
27
+ resolveWebExtensions,
27
28
  }, context);
28
29
  }
29
30
  if (main) {
@@ -32,6 +33,7 @@ export async function createExportsMap(options, context) {
32
33
  packagePath,
33
34
  filePath: main,
34
35
  requestCondition: type === 'module' ? 'import' : undefined,
36
+ resolveWebExtensions,
35
37
  }, context);
36
38
  }
37
39
  if (module) {
@@ -40,11 +42,12 @@ export async function createExportsMap(options, context) {
40
42
  packagePath,
41
43
  filePath: module,
42
44
  requestCondition: 'import',
45
+ resolveWebExtensions,
43
46
  }, context);
44
47
  }
45
48
  if (browser) {
46
49
  if (typeof definition.browser === 'string') {
47
- await addExportsMapEntry({ exports, packagePath, filePath: definition.browser, environmentCondition: 'browser' }, context);
50
+ await addExportsMapEntry({ exports, packagePath, filePath: definition.browser, environmentCondition: 'browser', resolveWebExtensions }, context);
48
51
  }
49
52
  else if (typeof definition.browser === 'object') {
50
53
  for (const [key, value] of Object.entries(definition.browser)) {
@@ -68,6 +71,7 @@ export async function createExportsMap(options, context) {
68
71
  filePath: value,
69
72
  environmentCondition: 'browser',
70
73
  requestCondition: isDefaultModule || (isDefaultMain && type === 'module') ? 'import' : undefined,
74
+ resolveWebExtensions,
71
75
  }, context);
72
76
  }
73
77
  }
@@ -77,9 +81,9 @@ export async function createExportsMap(options, context) {
77
81
  // formulate based off inferred file structure.
78
82
  // Note: CRA defaults to src/index.js, Vite defaults to src/main.js
79
83
  if (Object.keys(exports).length === 0) {
80
- (await addExportsMapEntry({ exports, packagePath, filePath: './lib/index.js' }, context)) ||
81
- (await addExportsMapEntry({ exports, packagePath, filePath: './lib/main.js' }, context)) ||
82
- (await addExportsMapEntry({ exports, packagePath, filePath: './index.js' }, context));
84
+ (await addExportsMapEntry({ exports, packagePath, filePath: './lib/index.js', resolveWebExtensions }, context)) ||
85
+ (await addExportsMapEntry({ exports, packagePath, filePath: './lib/main.js', resolveWebExtensions }, context)) ||
86
+ (await addExportsMapEntry({ exports, packagePath, filePath: './index.js', resolveWebExtensions }, context));
83
87
  }
84
88
  return exports;
85
89
  }
@@ -1 +1 @@
1
- {"version":3,"file":"createExportsMap.js","sourceRoot":"","sources":["../../src/exportsMap/createExportsMap.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CloudpackConfig,\n PackageDefinitionsCache,\n PackageJsonExports,\n GeneratedExports,\n} from '@ms-cloudpack/common-types';\nimport { normalizeRelativePath } from '@ms-cloudpack/path-string-parsing';\nimport { addExportsMapEntry } from './addExportsMapEntry.js';\n\n/**\n * Given a package path, return its exports if already set (this could be from either the original\n * package.json or as generated by `createPackageSettingsTransform`), or otherwise generate an\n * exports map based on other fields in the package definition.\n */\nexport async function createExportsMap(\n options: {\n packagePath: string;\n disableTransforms?: boolean;\n },\n context: { packages: PackageDefinitionsCache; config: Pick<CloudpackConfig, 'features'> },\n): Promise<PackageJsonExports> {\n const { packagePath } = options;\n const { packages } = context;\n const definition = await packages.get(packagePath, { disableTransforms: options.disableTransforms });\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, type } = definition;\n // Use the GeneratedExports type internally because it matches up with the more constrained\n // format of the exports map we're creating here (and addExportsMapEntry requires this type).\n const exports: GeneratedExports = {};\n\n // Only try to add `index.js` as an entry if main/module/browser isn't available.\n if (!(main || module || browser)) {\n await addExportsMapEntry(\n {\n exports,\n packagePath,\n filePath: 'index.js',\n requestCondition: type === 'module' ? 'import' : undefined,\n },\n context,\n );\n }\n\n if (main) {\n await addExportsMapEntry(\n {\n exports,\n packagePath,\n filePath: main,\n requestCondition: type === 'module' ? 'import' : undefined,\n },\n context,\n );\n }\n\n if (module) {\n await addExportsMapEntry(\n {\n exports,\n packagePath,\n filePath: module,\n requestCondition: 'import',\n },\n context,\n );\n }\n\n if (browser) {\n if (typeof definition.browser === 'string') {\n await addExportsMapEntry(\n { exports, packagePath, filePath: definition.browser, environmentCondition: 'browser' },\n context,\n );\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 isDefaultModule = normalizeRelativePath(module) === normalizeRelativePath(key);\n const isDefaultMain = normalizeRelativePath(main) === normalizeRelativePath(key);\n\n let importPaths: string[];\n if (isDefaultMain || isDefaultModule) {\n importPaths = ['.'];\n } else {\n importPaths = [key, 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 environmentCondition: 'browser',\n requestCondition: isDefaultModule || (isDefaultMain && type === 'module') ? 'import' : undefined,\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
+ {"version":3,"file":"createExportsMap.js","sourceRoot":"","sources":["../../src/exportsMap/createExportsMap.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CloudpackConfig,\n PackageDefinitionsCache,\n PackageJsonExports,\n GeneratedExports,\n} from '@ms-cloudpack/common-types';\nimport { normalizeRelativePath } from '@ms-cloudpack/path-string-parsing';\nimport { addExportsMapEntry } from './addExportsMapEntry.js';\n\n/**\n * Given a package path, return its exports if already set (this could be from either the original\n * package.json or as generated by `createPackageSettingsTransform`), or otherwise generate an\n * exports map based on other fields in the package definition.\n */\nexport async function createExportsMap(\n options: {\n packagePath: string;\n disableTransforms?: boolean;\n resolveWebExtensions: boolean;\n },\n context: { packages: PackageDefinitionsCache; config: Pick<CloudpackConfig, 'features'> },\n): Promise<PackageJsonExports> {\n const { packagePath, resolveWebExtensions } = options;\n const { packages } = context;\n const definition = await packages.get(packagePath, { disableTransforms: options.disableTransforms });\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, type } = definition;\n // Use the GeneratedExports type internally because it matches up with the more constrained\n // format of the exports map we're creating here (and addExportsMapEntry requires this type).\n const exports: GeneratedExports = {};\n\n // Only try to add `index.js` as an entry if main/module/browser isn't available.\n if (!(main || module || browser)) {\n await addExportsMapEntry(\n {\n exports,\n packagePath,\n filePath: 'index.js',\n requestCondition: type === 'module' ? 'import' : undefined,\n resolveWebExtensions,\n },\n context,\n );\n }\n\n if (main) {\n await addExportsMapEntry(\n {\n exports,\n packagePath,\n filePath: main,\n requestCondition: type === 'module' ? 'import' : undefined,\n resolveWebExtensions,\n },\n context,\n );\n }\n\n if (module) {\n await addExportsMapEntry(\n {\n exports,\n packagePath,\n filePath: module,\n requestCondition: 'import',\n resolveWebExtensions,\n },\n context,\n );\n }\n\n if (browser) {\n if (typeof definition.browser === 'string') {\n await addExportsMapEntry(\n { exports, packagePath, filePath: definition.browser, environmentCondition: 'browser', resolveWebExtensions },\n context,\n );\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 isDefaultModule = normalizeRelativePath(module) === normalizeRelativePath(key);\n const isDefaultMain = normalizeRelativePath(main) === normalizeRelativePath(key);\n\n let importPaths: string[];\n if (isDefaultMain || isDefaultModule) {\n importPaths = ['.'];\n } else {\n importPaths = [key, 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 environmentCondition: 'browser',\n requestCondition: isDefaultModule || (isDefaultMain && type === 'module') ? 'import' : undefined,\n resolveWebExtensions,\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', resolveWebExtensions }, context)) ||\n (await addExportsMapEntry({ exports, packagePath, filePath: './lib/main.js', resolveWebExtensions }, context)) ||\n (await addExportsMapEntry({ exports, packagePath, filePath: './index.js', resolveWebExtensions }, context));\n }\n\n return exports;\n}\n"]}
@@ -9,7 +9,14 @@ import type { CloudpackConfig, PackageDefinitionsCache, PackageJsonExports } fro
9
9
  */
10
10
  export declare function getExportsMap(options: {
11
11
  packagePath: string;
12
- disableTransforms?: boolean;
12
+ disableTransforms: boolean;
13
+ resolveWebExtensions: boolean;
14
+ }, context: {
15
+ packages: PackageDefinitionsCache;
16
+ config: Pick<CloudpackConfig, 'features'>;
17
+ }): Promise<PackageJsonExports>;
18
+ export declare function getExportsMap(options: {
19
+ packagePath: string;
13
20
  }, context: {
14
21
  packages: PackageDefinitionsCache;
15
22
  config: Pick<CloudpackConfig, 'features'>;
@@ -1 +1 @@
1
- {"version":3,"file":"getExportsMap.d.ts","sourceRoot":"","sources":["../../src/exportsMap/getExportsMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAG/G;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAE,EAC7D,OAAO,EAAE;IAAE,QAAQ,EAAE,uBAAuB,CAAC;IAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAA;CAAE,GACxF,OAAO,CAAC,kBAAkB,CAAC,CAU7B"}
1
+ {"version":3,"file":"getExportsMap.d.ts","sourceRoot":"","sources":["../../src/exportsMap/getExportsMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAG/G;;;;;;;GAOG;AAEH,wBAAsB,aAAa,CACjC,OAAO,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,OAAO,CAAC;IAAC,oBAAoB,EAAE,OAAO,CAAA;CAAE,EAC3F,OAAO,EAAE;IAAE,QAAQ,EAAE,uBAAuB,CAAC;IAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAA;CAAE,GACxF,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAE/B,wBAAsB,aAAa,CACjC,OAAO,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,EAChC,OAAO,EAAE;IAAE,QAAQ,EAAE,uBAAuB,CAAC;IAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAA;CAAE,GACxF,OAAO,CAAC,kBAAkB,CAAC,CAAC"}
@@ -1,19 +1,22 @@
1
1
  import { createExportsMap } from './createExportsMap.js';
2
- /**
3
- * Get a package's provided exports map, or create one based on other entry info and the
4
- * package structure as a fallback.
5
- *
6
- * NOTE: Unless `disableTransforms` is true, this will use the cached exports map that was created
7
- * by `createPackageSettingsTransform`. (Exception is tests within `package-utilities` or other
8
- * contexts that didn't use `createPackageDefinitions`.)
9
- */
2
+ // Implementation
10
3
  export async function getExportsMap(options, context) {
11
- const { packagePath } = options;
4
+ const { packagePath, disableTransforms } = options;
12
5
  const { packages } = context;
13
6
  const definition = await packages.get(packagePath, options);
7
+ if (disableTransforms !== undefined && options.resolveWebExtensions === undefined) {
8
+ // When disableTransforms is defined, we need to know if we should resolve web extensions.
9
+ throw new Error('resolveWebExtensions is required when disableTransforms is true (this is a Cloudpack bug).');
10
+ }
14
11
  if (definition.exports !== undefined) {
15
12
  return definition.exports;
16
13
  }
17
- return createExportsMap(options, context);
14
+ return createExportsMap({
15
+ ...options,
16
+ resolveWebExtensions: options.resolveWebExtensions ??
17
+ definition.cloudpack?.bundlerCapabilities?.['resolve-web-extensions'] ??
18
+ // eslint-disable-next-line etc/no-deprecated
19
+ Boolean(context.config.features?.resolveWebExtensions),
20
+ }, context);
18
21
  }
19
22
  //# sourceMappingURL=getExportsMap.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getExportsMap.js","sourceRoot":"","sources":["../../src/exportsMap/getExportsMap.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAA6D,EAC7D,OAAyF;IAEzF,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAChC,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC7B,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAE5D,IAAI,UAAU,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO,UAAU,CAAC,OAAO,CAAC;IAC5B,CAAC;IAED,OAAO,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["import type { CloudpackConfig, PackageDefinitionsCache, PackageJsonExports } from '@ms-cloudpack/common-types';\nimport { createExportsMap } from './createExportsMap.js';\n\n/**\n * Get a package's provided exports map, or create one based on other entry info and the\n * package structure as a fallback.\n *\n * NOTE: Unless `disableTransforms` is true, this will use the cached exports map that was created\n * by `createPackageSettingsTransform`. (Exception is tests within `package-utilities` or other\n * contexts that didn't use `createPackageDefinitions`.)\n */\nexport async function getExportsMap(\n options: { packagePath: string; disableTransforms?: boolean },\n context: { packages: PackageDefinitionsCache; config: Pick<CloudpackConfig, 'features'> },\n): Promise<PackageJsonExports> {\n const { packagePath } = options;\n const { packages } = context;\n const definition = await packages.get(packagePath, options);\n\n if (definition.exports !== undefined) {\n return definition.exports;\n }\n\n return createExportsMap(options, context);\n}\n"]}
1
+ {"version":3,"file":"getExportsMap.js","sourceRoot":"","sources":["../../src/exportsMap/getExportsMap.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAoBzD,iBAAiB;AACjB,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAA6F,EAC7F,OAAyF;IAEzF,MAAM,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC;IACnD,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC7B,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAE5D,IAAI,iBAAiB,KAAK,SAAS,IAAI,OAAO,CAAC,oBAAoB,KAAK,SAAS,EAAE,CAAC;QAClF,0FAA0F;QAC1F,MAAM,IAAI,KAAK,CAAC,4FAA4F,CAAC,CAAC;IAChH,CAAC;IAED,IAAI,UAAU,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO,UAAU,CAAC,OAAO,CAAC;IAC5B,CAAC;IAED,OAAO,gBAAgB,CACrB;QACE,GAAG,OAAO;QACV,oBAAoB,EAClB,OAAO,CAAC,oBAAoB;YAC5B,UAAU,CAAC,SAAS,EAAE,mBAAmB,EAAE,CAAC,wBAAwB,CAAC;YACrE,6CAA6C;YAC7C,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,oBAAoB,CAAC;KACzD,EACD,OAAO,CACR,CAAC;AACJ,CAAC","sourcesContent":["import type { CloudpackConfig, PackageDefinitionsCache, PackageJsonExports } from '@ms-cloudpack/common-types';\nimport { createExportsMap } from './createExportsMap.js';\n\n/**\n * Get a package's provided exports map, or create one based on other entry info and the\n * package structure as a fallback.\n *\n * NOTE: Unless `disableTransforms` is true, this will use the cached exports map that was created\n * by `createPackageSettingsTransform`. (Exception is tests within `package-utilities` or other\n * contexts that didn't use `createPackageDefinitions`.)\n */\n// When disableTransforms is defined, resolveWebExtensions is required\nexport async function getExportsMap(\n options: { packagePath: string; disableTransforms: boolean; resolveWebExtensions: boolean },\n context: { packages: PackageDefinitionsCache; config: Pick<CloudpackConfig, 'features'> },\n): Promise<PackageJsonExports>;\n// When disableTransforms is undefined, resolveWebExtensions is not required since we can get it from cached settings\nexport async function getExportsMap(\n options: { packagePath: string },\n context: { packages: PackageDefinitionsCache; config: Pick<CloudpackConfig, 'features'> },\n): Promise<PackageJsonExports>;\n// Implementation\nexport async function getExportsMap(\n options: { packagePath: string; disableTransforms?: boolean; resolveWebExtensions?: boolean },\n context: { packages: PackageDefinitionsCache; config: Pick<CloudpackConfig, 'features'> },\n): Promise<PackageJsonExports> {\n const { packagePath, disableTransforms } = options;\n const { packages } = context;\n const definition = await packages.get(packagePath, options);\n\n if (disableTransforms !== undefined && options.resolveWebExtensions === undefined) {\n // When disableTransforms is defined, we need to know if we should resolve web extensions.\n throw new Error('resolveWebExtensions is required when disableTransforms is true (this is a Cloudpack bug).');\n }\n\n if (definition.exports !== undefined) {\n return definition.exports;\n }\n\n return createExportsMap(\n {\n ...options,\n resolveWebExtensions:\n options.resolveWebExtensions ??\n definition.cloudpack?.bundlerCapabilities?.['resolve-web-extensions'] ??\n // eslint-disable-next-line etc/no-deprecated\n Boolean(context.config.features?.resolveWebExtensions),\n },\n context,\n );\n}\n"]}
@@ -2,6 +2,7 @@ import type { CloudpackConfig, PackageDefinitionsCache } from '@ms-cloudpack/com
2
2
  export type FindFileInPackageOptions = {
3
3
  packagePath: string;
4
4
  filePath: string;
5
+ resolveWebExtensions: boolean;
5
6
  };
6
7
  export type FindFileInPackageResult = {
7
8
  filePath?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"findFileInPackage.d.ts","sourceRoot":"","sources":["../../src/findFileInPackage/findFileInPackage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAgB3F,MAAM,MAAM,wBAAwB,GAAG;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,wBAAwB,EACjC,OAAO,EAAE;IAAE,QAAQ,EAAE,uBAAuB,CAAC;IAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAA;CAAE,GACxF,OAAO,CAAC,uBAAuB,CAAC,CAqFlC"}
1
+ {"version":3,"file":"findFileInPackage.d.ts","sourceRoot":"","sources":["../../src/findFileInPackage/findFileInPackage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAgB3F,MAAM,MAAM,wBAAwB,GAAG;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,wBAAwB,EACjC,OAAO,EAAE;IAAE,QAAQ,EAAE,uBAAuB,CAAC;IAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAA;CAAE,GACxF,OAAO,CAAC,uBAAuB,CAAC,CAuFlC"}
@@ -17,6 +17,7 @@ const javascriptExtensions = ['.js', '.mjs', '.cjs'];
17
17
  * exist, then we should not include it in the exports map.
18
18
  */
19
19
  export async function findFileInPackage(options, context) {
20
+ const { resolveWebExtensions } = options;
20
21
  const originalPath = normalizeRelativePath(options.filePath);
21
22
  const packagePath = slash(options.packagePath);
22
23
  let filePath;
@@ -35,7 +36,7 @@ export async function findFileInPackage(options, context) {
35
36
  }
36
37
  }
37
38
  for (const currentPath of pathsToConsider) {
38
- const candidates = await getCandidates({ filePath: currentPath, packagePath }, context);
39
+ const candidates = await getCandidates({ filePath: currentPath, packagePath, resolveWebExtensions }, context);
39
40
  // Try and resolve a physical file given the candidates.
40
41
  filePath = candidates.find((candidate) => isFileSync(path.join(packagePath, candidate)));
41
42
  if (filePath) {
@@ -52,6 +53,7 @@ export async function findFileInPackage(options, context) {
52
53
  return findFileInPackage({
53
54
  packagePath,
54
55
  filePath: normalizeRelativePath(path.relative(packagePath, path.join(nestedDefinitionPath, entryPath))),
56
+ resolveWebExtensions: options.resolveWebExtensions,
55
57
  }, context);
56
58
  }
57
59
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"findFileInPackage.js","sourceRoot":"","sources":["../../src/findFileInPackage/findFileInPackage.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CloudpackConfig, PackageDefinitionsCache } from '@ms-cloudpack/common-types';\nimport { normalizeRelativePath, slash } from '@ms-cloudpack/path-string-parsing';\nimport {\n intermediateToSourcePath,\n isExternalPackage,\n isFileSync,\n sourceToIntermediatePath,\n} from '@ms-cloudpack/path-utilities';\nimport path from 'path';\nimport { flattenExportsMap } from '../exportsMap/flattenExportsMap.js';\nimport { getCandidates } from './getCandidates.js';\nimport { getExportsMap } from '../exportsMap/getExportsMap.js';\n\nconst sourceExtensions = ['.ts', '.tsx', '.cts', '.mts', '.jsx'];\nconst javascriptExtensions = ['.js', '.mjs', '.cjs'];\n\nexport type FindFileInPackageOptions = {\n packagePath: string;\n filePath: string;\n};\n\nexport type FindFileInPackageResult = {\n filePath?: string;\n sourcePath?: string;\n};\n\n/**\n * Given a requested partial filePath, resolves the relative intermediate path if the file exists, with special\n * consideration for internal packages, which may not have intermediate files but only source files. Paths returned\n * are always relative and start with `./`.\n *\n * This helper is used in deriving if the given package.json entries are actual validate candidates when constructing an\n * exports map from existing metadata. For example, a package.json may list `main` as `lib/index.js`. If this file\n * exists, or in internal packages, if `src/index.tsx` exists, then this is a valid candidate. If the file does not\n * exist, then we should not include it in the exports map.\n */\nexport async function findFileInPackage(\n options: FindFileInPackageOptions,\n context: { packages: PackageDefinitionsCache; config: Pick<CloudpackConfig, 'features'> },\n): Promise<FindFileInPackageResult> {\n const originalPath = normalizeRelativePath(options.filePath);\n const packagePath = slash(options.packagePath);\n let filePath: string | undefined;\n let sourcePath: string | undefined;\n const isInternal = !isExternalPackage(packagePath);\n const pathsToConsider = [originalPath];\n\n const originalDefinition = await context.packages.tryGet(packagePath, { disableTransforms: true });\n // If the original package.json has an exports map, we should not use main and module as hints.\n if (originalPath === '.' && originalDefinition && !originalDefinition.exports) {\n const { main, module } = originalDefinition;\n if (main) {\n pathsToConsider.unshift(main);\n }\n if (module) {\n pathsToConsider.unshift(module);\n }\n }\n\n for (const currentPath of pathsToConsider) {\n const candidates = await getCandidates({ filePath: currentPath, packagePath }, context);\n\n // Try and resolve a physical file given the candidates.\n filePath = candidates.find((candidate) => isFileSync(path.join(packagePath, candidate)));\n if (filePath) {\n break;\n }\n }\n\n const isNestedPackageDefinition =\n filePath && path.basename(filePath) === 'package.json' && path.basename(originalPath) !== 'package.json';\n const result: FindFileInPackageResult = {};\n\n if (isNestedPackageDefinition) {\n const nestedDefinitionPath = path.dirname(path.join(packagePath, filePath as string));\n const exportsMap = await getExportsMap({ packagePath: nestedDefinitionPath }, context);\n const entryPath = flattenExportsMap(exportsMap)['.'];\n\n if (entryPath) {\n return findFileInPackage(\n {\n packagePath,\n filePath: normalizeRelativePath(path.relative(packagePath, path.join(nestedDefinitionPath, entryPath))),\n },\n context,\n );\n } else {\n // If we can't find an entry, we should not include this in the exports map.\n // This avoids adding a \"./package.json\" value to a \".\" entry.\n return result;\n }\n }\n\n // If the resolved file is a typescript file in an internal package, try to resolve the intermediate.\n if (filePath && sourceExtensions.includes(path.extname(filePath))) {\n sourcePath = filePath;\n filePath = isInternal ? sourceToIntermediatePath(filePath) : undefined;\n }\n\n // If we haven't resolved a sourcePath, try to resolve it from the intermediate.\n if (isInternal && filePath && !sourcePath) {\n const ext = path.extname(filePath);\n const isJavaScriptExt = javascriptExtensions.includes(ext);\n\n if (isJavaScriptExt) {\n // Not a TS file, but a JS file. Try to find the source.\n sourcePath = intermediateToSourcePath(filePath, packagePath);\n\n // If we couldn't find a TS file, clear sourcePath.\n if (sourcePath === filePath) {\n sourcePath = undefined;\n }\n }\n }\n\n if (filePath) {\n result.filePath = normalizeRelativePath(filePath);\n }\n\n if (sourcePath) {\n result.sourcePath = normalizeRelativePath(sourcePath);\n }\n\n return result;\n}\n"]}
1
+ {"version":3,"file":"findFileInPackage.js","sourceRoot":"","sources":["../../src/findFileInPackage/findFileInPackage.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CloudpackConfig, PackageDefinitionsCache } from '@ms-cloudpack/common-types';\nimport { normalizeRelativePath, slash } from '@ms-cloudpack/path-string-parsing';\nimport {\n intermediateToSourcePath,\n isExternalPackage,\n isFileSync,\n sourceToIntermediatePath,\n} from '@ms-cloudpack/path-utilities';\nimport path from 'path';\nimport { flattenExportsMap } from '../exportsMap/flattenExportsMap.js';\nimport { getCandidates } from './getCandidates.js';\nimport { getExportsMap } from '../exportsMap/getExportsMap.js';\n\nconst sourceExtensions = ['.ts', '.tsx', '.cts', '.mts', '.jsx'];\nconst javascriptExtensions = ['.js', '.mjs', '.cjs'];\n\nexport type FindFileInPackageOptions = {\n packagePath: string;\n filePath: string;\n resolveWebExtensions: boolean;\n};\n\nexport type FindFileInPackageResult = {\n filePath?: string;\n sourcePath?: string;\n};\n\n/**\n * Given a requested partial filePath, resolves the relative intermediate path if the file exists, with special\n * consideration for internal packages, which may not have intermediate files but only source files. Paths returned\n * are always relative and start with `./`.\n *\n * This helper is used in deriving if the given package.json entries are actual validate candidates when constructing an\n * exports map from existing metadata. For example, a package.json may list `main` as `lib/index.js`. If this file\n * exists, or in internal packages, if `src/index.tsx` exists, then this is a valid candidate. If the file does not\n * exist, then we should not include it in the exports map.\n */\nexport async function findFileInPackage(\n options: FindFileInPackageOptions,\n context: { packages: PackageDefinitionsCache; config: Pick<CloudpackConfig, 'features'> },\n): Promise<FindFileInPackageResult> {\n const { resolveWebExtensions } = options;\n const originalPath = normalizeRelativePath(options.filePath);\n const packagePath = slash(options.packagePath);\n let filePath: string | undefined;\n let sourcePath: string | undefined;\n const isInternal = !isExternalPackage(packagePath);\n const pathsToConsider = [originalPath];\n\n const originalDefinition = await context.packages.tryGet(packagePath, { disableTransforms: true });\n // If the original package.json has an exports map, we should not use main and module as hints.\n if (originalPath === '.' && originalDefinition && !originalDefinition.exports) {\n const { main, module } = originalDefinition;\n if (main) {\n pathsToConsider.unshift(main);\n }\n if (module) {\n pathsToConsider.unshift(module);\n }\n }\n\n for (const currentPath of pathsToConsider) {\n const candidates = await getCandidates({ filePath: currentPath, packagePath, resolveWebExtensions }, context);\n\n // Try and resolve a physical file given the candidates.\n filePath = candidates.find((candidate) => isFileSync(path.join(packagePath, candidate)));\n if (filePath) {\n break;\n }\n }\n\n const isNestedPackageDefinition =\n filePath && path.basename(filePath) === 'package.json' && path.basename(originalPath) !== 'package.json';\n const result: FindFileInPackageResult = {};\n\n if (isNestedPackageDefinition) {\n const nestedDefinitionPath = path.dirname(path.join(packagePath, filePath as string));\n const exportsMap = await getExportsMap({ packagePath: nestedDefinitionPath }, context);\n const entryPath = flattenExportsMap(exportsMap)['.'];\n\n if (entryPath) {\n return findFileInPackage(\n {\n packagePath,\n filePath: normalizeRelativePath(path.relative(packagePath, path.join(nestedDefinitionPath, entryPath))),\n resolveWebExtensions: options.resolveWebExtensions,\n },\n context,\n );\n } else {\n // If we can't find an entry, we should not include this in the exports map.\n // This avoids adding a \"./package.json\" value to a \".\" entry.\n return result;\n }\n }\n\n // If the resolved file is a typescript file in an internal package, try to resolve the intermediate.\n if (filePath && sourceExtensions.includes(path.extname(filePath))) {\n sourcePath = filePath;\n filePath = isInternal ? sourceToIntermediatePath(filePath) : undefined;\n }\n\n // If we haven't resolved a sourcePath, try to resolve it from the intermediate.\n if (isInternal && filePath && !sourcePath) {\n const ext = path.extname(filePath);\n const isJavaScriptExt = javascriptExtensions.includes(ext);\n\n if (isJavaScriptExt) {\n // Not a TS file, but a JS file. Try to find the source.\n sourcePath = intermediateToSourcePath(filePath, packagePath);\n\n // If we couldn't find a TS file, clear sourcePath.\n if (sourcePath === filePath) {\n sourcePath = undefined;\n }\n }\n }\n\n if (filePath) {\n result.filePath = normalizeRelativePath(filePath);\n }\n\n if (sourcePath) {\n result.sourcePath = normalizeRelativePath(sourcePath);\n }\n\n return result;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { type CloudpackConfig, type PackageDefinitionsCache } from '@ms-cloudpack/common-types';
1
+ import { type PackageDefinitionsCache } from '@ms-cloudpack/common-types';
2
2
  /**
3
3
  * Given a packagePath and a filePath from its exports map (or main/module), build candidate paths
4
4
  * to look for the physical file in order of priority. For internal packages, we try to discover
@@ -9,8 +9,8 @@ import { type CloudpackConfig, type PackageDefinitionsCache } from '@ms-cloudpac
9
9
  export declare function getCandidates(options: {
10
10
  filePath: string;
11
11
  packagePath: string;
12
+ resolveWebExtensions: boolean;
12
13
  }, context: {
13
- config: Pick<CloudpackConfig, 'features'>;
14
14
  packages: PackageDefinitionsCache;
15
15
  }): Promise<string[]>;
16
16
  //# sourceMappingURL=getCandidates.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getCandidates.d.ts","sourceRoot":"","sources":["../../src/findFileInPackage/getCandidates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AA4BhG;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EAClD,OAAO,EAAE;IAAE,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAAC,QAAQ,EAAE,uBAAuB,CAAA;CAAE,GACxF,OAAO,CAAC,MAAM,EAAE,CAAC,CA0EnB"}
1
+ {"version":3,"file":"getCandidates.d.ts","sourceRoot":"","sources":["../../src/findFileInPackage/getCandidates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AA4B1E;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,oBAAoB,EAAE,OAAO,CAAA;CAAE,EACjF,OAAO,EAAE;IAAE,QAAQ,EAAE,uBAAuB,CAAA;CAAE,GAC7C,OAAO,CAAC,MAAM,EAAE,CAAC,CAyEnB"}
@@ -32,8 +32,7 @@ const externalExtensionMap = {
32
32
  */
33
33
  export async function getCandidates(options, context) {
34
34
  const outputPaths = await findPackageOutputPaths(options.packagePath, context);
35
- const { filePath, packagePath } = options;
36
- const resolveWebExtensions = Boolean(context.config.features?.resolveWebExtensions);
35
+ const { filePath, packagePath, resolveWebExtensions } = options;
37
36
  const isBlankPath = !filePath || filePath === '.';
38
37
  const originalPath = isBlankPath ? './index' : normalizeRelativePath(filePath);
39
38
  const originalExt = path.extname(originalPath);
@@ -1 +1 @@
1
- {"version":3,"file":"getCandidates.js","sourceRoot":"","sources":["../../src/findFileInPackage/getCandidates.ts"],"names":[],"mappings":"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","sourcesContent":["import { type CloudpackConfig, type PackageDefinitionsCache } from '@ms-cloudpack/common-types';\nimport { normalizeRelativePath } from '@ms-cloudpack/path-string-parsing';\nimport { isExternalPackage } from '@ms-cloudpack/path-utilities';\nimport path from 'path';\nimport { findPackageOutputPaths } from './findPackageOutputPaths.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 async function getCandidates(\n options: { filePath: string; packagePath: string },\n context: { config: Pick<CloudpackConfig, 'features'>; packages: PackageDefinitionsCache },\n): Promise<string[]> {\n const outputPaths = await findPackageOutputPaths(options.packagePath, context);\n const { filePath, packagePath } = options;\n const resolveWebExtensions = Boolean(context.config.features?.resolveWebExtensions);\n const isBlankPath = !filePath || filePath === '.';\n const originalPath = isBlankPath ? './index' : normalizeRelativePath(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\n const pathsToAdd: string[] = [];\n\n // For internal packages, we try and resolve the source file name first.\n const { esmPath, cjsPath } = outputPaths || {};\n\n if (isInternal) {\n if (cjsPath && esmPath) {\n if (originalPath.startsWith(esmPath)) {\n pathsToAdd.push(originalPath.replace(esmPath, './src/'));\n } else if (originalPath.startsWith(cjsPath)) {\n pathsToAdd.push(originalPath.replace(cjsPath, './src/'));\n }\n } else if (originalPath.startsWith('./lib/')) {\n pathsToAdd.push(originalPath.replace(/^\\.\\/lib\\//, './src/'));\n }\n }\n\n if (esmPath && cjsPath) {\n // We have a distinct esm output path. If the original path refers to the cjsPath,\n // refer only to the esm path.\n pathsToAdd.push(originalPath.replace(cjsPath, esmPath));\n } else {\n pathsToAdd.push(originalPath);\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 && !isBlankPath) {\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 // 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 * `['./foo/bar.ts.js', './foo/bar.js']`\n */\nfunction expandExtensions(filePath: string, extensions: string[]): 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/findFileInPackage/getCandidates.ts"],"names":[],"mappings":"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","sourcesContent":["import { type PackageDefinitionsCache } from '@ms-cloudpack/common-types';\nimport { normalizeRelativePath } from '@ms-cloudpack/path-string-parsing';\nimport { isExternalPackage } from '@ms-cloudpack/path-utilities';\nimport path from 'path';\nimport { findPackageOutputPaths } from './findPackageOutputPaths.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 async function getCandidates(\n options: { filePath: string; packagePath: string; resolveWebExtensions: boolean },\n context: { packages: PackageDefinitionsCache },\n): Promise<string[]> {\n const outputPaths = await findPackageOutputPaths(options.packagePath, context);\n const { filePath, packagePath, resolveWebExtensions } = options;\n const isBlankPath = !filePath || filePath === '.';\n const originalPath = isBlankPath ? './index' : normalizeRelativePath(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\n const pathsToAdd: string[] = [];\n\n // For internal packages, we try and resolve the source file name first.\n const { esmPath, cjsPath } = outputPaths || {};\n\n if (isInternal) {\n if (cjsPath && esmPath) {\n if (originalPath.startsWith(esmPath)) {\n pathsToAdd.push(originalPath.replace(esmPath, './src/'));\n } else if (originalPath.startsWith(cjsPath)) {\n pathsToAdd.push(originalPath.replace(cjsPath, './src/'));\n }\n } else if (originalPath.startsWith('./lib/')) {\n pathsToAdd.push(originalPath.replace(/^\\.\\/lib\\//, './src/'));\n }\n }\n\n if (esmPath && cjsPath) {\n // We have a distinct esm output path. If the original path refers to the cjsPath,\n // refer only to the esm path.\n pathsToAdd.push(originalPath.replace(cjsPath, esmPath));\n } else {\n pathsToAdd.push(originalPath);\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 && !isBlankPath) {\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 // 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 * `['./foo/bar.ts.js', './foo/bar.js']`\n */\nfunction expandExtensions(filePath: string, extensions: string[]): 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"]}
@@ -3,6 +3,7 @@ import { PackageDefinitions } from './PackageDefinitions.js';
3
3
  * Version of PackageDefinitions which uses a fixture object instead of reading from disk.
4
4
  */
5
5
  export class MockPackageDefinitions extends PackageDefinitions {
6
+ _fixture;
6
7
  /**
7
8
  * **WARNING**: Cloudpack code (including tests) outside of `@ms-cloudpack/package-utilities`
8
9
  * should use `createPackageDefinitions` from `@ms-cloudpack/config` instead. That wrapper adds
@@ -1 +1 @@
1
- {"version":3,"file":"MockPackageDefinitions.js","sourceRoot":"","sources":["../../src/packageDefinitions/MockPackageDefinitions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAkC,MAAM,yBAAyB,CAAC;AAa7F;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,kBAAkB;IAG5D;;;;OAIG;IACH,YAAY,OAAsC;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAClC,CAAC;IAED,wEAAwE;IAC9D,KAAK,CAAC,YAAY,CAAC,cAAsB;QACjD,0DAA0D;QAC1D,OAAO,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;IACxD,CAAC;CACF","sourcesContent":["import type { PackageJson } from '@ms-cloudpack/common-types';\nimport { PackageDefinitions, type PackageDefinitionsOptions } from './PackageDefinitions.js';\n\ninterface MockPackageDefinitionsOptions extends PackageDefinitionsOptions {\n /**\n * Map of package paths to non-transformed package definitions, used for testing.\n * Paths should be normalized with forward slashes.\n *\n * If this is set, `get()` will NOT attempt to read package definitions from disk.\n * Note that the fixture will persist across `reset` or `registerTransform` calls.\n */\n fixture: Readonly<Record<string, PackageJson>>;\n}\n\n/**\n * Version of PackageDefinitions which uses a fixture object instead of reading from disk.\n */\nexport class MockPackageDefinitions extends PackageDefinitions {\n private _fixture: MockPackageDefinitionsOptions['fixture'];\n\n /**\n * **WARNING**: Cloudpack code (including tests) outside of `@ms-cloudpack/package-utilities`\n * should use `createPackageDefinitions` from `@ms-cloudpack/config` instead. That wrapper adds\n * some transforms which are essential for applying settings from the cloudpack config.\n */\n constructor(options: MockPackageDefinitionsOptions) {\n super(options);\n this._fixture = options.fixture;\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await -- override\n protected async _readPackage(normalizedPath: string): Promise<PackageJson | undefined> {\n // Make a copy to avoid accidentally modifying the fixture\n return structuredClone(this._fixture[normalizedPath]);\n }\n}\n"]}
1
+ {"version":3,"file":"MockPackageDefinitions.js","sourceRoot":"","sources":["../../src/packageDefinitions/MockPackageDefinitions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAkC,MAAM,yBAAyB,CAAC;AAa7F;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,kBAAkB;IACpD,QAAQ,CAA2C;IAE3D;;;;OAIG;IACH,YAAY,OAAsC;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAClC,CAAC;IAED,wEAAwE;IAC9D,KAAK,CAAC,YAAY,CAAC,cAAsB;QACjD,0DAA0D;QAC1D,OAAO,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;IACxD,CAAC;CACF","sourcesContent":["import type { PackageJson } from '@ms-cloudpack/common-types';\nimport { PackageDefinitions, type PackageDefinitionsOptions } from './PackageDefinitions.js';\n\ninterface MockPackageDefinitionsOptions extends PackageDefinitionsOptions {\n /**\n * Map of package paths to non-transformed package definitions, used for testing.\n * Paths should be normalized with forward slashes.\n *\n * If this is set, `get()` will NOT attempt to read package definitions from disk.\n * Note that the fixture will persist across `reset` or `registerTransform` calls.\n */\n fixture: Readonly<Record<string, PackageJson>>;\n}\n\n/**\n * Version of PackageDefinitions which uses a fixture object instead of reading from disk.\n */\nexport class MockPackageDefinitions extends PackageDefinitions {\n private _fixture: MockPackageDefinitionsOptions['fixture'];\n\n /**\n * **WARNING**: Cloudpack code (including tests) outside of `@ms-cloudpack/package-utilities`\n * should use `createPackageDefinitions` from `@ms-cloudpack/config` instead. That wrapper adds\n * some transforms which are essential for applying settings from the cloudpack config.\n */\n constructor(options: MockPackageDefinitionsOptions) {\n super(options);\n this._fixture = options.fixture;\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await -- override\n protected async _readPackage(normalizedPath: string): Promise<PackageJson | undefined> {\n // Make a copy to avoid accidentally modifying the fixture\n return structuredClone(this._fixture[normalizedPath]);\n }\n}\n"]}
@@ -30,16 +30,17 @@ const copyPackageJsonKeys = {
30
30
  cloudpack: true,
31
31
  };
32
32
  export class PackageDefinitions {
33
+ _definitions = {};
34
+ _transformedDefinitions = {};
35
+ _config;
36
+ _transforms = [];
37
+ _transformFactories = [];
33
38
  /**
34
39
  * **WARNING**: Cloudpack code (including tests) outside of `@ms-cloudpack/package-utilities`
35
40
  * should use `createPackageDefinitions` from `@ms-cloudpack/config` instead. That wrapper adds
36
41
  * some transforms which are essential for applying settings from the cloudpack config.
37
42
  */
38
43
  constructor(options = {}) {
39
- this._definitions = {};
40
- this._transformedDefinitions = {};
41
- this._transforms = [];
42
- this._transformFactories = [];
43
44
  const { config, transformFactories } = options;
44
45
  this._transformFactories = transformFactories || [];
45
46
  this.reset({ newConfig: config, force: true });
@@ -1 +1 @@
1
- {"version":3,"file":"PackageDefinitions.js","sourceRoot":"","sources":["../../src/packageDefinitions/PackageDefinitions.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\nimport type {\n CloudpackConfig,\n GetPackageDefinitionOptions,\n PackageDefinitionTransform,\n PackageDefinitionTransformFactory,\n PackageDefinitionsCache,\n PackageJson,\n} from '@ms-cloudpack/common-types';\nimport { cloneJson, readJson } from '@ms-cloudpack/json-utilities';\nimport { getNonSemverTransform } from './getNonSemverTransform.js';\nimport { getApiServerTransform } from './getApiServerTransform.js';\nimport { slash } from '@ms-cloudpack/path-string-parsing';\nimport { getTypesTransform } from './getTypesTransform.js';\n\nexport interface PackageDefinitionsOptions {\n /**\n * Config object to pass to transforms. When `reset` is called with a new value, the transforms\n * will be transforms will be re-created using the new config.\n */\n config?: CloudpackConfig;\n /**\n * Transform factories to register on initialization.\n */\n transformFactories?: PackageDefinitionTransformFactory[];\n}\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 = () => [getApiServerTransform(), getTypesTransform(), getNonSemverTransform()];\n\n/** Only copy these keys from package.json. (It's an object for better typings and faster access.) */\nconst copyPackageJsonKeys: Record<keyof PackageJson, true> = {\n name: true,\n version: true,\n description: true,\n dependencies: true,\n devDependencies: true,\n peerDependencies: true,\n peerDependenciesMeta: true,\n optionalDependencies: true,\n bundledDependencies: true,\n bundleDependencies: true,\n type: true,\n main: true,\n module: true,\n browser: true,\n exports: true,\n resolutions: true,\n cloudpack: true,\n};\n\nexport class PackageDefinitions implements PackageDefinitionsCache {\n private _definitions: Record<string, PackageJson | undefined> = {};\n private _transformedDefinitions: Record<string, PackageJson> = {};\n private _config: CloudpackConfig | undefined;\n private _transforms: PackageDefinitionTransform[] = [];\n private _transformFactories: PackageDefinitionTransformFactory[] = [];\n\n /**\n * **WARNING**: Cloudpack code (including tests) outside of `@ms-cloudpack/package-utilities`\n * should use `createPackageDefinitions` from `@ms-cloudpack/config` instead. That wrapper adds\n * some transforms which are essential for applying settings from the cloudpack config.\n */\n constructor(options: PackageDefinitionsOptions = {}) {\n const { config, transformFactories } = options;\n this._transformFactories = transformFactories || [];\n\n this.reset({ newConfig: config, force: true });\n }\n\n async get(packagePath: string, options?: GetPackageDefinitionOptions): Promise<PackageJson> {\n const definition = await this.tryGet(packagePath, options);\n if (!definition) {\n throw new Error(`package.json not found at \"${packagePath}\"`);\n }\n return definition;\n }\n\n async tryGet(packagePath: string, options: GetPackageDefinitionOptions = {}): Promise<PackageJson | undefined> {\n const { refresh, disableTransforms, importerContext } = options;\n\n // Normalize the path used for caching to ensure consistency and avoid duplicates.\n const normalizedPath = slash(packagePath);\n\n if (refresh) {\n delete this._definitions[normalizedPath];\n delete this._transformedDefinitions[normalizedPath];\n }\n\n // If the definition is not in the cache, read it from disk (or from the fixture).\n // (If the definition was invalid JSON or not found, undefined is cached.)\n let definition = this._definitions[normalizedPath];\n if (!(normalizedPath in this._definitions)) {\n definition = await this._readPackage(normalizedPath);\n this._definitions[normalizedPath] = definition;\n\n if (definition) {\n definition.name ??= `unknown-${packagePath.replace(/[^\\w-]/g, '-')}`;\n definition.version ??= '0.0.0-unknown';\n }\n }\n\n if (disableTransforms || !definition) {\n return definition;\n }\n\n // If we don't want to skip the transform, transform the definition.\n let transformedDefinition = this._transformedDefinitions[normalizedPath];\n if (!transformedDefinition) {\n // Clone the definition (only keys we care about) so we don't accidentally modify the original.\n transformedDefinition = cloneJson(definition, { onlyKeys: copyPackageJsonKeys });\n\n for (const transform of this._transforms) {\n transformedDefinition =\n (await transform({\n definition: transformedDefinition,\n packagePath: normalizedPath,\n packages: this,\n importerContext,\n })) || transformedDefinition;\n }\n\n this._transformedDefinitions[normalizedPath] = transformedDefinition;\n }\n\n return transformedDefinition;\n }\n\n registerTransform(factory: PackageDefinitionTransformFactory): void {\n this._transformFactories.push(factory);\n this._transforms.push(factory(this._config));\n\n this.reset();\n }\n\n reset(options?: { newConfig?: CloudpackConfig; force?: boolean }): void {\n this._definitions = {};\n this._transformedDefinitions = {};\n\n const { newConfig, force } = options || {};\n\n if (newConfig || force) {\n this._config = newConfig;\n this._transforms = [...getDefaultTransforms(), ...this._transformFactories.map((factory) => factory(newConfig))];\n }\n }\n\n _getAll(options?: Pick<GetPackageDefinitionOptions, 'disableTransforms'>): Record<string, PackageJson | undefined> {\n return options?.disableTransforms ? this._definitions : this._transformedDefinitions;\n }\n\n protected async _readPackage(normalizedPath: string): Promise<PackageJson | undefined> {\n // `verbose` logs if the file exists but isn't valid JSON (or can't be read for some reason)\n return readJson<PackageJson>(path.join(normalizedPath, 'package.json'), { verbose: true });\n }\n}\n"]}
1
+ {"version":3,"file":"PackageDefinitions.js","sourceRoot":"","sources":["../../src/packageDefinitions/PackageDefinitions.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\nimport type {\n CloudpackConfig,\n GetPackageDefinitionOptions,\n PackageDefinitionTransform,\n PackageDefinitionTransformFactory,\n PackageDefinitionsCache,\n PackageJson,\n} from '@ms-cloudpack/common-types';\nimport { cloneJson, readJson } from '@ms-cloudpack/json-utilities';\nimport { getNonSemverTransform } from './getNonSemverTransform.js';\nimport { getApiServerTransform } from './getApiServerTransform.js';\nimport { slash } from '@ms-cloudpack/path-string-parsing';\nimport { getTypesTransform } from './getTypesTransform.js';\n\nexport interface PackageDefinitionsOptions {\n /**\n * Config object to pass to transforms. When `reset` is called with a new value, the transforms\n * will be transforms will be re-created using the new config.\n */\n config?: CloudpackConfig;\n /**\n * Transform factories to register on initialization.\n */\n transformFactories?: PackageDefinitionTransformFactory[];\n}\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 = () => [getApiServerTransform(), getTypesTransform(), getNonSemverTransform()];\n\n/** Only copy these keys from package.json. (It's an object for better typings and faster access.) */\nconst copyPackageJsonKeys: Record<keyof PackageJson, true> = {\n name: true,\n version: true,\n description: true,\n dependencies: true,\n devDependencies: true,\n peerDependencies: true,\n peerDependenciesMeta: true,\n optionalDependencies: true,\n bundledDependencies: true,\n bundleDependencies: true,\n type: true,\n main: true,\n module: true,\n browser: true,\n exports: true,\n resolutions: true,\n cloudpack: true,\n};\n\nexport class PackageDefinitions implements PackageDefinitionsCache {\n private _definitions: Record<string, PackageJson | undefined> = {};\n private _transformedDefinitions: Record<string, PackageJson> = {};\n private _config: CloudpackConfig | undefined;\n private _transforms: PackageDefinitionTransform[] = [];\n private _transformFactories: PackageDefinitionTransformFactory[] = [];\n\n /**\n * **WARNING**: Cloudpack code (including tests) outside of `@ms-cloudpack/package-utilities`\n * should use `createPackageDefinitions` from `@ms-cloudpack/config` instead. That wrapper adds\n * some transforms which are essential for applying settings from the cloudpack config.\n */\n constructor(options: PackageDefinitionsOptions = {}) {\n const { config, transformFactories } = options;\n this._transformFactories = transformFactories || [];\n\n this.reset({ newConfig: config, force: true });\n }\n\n async get(packagePath: string, options?: GetPackageDefinitionOptions): Promise<PackageJson> {\n const definition = await this.tryGet(packagePath, options);\n if (!definition) {\n throw new Error(`package.json not found at \"${packagePath}\"`);\n }\n return definition;\n }\n\n async tryGet(packagePath: string, options: GetPackageDefinitionOptions = {}): Promise<PackageJson | undefined> {\n const { refresh, disableTransforms, importerContext } = options;\n\n // Normalize the path used for caching to ensure consistency and avoid duplicates.\n const normalizedPath = slash(packagePath);\n\n if (refresh) {\n delete this._definitions[normalizedPath];\n delete this._transformedDefinitions[normalizedPath];\n }\n\n // If the definition is not in the cache, read it from disk (or from the fixture).\n // (If the definition was invalid JSON or not found, undefined is cached.)\n let definition = this._definitions[normalizedPath];\n if (!(normalizedPath in this._definitions)) {\n definition = await this._readPackage(normalizedPath);\n this._definitions[normalizedPath] = definition;\n\n if (definition) {\n definition.name ??= `unknown-${packagePath.replace(/[^\\w-]/g, '-')}`;\n definition.version ??= '0.0.0-unknown';\n }\n }\n\n if (disableTransforms || !definition) {\n return definition;\n }\n\n // If we don't want to skip the transform, transform the definition.\n let transformedDefinition = this._transformedDefinitions[normalizedPath];\n if (!transformedDefinition) {\n // Clone the definition (only keys we care about) so we don't accidentally modify the original.\n transformedDefinition = cloneJson(definition, { onlyKeys: copyPackageJsonKeys });\n\n for (const transform of this._transforms) {\n transformedDefinition =\n (await transform({\n definition: transformedDefinition,\n packagePath: normalizedPath,\n packages: this,\n importerContext,\n })) || transformedDefinition;\n }\n\n this._transformedDefinitions[normalizedPath] = transformedDefinition;\n }\n\n return transformedDefinition;\n }\n\n registerTransform(factory: PackageDefinitionTransformFactory): void {\n this._transformFactories.push(factory);\n this._transforms.push(factory(this._config));\n\n this.reset();\n }\n\n reset(options?: { newConfig?: CloudpackConfig; force?: boolean }): void {\n this._definitions = {};\n this._transformedDefinitions = {};\n\n const { newConfig, force } = options || {};\n\n if (newConfig || force) {\n this._config = newConfig;\n this._transforms = [...getDefaultTransforms(), ...this._transformFactories.map((factory) => factory(newConfig))];\n }\n }\n\n _getAll(options?: Pick<GetPackageDefinitionOptions, 'disableTransforms'>): Record<string, PackageJson | undefined> {\n return options?.disableTransforms ? this._definitions : this._transformedDefinitions;\n }\n\n protected async _readPackage(normalizedPath: string): Promise<PackageJson | undefined> {\n // `verbose` logs if the file exists but isn't valid JSON (or can't be read for some reason)\n return readJson<PackageJson>(path.join(normalizedPath, 'package.json'), { verbose: true });\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ms-cloudpack/package-utilities",
3
- "version": "11.3.6",
3
+ "version": "12.0.1",
4
4
  "description": "Utilities for resolving/parsing packages and their imports.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -14,11 +14,11 @@
14
14
  }
15
15
  },
16
16
  "dependencies": {
17
- "@ms-cloudpack/common-types": "^0.24.9",
17
+ "@ms-cloudpack/common-types": "^0.24.10",
18
18
  "@ms-cloudpack/json-utilities": "^0.1.10",
19
19
  "@ms-cloudpack/path-string-parsing": "^1.2.6",
20
- "@ms-cloudpack/path-utilities": "^3.0.6",
21
- "@ms-cloudpack/task-reporter": "^0.15.1",
20
+ "@ms-cloudpack/path-utilities": "^3.0.7",
21
+ "@ms-cloudpack/task-reporter": "^0.16.0",
22
22
  "acorn": "^8.11.2",
23
23
  "acorn-walk": "^8.2.1",
24
24
  "fast-glob": "^3.2.12",