From 32343abfd0387158fe281464172014dcdbc718cf 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/5] 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 5013edeed4389b062c7511e6ed9983af50ecdac1 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/5] 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 92b0b026ae616a080e121b4e820c45821a2d4207 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/5] 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 ); From b78b8e460abd9c9018b600493a773b3916169406 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 15 Jun 2026 18:27:45 +0000 Subject: [PATCH 4/5] chore: add changefile for resolver cache plugin file: fix --- ...ilot-fix-file-protocol-error_2026-06-15-18-19.json | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 common/changes/@rushstack/rush-resolver-cache-plugin/copilot-fix-file-protocol-error_2026-06-15-18-19.json diff --git a/common/changes/@rushstack/rush-resolver-cache-plugin/copilot-fix-file-protocol-error_2026-06-15-18-19.json b/common/changes/@rushstack/rush-resolver-cache-plugin/copilot-fix-file-protocol-error_2026-06-15-18-19.json new file mode 100644 index 0000000000..5f97c0bfbb --- /dev/null +++ b/common/changes/@rushstack/rush-resolver-cache-plugin/copilot-fix-file-protocol-error_2026-06-15-18-19.json @@ -0,0 +1,11 @@ +{ + "changes": [ + { + "packageName": "@rushstack/rush-resolver-cache-plugin", + "comment": "Fix `file:` dependency context resolution to use canonical dependency keys for pnpm v9/v10.", + "type": "none" + } + ], + "packageName": "@rushstack/rush-resolver-cache-plugin", + "email": "198982749+Copilot@users.noreply.github.com" +} From 239eb4b703d34ef884a4f02d215b94fd9313a645 Mon Sep 17 00:00:00 2001 From: Bharat Middha <5100938+bmiddha@users.noreply.github.com> Date: Wed, 12 Aug 2026 17:10:50 -0700 Subject: [PATCH 5/5] chore(rush): mark resolver fix as patch Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8ebd5bf2-c44b-42d5-be25-e7936d4b0a14 --- .../@microsoft/rush/pr-5802_2026-08-13-00-09-36.json | 11 +++++++++++ ...ilot-fix-file-protocol-error_2026-06-15-18-19.json | 11 ----------- 2 files changed, 11 insertions(+), 11 deletions(-) create mode 100644 common/changes/@microsoft/rush/pr-5802_2026-08-13-00-09-36.json delete mode 100644 common/changes/@rushstack/rush-resolver-cache-plugin/copilot-fix-file-protocol-error_2026-06-15-18-19.json diff --git a/common/changes/@microsoft/rush/pr-5802_2026-08-13-00-09-36.json b/common/changes/@microsoft/rush/pr-5802_2026-08-13-00-09-36.json new file mode 100644 index 0000000000..ba465a740a --- /dev/null +++ b/common/changes/@microsoft/rush/pr-5802_2026-08-13-00-09-36.json @@ -0,0 +1,11 @@ +{ + "changes": [ + { + "comment": "Fix `file:` dependency context resolution to use canonical dependency keys for pnpm v9/v10.", + "type": "patch", + "packageName": "@microsoft/rush" + } + ], + "packageName": "@microsoft/rush", + "email": "5100938+bmiddha@users.noreply.github.com" +} \ No newline at end of file diff --git a/common/changes/@rushstack/rush-resolver-cache-plugin/copilot-fix-file-protocol-error_2026-06-15-18-19.json b/common/changes/@rushstack/rush-resolver-cache-plugin/copilot-fix-file-protocol-error_2026-06-15-18-19.json deleted file mode 100644 index 5f97c0bfbb..0000000000 --- a/common/changes/@rushstack/rush-resolver-cache-plugin/copilot-fix-file-protocol-error_2026-06-15-18-19.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "changes": [ - { - "packageName": "@rushstack/rush-resolver-cache-plugin", - "comment": "Fix `file:` dependency context resolution to use canonical dependency keys for pnpm v9/v10.", - "type": "none" - } - ], - "packageName": "@rushstack/rush-resolver-cache-plugin", - "email": "198982749+Copilot@users.noreply.github.com" -}