From 8e81309d9a29f0359395f2b12e852d30e0c03ea0 Mon Sep 17 00:00:00 2001 From: Pete Gonzalez <4673363+octogonz@users.noreply.github.com> Date: Thu, 25 Sep 2025 22:39:54 -0400 Subject: [PATCH 01/15] Update test fixtures, add v9.0 lockfile --- .../lfxGraph-edge-cases-v5.4.test.ts.snap | 99 +++++++++++--- .../lfxGraph-edge-cases-v6.0.test.ts.snap | 99 +++++++++++--- .../fixtures/edge-cases/pnpm-lock-v5.4.yaml | 33 +++++ .../fixtures/edge-cases/pnpm-lock-v6.0.yaml | 34 +++++ .../fixtures/edge-cases/pnpm-lock-v9.0.yaml | 122 ++++++++++++++++++ 5 files changed, 357 insertions(+), 30 deletions(-) create mode 100644 apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v9.0.yaml diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap index ff8058f4180..b786bfdbf67 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap @@ -7,7 +7,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` entryId: /color/5.0.2 name: color peerDependencyMeta: {} - resolvedEntryJsonId: 6 + resolvedEntryJsonId: 8 version: 5.0.2 displayText: 'Project: duplicate (duplicate-1/duplicate)' entryId: project:duplicate-1/duplicate @@ -25,7 +25,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` entryId: /color-string/2.1.2 name: color-string peerDependencyMeta: {} - resolvedEntryJsonId: 5 + resolvedEntryJsonId: 7 version: 2.1.2 displayText: 'Project: duplicate (duplicate-2/duplicate)' entryId: project:duplicate-2/duplicate @@ -43,7 +43,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` entryId: /has-symbols/1.0.2 name: has-symbols peerDependencyMeta: {} - resolvedEntryJsonId: 7 + resolvedEntryJsonId: 9 version: 1.0.2 - dependencyType: regular entryId: project:link-specifier/target-folder @@ -61,24 +61,61 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` rawEntryId: link-specifier/linker referrerJsonIds: [] transitivePeerDependencies: [] + - dependencies: + - dependencyType: regular + entryId: /address/1.2.2 + name: address + peerDependencyMeta: {} + resolvedEntryJsonId: 4 + version: 1.2.2 + - dependencyType: regular + entryId: /uri-js/4.4.1 + name: uri-js + peerDependencyMeta: {} + resolvedEntryJsonId: 11 + version: 4.4.1 + displayText: 'Project: pnpmfile-transforms' + entryId: project:pnpmfile-transforms + entryPackageName: pnpmfile-transforms + entryPackageVersion: '' + entrySuffix: '' + jsonId: 3 + kind: 1 + packageJsonFolderPath: pnpmfile-transforms + rawEntryId: pnpmfile-transforms + referrerJsonIds: [] + transitivePeerDependencies: [] + - dependencies: [] + displayText: address 1.2.2 + entryId: '' + entryPackageName: address + entryPackageVersion: 1.2.2 + entrySuffix: '' + jsonId: 4 + kind: 2 + packageJsonFolderPath: node_modules/.pnpm/address@1.2.2/node_modules/address + rawEntryId: /address/1.2.2 + referrerJsonIds: + - 3 + transitivePeerDependencies: [] - dependencies: - dependencyType: regular entryId: /color-name/2.0.2 name: color-name peerDependencyMeta: {} - resolvedEntryJsonId: 4 + resolvedEntryJsonId: 6 version: 2.0.2 displayText: color-convert 3.1.2 entryId: '' entryPackageName: color-convert entryPackageVersion: 3.1.2 entrySuffix: '' - jsonId: 3 + jsonId: 5 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color-convert@3.1.2/node_modules/color-convert rawEntryId: /color-convert/3.1.2 referrerJsonIds: - - 6 + - 8 transitivePeerDependencies: [] - dependencies: [] displayText: color-name 2.0.2 @@ -86,53 +123,53 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` entryPackageName: color-name entryPackageVersion: 2.0.2 entrySuffix: '' - jsonId: 4 + jsonId: 6 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color-name@2.0.2/node_modules/color-name rawEntryId: /color-name/2.0.2 referrerJsonIds: - - 3 - 5 + - 7 transitivePeerDependencies: [] - dependencies: - dependencyType: regular entryId: /color-name/2.0.2 name: color-name peerDependencyMeta: {} - resolvedEntryJsonId: 4 + resolvedEntryJsonId: 6 version: 2.0.2 displayText: color-string 2.1.2 entryId: '' entryPackageName: color-string entryPackageVersion: 2.1.2 entrySuffix: '' - jsonId: 5 + jsonId: 7 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color-string@2.1.2/node_modules/color-string rawEntryId: /color-string/2.1.2 referrerJsonIds: - 1 - - 6 + - 8 transitivePeerDependencies: [] - dependencies: - dependencyType: regular entryId: /color-convert/3.1.2 name: color-convert peerDependencyMeta: {} - resolvedEntryJsonId: 3 + resolvedEntryJsonId: 5 version: 3.1.2 - dependencyType: regular entryId: /color-string/2.1.2 name: color-string peerDependencyMeta: {} - resolvedEntryJsonId: 5 + resolvedEntryJsonId: 7 version: 2.1.2 displayText: color 5.0.2 entryId: '' entryPackageName: color entryPackageVersion: 5.0.2 entrySuffix: '' - jsonId: 6 + jsonId: 8 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color@5.0.2/node_modules/color rawEntryId: /color/5.0.2 @@ -150,13 +187,45 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` entryPackageName: has-symbols entryPackageVersion: 1.0.2 entrySuffix: '' - jsonId: 7 + jsonId: 9 kind: 2 packageJsonFolderPath: node_modules/.pnpm/has-symbols@1.0.2/node_modules/has-symbols rawEntryId: /has-symbols/1.0.2 referrerJsonIds: - 2 transitivePeerDependencies: [] + - dependencies: [] + displayText: punycode 2.3.1 + entryId: '' + entryPackageName: punycode + entryPackageVersion: 2.3.1 + entrySuffix: '' + jsonId: 10 + kind: 2 + packageJsonFolderPath: node_modules/.pnpm/punycode@2.3.1/node_modules/punycode + rawEntryId: /punycode/2.3.1 + referrerJsonIds: + - 11 + transitivePeerDependencies: [] + - dependencies: + - dependencyType: regular + entryId: /punycode/2.3.1 + name: punycode + peerDependencyMeta: {} + resolvedEntryJsonId: 10 + version: 2.3.1 + displayText: uri-js 4.4.1 + entryId: '' + entryPackageName: uri-js + entryPackageVersion: 4.4.1 + entrySuffix: '' + jsonId: 11 + kind: 2 + packageJsonFolderPath: node_modules/.pnpm/uri-js@4.4.1/node_modules/uri-js + rawEntryId: /uri-js/4.4.1 + referrerJsonIds: + - 3 + transitivePeerDependencies: [] workspace: pnpmLockfileFolder: '' pnpmLockfilePath: pnpm-lock.yaml diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap index ff8058f4180..b786bfdbf67 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap @@ -7,7 +7,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` entryId: /color/5.0.2 name: color peerDependencyMeta: {} - resolvedEntryJsonId: 6 + resolvedEntryJsonId: 8 version: 5.0.2 displayText: 'Project: duplicate (duplicate-1/duplicate)' entryId: project:duplicate-1/duplicate @@ -25,7 +25,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` entryId: /color-string/2.1.2 name: color-string peerDependencyMeta: {} - resolvedEntryJsonId: 5 + resolvedEntryJsonId: 7 version: 2.1.2 displayText: 'Project: duplicate (duplicate-2/duplicate)' entryId: project:duplicate-2/duplicate @@ -43,7 +43,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` entryId: /has-symbols/1.0.2 name: has-symbols peerDependencyMeta: {} - resolvedEntryJsonId: 7 + resolvedEntryJsonId: 9 version: 1.0.2 - dependencyType: regular entryId: project:link-specifier/target-folder @@ -61,24 +61,61 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` rawEntryId: link-specifier/linker referrerJsonIds: [] transitivePeerDependencies: [] + - dependencies: + - dependencyType: regular + entryId: /address/1.2.2 + name: address + peerDependencyMeta: {} + resolvedEntryJsonId: 4 + version: 1.2.2 + - dependencyType: regular + entryId: /uri-js/4.4.1 + name: uri-js + peerDependencyMeta: {} + resolvedEntryJsonId: 11 + version: 4.4.1 + displayText: 'Project: pnpmfile-transforms' + entryId: project:pnpmfile-transforms + entryPackageName: pnpmfile-transforms + entryPackageVersion: '' + entrySuffix: '' + jsonId: 3 + kind: 1 + packageJsonFolderPath: pnpmfile-transforms + rawEntryId: pnpmfile-transforms + referrerJsonIds: [] + transitivePeerDependencies: [] + - dependencies: [] + displayText: address 1.2.2 + entryId: '' + entryPackageName: address + entryPackageVersion: 1.2.2 + entrySuffix: '' + jsonId: 4 + kind: 2 + packageJsonFolderPath: node_modules/.pnpm/address@1.2.2/node_modules/address + rawEntryId: /address/1.2.2 + referrerJsonIds: + - 3 + transitivePeerDependencies: [] - dependencies: - dependencyType: regular entryId: /color-name/2.0.2 name: color-name peerDependencyMeta: {} - resolvedEntryJsonId: 4 + resolvedEntryJsonId: 6 version: 2.0.2 displayText: color-convert 3.1.2 entryId: '' entryPackageName: color-convert entryPackageVersion: 3.1.2 entrySuffix: '' - jsonId: 3 + jsonId: 5 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color-convert@3.1.2/node_modules/color-convert rawEntryId: /color-convert/3.1.2 referrerJsonIds: - - 6 + - 8 transitivePeerDependencies: [] - dependencies: [] displayText: color-name 2.0.2 @@ -86,53 +123,53 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` entryPackageName: color-name entryPackageVersion: 2.0.2 entrySuffix: '' - jsonId: 4 + jsonId: 6 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color-name@2.0.2/node_modules/color-name rawEntryId: /color-name/2.0.2 referrerJsonIds: - - 3 - 5 + - 7 transitivePeerDependencies: [] - dependencies: - dependencyType: regular entryId: /color-name/2.0.2 name: color-name peerDependencyMeta: {} - resolvedEntryJsonId: 4 + resolvedEntryJsonId: 6 version: 2.0.2 displayText: color-string 2.1.2 entryId: '' entryPackageName: color-string entryPackageVersion: 2.1.2 entrySuffix: '' - jsonId: 5 + jsonId: 7 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color-string@2.1.2/node_modules/color-string rawEntryId: /color-string/2.1.2 referrerJsonIds: - 1 - - 6 + - 8 transitivePeerDependencies: [] - dependencies: - dependencyType: regular entryId: /color-convert/3.1.2 name: color-convert peerDependencyMeta: {} - resolvedEntryJsonId: 3 + resolvedEntryJsonId: 5 version: 3.1.2 - dependencyType: regular entryId: /color-string/2.1.2 name: color-string peerDependencyMeta: {} - resolvedEntryJsonId: 5 + resolvedEntryJsonId: 7 version: 2.1.2 displayText: color 5.0.2 entryId: '' entryPackageName: color entryPackageVersion: 5.0.2 entrySuffix: '' - jsonId: 6 + jsonId: 8 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color@5.0.2/node_modules/color rawEntryId: /color/5.0.2 @@ -150,13 +187,45 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` entryPackageName: has-symbols entryPackageVersion: 1.0.2 entrySuffix: '' - jsonId: 7 + jsonId: 9 kind: 2 packageJsonFolderPath: node_modules/.pnpm/has-symbols@1.0.2/node_modules/has-symbols rawEntryId: /has-symbols/1.0.2 referrerJsonIds: - 2 transitivePeerDependencies: [] + - dependencies: [] + displayText: punycode 2.3.1 + entryId: '' + entryPackageName: punycode + entryPackageVersion: 2.3.1 + entrySuffix: '' + jsonId: 10 + kind: 2 + packageJsonFolderPath: node_modules/.pnpm/punycode@2.3.1/node_modules/punycode + rawEntryId: /punycode/2.3.1 + referrerJsonIds: + - 11 + transitivePeerDependencies: [] + - dependencies: + - dependencyType: regular + entryId: /punycode/2.3.1 + name: punycode + peerDependencyMeta: {} + resolvedEntryJsonId: 10 + version: 2.3.1 + displayText: uri-js 4.4.1 + entryId: '' + entryPackageName: uri-js + entryPackageVersion: 4.4.1 + entrySuffix: '' + jsonId: 11 + kind: 2 + packageJsonFolderPath: node_modules/.pnpm/uri-js@4.4.1/node_modules/uri-js + rawEntryId: /uri-js/4.4.1 + referrerJsonIds: + - 3 + transitivePeerDependencies: [] workspace: pnpmLockfileFolder: '' pnpmLockfilePath: pnpm-lock.yaml diff --git a/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v5.4.yaml b/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v5.4.yaml index 4bf1414f29b..b0c484355eb 100644 --- a/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v5.4.yaml +++ b/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v5.4.yaml @@ -21,7 +21,23 @@ importers: has-symbols: 1.0.2 target-folder: link:../target-folder + pnpmfile-transforms: + specifiers: + address: ^1.0.0 + uri-js: ^4.0.0 + dependencies: + address: 1.2.2 + uri-js: 4.4.1 + packages: + /address/1.2.2: + resolution: + { + integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== + } + engines: { node: '>= 10.0.0' } + dev: false + /color-convert/3.1.2: resolution: { @@ -70,3 +86,20 @@ packages: dependencies: target-folder: link:link-specifier/target-folder dev: false + + /punycode/2.3.1: + resolution: + { + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + } + engines: { node: '>=6' } + dev: false + + /uri-js/4.4.1: + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + } + dependencies: + punycode: 2.3.1 + dev: false diff --git a/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v6.0.yaml b/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v6.0.yaml index 47d4bd09ffe..32ee423cff7 100644 --- a/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v6.0.yaml +++ b/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v6.0.yaml @@ -26,7 +26,24 @@ importers: specifier: link:../target-folder version: link:../target-folder + pnpmfile-transforms: + dependencies: + address: + specifier: ^1.0.0 + version: 1.2.2 + uri-js: + specifier: ^4.0.0 + version: 4.4.1 + packages: + /address@1.2.2: + resolution: + { + integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== + } + engines: { node: '>= 10.0.0' } + dev: false + /color-convert@3.1.2: resolution: { @@ -75,3 +92,20 @@ packages: dependencies: target-folder: link:link-specifier/target-folder dev: false + + /punycode@2.3.1: + resolution: + { + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + } + engines: { node: '>=6' } + dev: false + + /uri-js@4.4.1: + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + } + dependencies: + punycode: 2.3.1 + dev: false diff --git a/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v9.0.yaml b/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v9.0.yaml new file mode 100644 index 00000000000..7b936d5c515 --- /dev/null +++ b/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v9.0.yaml @@ -0,0 +1,122 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +pnpmfileChecksum: sha256-tednqUPPat9y98NmpwR8320vxu2TlSor2aoYTxiNCdU= + +importers: + duplicate-1/duplicate: + dependencies: + color: + specifier: ^5.0.2 + version: 5.0.2 + + duplicate-2/duplicate: + dependencies: + color-string: + specifier: ^2.1.2 + version: 2.1.2 + + link-specifier/linker: + dependencies: + has-symbols: + specifier: 1.0.2 + version: 1.0.2 + target-folder: + specifier: link:../target-folder + version: link:../target-folder + + pnpmfile-transforms: + dependencies: + address: + specifier: ^1.0.0 + version: 1.2.2 + uri-js: + specifier: ^4.0.0 + version: 4.4.1 + +packages: + address@1.2.2: + resolution: + { + integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== + } + engines: { node: '>= 10.0.0' } + + color-convert@3.1.2: + resolution: + { + integrity: sha512-UNqkvCDXstVck3kdowtOTWROIJQwafjOfXSmddoDrXo4cewMKmusCeF22Q24zvjR8nwWib/3S/dfyzPItPEiJg== + } + engines: { node: '>=14.6' } + + color-name@2.0.2: + resolution: + { + integrity: sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A== + } + engines: { node: '>=12.20' } + + color-string@2.1.2: + resolution: + { + integrity: sha512-RxmjYxbWemV9gKu4zPgiZagUxbH3RQpEIO77XoSSX0ivgABDZ+h8Zuash/EMFLTI4N9QgFPOJ6JQpPZKFxa+dA== + } + engines: { node: '>=18' } + + color@5.0.2: + resolution: + { + integrity: sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA== + } + engines: { node: '>=18' } + + has-symbols@1.0.2: + resolution: + { + integrity: sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + } + engines: { node: '>= 0.4' } + + punycode@2.3.1: + resolution: + { + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + } + engines: { node: '>=6' } + + uri-js@4.4.1: + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + } + +snapshots: + address@1.2.2: {} + + color-convert@3.1.2: + dependencies: + color-name: 2.0.2 + + color-name@2.0.2: {} + + color-string@2.1.2: + dependencies: + color-name: 2.0.2 + + color@5.0.2: + dependencies: + color-convert: 3.1.2 + color-string: 2.1.2 + + has-symbols@1.0.2: + dependencies: + target-folder: link:link-specifier/target-folder + + punycode@2.3.1: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 From 76fd975214edd848661df14ed9d17b72861e01b9 Mon Sep 17 00:00:00 2001 From: Pete Gonzalez <4673363+octogonz@users.noreply.github.com> Date: Thu, 25 Sep 2025 20:28:05 -0700 Subject: [PATCH 02/15] Update lfxGraphLoader.ts to support v9.0 lockfile format --- .../src/graph/lfxGraphLoader.ts | 108 +++++--- .../lfxGraph-edge-cases-v9.0.test.ts.snap | 235 ++++++++++++++++++ .../src/graph/test/graphTestHelpers.ts | 2 +- .../test/lfxGraph-edge-cases-v5.4.test.ts | 2 +- .../test/lfxGraph-edge-cases-v6.0.test.ts | 2 +- .../test/lfxGraph-edge-cases-v9.0.test.ts | 24 ++ .../lfxGraph-website-sample-1-v5.4.test.ts | 2 +- .../lfxGraph-website-sample-1-v6.0.test.ts | 2 +- 8 files changed, 334 insertions(+), 43 deletions(-) create mode 100644 apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap create mode 100644 apps/lockfile-explorer/src/graph/test/lfxGraph-edge-cases-v9.0.test.ts diff --git a/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts b/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts index ba421861c21..bb1c0443c6e 100644 --- a/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts +++ b/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts @@ -75,11 +75,13 @@ function createPackageLockfileDependency(options: { } else { // Version 5.4: /@rushstack/m/1.0.0: // Version 6.0: /@rushstack/m@1.0.0: + // Version 9.0: @rushstack/m@1.0.0: // // Version 5.4: /@rushstack/j/1.0.0_@rushstack+n@2.0.0 // Version 6.0: /@rushstack/j@1.0.0(@rushstack/n@2.0.0) - const versionDelimiter: string = pnpmLockfileVersion === 54 ? '/' : '@'; - result.entryId = '/' + result.name + versionDelimiter + result.version; + // Version 9.0: @rushstack/j@1.0.0(@rushstack/n@2.0.0) + const versionDelimiter: string = pnpmLockfileVersion < 60 ? '/' : '@'; + result.entryId = (pnpmLockfileVersion < 90 ? '/' : '') + result.name + versionDelimiter + result.version; } return new LfxGraphDependency(result); } @@ -253,13 +255,24 @@ function createPackageLockfileEntry(options: { result.displayText = rawEntryId; - if (!rawEntryId.startsWith('/')) { - throw new Error('Expecting leading "/" in path: ' + JSON.stringify(rawEntryId)); + let slashlessRawEntryId: string; + + if (pnpmLockfileVersion >= 90) { + // The leading slash is omitted starting in V9.0 + if (rawEntryId.startsWith('/')) { + throw new Error('Not expecting leading "/" in path: ' + JSON.stringify(rawEntryId)); + } + slashlessRawEntryId = rawEntryId; + } else { + if (!rawEntryId.startsWith('/')) { + throw new Error('Expecting leading "/" in path: ' + JSON.stringify(rawEntryId)); + } + slashlessRawEntryId = rawEntryId.substring(1); } let dotPnpmSubfolder: string; - if (pnpmLockfileVersion === 54) { + if (pnpmLockfileVersion < 60) { const lastSlashIndex: number = rawEntryId.lastIndexOf('/'); if (lastSlashIndex < 0) { throw new Error('Expecting "/" in path: ' + JSON.stringify(rawEntryId)); @@ -292,31 +305,32 @@ function createPackageLockfileEntry(options: { (result.entrySuffix ? `_${result.entrySuffix}` : ''); } else { // Example inputs: - // /@rushstack/eslint-config@3.0.1 - // /@rushstack/l@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) + // @rushstack/eslint-config@3.0.1 + // @rushstack/l@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) let versionAtSignIndex: number; - if (rawEntryId.startsWith('/@')) { - versionAtSignIndex = rawEntryId.indexOf('@', 2); + if (slashlessRawEntryId.startsWith('@')) { + versionAtSignIndex = slashlessRawEntryId.indexOf('@', 1); } else { - versionAtSignIndex = rawEntryId.indexOf('@', 1); + versionAtSignIndex = slashlessRawEntryId.indexOf('@'); } - const packageName: string = rawEntryId.substring(1, versionAtSignIndex); + + const packageName: string = slashlessRawEntryId.substring(0, versionAtSignIndex); result.entryPackageName = packageName; - const leftParenIndex: number = rawEntryId.indexOf('(', versionAtSignIndex); + const leftParenIndex: number = slashlessRawEntryId.indexOf('(', versionAtSignIndex); if (leftParenIndex < 0) { - const version: string = rawEntryId.substring(versionAtSignIndex + 1); + const version: string = slashlessRawEntryId.substring(versionAtSignIndex + 1); result.entryPackageVersion = version; - // /@rushstack/eslint-config@3.0.1 + // @rushstack/eslint-config@3.0.1 // --> @rushstack/eslint-config 3.0.1 result.displayText = packageName + ' ' + version; } else { - const version: string = rawEntryId.substring(versionAtSignIndex + 1, leftParenIndex); + const version: string = slashlessRawEntryId.substring(versionAtSignIndex + 1, leftParenIndex); result.entryPackageVersion = version; // "(@rushstack/m@1.0.0)(@rushstack/n@2.0.0)" - let suffix: string = rawEntryId.substring(leftParenIndex); + let suffix: string = slashlessRawEntryId.substring(leftParenIndex); // Rewrite to: // "@rushstack/m@1.0.0; @rushstack/n@2.0.0" @@ -325,17 +339,16 @@ function createPackageLockfileEntry(options: { suffix = Text.replaceAll(suffix, ')', ''); result.entrySuffix = suffix; - // /@rushstack/l@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) + // @rushstack/l@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) // --> @rushstack/l 1.0.0 [@rushstack/m@1.0.0; @rushstack/n@2.0.0] result.displayText = packageName + ' ' + version + ' [' + suffix + ']'; } - // Example: /@rushstack/l@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) + // Example: @rushstack/l@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) // --> @rushstack+l@1.0.0_@rushstack+m@1.0.0_@rushstack+n@2.0.0 // @rushstack/l 1.0.0 (@rushstack/m@1.0.0)(@rushstack/n@2.0.0) - dotPnpmSubfolder = rawEntryId.substring(1); - dotPnpmSubfolder = Text.replaceAll(dotPnpmSubfolder, '/', '+'); + dotPnpmSubfolder = Text.replaceAll(slashlessRawEntryId, '/', '+'); dotPnpmSubfolder = Text.replaceAll(dotPnpmSubfolder, ')(', '_'); dotPnpmSubfolder = Text.replaceAll(dotPnpmSubfolder, '(', '_'); dotPnpmSubfolder = Text.replaceAll(dotPnpmSubfolder, ')', ''); @@ -381,10 +394,10 @@ export function generateLockfileGraph(lockfileJson: unknown, workspace: IJsonLfx case '6.0': pnpmLockfileVersion = 60; break; - //case '9': - //case '9.0': - // pnpmLockfileVersion = 90; - // break; + case '9': + case '9.0': + pnpmLockfileVersion = 90; + break; default: throw new Error('Unsupported PNPM lockfile version ' + JSON.stringify(lockfile.lockfileVersion)); } @@ -424,7 +437,7 @@ export function generateLockfileGraph(lockfileJson: unknown, workspace: IJsonLfx pnpmLockfileVersion }); - if (pnpmLockfileVersion === 54) { + if (pnpmLockfileVersion < 60) { const lockfile54: lockfileTypes.LockfileObject = lockfileJson as lockfileTypes.LockfileObject; const importerValue: lockfileTypes.ProjectSnapshot = lockfile54.importers[importerKey as pnpmTypes.ProjectId]; @@ -456,21 +469,40 @@ export function generateLockfileGraph(lockfileJson: unknown, workspace: IJsonLfx } } - const allPackages: LfxGraphEntry[] = []; - if (lockfile.packages) { - for (const [dependencyKey, dependencyValue] of Object.entries(lockfile.packages ?? {})) { - // const normalizedPath = new Path(dependencyKey).makeAbsolute('/').toString(); + if (pnpmLockfileVersion < 90) { + if (lockfile.packages) { + for (const [dependencyKey, dependencyValue] of Object.entries(lockfile.packages)) { + // const normalizedPath = new Path(dependencyKey).makeAbsolute('/').toString(); - const currEntry: LfxGraphEntry = createPackageLockfileEntry({ - rawEntryId: dependencyKey, - rawYamlData: dependencyValue as lockfileTypes.PackageSnapshot, - workspace, - pnpmLockfileVersion - }); + const currEntry: LfxGraphEntry = createPackageLockfileEntry({ + rawEntryId: dependencyKey, + rawYamlData: dependencyValue as lockfileTypes.PackageSnapshot, + workspace, + pnpmLockfileVersion + }); - allPackages.push(currEntry); - allEntries.push(currEntry); - allEntriesById.set(dependencyKey, currEntry); + allEntries.push(currEntry); + allEntriesById.set(dependencyKey, currEntry); + } + } + } else { + // In v9.0 format, the dependency graph for non-workspace packages is found under "snapshots" not "packages". + // (The "packages" section now stores other fields that are unrelated to the graph itself.) + const lockfile90: lockfileTypes.LockfileFile = lockfileJson as lockfileTypes.LockfileFile; + if (lockfile90.snapshots) { + for (const [dependencyKey, dependencyValue] of Object.entries(lockfile90.snapshots)) { + // const normalizedPath = new Path(dependencyKey).makeAbsolute('/').toString(); + + const currEntry: LfxGraphEntry = createPackageLockfileEntry({ + rawEntryId: dependencyKey, + rawYamlData: dependencyValue as lockfileTypes.PackageSnapshot, + workspace, + pnpmLockfileVersion + }); + + allEntries.push(currEntry); + allEntriesById.set(dependencyKey, currEntry); + } } } diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap new file mode 100644 index 00000000000..0ad9a693bf5 --- /dev/null +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap @@ -0,0 +1,235 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` +"entries: + - dependencies: + - dependencyType: regular + entryId: color@5.0.2 + name: color + peerDependencyMeta: {} + resolvedEntryJsonId: 8 + version: 5.0.2 + displayText: 'Project: duplicate (duplicate-1/duplicate)' + entryId: project:duplicate-1/duplicate + entryPackageName: duplicate (duplicate-1/duplicate) + entryPackageVersion: '' + entrySuffix: '' + jsonId: 0 + kind: 1 + packageJsonFolderPath: duplicate-1/duplicate + rawEntryId: duplicate-1/duplicate + referrerJsonIds: [] + transitivePeerDependencies: [] + - dependencies: + - dependencyType: regular + entryId: color-string@2.1.2 + name: color-string + peerDependencyMeta: {} + resolvedEntryJsonId: 7 + version: 2.1.2 + displayText: 'Project: duplicate (duplicate-2/duplicate)' + entryId: project:duplicate-2/duplicate + entryPackageName: duplicate (duplicate-2/duplicate) + entryPackageVersion: '' + entrySuffix: '' + jsonId: 1 + kind: 1 + packageJsonFolderPath: duplicate-2/duplicate + rawEntryId: duplicate-2/duplicate + referrerJsonIds: [] + transitivePeerDependencies: [] + - dependencies: + - dependencyType: regular + entryId: has-symbols@1.0.2 + name: has-symbols + peerDependencyMeta: {} + resolvedEntryJsonId: 9 + version: 1.0.2 + - dependencyType: regular + entryId: project:link-specifier/target-folder + name: target-folder + peerDependencyMeta: {} + version: link:../target-folder + displayText: 'Project: linker' + entryId: project:link-specifier/linker + entryPackageName: linker + entryPackageVersion: '' + entrySuffix: '' + jsonId: 2 + kind: 1 + packageJsonFolderPath: link-specifier/linker + rawEntryId: link-specifier/linker + referrerJsonIds: [] + transitivePeerDependencies: [] + - dependencies: + - dependencyType: regular + entryId: address@1.2.2 + name: address + peerDependencyMeta: {} + resolvedEntryJsonId: 4 + version: 1.2.2 + - dependencyType: regular + entryId: uri-js@4.4.1 + name: uri-js + peerDependencyMeta: {} + resolvedEntryJsonId: 11 + version: 4.4.1 + displayText: 'Project: pnpmfile-transforms' + entryId: project:pnpmfile-transforms + entryPackageName: pnpmfile-transforms + entryPackageVersion: '' + entrySuffix: '' + jsonId: 3 + kind: 1 + packageJsonFolderPath: pnpmfile-transforms + rawEntryId: pnpmfile-transforms + referrerJsonIds: [] + transitivePeerDependencies: [] + - dependencies: [] + displayText: address 1.2.2 + entryId: '' + entryPackageName: address + entryPackageVersion: 1.2.2 + entrySuffix: '' + jsonId: 4 + kind: 2 + packageJsonFolderPath: node_modules/.pnpm/address@1.2.2/node_modules/address + rawEntryId: address@1.2.2 + referrerJsonIds: + - 3 + transitivePeerDependencies: [] + - dependencies: + - dependencyType: regular + entryId: color-name@2.0.2 + name: color-name + peerDependencyMeta: {} + resolvedEntryJsonId: 6 + version: 2.0.2 + displayText: color-convert 3.1.2 + entryId: '' + entryPackageName: color-convert + entryPackageVersion: 3.1.2 + entrySuffix: '' + jsonId: 5 + kind: 2 + packageJsonFolderPath: node_modules/.pnpm/color-convert@3.1.2/node_modules/color-convert + rawEntryId: color-convert@3.1.2 + referrerJsonIds: + - 8 + transitivePeerDependencies: [] + - dependencies: [] + displayText: color-name 2.0.2 + entryId: '' + entryPackageName: color-name + entryPackageVersion: 2.0.2 + entrySuffix: '' + jsonId: 6 + kind: 2 + packageJsonFolderPath: node_modules/.pnpm/color-name@2.0.2/node_modules/color-name + rawEntryId: color-name@2.0.2 + referrerJsonIds: + - 5 + - 7 + transitivePeerDependencies: [] + - dependencies: + - dependencyType: regular + entryId: color-name@2.0.2 + name: color-name + peerDependencyMeta: {} + resolvedEntryJsonId: 6 + version: 2.0.2 + displayText: color-string 2.1.2 + entryId: '' + entryPackageName: color-string + entryPackageVersion: 2.1.2 + entrySuffix: '' + jsonId: 7 + kind: 2 + packageJsonFolderPath: node_modules/.pnpm/color-string@2.1.2/node_modules/color-string + rawEntryId: color-string@2.1.2 + referrerJsonIds: + - 1 + - 8 + transitivePeerDependencies: [] + - dependencies: + - dependencyType: regular + entryId: color-convert@3.1.2 + name: color-convert + peerDependencyMeta: {} + resolvedEntryJsonId: 5 + version: 3.1.2 + - dependencyType: regular + entryId: color-string@2.1.2 + name: color-string + peerDependencyMeta: {} + resolvedEntryJsonId: 7 + version: 2.1.2 + displayText: color 5.0.2 + entryId: '' + entryPackageName: color + entryPackageVersion: 5.0.2 + entrySuffix: '' + jsonId: 8 + kind: 2 + packageJsonFolderPath: node_modules/.pnpm/color@5.0.2/node_modules/color + rawEntryId: color@5.0.2 + referrerJsonIds: + - 0 + transitivePeerDependencies: [] + - dependencies: + - dependencyType: regular + entryId: '' + name: target-folder + peerDependencyMeta: {} + version: link:link-specifier/target-folder + displayText: has-symbols 1.0.2 + entryId: '' + entryPackageName: has-symbols + entryPackageVersion: 1.0.2 + entrySuffix: '' + jsonId: 9 + kind: 2 + packageJsonFolderPath: node_modules/.pnpm/has-symbols@1.0.2/node_modules/has-symbols + rawEntryId: has-symbols@1.0.2 + referrerJsonIds: + - 2 + transitivePeerDependencies: [] + - dependencies: [] + displayText: punycode 2.3.1 + entryId: '' + entryPackageName: punycode + entryPackageVersion: 2.3.1 + entrySuffix: '' + jsonId: 10 + kind: 2 + packageJsonFolderPath: node_modules/.pnpm/punycode@2.3.1/node_modules/punycode + rawEntryId: punycode@2.3.1 + referrerJsonIds: + - 11 + transitivePeerDependencies: [] + - dependencies: + - dependencyType: regular + entryId: punycode@2.3.1 + name: punycode + peerDependencyMeta: {} + resolvedEntryJsonId: 10 + version: 2.3.1 + displayText: uri-js 4.4.1 + entryId: '' + entryPackageName: uri-js + entryPackageVersion: 4.4.1 + entrySuffix: '' + jsonId: 11 + kind: 2 + packageJsonFolderPath: node_modules/.pnpm/uri-js@4.4.1/node_modules/uri-js + rawEntryId: uri-js@4.4.1 + referrerJsonIds: + - 3 + transitivePeerDependencies: [] +workspace: + pnpmLockfileFolder: '' + pnpmLockfilePath: pnpm-lock.yaml + pnpmfilePath: .pnpmfile.cjs + workspaceRootFullPath: /repo +" +`; diff --git a/apps/lockfile-explorer/src/graph/test/graphTestHelpers.ts b/apps/lockfile-explorer/src/graph/test/graphTestHelpers.ts index 74d99eb35de..b96b140669c 100644 --- a/apps/lockfile-explorer/src/graph/test/graphTestHelpers.ts +++ b/apps/lockfile-explorer/src/graph/test/graphTestHelpers.ts @@ -15,7 +15,7 @@ import * as lfxGraphLoader from '../lfxGraphLoader'; const FIXTURES_FOLDER: string = path.resolve(__dirname, '../../../src/graph/test/fixtures/'); -export async function loadAndSerializeLFxGraphAsync(options: { +export async function loadAndSerializeLfxGraphAsync(options: { workspace: IJsonLfxWorkspace; lockfilePathUnderFixtures: string; }): Promise { diff --git a/apps/lockfile-explorer/src/graph/test/lfxGraph-edge-cases-v5.4.test.ts b/apps/lockfile-explorer/src/graph/test/lfxGraph-edge-cases-v5.4.test.ts index 2aa4a13c230..be8ce686c4a 100644 --- a/apps/lockfile-explorer/src/graph/test/lfxGraph-edge-cases-v5.4.test.ts +++ b/apps/lockfile-explorer/src/graph/test/lfxGraph-edge-cases-v5.4.test.ts @@ -15,7 +15,7 @@ export const workspace: IJsonLfxWorkspace = { describe('lfxGraph-edge-cases-v5.4', () => { it('loads a workspace', async () => { - const serializedYaml: string = await graphTestHelpers.loadAndSerializeLFxGraphAsync({ + const serializedYaml: string = await graphTestHelpers.loadAndSerializeLfxGraphAsync({ lockfilePathUnderFixtures: '/edge-cases/pnpm-lock-v5.4.yaml', workspace: workspace }); diff --git a/apps/lockfile-explorer/src/graph/test/lfxGraph-edge-cases-v6.0.test.ts b/apps/lockfile-explorer/src/graph/test/lfxGraph-edge-cases-v6.0.test.ts index 2aa4a13c230..be8ce686c4a 100644 --- a/apps/lockfile-explorer/src/graph/test/lfxGraph-edge-cases-v6.0.test.ts +++ b/apps/lockfile-explorer/src/graph/test/lfxGraph-edge-cases-v6.0.test.ts @@ -15,7 +15,7 @@ export const workspace: IJsonLfxWorkspace = { describe('lfxGraph-edge-cases-v5.4', () => { it('loads a workspace', async () => { - const serializedYaml: string = await graphTestHelpers.loadAndSerializeLFxGraphAsync({ + const serializedYaml: string = await graphTestHelpers.loadAndSerializeLfxGraphAsync({ lockfilePathUnderFixtures: '/edge-cases/pnpm-lock-v5.4.yaml', workspace: workspace }); diff --git a/apps/lockfile-explorer/src/graph/test/lfxGraph-edge-cases-v9.0.test.ts b/apps/lockfile-explorer/src/graph/test/lfxGraph-edge-cases-v9.0.test.ts new file mode 100644 index 00000000000..2e27262e8c9 --- /dev/null +++ b/apps/lockfile-explorer/src/graph/test/lfxGraph-edge-cases-v9.0.test.ts @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See LICENSE in the project root for license information. + +import type { IJsonLfxWorkspace } from '../../../build/lfx-shared'; + +import * as graphTestHelpers from './graphTestHelpers'; + +export const workspace: IJsonLfxWorkspace = { + workspaceRootFullPath: '/repo', + pnpmLockfilePath: 'pnpm-lock.yaml', + pnpmLockfileFolder: '', + pnpmfilePath: '.pnpmfile.cjs', + rushConfig: undefined +}; + +describe('lfxGraph-edge-cases-v9.0', () => { + it('loads a workspace', async () => { + const serializedYaml: string = await graphTestHelpers.loadAndSerializeLfxGraphAsync({ + lockfilePathUnderFixtures: '/edge-cases/pnpm-lock-v9.0.yaml', + workspace: workspace + }); + expect(serializedYaml).toMatchSnapshot(); + }); +}); diff --git a/apps/lockfile-explorer/src/graph/test/lfxGraph-website-sample-1-v5.4.test.ts b/apps/lockfile-explorer/src/graph/test/lfxGraph-website-sample-1-v5.4.test.ts index 7c74129e631..874661d6d19 100644 --- a/apps/lockfile-explorer/src/graph/test/lfxGraph-website-sample-1-v5.4.test.ts +++ b/apps/lockfile-explorer/src/graph/test/lfxGraph-website-sample-1-v5.4.test.ts @@ -19,7 +19,7 @@ export const workspace: IJsonLfxWorkspace = { describe('lfxGraph-website-sample-1-v5.4', () => { it('loads a workspace', async () => { - const serializedYaml: string = await graphTestHelpers.loadAndSerializeLFxGraphAsync({ + const serializedYaml: string = await graphTestHelpers.loadAndSerializeLfxGraphAsync({ lockfilePathUnderFixtures: '/website-sample-1/pnpm-lock-v5.4-rush.yaml', workspace: workspace }); diff --git a/apps/lockfile-explorer/src/graph/test/lfxGraph-website-sample-1-v6.0.test.ts b/apps/lockfile-explorer/src/graph/test/lfxGraph-website-sample-1-v6.0.test.ts index 0cf7e0c2c25..12503e64921 100644 --- a/apps/lockfile-explorer/src/graph/test/lfxGraph-website-sample-1-v6.0.test.ts +++ b/apps/lockfile-explorer/src/graph/test/lfxGraph-website-sample-1-v6.0.test.ts @@ -19,7 +19,7 @@ export const workspace: IJsonLfxWorkspace = { describe('lfxGraph-website-sample-1-v6.0', () => { it('loads a workspace', async () => { - const serializedYaml: string = await graphTestHelpers.loadAndSerializeLFxGraphAsync({ + const serializedYaml: string = await graphTestHelpers.loadAndSerializeLfxGraphAsync({ lockfilePathUnderFixtures: '/website-sample-1/pnpm-lock-v6.0-rush.yaml', workspace: workspace }); From afa387e32c57d9e09d07b507c510c252630ae8a6 Mon Sep 17 00:00:00 2001 From: Pete Gonzalez <4673363+octogonz@users.noreply.github.com> Date: Thu, 25 Sep 2025 20:47:54 -0700 Subject: [PATCH 03/15] Add lfxGraph-website-sample-1-v9.0.test.ts and convert its lockfile to use Rush --- ...fxGraph-website-sample-1-v9.0.test.ts.snap | 250 ++++++++++++++++++ ...9.0-pnpm.yaml => pnpm-lock-v9.0-rush.yaml} | 16 +- .../lfxGraph-website-sample-1-v9.0.test.ts | 30 +++ 3 files changed, 289 insertions(+), 7 deletions(-) create mode 100644 apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap rename apps/lockfile-explorer/src/graph/test/fixtures/website-sample-1/{pnpm-lock-v9.0-pnpm.yaml => pnpm-lock-v9.0-rush.yaml} (93%) create mode 100644 apps/lockfile-explorer/src/graph/test/lfxGraph-website-sample-1-v9.0.test.ts diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap new file mode 100644 index 00000000000..d4acc80cb9c --- /dev/null +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap @@ -0,0 +1,250 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` +"entries: + - dependencies: + - dependencyType: regular + entryId: project:projects/d + name: '@rushstack/d' + peerDependencyMeta: {} + resolvedEntryJsonId: 3 + version: link:../d + displayText: 'Project: a' + entryId: project:projects/a + entryPackageName: a + entryPackageVersion: '' + entrySuffix: '' + jsonId: 0 + kind: 1 + packageJsonFolderPath: projects/a + rawEntryId: ../../projects/a + referrerJsonIds: [] + transitivePeerDependencies: [] + - dependencies: + - dependencyType: regular + entryId: project:projects/d + name: '@rushstack/d' + peerDependencyMeta: {} + resolvedEntryJsonId: 3 + version: link:../d + - dependencyType: regular + entryId: '@rushstack/n@2.0.0' + name: '@rushstack/n' + peerDependencyMeta: {} + resolvedEntryJsonId: 9 + version: 2.0.0 + displayText: 'Project: b' + entryId: project:projects/b + entryPackageName: b + entryPackageVersion: '' + entrySuffix: '' + jsonId: 1 + kind: 1 + packageJsonFolderPath: projects/b + rawEntryId: ../../projects/b + referrerJsonIds: [] + transitivePeerDependencies: [] + - dependencies: + - dependencyType: regular + entryId: project:projects/e + name: '@rushstack/e' + peerDependencyMeta: {} + resolvedEntryJsonId: 4 + version: link:../e + - dependencyType: regular + entryId: '@rushstack/k@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0)' + name: '@rushstack/k' + peerDependencyMeta: {} + resolvedEntryJsonId: 6 + version: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) + - dependencyType: regular + entryId: '@rushstack/m@1.0.0' + name: '@rushstack/m' + peerDependencyMeta: {} + resolvedEntryJsonId: 8 + version: 1.0.0 + displayText: 'Project: c' + entryId: project:projects/c + entryPackageName: c + entryPackageVersion: '' + entrySuffix: '' + jsonId: 2 + kind: 1 + packageJsonFolderPath: projects/c + rawEntryId: ../../projects/c + referrerJsonIds: [] + transitivePeerDependencies: [] + - dependencies: + - dependencyType: regular + entryId: project:projects/e + name: '@rushstack/e' + peerDependencyMeta: {} + resolvedEntryJsonId: 4 + version: link:../e + - dependencyType: regular + entryId: '@rushstack/j@1.0.0(@rushstack/n@2.0.0)' + name: '@rushstack/j' + peerDependencyMeta: {} + resolvedEntryJsonId: 5 + version: 1.0.0(@rushstack/n@2.0.0) + - dependencyType: regular + entryId: '@rushstack/n@2.0.0' + name: '@rushstack/n' + peerDependencyMeta: {} + resolvedEntryJsonId: 9 + version: 2.0.0 + displayText: 'Project: d' + entryId: project:projects/d + entryPackageName: d + entryPackageVersion: '' + entrySuffix: '' + jsonId: 3 + kind: 1 + packageJsonFolderPath: projects/d + rawEntryId: ../../projects/d + referrerJsonIds: + - 0 + - 1 + transitivePeerDependencies: [] + - dependencies: + - dependencyType: regular + entryId: '@rushstack/n@3.0.0' + name: '@rushstack/n' + peerDependencyMeta: {} + resolvedEntryJsonId: 10 + version: 3.0.0 + displayText: 'Project: e' + entryId: project:projects/e + entryPackageName: e + entryPackageVersion: '' + entrySuffix: '' + jsonId: 4 + kind: 1 + packageJsonFolderPath: projects/e + rawEntryId: ../../projects/e + referrerJsonIds: + - 2 + - 3 + transitivePeerDependencies: [] + - dependencies: + - dependencyType: regular + entryId: '@rushstack/k@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0)' + name: '@rushstack/k' + peerDependencyMeta: {} + resolvedEntryJsonId: 6 + version: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) + - dependencyType: regular + entryId: '@rushstack/m@1.0.0' + name: '@rushstack/m' + peerDependencyMeta: {} + resolvedEntryJsonId: 8 + version: 1.0.0 + displayText: '@rushstack/j 1.0.0 [@rushstack/n@2.0.0]' + entryId: '' + entryPackageName: '@rushstack/j' + entryPackageVersion: 1.0.0 + entrySuffix: '@rushstack/n@2.0.0' + jsonId: 5 + kind: 2 + packageJsonFolderPath: common/temp/node_modules/.pnpm/@rushstack+j@1.0.0_@rushstack+n@2.0.0/node_modules/@rushstack/j + rawEntryId: '@rushstack/j@1.0.0(@rushstack/n@2.0.0)' + referrerJsonIds: + - 3 + transitivePeerDependencies: + - '@rushstack/n' + - dependencies: + - dependencyType: regular + entryId: '@rushstack/l@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0)' + name: '@rushstack/l' + peerDependencyMeta: {} + resolvedEntryJsonId: 7 + version: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) + displayText: '@rushstack/k 1.0.0 [@rushstack/m@1.0.0; @rushstack/n@2.0.0]' + entryId: '' + entryPackageName: '@rushstack/k' + entryPackageVersion: 1.0.0 + entrySuffix: '@rushstack/m@1.0.0; @rushstack/n@2.0.0' + jsonId: 6 + kind: 2 + packageJsonFolderPath: >- + common/temp/node_modules/.pnpm/@rushstack+k@1.0.0_@rushstack+m@1.0.0_@rushstack+n@2.0.0/node_modules/@rushstack/k + rawEntryId: '@rushstack/k@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0)' + referrerJsonIds: + - 2 + - 5 + transitivePeerDependencies: + - '@rushstack/m' + - '@rushstack/n' + - dependencies: + - dependencyType: regular + entryId: '@rushstack/m@1.0.0' + name: '@rushstack/m' + peerDependencyMeta: {} + resolvedEntryJsonId: 8 + version: 1.0.0 + displayText: '@rushstack/l 1.0.0 [@rushstack/m@1.0.0; @rushstack/n@2.0.0]' + entryId: '' + entryPackageName: '@rushstack/l' + entryPackageVersion: 1.0.0 + entrySuffix: '@rushstack/m@1.0.0; @rushstack/n@2.0.0' + jsonId: 7 + kind: 2 + packageJsonFolderPath: >- + common/temp/node_modules/.pnpm/@rushstack+l@1.0.0_@rushstack+m@1.0.0_@rushstack+n@2.0.0/node_modules/@rushstack/l + rawEntryId: '@rushstack/l@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0)' + referrerJsonIds: + - 6 + transitivePeerDependencies: [] + - dependencies: [] + displayText: '@rushstack/m 1.0.0' + entryId: '' + entryPackageName: '@rushstack/m' + entryPackageVersion: 1.0.0 + entrySuffix: '' + jsonId: 8 + kind: 2 + packageJsonFolderPath: common/temp/node_modules/.pnpm/@rushstack+m@1.0.0/node_modules/@rushstack/m + rawEntryId: '@rushstack/m@1.0.0' + referrerJsonIds: + - 2 + - 5 + - 7 + transitivePeerDependencies: [] + - dependencies: [] + displayText: '@rushstack/n 2.0.0' + entryId: '' + entryPackageName: '@rushstack/n' + entryPackageVersion: 2.0.0 + entrySuffix: '' + jsonId: 9 + kind: 2 + packageJsonFolderPath: common/temp/node_modules/.pnpm/@rushstack+n@2.0.0/node_modules/@rushstack/n + rawEntryId: '@rushstack/n@2.0.0' + referrerJsonIds: + - 1 + - 3 + transitivePeerDependencies: [] + - dependencies: [] + displayText: '@rushstack/n 3.0.0' + entryId: '' + entryPackageName: '@rushstack/n' + entryPackageVersion: 3.0.0 + entrySuffix: '' + jsonId: 10 + kind: 2 + packageJsonFolderPath: common/temp/node_modules/.pnpm/@rushstack+n@3.0.0/node_modules/@rushstack/n + rawEntryId: '@rushstack/n@3.0.0' + referrerJsonIds: + - 4 + transitivePeerDependencies: [] +workspace: + pnpmLockfileFolder: common/temp + pnpmLockfilePath: common/temp/pnpm-lock.yaml + pnpmfilePath: common/temp/.pnpmfile.cjs + rushConfig: + rushPnpmfilePath: common/config/.pnpmcfile.cjs + rushVersion: 5.158.1 + subspaceName: '' + workspaceRootFullPath: /repo +" +`; diff --git a/apps/lockfile-explorer/src/graph/test/fixtures/website-sample-1/pnpm-lock-v9.0-pnpm.yaml b/apps/lockfile-explorer/src/graph/test/fixtures/website-sample-1/pnpm-lock-v9.0-rush.yaml similarity index 93% rename from apps/lockfile-explorer/src/graph/test/fixtures/website-sample-1/pnpm-lock-v9.0-pnpm.yaml rename to apps/lockfile-explorer/src/graph/test/fixtures/website-sample-1/pnpm-lock-v9.0-rush.yaml index 60de289e509..3318a2a7837 100644 --- a/apps/lockfile-explorer/src/graph/test/fixtures/website-sample-1/pnpm-lock-v9.0-pnpm.yaml +++ b/apps/lockfile-explorer/src/graph/test/fixtures/website-sample-1/pnpm-lock-v9.0-rush.yaml @@ -1,19 +1,21 @@ lockfileVersion: '9.0' settings: - autoInstallPeers: true + autoInstallPeers: false excludeLinksFromLockfile: false -pnpmfileChecksum: sha256-6Cq2BFB3826lbTciEnsPowoZ1qvFZeM4wkoGwobxneY= +pnpmfileChecksum: sha256-La8sfCMI7irxJPTW6u4mJb4vNiyLrXeEbKaXv5G3dL0= importers: - projects/a: + .: {} + + ../../projects/a: dependencies: '@rushstack/d': specifier: workspace:* version: link:../d - projects/b: + ../../projects/b: dependencies: '@rushstack/d': specifier: workspace:* @@ -22,7 +24,7 @@ importers: specifier: ^2.0.0 version: 2.0.0 - projects/c: + ../../projects/c: dependencies: '@rushstack/e': specifier: workspace:* @@ -34,7 +36,7 @@ importers: specifier: ~1.0.0 version: 1.0.0 - projects/d: + ../../projects/d: dependencies: '@rushstack/e': specifier: workspace:* @@ -46,7 +48,7 @@ importers: specifier: ^2.0.0 version: 2.0.0 - projects/e: + ../../projects/e: dependencies: '@rushstack/n': specifier: ^3.0.0 diff --git a/apps/lockfile-explorer/src/graph/test/lfxGraph-website-sample-1-v9.0.test.ts b/apps/lockfile-explorer/src/graph/test/lfxGraph-website-sample-1-v9.0.test.ts new file mode 100644 index 00000000000..70986c66c8e --- /dev/null +++ b/apps/lockfile-explorer/src/graph/test/lfxGraph-website-sample-1-v9.0.test.ts @@ -0,0 +1,30 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See LICENSE in the project root for license information. + +import type { IJsonLfxWorkspace } from '../../../build/lfx-shared'; + +import * as graphTestHelpers from './graphTestHelpers'; + +export const workspace: IJsonLfxWorkspace = { + workspaceRootFullPath: '/repo', + pnpmLockfilePath: 'common/temp/pnpm-lock.yaml', + pnpmLockfileFolder: 'common/temp', + pnpmfilePath: 'common/temp/.pnpmfile.cjs', + rushConfig: { + rushVersion: '5.158.1', + subspaceName: '', + rushPnpmfilePath: 'common/config/.pnpmcfile.cjs' + } +}; + +describe('lfxGraph-website-sample-1-v9.0', () => { + it('loads a workspace', async () => { + const serializedYaml: string = await graphTestHelpers.loadAndSerializeLfxGraphAsync({ + // NOTE: Rush does not yet support v9.0; this file was generated by invoking the PNPM CLI manually + // under the common/temp folder. + lockfilePathUnderFixtures: '/website-sample-1/pnpm-lock-v9.0-rush.yaml', + workspace: workspace + }); + expect(serializedYaml).toMatchSnapshot(); + }); +}); From f102bc785cdb15b21e29f8040108e47f445dd098 Mon Sep 17 00:00:00 2001 From: Pete Gonzalez <4673363+octogonz@users.noreply.github.com> Date: Thu, 25 Sep 2025 21:28:49 -0700 Subject: [PATCH 04/15] Work in progress improving dependency tracing --- apps/lockfile-explorer/.vscode/launch.json | 11 ++- .../src/graph/lfxGraphLoader.ts | 69 ++++++++++++------- ...fxGraph-website-sample-1-v9.0.test.ts.snap | 16 +++++ 3 files changed, 71 insertions(+), 25 deletions(-) diff --git a/apps/lockfile-explorer/.vscode/launch.json b/apps/lockfile-explorer/.vscode/launch.json index 2ee133e0e98..eccc3696e6a 100644 --- a/apps/lockfile-explorer/.vscode/launch.json +++ b/apps/lockfile-explorer/.vscode/launch.json @@ -14,13 +14,20 @@ "console": "integratedTerminal", "sourceMaps": true }, - { + { "type": "node", "request": "launch", "name": "Single Jest test", "program": "${workspaceFolder}/node_modules/@rushstack/heft/lib/start.js", "cwd": "${workspaceFolder}", - "args": ["--debug", "test", "--clean", "-u", "--test-path-pattern", "lfxGraph-website-sample-1-v6.0.test"], + "args": [ + "--debug", + "test", + "--clean", + "-u", + "--test-path-pattern", + "lfxGraph-website-sample-1-v9.0.test" + ], "console": "integratedTerminal", "sourceMaps": true }, diff --git a/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts b/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts index bb1c0443c6e..9d07fccf67c 100644 --- a/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts +++ b/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts @@ -90,7 +90,10 @@ function createPackageLockfileDependency(options: { function parsePackageDependencies( dependencies: LfxGraphDependency[], lockfileEntry: LfxGraphEntry, - either: lockfileTypes.ProjectSnapshot | lockfileTypes.PackageSnapshot, + either: + | lockfileTypes.ProjectSnapshot + | lockfileTypes.PackageSnapshot + | lockfileTypes.LockfilePackageSnapshot, pnpmLockfileVersion: PnpmLockfileVersion, workspace: IJsonLfxWorkspace ): void { @@ -230,11 +233,10 @@ function createProjectLockfileEntry(options: { function createPackageLockfileEntry(options: { rawEntryId: string; - rawYamlData: lockfileTypes.PackageSnapshot; workspace: IJsonLfxWorkspace; pnpmLockfileVersion: PnpmLockfileVersion; }): LfxGraphEntry { - const { rawEntryId, rawYamlData, pnpmLockfileVersion, workspace } = options; + const { rawEntryId, pnpmLockfileVersion, workspace } = options; const result: ILfxGraphEntryOptions = { kind: LfxGraphEntryKind.Package, @@ -364,13 +366,6 @@ function createPackageLockfileEntry(options: { ); const lockfileEntry: LfxGraphEntry = new LfxGraphEntry(result); - parsePackageDependencies( - lockfileEntry.dependencies, - lockfileEntry, - rawYamlData, - pnpmLockfileVersion, - workspace - ); return lockfileEntry; } @@ -472,36 +467,64 @@ export function generateLockfileGraph(lockfileJson: unknown, workspace: IJsonLfx if (pnpmLockfileVersion < 90) { if (lockfile.packages) { for (const [dependencyKey, dependencyValue] of Object.entries(lockfile.packages)) { - // const normalizedPath = new Path(dependencyKey).makeAbsolute('/').toString(); - - const currEntry: LfxGraphEntry = createPackageLockfileEntry({ + const lockfileEntry: LfxGraphEntry = createPackageLockfileEntry({ rawEntryId: dependencyKey, - rawYamlData: dependencyValue as lockfileTypes.PackageSnapshot, workspace, pnpmLockfileVersion }); - - allEntries.push(currEntry); - allEntriesById.set(dependencyKey, currEntry); + parsePackageDependencies( + lockfileEntry.dependencies, + lockfileEntry, + dependencyValue, + pnpmLockfileVersion, + workspace + ); + allEntries.push(lockfileEntry); + allEntriesById.set(dependencyKey, lockfileEntry); } } } else { + const packagesByKey: Map = new Map(); + if (lockfile.packages) { + for (const [dependencyKey, dependencyValue] of Object.entries(lockfile.packages)) { + packagesByKey.set(dependencyKey, dependencyValue); + } + } + // In v9.0 format, the dependency graph for non-workspace packages is found under "snapshots" not "packages". // (The "packages" section now stores other fields that are unrelated to the graph itself.) const lockfile90: lockfileTypes.LockfileFile = lockfileJson as lockfileTypes.LockfileFile; if (lockfile90.snapshots) { for (const [dependencyKey, dependencyValue] of Object.entries(lockfile90.snapshots)) { - // const normalizedPath = new Path(dependencyKey).makeAbsolute('/').toString(); - - const currEntry: LfxGraphEntry = createPackageLockfileEntry({ + const lockfileEntry: LfxGraphEntry = createPackageLockfileEntry({ rawEntryId: dependencyKey, - rawYamlData: dependencyValue as lockfileTypes.PackageSnapshot, workspace, pnpmLockfileVersion }); - allEntries.push(currEntry); - allEntriesById.set(dependencyKey, currEntry); + parsePackageDependencies( + lockfileEntry.dependencies, + lockfileEntry, + dependencyValue, + pnpmLockfileVersion, + workspace + ); + + // Example: "@scope/my-package@1.0.0" + const packageInfoKey: string = + lockfileEntry.entryPackageName + '@' + lockfileEntry.entryPackageVersion; + const packageInfo: lockfileTypes.LockfilePackageInfo | undefined = packagesByKey.get(packageInfoKey); + if (packageInfo) { + parsePackageDependencies( + lockfileEntry.dependencies, + lockfileEntry, + packageInfo, + pnpmLockfileVersion, + workspace + ); + } + allEntries.push(lockfileEntry); + allEntriesById.set(dependencyKey, lockfileEntry); } } } diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap index d4acc80cb9c..94b28a18333 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap @@ -182,6 +182,22 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` peerDependencyMeta: {} resolvedEntryJsonId: 8 version: 1.0.0 + - dependencyType: peer + entryId: 'Peer: @rushstack/m' + name: '@rushstack/m' + peerDependencyMeta: + name: '@rushstack/m' + optional: false + version: ^1.0.0 + version: ^1.0.0 + - dependencyType: peer + entryId: 'Peer: @rushstack/n' + name: '@rushstack/n' + peerDependencyMeta: + name: '@rushstack/n' + optional: true + version: ^2.0.0 + version: ^2.0.0 displayText: '@rushstack/l 1.0.0 [@rushstack/m@1.0.0; @rushstack/n@2.0.0]' entryId: '' entryPackageName: '@rushstack/l' From ccf94cbc12576a7016025e0ff23ef530558689b3 Mon Sep 17 00:00:00 2001 From: Pete Gonzalez <4673363+octogonz@users.noreply.github.com> Date: Wed, 1 Oct 2025 17:36:20 -0700 Subject: [PATCH 05/15] Rename file --- .../fixtures/edge-cases/{website-sample-1.md => edge-cases.md} | 3 +++ 1 file changed, 3 insertions(+) rename apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/{website-sample-1.md => edge-cases.md} (57%) diff --git a/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/website-sample-1.md b/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/edge-cases.md similarity index 57% rename from apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/website-sample-1.md rename to apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/edge-cases.md index ff328176fab..6e71f8e1492 100644 --- a/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/website-sample-1.md +++ b/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/edge-cases.md @@ -2,3 +2,6 @@ This test fixture is a PNPM workspace crafted to reproduce interesting edge cases in the `lfxGraphLoader` algorithm. +The lockfiles were built from this repistory: + +https://github.com/octogonz/lockfile-explorer-edge-cases From adbfeedc59b137fa4fcfc738091f7b8462f32571 Mon Sep 17 00:00:00 2001 From: Pete Gonzalez <4673363+octogonz@users.noreply.github.com> Date: Wed, 1 Oct 2025 19:18:11 -0700 Subject: [PATCH 06/15] Rename LfxGraphDependency.version to versionPath and clarify its spec --- .../LockfileEntryDetailsView/index.tsx | 6 +-- .../src/packlets/lfx-shared/IJsonLfxGraph.ts | 2 +- .../src/packlets/lfx-shared/LfxGraph.ts | 50 +++++++++++++------ .../packlets/lfx-shared/lfxGraphSerializer.ts | 4 +- .../src/graph/lfxGraphLoader.ts | 35 ++++++------- .../lfxGraph-edge-cases-v5.4.test.ts.snap | 24 ++++----- .../lfxGraph-edge-cases-v6.0.test.ts.snap | 24 ++++----- .../lfxGraph-edge-cases-v9.0.test.ts.snap | 24 ++++----- ...fxGraph-website-sample-1-v5.4.test.ts.snap | 42 ++++++++-------- ...fxGraph-website-sample-1-v6.0.test.ts.snap | 34 ++++++------- ...fxGraph-website-sample-1-v9.0.test.ts.snap | 32 ++++++------ .../src/graph/test/serializeToJson.test.ts | 4 +- 12 files changed, 152 insertions(+), 129 deletions(-) diff --git a/apps/lockfile-explorer-web/src/containers/LockfileEntryDetailsView/index.tsx b/apps/lockfile-explorer-web/src/containers/LockfileEntryDetailsView/index.tsx index 8b0fb3769e1..e06d328f567 100644 --- a/apps/lockfile-explorer-web/src/containers/LockfileEntryDetailsView/index.tsx +++ b/apps/lockfile-explorer-web/src/containers/LockfileEntryDetailsView/index.tsx @@ -172,7 +172,7 @@ export const LockfileEntryDetailsView = (): JSX.Element | ReactNull => { Selected Dependency:{' '} - {inspectDependency.name}: {inspectDependency.version} + {inspectDependency.name}: {inspectDependency.versionPath}
@@ -184,7 +184,7 @@ export const LockfileEntryDetailsView = (): JSX.Element | ReactNull => { ? `"${inspectDependency.peerDependencyMeta.version}" ${ inspectDependency.peerDependencyMeta.optional ? 'Optional' : 'Required' } Peer` - : inspectDependency.version} + : inspectDependency.versionPath}
@@ -344,7 +344,7 @@ export const LockfileEntryDetailsView = (): JSX.Element | ReactNull => { : ''}
- Version: {dependency.version} + Version: {dependency.versionPath} Entry ID: {dependency.entryId}
diff --git a/apps/lockfile-explorer-web/src/packlets/lfx-shared/IJsonLfxGraph.ts b/apps/lockfile-explorer-web/src/packlets/lfx-shared/IJsonLfxGraph.ts index 7632e332f8f..003c0bf4fc7 100644 --- a/apps/lockfile-explorer-web/src/packlets/lfx-shared/IJsonLfxGraph.ts +++ b/apps/lockfile-explorer-web/src/packlets/lfx-shared/IJsonLfxGraph.ts @@ -18,7 +18,7 @@ export interface IJsonPeerDependencyMeta { export interface IJsonLfxDependency { name: string; - version: string; + versionPath: string; entryId: string; dependencyType: LfxDependencyKind; diff --git a/apps/lockfile-explorer-web/src/packlets/lfx-shared/LfxGraph.ts b/apps/lockfile-explorer-web/src/packlets/lfx-shared/LfxGraph.ts index 11ce9f58c98..cd82fc74e28 100644 --- a/apps/lockfile-explorer-web/src/packlets/lfx-shared/LfxGraph.ts +++ b/apps/lockfile-explorer-web/src/packlets/lfx-shared/LfxGraph.ts @@ -6,35 +6,57 @@ import type { IJsonLfxWorkspace } from './IJsonLfxWorkspace'; export interface ILfxGraphDependencyOptions { name: string; - version: string; + versionPath: string; + + entryId: string; + dependencyType: LfxDependencyKind; - containingEntry: LfxGraphEntry; peerDependencyMeta: IJsonPeerDependencyMeta; - entryId: string; + + containingEntry: LfxGraphEntry; } /** - * Represents a dependency listed under a LockfileEntry - * - * @remarks - * Each dependency listed under a package in the lockfile should have a separate entry. These Dependencies - * will link to the "containingEntry", which is the LockfileEntry that specified this dependency. - * The "resolvedEntry" field is the corresponding LockfileEntry for this dependency, as all dependencies also have - * their own entries in the pnpm lockfile. + * Represents an graph edge, which is an exact dependency version obtained from the lockfile. */ export class LfxGraphDependency { + /** + * The referenced package name. + * Example: `@scope/package-name` + */ public readonly name: string; - public readonly version: string; - public readonly dependencyType: LfxDependencyKind; - public readonly containingEntry: LfxGraphEntry; + + /** + * The lockfile's raw string that either indicates an external reference such as `link:../target-folder`, + * or else can be combined with the `name` field to construct an `entryId` found in the lockfile. + * The exact syntax varies between lockfile file format versions. + * + * Example: `link:../target-folder` + * + * Example: `1.0.0` + * + * Example: `1.0.0_@rushstack+m@1.0.0` (version 5.4) + * Example: `1.0.0(@rushstack/m@1.0.0)` (version 6.0 and 9.0) + */ + public readonly versionPath: string; + + /** + * If this dependency refers to an entry in the lockfile, this field should match a corresponding + * {@link LfxGraphEntry.entryId} and `resolvedEntry` will be defined (unless the loader encountered an error). + * + * For external references such as `link:../target-folder`, the `entryId` is the empty string. + */ public readonly entryId: string; + + public readonly dependencyType: LfxDependencyKind; public readonly peerDependencyMeta: IJsonPeerDependencyMeta; + public readonly containingEntry: LfxGraphEntry; public resolvedEntry: LfxGraphEntry | undefined = undefined; public constructor(options: ILfxGraphDependencyOptions) { this.name = options.name; - this.version = options.version; + this.versionPath = options.versionPath; this.dependencyType = options.dependencyType; this.containingEntry = options.containingEntry; this.entryId = options.entryId; diff --git a/apps/lockfile-explorer-web/src/packlets/lfx-shared/lfxGraphSerializer.ts b/apps/lockfile-explorer-web/src/packlets/lfx-shared/lfxGraphSerializer.ts index b175dbd2080..1b535b8bda2 100644 --- a/apps/lockfile-explorer-web/src/packlets/lfx-shared/lfxGraphSerializer.ts +++ b/apps/lockfile-explorer-web/src/packlets/lfx-shared/lfxGraphSerializer.ts @@ -51,7 +51,7 @@ export function serializeToJson(graph: LfxGraph): IJsonLfxGraph { for (const dependency of entry.dependencies) { const jsonLfxDependency: IJsonLfxDependency = { name: dependency.name, - version: dependency.version, + versionPath: dependency.versionPath, entryId: dependency.entryId, dependencyType: dependency.dependencyType, peerDependencyMeta: { @@ -111,7 +111,7 @@ export function deserializeFromJson(jsonLfxGraph: IJsonLfxGraph): LfxGraph { for (const jsonLfxDependency of jsonLfxEntry.dependencies) { const dependency: LfxGraphDependency = new LfxGraphDependency({ name: jsonLfxDependency.name, - version: jsonLfxDependency.version, + versionPath: jsonLfxDependency.versionPath, dependencyType: jsonLfxDependency.dependencyType, containingEntry: entry, entryId: jsonLfxDependency.entryId, diff --git a/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts b/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts index 9d07fccf67c..d486b172df4 100644 --- a/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts +++ b/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts @@ -22,7 +22,7 @@ type PeerDependenciesMeta = lockfileTypes.LockfilePackageInfo['peerDependenciesM function createPackageLockfileDependency(options: { name: string; - version: string; + versionPath: string; kind: LfxDependencyKind; containingEntry: LfxGraphEntry; peerDependenciesMeta?: PeerDependenciesMeta; @@ -31,7 +31,7 @@ function createPackageLockfileDependency(options: { }): LfxGraphDependency { const { name, - version, + versionPath, kind: dependencyType, containingEntry, peerDependenciesMeta, @@ -40,15 +40,15 @@ function createPackageLockfileDependency(options: { const result: ILfxGraphDependencyOptions = { name, - version, + versionPath, dependencyType, containingEntry, entryId: '', peerDependencyMeta: {} }; - if (version.startsWith('link:')) { - const relativePath: string = version.substring('link:'.length); + if (versionPath.startsWith('link:')) { + const relativePath: string = versionPath.substring('link:'.length); if (containingEntry.kind === LfxGraphEntryKind.Project) { // TODO: Here we assume it's a "workspace:" link and try to resolve it to another workspace project, @@ -63,12 +63,12 @@ function createPackageLockfileDependency(options: { // This could be a link to anywhere on the local computer, so we don't expect it to have a lockfile entry result.entryId = ''; } - } else if (result.version.startsWith('/')) { - result.entryId = version; + } else if (result.versionPath.startsWith('/')) { + result.entryId = versionPath; } else if (result.dependencyType === LfxDependencyKind.Peer) { result.peerDependencyMeta = { name: result.name, - version: version, + version: versionPath, optional: peerDependenciesMeta?.[result.name] ? peerDependenciesMeta[result.name].optional : false }; result.entryId = 'Peer: ' + result.name; @@ -81,7 +81,8 @@ function createPackageLockfileDependency(options: { // Version 6.0: /@rushstack/j@1.0.0(@rushstack/n@2.0.0) // Version 9.0: @rushstack/j@1.0.0(@rushstack/n@2.0.0) const versionDelimiter: string = pnpmLockfileVersion < 60 ? '/' : '@'; - result.entryId = (pnpmLockfileVersion < 90 ? '/' : '') + result.name + versionDelimiter + result.version; + result.entryId = + (pnpmLockfileVersion < 90 ? '/' : '') + result.name + versionDelimiter + result.versionPath; } return new LfxGraphDependency(result); } @@ -100,12 +101,12 @@ function parsePackageDependencies( const node: Partial = either as unknown as Partial; if (node.dependencies) { - for (const [packageName, version] of Object.entries(node.dependencies)) { + for (const [packageName, versionPath] of Object.entries(node.dependencies)) { dependencies.push( createPackageLockfileDependency({ kind: LfxDependencyKind.Regular, name: packageName, - version: version, + versionPath, containingEntry: lockfileEntry, pnpmLockfileVersion, workspace @@ -114,12 +115,12 @@ function parsePackageDependencies( } } if (node.devDependencies) { - for (const [packageName, version] of Object.entries(node.devDependencies)) { + for (const [packageName, versionPath] of Object.entries(node.devDependencies)) { dependencies.push( createPackageLockfileDependency({ kind: LfxDependencyKind.Dev, name: packageName, - version: version, + versionPath, containingEntry: lockfileEntry, pnpmLockfileVersion, workspace @@ -128,12 +129,12 @@ function parsePackageDependencies( } } if (node.peerDependencies) { - for (const [packageName, version] of Object.entries(node.peerDependencies)) { + for (const [packageName, versionPath] of Object.entries(node.peerDependencies)) { dependencies.push( createPackageLockfileDependency({ kind: LfxDependencyKind.Peer, name: packageName, - version: version, + versionPath, containingEntry: lockfileEntry, peerDependenciesMeta: node.peerDependenciesMeta, pnpmLockfileVersion, @@ -162,7 +163,7 @@ function parseProjectDependencies60( createPackageLockfileDependency({ kind: LfxDependencyKind.Regular, name: packageName, - version: specifierAndResolution.version, + versionPath: specifierAndResolution.version, containingEntry: lockfileEntry, pnpmLockfileVersion, workspace @@ -176,7 +177,7 @@ function parseProjectDependencies60( createPackageLockfileDependency({ kind: LfxDependencyKind.Dev, name: packageName, - version: specifierAndResolution.version, + versionPath: specifierAndResolution.version, containingEntry: lockfileEntry, pnpmLockfileVersion, workspace diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap index b786bfdbf67..51442525001 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap @@ -8,7 +8,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: color peerDependencyMeta: {} resolvedEntryJsonId: 8 - version: 5.0.2 + versionPath: 5.0.2 displayText: 'Project: duplicate (duplicate-1/duplicate)' entryId: project:duplicate-1/duplicate entryPackageName: duplicate (duplicate-1/duplicate) @@ -26,7 +26,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: color-string peerDependencyMeta: {} resolvedEntryJsonId: 7 - version: 2.1.2 + versionPath: 2.1.2 displayText: 'Project: duplicate (duplicate-2/duplicate)' entryId: project:duplicate-2/duplicate entryPackageName: duplicate (duplicate-2/duplicate) @@ -44,12 +44,12 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: has-symbols peerDependencyMeta: {} resolvedEntryJsonId: 9 - version: 1.0.2 + versionPath: 1.0.2 - dependencyType: regular entryId: project:link-specifier/target-folder name: target-folder peerDependencyMeta: {} - version: link:../target-folder + versionPath: link:../target-folder displayText: 'Project: linker' entryId: project:link-specifier/linker entryPackageName: linker @@ -67,13 +67,13 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: address peerDependencyMeta: {} resolvedEntryJsonId: 4 - version: 1.2.2 + versionPath: 1.2.2 - dependencyType: regular entryId: /uri-js/4.4.1 name: uri-js peerDependencyMeta: {} resolvedEntryJsonId: 11 - version: 4.4.1 + versionPath: 4.4.1 displayText: 'Project: pnpmfile-transforms' entryId: project:pnpmfile-transforms entryPackageName: pnpmfile-transforms @@ -104,7 +104,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: color-name peerDependencyMeta: {} resolvedEntryJsonId: 6 - version: 2.0.2 + versionPath: 2.0.2 displayText: color-convert 3.1.2 entryId: '' entryPackageName: color-convert @@ -137,7 +137,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: color-name peerDependencyMeta: {} resolvedEntryJsonId: 6 - version: 2.0.2 + versionPath: 2.0.2 displayText: color-string 2.1.2 entryId: '' entryPackageName: color-string @@ -157,13 +157,13 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: color-convert peerDependencyMeta: {} resolvedEntryJsonId: 5 - version: 3.1.2 + versionPath: 3.1.2 - dependencyType: regular entryId: /color-string/2.1.2 name: color-string peerDependencyMeta: {} resolvedEntryJsonId: 7 - version: 2.1.2 + versionPath: 2.1.2 displayText: color 5.0.2 entryId: '' entryPackageName: color @@ -181,7 +181,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` entryId: '' name: target-folder peerDependencyMeta: {} - version: link:link-specifier/target-folder + versionPath: link:link-specifier/target-folder displayText: has-symbols 1.0.2 entryId: '' entryPackageName: has-symbols @@ -213,7 +213,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: punycode peerDependencyMeta: {} resolvedEntryJsonId: 10 - version: 2.3.1 + versionPath: 2.3.1 displayText: uri-js 4.4.1 entryId: '' entryPackageName: uri-js diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap index b786bfdbf67..51442525001 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap @@ -8,7 +8,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: color peerDependencyMeta: {} resolvedEntryJsonId: 8 - version: 5.0.2 + versionPath: 5.0.2 displayText: 'Project: duplicate (duplicate-1/duplicate)' entryId: project:duplicate-1/duplicate entryPackageName: duplicate (duplicate-1/duplicate) @@ -26,7 +26,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: color-string peerDependencyMeta: {} resolvedEntryJsonId: 7 - version: 2.1.2 + versionPath: 2.1.2 displayText: 'Project: duplicate (duplicate-2/duplicate)' entryId: project:duplicate-2/duplicate entryPackageName: duplicate (duplicate-2/duplicate) @@ -44,12 +44,12 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: has-symbols peerDependencyMeta: {} resolvedEntryJsonId: 9 - version: 1.0.2 + versionPath: 1.0.2 - dependencyType: regular entryId: project:link-specifier/target-folder name: target-folder peerDependencyMeta: {} - version: link:../target-folder + versionPath: link:../target-folder displayText: 'Project: linker' entryId: project:link-specifier/linker entryPackageName: linker @@ -67,13 +67,13 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: address peerDependencyMeta: {} resolvedEntryJsonId: 4 - version: 1.2.2 + versionPath: 1.2.2 - dependencyType: regular entryId: /uri-js/4.4.1 name: uri-js peerDependencyMeta: {} resolvedEntryJsonId: 11 - version: 4.4.1 + versionPath: 4.4.1 displayText: 'Project: pnpmfile-transforms' entryId: project:pnpmfile-transforms entryPackageName: pnpmfile-transforms @@ -104,7 +104,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: color-name peerDependencyMeta: {} resolvedEntryJsonId: 6 - version: 2.0.2 + versionPath: 2.0.2 displayText: color-convert 3.1.2 entryId: '' entryPackageName: color-convert @@ -137,7 +137,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: color-name peerDependencyMeta: {} resolvedEntryJsonId: 6 - version: 2.0.2 + versionPath: 2.0.2 displayText: color-string 2.1.2 entryId: '' entryPackageName: color-string @@ -157,13 +157,13 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: color-convert peerDependencyMeta: {} resolvedEntryJsonId: 5 - version: 3.1.2 + versionPath: 3.1.2 - dependencyType: regular entryId: /color-string/2.1.2 name: color-string peerDependencyMeta: {} resolvedEntryJsonId: 7 - version: 2.1.2 + versionPath: 2.1.2 displayText: color 5.0.2 entryId: '' entryPackageName: color @@ -181,7 +181,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` entryId: '' name: target-folder peerDependencyMeta: {} - version: link:link-specifier/target-folder + versionPath: link:link-specifier/target-folder displayText: has-symbols 1.0.2 entryId: '' entryPackageName: has-symbols @@ -213,7 +213,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: punycode peerDependencyMeta: {} resolvedEntryJsonId: 10 - version: 2.3.1 + versionPath: 2.3.1 displayText: uri-js 4.4.1 entryId: '' entryPackageName: uri-js diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap index 0ad9a693bf5..141870ab980 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap @@ -8,7 +8,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` name: color peerDependencyMeta: {} resolvedEntryJsonId: 8 - version: 5.0.2 + versionPath: 5.0.2 displayText: 'Project: duplicate (duplicate-1/duplicate)' entryId: project:duplicate-1/duplicate entryPackageName: duplicate (duplicate-1/duplicate) @@ -26,7 +26,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` name: color-string peerDependencyMeta: {} resolvedEntryJsonId: 7 - version: 2.1.2 + versionPath: 2.1.2 displayText: 'Project: duplicate (duplicate-2/duplicate)' entryId: project:duplicate-2/duplicate entryPackageName: duplicate (duplicate-2/duplicate) @@ -44,12 +44,12 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` name: has-symbols peerDependencyMeta: {} resolvedEntryJsonId: 9 - version: 1.0.2 + versionPath: 1.0.2 - dependencyType: regular entryId: project:link-specifier/target-folder name: target-folder peerDependencyMeta: {} - version: link:../target-folder + versionPath: link:../target-folder displayText: 'Project: linker' entryId: project:link-specifier/linker entryPackageName: linker @@ -67,13 +67,13 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` name: address peerDependencyMeta: {} resolvedEntryJsonId: 4 - version: 1.2.2 + versionPath: 1.2.2 - dependencyType: regular entryId: uri-js@4.4.1 name: uri-js peerDependencyMeta: {} resolvedEntryJsonId: 11 - version: 4.4.1 + versionPath: 4.4.1 displayText: 'Project: pnpmfile-transforms' entryId: project:pnpmfile-transforms entryPackageName: pnpmfile-transforms @@ -104,7 +104,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` name: color-name peerDependencyMeta: {} resolvedEntryJsonId: 6 - version: 2.0.2 + versionPath: 2.0.2 displayText: color-convert 3.1.2 entryId: '' entryPackageName: color-convert @@ -137,7 +137,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` name: color-name peerDependencyMeta: {} resolvedEntryJsonId: 6 - version: 2.0.2 + versionPath: 2.0.2 displayText: color-string 2.1.2 entryId: '' entryPackageName: color-string @@ -157,13 +157,13 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` name: color-convert peerDependencyMeta: {} resolvedEntryJsonId: 5 - version: 3.1.2 + versionPath: 3.1.2 - dependencyType: regular entryId: color-string@2.1.2 name: color-string peerDependencyMeta: {} resolvedEntryJsonId: 7 - version: 2.1.2 + versionPath: 2.1.2 displayText: color 5.0.2 entryId: '' entryPackageName: color @@ -181,7 +181,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` entryId: '' name: target-folder peerDependencyMeta: {} - version: link:link-specifier/target-folder + versionPath: link:link-specifier/target-folder displayText: has-symbols 1.0.2 entryId: '' entryPackageName: has-symbols @@ -213,7 +213,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` name: punycode peerDependencyMeta: {} resolvedEntryJsonId: 10 - version: 2.3.1 + versionPath: 2.3.1 displayText: uri-js 4.4.1 entryId: '' entryPackageName: uri-js diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v5.4.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v5.4.test.ts.snap index 58b8bf4cb78..bcbb2a1c0a5 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v5.4.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v5.4.test.ts.snap @@ -8,7 +8,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` name: '@rushstack/d' peerDependencyMeta: {} resolvedEntryJsonId: 3 - version: link:../d + versionPath: link:../d displayText: 'Project: a' entryId: project:projects/a entryPackageName: a @@ -26,13 +26,13 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` name: '@rushstack/d' peerDependencyMeta: {} resolvedEntryJsonId: 3 - version: link:../d + versionPath: link:../d - dependencyType: regular entryId: /@rushstack/n/2.0.0 name: '@rushstack/n' peerDependencyMeta: {} resolvedEntryJsonId: 11 - version: 2.0.0 + versionPath: 2.0.0 displayText: 'Project: b' entryId: project:projects/b entryPackageName: b @@ -50,19 +50,19 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` name: '@rushstack/e' peerDependencyMeta: {} resolvedEntryJsonId: 4 - version: link:../e + versionPath: link:../e - dependencyType: regular entryId: /@rushstack/k/1.0.0_@rushstack+m@1.0.0 name: '@rushstack/k' peerDependencyMeta: {} resolvedEntryJsonId: 6 - version: 1.0.0_@rushstack+m@1.0.0 + versionPath: 1.0.0_@rushstack+m@1.0.0 - dependencyType: regular entryId: /@rushstack/m/1.0.0 name: '@rushstack/m' peerDependencyMeta: {} resolvedEntryJsonId: 10 - version: 1.0.0 + versionPath: 1.0.0 displayText: 'Project: c' entryId: project:projects/c entryPackageName: c @@ -80,19 +80,19 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` name: '@rushstack/e' peerDependencyMeta: {} resolvedEntryJsonId: 4 - version: link:../e + versionPath: link:../e - dependencyType: regular entryId: /@rushstack/j/1.0.0_@rushstack+n@2.0.0 name: '@rushstack/j' peerDependencyMeta: {} resolvedEntryJsonId: 5 - version: 1.0.0_@rushstack+n@2.0.0 + versionPath: 1.0.0_@rushstack+n@2.0.0 - dependencyType: regular entryId: /@rushstack/n/2.0.0 name: '@rushstack/n' peerDependencyMeta: {} resolvedEntryJsonId: 11 - version: 2.0.0 + versionPath: 2.0.0 displayText: 'Project: d' entryId: project:projects/d entryPackageName: d @@ -112,7 +112,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` name: '@rushstack/n' peerDependencyMeta: {} resolvedEntryJsonId: 12 - version: 3.0.0 + versionPath: 3.0.0 displayText: 'Project: e' entryId: project:projects/e entryPackageName: e @@ -132,13 +132,13 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` name: '@rushstack/k' peerDependencyMeta: {} resolvedEntryJsonId: 7 - version: 1.0.0_wxpgugna4ivthu7yyu4fmciltu + versionPath: 1.0.0_wxpgugna4ivthu7yyu4fmciltu - dependencyType: regular entryId: /@rushstack/m/1.0.0 name: '@rushstack/m' peerDependencyMeta: {} resolvedEntryJsonId: 10 - version: 1.0.0 + versionPath: 1.0.0 displayText: '@rushstack/j 1.0.0 (@rushstack+n@2.0.0)' entryId: '' entryPackageName: '@rushstack/j' @@ -158,7 +158,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` name: '@rushstack/l' peerDependencyMeta: {} resolvedEntryJsonId: 8 - version: 1.0.0_@rushstack+m@1.0.0 + versionPath: 1.0.0_@rushstack+m@1.0.0 displayText: '@rushstack/k 1.0.0 (@rushstack+m@1.0.0)' entryId: '' entryPackageName: '@rushstack/k' @@ -179,7 +179,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` name: '@rushstack/l' peerDependencyMeta: {} resolvedEntryJsonId: 9 - version: 1.0.0_wxpgugna4ivthu7yyu4fmciltu + versionPath: 1.0.0_wxpgugna4ivthu7yyu4fmciltu displayText: '@rushstack/k 1.0.0 (wxpgugna4ivthu7yyu4fmciltu)' entryId: '' entryPackageName: '@rushstack/k' @@ -200,7 +200,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` name: '@rushstack/m' peerDependencyMeta: {} resolvedEntryJsonId: 10 - version: 1.0.0 + versionPath: 1.0.0 - dependencyType: peer entryId: 'Peer: @rushstack/m' name: '@rushstack/m' @@ -208,7 +208,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` name: '@rushstack/m' optional: false version: ^1.0.0 - version: ^1.0.0 + versionPath: ^1.0.0 - dependencyType: peer entryId: 'Peer: @rushstack/n' name: '@rushstack/n' @@ -216,7 +216,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` name: '@rushstack/n' optional: true version: ^2.0.0 - version: ^2.0.0 + versionPath: ^2.0.0 displayText: '@rushstack/l 1.0.0 (@rushstack+m@1.0.0)' entryId: '' entryPackageName: '@rushstack/l' @@ -235,13 +235,13 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` name: '@rushstack/m' peerDependencyMeta: {} resolvedEntryJsonId: 10 - version: 1.0.0 + versionPath: 1.0.0 - dependencyType: regular entryId: /@rushstack/n/2.0.0 name: '@rushstack/n' peerDependencyMeta: {} resolvedEntryJsonId: 11 - version: 2.0.0 + versionPath: 2.0.0 - dependencyType: peer entryId: 'Peer: @rushstack/m' name: '@rushstack/m' @@ -249,7 +249,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` name: '@rushstack/m' optional: false version: ^1.0.0 - version: ^1.0.0 + versionPath: ^1.0.0 - dependencyType: peer entryId: 'Peer: @rushstack/n' name: '@rushstack/n' @@ -257,7 +257,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` name: '@rushstack/n' optional: true version: ^2.0.0 - version: ^2.0.0 + versionPath: ^2.0.0 displayText: '@rushstack/l 1.0.0 (wxpgugna4ivthu7yyu4fmciltu)' entryId: '' entryPackageName: '@rushstack/l' diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v6.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v6.0.test.ts.snap index 64f461236c5..f00c63c3505 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v6.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v6.0.test.ts.snap @@ -8,7 +8,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` name: '@rushstack/d' peerDependencyMeta: {} resolvedEntryJsonId: 3 - version: link:../d + versionPath: link:../d displayText: 'Project: a' entryId: project:projects/a entryPackageName: a @@ -26,13 +26,13 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` name: '@rushstack/d' peerDependencyMeta: {} resolvedEntryJsonId: 3 - version: link:../d + versionPath: link:../d - dependencyType: regular entryId: /@rushstack/n@2.0.0 name: '@rushstack/n' peerDependencyMeta: {} resolvedEntryJsonId: 9 - version: 2.0.0 + versionPath: 2.0.0 displayText: 'Project: b' entryId: project:projects/b entryPackageName: b @@ -50,19 +50,19 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` name: '@rushstack/e' peerDependencyMeta: {} resolvedEntryJsonId: 4 - version: link:../e + versionPath: link:../e - dependencyType: regular entryId: /@rushstack/k@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) name: '@rushstack/k' peerDependencyMeta: {} resolvedEntryJsonId: 6 - version: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) + versionPath: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) - dependencyType: regular entryId: /@rushstack/m@1.0.0 name: '@rushstack/m' peerDependencyMeta: {} resolvedEntryJsonId: 8 - version: 1.0.0 + versionPath: 1.0.0 displayText: 'Project: c' entryId: project:projects/c entryPackageName: c @@ -80,19 +80,19 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` name: '@rushstack/e' peerDependencyMeta: {} resolvedEntryJsonId: 4 - version: link:../e + versionPath: link:../e - dependencyType: regular entryId: /@rushstack/j@1.0.0(@rushstack/n@2.0.0) name: '@rushstack/j' peerDependencyMeta: {} resolvedEntryJsonId: 5 - version: 1.0.0(@rushstack/n@2.0.0) + versionPath: 1.0.0(@rushstack/n@2.0.0) - dependencyType: regular entryId: /@rushstack/n@2.0.0 name: '@rushstack/n' peerDependencyMeta: {} resolvedEntryJsonId: 9 - version: 2.0.0 + versionPath: 2.0.0 displayText: 'Project: d' entryId: project:projects/d entryPackageName: d @@ -112,7 +112,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` name: '@rushstack/n' peerDependencyMeta: {} resolvedEntryJsonId: 10 - version: 3.0.0 + versionPath: 3.0.0 displayText: 'Project: e' entryId: project:projects/e entryPackageName: e @@ -132,13 +132,13 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` name: '@rushstack/k' peerDependencyMeta: {} resolvedEntryJsonId: 6 - version: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) + versionPath: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) - dependencyType: regular entryId: /@rushstack/m@1.0.0 name: '@rushstack/m' peerDependencyMeta: {} resolvedEntryJsonId: 8 - version: 1.0.0 + versionPath: 1.0.0 displayText: '@rushstack/j 1.0.0 [@rushstack/n@2.0.0]' entryId: '' entryPackageName: '@rushstack/j' @@ -158,7 +158,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` name: '@rushstack/l' peerDependencyMeta: {} resolvedEntryJsonId: 7 - version: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) + versionPath: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) displayText: '@rushstack/k 1.0.0 [@rushstack/m@1.0.0; @rushstack/n@2.0.0]' entryId: '' entryPackageName: '@rushstack/k' @@ -181,13 +181,13 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` name: '@rushstack/m' peerDependencyMeta: {} resolvedEntryJsonId: 8 - version: 1.0.0 + versionPath: 1.0.0 - dependencyType: regular entryId: /@rushstack/n@2.0.0 name: '@rushstack/n' peerDependencyMeta: {} resolvedEntryJsonId: 9 - version: 2.0.0 + versionPath: 2.0.0 - dependencyType: peer entryId: 'Peer: @rushstack/m' name: '@rushstack/m' @@ -195,7 +195,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` name: '@rushstack/m' optional: false version: ^1.0.0 - version: ^1.0.0 + versionPath: ^1.0.0 - dependencyType: peer entryId: 'Peer: @rushstack/n' name: '@rushstack/n' @@ -203,7 +203,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` name: '@rushstack/n' optional: true version: ^2.0.0 - version: ^2.0.0 + versionPath: ^2.0.0 displayText: '@rushstack/l 1.0.0 [@rushstack/m@1.0.0; @rushstack/n@2.0.0]' entryId: '' entryPackageName: '@rushstack/l' diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap index 94b28a18333..0605cc04cbf 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap @@ -8,7 +8,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` name: '@rushstack/d' peerDependencyMeta: {} resolvedEntryJsonId: 3 - version: link:../d + versionPath: link:../d displayText: 'Project: a' entryId: project:projects/a entryPackageName: a @@ -26,13 +26,13 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` name: '@rushstack/d' peerDependencyMeta: {} resolvedEntryJsonId: 3 - version: link:../d + versionPath: link:../d - dependencyType: regular entryId: '@rushstack/n@2.0.0' name: '@rushstack/n' peerDependencyMeta: {} resolvedEntryJsonId: 9 - version: 2.0.0 + versionPath: 2.0.0 displayText: 'Project: b' entryId: project:projects/b entryPackageName: b @@ -50,19 +50,19 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` name: '@rushstack/e' peerDependencyMeta: {} resolvedEntryJsonId: 4 - version: link:../e + versionPath: link:../e - dependencyType: regular entryId: '@rushstack/k@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0)' name: '@rushstack/k' peerDependencyMeta: {} resolvedEntryJsonId: 6 - version: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) + versionPath: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) - dependencyType: regular entryId: '@rushstack/m@1.0.0' name: '@rushstack/m' peerDependencyMeta: {} resolvedEntryJsonId: 8 - version: 1.0.0 + versionPath: 1.0.0 displayText: 'Project: c' entryId: project:projects/c entryPackageName: c @@ -80,19 +80,19 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` name: '@rushstack/e' peerDependencyMeta: {} resolvedEntryJsonId: 4 - version: link:../e + versionPath: link:../e - dependencyType: regular entryId: '@rushstack/j@1.0.0(@rushstack/n@2.0.0)' name: '@rushstack/j' peerDependencyMeta: {} resolvedEntryJsonId: 5 - version: 1.0.0(@rushstack/n@2.0.0) + versionPath: 1.0.0(@rushstack/n@2.0.0) - dependencyType: regular entryId: '@rushstack/n@2.0.0' name: '@rushstack/n' peerDependencyMeta: {} resolvedEntryJsonId: 9 - version: 2.0.0 + versionPath: 2.0.0 displayText: 'Project: d' entryId: project:projects/d entryPackageName: d @@ -112,7 +112,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` name: '@rushstack/n' peerDependencyMeta: {} resolvedEntryJsonId: 10 - version: 3.0.0 + versionPath: 3.0.0 displayText: 'Project: e' entryId: project:projects/e entryPackageName: e @@ -132,13 +132,13 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` name: '@rushstack/k' peerDependencyMeta: {} resolvedEntryJsonId: 6 - version: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) + versionPath: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) - dependencyType: regular entryId: '@rushstack/m@1.0.0' name: '@rushstack/m' peerDependencyMeta: {} resolvedEntryJsonId: 8 - version: 1.0.0 + versionPath: 1.0.0 displayText: '@rushstack/j 1.0.0 [@rushstack/n@2.0.0]' entryId: '' entryPackageName: '@rushstack/j' @@ -158,7 +158,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` name: '@rushstack/l' peerDependencyMeta: {} resolvedEntryJsonId: 7 - version: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) + versionPath: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) displayText: '@rushstack/k 1.0.0 [@rushstack/m@1.0.0; @rushstack/n@2.0.0]' entryId: '' entryPackageName: '@rushstack/k' @@ -181,7 +181,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` name: '@rushstack/m' peerDependencyMeta: {} resolvedEntryJsonId: 8 - version: 1.0.0 + versionPath: 1.0.0 - dependencyType: peer entryId: 'Peer: @rushstack/m' name: '@rushstack/m' @@ -189,7 +189,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` name: '@rushstack/m' optional: false version: ^1.0.0 - version: ^1.0.0 + versionPath: ^1.0.0 - dependencyType: peer entryId: 'Peer: @rushstack/n' name: '@rushstack/n' @@ -197,7 +197,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` name: '@rushstack/n' optional: true version: ^2.0.0 - version: ^2.0.0 + versionPath: ^2.0.0 displayText: '@rushstack/l 1.0.0 [@rushstack/m@1.0.0; @rushstack/n@2.0.0]' entryId: '' entryPackageName: '@rushstack/l' diff --git a/apps/lockfile-explorer/src/graph/test/serializeToJson.test.ts b/apps/lockfile-explorer/src/graph/test/serializeToJson.test.ts index d05769f2e81..8b11c9b01d9 100644 --- a/apps/lockfile-explorer/src/graph/test/serializeToJson.test.ts +++ b/apps/lockfile-explorer/src/graph/test/serializeToJson.test.ts @@ -25,7 +25,7 @@ Object { "version": undefined, }, "resolvedEntryJsonId": 1, - "version": "1.7.1", + "versionPath": "1.7.1", }, Object { "dependencyType": "regular", @@ -37,7 +37,7 @@ Object { "version": undefined, }, "resolvedEntryJsonId": 2, - "version": "1.7.1", + "versionPath": "1.7.1", }, ], "displayText": "Project: testApp1", From 929bd84f3d76c6ca1466e48d50bbf13302b81b0d Mon Sep 17 00:00:00 2001 From: Pete Gonzalez <4673363+octogonz@users.noreply.github.com> Date: Wed, 1 Oct 2025 19:29:13 -0700 Subject: [PATCH 07/15] Introduce originalSpecifier field --- .../src/packlets/lfx-shared/IJsonLfxGraph.ts | 4 ++-- .../src/packlets/lfx-shared/LfxGraph.ts | 18 ++++++++++++++-- .../packlets/lfx-shared/lfxGraphSerializer.ts | 8 ++++--- .../src/graph/lfxGraphLoader.ts | 7 ++++--- .../lfxGraph-edge-cases-v5.4.test.ts.snap | 12 +++++++++++ .../lfxGraph-edge-cases-v6.0.test.ts.snap | 12 +++++++++++ .../lfxGraph-edge-cases-v9.0.test.ts.snap | 12 +++++++++++ ...fxGraph-website-sample-1-v5.4.test.ts.snap | 21 +++++++++++++++++++ ...fxGraph-website-sample-1-v6.0.test.ts.snap | 17 +++++++++++++++ ...fxGraph-website-sample-1-v9.0.test.ts.snap | 16 ++++++++++++++ .../src/graph/test/serializeToJson.test.ts | 2 ++ 11 files changed, 119 insertions(+), 10 deletions(-) diff --git a/apps/lockfile-explorer-web/src/packlets/lfx-shared/IJsonLfxGraph.ts b/apps/lockfile-explorer-web/src/packlets/lfx-shared/IJsonLfxGraph.ts index 003c0bf4fc7..aba495dafb8 100644 --- a/apps/lockfile-explorer-web/src/packlets/lfx-shared/IJsonLfxGraph.ts +++ b/apps/lockfile-explorer-web/src/packlets/lfx-shared/IJsonLfxGraph.ts @@ -20,11 +20,11 @@ export interface IJsonLfxDependency { name: string; versionPath: string; entryId: string; + originalSpecifier: string; dependencyType: LfxDependencyKind; + peerDependencyMeta: IJsonPeerDependencyMeta; resolvedEntryJsonId?: number; - - peerDependencyMeta: IJsonPeerDependencyMeta; } export enum LfxDependencyKind { diff --git a/apps/lockfile-explorer-web/src/packlets/lfx-shared/LfxGraph.ts b/apps/lockfile-explorer-web/src/packlets/lfx-shared/LfxGraph.ts index cd82fc74e28..e1e46c02bc3 100644 --- a/apps/lockfile-explorer-web/src/packlets/lfx-shared/LfxGraph.ts +++ b/apps/lockfile-explorer-web/src/packlets/lfx-shared/LfxGraph.ts @@ -10,6 +10,7 @@ export interface ILfxGraphDependencyOptions { entryId: string; + originalSpecifier: string; dependencyType: LfxDependencyKind; peerDependencyMeta: IJsonPeerDependencyMeta; @@ -48,6 +49,17 @@ export class LfxGraphDependency { */ public readonly entryId: string; + /** + * The lockfile sometimes records the original SemVer specifier that was used to choose the versionPath, + * usually either because it can change (e.g. a workspace project's dependencies) or because it's a peer dependency + * that affects graph relationships beyond the current node. If not, then `originalSpecifier` will be the + * empty string. + * + * @remarks + * Because this field is only available for certain dependencies, it is generally less useful than specifiers + * obtained from the package.json files. + */ + public readonly originalSpecifier: string; public readonly dependencyType: LfxDependencyKind; public readonly peerDependencyMeta: IJsonPeerDependencyMeta; @@ -57,10 +69,12 @@ export class LfxGraphDependency { public constructor(options: ILfxGraphDependencyOptions) { this.name = options.name; this.versionPath = options.versionPath; - this.dependencyType = options.dependencyType; - this.containingEntry = options.containingEntry; this.entryId = options.entryId; + this.originalSpecifier = options.originalSpecifier; + this.dependencyType = options.dependencyType; this.peerDependencyMeta = options.peerDependencyMeta; + + this.containingEntry = options.containingEntry; } } diff --git a/apps/lockfile-explorer-web/src/packlets/lfx-shared/lfxGraphSerializer.ts b/apps/lockfile-explorer-web/src/packlets/lfx-shared/lfxGraphSerializer.ts index 1b535b8bda2..1b69c6ca851 100644 --- a/apps/lockfile-explorer-web/src/packlets/lfx-shared/lfxGraphSerializer.ts +++ b/apps/lockfile-explorer-web/src/packlets/lfx-shared/lfxGraphSerializer.ts @@ -53,6 +53,7 @@ export function serializeToJson(graph: LfxGraph): IJsonLfxGraph { name: dependency.name, versionPath: dependency.versionPath, entryId: dependency.entryId, + originalSpecifier: dependency.originalSpecifier, dependencyType: dependency.dependencyType, peerDependencyMeta: { name: dependency.peerDependencyMeta.name, @@ -112,14 +113,15 @@ export function deserializeFromJson(jsonLfxGraph: IJsonLfxGraph): LfxGraph { const dependency: LfxGraphDependency = new LfxGraphDependency({ name: jsonLfxDependency.name, versionPath: jsonLfxDependency.versionPath, - dependencyType: jsonLfxDependency.dependencyType, - containingEntry: entry, entryId: jsonLfxDependency.entryId, + originalSpecifier: jsonLfxDependency.originalSpecifier, + dependencyType: jsonLfxDependency.dependencyType, peerDependencyMeta: { name: jsonLfxDependency.peerDependencyMeta.name, version: jsonLfxDependency.peerDependencyMeta.version, optional: jsonLfxDependency.peerDependencyMeta.optional - } + }, + containingEntry: entry }); if (jsonLfxDependency.resolvedEntryJsonId) { diff --git a/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts b/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts index d486b172df4..2607bd37048 100644 --- a/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts +++ b/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts @@ -41,10 +41,11 @@ function createPackageLockfileDependency(options: { const result: ILfxGraphDependencyOptions = { name, versionPath, - dependencyType, - containingEntry, entryId: '', - peerDependencyMeta: {} + originalSpecifier: '', + dependencyType, + peerDependencyMeta: {}, + containingEntry }; if (versionPath.startsWith('link:')) { diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap index 51442525001..e948dc45b08 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap @@ -6,6 +6,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /color/5.0.2 name: color + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 8 versionPath: 5.0.2 @@ -24,6 +25,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /color-string/2.1.2 name: color-string + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 7 versionPath: 2.1.2 @@ -42,12 +44,14 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /has-symbols/1.0.2 name: has-symbols + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 9 versionPath: 1.0.2 - dependencyType: regular entryId: project:link-specifier/target-folder name: target-folder + originalSpecifier: '' peerDependencyMeta: {} versionPath: link:../target-folder displayText: 'Project: linker' @@ -65,12 +69,14 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /address/1.2.2 name: address + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 4 versionPath: 1.2.2 - dependencyType: regular entryId: /uri-js/4.4.1 name: uri-js + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 11 versionPath: 4.4.1 @@ -102,6 +108,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /color-name/2.0.2 name: color-name + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 2.0.2 @@ -135,6 +142,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /color-name/2.0.2 name: color-name + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 2.0.2 @@ -155,12 +163,14 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /color-convert/3.1.2 name: color-convert + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 5 versionPath: 3.1.2 - dependencyType: regular entryId: /color-string/2.1.2 name: color-string + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 7 versionPath: 2.1.2 @@ -180,6 +190,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: '' name: target-folder + originalSpecifier: '' peerDependencyMeta: {} versionPath: link:link-specifier/target-folder displayText: has-symbols 1.0.2 @@ -211,6 +222,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /punycode/2.3.1 name: punycode + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 10 versionPath: 2.3.1 diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap index 51442525001..e948dc45b08 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap @@ -6,6 +6,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /color/5.0.2 name: color + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 8 versionPath: 5.0.2 @@ -24,6 +25,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /color-string/2.1.2 name: color-string + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 7 versionPath: 2.1.2 @@ -42,12 +44,14 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /has-symbols/1.0.2 name: has-symbols + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 9 versionPath: 1.0.2 - dependencyType: regular entryId: project:link-specifier/target-folder name: target-folder + originalSpecifier: '' peerDependencyMeta: {} versionPath: link:../target-folder displayText: 'Project: linker' @@ -65,12 +69,14 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /address/1.2.2 name: address + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 4 versionPath: 1.2.2 - dependencyType: regular entryId: /uri-js/4.4.1 name: uri-js + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 11 versionPath: 4.4.1 @@ -102,6 +108,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /color-name/2.0.2 name: color-name + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 2.0.2 @@ -135,6 +142,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /color-name/2.0.2 name: color-name + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 2.0.2 @@ -155,12 +163,14 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /color-convert/3.1.2 name: color-convert + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 5 versionPath: 3.1.2 - dependencyType: regular entryId: /color-string/2.1.2 name: color-string + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 7 versionPath: 2.1.2 @@ -180,6 +190,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: '' name: target-folder + originalSpecifier: '' peerDependencyMeta: {} versionPath: link:link-specifier/target-folder displayText: has-symbols 1.0.2 @@ -211,6 +222,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /punycode/2.3.1 name: punycode + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 10 versionPath: 2.3.1 diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap index 141870ab980..000f5287edf 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap @@ -6,6 +6,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: color@5.0.2 name: color + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 8 versionPath: 5.0.2 @@ -24,6 +25,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: color-string@2.1.2 name: color-string + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 7 versionPath: 2.1.2 @@ -42,12 +44,14 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: has-symbols@1.0.2 name: has-symbols + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 9 versionPath: 1.0.2 - dependencyType: regular entryId: project:link-specifier/target-folder name: target-folder + originalSpecifier: '' peerDependencyMeta: {} versionPath: link:../target-folder displayText: 'Project: linker' @@ -65,12 +69,14 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: address@1.2.2 name: address + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 4 versionPath: 1.2.2 - dependencyType: regular entryId: uri-js@4.4.1 name: uri-js + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 11 versionPath: 4.4.1 @@ -102,6 +108,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: color-name@2.0.2 name: color-name + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 2.0.2 @@ -135,6 +142,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: color-name@2.0.2 name: color-name + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 2.0.2 @@ -155,12 +163,14 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: color-convert@3.1.2 name: color-convert + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 5 versionPath: 3.1.2 - dependencyType: regular entryId: color-string@2.1.2 name: color-string + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 7 versionPath: 2.1.2 @@ -180,6 +190,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: '' name: target-folder + originalSpecifier: '' peerDependencyMeta: {} versionPath: link:link-specifier/target-folder displayText: has-symbols 1.0.2 @@ -211,6 +222,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: punycode@2.3.1 name: punycode + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 10 versionPath: 2.3.1 diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v5.4.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v5.4.test.ts.snap index bcbb2a1c0a5..410eb0bd112 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v5.4.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v5.4.test.ts.snap @@ -6,6 +6,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/d name: '@rushstack/d' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 3 versionPath: link:../d @@ -24,12 +25,14 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/d name: '@rushstack/d' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 3 versionPath: link:../d - dependencyType: regular entryId: /@rushstack/n/2.0.0 name: '@rushstack/n' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 11 versionPath: 2.0.0 @@ -48,18 +51,21 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/e name: '@rushstack/e' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 4 versionPath: link:../e - dependencyType: regular entryId: /@rushstack/k/1.0.0_@rushstack+m@1.0.0 name: '@rushstack/k' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 1.0.0_@rushstack+m@1.0.0 - dependencyType: regular entryId: /@rushstack/m/1.0.0 name: '@rushstack/m' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 10 versionPath: 1.0.0 @@ -78,18 +84,21 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/e name: '@rushstack/e' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 4 versionPath: link:../e - dependencyType: regular entryId: /@rushstack/j/1.0.0_@rushstack+n@2.0.0 name: '@rushstack/j' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 5 versionPath: 1.0.0_@rushstack+n@2.0.0 - dependencyType: regular entryId: /@rushstack/n/2.0.0 name: '@rushstack/n' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 11 versionPath: 2.0.0 @@ -110,6 +119,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /@rushstack/n/3.0.0 name: '@rushstack/n' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 12 versionPath: 3.0.0 @@ -130,12 +140,14 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /@rushstack/k/1.0.0_wxpgugna4ivthu7yyu4fmciltu name: '@rushstack/k' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 7 versionPath: 1.0.0_wxpgugna4ivthu7yyu4fmciltu - dependencyType: regular entryId: /@rushstack/m/1.0.0 name: '@rushstack/m' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 10 versionPath: 1.0.0 @@ -156,6 +168,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /@rushstack/l/1.0.0_@rushstack+m@1.0.0 name: '@rushstack/l' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 8 versionPath: 1.0.0_@rushstack+m@1.0.0 @@ -177,6 +190,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /@rushstack/l/1.0.0_wxpgugna4ivthu7yyu4fmciltu name: '@rushstack/l' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 9 versionPath: 1.0.0_wxpgugna4ivthu7yyu4fmciltu @@ -198,12 +212,14 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /@rushstack/m/1.0.0 name: '@rushstack/m' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 10 versionPath: 1.0.0 - dependencyType: peer entryId: 'Peer: @rushstack/m' name: '@rushstack/m' + originalSpecifier: '' peerDependencyMeta: name: '@rushstack/m' optional: false @@ -212,6 +228,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - dependencyType: peer entryId: 'Peer: @rushstack/n' name: '@rushstack/n' + originalSpecifier: '' peerDependencyMeta: name: '@rushstack/n' optional: true @@ -233,18 +250,21 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /@rushstack/m/1.0.0 name: '@rushstack/m' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 10 versionPath: 1.0.0 - dependencyType: regular entryId: /@rushstack/n/2.0.0 name: '@rushstack/n' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 11 versionPath: 2.0.0 - dependencyType: peer entryId: 'Peer: @rushstack/m' name: '@rushstack/m' + originalSpecifier: '' peerDependencyMeta: name: '@rushstack/m' optional: false @@ -253,6 +273,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - dependencyType: peer entryId: 'Peer: @rushstack/n' name: '@rushstack/n' + originalSpecifier: '' peerDependencyMeta: name: '@rushstack/n' optional: true diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v6.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v6.0.test.ts.snap index f00c63c3505..552834469da 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v6.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v6.0.test.ts.snap @@ -6,6 +6,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/d name: '@rushstack/d' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 3 versionPath: link:../d @@ -24,12 +25,14 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/d name: '@rushstack/d' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 3 versionPath: link:../d - dependencyType: regular entryId: /@rushstack/n@2.0.0 name: '@rushstack/n' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 9 versionPath: 2.0.0 @@ -48,18 +51,21 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/e name: '@rushstack/e' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 4 versionPath: link:../e - dependencyType: regular entryId: /@rushstack/k@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) name: '@rushstack/k' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) - dependencyType: regular entryId: /@rushstack/m@1.0.0 name: '@rushstack/m' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 8 versionPath: 1.0.0 @@ -78,18 +84,21 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/e name: '@rushstack/e' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 4 versionPath: link:../e - dependencyType: regular entryId: /@rushstack/j@1.0.0(@rushstack/n@2.0.0) name: '@rushstack/j' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 5 versionPath: 1.0.0(@rushstack/n@2.0.0) - dependencyType: regular entryId: /@rushstack/n@2.0.0 name: '@rushstack/n' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 9 versionPath: 2.0.0 @@ -110,6 +119,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` - dependencyType: regular entryId: /@rushstack/n@3.0.0 name: '@rushstack/n' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 10 versionPath: 3.0.0 @@ -130,12 +140,14 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` - dependencyType: regular entryId: /@rushstack/k@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) name: '@rushstack/k' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) - dependencyType: regular entryId: /@rushstack/m@1.0.0 name: '@rushstack/m' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 8 versionPath: 1.0.0 @@ -156,6 +168,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` - dependencyType: regular entryId: /@rushstack/l@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) name: '@rushstack/l' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 7 versionPath: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) @@ -179,18 +192,21 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` - dependencyType: regular entryId: /@rushstack/m@1.0.0 name: '@rushstack/m' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 8 versionPath: 1.0.0 - dependencyType: regular entryId: /@rushstack/n@2.0.0 name: '@rushstack/n' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 9 versionPath: 2.0.0 - dependencyType: peer entryId: 'Peer: @rushstack/m' name: '@rushstack/m' + originalSpecifier: '' peerDependencyMeta: name: '@rushstack/m' optional: false @@ -199,6 +215,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` - dependencyType: peer entryId: 'Peer: @rushstack/n' name: '@rushstack/n' + originalSpecifier: '' peerDependencyMeta: name: '@rushstack/n' optional: true diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap index 0605cc04cbf..6d02ba6ae6f 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap @@ -6,6 +6,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/d name: '@rushstack/d' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 3 versionPath: link:../d @@ -24,12 +25,14 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/d name: '@rushstack/d' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 3 versionPath: link:../d - dependencyType: regular entryId: '@rushstack/n@2.0.0' name: '@rushstack/n' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 9 versionPath: 2.0.0 @@ -48,18 +51,21 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/e name: '@rushstack/e' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 4 versionPath: link:../e - dependencyType: regular entryId: '@rushstack/k@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0)' name: '@rushstack/k' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) - dependencyType: regular entryId: '@rushstack/m@1.0.0' name: '@rushstack/m' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 8 versionPath: 1.0.0 @@ -78,18 +84,21 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/e name: '@rushstack/e' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 4 versionPath: link:../e - dependencyType: regular entryId: '@rushstack/j@1.0.0(@rushstack/n@2.0.0)' name: '@rushstack/j' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 5 versionPath: 1.0.0(@rushstack/n@2.0.0) - dependencyType: regular entryId: '@rushstack/n@2.0.0' name: '@rushstack/n' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 9 versionPath: 2.0.0 @@ -110,6 +119,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: '@rushstack/n@3.0.0' name: '@rushstack/n' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 10 versionPath: 3.0.0 @@ -130,12 +140,14 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: '@rushstack/k@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0)' name: '@rushstack/k' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) - dependencyType: regular entryId: '@rushstack/m@1.0.0' name: '@rushstack/m' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 8 versionPath: 1.0.0 @@ -156,6 +168,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: '@rushstack/l@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0)' name: '@rushstack/l' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 7 versionPath: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) @@ -179,12 +192,14 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: '@rushstack/m@1.0.0' name: '@rushstack/m' + originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 8 versionPath: 1.0.0 - dependencyType: peer entryId: 'Peer: @rushstack/m' name: '@rushstack/m' + originalSpecifier: '' peerDependencyMeta: name: '@rushstack/m' optional: false @@ -193,6 +208,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` - dependencyType: peer entryId: 'Peer: @rushstack/n' name: '@rushstack/n' + originalSpecifier: '' peerDependencyMeta: name: '@rushstack/n' optional: true diff --git a/apps/lockfile-explorer/src/graph/test/serializeToJson.test.ts b/apps/lockfile-explorer/src/graph/test/serializeToJson.test.ts index 8b11c9b01d9..286f1c93887 100644 --- a/apps/lockfile-explorer/src/graph/test/serializeToJson.test.ts +++ b/apps/lockfile-explorer/src/graph/test/serializeToJson.test.ts @@ -19,6 +19,7 @@ Object { "dependencyType": "regular", "entryId": "/@testPackage/core/1.7.1", "name": "@testPackage/core", + "originalSpecifier": "", "peerDependencyMeta": Object { "name": undefined, "optional": undefined, @@ -31,6 +32,7 @@ Object { "dependencyType": "regular", "entryId": "/@testPackage2/core/1.7.1", "name": "@testPackage2/core", + "originalSpecifier": "", "peerDependencyMeta": Object { "name": undefined, "optional": undefined, From cc73926c334478ad499fb6ee8eb607f34685b222 Mon Sep 17 00:00:00 2001 From: Pete Gonzalez <4673363+octogonz@users.noreply.github.com> Date: Wed, 1 Oct 2025 19:47:19 -0700 Subject: [PATCH 08/15] Update lfxGraph-edge-cases fixtures to add devDependencies example --- .../lfxGraph-edge-cases-v5.4.test.ts.snap | 132 +++++++++++------- .../lfxGraph-edge-cases-v6.0.test.ts.snap | 132 +++++++++++------- .../lfxGraph-edge-cases-v9.0.test.ts.snap | 132 +++++++++++------- .../fixtures/edge-cases/pnpm-lock-v5.4.yaml | 33 +++-- .../fixtures/edge-cases/pnpm-lock-v6.0.yaml | 34 +++-- .../fixtures/edge-cases/pnpm-lock-v9.0.yaml | 32 ++++- 6 files changed, 323 insertions(+), 172 deletions(-) diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap index e948dc45b08..66c7a6b8925 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap @@ -2,23 +2,42 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` "entries: + - dependencies: + - dependencyType: dev + entryId: /color-string/2.1.2 + name: color-string + originalSpecifier: '' + peerDependencyMeta: {} + resolvedEntryJsonId: 8 + versionPath: 2.1.2 + displayText: 'Project: dev-dependencies' + entryId: project:packages/dev-dependencies + entryPackageName: dev-dependencies + entryPackageVersion: '' + entrySuffix: '' + jsonId: 0 + kind: 1 + packageJsonFolderPath: packages/dev-dependencies + rawEntryId: packages/dev-dependencies + referrerJsonIds: [] + transitivePeerDependencies: [] - dependencies: - dependencyType: regular entryId: /color/5.0.2 name: color originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 8 + resolvedEntryJsonId: 9 versionPath: 5.0.2 - displayText: 'Project: duplicate (duplicate-1/duplicate)' - entryId: project:duplicate-1/duplicate - entryPackageName: duplicate (duplicate-1/duplicate) + displayText: 'Project: duplicate (packages/duplicate-1/duplicate)' + entryId: project:packages/duplicate-1/duplicate + entryPackageName: duplicate (packages/duplicate-1/duplicate) entryPackageVersion: '' entrySuffix: '' - jsonId: 0 + jsonId: 1 kind: 1 - packageJsonFolderPath: duplicate-1/duplicate - rawEntryId: duplicate-1/duplicate + packageJsonFolderPath: packages/duplicate-1/duplicate + rawEntryId: packages/duplicate-1/duplicate referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: @@ -27,17 +46,17 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: color-string originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 7 + resolvedEntryJsonId: 8 versionPath: 2.1.2 - displayText: 'Project: duplicate (duplicate-2/duplicate)' - entryId: project:duplicate-2/duplicate - entryPackageName: duplicate (duplicate-2/duplicate) + displayText: 'Project: duplicate (packages/duplicate-2/duplicate)' + entryId: project:packages/duplicate-2/duplicate + entryPackageName: duplicate (packages/duplicate-2/duplicate) entryPackageVersion: '' entrySuffix: '' - jsonId: 1 + jsonId: 2 kind: 1 - packageJsonFolderPath: duplicate-2/duplicate - rawEntryId: duplicate-2/duplicate + packageJsonFolderPath: packages/duplicate-2/duplicate + rawEntryId: packages/duplicate-2/duplicate referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: @@ -46,23 +65,23 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: has-symbols originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 9 + resolvedEntryJsonId: 10 versionPath: 1.0.2 - dependencyType: regular - entryId: project:link-specifier/target-folder + entryId: project:packages/link-specifier/linker/packages/link-specifier/target-folder name: target-folder originalSpecifier: '' peerDependencyMeta: {} - versionPath: link:../target-folder + versionPath: link:packages/link-specifier/target-folder displayText: 'Project: linker' - entryId: project:link-specifier/linker + entryId: project:packages/link-specifier/linker entryPackageName: linker entryPackageVersion: '' entrySuffix: '' - jsonId: 2 + jsonId: 3 kind: 1 - packageJsonFolderPath: link-specifier/linker - rawEntryId: link-specifier/linker + packageJsonFolderPath: packages/link-specifier/linker + rawEntryId: packages/link-specifier/linker referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: @@ -71,24 +90,24 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: address originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 4 + resolvedEntryJsonId: 5 versionPath: 1.2.2 - dependencyType: regular entryId: /uri-js/4.4.1 name: uri-js originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 11 + resolvedEntryJsonId: 13 versionPath: 4.4.1 displayText: 'Project: pnpmfile-transforms' - entryId: project:pnpmfile-transforms + entryId: project:packages/pnpmfile-transforms entryPackageName: pnpmfile-transforms entryPackageVersion: '' entrySuffix: '' - jsonId: 3 + jsonId: 4 kind: 1 - packageJsonFolderPath: pnpmfile-transforms - rawEntryId: pnpmfile-transforms + packageJsonFolderPath: packages/pnpmfile-transforms + rawEntryId: packages/pnpmfile-transforms referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: [] @@ -97,12 +116,12 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` entryPackageName: address entryPackageVersion: 1.2.2 entrySuffix: '' - jsonId: 4 + jsonId: 5 kind: 2 packageJsonFolderPath: node_modules/.pnpm/address@1.2.2/node_modules/address rawEntryId: /address/1.2.2 referrerJsonIds: - - 3 + - 4 transitivePeerDependencies: [] - dependencies: - dependencyType: regular @@ -110,19 +129,19 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: color-name originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 6 + resolvedEntryJsonId: 7 versionPath: 2.0.2 displayText: color-convert 3.1.2 entryId: '' entryPackageName: color-convert entryPackageVersion: 3.1.2 entrySuffix: '' - jsonId: 5 + jsonId: 6 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color-convert@3.1.2/node_modules/color-convert rawEntryId: /color-convert/3.1.2 referrerJsonIds: - - 8 + - 9 transitivePeerDependencies: [] - dependencies: [] displayText: color-name 2.0.2 @@ -130,13 +149,13 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` entryPackageName: color-name entryPackageVersion: 2.0.2 entrySuffix: '' - jsonId: 6 + jsonId: 7 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color-name@2.0.2/node_modules/color-name rawEntryId: /color-name/2.0.2 referrerJsonIds: - - 5 - - 7 + - 6 + - 8 transitivePeerDependencies: [] - dependencies: - dependencyType: regular @@ -144,20 +163,21 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: color-name originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 6 + resolvedEntryJsonId: 7 versionPath: 2.0.2 displayText: color-string 2.1.2 entryId: '' entryPackageName: color-string entryPackageVersion: 2.1.2 entrySuffix: '' - jsonId: 7 + jsonId: 8 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color-string@2.1.2/node_modules/color-string rawEntryId: /color-string/2.1.2 referrerJsonIds: - - 1 - - 8 + - 0 + - 2 + - 9 transitivePeerDependencies: [] - dependencies: - dependencyType: regular @@ -165,26 +185,26 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: color-convert originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 5 + resolvedEntryJsonId: 6 versionPath: 3.1.2 - dependencyType: regular entryId: /color-string/2.1.2 name: color-string originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 7 + resolvedEntryJsonId: 8 versionPath: 2.1.2 displayText: color 5.0.2 entryId: '' entryPackageName: color entryPackageVersion: 5.0.2 entrySuffix: '' - jsonId: 8 + jsonId: 9 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color@5.0.2/node_modules/color rawEntryId: /color/5.0.2 referrerJsonIds: - - 0 + - 1 transitivePeerDependencies: [] - dependencies: - dependencyType: regular @@ -198,12 +218,24 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` entryPackageName: has-symbols entryPackageVersion: 1.0.2 entrySuffix: '' - jsonId: 9 + jsonId: 10 kind: 2 packageJsonFolderPath: node_modules/.pnpm/has-symbols@1.0.2/node_modules/has-symbols rawEntryId: /has-symbols/1.0.2 referrerJsonIds: - - 2 + - 3 + transitivePeerDependencies: [] + - dependencies: [] + displayText: mime-db 1.54.0 + entryId: '' + entryPackageName: mime-db + entryPackageVersion: 1.54.0 + entrySuffix: '' + jsonId: 11 + kind: 2 + packageJsonFolderPath: node_modules/.pnpm/mime-db@1.54.0/node_modules/mime-db + rawEntryId: /mime-db/1.54.0 + referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: [] displayText: punycode 2.3.1 @@ -211,12 +243,12 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` entryPackageName: punycode entryPackageVersion: 2.3.1 entrySuffix: '' - jsonId: 10 + jsonId: 12 kind: 2 packageJsonFolderPath: node_modules/.pnpm/punycode@2.3.1/node_modules/punycode rawEntryId: /punycode/2.3.1 referrerJsonIds: - - 11 + - 13 transitivePeerDependencies: [] - dependencies: - dependencyType: regular @@ -224,19 +256,19 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: punycode originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 10 + resolvedEntryJsonId: 12 versionPath: 2.3.1 displayText: uri-js 4.4.1 entryId: '' entryPackageName: uri-js entryPackageVersion: 4.4.1 entrySuffix: '' - jsonId: 11 + jsonId: 13 kind: 2 packageJsonFolderPath: node_modules/.pnpm/uri-js@4.4.1/node_modules/uri-js rawEntryId: /uri-js/4.4.1 referrerJsonIds: - - 3 + - 4 transitivePeerDependencies: [] workspace: pnpmLockfileFolder: '' diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap index e948dc45b08..66c7a6b8925 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap @@ -2,23 +2,42 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` "entries: + - dependencies: + - dependencyType: dev + entryId: /color-string/2.1.2 + name: color-string + originalSpecifier: '' + peerDependencyMeta: {} + resolvedEntryJsonId: 8 + versionPath: 2.1.2 + displayText: 'Project: dev-dependencies' + entryId: project:packages/dev-dependencies + entryPackageName: dev-dependencies + entryPackageVersion: '' + entrySuffix: '' + jsonId: 0 + kind: 1 + packageJsonFolderPath: packages/dev-dependencies + rawEntryId: packages/dev-dependencies + referrerJsonIds: [] + transitivePeerDependencies: [] - dependencies: - dependencyType: regular entryId: /color/5.0.2 name: color originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 8 + resolvedEntryJsonId: 9 versionPath: 5.0.2 - displayText: 'Project: duplicate (duplicate-1/duplicate)' - entryId: project:duplicate-1/duplicate - entryPackageName: duplicate (duplicate-1/duplicate) + displayText: 'Project: duplicate (packages/duplicate-1/duplicate)' + entryId: project:packages/duplicate-1/duplicate + entryPackageName: duplicate (packages/duplicate-1/duplicate) entryPackageVersion: '' entrySuffix: '' - jsonId: 0 + jsonId: 1 kind: 1 - packageJsonFolderPath: duplicate-1/duplicate - rawEntryId: duplicate-1/duplicate + packageJsonFolderPath: packages/duplicate-1/duplicate + rawEntryId: packages/duplicate-1/duplicate referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: @@ -27,17 +46,17 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: color-string originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 7 + resolvedEntryJsonId: 8 versionPath: 2.1.2 - displayText: 'Project: duplicate (duplicate-2/duplicate)' - entryId: project:duplicate-2/duplicate - entryPackageName: duplicate (duplicate-2/duplicate) + displayText: 'Project: duplicate (packages/duplicate-2/duplicate)' + entryId: project:packages/duplicate-2/duplicate + entryPackageName: duplicate (packages/duplicate-2/duplicate) entryPackageVersion: '' entrySuffix: '' - jsonId: 1 + jsonId: 2 kind: 1 - packageJsonFolderPath: duplicate-2/duplicate - rawEntryId: duplicate-2/duplicate + packageJsonFolderPath: packages/duplicate-2/duplicate + rawEntryId: packages/duplicate-2/duplicate referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: @@ -46,23 +65,23 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: has-symbols originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 9 + resolvedEntryJsonId: 10 versionPath: 1.0.2 - dependencyType: regular - entryId: project:link-specifier/target-folder + entryId: project:packages/link-specifier/linker/packages/link-specifier/target-folder name: target-folder originalSpecifier: '' peerDependencyMeta: {} - versionPath: link:../target-folder + versionPath: link:packages/link-specifier/target-folder displayText: 'Project: linker' - entryId: project:link-specifier/linker + entryId: project:packages/link-specifier/linker entryPackageName: linker entryPackageVersion: '' entrySuffix: '' - jsonId: 2 + jsonId: 3 kind: 1 - packageJsonFolderPath: link-specifier/linker - rawEntryId: link-specifier/linker + packageJsonFolderPath: packages/link-specifier/linker + rawEntryId: packages/link-specifier/linker referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: @@ -71,24 +90,24 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: address originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 4 + resolvedEntryJsonId: 5 versionPath: 1.2.2 - dependencyType: regular entryId: /uri-js/4.4.1 name: uri-js originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 11 + resolvedEntryJsonId: 13 versionPath: 4.4.1 displayText: 'Project: pnpmfile-transforms' - entryId: project:pnpmfile-transforms + entryId: project:packages/pnpmfile-transforms entryPackageName: pnpmfile-transforms entryPackageVersion: '' entrySuffix: '' - jsonId: 3 + jsonId: 4 kind: 1 - packageJsonFolderPath: pnpmfile-transforms - rawEntryId: pnpmfile-transforms + packageJsonFolderPath: packages/pnpmfile-transforms + rawEntryId: packages/pnpmfile-transforms referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: [] @@ -97,12 +116,12 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` entryPackageName: address entryPackageVersion: 1.2.2 entrySuffix: '' - jsonId: 4 + jsonId: 5 kind: 2 packageJsonFolderPath: node_modules/.pnpm/address@1.2.2/node_modules/address rawEntryId: /address/1.2.2 referrerJsonIds: - - 3 + - 4 transitivePeerDependencies: [] - dependencies: - dependencyType: regular @@ -110,19 +129,19 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: color-name originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 6 + resolvedEntryJsonId: 7 versionPath: 2.0.2 displayText: color-convert 3.1.2 entryId: '' entryPackageName: color-convert entryPackageVersion: 3.1.2 entrySuffix: '' - jsonId: 5 + jsonId: 6 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color-convert@3.1.2/node_modules/color-convert rawEntryId: /color-convert/3.1.2 referrerJsonIds: - - 8 + - 9 transitivePeerDependencies: [] - dependencies: [] displayText: color-name 2.0.2 @@ -130,13 +149,13 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` entryPackageName: color-name entryPackageVersion: 2.0.2 entrySuffix: '' - jsonId: 6 + jsonId: 7 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color-name@2.0.2/node_modules/color-name rawEntryId: /color-name/2.0.2 referrerJsonIds: - - 5 - - 7 + - 6 + - 8 transitivePeerDependencies: [] - dependencies: - dependencyType: regular @@ -144,20 +163,21 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: color-name originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 6 + resolvedEntryJsonId: 7 versionPath: 2.0.2 displayText: color-string 2.1.2 entryId: '' entryPackageName: color-string entryPackageVersion: 2.1.2 entrySuffix: '' - jsonId: 7 + jsonId: 8 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color-string@2.1.2/node_modules/color-string rawEntryId: /color-string/2.1.2 referrerJsonIds: - - 1 - - 8 + - 0 + - 2 + - 9 transitivePeerDependencies: [] - dependencies: - dependencyType: regular @@ -165,26 +185,26 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: color-convert originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 5 + resolvedEntryJsonId: 6 versionPath: 3.1.2 - dependencyType: regular entryId: /color-string/2.1.2 name: color-string originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 7 + resolvedEntryJsonId: 8 versionPath: 2.1.2 displayText: color 5.0.2 entryId: '' entryPackageName: color entryPackageVersion: 5.0.2 entrySuffix: '' - jsonId: 8 + jsonId: 9 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color@5.0.2/node_modules/color rawEntryId: /color/5.0.2 referrerJsonIds: - - 0 + - 1 transitivePeerDependencies: [] - dependencies: - dependencyType: regular @@ -198,12 +218,24 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` entryPackageName: has-symbols entryPackageVersion: 1.0.2 entrySuffix: '' - jsonId: 9 + jsonId: 10 kind: 2 packageJsonFolderPath: node_modules/.pnpm/has-symbols@1.0.2/node_modules/has-symbols rawEntryId: /has-symbols/1.0.2 referrerJsonIds: - - 2 + - 3 + transitivePeerDependencies: [] + - dependencies: [] + displayText: mime-db 1.54.0 + entryId: '' + entryPackageName: mime-db + entryPackageVersion: 1.54.0 + entrySuffix: '' + jsonId: 11 + kind: 2 + packageJsonFolderPath: node_modules/.pnpm/mime-db@1.54.0/node_modules/mime-db + rawEntryId: /mime-db/1.54.0 + referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: [] displayText: punycode 2.3.1 @@ -211,12 +243,12 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` entryPackageName: punycode entryPackageVersion: 2.3.1 entrySuffix: '' - jsonId: 10 + jsonId: 12 kind: 2 packageJsonFolderPath: node_modules/.pnpm/punycode@2.3.1/node_modules/punycode rawEntryId: /punycode/2.3.1 referrerJsonIds: - - 11 + - 13 transitivePeerDependencies: [] - dependencies: - dependencyType: regular @@ -224,19 +256,19 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` name: punycode originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 10 + resolvedEntryJsonId: 12 versionPath: 2.3.1 displayText: uri-js 4.4.1 entryId: '' entryPackageName: uri-js entryPackageVersion: 4.4.1 entrySuffix: '' - jsonId: 11 + jsonId: 13 kind: 2 packageJsonFolderPath: node_modules/.pnpm/uri-js@4.4.1/node_modules/uri-js rawEntryId: /uri-js/4.4.1 referrerJsonIds: - - 3 + - 4 transitivePeerDependencies: [] workspace: pnpmLockfileFolder: '' diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap index 000f5287edf..2283e1eb686 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap @@ -2,23 +2,42 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` "entries: + - dependencies: + - dependencyType: dev + entryId: color-string@2.1.2 + name: color-string + originalSpecifier: '' + peerDependencyMeta: {} + resolvedEntryJsonId: 8 + versionPath: 2.1.2 + displayText: 'Project: dev-dependencies' + entryId: project:packages/dev-dependencies + entryPackageName: dev-dependencies + entryPackageVersion: '' + entrySuffix: '' + jsonId: 0 + kind: 1 + packageJsonFolderPath: packages/dev-dependencies + rawEntryId: packages/dev-dependencies + referrerJsonIds: [] + transitivePeerDependencies: [] - dependencies: - dependencyType: regular entryId: color@5.0.2 name: color originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 8 + resolvedEntryJsonId: 9 versionPath: 5.0.2 - displayText: 'Project: duplicate (duplicate-1/duplicate)' - entryId: project:duplicate-1/duplicate - entryPackageName: duplicate (duplicate-1/duplicate) + displayText: 'Project: duplicate (packages/duplicate-1/duplicate)' + entryId: project:packages/duplicate-1/duplicate + entryPackageName: duplicate (packages/duplicate-1/duplicate) entryPackageVersion: '' entrySuffix: '' - jsonId: 0 + jsonId: 1 kind: 1 - packageJsonFolderPath: duplicate-1/duplicate - rawEntryId: duplicate-1/duplicate + packageJsonFolderPath: packages/duplicate-1/duplicate + rawEntryId: packages/duplicate-1/duplicate referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: @@ -27,17 +46,17 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` name: color-string originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 7 + resolvedEntryJsonId: 8 versionPath: 2.1.2 - displayText: 'Project: duplicate (duplicate-2/duplicate)' - entryId: project:duplicate-2/duplicate - entryPackageName: duplicate (duplicate-2/duplicate) + displayText: 'Project: duplicate (packages/duplicate-2/duplicate)' + entryId: project:packages/duplicate-2/duplicate + entryPackageName: duplicate (packages/duplicate-2/duplicate) entryPackageVersion: '' entrySuffix: '' - jsonId: 1 + jsonId: 2 kind: 1 - packageJsonFolderPath: duplicate-2/duplicate - rawEntryId: duplicate-2/duplicate + packageJsonFolderPath: packages/duplicate-2/duplicate + rawEntryId: packages/duplicate-2/duplicate referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: @@ -46,23 +65,23 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` name: has-symbols originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 9 + resolvedEntryJsonId: 10 versionPath: 1.0.2 - dependencyType: regular - entryId: project:link-specifier/target-folder + entryId: project:packages/link-specifier/linker/packages/link-specifier/target-folder name: target-folder originalSpecifier: '' peerDependencyMeta: {} - versionPath: link:../target-folder + versionPath: link:packages/link-specifier/target-folder displayText: 'Project: linker' - entryId: project:link-specifier/linker + entryId: project:packages/link-specifier/linker entryPackageName: linker entryPackageVersion: '' entrySuffix: '' - jsonId: 2 + jsonId: 3 kind: 1 - packageJsonFolderPath: link-specifier/linker - rawEntryId: link-specifier/linker + packageJsonFolderPath: packages/link-specifier/linker + rawEntryId: packages/link-specifier/linker referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: @@ -71,24 +90,24 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` name: address originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 4 + resolvedEntryJsonId: 5 versionPath: 1.2.2 - dependencyType: regular entryId: uri-js@4.4.1 name: uri-js originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 11 + resolvedEntryJsonId: 13 versionPath: 4.4.1 displayText: 'Project: pnpmfile-transforms' - entryId: project:pnpmfile-transforms + entryId: project:packages/pnpmfile-transforms entryPackageName: pnpmfile-transforms entryPackageVersion: '' entrySuffix: '' - jsonId: 3 + jsonId: 4 kind: 1 - packageJsonFolderPath: pnpmfile-transforms - rawEntryId: pnpmfile-transforms + packageJsonFolderPath: packages/pnpmfile-transforms + rawEntryId: packages/pnpmfile-transforms referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: [] @@ -97,12 +116,12 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` entryPackageName: address entryPackageVersion: 1.2.2 entrySuffix: '' - jsonId: 4 + jsonId: 5 kind: 2 packageJsonFolderPath: node_modules/.pnpm/address@1.2.2/node_modules/address rawEntryId: address@1.2.2 referrerJsonIds: - - 3 + - 4 transitivePeerDependencies: [] - dependencies: - dependencyType: regular @@ -110,19 +129,19 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` name: color-name originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 6 + resolvedEntryJsonId: 7 versionPath: 2.0.2 displayText: color-convert 3.1.2 entryId: '' entryPackageName: color-convert entryPackageVersion: 3.1.2 entrySuffix: '' - jsonId: 5 + jsonId: 6 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color-convert@3.1.2/node_modules/color-convert rawEntryId: color-convert@3.1.2 referrerJsonIds: - - 8 + - 9 transitivePeerDependencies: [] - dependencies: [] displayText: color-name 2.0.2 @@ -130,13 +149,13 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` entryPackageName: color-name entryPackageVersion: 2.0.2 entrySuffix: '' - jsonId: 6 + jsonId: 7 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color-name@2.0.2/node_modules/color-name rawEntryId: color-name@2.0.2 referrerJsonIds: - - 5 - - 7 + - 6 + - 8 transitivePeerDependencies: [] - dependencies: - dependencyType: regular @@ -144,20 +163,21 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` name: color-name originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 6 + resolvedEntryJsonId: 7 versionPath: 2.0.2 displayText: color-string 2.1.2 entryId: '' entryPackageName: color-string entryPackageVersion: 2.1.2 entrySuffix: '' - jsonId: 7 + jsonId: 8 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color-string@2.1.2/node_modules/color-string rawEntryId: color-string@2.1.2 referrerJsonIds: - - 1 - - 8 + - 0 + - 2 + - 9 transitivePeerDependencies: [] - dependencies: - dependencyType: regular @@ -165,26 +185,26 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` name: color-convert originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 5 + resolvedEntryJsonId: 6 versionPath: 3.1.2 - dependencyType: regular entryId: color-string@2.1.2 name: color-string originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 7 + resolvedEntryJsonId: 8 versionPath: 2.1.2 displayText: color 5.0.2 entryId: '' entryPackageName: color entryPackageVersion: 5.0.2 entrySuffix: '' - jsonId: 8 + jsonId: 9 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color@5.0.2/node_modules/color rawEntryId: color@5.0.2 referrerJsonIds: - - 0 + - 1 transitivePeerDependencies: [] - dependencies: - dependencyType: regular @@ -198,12 +218,24 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` entryPackageName: has-symbols entryPackageVersion: 1.0.2 entrySuffix: '' - jsonId: 9 + jsonId: 10 kind: 2 packageJsonFolderPath: node_modules/.pnpm/has-symbols@1.0.2/node_modules/has-symbols rawEntryId: has-symbols@1.0.2 referrerJsonIds: - - 2 + - 3 + transitivePeerDependencies: [] + - dependencies: [] + displayText: mime-db 1.54.0 + entryId: '' + entryPackageName: mime-db + entryPackageVersion: 1.54.0 + entrySuffix: '' + jsonId: 11 + kind: 2 + packageJsonFolderPath: node_modules/.pnpm/mime-db@1.54.0/node_modules/mime-db + rawEntryId: mime-db@1.54.0 + referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: [] displayText: punycode 2.3.1 @@ -211,12 +243,12 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` entryPackageName: punycode entryPackageVersion: 2.3.1 entrySuffix: '' - jsonId: 10 + jsonId: 12 kind: 2 packageJsonFolderPath: node_modules/.pnpm/punycode@2.3.1/node_modules/punycode rawEntryId: punycode@2.3.1 referrerJsonIds: - - 11 + - 13 transitivePeerDependencies: [] - dependencies: - dependencyType: regular @@ -224,19 +256,19 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` name: punycode originalSpecifier: '' peerDependencyMeta: {} - resolvedEntryJsonId: 10 + resolvedEntryJsonId: 12 versionPath: 2.3.1 displayText: uri-js 4.4.1 entryId: '' entryPackageName: uri-js entryPackageVersion: 4.4.1 entrySuffix: '' - jsonId: 11 + jsonId: 13 kind: 2 packageJsonFolderPath: node_modules/.pnpm/uri-js@4.4.1/node_modules/uri-js rawEntryId: uri-js@4.4.1 referrerJsonIds: - - 3 + - 4 transitivePeerDependencies: [] workspace: pnpmLockfileFolder: '' diff --git a/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v5.4.yaml b/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v5.4.yaml index b0c484355eb..73c960a6c85 100644 --- a/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v5.4.yaml +++ b/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v5.4.yaml @@ -1,27 +1,36 @@ lockfileVersion: 5.4 importers: - duplicate-1/duplicate: + packages/dev-dependencies: + specifiers: + color-string: ^2.1.2 + mime-db: ^1.52.0 + optionalDependencies: + mime-db: 1.54.0 + devDependencies: + color-string: 2.1.2 + + packages/duplicate-1/duplicate: specifiers: color: ^5.0.2 dependencies: color: 5.0.2 - duplicate-2/duplicate: + packages/duplicate-2/duplicate: specifiers: color-string: ^2.1.2 dependencies: color-string: 2.1.2 - link-specifier/linker: + packages/link-specifier/linker: specifiers: has-symbols: 1.0.2 - target-folder: link:../target-folder + target-folder: link:packages/link-specifier/target-folder dependencies: has-symbols: 1.0.2 - target-folder: link:../target-folder + target-folder: link:packages/link-specifier/target-folder - pnpmfile-transforms: + packages/pnpmfile-transforms: specifiers: address: ^1.0.0 uri-js: ^4.0.0 @@ -54,7 +63,6 @@ packages: integrity: sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A== } engines: { node: '>=12.20' } - dev: false /color-string/2.1.2: resolution: @@ -64,7 +72,6 @@ packages: engines: { node: '>=18' } dependencies: color-name: 2.0.2 - dev: false /color/5.0.2: resolution: @@ -87,6 +94,16 @@ packages: target-folder: link:link-specifier/target-folder dev: false + /mime-db/1.54.0: + resolution: + { + integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + } + engines: { node: '>= 0.6' } + requiresBuild: true + dev: false + optional: true + /punycode/2.3.1: resolution: { diff --git a/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v6.0.yaml b/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v6.0.yaml index 32ee423cff7..97159b9ae54 100644 --- a/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v6.0.yaml +++ b/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v6.0.yaml @@ -5,28 +5,38 @@ settings: excludeLinksFromLockfile: false importers: - duplicate-1/duplicate: + packages/dev-dependencies: + optionalDependencies: + mime-db: + specifier: ^1.52.0 + version: 1.54.0 + devDependencies: + color-string: + specifier: ^2.1.2 + version: 2.1.2 + + packages/duplicate-1/duplicate: dependencies: color: specifier: ^5.0.2 version: 5.0.2 - duplicate-2/duplicate: + packages/duplicate-2/duplicate: dependencies: color-string: specifier: ^2.1.2 version: 2.1.2 - link-specifier/linker: + packages/link-specifier/linker: dependencies: has-symbols: specifier: 1.0.2 version: 1.0.2 target-folder: - specifier: link:../target-folder - version: link:../target-folder + specifier: link:packages/link-specifier/target-folder + version: link:packages/link-specifier/target-folder - pnpmfile-transforms: + packages/pnpmfile-transforms: dependencies: address: specifier: ^1.0.0 @@ -60,7 +70,6 @@ packages: integrity: sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A== } engines: { node: '>=12.20' } - dev: false /color-string@2.1.2: resolution: @@ -70,7 +79,6 @@ packages: engines: { node: '>=18' } dependencies: color-name: 2.0.2 - dev: false /color@5.0.2: resolution: @@ -93,6 +101,16 @@ packages: target-folder: link:link-specifier/target-folder dev: false + /mime-db@1.54.0: + resolution: + { + integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + } + engines: { node: '>= 0.6' } + requiresBuild: true + dev: false + optional: true + /punycode@2.3.1: resolution: { diff --git a/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v9.0.yaml b/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v9.0.yaml index 7b936d5c515..291e25e638d 100644 --- a/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v9.0.yaml +++ b/apps/lockfile-explorer/src/graph/test/fixtures/edge-cases/pnpm-lock-v9.0.yaml @@ -7,28 +7,38 @@ settings: pnpmfileChecksum: sha256-tednqUPPat9y98NmpwR8320vxu2TlSor2aoYTxiNCdU= importers: - duplicate-1/duplicate: + packages/dev-dependencies: + devDependencies: + color-string: + specifier: ^2.1.2 + version: 2.1.2 + optionalDependencies: + mime-db: + specifier: ^1.52.0 + version: 1.54.0 + + packages/duplicate-1/duplicate: dependencies: color: specifier: ^5.0.2 version: 5.0.2 - duplicate-2/duplicate: + packages/duplicate-2/duplicate: dependencies: color-string: specifier: ^2.1.2 version: 2.1.2 - link-specifier/linker: + packages/link-specifier/linker: dependencies: has-symbols: specifier: 1.0.2 version: 1.0.2 target-folder: - specifier: link:../target-folder - version: link:../target-folder + specifier: link:packages/link-specifier/target-folder + version: link:packages/link-specifier/target-folder - pnpmfile-transforms: + packages/pnpmfile-transforms: dependencies: address: specifier: ^1.0.0 @@ -80,6 +90,13 @@ packages: } engines: { node: '>= 0.4' } + mime-db@1.54.0: + resolution: + { + integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + } + engines: { node: '>= 0.6' } + punycode@2.3.1: resolution: { @@ -115,6 +132,9 @@ snapshots: dependencies: target-folder: link:link-specifier/target-folder + mime-db@1.54.0: + optional: true + punycode@2.3.1: {} uri-js@4.4.1: From f9b0c66949a978e15e31e9247b3da683382ba560 Mon Sep 17 00:00:00 2001 From: Pete Gonzalez <4673363+octogonz@users.noreply.github.com> Date: Thu, 2 Oct 2025 21:46:41 -0700 Subject: [PATCH 09/15] Finish implementation for V9.0 code path --- .../lfxGraph-edge-cases-v9.0.test.ts.snap | 24 +++++++---- ...fxGraph-website-sample-1-v9.0.test.ts.snap | 40 ++++++++----------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap index 2283e1eb686..7ef7d82d34e 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap @@ -3,10 +3,17 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` "entries: - dependencies: + - dependencyType: regular + entryId: mime-db@1.54.0 + name: mime-db + originalSpecifier: ^1.52.0 + peerDependencyMeta: {} + resolvedEntryJsonId: 11 + versionPath: 1.54.0 - dependencyType: dev entryId: color-string@2.1.2 name: color-string - originalSpecifier: '' + originalSpecifier: ^2.1.2 peerDependencyMeta: {} resolvedEntryJsonId: 8 versionPath: 2.1.2 @@ -25,7 +32,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: color@5.0.2 name: color - originalSpecifier: '' + originalSpecifier: ^5.0.2 peerDependencyMeta: {} resolvedEntryJsonId: 9 versionPath: 5.0.2 @@ -44,7 +51,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: color-string@2.1.2 name: color-string - originalSpecifier: '' + originalSpecifier: ^2.1.2 peerDependencyMeta: {} resolvedEntryJsonId: 8 versionPath: 2.1.2 @@ -63,14 +70,14 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: has-symbols@1.0.2 name: has-symbols - originalSpecifier: '' + originalSpecifier: 1.0.2 peerDependencyMeta: {} resolvedEntryJsonId: 10 versionPath: 1.0.2 - dependencyType: regular entryId: project:packages/link-specifier/linker/packages/link-specifier/target-folder name: target-folder - originalSpecifier: '' + originalSpecifier: link:packages/link-specifier/target-folder peerDependencyMeta: {} versionPath: link:packages/link-specifier/target-folder displayText: 'Project: linker' @@ -88,14 +95,14 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: address@1.2.2 name: address - originalSpecifier: '' + originalSpecifier: ^1.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 5 versionPath: 1.2.2 - dependencyType: regular entryId: uri-js@4.4.1 name: uri-js - originalSpecifier: '' + originalSpecifier: ^4.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 13 versionPath: 4.4.1 @@ -235,7 +242,8 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` kind: 2 packageJsonFolderPath: node_modules/.pnpm/mime-db@1.54.0/node_modules/mime-db rawEntryId: mime-db@1.54.0 - referrerJsonIds: [] + referrerJsonIds: + - 0 transitivePeerDependencies: [] - dependencies: [] displayText: punycode 2.3.1 diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap index 6d02ba6ae6f..8acf2980f29 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap @@ -6,7 +6,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/d name: '@rushstack/d' - originalSpecifier: '' + originalSpecifier: workspace:* peerDependencyMeta: {} resolvedEntryJsonId: 3 versionPath: link:../d @@ -25,14 +25,14 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/d name: '@rushstack/d' - originalSpecifier: '' + originalSpecifier: workspace:* peerDependencyMeta: {} resolvedEntryJsonId: 3 versionPath: link:../d - dependencyType: regular entryId: '@rushstack/n@2.0.0' name: '@rushstack/n' - originalSpecifier: '' + originalSpecifier: ^2.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 9 versionPath: 2.0.0 @@ -51,21 +51,21 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/e name: '@rushstack/e' - originalSpecifier: '' + originalSpecifier: workspace:* peerDependencyMeta: {} resolvedEntryJsonId: 4 versionPath: link:../e - dependencyType: regular entryId: '@rushstack/k@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0)' name: '@rushstack/k' - originalSpecifier: '' + originalSpecifier: ^1.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) - dependencyType: regular entryId: '@rushstack/m@1.0.0' name: '@rushstack/m' - originalSpecifier: '' + originalSpecifier: ~1.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 8 versionPath: 1.0.0 @@ -84,21 +84,21 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/e name: '@rushstack/e' - originalSpecifier: '' + originalSpecifier: workspace:* peerDependencyMeta: {} resolvedEntryJsonId: 4 versionPath: link:../e - dependencyType: regular entryId: '@rushstack/j@1.0.0(@rushstack/n@2.0.0)' name: '@rushstack/j' - originalSpecifier: '' + originalSpecifier: ^1.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 5 versionPath: 1.0.0(@rushstack/n@2.0.0) - dependencyType: regular entryId: '@rushstack/n@2.0.0' name: '@rushstack/n' - originalSpecifier: '' + originalSpecifier: ^2.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 9 versionPath: 2.0.0 @@ -119,7 +119,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` - dependencyType: regular entryId: '@rushstack/n@3.0.0' name: '@rushstack/n' - originalSpecifier: '' + originalSpecifier: ^3.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 10 versionPath: 3.0.0 @@ -189,31 +189,24 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` - '@rushstack/m' - '@rushstack/n' - dependencies: - - dependencyType: regular - entryId: '@rushstack/m@1.0.0' - name: '@rushstack/m' - originalSpecifier: '' - peerDependencyMeta: {} - resolvedEntryJsonId: 8 - versionPath: 1.0.0 - dependencyType: peer entryId: 'Peer: @rushstack/m' name: '@rushstack/m' - originalSpecifier: '' + originalSpecifier: ^1.0.0 peerDependencyMeta: name: '@rushstack/m' optional: false - version: ^1.0.0 - versionPath: ^1.0.0 + version: 1.0.0 + versionPath: 1.0.0 - dependencyType: peer entryId: 'Peer: @rushstack/n' name: '@rushstack/n' - originalSpecifier: '' + originalSpecifier: ^2.0.0 peerDependencyMeta: name: '@rushstack/n' optional: true - version: ^2.0.0 - versionPath: ^2.0.0 + version: 2.0.0 + versionPath: 2.0.0 displayText: '@rushstack/l 1.0.0 [@rushstack/m@1.0.0; @rushstack/n@2.0.0]' entryId: '' entryPackageName: '@rushstack/l' @@ -240,7 +233,6 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` referrerJsonIds: - 2 - 5 - - 7 transitivePeerDependencies: [] - dependencies: [] displayText: '@rushstack/n 2.0.0' From 77c6d70ca9d35692454fe17ad0d59c0dde3827b0 Mon Sep 17 00:00:00 2001 From: Pete Gonzalez <4673363+octogonz@users.noreply.github.com> Date: Thu, 2 Oct 2025 21:51:44 -0700 Subject: [PATCH 10/15] Finish implementation for V6.0 code path --- .../lfxGraph-edge-cases-v6.0.test.ts.snap | 10 +++- ...fxGraph-website-sample-1-v6.0.test.ts.snap | 48 +++++++------------ 2 files changed, 25 insertions(+), 33 deletions(-) diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap index 66c7a6b8925..17b236b3ff1 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap @@ -3,6 +3,13 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` "entries: - dependencies: + - dependencyType: regular + entryId: /mime-db/1.54.0 + name: mime-db + originalSpecifier: '' + peerDependencyMeta: {} + resolvedEntryJsonId: 11 + versionPath: 1.54.0 - dependencyType: dev entryId: /color-string/2.1.2 name: color-string @@ -235,7 +242,8 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` kind: 2 packageJsonFolderPath: node_modules/.pnpm/mime-db@1.54.0/node_modules/mime-db rawEntryId: /mime-db/1.54.0 - referrerJsonIds: [] + referrerJsonIds: + - 0 transitivePeerDependencies: [] - dependencies: [] displayText: punycode 2.3.1 diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v6.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v6.0.test.ts.snap index 552834469da..8a067057831 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v6.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v6.0.test.ts.snap @@ -6,7 +6,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/d name: '@rushstack/d' - originalSpecifier: '' + originalSpecifier: workspace:* peerDependencyMeta: {} resolvedEntryJsonId: 3 versionPath: link:../d @@ -25,14 +25,14 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/d name: '@rushstack/d' - originalSpecifier: '' + originalSpecifier: workspace:* peerDependencyMeta: {} resolvedEntryJsonId: 3 versionPath: link:../d - dependencyType: regular entryId: /@rushstack/n@2.0.0 name: '@rushstack/n' - originalSpecifier: '' + originalSpecifier: ^2.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 9 versionPath: 2.0.0 @@ -51,21 +51,21 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/e name: '@rushstack/e' - originalSpecifier: '' + originalSpecifier: workspace:* peerDependencyMeta: {} resolvedEntryJsonId: 4 versionPath: link:../e - dependencyType: regular entryId: /@rushstack/k@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) name: '@rushstack/k' - originalSpecifier: '' + originalSpecifier: ^1.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) - dependencyType: regular entryId: /@rushstack/m@1.0.0 name: '@rushstack/m' - originalSpecifier: '' + originalSpecifier: ~1.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 8 versionPath: 1.0.0 @@ -84,21 +84,21 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/e name: '@rushstack/e' - originalSpecifier: '' + originalSpecifier: workspace:* peerDependencyMeta: {} resolvedEntryJsonId: 4 versionPath: link:../e - dependencyType: regular entryId: /@rushstack/j@1.0.0(@rushstack/n@2.0.0) name: '@rushstack/j' - originalSpecifier: '' + originalSpecifier: ^1.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 5 versionPath: 1.0.0(@rushstack/n@2.0.0) - dependencyType: regular entryId: /@rushstack/n@2.0.0 name: '@rushstack/n' - originalSpecifier: '' + originalSpecifier: ^2.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 9 versionPath: 2.0.0 @@ -119,7 +119,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` - dependencyType: regular entryId: /@rushstack/n@3.0.0 name: '@rushstack/n' - originalSpecifier: '' + originalSpecifier: ^3.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 10 versionPath: 3.0.0 @@ -189,38 +189,24 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` - '@rushstack/m' - '@rushstack/n' - dependencies: - - dependencyType: regular - entryId: /@rushstack/m@1.0.0 - name: '@rushstack/m' - originalSpecifier: '' - peerDependencyMeta: {} - resolvedEntryJsonId: 8 - versionPath: 1.0.0 - - dependencyType: regular - entryId: /@rushstack/n@2.0.0 - name: '@rushstack/n' - originalSpecifier: '' - peerDependencyMeta: {} - resolvedEntryJsonId: 9 - versionPath: 2.0.0 - dependencyType: peer entryId: 'Peer: @rushstack/m' name: '@rushstack/m' - originalSpecifier: '' + originalSpecifier: ^1.0.0 peerDependencyMeta: name: '@rushstack/m' optional: false - version: ^1.0.0 - versionPath: ^1.0.0 + version: 1.0.0 + versionPath: 1.0.0 - dependencyType: peer entryId: 'Peer: @rushstack/n' name: '@rushstack/n' - originalSpecifier: '' + originalSpecifier: ^2.0.0 peerDependencyMeta: name: '@rushstack/n' optional: true - version: ^2.0.0 - versionPath: ^2.0.0 + version: 2.0.0 + versionPath: 2.0.0 displayText: '@rushstack/l 1.0.0 [@rushstack/m@1.0.0; @rushstack/n@2.0.0]' entryId: '' entryPackageName: '@rushstack/l' @@ -247,7 +233,6 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` referrerJsonIds: - 2 - 5 - - 7 transitivePeerDependencies: [] - dependencies: [] displayText: '@rushstack/n 2.0.0' @@ -262,7 +247,6 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` referrerJsonIds: - 1 - 3 - - 7 transitivePeerDependencies: [] - dependencies: [] displayText: '@rushstack/n 3.0.0' From 4217646bba54122e394ad93ee8acaa4d8c5a48cf Mon Sep 17 00:00:00 2001 From: Pete Gonzalez <4673363+octogonz@users.noreply.github.com> Date: Thu, 2 Oct 2025 22:24:21 -0700 Subject: [PATCH 11/15] Finish implementation for V5.4 code path --- apps/lockfile-explorer/.vscode/launch.json | 2 +- .../src/graph/lfxGraphLoader.ts | 255 +++++++++++------- .../lfxGraph-edge-cases-v5.4.test.ts.snap | 24 +- .../lfxGraph-edge-cases-v6.0.test.ts.snap | 60 ++--- ...fxGraph-website-sample-1-v5.4.test.ts.snap | 71 ++--- .../test/lfxGraph-edge-cases-v6.0.test.ts | 4 +- .../src/graph/test/serializeToJson.test.ts | 4 +- 7 files changed, 224 insertions(+), 196 deletions(-) diff --git a/apps/lockfile-explorer/.vscode/launch.json b/apps/lockfile-explorer/.vscode/launch.json index eccc3696e6a..34810e71664 100644 --- a/apps/lockfile-explorer/.vscode/launch.json +++ b/apps/lockfile-explorer/.vscode/launch.json @@ -26,7 +26,7 @@ "--clean", "-u", "--test-path-pattern", - "lfxGraph-website-sample-1-v9.0.test" + "lfxGraph-website-sample-1-v5.4.test" ], "console": "integratedTerminal", "sourceMaps": true diff --git a/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts b/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts index 2607bd37048..e02e881ae45 100644 --- a/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts +++ b/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts @@ -23,6 +23,7 @@ type PeerDependenciesMeta = lockfileTypes.LockfilePackageInfo['peerDependenciesM function createPackageLockfileDependency(options: { name: string; versionPath: string; + originalSpecifier: string; kind: LfxDependencyKind; containingEntry: LfxGraphEntry; peerDependenciesMeta?: PeerDependenciesMeta; @@ -32,6 +33,7 @@ function createPackageLockfileDependency(options: { const { name, versionPath, + originalSpecifier, kind: dependencyType, containingEntry, peerDependenciesMeta, @@ -42,7 +44,7 @@ function createPackageLockfileDependency(options: { name, versionPath, entryId: '', - originalSpecifier: '', + originalSpecifier, dependencyType, peerDependencyMeta: {}, containingEntry @@ -88,62 +90,65 @@ function createPackageLockfileDependency(options: { return new LfxGraphDependency(result); } -// v5.4 used this to parse projects ("importers") also -function parsePackageDependencies( - dependencies: LfxGraphDependency[], - lockfileEntry: LfxGraphEntry, - either: - | lockfileTypes.ProjectSnapshot - | lockfileTypes.PackageSnapshot - | lockfileTypes.LockfilePackageSnapshot, - pnpmLockfileVersion: PnpmLockfileVersion, - workspace: IJsonLfxWorkspace -): void { +function parsePackageDependencies(options: { + dependencies: LfxGraphDependency[]; + lockfileEntry: LfxGraphEntry; + /** + * Used to obtain versionPath exact references. + */ + mainEntry: lockfileTypes.LockfilePackageSnapshot; + /** + * Used to obtain informational version ranges. + */ + specifierEntry: lockfileTypes.LockfilePackageInfo | undefined; + pnpmLockfileVersion: PnpmLockfileVersion; + workspace: IJsonLfxWorkspace; +}): void { + const { dependencies, lockfileEntry, mainEntry, specifierEntry, pnpmLockfileVersion, workspace } = options; + const node: Partial = - either as unknown as Partial; + mainEntry as unknown as Partial; + + function createDependency(kind: LfxDependencyKind, packageName: string, versionPath: string): void { + let originalSpecifier: string | undefined = undefined; + + if (specifierEntry && specifierEntry.peerDependencies) { + originalSpecifier = specifierEntry.peerDependencies[packageName]; + if (originalSpecifier) { + kind = LfxDependencyKind.Peer; + } + } + + dependencies.push( + createPackageLockfileDependency({ + kind, + name: packageName, + versionPath, + originalSpecifier: originalSpecifier ?? '', + containingEntry: lockfileEntry, + peerDependenciesMeta: specifierEntry?.peerDependenciesMeta, + pnpmLockfileVersion, + workspace + }) + ); + } + if (node.dependencies) { for (const [packageName, versionPath] of Object.entries(node.dependencies)) { - dependencies.push( - createPackageLockfileDependency({ - kind: LfxDependencyKind.Regular, - name: packageName, - versionPath, - containingEntry: lockfileEntry, - pnpmLockfileVersion, - workspace - }) - ); + createDependency(LfxDependencyKind.Regular, packageName, versionPath); } } - if (node.devDependencies) { - for (const [packageName, versionPath] of Object.entries(node.devDependencies)) { - dependencies.push( - createPackageLockfileDependency({ - kind: LfxDependencyKind.Dev, - name: packageName, - versionPath, - containingEntry: lockfileEntry, - pnpmLockfileVersion, - workspace - }) - ); + if (node.optionalDependencies) { + for (const [packageName, versionPath] of Object.entries(node.optionalDependencies)) { + createDependency(LfxDependencyKind.Regular, packageName, versionPath); } } - if (node.peerDependencies) { - for (const [packageName, versionPath] of Object.entries(node.peerDependencies)) { - dependencies.push( - createPackageLockfileDependency({ - kind: LfxDependencyKind.Peer, - name: packageName, - versionPath, - containingEntry: lockfileEntry, - peerDependenciesMeta: node.peerDependenciesMeta, - pnpmLockfileVersion, - workspace - }) - ); + if (node.devDependencies) { + for (const [packageName, versionPath] of Object.entries(node.devDependencies)) { + createDependency(LfxDependencyKind.Dev, packageName, versionPath); } } + if (node.transitivePeerDependencies) { for (const dep of node.transitivePeerDependencies) { lockfileEntry.transitivePeerDependencies.add(dep); @@ -151,6 +156,58 @@ function parsePackageDependencies( } } +function parseProjectDependencies54(options: { + dependencies: LfxGraphDependency[]; + lockfileEntry: LfxGraphEntry; + /** + * Used to obtain versionPath exact references and informational version ranges + */ + mainEntry: lockfileTypes.ProjectSnapshot; + pnpmLockfileVersion: PnpmLockfileVersion; + workspace: IJsonLfxWorkspace; +}): void { + const { dependencies, lockfileEntry, mainEntry, pnpmLockfileVersion, workspace } = options; + + const node: Partial = + mainEntry as unknown as Partial; + + function createDependency(kind: LfxDependencyKind, packageName: string, versionPath: string): void { + let originalSpecifier: string | undefined = undefined; + + if (mainEntry.specifiers) { + originalSpecifier = mainEntry.specifiers[packageName]; + } + + dependencies.push( + createPackageLockfileDependency({ + kind, + name: packageName, + versionPath, + originalSpecifier: originalSpecifier ?? '', + containingEntry: lockfileEntry, + pnpmLockfileVersion, + workspace + }) + ); + } + + if (node.dependencies) { + for (const [packageName, versionPath] of Object.entries(node.dependencies)) { + createDependency(LfxDependencyKind.Regular, packageName, versionPath); + } + } + if (node.optionalDependencies) { + for (const [packageName, versionPath] of Object.entries(node.optionalDependencies)) { + createDependency(LfxDependencyKind.Regular, packageName, versionPath); + } + } + if (node.devDependencies) { + for (const [packageName, versionPath] of Object.entries(node.devDependencies)) { + createDependency(LfxDependencyKind.Dev, packageName, versionPath); + } + } +} + function parseProjectDependencies60( dependencies: LfxGraphDependency[], lockfileEntry: LfxGraphEntry, @@ -158,32 +215,37 @@ function parseProjectDependencies60( pnpmLockfileVersion: PnpmLockfileVersion, workspace: IJsonLfxWorkspace ): void { + function createDependency( + kind: LfxDependencyKind, + packageName: string, + specifierAndResolution: lockfileTypes.SpecifierAndResolution + ): void { + dependencies.push( + createPackageLockfileDependency({ + kind, + name: packageName, + versionPath: specifierAndResolution.version, + originalSpecifier: specifierAndResolution.specifier, + containingEntry: lockfileEntry, + pnpmLockfileVersion, + workspace + }) + ); + } + if (snapshot.dependencies) { for (const [packageName, specifierAndResolution] of Object.entries(snapshot.dependencies)) { - dependencies.push( - createPackageLockfileDependency({ - kind: LfxDependencyKind.Regular, - name: packageName, - versionPath: specifierAndResolution.version, - containingEntry: lockfileEntry, - pnpmLockfileVersion, - workspace - }) - ); + createDependency(LfxDependencyKind.Regular, packageName, specifierAndResolution); + } + } + if (snapshot.optionalDependencies) { + for (const [packageName, specifierAndResolution] of Object.entries(snapshot.optionalDependencies)) { + createDependency(LfxDependencyKind.Regular, packageName, specifierAndResolution); } } if (snapshot.devDependencies) { for (const [packageName, specifierAndResolution] of Object.entries(snapshot.devDependencies)) { - dependencies.push( - createPackageLockfileDependency({ - kind: LfxDependencyKind.Dev, - name: packageName, - versionPath: specifierAndResolution.version, - containingEntry: lockfileEntry, - pnpmLockfileVersion, - workspace - }) - ); + createDependency(LfxDependencyKind.Dev, packageName, specifierAndResolution); } } } @@ -243,22 +305,18 @@ function createPackageLockfileEntry(options: { const result: ILfxGraphEntryOptions = { kind: LfxGraphEntryKind.Package, entryId: '', - rawEntryId: '', + rawEntryId: rawEntryId, packageJsonFolderPath: '', entryPackageName: '', - displayText: '', + displayText: rawEntryId, entryPackageVersion: '', entrySuffix: '' }; - result.rawEntryId = rawEntryId; - // Example: pnpmLockfilePath = 'common/temp/my-subspace/pnpm-lock.yaml' // Example: pnpmLockfileFolder = 'common/temp/my-subspace' const pnpmLockfileFolder: string = workspace.pnpmLockfileFolder; - result.displayText = rawEntryId; - let slashlessRawEntryId: string; if (pnpmLockfileVersion >= 90) { @@ -438,13 +496,14 @@ export function generateLockfileGraph(lockfileJson: unknown, workspace: IJsonLfx const lockfile54: lockfileTypes.LockfileObject = lockfileJson as lockfileTypes.LockfileObject; const importerValue: lockfileTypes.ProjectSnapshot = lockfile54.importers[importerKey as pnpmTypes.ProjectId]; - parsePackageDependencies( - importer.dependencies, - importer, - importerValue, + + parseProjectDependencies54({ + dependencies: importer.dependencies, + lockfileEntry: importer, + mainEntry: importerValue, pnpmLockfileVersion, workspace - ); + }); } else { const lockfile60: lockfileTypes.LockfileFile = lockfileJson as lockfileTypes.LockfileFile; if (lockfile60.importers) { @@ -474,13 +533,14 @@ export function generateLockfileGraph(lockfileJson: unknown, workspace: IJsonLfx workspace, pnpmLockfileVersion }); - parsePackageDependencies( - lockfileEntry.dependencies, - lockfileEntry, - dependencyValue, + parsePackageDependencies({ + dependencies: lockfileEntry.dependencies, + lockfileEntry: lockfileEntry, + mainEntry: dependencyValue, + specifierEntry: dependencyValue, pnpmLockfileVersion, workspace - ); + }); allEntries.push(lockfileEntry); allEntriesById.set(dependencyKey, lockfileEntry); } @@ -504,27 +564,20 @@ export function generateLockfileGraph(lockfileJson: unknown, workspace: IJsonLfx pnpmLockfileVersion }); - parsePackageDependencies( - lockfileEntry.dependencies, - lockfileEntry, - dependencyValue, - pnpmLockfileVersion, - workspace - ); - // Example: "@scope/my-package@1.0.0" const packageInfoKey: string = lockfileEntry.entryPackageName + '@' + lockfileEntry.entryPackageVersion; const packageInfo: lockfileTypes.LockfilePackageInfo | undefined = packagesByKey.get(packageInfoKey); - if (packageInfo) { - parsePackageDependencies( - lockfileEntry.dependencies, - lockfileEntry, - packageInfo, - pnpmLockfileVersion, - workspace - ); - } + + parsePackageDependencies({ + dependencies: lockfileEntry.dependencies, + lockfileEntry, + mainEntry: dependencyValue, + specifierEntry: packageInfo, + pnpmLockfileVersion, + workspace + }); + allEntries.push(lockfileEntry); allEntriesById.set(dependencyKey, lockfileEntry); } diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap index 66c7a6b8925..ca9efba12dd 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap @@ -3,10 +3,17 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` "entries: - dependencies: + - dependencyType: regular + entryId: /mime-db/1.54.0 + name: mime-db + originalSpecifier: ^1.52.0 + peerDependencyMeta: {} + resolvedEntryJsonId: 11 + versionPath: 1.54.0 - dependencyType: dev entryId: /color-string/2.1.2 name: color-string - originalSpecifier: '' + originalSpecifier: ^2.1.2 peerDependencyMeta: {} resolvedEntryJsonId: 8 versionPath: 2.1.2 @@ -25,7 +32,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /color/5.0.2 name: color - originalSpecifier: '' + originalSpecifier: ^5.0.2 peerDependencyMeta: {} resolvedEntryJsonId: 9 versionPath: 5.0.2 @@ -44,7 +51,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /color-string/2.1.2 name: color-string - originalSpecifier: '' + originalSpecifier: ^2.1.2 peerDependencyMeta: {} resolvedEntryJsonId: 8 versionPath: 2.1.2 @@ -63,14 +70,14 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /has-symbols/1.0.2 name: has-symbols - originalSpecifier: '' + originalSpecifier: 1.0.2 peerDependencyMeta: {} resolvedEntryJsonId: 10 versionPath: 1.0.2 - dependencyType: regular entryId: project:packages/link-specifier/linker/packages/link-specifier/target-folder name: target-folder - originalSpecifier: '' + originalSpecifier: link:packages/link-specifier/target-folder peerDependencyMeta: {} versionPath: link:packages/link-specifier/target-folder displayText: 'Project: linker' @@ -88,14 +95,14 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /address/1.2.2 name: address - originalSpecifier: '' + originalSpecifier: ^1.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 5 versionPath: 1.2.2 - dependencyType: regular entryId: /uri-js/4.4.1 name: uri-js - originalSpecifier: '' + originalSpecifier: ^4.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 13 versionPath: 4.4.1 @@ -235,7 +242,8 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` kind: 2 packageJsonFolderPath: node_modules/.pnpm/mime-db@1.54.0/node_modules/mime-db rawEntryId: /mime-db/1.54.0 - referrerJsonIds: [] + referrerJsonIds: + - 0 transitivePeerDependencies: [] - dependencies: [] displayText: punycode 2.3.1 diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap index 17b236b3ff1..47d44a60964 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap @@ -1,19 +1,19 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` +exports[`lfxGraph-edge-cases-v6.0 loads a workspace 1`] = ` "entries: - dependencies: - dependencyType: regular - entryId: /mime-db/1.54.0 + entryId: /mime-db@1.54.0 name: mime-db - originalSpecifier: '' + originalSpecifier: ^1.52.0 peerDependencyMeta: {} resolvedEntryJsonId: 11 versionPath: 1.54.0 - dependencyType: dev - entryId: /color-string/2.1.2 + entryId: /color-string@2.1.2 name: color-string - originalSpecifier: '' + originalSpecifier: ^2.1.2 peerDependencyMeta: {} resolvedEntryJsonId: 8 versionPath: 2.1.2 @@ -30,9 +30,9 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: - dependencyType: regular - entryId: /color/5.0.2 + entryId: /color@5.0.2 name: color - originalSpecifier: '' + originalSpecifier: ^5.0.2 peerDependencyMeta: {} resolvedEntryJsonId: 9 versionPath: 5.0.2 @@ -49,9 +49,9 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: - dependencyType: regular - entryId: /color-string/2.1.2 + entryId: /color-string@2.1.2 name: color-string - originalSpecifier: '' + originalSpecifier: ^2.1.2 peerDependencyMeta: {} resolvedEntryJsonId: 8 versionPath: 2.1.2 @@ -68,16 +68,16 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: - dependencyType: regular - entryId: /has-symbols/1.0.2 + entryId: /has-symbols@1.0.2 name: has-symbols - originalSpecifier: '' + originalSpecifier: 1.0.2 peerDependencyMeta: {} resolvedEntryJsonId: 10 versionPath: 1.0.2 - dependencyType: regular entryId: project:packages/link-specifier/linker/packages/link-specifier/target-folder name: target-folder - originalSpecifier: '' + originalSpecifier: link:packages/link-specifier/target-folder peerDependencyMeta: {} versionPath: link:packages/link-specifier/target-folder displayText: 'Project: linker' @@ -93,16 +93,16 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: - dependencyType: regular - entryId: /address/1.2.2 + entryId: /address@1.2.2 name: address - originalSpecifier: '' + originalSpecifier: ^1.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 5 versionPath: 1.2.2 - dependencyType: regular - entryId: /uri-js/4.4.1 + entryId: /uri-js@4.4.1 name: uri-js - originalSpecifier: '' + originalSpecifier: ^4.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 13 versionPath: 4.4.1 @@ -126,13 +126,13 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` jsonId: 5 kind: 2 packageJsonFolderPath: node_modules/.pnpm/address@1.2.2/node_modules/address - rawEntryId: /address/1.2.2 + rawEntryId: /address@1.2.2 referrerJsonIds: - 4 transitivePeerDependencies: [] - dependencies: - dependencyType: regular - entryId: /color-name/2.0.2 + entryId: /color-name@2.0.2 name: color-name originalSpecifier: '' peerDependencyMeta: {} @@ -146,7 +146,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` jsonId: 6 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color-convert@3.1.2/node_modules/color-convert - rawEntryId: /color-convert/3.1.2 + rawEntryId: /color-convert@3.1.2 referrerJsonIds: - 9 transitivePeerDependencies: [] @@ -159,14 +159,14 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` jsonId: 7 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color-name@2.0.2/node_modules/color-name - rawEntryId: /color-name/2.0.2 + rawEntryId: /color-name@2.0.2 referrerJsonIds: - 6 - 8 transitivePeerDependencies: [] - dependencies: - dependencyType: regular - entryId: /color-name/2.0.2 + entryId: /color-name@2.0.2 name: color-name originalSpecifier: '' peerDependencyMeta: {} @@ -180,7 +180,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` jsonId: 8 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color-string@2.1.2/node_modules/color-string - rawEntryId: /color-string/2.1.2 + rawEntryId: /color-string@2.1.2 referrerJsonIds: - 0 - 2 @@ -188,14 +188,14 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: - dependencyType: regular - entryId: /color-convert/3.1.2 + entryId: /color-convert@3.1.2 name: color-convert originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 3.1.2 - dependencyType: regular - entryId: /color-string/2.1.2 + entryId: /color-string@2.1.2 name: color-string originalSpecifier: '' peerDependencyMeta: {} @@ -209,7 +209,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` jsonId: 9 kind: 2 packageJsonFolderPath: node_modules/.pnpm/color@5.0.2/node_modules/color - rawEntryId: /color/5.0.2 + rawEntryId: /color@5.0.2 referrerJsonIds: - 1 transitivePeerDependencies: [] @@ -228,7 +228,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` jsonId: 10 kind: 2 packageJsonFolderPath: node_modules/.pnpm/has-symbols@1.0.2/node_modules/has-symbols - rawEntryId: /has-symbols/1.0.2 + rawEntryId: /has-symbols@1.0.2 referrerJsonIds: - 3 transitivePeerDependencies: [] @@ -241,7 +241,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` jsonId: 11 kind: 2 packageJsonFolderPath: node_modules/.pnpm/mime-db@1.54.0/node_modules/mime-db - rawEntryId: /mime-db/1.54.0 + rawEntryId: /mime-db@1.54.0 referrerJsonIds: - 0 transitivePeerDependencies: [] @@ -254,13 +254,13 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` jsonId: 12 kind: 2 packageJsonFolderPath: node_modules/.pnpm/punycode@2.3.1/node_modules/punycode - rawEntryId: /punycode/2.3.1 + rawEntryId: /punycode@2.3.1 referrerJsonIds: - 13 transitivePeerDependencies: [] - dependencies: - dependencyType: regular - entryId: /punycode/2.3.1 + entryId: /punycode@2.3.1 name: punycode originalSpecifier: '' peerDependencyMeta: {} @@ -274,7 +274,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` jsonId: 13 kind: 2 packageJsonFolderPath: node_modules/.pnpm/uri-js@4.4.1/node_modules/uri-js - rawEntryId: /uri-js/4.4.1 + rawEntryId: /uri-js@4.4.1 referrerJsonIds: - 4 transitivePeerDependencies: [] diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v5.4.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v5.4.test.ts.snap index 410eb0bd112..6faee61f255 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v5.4.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v5.4.test.ts.snap @@ -6,7 +6,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/d name: '@rushstack/d' - originalSpecifier: '' + originalSpecifier: workspace:* peerDependencyMeta: {} resolvedEntryJsonId: 3 versionPath: link:../d @@ -25,14 +25,14 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/d name: '@rushstack/d' - originalSpecifier: '' + originalSpecifier: workspace:* peerDependencyMeta: {} resolvedEntryJsonId: 3 versionPath: link:../d - dependencyType: regular entryId: /@rushstack/n/2.0.0 name: '@rushstack/n' - originalSpecifier: '' + originalSpecifier: ^2.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 11 versionPath: 2.0.0 @@ -51,21 +51,21 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/e name: '@rushstack/e' - originalSpecifier: '' + originalSpecifier: workspace:* peerDependencyMeta: {} resolvedEntryJsonId: 4 versionPath: link:../e - dependencyType: regular entryId: /@rushstack/k/1.0.0_@rushstack+m@1.0.0 name: '@rushstack/k' - originalSpecifier: '' + originalSpecifier: ^1.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 1.0.0_@rushstack+m@1.0.0 - dependencyType: regular entryId: /@rushstack/m/1.0.0 name: '@rushstack/m' - originalSpecifier: '' + originalSpecifier: ~1.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 10 versionPath: 1.0.0 @@ -84,21 +84,21 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: project:projects/e name: '@rushstack/e' - originalSpecifier: '' + originalSpecifier: workspace:* peerDependencyMeta: {} resolvedEntryJsonId: 4 versionPath: link:../e - dependencyType: regular entryId: /@rushstack/j/1.0.0_@rushstack+n@2.0.0 name: '@rushstack/j' - originalSpecifier: '' + originalSpecifier: ^1.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 5 versionPath: 1.0.0_@rushstack+n@2.0.0 - dependencyType: regular entryId: /@rushstack/n/2.0.0 name: '@rushstack/n' - originalSpecifier: '' + originalSpecifier: ^2.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 11 versionPath: 2.0.0 @@ -119,7 +119,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - dependencyType: regular entryId: /@rushstack/n/3.0.0 name: '@rushstack/n' - originalSpecifier: '' + originalSpecifier: ^3.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 12 versionPath: 3.0.0 @@ -209,31 +209,15 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - '@rushstack/m' - '@rushstack/n' - dependencies: - - dependencyType: regular - entryId: /@rushstack/m/1.0.0 - name: '@rushstack/m' - originalSpecifier: '' - peerDependencyMeta: {} - resolvedEntryJsonId: 10 - versionPath: 1.0.0 - dependencyType: peer entryId: 'Peer: @rushstack/m' name: '@rushstack/m' - originalSpecifier: '' + originalSpecifier: ^1.0.0 peerDependencyMeta: name: '@rushstack/m' optional: false - version: ^1.0.0 - versionPath: ^1.0.0 - - dependencyType: peer - entryId: 'Peer: @rushstack/n' - name: '@rushstack/n' - originalSpecifier: '' - peerDependencyMeta: - name: '@rushstack/n' - optional: true - version: ^2.0.0 - versionPath: ^2.0.0 + version: 1.0.0 + versionPath: 1.0.0 displayText: '@rushstack/l 1.0.0 (@rushstack+m@1.0.0)' entryId: '' entryPackageName: '@rushstack/l' @@ -247,38 +231,24 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - 6 transitivePeerDependencies: [] - dependencies: - - dependencyType: regular - entryId: /@rushstack/m/1.0.0 - name: '@rushstack/m' - originalSpecifier: '' - peerDependencyMeta: {} - resolvedEntryJsonId: 10 - versionPath: 1.0.0 - - dependencyType: regular - entryId: /@rushstack/n/2.0.0 - name: '@rushstack/n' - originalSpecifier: '' - peerDependencyMeta: {} - resolvedEntryJsonId: 11 - versionPath: 2.0.0 - dependencyType: peer entryId: 'Peer: @rushstack/m' name: '@rushstack/m' - originalSpecifier: '' + originalSpecifier: ^1.0.0 peerDependencyMeta: name: '@rushstack/m' optional: false - version: ^1.0.0 - versionPath: ^1.0.0 + version: 1.0.0 + versionPath: 1.0.0 - dependencyType: peer entryId: 'Peer: @rushstack/n' name: '@rushstack/n' - originalSpecifier: '' + originalSpecifier: ^2.0.0 peerDependencyMeta: name: '@rushstack/n' optional: true - version: ^2.0.0 - versionPath: ^2.0.0 + version: 2.0.0 + versionPath: 2.0.0 displayText: '@rushstack/l 1.0.0 (wxpgugna4ivthu7yyu4fmciltu)' entryId: '' entryPackageName: '@rushstack/l' @@ -304,8 +274,6 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` referrerJsonIds: - 2 - 5 - - 8 - - 9 transitivePeerDependencies: [] - dependencies: [] displayText: '@rushstack/n 2.0.0' @@ -320,7 +288,6 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` referrerJsonIds: - 1 - 3 - - 9 transitivePeerDependencies: [] - dependencies: [] displayText: '@rushstack/n 3.0.0' diff --git a/apps/lockfile-explorer/src/graph/test/lfxGraph-edge-cases-v6.0.test.ts b/apps/lockfile-explorer/src/graph/test/lfxGraph-edge-cases-v6.0.test.ts index be8ce686c4a..06ed7a48b0a 100644 --- a/apps/lockfile-explorer/src/graph/test/lfxGraph-edge-cases-v6.0.test.ts +++ b/apps/lockfile-explorer/src/graph/test/lfxGraph-edge-cases-v6.0.test.ts @@ -13,10 +13,10 @@ export const workspace: IJsonLfxWorkspace = { rushConfig: undefined }; -describe('lfxGraph-edge-cases-v5.4', () => { +describe('lfxGraph-edge-cases-v6.0', () => { it('loads a workspace', async () => { const serializedYaml: string = await graphTestHelpers.loadAndSerializeLfxGraphAsync({ - lockfilePathUnderFixtures: '/edge-cases/pnpm-lock-v5.4.yaml', + lockfilePathUnderFixtures: '/edge-cases/pnpm-lock-v6.0.yaml', workspace: workspace }); expect(serializedYaml).toMatchSnapshot(); diff --git a/apps/lockfile-explorer/src/graph/test/serializeToJson.test.ts b/apps/lockfile-explorer/src/graph/test/serializeToJson.test.ts index 286f1c93887..ac7970336cf 100644 --- a/apps/lockfile-explorer/src/graph/test/serializeToJson.test.ts +++ b/apps/lockfile-explorer/src/graph/test/serializeToJson.test.ts @@ -19,7 +19,7 @@ Object { "dependencyType": "regular", "entryId": "/@testPackage/core/1.7.1", "name": "@testPackage/core", - "originalSpecifier": "", + "originalSpecifier": "1.7.1", "peerDependencyMeta": Object { "name": undefined, "optional": undefined, @@ -32,7 +32,7 @@ Object { "dependencyType": "regular", "entryId": "/@testPackage2/core/1.7.1", "name": "@testPackage2/core", - "originalSpecifier": "", + "originalSpecifier": "1.7.1", "peerDependencyMeta": Object { "name": undefined, "optional": undefined, From df4559a46c6525943cfce18b62cab98f4a6a3d4f Mon Sep 17 00:00:00 2001 From: Pete Gonzalez <4673363+octogonz@users.noreply.github.com> Date: Thu, 2 Oct 2025 22:38:03 -0700 Subject: [PATCH 12/15] Fix a bug where entryId was not being computed correctly --- .../src/packlets/lfx-shared/LfxGraph.ts | 9 ++++++-- .../src/graph/lfxGraphLoader.ts | 19 ++++++++-------- .../lfxGraph-edge-cases-v5.4.test.ts.snap | 18 +++++++-------- .../lfxGraph-edge-cases-v6.0.test.ts.snap | 18 +++++++-------- .../lfxGraph-edge-cases-v9.0.test.ts.snap | 18 +++++++-------- ...fxGraph-website-sample-1-v5.4.test.ts.snap | 22 +++++++++---------- ...fxGraph-website-sample-1-v6.0.test.ts.snap | 16 +++++++------- ...fxGraph-website-sample-1-v9.0.test.ts.snap | 16 +++++++------- .../src/graph/test/serializeToJson.test.ts | 4 ++-- 9 files changed, 73 insertions(+), 67 deletions(-) diff --git a/apps/lockfile-explorer-web/src/packlets/lfx-shared/LfxGraph.ts b/apps/lockfile-explorer-web/src/packlets/lfx-shared/LfxGraph.ts index e1e46c02bc3..36e42e97a99 100644 --- a/apps/lockfile-explorer-web/src/packlets/lfx-shared/LfxGraph.ts +++ b/apps/lockfile-explorer-web/src/packlets/lfx-shared/LfxGraph.ts @@ -103,14 +103,19 @@ export class LfxGraphEntry { public readonly kind: LfxGraphEntryKind; /** - * A unique (human-readable) identifier for this lockfile entry. For projects, this is just - * `Project:` + the package json path for this project. + * A unique identifier for this lockfile entry, based on `rawEntryId` but adjusted to be unique for both + * project and external package entries. */ public readonly entryId: string; /** * The unique identifier assigned to this project/package in the lockfile. * e.g. `/@emotion/core/10.3.1_qjwx5m6wssz3lnb35xwkc3pz6q:` + * + * @remarks + * In the `pnpm-lock.yaml` file, "importers" (workspace projects) and "packages" (external packages) + * are tracked separately, so it's not required for their keys to be unique. `entryId` solves this problem + * by adding a `project:` prefix for importers. */ public readonly rawEntryId: string; diff --git a/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts b/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts index e02e881ae45..91cda8f775a 100644 --- a/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts +++ b/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts @@ -68,13 +68,6 @@ function createPackageLockfileDependency(options: { } } else if (result.versionPath.startsWith('/')) { result.entryId = versionPath; - } else if (result.dependencyType === LfxDependencyKind.Peer) { - result.peerDependencyMeta = { - name: result.name, - version: versionPath, - optional: peerDependenciesMeta?.[result.name] ? peerDependenciesMeta[result.name].optional : false - }; - result.entryId = 'Peer: ' + result.name; } else { // Version 5.4: /@rushstack/m/1.0.0: // Version 6.0: /@rushstack/m@1.0.0: @@ -87,6 +80,14 @@ function createPackageLockfileDependency(options: { result.entryId = (pnpmLockfileVersion < 90 ? '/' : '') + result.name + versionDelimiter + result.versionPath; } + + if (result.dependencyType === LfxDependencyKind.Peer) { + result.peerDependencyMeta = { + name: result.name, + version: versionPath, + optional: peerDependenciesMeta?.[result.name] ? peerDependenciesMeta[result.name].optional : false + }; + } return new LfxGraphDependency(result); } @@ -304,7 +305,7 @@ function createPackageLockfileEntry(options: { const result: ILfxGraphEntryOptions = { kind: LfxGraphEntryKind.Package, - entryId: '', + entryId: rawEntryId, rawEntryId: rawEntryId, packageJsonFolderPath: '', entryPackageName: '', @@ -579,7 +580,7 @@ export function generateLockfileGraph(lockfileJson: unknown, workspace: IJsonLfx }); allEntries.push(lockfileEntry); - allEntriesById.set(dependencyKey, lockfileEntry); + allEntriesById.set(lockfileEntry.entryId, lockfileEntry); } } } diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap index ca9efba12dd..cfdda1a654f 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap @@ -119,7 +119,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: [] displayText: address 1.2.2 - entryId: '' + entryId: /address/1.2.2 entryPackageName: address entryPackageVersion: 1.2.2 entrySuffix: '' @@ -139,7 +139,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` resolvedEntryJsonId: 7 versionPath: 2.0.2 displayText: color-convert 3.1.2 - entryId: '' + entryId: /color-convert/3.1.2 entryPackageName: color-convert entryPackageVersion: 3.1.2 entrySuffix: '' @@ -152,7 +152,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: [] displayText: color-name 2.0.2 - entryId: '' + entryId: /color-name/2.0.2 entryPackageName: color-name entryPackageVersion: 2.0.2 entrySuffix: '' @@ -173,7 +173,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` resolvedEntryJsonId: 7 versionPath: 2.0.2 displayText: color-string 2.1.2 - entryId: '' + entryId: /color-string/2.1.2 entryPackageName: color-string entryPackageVersion: 2.1.2 entrySuffix: '' @@ -202,7 +202,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` resolvedEntryJsonId: 8 versionPath: 2.1.2 displayText: color 5.0.2 - entryId: '' + entryId: /color/5.0.2 entryPackageName: color entryPackageVersion: 5.0.2 entrySuffix: '' @@ -221,7 +221,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` peerDependencyMeta: {} versionPath: link:link-specifier/target-folder displayText: has-symbols 1.0.2 - entryId: '' + entryId: /has-symbols/1.0.2 entryPackageName: has-symbols entryPackageVersion: 1.0.2 entrySuffix: '' @@ -234,7 +234,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: [] displayText: mime-db 1.54.0 - entryId: '' + entryId: /mime-db/1.54.0 entryPackageName: mime-db entryPackageVersion: 1.54.0 entrySuffix: '' @@ -247,7 +247,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: [] displayText: punycode 2.3.1 - entryId: '' + entryId: /punycode/2.3.1 entryPackageName: punycode entryPackageVersion: 2.3.1 entrySuffix: '' @@ -267,7 +267,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` resolvedEntryJsonId: 12 versionPath: 2.3.1 displayText: uri-js 4.4.1 - entryId: '' + entryId: /uri-js/4.4.1 entryPackageName: uri-js entryPackageVersion: 4.4.1 entrySuffix: '' diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap index 47d44a60964..9b9ef424c92 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap @@ -119,7 +119,7 @@ exports[`lfxGraph-edge-cases-v6.0 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: [] displayText: address 1.2.2 - entryId: '' + entryId: /address@1.2.2 entryPackageName: address entryPackageVersion: 1.2.2 entrySuffix: '' @@ -139,7 +139,7 @@ exports[`lfxGraph-edge-cases-v6.0 loads a workspace 1`] = ` resolvedEntryJsonId: 7 versionPath: 2.0.2 displayText: color-convert 3.1.2 - entryId: '' + entryId: /color-convert@3.1.2 entryPackageName: color-convert entryPackageVersion: 3.1.2 entrySuffix: '' @@ -152,7 +152,7 @@ exports[`lfxGraph-edge-cases-v6.0 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: [] displayText: color-name 2.0.2 - entryId: '' + entryId: /color-name@2.0.2 entryPackageName: color-name entryPackageVersion: 2.0.2 entrySuffix: '' @@ -173,7 +173,7 @@ exports[`lfxGraph-edge-cases-v6.0 loads a workspace 1`] = ` resolvedEntryJsonId: 7 versionPath: 2.0.2 displayText: color-string 2.1.2 - entryId: '' + entryId: /color-string@2.1.2 entryPackageName: color-string entryPackageVersion: 2.1.2 entrySuffix: '' @@ -202,7 +202,7 @@ exports[`lfxGraph-edge-cases-v6.0 loads a workspace 1`] = ` resolvedEntryJsonId: 8 versionPath: 2.1.2 displayText: color 5.0.2 - entryId: '' + entryId: /color@5.0.2 entryPackageName: color entryPackageVersion: 5.0.2 entrySuffix: '' @@ -221,7 +221,7 @@ exports[`lfxGraph-edge-cases-v6.0 loads a workspace 1`] = ` peerDependencyMeta: {} versionPath: link:link-specifier/target-folder displayText: has-symbols 1.0.2 - entryId: '' + entryId: /has-symbols@1.0.2 entryPackageName: has-symbols entryPackageVersion: 1.0.2 entrySuffix: '' @@ -234,7 +234,7 @@ exports[`lfxGraph-edge-cases-v6.0 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: [] displayText: mime-db 1.54.0 - entryId: '' + entryId: /mime-db@1.54.0 entryPackageName: mime-db entryPackageVersion: 1.54.0 entrySuffix: '' @@ -247,7 +247,7 @@ exports[`lfxGraph-edge-cases-v6.0 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: [] displayText: punycode 2.3.1 - entryId: '' + entryId: /punycode@2.3.1 entryPackageName: punycode entryPackageVersion: 2.3.1 entrySuffix: '' @@ -267,7 +267,7 @@ exports[`lfxGraph-edge-cases-v6.0 loads a workspace 1`] = ` resolvedEntryJsonId: 12 versionPath: 2.3.1 displayText: uri-js 4.4.1 - entryId: '' + entryId: /uri-js@4.4.1 entryPackageName: uri-js entryPackageVersion: 4.4.1 entrySuffix: '' diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap index 7ef7d82d34e..bdcabc90f8c 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap @@ -119,7 +119,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: [] displayText: address 1.2.2 - entryId: '' + entryId: address@1.2.2 entryPackageName: address entryPackageVersion: 1.2.2 entrySuffix: '' @@ -139,7 +139,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` resolvedEntryJsonId: 7 versionPath: 2.0.2 displayText: color-convert 3.1.2 - entryId: '' + entryId: color-convert@3.1.2 entryPackageName: color-convert entryPackageVersion: 3.1.2 entrySuffix: '' @@ -152,7 +152,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: [] displayText: color-name 2.0.2 - entryId: '' + entryId: color-name@2.0.2 entryPackageName: color-name entryPackageVersion: 2.0.2 entrySuffix: '' @@ -173,7 +173,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` resolvedEntryJsonId: 7 versionPath: 2.0.2 displayText: color-string 2.1.2 - entryId: '' + entryId: color-string@2.1.2 entryPackageName: color-string entryPackageVersion: 2.1.2 entrySuffix: '' @@ -202,7 +202,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` resolvedEntryJsonId: 8 versionPath: 2.1.2 displayText: color 5.0.2 - entryId: '' + entryId: color@5.0.2 entryPackageName: color entryPackageVersion: 5.0.2 entrySuffix: '' @@ -221,7 +221,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` peerDependencyMeta: {} versionPath: link:link-specifier/target-folder displayText: has-symbols 1.0.2 - entryId: '' + entryId: has-symbols@1.0.2 entryPackageName: has-symbols entryPackageVersion: 1.0.2 entrySuffix: '' @@ -234,7 +234,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: [] displayText: mime-db 1.54.0 - entryId: '' + entryId: mime-db@1.54.0 entryPackageName: mime-db entryPackageVersion: 1.54.0 entrySuffix: '' @@ -247,7 +247,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: [] displayText: punycode 2.3.1 - entryId: '' + entryId: punycode@2.3.1 entryPackageName: punycode entryPackageVersion: 2.3.1 entrySuffix: '' @@ -267,7 +267,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` resolvedEntryJsonId: 12 versionPath: 2.3.1 displayText: uri-js 4.4.1 - entryId: '' + entryId: uri-js@4.4.1 entryPackageName: uri-js entryPackageVersion: 4.4.1 entrySuffix: '' diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v5.4.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v5.4.test.ts.snap index 6faee61f255..7fe78a8f836 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v5.4.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v5.4.test.ts.snap @@ -152,7 +152,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` resolvedEntryJsonId: 10 versionPath: 1.0.0 displayText: '@rushstack/j 1.0.0 (@rushstack+n@2.0.0)' - entryId: '' + entryId: /@rushstack/j/1.0.0_@rushstack+n@2.0.0 entryPackageName: '@rushstack/j' entryPackageVersion: 1.0.0 entrySuffix: '@rushstack+n@2.0.0' @@ -173,7 +173,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` resolvedEntryJsonId: 8 versionPath: 1.0.0_@rushstack+m@1.0.0 displayText: '@rushstack/k 1.0.0 (@rushstack+m@1.0.0)' - entryId: '' + entryId: /@rushstack/k/1.0.0_@rushstack+m@1.0.0 entryPackageName: '@rushstack/k' entryPackageVersion: 1.0.0 entrySuffix: '@rushstack+m@1.0.0' @@ -195,7 +195,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` resolvedEntryJsonId: 9 versionPath: 1.0.0_wxpgugna4ivthu7yyu4fmciltu displayText: '@rushstack/k 1.0.0 (wxpgugna4ivthu7yyu4fmciltu)' - entryId: '' + entryId: /@rushstack/k/1.0.0_wxpgugna4ivthu7yyu4fmciltu entryPackageName: '@rushstack/k' entryPackageVersion: 1.0.0 entrySuffix: wxpgugna4ivthu7yyu4fmciltu @@ -210,7 +210,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - '@rushstack/n' - dependencies: - dependencyType: peer - entryId: 'Peer: @rushstack/m' + entryId: /@rushstack/m/1.0.0 name: '@rushstack/m' originalSpecifier: ^1.0.0 peerDependencyMeta: @@ -219,7 +219,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` version: 1.0.0 versionPath: 1.0.0 displayText: '@rushstack/l 1.0.0 (@rushstack+m@1.0.0)' - entryId: '' + entryId: /@rushstack/l/1.0.0_@rushstack+m@1.0.0 entryPackageName: '@rushstack/l' entryPackageVersion: 1.0.0 entrySuffix: '@rushstack+m@1.0.0' @@ -232,7 +232,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: - dependencyType: peer - entryId: 'Peer: @rushstack/m' + entryId: /@rushstack/m/1.0.0 name: '@rushstack/m' originalSpecifier: ^1.0.0 peerDependencyMeta: @@ -241,7 +241,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` version: 1.0.0 versionPath: 1.0.0 - dependencyType: peer - entryId: 'Peer: @rushstack/n' + entryId: /@rushstack/n/2.0.0 name: '@rushstack/n' originalSpecifier: ^2.0.0 peerDependencyMeta: @@ -250,7 +250,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` version: 2.0.0 versionPath: 2.0.0 displayText: '@rushstack/l 1.0.0 (wxpgugna4ivthu7yyu4fmciltu)' - entryId: '' + entryId: /@rushstack/l/1.0.0_wxpgugna4ivthu7yyu4fmciltu entryPackageName: '@rushstack/l' entryPackageVersion: 1.0.0 entrySuffix: wxpgugna4ivthu7yyu4fmciltu @@ -263,7 +263,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: [] displayText: '@rushstack/m 1.0.0' - entryId: '' + entryId: /@rushstack/m/1.0.0 entryPackageName: '@rushstack/m' entryPackageVersion: 1.0.0 entrySuffix: '' @@ -277,7 +277,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: [] displayText: '@rushstack/n 2.0.0' - entryId: '' + entryId: /@rushstack/n/2.0.0 entryPackageName: '@rushstack/n' entryPackageVersion: 2.0.0 entrySuffix: '' @@ -291,7 +291,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: [] displayText: '@rushstack/n 3.0.0' - entryId: '' + entryId: /@rushstack/n/3.0.0 entryPackageName: '@rushstack/n' entryPackageVersion: 3.0.0 entrySuffix: '' diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v6.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v6.0.test.ts.snap index 8a067057831..3b4713b6a1a 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v6.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v6.0.test.ts.snap @@ -152,7 +152,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` resolvedEntryJsonId: 8 versionPath: 1.0.0 displayText: '@rushstack/j 1.0.0 [@rushstack/n@2.0.0]' - entryId: '' + entryId: /@rushstack/j@1.0.0(@rushstack/n@2.0.0) entryPackageName: '@rushstack/j' entryPackageVersion: 1.0.0 entrySuffix: '@rushstack/n@2.0.0' @@ -173,7 +173,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` resolvedEntryJsonId: 7 versionPath: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) displayText: '@rushstack/k 1.0.0 [@rushstack/m@1.0.0; @rushstack/n@2.0.0]' - entryId: '' + entryId: /@rushstack/k@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) entryPackageName: '@rushstack/k' entryPackageVersion: 1.0.0 entrySuffix: '@rushstack/m@1.0.0; @rushstack/n@2.0.0' @@ -190,7 +190,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` - '@rushstack/n' - dependencies: - dependencyType: peer - entryId: 'Peer: @rushstack/m' + entryId: /@rushstack/m@1.0.0 name: '@rushstack/m' originalSpecifier: ^1.0.0 peerDependencyMeta: @@ -199,7 +199,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` version: 1.0.0 versionPath: 1.0.0 - dependencyType: peer - entryId: 'Peer: @rushstack/n' + entryId: /@rushstack/n@2.0.0 name: '@rushstack/n' originalSpecifier: ^2.0.0 peerDependencyMeta: @@ -208,7 +208,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` version: 2.0.0 versionPath: 2.0.0 displayText: '@rushstack/l 1.0.0 [@rushstack/m@1.0.0; @rushstack/n@2.0.0]' - entryId: '' + entryId: /@rushstack/l@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) entryPackageName: '@rushstack/l' entryPackageVersion: 1.0.0 entrySuffix: '@rushstack/m@1.0.0; @rushstack/n@2.0.0' @@ -222,7 +222,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: [] displayText: '@rushstack/m 1.0.0' - entryId: '' + entryId: /@rushstack/m@1.0.0 entryPackageName: '@rushstack/m' entryPackageVersion: 1.0.0 entrySuffix: '' @@ -236,7 +236,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: [] displayText: '@rushstack/n 2.0.0' - entryId: '' + entryId: /@rushstack/n@2.0.0 entryPackageName: '@rushstack/n' entryPackageVersion: 2.0.0 entrySuffix: '' @@ -250,7 +250,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: [] displayText: '@rushstack/n 3.0.0' - entryId: '' + entryId: /@rushstack/n@3.0.0 entryPackageName: '@rushstack/n' entryPackageVersion: 3.0.0 entrySuffix: '' diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap index 8acf2980f29..ef29e0a1c22 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap @@ -152,7 +152,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` resolvedEntryJsonId: 8 versionPath: 1.0.0 displayText: '@rushstack/j 1.0.0 [@rushstack/n@2.0.0]' - entryId: '' + entryId: '@rushstack/j@1.0.0(@rushstack/n@2.0.0)' entryPackageName: '@rushstack/j' entryPackageVersion: 1.0.0 entrySuffix: '@rushstack/n@2.0.0' @@ -173,7 +173,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` resolvedEntryJsonId: 7 versionPath: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) displayText: '@rushstack/k 1.0.0 [@rushstack/m@1.0.0; @rushstack/n@2.0.0]' - entryId: '' + entryId: '@rushstack/k@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0)' entryPackageName: '@rushstack/k' entryPackageVersion: 1.0.0 entrySuffix: '@rushstack/m@1.0.0; @rushstack/n@2.0.0' @@ -190,7 +190,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` - '@rushstack/n' - dependencies: - dependencyType: peer - entryId: 'Peer: @rushstack/m' + entryId: '@rushstack/m@1.0.0' name: '@rushstack/m' originalSpecifier: ^1.0.0 peerDependencyMeta: @@ -199,7 +199,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` version: 1.0.0 versionPath: 1.0.0 - dependencyType: peer - entryId: 'Peer: @rushstack/n' + entryId: '@rushstack/n@2.0.0' name: '@rushstack/n' originalSpecifier: ^2.0.0 peerDependencyMeta: @@ -208,7 +208,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` version: 2.0.0 versionPath: 2.0.0 displayText: '@rushstack/l 1.0.0 [@rushstack/m@1.0.0; @rushstack/n@2.0.0]' - entryId: '' + entryId: '@rushstack/l@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0)' entryPackageName: '@rushstack/l' entryPackageVersion: 1.0.0 entrySuffix: '@rushstack/m@1.0.0; @rushstack/n@2.0.0' @@ -222,7 +222,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: [] displayText: '@rushstack/m 1.0.0' - entryId: '' + entryId: '@rushstack/m@1.0.0' entryPackageName: '@rushstack/m' entryPackageVersion: 1.0.0 entrySuffix: '' @@ -236,7 +236,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: [] displayText: '@rushstack/n 2.0.0' - entryId: '' + entryId: '@rushstack/n@2.0.0' entryPackageName: '@rushstack/n' entryPackageVersion: 2.0.0 entrySuffix: '' @@ -250,7 +250,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` transitivePeerDependencies: [] - dependencies: [] displayText: '@rushstack/n 3.0.0' - entryId: '' + entryId: '@rushstack/n@3.0.0' entryPackageName: '@rushstack/n' entryPackageVersion: 3.0.0 entrySuffix: '' diff --git a/apps/lockfile-explorer/src/graph/test/serializeToJson.test.ts b/apps/lockfile-explorer/src/graph/test/serializeToJson.test.ts index ac7970336cf..9edb0fd0b5b 100644 --- a/apps/lockfile-explorer/src/graph/test/serializeToJson.test.ts +++ b/apps/lockfile-explorer/src/graph/test/serializeToJson.test.ts @@ -57,7 +57,7 @@ Object { Object { "dependencies": Array [], "displayText": "@testPackage/core 1.7.1", - "entryId": "", + "entryId": "/@testPackage/core/1.7.1", "entryPackageName": "@testPackage/core", "entryPackageVersion": "1.7.1", "entrySuffix": "", @@ -73,7 +73,7 @@ Object { Object { "dependencies": Array [], "displayText": "@testPackage2/core 1.7.1", - "entryId": "", + "entryId": "/@testPackage2/core/1.7.1", "entryPackageName": "@testPackage2/core", "entryPackageVersion": "1.7.1", "entrySuffix": "", From b865fb14ece2d9c6b461e863cea0e7b369ee9217 Mon Sep 17 00:00:00 2001 From: Pete Gonzalez <4673363+octogonz@users.noreply.github.com> Date: Thu, 2 Oct 2025 22:41:44 -0700 Subject: [PATCH 13/15] Rename dependencyType -> dependencyKind --- .../LockfileEntryDetailsView/index.tsx | 8 ++--- .../src/packlets/lfx-shared/IJsonLfxGraph.ts | 2 +- .../src/packlets/lfx-shared/LfxGraph.ts | 6 ++-- .../packlets/lfx-shared/lfxGraphSerializer.ts | 4 +-- .../src/graph/lfxGraphLoader.ts | 8 ++--- .../lfxGraph-edge-cases-v5.4.test.ts.snap | 28 +++++++-------- .../lfxGraph-edge-cases-v6.0.test.ts.snap | 28 +++++++-------- .../lfxGraph-edge-cases-v9.0.test.ts.snap | 28 +++++++-------- ...fxGraph-website-sample-1-v5.4.test.ts.snap | 34 +++++++++---------- ...fxGraph-website-sample-1-v6.0.test.ts.snap | 30 ++++++++-------- ...fxGraph-website-sample-1-v9.0.test.ts.snap | 30 ++++++++-------- .../src/graph/test/serializeToJson.test.ts | 4 +-- 12 files changed, 105 insertions(+), 105 deletions(-) diff --git a/apps/lockfile-explorer-web/src/containers/LockfileEntryDetailsView/index.tsx b/apps/lockfile-explorer-web/src/containers/LockfileEntryDetailsView/index.tsx index e06d328f567..eec60868444 100644 --- a/apps/lockfile-explorer-web/src/containers/LockfileEntryDetailsView/index.tsx +++ b/apps/lockfile-explorer-web/src/containers/LockfileEntryDetailsView/index.tsx @@ -180,7 +180,7 @@ export const LockfileEntryDetailsView = (): JSX.Element | ReactNull => { package.json spec:{' '} - {inspectDependency.dependencyType === LfxDependencyKind.Peer + {inspectDependency.dependencyKind === LfxDependencyKind.Peer ? `"${inspectDependency.peerDependencyMeta.version}" ${ inspectDependency.peerDependencyMeta.optional ? 'Optional' : 'Required' } Peer` @@ -204,7 +204,7 @@ export const LockfileEntryDetailsView = (): JSX.Element | ReactNull => { const renderPeerDependencies = (): JSX.Element | ReactNull => { if (!selectedEntry) return ReactNull; - const peerDeps = selectedEntry.dependencies.filter((d) => d.dependencyType === LfxDependencyKind.Peer); + const peerDeps = selectedEntry.dependencies.filter((d) => d.dependencyKind === LfxDependencyKind.Peer); if (!peerDeps.length) { return (
@@ -212,7 +212,7 @@ export const LockfileEntryDetailsView = (): JSX.Element | ReactNull => {
); } - if (!inspectDependency || inspectDependency.dependencyType !== LfxDependencyKind.Peer) { + if (!inspectDependency || inspectDependency.dependencyKind !== LfxDependencyKind.Peer) { return (
Select a peer dependency to view its influencers @@ -337,7 +337,7 @@ export const LockfileEntryDetailsView = (): JSX.Element | ReactNull => { > Name: {dependency.name}{' '} - {dependency.dependencyType === LfxDependencyKind.Peer + {dependency.dependencyKind === LfxDependencyKind.Peer ? `${ dependency.peerDependencyMeta.optional ? '(Optional)' : '(Non-optional)' } Peer Dependency` diff --git a/apps/lockfile-explorer-web/src/packlets/lfx-shared/IJsonLfxGraph.ts b/apps/lockfile-explorer-web/src/packlets/lfx-shared/IJsonLfxGraph.ts index aba495dafb8..35baa33daca 100644 --- a/apps/lockfile-explorer-web/src/packlets/lfx-shared/IJsonLfxGraph.ts +++ b/apps/lockfile-explorer-web/src/packlets/lfx-shared/IJsonLfxGraph.ts @@ -21,7 +21,7 @@ export interface IJsonLfxDependency { versionPath: string; entryId: string; originalSpecifier: string; - dependencyType: LfxDependencyKind; + dependencyKind: LfxDependencyKind; peerDependencyMeta: IJsonPeerDependencyMeta; resolvedEntryJsonId?: number; diff --git a/apps/lockfile-explorer-web/src/packlets/lfx-shared/LfxGraph.ts b/apps/lockfile-explorer-web/src/packlets/lfx-shared/LfxGraph.ts index 36e42e97a99..a45371b7ba3 100644 --- a/apps/lockfile-explorer-web/src/packlets/lfx-shared/LfxGraph.ts +++ b/apps/lockfile-explorer-web/src/packlets/lfx-shared/LfxGraph.ts @@ -11,7 +11,7 @@ export interface ILfxGraphDependencyOptions { entryId: string; originalSpecifier: string; - dependencyType: LfxDependencyKind; + dependencyKind: LfxDependencyKind; peerDependencyMeta: IJsonPeerDependencyMeta; containingEntry: LfxGraphEntry; @@ -60,7 +60,7 @@ export class LfxGraphDependency { * obtained from the package.json files. */ public readonly originalSpecifier: string; - public readonly dependencyType: LfxDependencyKind; + public readonly dependencyKind: LfxDependencyKind; public readonly peerDependencyMeta: IJsonPeerDependencyMeta; public readonly containingEntry: LfxGraphEntry; @@ -71,7 +71,7 @@ export class LfxGraphDependency { this.versionPath = options.versionPath; this.entryId = options.entryId; this.originalSpecifier = options.originalSpecifier; - this.dependencyType = options.dependencyType; + this.dependencyKind = options.dependencyKind; this.peerDependencyMeta = options.peerDependencyMeta; this.containingEntry = options.containingEntry; diff --git a/apps/lockfile-explorer-web/src/packlets/lfx-shared/lfxGraphSerializer.ts b/apps/lockfile-explorer-web/src/packlets/lfx-shared/lfxGraphSerializer.ts index 1b69c6ca851..f2f4be485e9 100644 --- a/apps/lockfile-explorer-web/src/packlets/lfx-shared/lfxGraphSerializer.ts +++ b/apps/lockfile-explorer-web/src/packlets/lfx-shared/lfxGraphSerializer.ts @@ -54,7 +54,7 @@ export function serializeToJson(graph: LfxGraph): IJsonLfxGraph { versionPath: dependency.versionPath, entryId: dependency.entryId, originalSpecifier: dependency.originalSpecifier, - dependencyType: dependency.dependencyType, + dependencyKind: dependency.dependencyKind, peerDependencyMeta: { name: dependency.peerDependencyMeta.name, version: dependency.peerDependencyMeta.version, @@ -115,7 +115,7 @@ export function deserializeFromJson(jsonLfxGraph: IJsonLfxGraph): LfxGraph { versionPath: jsonLfxDependency.versionPath, entryId: jsonLfxDependency.entryId, originalSpecifier: jsonLfxDependency.originalSpecifier, - dependencyType: jsonLfxDependency.dependencyType, + dependencyKind: jsonLfxDependency.dependencyKind, peerDependencyMeta: { name: jsonLfxDependency.peerDependencyMeta.name, version: jsonLfxDependency.peerDependencyMeta.version, diff --git a/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts b/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts index 91cda8f775a..ee493855030 100644 --- a/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts +++ b/apps/lockfile-explorer/src/graph/lfxGraphLoader.ts @@ -34,7 +34,7 @@ function createPackageLockfileDependency(options: { name, versionPath, originalSpecifier, - kind: dependencyType, + kind: dependencyKind, containingEntry, peerDependenciesMeta, pnpmLockfileVersion @@ -45,7 +45,7 @@ function createPackageLockfileDependency(options: { versionPath, entryId: '', originalSpecifier, - dependencyType, + dependencyKind, peerDependencyMeta: {}, containingEntry }; @@ -81,7 +81,7 @@ function createPackageLockfileDependency(options: { (pnpmLockfileVersion < 90 ? '/' : '') + result.name + versionDelimiter + result.versionPath; } - if (result.dependencyType === LfxDependencyKind.Peer) { + if (result.dependencyKind === LfxDependencyKind.Peer) { result.peerDependencyMeta = { name: result.name, version: versionPath, @@ -589,7 +589,7 @@ export function generateLockfileGraph(lockfileJson: unknown, workspace: IJsonLfx for (const entry of allEntries) { for (const dependency of entry.dependencies) { // Peer dependencies do not have a matching entry - if (dependency.dependencyType === LfxDependencyKind.Peer) { + if (dependency.dependencyKind === LfxDependencyKind.Peer) { continue; } diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap index cfdda1a654f..a8af1106857 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v5.4.test.ts.snap @@ -3,14 +3,14 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` "entries: - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /mime-db/1.54.0 name: mime-db originalSpecifier: ^1.52.0 peerDependencyMeta: {} resolvedEntryJsonId: 11 versionPath: 1.54.0 - - dependencyType: dev + - dependencyKind: dev entryId: /color-string/2.1.2 name: color-string originalSpecifier: ^2.1.2 @@ -29,7 +29,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /color/5.0.2 name: color originalSpecifier: ^5.0.2 @@ -48,7 +48,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /color-string/2.1.2 name: color-string originalSpecifier: ^2.1.2 @@ -67,14 +67,14 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /has-symbols/1.0.2 name: has-symbols originalSpecifier: 1.0.2 peerDependencyMeta: {} resolvedEntryJsonId: 10 versionPath: 1.0.2 - - dependencyType: regular + - dependencyKind: regular entryId: project:packages/link-specifier/linker/packages/link-specifier/target-folder name: target-folder originalSpecifier: link:packages/link-specifier/target-folder @@ -92,14 +92,14 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /address/1.2.2 name: address originalSpecifier: ^1.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 5 versionPath: 1.2.2 - - dependencyType: regular + - dependencyKind: regular entryId: /uri-js/4.4.1 name: uri-js originalSpecifier: ^4.0.0 @@ -131,7 +131,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - 4 transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /color-name/2.0.2 name: color-name originalSpecifier: '' @@ -165,7 +165,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - 8 transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /color-name/2.0.2 name: color-name originalSpecifier: '' @@ -187,14 +187,14 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - 9 transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /color-convert/3.1.2 name: color-convert originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 3.1.2 - - dependencyType: regular + - dependencyKind: regular entryId: /color-string/2.1.2 name: color-string originalSpecifier: '' @@ -214,7 +214,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - 1 transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: '' name: target-folder originalSpecifier: '' @@ -259,7 +259,7 @@ exports[`lfxGraph-edge-cases-v5.4 loads a workspace 1`] = ` - 13 transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /punycode/2.3.1 name: punycode originalSpecifier: '' diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap index 9b9ef424c92..fd6f0c80fdd 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v6.0.test.ts.snap @@ -3,14 +3,14 @@ exports[`lfxGraph-edge-cases-v6.0 loads a workspace 1`] = ` "entries: - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /mime-db@1.54.0 name: mime-db originalSpecifier: ^1.52.0 peerDependencyMeta: {} resolvedEntryJsonId: 11 versionPath: 1.54.0 - - dependencyType: dev + - dependencyKind: dev entryId: /color-string@2.1.2 name: color-string originalSpecifier: ^2.1.2 @@ -29,7 +29,7 @@ exports[`lfxGraph-edge-cases-v6.0 loads a workspace 1`] = ` referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /color@5.0.2 name: color originalSpecifier: ^5.0.2 @@ -48,7 +48,7 @@ exports[`lfxGraph-edge-cases-v6.0 loads a workspace 1`] = ` referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /color-string@2.1.2 name: color-string originalSpecifier: ^2.1.2 @@ -67,14 +67,14 @@ exports[`lfxGraph-edge-cases-v6.0 loads a workspace 1`] = ` referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /has-symbols@1.0.2 name: has-symbols originalSpecifier: 1.0.2 peerDependencyMeta: {} resolvedEntryJsonId: 10 versionPath: 1.0.2 - - dependencyType: regular + - dependencyKind: regular entryId: project:packages/link-specifier/linker/packages/link-specifier/target-folder name: target-folder originalSpecifier: link:packages/link-specifier/target-folder @@ -92,14 +92,14 @@ exports[`lfxGraph-edge-cases-v6.0 loads a workspace 1`] = ` referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /address@1.2.2 name: address originalSpecifier: ^1.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 5 versionPath: 1.2.2 - - dependencyType: regular + - dependencyKind: regular entryId: /uri-js@4.4.1 name: uri-js originalSpecifier: ^4.0.0 @@ -131,7 +131,7 @@ exports[`lfxGraph-edge-cases-v6.0 loads a workspace 1`] = ` - 4 transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /color-name@2.0.2 name: color-name originalSpecifier: '' @@ -165,7 +165,7 @@ exports[`lfxGraph-edge-cases-v6.0 loads a workspace 1`] = ` - 8 transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /color-name@2.0.2 name: color-name originalSpecifier: '' @@ -187,14 +187,14 @@ exports[`lfxGraph-edge-cases-v6.0 loads a workspace 1`] = ` - 9 transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /color-convert@3.1.2 name: color-convert originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 3.1.2 - - dependencyType: regular + - dependencyKind: regular entryId: /color-string@2.1.2 name: color-string originalSpecifier: '' @@ -214,7 +214,7 @@ exports[`lfxGraph-edge-cases-v6.0 loads a workspace 1`] = ` - 1 transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: '' name: target-folder originalSpecifier: '' @@ -259,7 +259,7 @@ exports[`lfxGraph-edge-cases-v6.0 loads a workspace 1`] = ` - 13 transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /punycode@2.3.1 name: punycode originalSpecifier: '' diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap index bdcabc90f8c..e2683f0e50d 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-edge-cases-v9.0.test.ts.snap @@ -3,14 +3,14 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` "entries: - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: mime-db@1.54.0 name: mime-db originalSpecifier: ^1.52.0 peerDependencyMeta: {} resolvedEntryJsonId: 11 versionPath: 1.54.0 - - dependencyType: dev + - dependencyKind: dev entryId: color-string@2.1.2 name: color-string originalSpecifier: ^2.1.2 @@ -29,7 +29,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: color@5.0.2 name: color originalSpecifier: ^5.0.2 @@ -48,7 +48,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: color-string@2.1.2 name: color-string originalSpecifier: ^2.1.2 @@ -67,14 +67,14 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: has-symbols@1.0.2 name: has-symbols originalSpecifier: 1.0.2 peerDependencyMeta: {} resolvedEntryJsonId: 10 versionPath: 1.0.2 - - dependencyType: regular + - dependencyKind: regular entryId: project:packages/link-specifier/linker/packages/link-specifier/target-folder name: target-folder originalSpecifier: link:packages/link-specifier/target-folder @@ -92,14 +92,14 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: address@1.2.2 name: address originalSpecifier: ^1.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 5 versionPath: 1.2.2 - - dependencyType: regular + - dependencyKind: regular entryId: uri-js@4.4.1 name: uri-js originalSpecifier: ^4.0.0 @@ -131,7 +131,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` - 4 transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: color-name@2.0.2 name: color-name originalSpecifier: '' @@ -165,7 +165,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` - 8 transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: color-name@2.0.2 name: color-name originalSpecifier: '' @@ -187,14 +187,14 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` - 9 transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: color-convert@3.1.2 name: color-convert originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 3.1.2 - - dependencyType: regular + - dependencyKind: regular entryId: color-string@2.1.2 name: color-string originalSpecifier: '' @@ -214,7 +214,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` - 1 transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: '' name: target-folder originalSpecifier: '' @@ -259,7 +259,7 @@ exports[`lfxGraph-edge-cases-v9.0 loads a workspace 1`] = ` - 13 transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: punycode@2.3.1 name: punycode originalSpecifier: '' diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v5.4.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v5.4.test.ts.snap index 7fe78a8f836..804e1219938 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v5.4.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v5.4.test.ts.snap @@ -3,7 +3,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` "entries: - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: project:projects/d name: '@rushstack/d' originalSpecifier: workspace:* @@ -22,14 +22,14 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: project:projects/d name: '@rushstack/d' originalSpecifier: workspace:* peerDependencyMeta: {} resolvedEntryJsonId: 3 versionPath: link:../d - - dependencyType: regular + - dependencyKind: regular entryId: /@rushstack/n/2.0.0 name: '@rushstack/n' originalSpecifier: ^2.0.0 @@ -48,21 +48,21 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: project:projects/e name: '@rushstack/e' originalSpecifier: workspace:* peerDependencyMeta: {} resolvedEntryJsonId: 4 versionPath: link:../e - - dependencyType: regular + - dependencyKind: regular entryId: /@rushstack/k/1.0.0_@rushstack+m@1.0.0 name: '@rushstack/k' originalSpecifier: ^1.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 1.0.0_@rushstack+m@1.0.0 - - dependencyType: regular + - dependencyKind: regular entryId: /@rushstack/m/1.0.0 name: '@rushstack/m' originalSpecifier: ~1.0.0 @@ -81,21 +81,21 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: project:projects/e name: '@rushstack/e' originalSpecifier: workspace:* peerDependencyMeta: {} resolvedEntryJsonId: 4 versionPath: link:../e - - dependencyType: regular + - dependencyKind: regular entryId: /@rushstack/j/1.0.0_@rushstack+n@2.0.0 name: '@rushstack/j' originalSpecifier: ^1.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 5 versionPath: 1.0.0_@rushstack+n@2.0.0 - - dependencyType: regular + - dependencyKind: regular entryId: /@rushstack/n/2.0.0 name: '@rushstack/n' originalSpecifier: ^2.0.0 @@ -116,7 +116,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - 1 transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /@rushstack/n/3.0.0 name: '@rushstack/n' originalSpecifier: ^3.0.0 @@ -137,14 +137,14 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - 3 transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /@rushstack/k/1.0.0_wxpgugna4ivthu7yyu4fmciltu name: '@rushstack/k' originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 7 versionPath: 1.0.0_wxpgugna4ivthu7yyu4fmciltu - - dependencyType: regular + - dependencyKind: regular entryId: /@rushstack/m/1.0.0 name: '@rushstack/m' originalSpecifier: '' @@ -165,7 +165,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` transitivePeerDependencies: - '@rushstack/n' - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /@rushstack/l/1.0.0_@rushstack+m@1.0.0 name: '@rushstack/l' originalSpecifier: '' @@ -187,7 +187,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - '@rushstack/m' - '@rushstack/n' - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /@rushstack/l/1.0.0_wxpgugna4ivthu7yyu4fmciltu name: '@rushstack/l' originalSpecifier: '' @@ -209,7 +209,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - '@rushstack/m' - '@rushstack/n' - dependencies: - - dependencyType: peer + - dependencyKind: peer entryId: /@rushstack/m/1.0.0 name: '@rushstack/m' originalSpecifier: ^1.0.0 @@ -231,7 +231,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` - 6 transitivePeerDependencies: [] - dependencies: - - dependencyType: peer + - dependencyKind: peer entryId: /@rushstack/m/1.0.0 name: '@rushstack/m' originalSpecifier: ^1.0.0 @@ -240,7 +240,7 @@ exports[`lfxGraph-website-sample-1-v5.4 loads a workspace 1`] = ` optional: false version: 1.0.0 versionPath: 1.0.0 - - dependencyType: peer + - dependencyKind: peer entryId: /@rushstack/n/2.0.0 name: '@rushstack/n' originalSpecifier: ^2.0.0 diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v6.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v6.0.test.ts.snap index 3b4713b6a1a..f53e290cbcd 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v6.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v6.0.test.ts.snap @@ -3,7 +3,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` "entries: - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: project:projects/d name: '@rushstack/d' originalSpecifier: workspace:* @@ -22,14 +22,14 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: project:projects/d name: '@rushstack/d' originalSpecifier: workspace:* peerDependencyMeta: {} resolvedEntryJsonId: 3 versionPath: link:../d - - dependencyType: regular + - dependencyKind: regular entryId: /@rushstack/n@2.0.0 name: '@rushstack/n' originalSpecifier: ^2.0.0 @@ -48,21 +48,21 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: project:projects/e name: '@rushstack/e' originalSpecifier: workspace:* peerDependencyMeta: {} resolvedEntryJsonId: 4 versionPath: link:../e - - dependencyType: regular + - dependencyKind: regular entryId: /@rushstack/k@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) name: '@rushstack/k' originalSpecifier: ^1.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) - - dependencyType: regular + - dependencyKind: regular entryId: /@rushstack/m@1.0.0 name: '@rushstack/m' originalSpecifier: ~1.0.0 @@ -81,21 +81,21 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: project:projects/e name: '@rushstack/e' originalSpecifier: workspace:* peerDependencyMeta: {} resolvedEntryJsonId: 4 versionPath: link:../e - - dependencyType: regular + - dependencyKind: regular entryId: /@rushstack/j@1.0.0(@rushstack/n@2.0.0) name: '@rushstack/j' originalSpecifier: ^1.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 5 versionPath: 1.0.0(@rushstack/n@2.0.0) - - dependencyType: regular + - dependencyKind: regular entryId: /@rushstack/n@2.0.0 name: '@rushstack/n' originalSpecifier: ^2.0.0 @@ -116,7 +116,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` - 1 transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /@rushstack/n@3.0.0 name: '@rushstack/n' originalSpecifier: ^3.0.0 @@ -137,14 +137,14 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` - 3 transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /@rushstack/k@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) name: '@rushstack/k' originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) - - dependencyType: regular + - dependencyKind: regular entryId: /@rushstack/m@1.0.0 name: '@rushstack/m' originalSpecifier: '' @@ -165,7 +165,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` transitivePeerDependencies: - '@rushstack/n' - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: /@rushstack/l@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) name: '@rushstack/l' originalSpecifier: '' @@ -189,7 +189,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` - '@rushstack/m' - '@rushstack/n' - dependencies: - - dependencyType: peer + - dependencyKind: peer entryId: /@rushstack/m@1.0.0 name: '@rushstack/m' originalSpecifier: ^1.0.0 @@ -198,7 +198,7 @@ exports[`lfxGraph-website-sample-1-v6.0 loads a workspace 1`] = ` optional: false version: 1.0.0 versionPath: 1.0.0 - - dependencyType: peer + - dependencyKind: peer entryId: /@rushstack/n@2.0.0 name: '@rushstack/n' originalSpecifier: ^2.0.0 diff --git a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap index ef29e0a1c22..852a55ba2d2 100644 --- a/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap +++ b/apps/lockfile-explorer/src/graph/test/__snapshots__/lfxGraph-website-sample-1-v9.0.test.ts.snap @@ -3,7 +3,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` "entries: - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: project:projects/d name: '@rushstack/d' originalSpecifier: workspace:* @@ -22,14 +22,14 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: project:projects/d name: '@rushstack/d' originalSpecifier: workspace:* peerDependencyMeta: {} resolvedEntryJsonId: 3 versionPath: link:../d - - dependencyType: regular + - dependencyKind: regular entryId: '@rushstack/n@2.0.0' name: '@rushstack/n' originalSpecifier: ^2.0.0 @@ -48,21 +48,21 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: project:projects/e name: '@rushstack/e' originalSpecifier: workspace:* peerDependencyMeta: {} resolvedEntryJsonId: 4 versionPath: link:../e - - dependencyType: regular + - dependencyKind: regular entryId: '@rushstack/k@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0)' name: '@rushstack/k' originalSpecifier: ^1.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) - - dependencyType: regular + - dependencyKind: regular entryId: '@rushstack/m@1.0.0' name: '@rushstack/m' originalSpecifier: ~1.0.0 @@ -81,21 +81,21 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` referrerJsonIds: [] transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: project:projects/e name: '@rushstack/e' originalSpecifier: workspace:* peerDependencyMeta: {} resolvedEntryJsonId: 4 versionPath: link:../e - - dependencyType: regular + - dependencyKind: regular entryId: '@rushstack/j@1.0.0(@rushstack/n@2.0.0)' name: '@rushstack/j' originalSpecifier: ^1.0.0 peerDependencyMeta: {} resolvedEntryJsonId: 5 versionPath: 1.0.0(@rushstack/n@2.0.0) - - dependencyType: regular + - dependencyKind: regular entryId: '@rushstack/n@2.0.0' name: '@rushstack/n' originalSpecifier: ^2.0.0 @@ -116,7 +116,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` - 1 transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: '@rushstack/n@3.0.0' name: '@rushstack/n' originalSpecifier: ^3.0.0 @@ -137,14 +137,14 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` - 3 transitivePeerDependencies: [] - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: '@rushstack/k@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0)' name: '@rushstack/k' originalSpecifier: '' peerDependencyMeta: {} resolvedEntryJsonId: 6 versionPath: 1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0) - - dependencyType: regular + - dependencyKind: regular entryId: '@rushstack/m@1.0.0' name: '@rushstack/m' originalSpecifier: '' @@ -165,7 +165,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` transitivePeerDependencies: - '@rushstack/n' - dependencies: - - dependencyType: regular + - dependencyKind: regular entryId: '@rushstack/l@1.0.0(@rushstack/m@1.0.0)(@rushstack/n@2.0.0)' name: '@rushstack/l' originalSpecifier: '' @@ -189,7 +189,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` - '@rushstack/m' - '@rushstack/n' - dependencies: - - dependencyType: peer + - dependencyKind: peer entryId: '@rushstack/m@1.0.0' name: '@rushstack/m' originalSpecifier: ^1.0.0 @@ -198,7 +198,7 @@ exports[`lfxGraph-website-sample-1-v9.0 loads a workspace 1`] = ` optional: false version: 1.0.0 versionPath: 1.0.0 - - dependencyType: peer + - dependencyKind: peer entryId: '@rushstack/n@2.0.0' name: '@rushstack/n' originalSpecifier: ^2.0.0 diff --git a/apps/lockfile-explorer/src/graph/test/serializeToJson.test.ts b/apps/lockfile-explorer/src/graph/test/serializeToJson.test.ts index 9edb0fd0b5b..a6be195f847 100644 --- a/apps/lockfile-explorer/src/graph/test/serializeToJson.test.ts +++ b/apps/lockfile-explorer/src/graph/test/serializeToJson.test.ts @@ -16,7 +16,7 @@ Object { Object { "dependencies": Array [ Object { - "dependencyType": "regular", + "dependencyKind": "regular", "entryId": "/@testPackage/core/1.7.1", "name": "@testPackage/core", "originalSpecifier": "1.7.1", @@ -29,7 +29,7 @@ Object { "versionPath": "1.7.1", }, Object { - "dependencyType": "regular", + "dependencyKind": "regular", "entryId": "/@testPackage2/core/1.7.1", "name": "@testPackage2/core", "originalSpecifier": "1.7.1", From 8502570fc6e2b26e954a4e18dad1da437d131050 Mon Sep 17 00:00:00 2001 From: Pete Gonzalez <4673363+octogonz@users.noreply.github.com> Date: Thu, 2 Oct 2025 22:48:02 -0700 Subject: [PATCH 14/15] rush change --- .../octogonz-lfx-pnpm-10_2025-10-03-05-47.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 common/changes/@rushstack/lockfile-explorer/octogonz-lfx-pnpm-10_2025-10-03-05-47.json diff --git a/common/changes/@rushstack/lockfile-explorer/octogonz-lfx-pnpm-10_2025-10-03-05-47.json b/common/changes/@rushstack/lockfile-explorer/octogonz-lfx-pnpm-10_2025-10-03-05-47.json new file mode 100644 index 00000000000..6f4e68f2202 --- /dev/null +++ b/common/changes/@rushstack/lockfile-explorer/octogonz-lfx-pnpm-10_2025-10-03-05-47.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@rushstack/lockfile-explorer", + "comment": "Add support for PNPM 10 lockfile format", + "type": "major" + } + ], + "packageName": "@rushstack/lockfile-explorer" +} \ No newline at end of file From 759b10204aedec5964430dab309c600f22596d19 Mon Sep 17 00:00:00 2001 From: Pete Gonzalez <4673363+octogonz@users.noreply.github.com> Date: Thu, 2 Oct 2025 22:49:01 -0700 Subject: [PATCH 15/15] rush change --- .../octogonz-lfx-pnpm-10_2025-10-03-05-48.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 common/changes/@rushstack/lockfile-explorer/octogonz-lfx-pnpm-10_2025-10-03-05-48.json diff --git a/common/changes/@rushstack/lockfile-explorer/octogonz-lfx-pnpm-10_2025-10-03-05-48.json b/common/changes/@rushstack/lockfile-explorer/octogonz-lfx-pnpm-10_2025-10-03-05-48.json new file mode 100644 index 00000000000..793df66a889 --- /dev/null +++ b/common/changes/@rushstack/lockfile-explorer/octogonz-lfx-pnpm-10_2025-10-03-05-48.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@rushstack/lockfile-explorer", + "comment": "Numerous improvements to the lockfile parser", + "type": "patch" + } + ], + "packageName": "@rushstack/lockfile-explorer" +} \ No newline at end of file