From d66b398840f6f53b7d57f2c6e5d17e7172dd6859 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 4 Sep 2022 23:17:24 +0200 Subject: [PATCH] cli: improve v2 lockfile parsing to split out ranges Signed-off-by: Patrik Oldsberg --- packages/cli/src/lib/versioning/Lockfile.test.ts | 5 +++-- packages/cli/src/lib/versioning/Lockfile.ts | 12 ++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/cli/src/lib/versioning/Lockfile.test.ts b/packages/cli/src/lib/versioning/Lockfile.test.ts index bad7ab6719..4621b43372 100644 --- a/packages/cli/src/lib/versioning/Lockfile.test.ts +++ b/packages/cli/src/lib/versioning/Lockfile.test.ts @@ -170,7 +170,7 @@ a@^1: integrity: sha512-xyz resolved: "https://my-registry/a-1.0.01.tgz#abc123" -b@2.0.x: +"b@2.0.x, b@^2.0.1": version: 2.0.1 b@^2: @@ -185,7 +185,7 @@ a@^1: integrity: sha512-xyz resolved: "https://my-registry/a-1.0.01.tgz#abc123" -b@2.0.x: +"b@2.0.x, b@^2.0.1": version: 2.0.1 b@^2: @@ -206,6 +206,7 @@ describe('New Lockfile', () => { expect(lockfile.get('a')).toEqual([{ range: '^1', version: '1.0.1' }]); expect(lockfile.get('b')).toEqual([ { range: '2.0.x', version: '2.0.1' }, + { range: '^2.0.1', version: '2.0.1' }, { range: '^2', version: '2.0.0' }, ]); expect(lockfile.toString()).toBe(mockANew); diff --git a/packages/cli/src/lib/versioning/Lockfile.ts b/packages/cli/src/lib/versioning/Lockfile.ts index 278778b6a6..016593ea8d 100644 --- a/packages/cli/src/lib/versioning/Lockfile.ts +++ b/packages/cli/src/lib/versioning/Lockfile.ts @@ -122,7 +122,7 @@ export class Lockfile { for (const [key, value] of Object.entries(data)) { if (SPECIAL_OBJECT_KEYS.includes(key)) continue; - const [, name, range] = ENTRY_PATTERN.exec(key) ?? []; + const [, name, ranges] = ENTRY_PATTERN.exec(key) ?? []; if (!name) { throw new Error(`Failed to parse yarn.lock entry '${key}'`); } @@ -132,7 +132,15 @@ export class Lockfile { queries = []; packages.set(name, queries); } - queries.push({ range, version: value.version }); + for (let range of ranges.split(/\s*,\s*/)) { + if (range.startsWith(`${name}@`)) { + range = range.slice(`${name}@`.length); + } + if (range.startsWith('npm:')) { + range = range.slice('npm:'.length); + } + queries.push({ range, version: value.version }); + } } return new Lockfile(path, packages, data, legacy);