From 5d59dfee3e260e6f9f83b42f4be2b98307cb5d40 Mon Sep 17 00:00:00 2001 From: Tomasz Jaworski Date: Wed, 6 Nov 2024 16:06:38 +0000 Subject: [PATCH 1/7] fix: failed verification of shrinkwrap with dependenciesMeta custom fields --- common/reviews/api/rush-lib.api.md | 4 +++- libraries/rush-lib/src/api/PackageJsonEditor.ts | 16 ++++++++++------ .../installManager/WorkspaceInstallManager.ts | 4 +--- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/common/reviews/api/rush-lib.api.md b/common/reviews/api/rush-lib.api.md index 454ac3daa07..15d973a6ca2 100644 --- a/common/reviews/api/rush-lib.api.md +++ b/common/reviews/api/rush-lib.api.md @@ -1005,11 +1005,13 @@ export class PackageJsonDependency { // @public (undocumented) export class PackageJsonDependencyMeta { - constructor(name: string, injected: boolean, onChange: () => void); + constructor(name: string, sourceData: object, onChange: () => void); // (undocumented) get injected(): boolean; // (undocumented) readonly name: string; + // (undocumented) + get sourceData(): object; } // @public (undocumented) diff --git a/libraries/rush-lib/src/api/PackageJsonEditor.ts b/libraries/rush-lib/src/api/PackageJsonEditor.ts index 8212164169b..029f5a13f4e 100644 --- a/libraries/rush-lib/src/api/PackageJsonEditor.ts +++ b/libraries/rush-lib/src/api/PackageJsonEditor.ts @@ -50,19 +50,23 @@ export class PackageJsonDependency { * @public */ export class PackageJsonDependencyMeta { - private _injected: boolean; + private _sourceData: object; private _onChange: () => void; public readonly name: string; - public constructor(name: string, injected: boolean, onChange: () => void) { + public constructor(name: string, sourceData: object, onChange: () => void) { this.name = name; - this._injected = injected; + this._sourceData = sourceData; this._onChange = onChange; } + public get sourceData(): object { + return this._sourceData; + } + public get injected(): boolean { - return this._injected; + return (this._sourceData as { injected?: boolean }).injected ?? false; } } @@ -107,7 +111,7 @@ export class PackageJsonEditor { const devDependencies: { [key: string]: string } = data.devDependencies || {}; const resolutions: { [key: string]: string } = data.resolutions || {}; - const dependenciesMeta: { [key: string]: { [key: string]: boolean } } = data.dependenciesMeta || {}; + const dependenciesMeta: { [key: string]: object } = data.dependenciesMeta || {}; const _onChange: () => void = this._onChange.bind(this); @@ -183,7 +187,7 @@ export class PackageJsonEditor { Object.keys(dependenciesMeta || {}).forEach((packageName: string) => { this._dependenciesMeta.set( packageName, - new PackageJsonDependencyMeta(packageName, dependenciesMeta[packageName].injected, _onChange) + new PackageJsonDependencyMeta(packageName, dependenciesMeta[packageName], _onChange) ); }); diff --git a/libraries/rush-lib/src/logic/installManager/WorkspaceInstallManager.ts b/libraries/rush-lib/src/logic/installManager/WorkspaceInstallManager.ts index 8308aef00c8..2f5fd7af367 100644 --- a/libraries/rush-lib/src/logic/installManager/WorkspaceInstallManager.ts +++ b/libraries/rush-lib/src/logic/installManager/WorkspaceInstallManager.ts @@ -325,9 +325,7 @@ export class WorkspaceInstallManager extends BaseInstallManager { if (dependencyMetaList.length !== 0) { const dependenciesMeta: IDependenciesMetaTable = {}; for (const dependencyMeta of dependencyMetaList) { - dependenciesMeta[dependencyMeta.name] = { - injected: dependencyMeta.injected - }; + dependenciesMeta[dependencyMeta.name] = dependencyMeta.sourceData; } // get the relative path from common temp folder to package folder, to align with the value in pnpm-lock.yaml From 5066bd688b7a4f122e89d27f1c1d6da067522d43 Mon Sep 17 00:00:00 2001 From: Tomasz Jaworski Date: Wed, 6 Nov 2024 16:09:10 +0000 Subject: [PATCH 2/7] chore: rush change --- ...pendencies-meta-custom-fields_2024-11-06-16-08.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 common/changes/@microsoft/rush/fix-dependencies-meta-custom-fields_2024-11-06-16-08.json diff --git a/common/changes/@microsoft/rush/fix-dependencies-meta-custom-fields_2024-11-06-16-08.json b/common/changes/@microsoft/rush/fix-dependencies-meta-custom-fields_2024-11-06-16-08.json new file mode 100644 index 00000000000..ba0c4e08b02 --- /dev/null +++ b/common/changes/@microsoft/rush/fix-dependencies-meta-custom-fields_2024-11-06-16-08.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@microsoft/rush", + "comment": "Fix an issue where usage of custom fields in dependenciesMeta caused rush install to think that shrinkwrap file is outdated", + "type": "none" + } + ], + "packageName": "@microsoft/rush" +} \ No newline at end of file From 5873c07648d2c0d228e814162b38219f7d610cc7 Mon Sep 17 00:00:00 2001 From: Tomasz Jaworski Date: Wed, 6 Nov 2024 18:17:52 +0000 Subject: [PATCH 3/7] fix: failed verification of shrinkwrap with dependenciesMeta custom fields --- libraries/rush-lib/src/logic/pnpm/PnpmShrinkwrapFile.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/libraries/rush-lib/src/logic/pnpm/PnpmShrinkwrapFile.ts b/libraries/rush-lib/src/logic/pnpm/PnpmShrinkwrapFile.ts index 5801d1dc1cc..118cdc1a296 100644 --- a/libraries/rush-lib/src/logic/pnpm/PnpmShrinkwrapFile.ts +++ b/libraries/rush-lib/src/logic/pnpm/PnpmShrinkwrapFile.ts @@ -32,15 +32,14 @@ import { PnpmOptionsConfiguration } from './PnpmOptionsConfiguration'; import type { IPnpmfile, IPnpmfileContext } from './IPnpmfile'; import type { Subspace } from '../../api/Subspace'; import { CustomTipId, type CustomTipsConfiguration } from '../../api/CustomTipsConfiguration'; +import { objectsAreDeepEqual } from '../../utilities/objectUtilities'; const yamlModule: typeof import('js-yaml') = Import.lazy('js-yaml', require); export interface IPeerDependenciesMetaYaml { optional?: boolean; } -export interface IDependenciesMetaYaml { - injected?: boolean; -} +export type IDependenciesMetaYaml = object; export type IPnpmV7VersionSpecifier = string; export interface IPnpmV8VersionSpecifier { @@ -1040,8 +1039,8 @@ export class PnpmShrinkwrapFile extends BaseShrinkwrapFile { } } - for (const { name, injected } of dependencyMetaList) { - if (importer.dependenciesMeta?.[name]?.injected === injected) { + for (const { name, sourceData } of dependencyMetaList) { + if (objectsAreDeepEqual(importer.dependenciesMeta?.[name], sourceData)) { importerDependenciesMeta.delete(name); } } From d0fc9cd3e950f96838e4abe60597a5aa95846c96 Mon Sep 17 00:00:00 2001 From: Tomasz Jaworski Date: Fri, 15 Nov 2024 00:35:42 +0100 Subject: [PATCH 4/7] Update libraries/rush-lib/src/logic/pnpm/PnpmShrinkwrapFile.ts Co-authored-by: Ian Clanton-Thuon --- libraries/rush-lib/src/logic/pnpm/PnpmShrinkwrapFile.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/rush-lib/src/logic/pnpm/PnpmShrinkwrapFile.ts b/libraries/rush-lib/src/logic/pnpm/PnpmShrinkwrapFile.ts index 118cdc1a296..83b65e8d0cb 100644 --- a/libraries/rush-lib/src/logic/pnpm/PnpmShrinkwrapFile.ts +++ b/libraries/rush-lib/src/logic/pnpm/PnpmShrinkwrapFile.ts @@ -39,7 +39,10 @@ const yamlModule: typeof import('js-yaml') = Import.lazy('js-yaml', require); export interface IPeerDependenciesMetaYaml { optional?: boolean; } -export type IDependenciesMetaYaml = object; +export interface IDependenciesMetaYaml { + injected?: boolean; + [key: string]?: unknown; +} export type IPnpmV7VersionSpecifier = string; export interface IPnpmV8VersionSpecifier { From 042b190a3219684afc36ad612d9d56dc3437e010 Mon Sep 17 00:00:00 2001 From: Tomasz Jaworski Date: Fri, 15 Nov 2024 00:56:31 +0100 Subject: [PATCH 5/7] pr fixes --- common/reviews/api/node-core-library.api.md | 1 + common/reviews/api/rush-lib.api.md | 12 ++++++++++-- .../node-core-library/src/IPackageJson.ts | 1 + .../rush-lib/src/api/PackageJsonEditor.ts | 19 ++++++++++++++----- libraries/rush-lib/src/index.ts | 1 + .../src/logic/pnpm/PnpmShrinkwrapFile.ts | 12 +++++++----- 6 files changed, 34 insertions(+), 12 deletions(-) diff --git a/common/reviews/api/node-core-library.api.md b/common/reviews/api/node-core-library.api.md index a11e5a042da..ba439c97ec1 100644 --- a/common/reviews/api/node-core-library.api.md +++ b/common/reviews/api/node-core-library.api.md @@ -244,6 +244,7 @@ export interface IDependenciesMetaTable { // (undocumented) [dependencyName: string]: { injected?: boolean; + [key: string]: unknown; }; } diff --git a/common/reviews/api/rush-lib.api.md b/common/reviews/api/rush-lib.api.md index 15d973a6ca2..4a7d22ad640 100644 --- a/common/reviews/api/rush-lib.api.md +++ b/common/reviews/api/rush-lib.api.md @@ -684,6 +684,14 @@ export interface _IOperationStateJson { nonCachedDurationMs: number; } +// @public (undocumented) +export interface IPackageJsonDependencyMetaSourceData { + // (undocumented) + [key: string]: unknown; + // (undocumented) + injected?: boolean; +} + // @public export interface IPackageManagerOptionsJsonBase { environmentVariables?: IConfigurationEnvironment; @@ -1005,13 +1013,13 @@ export class PackageJsonDependency { // @public (undocumented) export class PackageJsonDependencyMeta { - constructor(name: string, sourceData: object, onChange: () => void); + constructor(name: string, sourceData: IPackageJsonDependencyMetaSourceData, onChange: () => void); // (undocumented) get injected(): boolean; // (undocumented) readonly name: string; // (undocumented) - get sourceData(): object; + get sourceData(): IPackageJsonDependencyMetaSourceData; } // @public (undocumented) diff --git a/libraries/node-core-library/src/IPackageJson.ts b/libraries/node-core-library/src/IPackageJson.ts index 74d2c062439..9d0d0c51243 100644 --- a/libraries/node-core-library/src/IPackageJson.ts +++ b/libraries/node-core-library/src/IPackageJson.ts @@ -68,6 +68,7 @@ export interface IPeerDependenciesMetaTable { export interface IDependenciesMetaTable { [dependencyName: string]: { injected?: boolean; + [key: string]: unknown; }; } diff --git a/libraries/rush-lib/src/api/PackageJsonEditor.ts b/libraries/rush-lib/src/api/PackageJsonEditor.ts index 029f5a13f4e..294ce02dd95 100644 --- a/libraries/rush-lib/src/api/PackageJsonEditor.ts +++ b/libraries/rush-lib/src/api/PackageJsonEditor.ts @@ -16,6 +16,14 @@ export enum DependencyType { YarnResolutions = 'resolutions' } +/** + * @public + */ +export interface IPackageJsonDependencyMetaSourceData { + injected?: boolean; + [key: string]: unknown; +} + /** * @public */ @@ -50,23 +58,23 @@ export class PackageJsonDependency { * @public */ export class PackageJsonDependencyMeta { - private _sourceData: object; + private _sourceData: IPackageJsonDependencyMetaSourceData; private _onChange: () => void; public readonly name: string; - public constructor(name: string, sourceData: object, onChange: () => void) { + public constructor(name: string, sourceData: IPackageJsonDependencyMetaSourceData, onChange: () => void) { this.name = name; this._sourceData = sourceData; this._onChange = onChange; } - public get sourceData(): object { + public get sourceData(): IPackageJsonDependencyMetaSourceData { return this._sourceData; } public get injected(): boolean { - return (this._sourceData as { injected?: boolean }).injected ?? false; + return this._sourceData.injected ?? false; } } @@ -111,7 +119,8 @@ export class PackageJsonEditor { const devDependencies: { [key: string]: string } = data.devDependencies || {}; const resolutions: { [key: string]: string } = data.resolutions || {}; - const dependenciesMeta: { [key: string]: object } = data.dependenciesMeta || {}; + const dependenciesMeta: { [key: string]: IPackageJsonDependencyMetaSourceData } = + data.dependenciesMeta || {}; const _onChange: () => void = this._onChange.bind(this); diff --git a/libraries/rush-lib/src/index.ts b/libraries/rush-lib/src/index.ts index e3c5e19c20e..7929e023956 100644 --- a/libraries/rush-lib/src/index.ts +++ b/libraries/rush-lib/src/index.ts @@ -86,6 +86,7 @@ export { PackageJsonEditor, PackageJsonDependency, DependencyType, + type IPackageJsonDependencyMetaSourceData, PackageJsonDependencyMeta } from './api/PackageJsonEditor'; diff --git a/libraries/rush-lib/src/logic/pnpm/PnpmShrinkwrapFile.ts b/libraries/rush-lib/src/logic/pnpm/PnpmShrinkwrapFile.ts index 83b65e8d0cb..67a9c57b183 100644 --- a/libraries/rush-lib/src/logic/pnpm/PnpmShrinkwrapFile.ts +++ b/libraries/rush-lib/src/logic/pnpm/PnpmShrinkwrapFile.ts @@ -23,7 +23,12 @@ import type { IShrinkwrapFilePolicyValidatorOptions } from '../policy/Shrinkwrap import { PNPM_SHRINKWRAP_YAML_FORMAT } from './PnpmYamlCommon'; import { RushConstants } from '../RushConstants'; import type { IExperimentsJson } from '../../api/ExperimentsConfiguration'; -import { DependencyType, type PackageJsonDependency, PackageJsonEditor } from '../../api/PackageJsonEditor'; +import { + DependencyType, + type PackageJsonDependency, + type IPackageJsonDependencyMetaSourceData, + PackageJsonEditor +} from '../../api/PackageJsonEditor'; import type { RushConfigurationProject } from '../../api/RushConfigurationProject'; import { PnpmfileConfiguration } from './PnpmfileConfiguration'; import { PnpmProjectShrinkwrapFile } from './PnpmProjectShrinkwrapFile'; @@ -39,10 +44,7 @@ const yamlModule: typeof import('js-yaml') = Import.lazy('js-yaml', require); export interface IPeerDependenciesMetaYaml { optional?: boolean; } -export interface IDependenciesMetaYaml { - injected?: boolean; - [key: string]?: unknown; -} +export type IDependenciesMetaYaml = IPackageJsonDependencyMetaSourceData; export type IPnpmV7VersionSpecifier = string; export interface IPnpmV8VersionSpecifier { From 173d3459f0b289bef6b7a185e71038443716f9e7 Mon Sep 17 00:00:00 2001 From: Tomasz Jaworski Date: Fri, 15 Nov 2024 01:00:34 +0100 Subject: [PATCH 6/7] pr fixes --- libraries/rush-lib/src/api/PackageJsonEditor.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/rush-lib/src/api/PackageJsonEditor.ts b/libraries/rush-lib/src/api/PackageJsonEditor.ts index 294ce02dd95..a4b3f2388b8 100644 --- a/libraries/rush-lib/src/api/PackageJsonEditor.ts +++ b/libraries/rush-lib/src/api/PackageJsonEditor.ts @@ -193,10 +193,10 @@ export class PackageJsonEditor { ); }); - Object.keys(dependenciesMeta || {}).forEach((packageName: string) => { + Object.entries(dependenciesMeta || {}).forEach(([packageName, dependencyMeta]: [string, IPackageJsonDependencyMetaSourceData]) => { this._dependenciesMeta.set( packageName, - new PackageJsonDependencyMeta(packageName, dependenciesMeta[packageName], _onChange) + new PackageJsonDependencyMeta(packageName, dependencyMeta, _onChange) ); }); From e8b8220ff5ae7147da06f4ab77f6de53ffce05ed Mon Sep 17 00:00:00 2001 From: Tomasz Jaworski Date: Fri, 15 Nov 2024 01:04:33 +0100 Subject: [PATCH 7/7] chore: rush change --- ...pendencies-meta-custom-fields_2024-11-15-00-04.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 common/changes/@rushstack/node-core-library/fix-dependencies-meta-custom-fields_2024-11-15-00-04.json diff --git a/common/changes/@rushstack/node-core-library/fix-dependencies-meta-custom-fields_2024-11-15-00-04.json b/common/changes/@rushstack/node-core-library/fix-dependencies-meta-custom-fields_2024-11-15-00-04.json new file mode 100644 index 00000000000..8642c408ee6 --- /dev/null +++ b/common/changes/@rushstack/node-core-library/fix-dependencies-meta-custom-fields_2024-11-15-00-04.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@rushstack/node-core-library", + "comment": "Extend IDependenciesMetaTable interface to support custom properties in \"dependenciesMeta\" entries", + "type": "minor" + } + ], + "packageName": "@rushstack/node-core-library" +} \ No newline at end of file