@ms-cloudpack/package-utilities 13.2.5 → 13.3.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.
@@ -1,9 +1,5 @@
1
1
  import type { ModuleResolutionConfig, PackageDefinitionsCache, PackageImporterContext, PackageJson } from '@ms-cloudpack/common-types';
2
- /**
3
- * Find the package.json contents for `dependencyName`, searching up under `node_modules` folders
4
- * starting at `startPath` and ending at `rootPath` (usually the git root) or the filesystem root.
5
- */
6
- export declare function findPackage(options: {
2
+ export interface FindPackageOptions {
7
3
  /**
8
4
  * Dependency name as specified in the parent's deps and installed in `node_modules`.
9
5
  * (This is usually the actual name, except for renamed non-semver deps.)
@@ -16,7 +12,7 @@ export declare function findPackage(options: {
16
12
  /** Context in which `dependencyName` is imported. */
17
13
  importerContext?: PackageImporterContext;
18
14
  /** Stop searching at this path (usually the git root). Defaults to filesystem root. */
19
- rootPath?: string;
15
+ rootPath: string | undefined;
20
16
  /**
21
17
  * Cache of realpath results (improves perf, particularly on Windows).
22
18
  * As of writing, this is scoped to a `findPackagesFromPath` call.
@@ -25,17 +21,27 @@ export declare function findPackage(options: {
25
21
  realPathCache?: Record<string, string | undefined>;
26
22
  /**
27
23
  * Module resolution configuration. Includes settings for custom module directories and
28
- * dedupe behavior.
24
+ * dedupe behavior. When `dedupe` is specified, those packages will be resolved from
25
+ * the `appPath` to ensure consistent resolution across the dependency tree.
29
26
  */
30
27
  moduleResolutionConfig?: ModuleResolutionConfig;
31
28
  /**
32
- * Application path to use for dedupe resolution. When provided and the dependency is in
33
- * the dedupe list, resolution will start from this path instead of `startPath`.
29
+ * Application path to use for dedupe resolution. If the dependency is in the
30
+ * `moduleResolutionConfig.dedupe` list, resolution will start from here instead of `startPath`.
31
+ */
32
+ appPath: string | undefined;
33
+ }
34
+ export interface FindPackageContext {
35
+ /**
36
+ * Package cache.
34
37
  */
35
- appPath?: string;
36
- }, context: {
37
38
  packages: PackageDefinitionsCache;
38
- }): Promise<{
39
+ }
40
+ /**
41
+ * Find the package.json contents for `dependencyName`, searching up under `node_modules` folders
42
+ * starting at `startPath` and ending at `rootPath` (usually the git root) or the filesystem root.
43
+ */
44
+ export declare function findPackage(options: FindPackageOptions, context: FindPackageContext): Promise<{
39
45
  packagePath: string;
40
46
  definition: PackageJson;
41
47
  } | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"findPackage.d.ts","sourceRoot":"","sources":["../../src/findFileInPackage/findPackage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,WAAW,EACZ,MAAM,4BAA4B,CAAC;AAEpC;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE;IACP;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB,wEAAwE;IACxE,SAAS,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,UAAU,EAAE,WAAW,CAAC;IACxB,qDAAqD;IACrD,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACnD;;;OAGG;IACH,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;IAChD;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,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,CAsEvE"}
1
+ {"version":3,"file":"findPackage.d.ts","sourceRoot":"","sources":["../../src/findFileInPackage/findPackage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,WAAW,EACZ,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB,wEAAwE;IACxE,SAAS,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,UAAU,EAAE,WAAW,CAAC;IACxB,qDAAqD;IACrD,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,uFAAuF;IACvF,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACnD;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;IAChD;;;OAGG;IACH,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,QAAQ,EAAE,uBAAuB,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,WAAW,CAAA;CAAE,GAAG,SAAS,CAAC,CAsEvE"}
@@ -1 +1 @@
1
- {"version":3,"file":"findPackage.js","sourceRoot":"","sources":["../../src/findFileInPackage/findPackage.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\nimport fs from 'fs';\nimport type {\n ModuleResolutionConfig,\n PackageDefinitionsCache,\n PackageImporterContext,\n PackageJson,\n} from '@ms-cloudpack/common-types';\n\n/**\n * Find the package.json contents for `dependencyName`, searching up under `node_modules` folders\n * starting at `startPath` and ending at `rootPath` (usually the git root) or the filesystem root.\n */\nexport async function findPackage(\n options: {\n /**\n * Dependency name as specified in the parent's deps and installed in `node_modules`.\n * (This is usually the actual name, except for renamed non-semver deps.)\n */\n dependencyName: string;\n /** Start searching up from the `node_modules` of this parent folder. */\n startPath: string;\n /** Parent definition, used for self imports. */\n definition: PackageJson;\n /** Context in which `dependencyName` is imported. */\n importerContext?: PackageImporterContext;\n /** Stop searching at this path (usually the git root). Defaults to filesystem root. */\n rootPath?: string;\n /**\n * Cache of realpath results (improves perf, particularly on Windows).\n * As of writing, this is scoped to a `findPackagesFromPath` call.\n * (see https://github.com/microsoft/cloudpack/pull/2184)\n */\n realPathCache?: Record<string, string | undefined>;\n /**\n * Module resolution configuration. Includes settings for custom module directories and\n * dedupe behavior.\n */\n moduleResolutionConfig?: ModuleResolutionConfig;\n /**\n * Application path to use for dedupe resolution. When provided and the dependency is in\n * the dedupe list, resolution will start from this path instead of `startPath`.\n */\n appPath?: string;\n },\n context: {\n packages: PackageDefinitionsCache;\n },\n): Promise<{ packagePath: string; definition: PackageJson } | undefined> {\n const { dependencyName, rootPath, importerContext, realPathCache = {}, moduleResolutionConfig, appPath } = options;\n const { packages } = context;\n\n if (dependencyName == options.definition.name) {\n // Self-import detected, returning parent path and definition\n return { packagePath: options.startPath, definition: options.definition };\n }\n\n // Use appPath for deduped packages to ensure consistent resolution, otherwise use startPath\n const shouldDedupe = moduleResolutionConfig?.dedupe?.includes(dependencyName);\n let startPath: string;\n\n if (shouldDedupe) {\n if (!appPath) {\n throw new Error(`appPath is required when resolving deduped package \"${dependencyName}\"`);\n }\n startPath = appPath;\n } else {\n startPath = options.startPath;\n }\n\n for (const module of moduleResolutionConfig?.modules ?? ['node_modules']) {\n const isAbsolutePath = path.isAbsolute(module);\n let packagePath = isAbsolutePath ? module : startPath;\n const isStoreLayout = /[\\\\/]\\.(pnpm|store)[\\\\/]/.test(packagePath);\n\n do {\n const resolvedPath = isAbsolutePath\n ? path.join(module, dependencyName)\n : path.join(packagePath, module, dependencyName);\n let definition: PackageJson | undefined;\n let realPath: string | undefined;\n\n try {\n // Get the realpath in case of a symlinked layout.\n // realpathSync.native is faster than either realpathSync or realpath.\n // https://github.com/microsoft/cloudpack/pull/2127#discussion_r1607070201\n realPath = realPathCache?.[resolvedPath] || fs.realpathSync.native(resolvedPath);\n definition = await packages.tryGet(realPath, { importerContext });\n } catch {\n // Ignore errors and keep looking.\n }\n\n if (realPath && definition) {\n realPathCache[resolvedPath] = realPath;\n return { packagePath: realPath, definition };\n }\n\n if (path.isAbsolute(module)) {\n break;\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 // Exception: in a manager using a store layout, packages starting with @ are NOT scope folders;\n // e.g. @foo/bar will be in a folder like @foo-bar-npm-1.2.3-abcdef1234 or @foo-bar@1.2.3\n if (!isStoreLayout && 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 ((!rootPath || packagePath.length >= rootPath.length) && path.dirname(packagePath) !== packagePath);\n }\n return undefined;\n}\n"]}
1
+ {"version":3,"file":"findPackage.js","sourceRoot":"","sources":["../../src/findFileInPackage/findPackage.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\nimport fs from 'fs';\nimport type {\n ModuleResolutionConfig,\n PackageDefinitionsCache,\n PackageImporterContext,\n PackageJson,\n} from '@ms-cloudpack/common-types';\n\nexport interface FindPackageOptions {\n /**\n * Dependency name as specified in the parent's deps and installed in `node_modules`.\n * (This is usually the actual name, except for renamed non-semver deps.)\n */\n dependencyName: string;\n /** Start searching up from the `node_modules` of this parent folder. */\n startPath: string;\n /** Parent definition, used for self imports. */\n definition: PackageJson;\n /** Context in which `dependencyName` is imported. */\n importerContext?: PackageImporterContext;\n /** Stop searching at this path (usually the git root). Defaults to filesystem root. */\n rootPath: string | undefined;\n /**\n * Cache of realpath results (improves perf, particularly on Windows).\n * As of writing, this is scoped to a `findPackagesFromPath` call.\n * (see https://github.com/microsoft/cloudpack/pull/2184)\n */\n realPathCache?: Record<string, string | undefined>;\n /**\n * Module resolution configuration. Includes settings for custom module directories and\n * dedupe behavior. When `dedupe` is specified, those packages will be resolved from\n * the `appPath` to ensure consistent resolution across the dependency tree.\n */\n moduleResolutionConfig?: ModuleResolutionConfig;\n /**\n * Application path to use for dedupe resolution. If the dependency is in the\n * `moduleResolutionConfig.dedupe` list, resolution will start from here instead of `startPath`.\n */\n appPath: string | undefined;\n}\n\nexport interface FindPackageContext {\n /**\n * Package cache.\n */\n packages: PackageDefinitionsCache;\n}\n\n/**\n * Find the package.json contents for `dependencyName`, searching up under `node_modules` folders\n * starting at `startPath` and ending at `rootPath` (usually the git root) or the filesystem root.\n */\nexport async function findPackage(\n options: FindPackageOptions,\n context: FindPackageContext,\n): Promise<{ packagePath: string; definition: PackageJson } | undefined> {\n const { dependencyName, rootPath, importerContext, realPathCache = {}, moduleResolutionConfig, appPath } = options;\n const { packages } = context;\n\n if (dependencyName == options.definition.name) {\n // Self-import detected, returning parent path and definition\n return { packagePath: options.startPath, definition: options.definition };\n }\n\n // Use appPath for deduped packages to ensure consistent resolution, otherwise use startPath\n const shouldDedupe = moduleResolutionConfig?.dedupe?.includes(dependencyName);\n let startPath: string;\n\n if (shouldDedupe) {\n if (!appPath) {\n throw new Error(`appPath is required when resolving deduped package \"${dependencyName}\"`);\n }\n startPath = appPath;\n } else {\n startPath = options.startPath;\n }\n\n for (const module of moduleResolutionConfig?.modules ?? ['node_modules']) {\n const isAbsolutePath = path.isAbsolute(module);\n let packagePath = isAbsolutePath ? module : startPath;\n const isStoreLayout = /[\\\\/]\\.(pnpm|store)[\\\\/]/.test(packagePath);\n\n do {\n const resolvedPath = isAbsolutePath\n ? path.join(module, dependencyName)\n : path.join(packagePath, module, dependencyName);\n let definition: PackageJson | undefined;\n let realPath: string | undefined;\n\n try {\n // Get the realpath in case of a symlinked layout.\n // realpathSync.native is faster than either realpathSync or realpath.\n // https://github.com/microsoft/cloudpack/pull/2127#discussion_r1607070201\n realPath = realPathCache?.[resolvedPath] || fs.realpathSync.native(resolvedPath);\n definition = await packages.tryGet(realPath, { importerContext });\n } catch {\n // Ignore errors and keep looking.\n }\n\n if (realPath && definition) {\n realPathCache[resolvedPath] = realPath;\n return { packagePath: realPath, definition };\n }\n\n if (path.isAbsolute(module)) {\n break;\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 // Exception: in a manager using a store layout, packages starting with @ are NOT scope folders;\n // e.g. @foo/bar will be in a folder like @foo-bar-npm-1.2.3-abcdef1234 or @foo-bar@1.2.3\n if (!isStoreLayout && 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 ((!rootPath || packagePath.length >= rootPath.length) && path.dirname(packagePath) !== packagePath);\n }\n return undefined;\n}\n"]}
package/lib/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { PackageDefinitions } from './packageDefinitions/PackageDefinitions.js';
2
2
  export { MockPackageDefinitions } from './packageDefinitions/MockPackageDefinitions.js';
3
- export { createResolveMap } from './resolveMap/createResolveMap.js';
3
+ export { createResolveMap, type CreateResolveMapOptions } from './resolveMap/createResolveMap.js';
4
4
  export { createLinkResolveMap } from './resolveMap/createLinkResolveMap.js';
5
5
  export { findResolveMapEntry } from './resolveMap/findResolveMapEntry.js';
6
6
  export type { DiffResolveMapsChanges, DiffResolveMapsStats } from './resolveMap/diffResolveMaps.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AAGxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,YAAY,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAG9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,KAAK,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AACxG,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EACL,iBAAiB,EACjB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,GAC7B,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAG/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AAGxF,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAClG,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,YAAY,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAG9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,KAAK,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AACxG,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EACL,iBAAiB,EACjB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,GAC7B,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAG/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC"}
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AAExF,cAAc;AACd,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAE9E,kCAAkC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAkC,MAAM,oCAAoC,CAAC;AACxG,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,0BAA0B;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EACL,iBAAiB,GAGlB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAE/E,qFAAqF;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC","sourcesContent":["// Package definition parsing\nexport { PackageDefinitions } from './packageDefinitions/PackageDefinitions.js';\nexport { MockPackageDefinitions } from './packageDefinitions/MockPackageDefinitions.js';\n\n// ResolveMaps\nexport { createResolveMap } from './resolveMap/createResolveMap.js';\nexport { createLinkResolveMap } from './resolveMap/createLinkResolveMap.js';\nexport { findResolveMapEntry } from './resolveMap/findResolveMapEntry.js';\nexport type { DiffResolveMapsChanges, DiffResolveMapsStats } from './resolveMap/diffResolveMaps.js';\nexport { diffResolveMaps } from './resolveMap/diffResolveMaps.js';\nexport { ensureResolveMapEntry } from './resolveMap/ensureResolveMapEntry.js';\n\n// ExportsMap parsing and creation\nexport { flattenExportsMap } from './exportsMap/flattenExportsMap.js';\nexport { expandExportsMap } from './exportsMap/expandExportsMap.js';\nexport { addExportsMapEntry, type AddExportsMapEntryOptions } from './exportsMap/addExportsMapEntry.js';\nexport { getExportsMap } from './exportsMap/getExportsMap.js';\nexport { getSourceEntry } from './exportsMap/getSourceEntry.js';\n\n// Other package utilities\nexport { detectModuleType } from './detectModuleType.js';\nexport {\n findFileInPackage,\n type FindFileInPackageOptions,\n type FindFileInPackageResult,\n} from './findFileInPackage/findFileInPackage.js';\nexport { getVersion, getDisplayVersion } from './packageJson/getVersion.js';\nexport { getDependencies } from './packageJson/getDependencies.js';\nexport { getUnusedDependencies } from './packageJson/getUnusedDependencies.js';\n\n// Object utilities which could be moved to a separate package if we add more of them\nexport { mergeArrayDefaults } from './object/mergeArrayDefaults.js';\nexport { mergeObjects } from './object/mergeObjects.js';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AAExF,cAAc;AACd,OAAO,EAAE,gBAAgB,EAAgC,MAAM,kCAAkC,CAAC;AAClG,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAE9E,kCAAkC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAkC,MAAM,oCAAoC,CAAC;AACxG,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,0BAA0B;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EACL,iBAAiB,GAGlB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAE/E,qFAAqF;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC","sourcesContent":["// Package definition parsing\nexport { PackageDefinitions } from './packageDefinitions/PackageDefinitions.js';\nexport { MockPackageDefinitions } from './packageDefinitions/MockPackageDefinitions.js';\n\n// ResolveMaps\nexport { createResolveMap, type CreateResolveMapOptions } from './resolveMap/createResolveMap.js';\nexport { createLinkResolveMap } from './resolveMap/createLinkResolveMap.js';\nexport { findResolveMapEntry } from './resolveMap/findResolveMapEntry.js';\nexport type { DiffResolveMapsChanges, DiffResolveMapsStats } from './resolveMap/diffResolveMaps.js';\nexport { diffResolveMaps } from './resolveMap/diffResolveMaps.js';\nexport { ensureResolveMapEntry } from './resolveMap/ensureResolveMapEntry.js';\n\n// ExportsMap parsing and creation\nexport { flattenExportsMap } from './exportsMap/flattenExportsMap.js';\nexport { expandExportsMap } from './exportsMap/expandExportsMap.js';\nexport { addExportsMapEntry, type AddExportsMapEntryOptions } from './exportsMap/addExportsMapEntry.js';\nexport { getExportsMap } from './exportsMap/getExportsMap.js';\nexport { getSourceEntry } from './exportsMap/getSourceEntry.js';\n\n// Other package utilities\nexport { detectModuleType } from './detectModuleType.js';\nexport {\n findFileInPackage,\n type FindFileInPackageOptions,\n type FindFileInPackageResult,\n} from './findFileInPackage/findFileInPackage.js';\nexport { getVersion, getDisplayVersion } from './packageJson/getVersion.js';\nexport { getDependencies } from './packageJson/getDependencies.js';\nexport { getUnusedDependencies } from './packageJson/getUnusedDependencies.js';\n\n// Object utilities which could be moved to a separate package if we add more of them\nexport { mergeArrayDefaults } from './object/mergeArrayDefaults.js';\nexport { mergeObjects } from './object/mergeObjects.js';\n"]}
@@ -1,17 +1,14 @@
1
- import type { ModuleResolutionConfig, PackageDefinitionsCache } from '@ms-cloudpack/common-types';
1
+ import { type FindPackageContext, type FindPackageOptions } from '../../findFileInPackage/findPackage.js';
2
2
  import type { PackageMap } from './types/PackageMap.js';
3
- /**
4
- * Find all packages from a given path. We do this by walking the dependency tree
5
- * of the app to build a map of all packages and their dependencies.
6
- */
7
- export declare function findPackagesFromPath(options: {
3
+ export interface FindPackagesFromPathOptions extends Pick<FindPackageOptions, 'moduleResolutionConfig' | 'appPath'> {
8
4
  /**
9
5
  * Paths to search for package.json files and traverse their dependencies to build a PackageMap.
10
6
  */
11
7
  searchPaths: string[];
12
8
  /**
13
- * Where to stop looking for dependency packages. This should be calculated by the caller
14
- * (defaulting to the project/git root) or can be manually set for testing.
9
+ * Where to stop looking for dependency packages. Defaults to the project/git root, but it's
10
+ * recommended that the caller pre-calculate it for efficiency (`createResolveMap` handles this),
11
+ * or it can be overridden for testing.
15
12
  *
16
13
  * If `skipResolveDependencies` is true, this won't be used and can be undefined.
17
14
  */
@@ -22,24 +19,23 @@ export declare function findPackagesFromPath(options: {
22
19
  discoverPackages?: boolean;
23
20
  /**
24
21
  * Skip the actual resolution of dependencies. The returned package map will only contain
25
- * the package(s) from the given path(s). Not compatible with `discoverPackages`.
22
+ * the package(s) from the given path(s).
23
+ *
24
+ * Not compatible with `discoverPackages` (or the `createResolveMap` option `linkedPaths`).
26
25
  */
27
26
  skipResolveDependencies?: boolean;
28
27
  /**
29
- * Module resolution configuration. Includes settings for custom module directories and
30
- * dedupe behavior. When `dedupe` is specified, those packages will be resolved from
31
- * the `appPath` to ensure consistent resolution across the dependency tree.
32
- */
33
- moduleResolutionConfig?: ModuleResolutionConfig;
34
- /**
35
- * Application path to use for dedupe resolution. Required when `moduleResolutionConfig.dedupe`
36
- * is configured.
37
- */
38
- appPath?: string;
39
- }, context: {
40
- /**
41
- * Package cache.
28
+ * Only resolve the given dependencies (and their dependencies without filtering).
29
+ * The returned resolve map will only contain the package at `appPath` plus these deps.
30
+ *
31
+ * This only works with a single `searchPaths` entry, and doesn't support `discoverPackages`
32
+ * (or the `createResolveMap` options `linkedPaths` or `additionalPaths`).
42
33
  */
43
- packages: PackageDefinitionsCache;
44
- }): Promise<PackageMap>;
34
+ onlyResolveDependencies?: string[];
35
+ }
36
+ /**
37
+ * Find all packages from a given path. We do this by walking the dependency tree
38
+ * of the app to build a map of all packages and their dependencies.
39
+ */
40
+ export declare function findPackagesFromPath(options: FindPackagesFromPathOptions, context: FindPackageContext): Promise<PackageMap>;
45
41
  //# sourceMappingURL=findPackagesFromPath.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"findPackagesFromPath.d.ts","sourceRoot":"","sources":["../../../src/resolveMap/createHelpers/findPackagesFromPath.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EAIxB,MAAM,4BAA4B,CAAC;AAOpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAIxD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE;IACP;;OAEG;IACH,WAAW,EAAE,MAAM,EAAE,CAAC;IAEtB;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7B;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;IAEhD;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,EACD,OAAO,EAAE;IACP;;OAEG;IACH,QAAQ,EAAE,uBAAuB,CAAC;CACnC,GACA,OAAO,CAAC,UAAU,CAAC,CAoErB"}
1
+ {"version":3,"file":"findPackagesFromPath.d.ts","sourceRoot":"","sources":["../../../src/resolveMap/createHelpers/findPackagesFromPath.ts"],"names":[],"mappings":"AAKA,OAAO,EAAe,KAAK,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAEvH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAIxD,MAAM,WAAW,2BAA4B,SAAQ,IAAI,CAAC,kBAAkB,EAAE,wBAAwB,GAAG,SAAS,CAAC;IACjH;;OAEG;IACH,WAAW,EAAE,MAAM,EAAE,CAAC;IAEtB;;;;;;OAMG;IAEH,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7B;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;;;OAKG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC;;;;;;OAMG;IACH,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;CACpC;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,2BAA2B,EACpC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,UAAU,CAAC,CA4ErB"}
@@ -1,4 +1,4 @@
1
- import { isExternalPackage, isFolder } from '@ms-cloudpack/path-utilities';
1
+ import { isExternalPackage, isFolderSync } from '@ms-cloudpack/path-utilities';
2
2
  import { bulletedList } from '@ms-cloudpack/task-reporter';
3
3
  import { glob } from 'tinyglobby';
4
4
  import path from 'path';
@@ -9,18 +9,26 @@ import { getDependencies } from '../../packageJson/getDependencies.js';
9
9
  * of the app to build a map of all packages and their dependencies.
10
10
  */
11
11
  export async function findPackagesFromPath(options, context) {
12
- const { searchPaths, discoverPackages, skipResolveDependencies, rootPath, moduleResolutionConfig, appPath } = options;
12
+ const { searchPaths, discoverPackages, ...otherOptions } = options;
13
13
  const packageMap = {};
14
14
  const visitedPaths = new Set();
15
- const realPathCache = {};
16
- if (discoverPackages && skipResolveDependencies) {
17
- throw new Error('Cannot use `discoverPackages` with `skipResolveDependencies`');
15
+ const visitOptions = {
16
+ ...otherOptions,
17
+ packageMap,
18
+ realPathCache: {},
19
+ };
20
+ if (discoverPackages && (options.skipResolveDependencies || options.onlyResolveDependencies)) {
21
+ throw new Error('Cannot use `discoverPackages` with `skipResolveDependencies` or `onlyResolveDependencies`');
22
+ }
23
+ if (options.onlyResolveDependencies && searchPaths.length !== 1) {
24
+ throw new Error('`onlyResolveDependencies` can only be used with a single `searchPaths` entry');
18
25
  }
19
- if (moduleResolutionConfig?.dedupe && moduleResolutionConfig.dedupe.length > 0 && !appPath) {
26
+ if (options.moduleResolutionConfig?.dedupe?.length && !options.appPath) {
20
27
  throw new Error('appPath is required when moduleResolutionConfig.dedupe is configured');
21
28
  }
29
+ let isFirstPackage = true;
22
30
  for (const searchPath of searchPaths) {
23
- if (!(await isFolder(searchPath))) {
31
+ if (!isFolderSync(searchPath)) {
24
32
  throw new Error(`Path ${searchPath} is not a folder. Make sure the path exists and try again.`);
25
33
  }
26
34
  let pathsToVisit;
@@ -34,6 +42,9 @@ export async function findPackagesFromPath(options, context) {
34
42
  while (pathsToVisit.length) {
35
43
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- already checked length
36
44
  const { packagePath, importerContext } = pathsToVisit.shift();
45
+ // The specific list of dependencies only applies to the first package visited.
46
+ const onlyResolveDependencies = isFirstPackage ? options.onlyResolveDependencies : undefined;
47
+ isFirstPackage = false;
37
48
  // There's a very slight possibility (not yet observed even in large repos) that both semver
38
49
  // and non-semver dependencies could resolve to the same package name and version and therefore
39
50
  // be installed at the same path. (If the non-semver dependency was encountered first, the
@@ -45,13 +56,9 @@ export async function findPackagesFromPath(options, context) {
45
56
  visitedPaths.add(packagePath);
46
57
  const dependencyPaths = await visitPackage({
47
58
  packagePath,
48
- packageMap,
49
- rootPath,
50
- appPath,
51
59
  importerContext,
52
- realPathCache,
53
- skipResolveDependencies,
54
- moduleResolutionConfig,
60
+ ...visitOptions,
61
+ onlyResolveDependencies, // override this option
55
62
  }, context);
56
63
  for (const dependencyPath of dependencyPaths) {
57
64
  // Let's avoid pushing tons of things into the work queue that we'll be skipping later.
@@ -69,7 +76,7 @@ export async function findPackagesFromPath(options, context) {
69
76
  * Returns a list of additional dependency paths to visit.
70
77
  */
71
78
  async function visitPackage(options, context) {
72
- const { packagePath, packageMap, rootPath, appPath, importerContext, realPathCache, skipResolveDependencies, moduleResolutionConfig, } = options;
79
+ const { packagePath, packageMap, rootPath, appPath, importerContext, realPathCache, skipResolveDependencies, onlyResolveDependencies, moduleResolutionConfig, } = options;
73
80
  const { packages } = context;
74
81
  const packageDefinition = await packages.get(packagePath, { importerContext });
75
82
  const { name, version } = packageDefinition;
@@ -79,11 +86,19 @@ async function visitPackage(options, context) {
79
86
  packageMap,
80
87
  definition: packageDefinition,
81
88
  });
82
- if (skipResolveDependencies) {
89
+ if (skipResolveDependencies || (onlyResolveDependencies && !onlyResolveDependencies.length)) {
83
90
  return [];
84
91
  }
85
92
  // Add all dependencies to the list of paths to visit.
86
93
  const dependencies = getDependencies(packageDefinition);
94
+ if (onlyResolveDependencies?.length) {
95
+ // Filter to only the requested dependencies.
96
+ for (const key of Object.keys(dependencies)) {
97
+ if (!onlyResolveDependencies.includes(key)) {
98
+ delete dependencies[key];
99
+ }
100
+ }
101
+ }
87
102
  const dependencyPaths = [];
88
103
  for (const [dependencyName, versionRequirement] of Object.entries(dependencies)) {
89
104
  const depImporterContext = {
@@ -1 +1 @@
1
- {"version":3,"file":"findPackagesFromPath.js","sourceRoot":"","sources":["../../../src/resolveMap/createHelpers/findPackagesFromPath.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ModuleResolutionConfig,\n PackageDefinitionsCache,\n PackageImporterContext,\n PackageJson,\n ResolveMapEntry,\n} from '@ms-cloudpack/common-types';\nimport { isExternalPackage, isFolder } from '@ms-cloudpack/path-utilities';\nimport { bulletedList } from '@ms-cloudpack/task-reporter';\nimport { glob } from 'tinyglobby';\nimport path from 'path';\nimport { findPackage } from '../../findFileInPackage/findPackage.js';\nimport { getDependencies } from '../../packageJson/getDependencies.js';\nimport type { PackageMap } from './types/PackageMap.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 dependency packages. This should be calculated by the caller\n * (defaulting to the project/git root) or can be manually set for testing.\n *\n * If `skipResolveDependencies` is true, this won't be used and can be undefined.\n */\n rootPath: string | undefined;\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 /**\n * Skip the actual resolution of dependencies. The returned package map will only contain\n * the package(s) from the given path(s). Not compatible with `discoverPackages`.\n */\n skipResolveDependencies?: boolean;\n\n /**\n * Module resolution configuration. Includes settings for custom module directories and\n * dedupe behavior. When `dedupe` is specified, those packages will be resolved from\n * the `appPath` to ensure consistent resolution across the dependency tree.\n */\n moduleResolutionConfig?: ModuleResolutionConfig;\n\n /**\n * Application path to use for dedupe resolution. Required when `moduleResolutionConfig.dedupe`\n * is configured.\n */\n appPath?: string;\n },\n context: {\n /**\n * Package cache.\n */\n packages: PackageDefinitionsCache;\n },\n): Promise<PackageMap> {\n const { searchPaths, discoverPackages, skipResolveDependencies, rootPath, moduleResolutionConfig, appPath } = options;\n const packageMap: PackageMap = {};\n const visitedPaths = new Set<string>();\n const realPathCache: Record<string, string | undefined> = {};\n\n if (discoverPackages && skipResolveDependencies) {\n throw new Error('Cannot use `discoverPackages` with `skipResolveDependencies`');\n }\n\n if (moduleResolutionConfig?.dedupe && moduleResolutionConfig.dedupe.length > 0 && !appPath) {\n throw new Error('appPath is required when moduleResolutionConfig.dedupe is configured');\n }\n\n for (const searchPath of searchPaths) {\n if (!(await isFolder(searchPath))) {\n throw new Error(`Path ${searchPath} is not a folder. Make sure the path exists and try again.`);\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(\n {\n packagePath,\n packageMap,\n rootPath,\n appPath,\n importerContext,\n realPathCache,\n skipResolveDependencies,\n moduleResolutionConfig,\n },\n context,\n );\n\n for (const dependencyPath of dependencyPaths) {\n // Let's avoid pushing tons of things into the work queue that we'll be skipping later.\n if (!visitedPaths.has(dependencyPath.packagePath)) {\n pathsToVisit.push(dependencyPath);\n }\n }\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 rootPath: string | undefined;\n appPath: string | undefined;\n realPathCache?: Record<string, string | undefined>;\n skipResolveDependencies: boolean | undefined;\n moduleResolutionConfig?: ModuleResolutionConfig;\n },\n context: Parameters<typeof findPackagesFromPath>[1],\n): Promise<PackagePathInfo[]> {\n const {\n packagePath,\n packageMap,\n rootPath,\n appPath,\n importerContext,\n realPathCache,\n skipResolveDependencies,\n moduleResolutionConfig,\n } = options;\n const { packages } = context;\n\n const packageDefinition = await packages.get(packagePath, { importerContext });\n\n const { name, version } = packageDefinition;\n const entry = ensurePackageEntry({\n packageName: importerContext?.importedName || name,\n packagePath: packagePath,\n packageMap,\n definition: packageDefinition,\n });\n\n if (skipResolveDependencies) {\n return [];\n }\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 {\n definition: packageDefinition,\n dependencyName,\n startPath: packagePath,\n rootPath,\n importerContext: depImporterContext,\n realPathCache,\n moduleResolutionConfig,\n appPath,\n },\n context,\n );\n\n if (!dependencyPackage) {\n if (packageDefinition.peerDependencies?.[dependencyName] !== undefined) {\n // Ignore missing peer dependencies\n console.debug(`Ignoring missing peer dependency \"${dependencyName}\" required by \"${name}@${version}\"`);\n continue;\n }\n\n throw new Error(\n [\n `A dependency could not be found:`,\n bulletedList([\n `Dependency: ${dependencyName} (Required: ${versionRequirement})`,\n `Required by: ${packagePath}`,\n ]),\n ``,\n `Make sure the dependency is installed and try again.`,\n ].join('\\n'),\n );\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 packageName: dependencyName,\n packageMap,\n definition: dependencyDefinition,\n });\n\n entry.dependencies[dependencyName] = 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 packageName: string;\n packageMap: PackageMap;\n definition: PackageJson;\n}): ResolveMapEntry {\n const { packagePath = '', packageName: name, packageMap, definition } = options;\n const { 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/resolveMap/createHelpers/findPackagesFromPath.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PackageImporterContext, PackageJson, ResolveMapEntry } from '@ms-cloudpack/common-types';\nimport { isExternalPackage, isFolderSync } from '@ms-cloudpack/path-utilities';\nimport { bulletedList } from '@ms-cloudpack/task-reporter';\nimport { glob } from 'tinyglobby';\nimport path from 'path';\nimport { findPackage, type FindPackageContext, type FindPackageOptions } from '../../findFileInPackage/findPackage.js';\nimport { getDependencies } from '../../packageJson/getDependencies.js';\nimport type { PackageMap } from './types/PackageMap.js';\n\ntype PackagePathInfo = { packagePath: string; importerContext?: PackageImporterContext };\n\nexport interface FindPackagesFromPathOptions extends Pick<FindPackageOptions, 'moduleResolutionConfig' | 'appPath'> {\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 dependency packages. Defaults to the project/git root, but it's\n * recommended that the caller pre-calculate it for efficiency (`createResolveMap` handles this),\n * or it can be overridden for testing.\n *\n * If `skipResolveDependencies` is true, this won't be used and can be undefined.\n */\n // The comment about the default here needs to be different from FindPackageOptions\n rootPath: string | undefined;\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 /**\n * Skip the actual resolution of dependencies. The returned package map will only contain\n * the package(s) from the given path(s).\n *\n * Not compatible with `discoverPackages` (or the `createResolveMap` option `linkedPaths`).\n */\n skipResolveDependencies?: boolean;\n\n /**\n * Only resolve the given dependencies (and their dependencies without filtering).\n * The returned resolve map will only contain the package at `appPath` plus these deps.\n *\n * This only works with a single `searchPaths` entry, and doesn't support `discoverPackages`\n * (or the `createResolveMap` options `linkedPaths` or `additionalPaths`).\n */\n onlyResolveDependencies?: string[];\n}\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: FindPackagesFromPathOptions,\n context: FindPackageContext,\n): Promise<PackageMap> {\n const { searchPaths, discoverPackages, ...otherOptions } = options;\n const packageMap: PackageMap = {};\n const visitedPaths = new Set<string>();\n const visitOptions: ReusedVisitOptions = {\n ...otherOptions,\n packageMap,\n realPathCache: {},\n };\n\n if (discoverPackages && (options.skipResolveDependencies || options.onlyResolveDependencies)) {\n throw new Error('Cannot use `discoverPackages` with `skipResolveDependencies` or `onlyResolveDependencies`');\n }\n if (options.onlyResolveDependencies && searchPaths.length !== 1) {\n throw new Error('`onlyResolveDependencies` can only be used with a single `searchPaths` entry');\n }\n if (options.moduleResolutionConfig?.dedupe?.length && !options.appPath) {\n throw new Error('appPath is required when moduleResolutionConfig.dedupe is configured');\n }\n\n let isFirstPackage = true;\n\n for (const searchPath of searchPaths) {\n if (!isFolderSync(searchPath)) {\n throw new Error(`Path ${searchPath} is not a folder. Make sure the path exists and try again.`);\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 // The specific list of dependencies only applies to the first package visited.\n const onlyResolveDependencies = isFirstPackage ? options.onlyResolveDependencies : undefined;\n isFirstPackage = false;\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(\n {\n packagePath,\n importerContext,\n ...visitOptions,\n onlyResolveDependencies, // override this option\n },\n context,\n );\n\n for (const dependencyPath of dependencyPaths) {\n // Let's avoid pushing tons of things into the work queue that we'll be skipping later.\n if (!visitedPaths.has(dependencyPath.packagePath)) {\n pathsToVisit.push(dependencyPath);\n }\n }\n }\n }\n }\n\n return packageMap;\n}\n\n/** Non-package-specific visit options */\ntype ReusedVisitOptions = Pick<\n FindPackagesFromPathOptions,\n 'rootPath' | 'appPath' | 'skipResolveDependencies' | 'onlyResolveDependencies' | 'moduleResolutionConfig'\n> & {\n packageMap: PackageMap;\n realPathCache: Record<string, string | undefined>;\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 & ReusedVisitOptions,\n context: Parameters<typeof findPackagesFromPath>[1],\n): Promise<PackagePathInfo[]> {\n const {\n packagePath,\n packageMap,\n rootPath,\n appPath,\n importerContext,\n realPathCache,\n skipResolveDependencies,\n onlyResolveDependencies,\n moduleResolutionConfig,\n } = options;\n const { packages } = context;\n\n const packageDefinition = await packages.get(packagePath, { importerContext });\n\n const { name, version } = packageDefinition;\n const entry = ensurePackageEntry({\n packageName: importerContext?.importedName || name,\n packagePath: packagePath,\n packageMap,\n definition: packageDefinition,\n });\n\n if (skipResolveDependencies || (onlyResolveDependencies && !onlyResolveDependencies.length)) {\n return [];\n }\n\n // Add all dependencies to the list of paths to visit.\n const dependencies = getDependencies(packageDefinition) as Record<string, string>;\n\n if (onlyResolveDependencies?.length) {\n // Filter to only the requested dependencies.\n for (const key of Object.keys(dependencies)) {\n if (!onlyResolveDependencies.includes(key)) {\n delete dependencies[key];\n }\n }\n }\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 {\n definition: packageDefinition,\n dependencyName,\n startPath: packagePath,\n rootPath,\n importerContext: depImporterContext,\n realPathCache,\n moduleResolutionConfig,\n appPath,\n },\n context,\n );\n\n if (!dependencyPackage) {\n if (packageDefinition.peerDependencies?.[dependencyName] !== undefined) {\n // Ignore missing peer dependencies\n console.debug(`Ignoring missing peer dependency \"${dependencyName}\" required by \"${name}@${version}\"`);\n continue;\n }\n\n throw new Error(\n [\n `A dependency could not be found:`,\n bulletedList([\n `Dependency: ${dependencyName} (Required: ${versionRequirement})`,\n `Required by: ${packagePath}`,\n ]),\n ``,\n `Make sure the dependency is installed and try again.`,\n ].join('\\n'),\n );\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 packageName: dependencyName,\n packageMap,\n definition: dependencyDefinition,\n });\n\n entry.dependencies[dependencyName] = 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 packageName: string;\n packageMap: PackageMap;\n definition: PackageJson;\n}): ResolveMapEntry {\n const { packagePath = '', packageName: name, packageMap, definition } = options;\n const { 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,4 +1,14 @@
1
- import type { LinkedPath, ModuleResolutionConfig, PackageDefinitionsCache, ResolveMap } from '@ms-cloudpack/common-types';
1
+ import type { LinkedPath, ResolveMap } from '@ms-cloudpack/common-types';
2
+ import { type FindPackagesFromPathOptions } from './createHelpers/findPackagesFromPath.js';
3
+ import type { FindPackageContext } from '../findFileInPackage/findPackage.js';
4
+ export interface CreateResolveMapOptions extends Pick<FindPackagesFromPathOptions, 'skipResolveDependencies' | 'onlyResolveDependencies' | 'moduleResolutionConfig'>, Partial<Pick<FindPackagesFromPathOptions, 'rootPath'>> {
5
+ /** Path to the app whose dependencies we want to resolve. */
6
+ appPath: string;
7
+ /** Any additional packages whose dependencies we want to resolve. */
8
+ additionalPaths?: string[];
9
+ /** See `createResolveMap` comment. */
10
+ linkedPaths?: LinkedPath[];
11
+ }
2
12
  /**
3
13
  * Create a resolve map for a given `appPath`.
4
14
  * 1. Walk the dependency tree to build a map of all packages and their dependencies.
@@ -10,25 +20,5 @@ import type { LinkedPath, ModuleResolutionConfig, PackageDefinitionsCache, Resol
10
20
  * 3. For each dependency, sort the versions by the number of packages that depend on that version.
11
21
  * The most popular version will be considered the "default", to reduce the size of scoped versions.
12
22
  */
13
- export declare function createResolveMap(options: {
14
- /** Path to the app whose dependencies we want to resolve. */
15
- appPath: string;
16
- /** Any additional packages whose dependencies we want to resolve. */
17
- additionalPaths?: string[];
18
- /** See `createResolveMap` comment. */
19
- linkedPaths?: LinkedPath[];
20
- /**
21
- * Where to stop looking for packages (mainly used for testing).
22
- * If not specified, will look for the project/git root of the `appPath`.
23
- */
24
- rootPath?: string;
25
- /**
26
- * Skip the actual resolution of dependencies. The returned resolve map will only contain
27
- * the package(s) from the given path(s). Not compatible with `linkedPaths`.
28
- */
29
- skipResolveDependencies?: boolean;
30
- moduleResolutionConfig?: ModuleResolutionConfig;
31
- }, context: {
32
- packages: PackageDefinitionsCache;
33
- }): Promise<ResolveMap>;
23
+ export declare function createResolveMap(options: CreateResolveMapOptions, context: FindPackageContext): Promise<ResolveMap>;
34
24
  //# sourceMappingURL=createResolveMap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createResolveMap.d.ts","sourceRoot":"","sources":["../../src/resolveMap/createResolveMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,sBAAsB,EACtB,uBAAuB,EACvB,UAAU,EACX,MAAM,4BAA4B,CAAC;AAMpC;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE;IACP,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAEhB,qEAAqE;IACrE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAE3B,sCAAsC;IACtC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAE3B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;CACjD,EACD,OAAO,EAAE;IACP,QAAQ,EAAE,uBAAuB,CAAC;CACnC,GACA,OAAO,CAAC,UAAU,CAAC,CAqCrB"}
1
+ {"version":3,"file":"createResolveMap.d.ts","sourceRoot":"","sources":["../../src/resolveMap/createResolveMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAGzE,OAAO,EAAwB,KAAK,2BAA2B,EAAE,MAAM,yCAAyC,CAAC;AAEjH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAE9E,MAAM,WAAW,uBACf,SAAQ,IAAI,CACR,2BAA2B,EAC3B,yBAAyB,GAAG,yBAAyB,GAAG,wBAAwB,CACjF,EACD,OAAO,CAAC,IAAI,CAAC,2BAA2B,EAAE,UAAU,CAAC,CAAC;IACxD,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAEhB,qEAAqE;IACrE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAE3B,sCAAsC;IACtC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,uBAAuB,EAChC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,UAAU,CAAC,CAmDrB"}
@@ -14,9 +14,16 @@ import { linkPath } from './createHelpers/link/linkPath.js';
14
14
  * The most popular version will be considered the "default", to reduce the size of scoped versions.
15
15
  */
16
16
  export async function createResolveMap(options, context) {
17
- const { appPath, additionalPaths = [], linkedPaths = [], skipResolveDependencies, moduleResolutionConfig } = options;
18
- if (skipResolveDependencies && linkedPaths.length) {
19
- throw new Error('Cannot use `linkedPaths` with `skipResolveDependencies`');
17
+ const { appPath, additionalPaths = [], linkedPaths = [], onlyResolveDependencies,
18
+ // If onlyResolveDependencies is empty, skip resolution entirely for efficiency.
19
+ // This is the most common case when bundling a single package (inlinedDependencies must be
20
+ // included if present, but most packages don't have any).
21
+ skipResolveDependencies = onlyResolveDependencies?.length === 0, moduleResolutionConfig, } = options;
22
+ if ((skipResolveDependencies || onlyResolveDependencies) && linkedPaths.length) {
23
+ throw new Error('Cannot use `linkedPaths` with `skipResolveDependencies` or `onlyResolveDependencies`');
24
+ }
25
+ if (onlyResolveDependencies && additionalPaths.length) {
26
+ throw new Error('Cannot use `additionalPaths` with `onlyResolveDependencies`');
20
27
  }
21
28
  // rootPath is only used as the place to stop searching up for dependencies, so we can skip the
22
29
  // calculation if we're not resolving dependencies.
@@ -28,6 +35,7 @@ export async function createResolveMap(options, context) {
28
35
  const appMap = await findPackagesFromPath({
29
36
  searchPaths: [appPath, ...additionalPaths],
30
37
  rootPath,
38
+ onlyResolveDependencies,
31
39
  skipResolveDependencies,
32
40
  moduleResolutionConfig,
33
41
  appPath,
@@ -1 +1 @@
1
- {"version":3,"file":"createResolveMap.js","sourceRoot":"","sources":["../../src/resolveMap/createResolveMap.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAE5D;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAuBC,EACD,OAEC;IAED,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,EAAE,EAAE,WAAW,GAAG,EAAE,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC;IAErH,IAAI,uBAAuB,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IAED,+FAA+F;IAC/F,mDAAmD;IACnD,MAAM,QAAQ,GAAG,uBAAuB;QACtC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,eAAe,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1E,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEtF,kDAAkD;IAClD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CACvC;QACE,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,eAAe,CAAC;QAC1C,QAAQ;QACR,uBAAuB;QACvB,sBAAsB;QACtB,OAAO;KACR,EACD,OAAO,CACR,CAAC;IAEF,4EAA4E;IAC5E,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,QAAQ,CACZ,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,EAAE,cAAc,EAAE,sBAAsB,EAAE,EACxG,OAAO,CACR,CAAC;IACJ,CAAC;IAED,0CAA0C;IAC1C,OAAO,mBAAmB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,OAAO,EAAE,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;AACnF,CAAC","sourcesContent":["import type {\n LinkedPath,\n ModuleResolutionConfig,\n PackageDefinitionsCache,\n ResolveMap,\n} from '@ms-cloudpack/common-types';\nimport { findProjectRoot } from '@ms-cloudpack/path-utilities';\nimport { convertToResolveMap } from './createHelpers/convertToResolveMap.js';\nimport { findPackagesFromPath } from './createHelpers/findPackagesFromPath.js';\nimport { linkPath } from './createHelpers/link/linkPath.js';\n\n/**\n * Create a resolve map for a given `appPath`.\n * 1. Walk the dependency tree to build a map of all packages and their dependencies.\n * 2. If `linkedPaths` are provided, for each one:\n * 1. Walk its dependency tree to build a map as above.\n * 2. Redirect any existing dependencies to the linked package.\n * 3. Ensure that any transitive dependencies of the linked package which aren't already\n * satisfied in the resolve map are added as scoped versions.\n * 3. For each dependency, sort the versions by the number of packages that depend on that version.\n * The most popular version will be considered the \"default\", to reduce the size of scoped versions.\n */\nexport async function createResolveMap(\n options: {\n /** Path to the app whose dependencies we want to resolve. */\n appPath: string;\n\n /** Any additional packages whose dependencies we want to resolve. */\n additionalPaths?: string[];\n\n /** See `createResolveMap` comment. */\n linkedPaths?: LinkedPath[];\n\n /**\n * Where to stop looking for packages (mainly used for testing).\n * If not specified, will look for the project/git root of the `appPath`.\n */\n rootPath?: string;\n\n /**\n * Skip the actual resolution of dependencies. The returned resolve map will only contain\n * the package(s) from the given path(s). Not compatible with `linkedPaths`.\n */\n skipResolveDependencies?: boolean;\n\n moduleResolutionConfig?: ModuleResolutionConfig;\n },\n context: {\n packages: PackageDefinitionsCache;\n },\n): Promise<ResolveMap> {\n const { appPath, additionalPaths = [], linkedPaths = [], skipResolveDependencies, moduleResolutionConfig } = options;\n\n if (skipResolveDependencies && linkedPaths.length) {\n throw new Error('Cannot use `linkedPaths` with `skipResolveDependencies`');\n }\n\n // rootPath is only used as the place to stop searching up for dependencies, so we can skip the\n // calculation if we're not resolving dependencies.\n const rootPath = skipResolveDependencies\n ? undefined\n : options.rootPath || findProjectRoot(appPath, { noPackageRoot: true });\n\n const repoDefinition = rootPath ? await context.packages.tryGet(rootPath) : undefined;\n\n // First we discover the dependencies for the app.\n const appMap = await findPackagesFromPath(\n {\n searchPaths: [appPath, ...additionalPaths],\n rootPath,\n skipResolveDependencies,\n moduleResolutionConfig,\n appPath,\n },\n context,\n );\n\n // Next, we iterate through linked paths to inject them into the packageMap.\n for (const linkedPath of linkedPaths) {\n await linkPath(\n { linkedPath, appRootPath: rootPath, appMap, appRepoDefinition: repoDefinition, moduleResolutionConfig },\n context,\n );\n }\n\n // Finally we condense into a resolve map.\n return convertToResolveMap({ appMap, rootPaths: [appPath, ...additionalPaths] });\n}\n"]}
1
+ {"version":3,"file":"createResolveMap.js","sourceRoot":"","sources":["../../src/resolveMap/createResolveMap.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAoC,MAAM,yCAAyC,CAAC;AACjH,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAmB5D;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAgC,EAChC,OAA2B;IAE3B,MAAM,EACJ,OAAO,EACP,eAAe,GAAG,EAAE,EACpB,WAAW,GAAG,EAAE,EAChB,uBAAuB;IACvB,gFAAgF;IAChF,2FAA2F;IAC3F,0DAA0D;IAC1D,uBAAuB,GAAG,uBAAuB,EAAE,MAAM,KAAK,CAAC,EAC/D,sBAAsB,GACvB,GAAG,OAAO,CAAC;IAEZ,IAAI,CAAC,uBAAuB,IAAI,uBAAuB,CAAC,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;QAC/E,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAC;IAC1G,CAAC;IACD,IAAI,uBAAuB,IAAI,eAAe,CAAC,MAAM,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IAED,+FAA+F;IAC/F,mDAAmD;IACnD,MAAM,QAAQ,GAAG,uBAAuB;QACtC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,eAAe,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1E,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEtF,kDAAkD;IAClD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CACvC;QACE,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,eAAe,CAAC;QAC1C,QAAQ;QACR,uBAAuB;QACvB,uBAAuB;QACvB,sBAAsB;QACtB,OAAO;KACR,EACD,OAAO,CACR,CAAC;IAEF,4EAA4E;IAC5E,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,QAAQ,CACZ,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,EAAE,cAAc,EAAE,sBAAsB,EAAE,EACxG,OAAO,CACR,CAAC;IACJ,CAAC;IAED,0CAA0C;IAC1C,OAAO,mBAAmB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,OAAO,EAAE,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;AACnF,CAAC","sourcesContent":["import type { LinkedPath, ResolveMap } from '@ms-cloudpack/common-types';\nimport { findProjectRoot } from '@ms-cloudpack/path-utilities';\nimport { convertToResolveMap } from './createHelpers/convertToResolveMap.js';\nimport { findPackagesFromPath, type FindPackagesFromPathOptions } from './createHelpers/findPackagesFromPath.js';\nimport { linkPath } from './createHelpers/link/linkPath.js';\nimport type { FindPackageContext } from '../findFileInPackage/findPackage.js';\n\nexport interface CreateResolveMapOptions\n extends Pick<\n FindPackagesFromPathOptions,\n 'skipResolveDependencies' | 'onlyResolveDependencies' | 'moduleResolutionConfig'\n >,\n Partial<Pick<FindPackagesFromPathOptions, 'rootPath'>> {\n /** Path to the app whose dependencies we want to resolve. */\n appPath: string;\n\n /** Any additional packages whose dependencies we want to resolve. */\n additionalPaths?: string[];\n\n /** See `createResolveMap` comment. */\n linkedPaths?: LinkedPath[];\n}\n\n/**\n * Create a resolve map for a given `appPath`.\n * 1. Walk the dependency tree to build a map of all packages and their dependencies.\n * 2. If `linkedPaths` are provided, for each one:\n * 1. Walk its dependency tree to build a map as above.\n * 2. Redirect any existing dependencies to the linked package.\n * 3. Ensure that any transitive dependencies of the linked package which aren't already\n * satisfied in the resolve map are added as scoped versions.\n * 3. For each dependency, sort the versions by the number of packages that depend on that version.\n * The most popular version will be considered the \"default\", to reduce the size of scoped versions.\n */\nexport async function createResolveMap(\n options: CreateResolveMapOptions,\n context: FindPackageContext,\n): Promise<ResolveMap> {\n const {\n appPath,\n additionalPaths = [],\n linkedPaths = [],\n onlyResolveDependencies,\n // If onlyResolveDependencies is empty, skip resolution entirely for efficiency.\n // This is the most common case when bundling a single package (inlinedDependencies must be\n // included if present, but most packages don't have any).\n skipResolveDependencies = onlyResolveDependencies?.length === 0,\n moduleResolutionConfig,\n } = options;\n\n if ((skipResolveDependencies || onlyResolveDependencies) && linkedPaths.length) {\n throw new Error('Cannot use `linkedPaths` with `skipResolveDependencies` or `onlyResolveDependencies`');\n }\n if (onlyResolveDependencies && additionalPaths.length) {\n throw new Error('Cannot use `additionalPaths` with `onlyResolveDependencies`');\n }\n\n // rootPath is only used as the place to stop searching up for dependencies, so we can skip the\n // calculation if we're not resolving dependencies.\n const rootPath = skipResolveDependencies\n ? undefined\n : options.rootPath || findProjectRoot(appPath, { noPackageRoot: true });\n\n const repoDefinition = rootPath ? await context.packages.tryGet(rootPath) : undefined;\n\n // First we discover the dependencies for the app.\n const appMap = await findPackagesFromPath(\n {\n searchPaths: [appPath, ...additionalPaths],\n rootPath,\n onlyResolveDependencies,\n skipResolveDependencies,\n moduleResolutionConfig,\n appPath,\n },\n context,\n );\n\n // Next, we iterate through linked paths to inject them into the packageMap.\n for (const linkedPath of linkedPaths) {\n await linkPath(\n { linkedPath, appRootPath: rootPath, appMap, appRepoDefinition: repoDefinition, moduleResolutionConfig },\n context,\n );\n }\n\n // Finally we condense into a resolve map.\n return convertToResolveMap({ appMap, rootPaths: [appPath, ...additionalPaths] });\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ms-cloudpack/package-utilities",
3
- "version": "13.2.5",
3
+ "version": "13.3.0",
4
4
  "description": "Utilities for resolving/parsing packages and their imports in Cloudpack",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -25,10 +25,10 @@
25
25
  "test": "cloudpack-scripts test"
26
26
  },
27
27
  "dependencies": {
28
- "@ms-cloudpack/common-types": "^0.33.1",
28
+ "@ms-cloudpack/common-types": "^0.33.2",
29
29
  "@ms-cloudpack/json-utilities": "^0.1.11",
30
- "@ms-cloudpack/path-string-parsing": "^1.2.7",
31
- "@ms-cloudpack/path-utilities": "^3.2.2",
30
+ "@ms-cloudpack/path-string-parsing": "^1.3.0",
31
+ "@ms-cloudpack/path-utilities": "^3.2.3",
32
32
  "@ms-cloudpack/task-reporter": "^0.17.4",
33
33
  "acorn": "^8.11.2",
34
34
  "acorn-walk": "^8.2.1",