From f0ebcc4fc51bceb8020ca05e5fb9758aa2c27e57 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 11 May 2026 06:41:13 +0000 Subject: [PATCH 1/3] fix: normalize file dependency key resolution --- .../rush-resolver-cache-plugin/src/helpers.ts | 5 ++++- .../src/test/helpers.test.ts | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/rush-plugins/rush-resolver-cache-plugin/src/helpers.ts b/rush-plugins/rush-resolver-cache-plugin/src/helpers.ts index 8f1727d548..23331f8b47 100644 --- a/rush-plugins/rush-resolver-cache-plugin/src/helpers.ts +++ b/rush-plugins/rush-resolver-cache-plugin/src/helpers.ts @@ -31,7 +31,10 @@ export function resolveDependencyKey( specifier.slice(5) ); } else if (specifier.startsWith('file:')) { - return getDescriptionFileRootFromKey(lockfileFolder, specifier, helpers.depPathToFilename, key); + const resolvedKey: string = packageKeys?.has(specifier) + ? specifier + : helpers.buildDependencyKey(key, specifier); + return getDescriptionFileRootFromKey(lockfileFolder, resolvedKey, helpers.depPathToFilename, key); } else { const resolvedKey: string = packageKeys?.has(specifier) ? specifier diff --git a/rush-plugins/rush-resolver-cache-plugin/src/test/helpers.test.ts b/rush-plugins/rush-resolver-cache-plugin/src/test/helpers.test.ts index c9c5b51c12..c396353240 100644 --- a/rush-plugins/rush-resolver-cache-plugin/src/test/helpers.test.ts +++ b/rush-plugins/rush-resolver-cache-plugin/src/test/helpers.test.ts @@ -317,6 +317,25 @@ describe(resolveDependencyKey.name, () => { expect(result).toContain('/node_modules/my-rig'); }); + it('resolves file: specifier using canonical dependency key shape', () => { + const specifier: string = + 'file:../../a/b/c/my-local-package-1.0.0.tgz(react-dom@17.0.1(react@17.0.1))(react@17.0.1)'; + const result: string = resolveDependencyKey( + lockfileFolder, + 'my-local-package', + specifier, + makeProjectContext(), + v9Helpers + ); + const expected: string = getDescriptionFileRootFromKey( + lockfileFolder, + v9Helpers.buildDependencyKey('my-local-package', specifier), + v9Helpers.depPathToFilename, + 'my-local-package' + ); + expect(result).toBe(expected); + }); + it('resolves specifier found in packageKeys (v6)', () => { const packageKeys: Set = new Set(['/autoprefixer@9.8.8']); const result: string = resolveDependencyKey( From 13554670b8937848fd306b0e689b502bf0f6c396 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 11 May 2026 06:45:03 +0000 Subject: [PATCH 2/3] test: cover additional file dependency key edge cases --- .../src/test/helpers.test.ts | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/rush-plugins/rush-resolver-cache-plugin/src/test/helpers.test.ts b/rush-plugins/rush-resolver-cache-plugin/src/test/helpers.test.ts index c396353240..a3c777c6d1 100644 --- a/rush-plugins/rush-resolver-cache-plugin/src/test/helpers.test.ts +++ b/rush-plugins/rush-resolver-cache-plugin/src/test/helpers.test.ts @@ -336,6 +336,44 @@ describe(resolveDependencyKey.name, () => { expect(result).toBe(expected); }); + it('resolves file: specifier using canonical dependency key shape (v8)', () => { + const specifier: string = 'file:../../../rigs/local-node-rig'; + const result: string = resolveDependencyKey( + lockfileFolder, + 'my-rig', + specifier, + makeProjectContext(), + v8Helpers + ); + const expected: string = getDescriptionFileRootFromKey( + lockfileFolder, + v8Helpers.buildDependencyKey('my-rig', specifier), + v8Helpers.depPathToFilename, + 'my-rig' + ); + expect(result).toBe(expected); + }); + + it('uses file: specifier directly when packageKeys already contains it', () => { + const specifier: string = 'file:../../../rigs/local-node-rig'; + const packageKeys: Set = new Set([specifier]); + const result: string = resolveDependencyKey( + lockfileFolder, + 'my-rig', + specifier, + makeProjectContext(), + v9Helpers, + packageKeys + ); + const expected: string = getDescriptionFileRootFromKey( + lockfileFolder, + specifier, + v9Helpers.depPathToFilename, + 'my-rig' + ); + expect(result).toBe(expected); + }); + it('resolves specifier found in packageKeys (v6)', () => { const packageKeys: Set = new Set(['/autoprefixer@9.8.8']); const result: string = resolveDependencyKey( From 17e0b3aa8ccc0bbd97192d6447ac8fff4c30b5f4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 11 May 2026 08:07:12 +0000 Subject: [PATCH 3/3] refactor: extract repeated specifier strings into variables in tests --- .../src/test/helpers.test.ts | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/rush-plugins/rush-resolver-cache-plugin/src/test/helpers.test.ts b/rush-plugins/rush-resolver-cache-plugin/src/test/helpers.test.ts index a3c777c6d1..f8e3e509e9 100644 --- a/rush-plugins/rush-resolver-cache-plugin/src/test/helpers.test.ts +++ b/rush-plugins/rush-resolver-cache-plugin/src/test/helpers.test.ts @@ -282,10 +282,11 @@ describe(resolveDependencyKey.name, () => { }); it('resolves link: specifier for project context', () => { + const specifier: string = 'link:../bar'; const result: string = resolveDependencyKey( lockfileFolder, 'bar', - 'link:../bar', + specifier, makeProjectContext(), v9Helpers ); @@ -294,10 +295,11 @@ describe(resolveDependencyKey.name, () => { }); it('resolves link: specifier for non-project context', () => { + const specifier: string = 'link:../bar'; const result: string = resolveDependencyKey( lockfileFolder, 'bar', - 'link:../bar', + specifier, makePackageContext(), v9Helpers ); @@ -306,10 +308,11 @@ describe(resolveDependencyKey.name, () => { }); it('resolves file: specifier', () => { + const specifier: string = 'file:../../../rigs/local-node-rig'; const result: string = resolveDependencyKey( lockfileFolder, 'my-rig', - 'file:../../../rigs/local-node-rig', + specifier, makeProjectContext(), v9Helpers ); @@ -375,11 +378,12 @@ describe(resolveDependencyKey.name, () => { }); it('resolves specifier found in packageKeys (v6)', () => { - const packageKeys: Set = new Set(['/autoprefixer@9.8.8']); + const specifier: string = '/autoprefixer@9.8.8'; + const packageKeys: Set = new Set([specifier]); const result: string = resolveDependencyKey( lockfileFolder, 'autoprefixer', - '/autoprefixer@9.8.8', + specifier, makeProjectContext(), v8Helpers, packageKeys @@ -389,11 +393,12 @@ describe(resolveDependencyKey.name, () => { }); it('resolves specifier found in packageKeys (v9)', () => { - const packageKeys: Set = new Set(['autoprefixer@9.8.8']); + const specifier: string = 'autoprefixer@9.8.8'; + const packageKeys: Set = new Set([specifier]); const result: string = resolveDependencyKey( lockfileFolder, 'autoprefixer', - 'autoprefixer@9.8.8', + specifier, makeProjectContext(), v9Helpers, packageKeys @@ -403,10 +408,11 @@ describe(resolveDependencyKey.name, () => { }); it('builds dependency key for plain version specifiers (v9)', () => { + const specifier: string = '9.8.8'; const result: string = resolveDependencyKey( lockfileFolder, 'autoprefixer', - '9.8.8', + specifier, makeProjectContext(), v9Helpers ); @@ -415,10 +421,11 @@ describe(resolveDependencyKey.name, () => { }); it('builds dependency key for plain version specifiers (v8)', () => { + const specifier: string = '9.8.8'; const result: string = resolveDependencyKey( lockfileFolder, 'autoprefixer', - '9.8.8', + specifier, makeProjectContext(), v8Helpers );