From 9247f6781ba7d4ee995d4540f0d3a9cbb0752c27 Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Mon, 30 Jan 2023 17:28:20 +0200 Subject: [PATCH] fix: issues with storybook and the new lockfile format (#5998) close #5976 --- .changeset/strong-poets-juggle.md | 6 ++++++ packages/dependency-path/src/index.ts | 7 ++++++- packages/dependency-path/test/index.ts | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 .changeset/strong-poets-juggle.md diff --git a/.changeset/strong-poets-juggle.md b/.changeset/strong-poets-juggle.md new file mode 100644 index 0000000000..1f78857bdd --- /dev/null +++ b/.changeset/strong-poets-juggle.md @@ -0,0 +1,6 @@ +--- +"@pnpm/dependency-path": patch +"pnpm": patch +--- + +Directories inside the virtual store should not contain the ( or ) chars. This is to fix issues with storybook and the new v6 `pnpm-lock.yaml` lockfile format [#5976](https://github.com/pnpm/pnpm/issues/5976). diff --git a/packages/dependency-path/src/index.ts b/packages/dependency-path/src/index.ts index a777a52cbd..ad1a9c55d1 100644 --- a/packages/dependency-path/src/index.ts +++ b/packages/dependency-path/src/index.ts @@ -143,7 +143,12 @@ export function parse (dependencyPath: string) { } export function depPathToFilename (depPath: string) { - const filename = depPathToFilenameUnescaped(depPath).replace(/[\\/:*?"<>|]/g, '+') + let filename = depPathToFilenameUnescaped(depPath).replace(/[\\/:*?"<>|]/g, '+') + if (filename.includes('(')) { + filename = filename + .replace(/(\)\()|\(/g, '_') + .replace(/\)$/, '') + } if (filename.length > 120 || filename !== filename.toLowerCase() && !filename.startsWith('file+')) { return `${filename.substring(0, 50)}_${createBase32Hash(filename)}` } diff --git a/packages/dependency-path/test/index.ts b/packages/dependency-path/test/index.ts index 94554798d5..d7aa74d620 100644 --- a/packages/dependency-path/test/index.ts +++ b/packages/dependency-path/test/index.ts @@ -154,6 +154,7 @@ test('depPathToFilename()', () => { expect(depPathToFilename('/@foo/bar/1.0.0')).toBe('@foo+bar@1.0.0') expect(depPathToFilename('github.com/something/foo/0000?v=1')).toBe('github.com+something+foo@0000+v=1') expect(depPathToFilename('\\//:*?"<>|')).toBe('++@+++++++') + expect(depPathToFilename('/foo/1.0.0(react@16.0.0)(react-dom@16.0.0)')).toBe('foo@1.0.0_react@16.0.0_react-dom@16.0.0') const filename = depPathToFilename('file:test/foo-1.0.0.tgz_foo@2.0.0') expect(filename).toBe('file+test+foo-1.0.0.tgz_foo@2.0.0')