@ms-cloudpack/package-utilities 13.5.0 → 13.7.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 +1 @@
1
- {"version":3,"file":"PackageDefinitions.d.ts","sourceRoot":"","sources":["../../src/packageDefinitions/PackageDefinitions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,2BAA2B,EAE3B,iCAAiC,EACjC,uBAAuB,EACvB,WAAW,EACX,mCAAmC,EACpC,MAAM,4BAA4B,CAAC;AAMpC,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB;;OAEG;IACH,kBAAkB,CAAC,EAAE,iCAAiC,EAAE,CAAC;CAC1D;AAsCD,qBAAa,kBAAmB,YAAW,uBAAuB;IAChE,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,uBAAuB,CAAmC;IAClE,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,mBAAmB,CAA2C;IAEtE;;;;OAIG;gBACS,OAAO,GAAE,yBAA8B;IAO7C,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,WAAW,CAAC;IAQrF,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,2BAAgC,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAkD9G,iBAAiB,CAAC,OAAO,EAAE,iCAAiC,GAAG,IAAI;IAOnE,KAAK,CAAC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,eAAe,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAYvE,GAAG,CACD,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,WAAW,EACvB,OAAO,CAAC,EAAE,IAAI,CAAC,2BAA2B,EAAE,mBAAmB,CAAC,GAC/D,IAAI;IAYP,MAAM,CAAC,KAAK,EAAE,mCAAmC,GAAG,IAAI;IAKxD,cAAc,IAAI,mCAAmC;cAOrC,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;CAIvF"}
1
+ {"version":3,"file":"PackageDefinitions.d.ts","sourceRoot":"","sources":["../../src/packageDefinitions/PackageDefinitions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,2BAA2B,EAE3B,iCAAiC,EACjC,uBAAuB,EACvB,WAAW,EACX,mCAAmC,EACpC,MAAM,4BAA4B,CAAC;AAOpC,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB;;OAEG;IACH,kBAAkB,CAAC,EAAE,iCAAiC,EAAE,CAAC;CAC1D;AA2CD,qBAAa,kBAAmB,YAAW,uBAAuB;IAChE,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,uBAAuB,CAAmC;IAClE,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,mBAAmB,CAA2C;IAEtE;;;;OAIG;gBACS,OAAO,GAAE,yBAA8B;IAQ7C,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,WAAW,CAAC;IAQrF,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,2BAAgC,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAkD9G,iBAAiB,CAAC,OAAO,EAAE,iCAAiC,GAAG,IAAI;IAOnE,KAAK,CAAC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,eAAe,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAYvE,GAAG,CACD,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,WAAW,EACvB,OAAO,CAAC,EAAE,IAAI,CAAC,2BAA2B,EAAE,mBAAmB,CAAC,GAC/D,IAAI;IAYP,MAAM,CAAC,KAAK,EAAE,mCAAmC,GAAG,IAAI;IAKxD,cAAc,IAAI,mCAAmC;cAOrC,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;CAIvF"}
@@ -3,11 +3,17 @@ import { cloneJson, readJson } from '@ms-cloudpack/json-utilities';
3
3
  import { getNonSemverTransform } from './getNonSemverTransform.js';
4
4
  import { slash } from '@ms-cloudpack/path-string-parsing';
5
5
  import { getTypesTransform } from './getTypesTransform.js';
6
+ import { getCatalogTransform } from './getCatalogTransform.js';
6
7
  /**
7
- * `nonSemverTransform` has state defined when the function is called, so we need a wrapper function
8
- * which returns new transforms to ensure that state is cleared when resetting.
8
+ * Transforms may be stateful, so we have to store the factories (not the transforms themselves)
9
+ * and re-call the factory when resetting.
9
10
  */
10
- const getDefaultTransforms = () => [getTypesTransform(), getNonSemverTransform()];
11
+ const defaultFactories = [
12
+ getTypesTransform,
13
+ // Catalog versions can contain non-semver, so this must come before nonSemverTransform
14
+ getCatalogTransform,
15
+ getNonSemverTransform,
16
+ ];
11
17
  /**
12
18
  * Defines which keys from package.json are allowed to be cloned.
13
19
  * Keys with true values are cloned, keys with false values are not cloned.
@@ -50,6 +56,7 @@ export class PackageDefinitions {
50
56
  constructor(options = {}) {
51
57
  const { config, transformFactories } = options;
52
58
  this._transformFactories = transformFactories || [];
59
+ // `force` means always initialize transforms even if no config is provided
53
60
  this.reset({ newConfig: config, force: true });
54
61
  }
55
62
  async get(packagePath, options) {
@@ -110,7 +117,7 @@ export class PackageDefinitions {
110
117
  const { newConfig, force } = options || {};
111
118
  if (newConfig || force) {
112
119
  this._config = newConfig;
113
- this._transforms = [...getDefaultTransforms(), ...this._transformFactories.map((factory) => factory(newConfig))];
120
+ this._transforms = [...defaultFactories, ...this._transformFactories].map((factory) => factory(newConfig));
114
121
  }
115
122
  }
116
123
  set(packagePath, definition, options) {
@@ -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 SerializablePackageDefinitionsCache,\n} from '@ms-cloudpack/common-types';\nimport { cloneJson, readJson } from '@ms-cloudpack/json-utilities';\nimport { getNonSemverTransform } from './getNonSemverTransform.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 = () => [getTypesTransform(), getNonSemverTransform()];\n\n/**\n * Defines which keys from package.json are allowed to be cloned.\n * Keys with true values are cloned, keys with false values are not cloned.\n * (It's an object for better typings and faster access.)\n *\n * NOTE: If you add any new keys to PackageJson, they must be added here too.\n */\nconst copyPackageJsonKeys: Record<keyof PackageJson, boolean> = {\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 /** Engines are used to check Node version compatibility between process and Cloudpack, not for packages bundled by Cloudpack */\n engines: false,\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, { keys: 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 set(\n packagePath: string,\n definition: PackageJson,\n options?: Pick<GetPackageDefinitionOptions, 'disableTransforms'>,\n ): void {\n const { disableTransforms } = options || {};\n // Normalize the path used for caching to ensure consistency.\n const normalizedPath = slash(packagePath);\n // Delete the transformed definition if it exists, so we don't have stale data.\n if (disableTransforms) {\n delete this._transformedDefinitions[normalizedPath];\n }\n const record = disableTransforms ? this._definitions : this._transformedDefinitions;\n record[normalizedPath] = definition;\n }\n\n extend(input: SerializablePackageDefinitionsCache): void {\n Object.assign(this._definitions, input.definitions);\n Object.assign(this._transformedDefinitions, input.transformedDefinitions);\n }\n\n toSerializable(): SerializablePackageDefinitionsCache {\n return {\n definitions: this._definitions,\n transformedDefinitions: this._transformedDefinitions,\n };\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 SerializablePackageDefinitionsCache,\n} from '@ms-cloudpack/common-types';\nimport { cloneJson, readJson } from '@ms-cloudpack/json-utilities';\nimport { getNonSemverTransform } from './getNonSemverTransform.js';\nimport { slash } from '@ms-cloudpack/path-string-parsing';\nimport { getTypesTransform } from './getTypesTransform.js';\nimport { getCatalogTransform } from './getCatalogTransform.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 * Transforms may be stateful, so we have to store the factories (not the transforms themselves)\n * and re-call the factory when resetting.\n */\nconst defaultFactories = [\n getTypesTransform,\n // Catalog versions can contain non-semver, so this must come before nonSemverTransform\n getCatalogTransform,\n getNonSemverTransform,\n];\n\n/**\n * Defines which keys from package.json are allowed to be cloned.\n * Keys with true values are cloned, keys with false values are not cloned.\n * (It's an object for better typings and faster access.)\n *\n * NOTE: If you add any new keys to PackageJson, they must be added here too.\n */\nconst copyPackageJsonKeys: Record<keyof PackageJson, boolean> = {\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 /** Engines are used to check Node version compatibility between process and Cloudpack, not for packages bundled by Cloudpack */\n engines: false,\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 // `force` means always initialize transforms even if no config is provided\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, { keys: 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 = [...defaultFactories, ...this._transformFactories].map((factory) => factory(newConfig));\n }\n }\n\n set(\n packagePath: string,\n definition: PackageJson,\n options?: Pick<GetPackageDefinitionOptions, 'disableTransforms'>,\n ): void {\n const { disableTransforms } = options || {};\n // Normalize the path used for caching to ensure consistency.\n const normalizedPath = slash(packagePath);\n // Delete the transformed definition if it exists, so we don't have stale data.\n if (disableTransforms) {\n delete this._transformedDefinitions[normalizedPath];\n }\n const record = disableTransforms ? this._definitions : this._transformedDefinitions;\n record[normalizedPath] = definition;\n }\n\n extend(input: SerializablePackageDefinitionsCache): void {\n Object.assign(this._definitions, input.definitions);\n Object.assign(this._transformedDefinitions, input.transformedDefinitions);\n }\n\n toSerializable(): SerializablePackageDefinitionsCache {\n return {\n definitions: this._definitions,\n transformedDefinitions: this._transformedDefinitions,\n };\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"]}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Standard dependency types to check in transforms.
3
+ * (Omits `bundle(d)Dependencies` since they don't have versions.)
4
+ */
5
+ export declare const depTypes: readonly ["dependencies", "devDependencies", "peerDependencies", "optionalDependencies"];
6
+ //# sourceMappingURL=depTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"depTypes.d.ts","sourceRoot":"","sources":["../../src/packageDefinitions/depTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,QAAQ,0FAA2F,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Standard dependency types to check in transforms.
3
+ * (Omits `bundle(d)Dependencies` since they don't have versions.)
4
+ */
5
+ export const depTypes = ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'];
6
+ //# sourceMappingURL=depTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"depTypes.js","sourceRoot":"","sources":["../../src/packageDefinitions/depTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,sBAAsB,CAAU,CAAC","sourcesContent":["/**\n * Standard dependency types to check in transforms.\n * (Omits `bundle(d)Dependencies` since they don't have versions.)\n */\nexport const depTypes = ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'] as const;\n"]}
@@ -0,0 +1,11 @@
1
+ import type { CloudpackConfig, PackageDefinitionTransform } from '@ms-cloudpack/common-types';
2
+ /**
3
+ * Get a transform which handles `catalog:*` versions by translating them to the actual versions
4
+ * from the catalogs. (Note that the resulting version might still be a `workspace:` version in yarn,
5
+ * or other non-semver.)
6
+ *
7
+ * @see https://pnpm.io/catalogs
8
+ * @see https://yarnpkg.com/features/catalogs
9
+ */
10
+ export declare function getCatalogTransform(config: CloudpackConfig | undefined): PackageDefinitionTransform;
11
+ //# sourceMappingURL=getCatalogTransform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getCatalogTransform.d.ts","sourceRoot":"","sources":["../../src/packageDefinitions/getCatalogTransform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAM9F;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,GAAG,0BAA0B,CAwCnG"}
@@ -0,0 +1,46 @@
1
+ import { isExternalPackage } from '@ms-cloudpack/path-utilities';
2
+ import fs from 'fs';
3
+ import { getCatalogs, getCatalogVersion, isCatalogVersion } from 'workspace-tools';
4
+ import { depTypes } from './depTypes.js';
5
+ /**
6
+ * Get a transform which handles `catalog:*` versions by translating them to the actual versions
7
+ * from the catalogs. (Note that the resulting version might still be a `workspace:` version in yarn,
8
+ * or other non-semver.)
9
+ *
10
+ * @see https://pnpm.io/catalogs
11
+ * @see https://yarnpkg.com/features/catalogs
12
+ */
13
+ export function getCatalogTransform(config) {
14
+ if (!config?.appPath || !fs.existsSync(config.appPath)) {
15
+ // If there's no config or appPath is invalid, it's probably running in a test.
16
+ // Skip loading catalogs in that case so we don't waste time searching for a root.
17
+ return () => undefined;
18
+ }
19
+ // Load version catalogs. This will search up from the given directory to find the root.
20
+ const catalogs = getCatalogs(config.appPath);
21
+ if (!catalogs) {
22
+ // No catalogs found, so no transform needed
23
+ return () => undefined;
24
+ }
25
+ return ({ definition, packagePath }) => {
26
+ if (isExternalPackage(packagePath)) {
27
+ // External packages can't have catalog deps
28
+ return definition;
29
+ }
30
+ for (const depType of depTypes) {
31
+ const deps = definition[depType] || {};
32
+ for (const [depName, depVersion] of Object.entries(deps)) {
33
+ if (!depVersion || !isCatalogVersion(depVersion)) {
34
+ continue;
35
+ }
36
+ // Get the real version. This will throw if the catalog specification is invalid
37
+ // (though probably the package manager itself would already have errored).
38
+ const realVersion = getCatalogVersion({ catalogs, name: depName, version: depVersion });
39
+ // Update the dep. Note that this may be a `workspace:` version or other non-semver.
40
+ deps[depName] = realVersion;
41
+ }
42
+ }
43
+ return definition;
44
+ };
45
+ }
46
+ //# sourceMappingURL=getCatalogTransform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getCatalogTransform.js","sourceRoot":"","sources":["../../src/packageDefinitions/getCatalogTransform.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnF,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAmC;IACrE,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACvD,+EAA+E;QAC/E,kFAAkF;QAClF,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC;IACzB,CAAC;IAED,wFAAwF;IACxF,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE7C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,4CAA4C;QAC5C,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC;IACzB,CAAC;IAED,OAAO,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,EAAE;QACrC,IAAI,iBAAiB,CAAC,WAAW,CAAC,EAAE,CAAC;YACnC,4CAA4C;YAC5C,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAEvC,KAAK,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzD,IAAI,CAAC,UAAU,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;oBACjD,SAAS;gBACX,CAAC;gBAED,gFAAgF;gBAChF,2EAA2E;gBAC3E,MAAM,WAAW,GAAG,iBAAiB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;gBAExF,oFAAoF;gBACpF,IAAI,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { CloudpackConfig, PackageDefinitionTransform } from '@ms-cloudpack/common-types';\nimport { isExternalPackage } from '@ms-cloudpack/path-utilities';\nimport fs from 'fs';\nimport { getCatalogs, getCatalogVersion, isCatalogVersion } from 'workspace-tools';\nimport { depTypes } from './depTypes.js';\n\n/**\n * Get a transform which handles `catalog:*` versions by translating them to the actual versions\n * from the catalogs. (Note that the resulting version might still be a `workspace:` version in yarn,\n * or other non-semver.)\n *\n * @see https://pnpm.io/catalogs\n * @see https://yarnpkg.com/features/catalogs\n */\nexport function getCatalogTransform(config: CloudpackConfig | undefined): PackageDefinitionTransform {\n if (!config?.appPath || !fs.existsSync(config.appPath)) {\n // If there's no config or appPath is invalid, it's probably running in a test.\n // Skip loading catalogs in that case so we don't waste time searching for a root.\n return () => undefined;\n }\n\n // Load version catalogs. This will search up from the given directory to find the root.\n const catalogs = getCatalogs(config.appPath);\n\n if (!catalogs) {\n // No catalogs found, so no transform needed\n return () => undefined;\n }\n\n return ({ definition, packagePath }) => {\n if (isExternalPackage(packagePath)) {\n // External packages can't have catalog deps\n return definition;\n }\n\n for (const depType of depTypes) {\n const deps = definition[depType] || {};\n\n for (const [depName, depVersion] of Object.entries(deps)) {\n if (!depVersion || !isCatalogVersion(depVersion)) {\n continue;\n }\n\n // Get the real version. This will throw if the catalog specification is invalid\n // (though probably the package manager itself would already have errored).\n const realVersion = getCatalogVersion({ catalogs, name: depName, version: depVersion });\n\n // Update the dep. Note that this may be a `workspace:` version or other non-semver.\n deps[depName] = realVersion;\n }\n }\n\n return definition;\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"getNonSemverTransform.d.ts","sourceRoot":"","sources":["../../src/packageDefinitions/getNonSemverTransform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAA4B,MAAM,4BAA4B,CAAC;AAiBvG;;;;;;GAMG;AACH,wBAAgB,qBAAqB,IAAI,0BAA0B,CAgHlE"}
1
+ {"version":3,"file":"getNonSemverTransform.d.ts","sourceRoot":"","sources":["../../src/packageDefinitions/getNonSemverTransform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAA4B,MAAM,4BAA4B,CAAC;AAgBvG;;;;;;GAMG;AACH,wBAAgB,qBAAqB,IAAI,0BAA0B,CAgHlE"}
@@ -1,6 +1,6 @@
1
1
  import semver from 'semver';
2
2
  import { generateVersionFromNonSemver } from './generateVersionFromNonSemver.js';
3
- const depTypes = ['dependencies', 'peerDependencies', 'devDependencies', 'optionalDependencies'];
3
+ import { depTypes } from './depTypes.js';
4
4
  /**
5
5
  * Match yarn berry (v2+) patch versions:
6
6
  * `patch:@foo/bar@npm%3A7.18.0#~/.yarn/patches/@foo-bar-npm-7.18.0-f1d556a934.patch`
@@ -1 +1 @@
1
- {"version":3,"file":"getNonSemverTransform.js","sourceRoot":"","sources":["../../src/packageDefinitions/getNonSemverTransform.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PackageDefinitionTransform, PackageJsonCloudpackMeta } from '@ms-cloudpack/common-types';\nimport semver from 'semver';\nimport { generateVersionFromNonSemver } from './generateVersionFromNonSemver.js';\n\nconst depTypes = ['dependencies', 'peerDependencies', 'devDependencies', 'optionalDependencies'] as const;\n\n/**\n * Match yarn berry (v2+) patch versions:\n * `patch:@foo/bar@npm%3A7.18.0#~/.yarn/patches/@foo-bar-npm-7.18.0-f1d556a934.patch`\n *\n * - `[1]` is the part of the version before the `#`\n * - `[2]` is the patch path relative to root: `.yarn/patches/@foo-bar-npm-7.18.0-f1d556a934.patch`\n */\n// Be strict about matching yarn's generated path in case of other patching-related cases that\n// might need different handling (those could be explicitly supported later if needed).\nconst yarnBerryPatchRegex = /^(patch:.*?)#~\\/(\\.yarn\\/patches\\/.*\\.patch)$/;\n\n/**\n * Get a transform which handles non-semver dependencies:\n * - In a parent package, if a dependency is specified with a non-semver version, change the dep\n * to a special `0.0.0-<original-version>` prerelease version.\n * - In a child package, if the package was pulled in as a non-semver dependency by a parent\n * (per the `importerContext`), change its version to the special prerelease version as above.\n */\nexport function getNonSemverTransform(): PackageDefinitionTransform {\n /**\n * Cached info about parent packages with non-semver dependencies:\n * Map from parent name/version => dep type => non-semver dependency names\n */\n const nonSemverDeps: Record<`${string}@${string}`, Partial<Record<(typeof depTypes)[number], string[]>>> = {};\n /**\n * Map from transformed yarn berry patch versions to relative patch file paths.\n * (This is necessary to save because the original path is only available in the parent's deps,\n * but it needs to be added to the child's cloudpack metadata.)\n *\n * Example:\n * - Original version: `patch:@foo/bar@npm%3A7.18.0#~/.yarn/patches/@foo-bar-npm-7.18.0-f1d556a934.patch`\n * - the part after `#~/` is the patch file path\n * - Transformed version: `0.0.0-patch--foo-bar-npm-3A7-18-0`\n * - This map: `0.0.0-patch--foo-bar-npm-3A7-18-0` to `.yarn/patches/@foo-bar-npm-7.18.0-f1d556a934.patch`\n */\n const yarnPatchVersionsToFiles: Record<string, string> = {};\n\n return ({ definition, packagePath, importerContext }) => {\n // Check for non-semver dependencies\n for (const depType of depTypes) {\n const deps = definition[depType] || {};\n\n for (const [depName, depVersion] of Object.entries(deps)) {\n if (!depVersion || semver.validRange(depVersion)) {\n continue;\n }\n\n // Don't warn about workspace: deps, but still process them as non-semver.\n // (Alternatively, we could change the version of all workspace deps to * in dependencies,\n // but that's risky since there could theoretically be an additional version of that dep\n // from the registry nested somewhere in the tree.)\n if (!depVersion.startsWith('workspace:')) {\n console.debug(\n `Non-semver dependency found: ${depName}@${depVersion} ` +\n `(in ${definition.name}@${definition.version} at ${packagePath}). ` +\n \"Cloudpack will attempt to handle this, but it's recommended to use semantic versions only if possible.\",\n );\n }\n\n const patchFileMatch = depVersion.match(yarnBerryPatchRegex);\n\n // Update the version in the returned dependencies:\n // \"bar\": \"npm:@custom/bar@^1\" => \"0.0.0-npm--custom-bar--1\"\n // (For the yarn berry patch files, remove the path from the end to make the version shorter;\n // this will probably still be a unique version/not collide with anything else.)\n const updatedVersion = generateVersionFromNonSemver(patchFileMatch?.[1] || depVersion);\n deps[depName] = updatedVersion;\n\n if (patchFileMatch) {\n // This version corresponds to a yarn berry patch file.\n // Save the patch file path for reference when we're updating the child package.\n yarnPatchVersionsToFiles[updatedVersion] = patchFileMatch[2];\n }\n\n // Save that this was a non-semver dep\n const record = (nonSemverDeps[`${definition.name}@${definition.version}`] ??= {});\n (record[depType] ??= []).push(depName);\n }\n }\n\n // Check if this package's parent pulled it in with a non-semver dependency, and if so,\n // update the returned name and version.\n const nonSemverParentInfo =\n importerContext && nonSemverDeps[`${importerContext.parentName}@${importerContext.parentVersion}`];\n\n // TODO: maybe this could also be used for resolutions if we have problems there:\n // adding a check for !semver.satisfies(requiredAs, definition.version) and forcing the package version?\n\n if (nonSemverParentInfo) {\n // The parent has at least one non-semver dependency (which might not be this package).\n // Check in each dependency type to see if this package is listed as non-semver.\n const { importedName, versionRequirement } = importerContext;\n\n for (const depType of depTypes) {\n if (!nonSemverParentInfo[depType]?.includes(importedName)) {\n continue;\n }\n\n // This package's parent pulled it in with a non-semver dependency.\n // Example: the parent depended on this package as \"bar\": \"npm:@custom/bar@^1\"\n // importedName = bar\n // versionRequirement = 0.0.0-npm--custom-bar--1 (was modified when this transform ran on the parent definition)\n //\n // To ensure other code handles this package properly, change its name and version to\n // the ones used by the parent (after transforms). This ensures it works properly with\n // the resolve map and isn't accidentally used by other packages which depend on this\n // package under its real name.\n const origSpec = `${definition.name}@${definition.version}` as const;\n definition.name = importedName;\n definition.version = versionRequirement;\n\n if (yarnPatchVersionsToFiles[versionRequirement]) {\n // This version corresponds to a yarn berry patch file.\n // Save the patch file path for reference in PackagePatchesCache.\n // (technically `cloudpack.mode` is required, but it's set in another transform)\n definition.cloudpack ??= {} as PackageJsonCloudpackMeta;\n definition.cloudpack.patchFilePath = yarnPatchVersionsToFiles[versionRequirement];\n }\n\n // We have changed the definition, so link the entry in nonSemverDeps to the new name/version.\n if (nonSemverDeps[origSpec]) {\n nonSemverDeps[`${importedName}@${versionRequirement}`] = nonSemverDeps[origSpec];\n }\n\n break;\n }\n }\n\n return definition;\n };\n}\n"]}
1
+ {"version":3,"file":"getNonSemverTransform.js","sourceRoot":"","sources":["../../src/packageDefinitions/getNonSemverTransform.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PackageDefinitionTransform, PackageJsonCloudpackMeta } from '@ms-cloudpack/common-types';\nimport semver from 'semver';\nimport { generateVersionFromNonSemver } from './generateVersionFromNonSemver.js';\nimport { depTypes } from './depTypes.js';\n\n/**\n * Match yarn berry (v2+) patch versions:\n * `patch:@foo/bar@npm%3A7.18.0#~/.yarn/patches/@foo-bar-npm-7.18.0-f1d556a934.patch`\n *\n * - `[1]` is the part of the version before the `#`\n * - `[2]` is the patch path relative to root: `.yarn/patches/@foo-bar-npm-7.18.0-f1d556a934.patch`\n */\n// Be strict about matching yarn's generated path in case of other patching-related cases that\n// might need different handling (those could be explicitly supported later if needed).\nconst yarnBerryPatchRegex = /^(patch:.*?)#~\\/(\\.yarn\\/patches\\/.*\\.patch)$/;\n\n/**\n * Get a transform which handles non-semver dependencies:\n * - In a parent package, if a dependency is specified with a non-semver version, change the dep\n * to a special `0.0.0-<original-version>` prerelease version.\n * - In a child package, if the package was pulled in as a non-semver dependency by a parent\n * (per the `importerContext`), change its version to the special prerelease version as above.\n */\nexport function getNonSemverTransform(): PackageDefinitionTransform {\n /**\n * Cached info about parent packages with non-semver dependencies:\n * Map from parent name/version => dep type => non-semver dependency names\n */\n const nonSemverDeps: Record<`${string}@${string}`, Partial<Record<(typeof depTypes)[number], string[]>>> = {};\n /**\n * Map from transformed yarn berry patch versions to relative patch file paths.\n * (This is necessary to save because the original path is only available in the parent's deps,\n * but it needs to be added to the child's cloudpack metadata.)\n *\n * Example:\n * - Original version: `patch:@foo/bar@npm%3A7.18.0#~/.yarn/patches/@foo-bar-npm-7.18.0-f1d556a934.patch`\n * - the part after `#~/` is the patch file path\n * - Transformed version: `0.0.0-patch--foo-bar-npm-3A7-18-0`\n * - This map: `0.0.0-patch--foo-bar-npm-3A7-18-0` to `.yarn/patches/@foo-bar-npm-7.18.0-f1d556a934.patch`\n */\n const yarnPatchVersionsToFiles: Record<string, string> = {};\n\n return ({ definition, packagePath, importerContext }) => {\n // Check for non-semver dependencies\n for (const depType of depTypes) {\n const deps = definition[depType] || {};\n\n for (const [depName, depVersion] of Object.entries(deps)) {\n if (!depVersion || semver.validRange(depVersion)) {\n continue;\n }\n\n // Don't warn about workspace: deps, but still process them as non-semver.\n // (Alternatively, we could change the version of all workspace deps to * in dependencies,\n // but that's risky since there could theoretically be an additional version of that dep\n // from the registry nested somewhere in the tree.)\n if (!depVersion.startsWith('workspace:')) {\n console.debug(\n `Non-semver dependency found: ${depName}@${depVersion} ` +\n `(in ${definition.name}@${definition.version} at ${packagePath}). ` +\n \"Cloudpack will attempt to handle this, but it's recommended to use semantic versions only if possible.\",\n );\n }\n\n const patchFileMatch = depVersion.match(yarnBerryPatchRegex);\n\n // Update the version in the returned dependencies:\n // \"bar\": \"npm:@custom/bar@^1\" => \"0.0.0-npm--custom-bar--1\"\n // (For the yarn berry patch files, remove the path from the end to make the version shorter;\n // this will probably still be a unique version/not collide with anything else.)\n const updatedVersion = generateVersionFromNonSemver(patchFileMatch?.[1] || depVersion);\n deps[depName] = updatedVersion;\n\n if (patchFileMatch) {\n // This version corresponds to a yarn berry patch file.\n // Save the patch file path for reference when we're updating the child package.\n yarnPatchVersionsToFiles[updatedVersion] = patchFileMatch[2];\n }\n\n // Save that this was a non-semver dep\n const record = (nonSemverDeps[`${definition.name}@${definition.version}`] ??= {});\n (record[depType] ??= []).push(depName);\n }\n }\n\n // Check if this package's parent pulled it in with a non-semver dependency, and if so,\n // update the returned name and version.\n const nonSemverParentInfo =\n importerContext && nonSemverDeps[`${importerContext.parentName}@${importerContext.parentVersion}`];\n\n // TODO: maybe this could also be used for resolutions if we have problems there:\n // adding a check for !semver.satisfies(requiredAs, definition.version) and forcing the package version?\n\n if (nonSemverParentInfo) {\n // The parent has at least one non-semver dependency (which might not be this package).\n // Check in each dependency type to see if this package is listed as non-semver.\n const { importedName, versionRequirement } = importerContext;\n\n for (const depType of depTypes) {\n if (!nonSemverParentInfo[depType]?.includes(importedName)) {\n continue;\n }\n\n // This package's parent pulled it in with a non-semver dependency.\n // Example: the parent depended on this package as \"bar\": \"npm:@custom/bar@^1\"\n // importedName = bar\n // versionRequirement = 0.0.0-npm--custom-bar--1 (was modified when this transform ran on the parent definition)\n //\n // To ensure other code handles this package properly, change its name and version to\n // the ones used by the parent (after transforms). This ensures it works properly with\n // the resolve map and isn't accidentally used by other packages which depend on this\n // package under its real name.\n const origSpec = `${definition.name}@${definition.version}` as const;\n definition.name = importedName;\n definition.version = versionRequirement;\n\n if (yarnPatchVersionsToFiles[versionRequirement]) {\n // This version corresponds to a yarn berry patch file.\n // Save the patch file path for reference in PackagePatchesCache.\n // (technically `cloudpack.mode` is required, but it's set in another transform)\n definition.cloudpack ??= {} as PackageJsonCloudpackMeta;\n definition.cloudpack.patchFilePath = yarnPatchVersionsToFiles[versionRequirement];\n }\n\n // We have changed the definition, so link the entry in nonSemverDeps to the new name/version.\n if (nonSemverDeps[origSpec]) {\n nonSemverDeps[`${importedName}@${versionRequirement}`] = nonSemverDeps[origSpec];\n }\n\n break;\n }\n }\n\n return definition;\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"getTypesTransform.d.ts","sourceRoot":"","sources":["../../src/packageDefinitions/getTypesTransform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAE7E;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,0BAA0B,CAkB9D"}
1
+ {"version":3,"file":"getTypesTransform.d.ts","sourceRoot":"","sources":["../../src/packageDefinitions/getTypesTransform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAG7E;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,0BAA0B,CAkB9D"}
@@ -1,10 +1,11 @@
1
+ import { depTypes } from './depTypes.js';
1
2
  /**
2
3
  * `@types/` dependencies should never be relevant for Cloudpack's purposes, so delete them.
3
4
  */
4
5
  export function getTypesTransform() {
5
6
  return ({ definition }) => {
6
7
  // Ignore bundle(d)Dependencies since they're so uncommon and unlikely to cause issues if present
7
- for (const depType of ['dependencies', 'peerDependencies', 'devDependencies', 'optionalDependencies']) {
8
+ for (const depType of depTypes) {
8
9
  const deps = definition[depType];
9
10
  if (!deps) {
10
11
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"getTypesTransform.js","sourceRoot":"","sources":["../../src/packageDefinitions/getTypesTransform.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE;QACxB,iGAAiG;QACjG,KAAK,MAAM,OAAO,IAAI,CAAC,cAAc,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,sBAAsB,CAAU,EAAE,CAAC;YAC/G,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;YACjC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YAED,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAClC,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { PackageDefinitionTransform } from '@ms-cloudpack/common-types';\n\n/**\n * `@types/` dependencies should never be relevant for Cloudpack's purposes, so delete them.\n */\nexport function getTypesTransform(): PackageDefinitionTransform {\n return ({ definition }) => {\n // Ignore bundle(d)Dependencies since they're so uncommon and unlikely to cause issues if present\n for (const depType of ['dependencies', 'peerDependencies', 'devDependencies', 'optionalDependencies'] as const) {\n const deps = definition[depType];\n if (!deps) {\n continue;\n }\n\n for (const depName of Object.keys(deps)) {\n if (depName.startsWith('@types/')) {\n delete deps[depName];\n }\n }\n }\n\n return definition;\n };\n}\n"]}
1
+ {"version":3,"file":"getTypesTransform.js","sourceRoot":"","sources":["../../src/packageDefinitions/getTypesTransform.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE;QACxB,iGAAiG;QACjG,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;YACjC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YAED,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAClC,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { PackageDefinitionTransform } from '@ms-cloudpack/common-types';\nimport { depTypes } from './depTypes.js';\n\n/**\n * `@types/` dependencies should never be relevant for Cloudpack's purposes, so delete them.\n */\nexport function getTypesTransform(): PackageDefinitionTransform {\n return ({ definition }) => {\n // Ignore bundle(d)Dependencies since they're so uncommon and unlikely to cause issues if present\n for (const depType of depTypes) {\n const deps = definition[depType];\n if (!deps) {\n continue;\n }\n\n for (const depName of Object.keys(deps)) {\n if (depName.startsWith('@types/')) {\n delete deps[depName];\n }\n }\n }\n\n return definition;\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ms-cloudpack/package-utilities",
3
- "version": "13.5.0",
3
+ "version": "13.7.0",
4
4
  "description": "Utilities for resolving/parsing packages and their imports in Cloudpack",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -28,12 +28,13 @@
28
28
  "@ms-cloudpack/common-types": "^0.33.2",
29
29
  "@ms-cloudpack/json-utilities": "^0.1.11",
30
30
  "@ms-cloudpack/path-string-parsing": "^1.3.0",
31
- "@ms-cloudpack/path-utilities": "^3.2.5",
31
+ "@ms-cloudpack/path-utilities": "^3.2.7",
32
32
  "@ms-cloudpack/task-reporter": "^0.19.0",
33
33
  "acorn": "^8.11.2",
34
34
  "acorn-walk": "^8.2.1",
35
35
  "semver": "^7.6.0",
36
- "tinyglobby": "^0.2.13"
36
+ "tinyglobby": "^0.2.13",
37
+ "workspace-tools": "^0.40.2"
37
38
  },
38
39
  "devDependencies": {
39
40
  "@ms-cloudpack/eslint-plugin-internal": "^0.0.1",