From 793965ee36aae6075d8080f248095b230015d438 Mon Sep 17 00:00:00 2001 From: await-ovo <13152410380@163.com> Date: Wed, 7 Dec 2022 22:52:07 +0800 Subject: [PATCH 1/4] fix: should not replace workspace:* when update --- pkg-manager/core/src/install/index.ts | 2 +- pkg-manager/core/src/parseWantedDependencies.ts | 2 +- pkg-manager/core/test/install/multipleImporters.ts | 2 +- .../src/updateWorkspaceDependencies.ts | 2 +- .../test/updateWorkspaceDependencies.test.ts | 2 +- .../resolve-dependencies/src/getWantedDependencies.ts | 2 +- .../resolve-dependencies/src/updateProjectManifest.ts | 10 ++++++++-- 7 files changed, 14 insertions(+), 8 deletions(-) diff --git a/pkg-manager/core/src/install/index.ts b/pkg-manager/core/src/install/index.ts index 571eae28dee..a44047f38c9 100644 --- a/pkg-manager/core/src/install/index.ts +++ b/pkg-manager/core/src/install/index.ts @@ -538,7 +538,7 @@ export async function mutateModules ( projectsToInstall.push({ pruneDirectDependencies: false, ...project, - wantedDependencies: wantedDeps.map(wantedDep => ({ ...wantedDep, isNew: true, updateSpec: true, nodeExecPath: opts.nodeExecPath })), + wantedDependencies: wantedDeps.map(wantedDep => ({ ...wantedDep, isNew: !currentPrefs[wantedDep.alias], updateSpec: true, nodeExecPath: opts.nodeExecPath })), }) } diff --git a/pkg-manager/core/src/parseWantedDependencies.ts b/pkg-manager/core/src/parseWantedDependencies.ts index c59ffa237ab..b5bd659f9e9 100644 --- a/pkg-manager/core/src/parseWantedDependencies.ts +++ b/pkg-manager/core/src/parseWantedDependencies.ts @@ -41,7 +41,7 @@ export function parseWantedDependencies ( dev: Boolean(opts.dev || alias && !!opts.devDependencies[alias]), optional: Boolean(opts.optional || alias && !!opts.optionalDependencies[alias]), pinnedVersion, - raw: rawWantedDependency, + raw: alias && opts.currentPrefs?.[alias]?.startsWith('workspace:') ? `${alias}@${opts.currentPrefs[alias]}` : rawWantedDependency, } if (pref) { return { diff --git a/pkg-manager/core/test/install/multipleImporters.ts b/pkg-manager/core/test/install/multipleImporters.ts index 529c04dc218..3ee467d831f 100644 --- a/pkg-manager/core/test/install/multipleImporters.ts +++ b/pkg-manager/core/test/install/multipleImporters.ts @@ -1033,7 +1033,7 @@ test('update workspace range', async () => { dep3: 'workspace:^2.0.0', dep4: 'workspace:^2.0.0', dep5: 'workspace:~2.0.0', - dep6: 'workspace:2.0.0', + dep6: 'workspace:*', } expect(updatedImporters[0].manifest.dependencies).toStrictEqual(expected) expect(updatedImporters[1].manifest.dependencies).toStrictEqual(expected) diff --git a/pkg-manager/plugin-commands-installation/src/updateWorkspaceDependencies.ts b/pkg-manager/plugin-commands-installation/src/updateWorkspaceDependencies.ts index 62f626297f2..bdec3a57e1c 100644 --- a/pkg-manager/plugin-commands-installation/src/updateWorkspaceDependencies.ts +++ b/pkg-manager/plugin-commands-installation/src/updateWorkspaceDependencies.ts @@ -27,7 +27,7 @@ export function createWorkspaceSpecs (specs: string[], workspacePackages: Worksp const parsed = parseWantedDependency(spec) if (!parsed.alias) throw new PnpmError('NO_PKG_NAME_IN_SPEC', `Cannot update/install from workspace through "${spec}"`) if (!workspacePackages[parsed.alias]) throw new PnpmError('WORKSPACE_PACKAGE_NOT_FOUND', `"${parsed.alias}" not found in the workspace`) - if (!parsed.pref) return `${parsed.alias}@workspace:*` + if (!parsed.pref) return `${parsed.alias}@workspace:>=0.0.0` if (parsed.pref.startsWith('workspace:')) return spec return `${parsed.alias}@workspace:${parsed.pref}` }) diff --git a/pkg-manager/plugin-commands-installation/test/updateWorkspaceDependencies.test.ts b/pkg-manager/plugin-commands-installation/test/updateWorkspaceDependencies.test.ts index e7dc8993275..0447092a3da 100644 --- a/pkg-manager/plugin-commands-installation/test/updateWorkspaceDependencies.test.ts +++ b/pkg-manager/plugin-commands-installation/test/updateWorkspaceDependencies.test.ts @@ -72,7 +72,7 @@ test('updateToWorkspacePackagesFromManifest()', () => { }) test('createWorkspaceSpecs', () => { - expect(createWorkspaceSpecs(['bar', 'foo@2', 'qar@workspace:3'], WORKSPACE_PACKAGES)).toStrictEqual(['bar@workspace:*', 'foo@workspace:2', 'qar@workspace:3']) + expect(createWorkspaceSpecs(['bar', 'foo@2', 'qar@workspace:3'], WORKSPACE_PACKAGES)).toStrictEqual(['bar@workspace:>=0.0.0', 'foo@workspace:2', 'qar@workspace:3']) let err!: PnpmError try { createWorkspaceSpecs(['express'], WORKSPACE_PACKAGES) diff --git a/pkg-manager/resolve-dependencies/src/getWantedDependencies.ts b/pkg-manager/resolve-dependencies/src/getWantedDependencies.ts index c19315ab752..41542ea798d 100644 --- a/pkg-manager/resolve-dependencies/src/getWantedDependencies.ts +++ b/pkg-manager/resolve-dependencies/src/getWantedDependencies.ts @@ -83,7 +83,7 @@ function getWantedDependenciesFromGivenSet ( nodeExecPath: opts.nodeExecPath ?? opts.dependenciesMeta[alias]?.node, pinnedVersion: whichVersionIsPinned(pref), pref: updatedPref, - raw: `${alias}@${updatedPref}`, + raw: `${alias}@${pref}`, } }) } diff --git a/pkg-manager/resolve-dependencies/src/updateProjectManifest.ts b/pkg-manager/resolve-dependencies/src/updateProjectManifest.ts index 51e8defe886..7ce51adf021 100644 --- a/pkg-manager/resolve-dependencies/src/updateProjectManifest.ts +++ b/pkg-manager/resolve-dependencies/src/updateProjectManifest.ts @@ -159,8 +159,14 @@ function getPrefPreferSpecifiedExoticSpec ( } ) { const prefix = getPrefix(opts.alias, opts.name) - if (opts.specRaw?.startsWith(`${opts.alias}@${prefix}`) && opts.specRaw !== `${opts.alias}@workspace:*`) { - const specWithoutName = opts.specRaw.slice(`${opts.alias}@${prefix}`.length) + if (opts.specRaw?.startsWith(`${opts.alias}@${prefix}`)) { + let specWithoutName = opts.specRaw.slice(`${opts.alias}@${prefix}`.length) + if (specWithoutName.startsWith('workspace:')) { + specWithoutName = specWithoutName.slice(10) + if (specWithoutName === '*') { + return '*' + } + } const selector = versionSelectorType(specWithoutName) if (!((selector != null) && (selector.type === 'version' || selector.type === 'range'))) { return opts.specRaw.slice(opts.alias.length + 1) From f23a992ef0b0aa2acf7c03ef4494137ad115c08d Mon Sep 17 00:00:00 2001 From: await-ovo <13152410380@163.com> Date: Thu, 8 Dec 2022 17:10:38 +0800 Subject: [PATCH 2/4] fix: test error --- .../resolve-dependencies/src/updateProjectManifest.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pkg-manager/resolve-dependencies/src/updateProjectManifest.ts b/pkg-manager/resolve-dependencies/src/updateProjectManifest.ts index 7ce51adf021..d8898ce4840 100644 --- a/pkg-manager/resolve-dependencies/src/updateProjectManifest.ts +++ b/pkg-manager/resolve-dependencies/src/updateProjectManifest.ts @@ -117,7 +117,7 @@ function resolvedDirectDepToSpecObject ( nodeExecPath: opts.nodeExecPath, peer: importer['peer'], pref, - saveType: (isNew === true) ? importer['targetDependenciesField'] : undefined, + saveType: importer['targetDependenciesField'], } } @@ -168,9 +168,14 @@ function getPrefPreferSpecifiedExoticSpec ( } } const selector = versionSelectorType(specWithoutName) - if (!((selector != null) && (selector.type === 'version' || selector.type === 'range'))) { + if (!selector) { return opts.specRaw.slice(opts.alias.length + 1) } } + // A prerelease version is always added as an exact version + if (semver.parse(opts.version)?.prerelease.length) { + return `${prefix}${opts.version}` + } + return `${prefix}${createVersionSpec(opts.version, { pinnedVersion: opts.pinnedVersion, rolling: opts.rolling })}` } From d895ece952deda3841420edd2a8681712ddf03cb Mon Sep 17 00:00:00 2001 From: await-ovo <13152410380@163.com> Date: Thu, 8 Dec 2022 18:58:34 +0800 Subject: [PATCH 3/4] fix: do not replace workspace:^ and workspace:~ when update dependencies --- .../core/test/install/multipleImporters.ts | 24 +++++++++++++++++++ .../src/updateProjectManifest.ts | 4 ++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/pkg-manager/core/test/install/multipleImporters.ts b/pkg-manager/core/test/install/multipleImporters.ts index 3ee467d831f..27d0c15e772 100644 --- a/pkg-manager/core/test/install/multipleImporters.ts +++ b/pkg-manager/core/test/install/multipleImporters.ts @@ -946,6 +946,8 @@ test('update workspace range', async () => { dep4: 'workspace:1', dep5: 'workspace:1.0', dep6: 'workspace:*', + dep7: 'workspace:^', + dep8: 'workspace:~', }, }, rootDir: path.resolve('project-1'), @@ -963,6 +965,8 @@ test('update workspace range', async () => { dep4: 'workspace:1', dep5: 'workspace:1.0', dep6: 'workspace:*', + dep7: 'workspace:^', + dep8: 'workspace:~', }, }, rootDir: path.resolve('project-2'), @@ -1024,6 +1028,24 @@ test('update workspace range', async () => { }, }, }, + dep7: { + '2.0.0': { + dir: '', + manifest: { + name: 'dep7', + version: '2.0.0', + }, + }, + }, + dep8: { + '2.0.0': { + dir: '', + manifest: { + name: 'dep8', + version: '2.0.0', + }, + }, + }, }, })) @@ -1034,6 +1056,8 @@ test('update workspace range', async () => { dep4: 'workspace:^2.0.0', dep5: 'workspace:~2.0.0', dep6: 'workspace:*', + dep7: 'workspace:^', + dep8: 'workspace:~', } expect(updatedImporters[0].manifest.dependencies).toStrictEqual(expected) expect(updatedImporters[1].manifest.dependencies).toStrictEqual(expected) diff --git a/pkg-manager/resolve-dependencies/src/updateProjectManifest.ts b/pkg-manager/resolve-dependencies/src/updateProjectManifest.ts index d8898ce4840..6b7db4b5d5b 100644 --- a/pkg-manager/resolve-dependencies/src/updateProjectManifest.ts +++ b/pkg-manager/resolve-dependencies/src/updateProjectManifest.ts @@ -163,8 +163,8 @@ function getPrefPreferSpecifiedExoticSpec ( let specWithoutName = opts.specRaw.slice(`${opts.alias}@${prefix}`.length) if (specWithoutName.startsWith('workspace:')) { specWithoutName = specWithoutName.slice(10) - if (specWithoutName === '*') { - return '*' + if (specWithoutName === '*' || specWithoutName === '^' || specWithoutName === '~') { + return specWithoutName } } const selector = versionSelectorType(specWithoutName) From 9f710536274a714274fd6fa0db7f88188f44d15f Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Fri, 9 Dec 2022 20:00:43 +0200 Subject: [PATCH 4/4] docs: update changesets --- .changeset/old-islands-perform.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .changeset/old-islands-perform.md diff --git a/.changeset/old-islands-perform.md b/.changeset/old-islands-perform.md new file mode 100644 index 00000000000..2dd310f993c --- /dev/null +++ b/.changeset/old-islands-perform.md @@ -0,0 +1,8 @@ +--- +"@pnpm/core": patch +"@pnpm/plugin-commands-installation": patch +"@pnpm/resolve-dependencies": patch +"pnpm": patch +--- + +`pnpm update` should not replace `workspace:*`, `workspace:~`, and `workspace:^` with `workspace:` [#5764](https://github.com/pnpm/pnpm/pull/5764).