From f3bfa2aae65406935b58b05a1f34b047ff4cb301 Mon Sep 17 00:00:00 2001 From: await-ovo <13152410380@163.com> Date: Sat, 3 Dec 2022 06:50:53 +0800 Subject: [PATCH] feat: try adding local pre-release package in workspaces (#5733) close #5316 --- .changeset/tricky-bulldogs-eat.md | 6 +++++ resolving/npm-resolver/src/index.ts | 4 ++- resolving/npm-resolver/test/index.ts | 37 ++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 .changeset/tricky-bulldogs-eat.md diff --git a/.changeset/tricky-bulldogs-eat.md b/.changeset/tricky-bulldogs-eat.md new file mode 100644 index 00000000000..18230b29451 --- /dev/null +++ b/.changeset/tricky-bulldogs-eat.md @@ -0,0 +1,6 @@ +--- +"@pnpm/npm-resolver": patch +"pnpm": patch +--- + +`pnpm add` should prefer local projects from the workspace, even if they use prerelease versions. diff --git a/resolving/npm-resolver/src/index.ts b/resolving/npm-resolver/src/index.ts index 163bc48e8c5..e7d7274f13a 100644 --- a/resolving/npm-resolver/src/index.ts +++ b/resolving/npm-resolver/src/index.ts @@ -291,7 +291,9 @@ function pickMatchingLocalVersionOrNull ( const localVersions = Object.keys(versions) switch (spec.type) { case 'tag': - return semver.maxSatisfying(localVersions, '*') + return semver.maxSatisfying(localVersions, '*', { + includePrerelease: true, + }) case 'version': return versions[spec.fetchSpec] ? spec.fetchSpec : null case 'range': diff --git a/resolving/npm-resolver/test/index.ts b/resolving/npm-resolver/test/index.ts index baa483e9c03..b6a71cf801b 100644 --- a/resolving/npm-resolver/test/index.ts +++ b/resolving/npm-resolver/test/index.ts @@ -1317,6 +1317,43 @@ test('resolve from local directory when package is not found in the registry and expect(resolveResult!.manifest!.version).toBe('2.0.0') }) +test('resolve from local directory when package is not found in the registry and local prerelease available', async () => { + nock(registry) + .get('/is-positive') + .reply(404, {}) + + const cacheDir = tempy.directory() + const resolve = createResolveFromNpm({ + cacheDir, + }) + const resolveResult = await resolve({ alias: 'is-positive', pref: 'latest' }, { + projectDir: '/home/istvan/src', + registry, + workspacePackages: { + 'is-positive': { + '3.0.0-alpha.1.2.3': { + dir: '/home/istvan/src/is-positive', + manifest: { + name: 'is-positive', + version: '3.0.0-alpha.1.2.3', + }, + }, + }, + }, + }) + + expect(resolveResult!.resolvedVia).toBe('local-filesystem') + expect(resolveResult!.id).toBe('link:is-positive') + expect(resolveResult!.latest).toBeFalsy() + expect(resolveResult!.resolution).toStrictEqual({ + directory: '/home/istvan/src/is-positive', + type: 'directory', + }) + expect(resolveResult!.manifest).toBeTruthy() + expect(resolveResult!.manifest!.name).toBe('is-positive') + expect(resolveResult!.manifest!.version).toBe('3.0.0-alpha.1.2.3') +}) + test('resolve from local directory when package is not found in the registry and specific version is requested', async () => { nock(registry) .get('/is-positive')