diff --git a/.changeset/kind-rivers-happen.md b/.changeset/kind-rivers-happen.md new file mode 100644 index 0000000000..54548e5e1a --- /dev/null +++ b/.changeset/kind-rivers-happen.md @@ -0,0 +1,7 @@ +--- +"@pnpm/npm-resolver": patch +"@pnpm/workspace.pkgs-graph": patch +"pnpm": patch +--- + +Respect workspace alias syntax in pkg graph [#6922](https://github.com/pnpm/pnpm/issues/6922) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 86a2d10db4..d89d1668dd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6116,6 +6116,9 @@ importers: '@pnpm/npm-package-arg': specifier: ^1.0.0 version: 1.0.0 + '@pnpm/npm-resolver': + specifier: workspace:* + version: link:../../resolving/npm-resolver '@pnpm/resolve-workspace-range': specifier: workspace:* version: link:../resolve-workspace-range @@ -8387,7 +8390,7 @@ packages: /@types/byline@4.2.33: resolution: {integrity: sha512-LJYez7wrWcJQQDknqZtrZuExMGP0IXmPl1rOOGDqLbu+H7UNNRfKNuSxCBcQMLH1EfjeWidLedC/hCc5dDfBog==} dependencies: - '@types/node': 20.4.8 + '@types/node': 16.18.39 dev: true /@types/cacheable-request@6.0.3: diff --git a/resolving/npm-resolver/src/index.ts b/resolving/npm-resolver/src/index.ts index d4c1b3076a..e4e7510621 100644 --- a/resolving/npm-resolver/src/index.ts +++ b/resolving/npm-resolver/src/index.ts @@ -47,6 +47,7 @@ export class NoMatchingVersionError extends PnpmError { export { parsePref, + workspacePrefToNpm, type PackageMeta, type PackageMetaCache, type RegistryPackageSpec, diff --git a/workspace/pkgs-graph/package.json b/workspace/pkgs-graph/package.json index f4bcc94526..0ddd8ca16e 100644 --- a/workspace/pkgs-graph/package.json +++ b/workspace/pkgs-graph/package.json @@ -32,6 +32,7 @@ "dependencies": { "@pnpm/npm-package-arg": "^1.0.0", "@pnpm/resolve-workspace-range": "workspace:*", + "@pnpm/npm-resolver": "workspace:*", "ramda": "npm:@pnpm/ramda@0.28.1" }, "funding": "https://opencollective.com/pnpm", diff --git a/workspace/pkgs-graph/src/index.ts b/workspace/pkgs-graph/src/index.ts index 8bbfa9974b..dd937fc3b8 100644 --- a/workspace/pkgs-graph/src/index.ts +++ b/workspace/pkgs-graph/src/index.ts @@ -1,6 +1,7 @@ import path from 'path' import npa from '@pnpm/npm-package-arg' import { resolveWorkspaceRange } from '@pnpm/resolve-workspace-range' +import { parsePref, workspacePrefToNpm } from '@pnpm/npm-resolver' import mapValues from 'ramda/src/map' export interface Manifest { @@ -58,10 +59,9 @@ export function createPkgGraph (pkgs: Array, opts?: { const isWorkspaceSpec = rawSpec.startsWith('workspace:') try { if (isWorkspaceSpec) { - rawSpec = rawSpec.slice(10) - if (rawSpec === '^' || rawSpec === '~') { - rawSpec = '*' - } + const { fetchSpec, name } = parsePref(workspacePrefToNpm(rawSpec), depName, 'latest', '')! + rawSpec = fetchSpec + depName = name } spec = npa.resolve(depName, rawSpec, pkg.dir) } catch (err: any) { // eslint-disable-line diff --git a/workspace/pkgs-graph/test/index.ts b/workspace/pkgs-graph/test/index.ts index 3910666c15..30c99a5236 100644 --- a/workspace/pkgs-graph/test/index.ts +++ b/workspace/pkgs-graph/test/index.ts @@ -717,3 +717,49 @@ test('successfully create a package graph even when a workspace package has no v }, }) }) + +test('create package graph respects workspace alias syntax', async () => { + const result = createPkgGraph([ + { + dir: BAR1_PATH, + manifest: { + dependencies: { + 'foo-alias': 'workspace:foo@*', + }, + name: 'bar', + version: '1.0.0', + }, + }, + { + dir: FOO1_PATH, + manifest: { + name: 'foo', + }, + }, + ]) + expect(result.unmatched).toStrictEqual([]) + expect(result.graph).toStrictEqual({ + [BAR1_PATH]: { + dependencies: [FOO1_PATH], + package: { + dir: BAR1_PATH, + manifest: { + dependencies: { + 'foo-alias': 'workspace:foo@*', + }, + name: 'bar', + version: '1.0.0', + }, + }, + }, + [FOO1_PATH]: { + dependencies: [], + package: { + dir: FOO1_PATH, + manifest: { + name: 'foo', + }, + }, + }, + }) +}) diff --git a/workspace/pkgs-graph/tsconfig.json b/workspace/pkgs-graph/tsconfig.json index cb9338b222..fa2982e57b 100644 --- a/workspace/pkgs-graph/tsconfig.json +++ b/workspace/pkgs-graph/tsconfig.json @@ -9,6 +9,9 @@ "../../__typings__/**/*.d.ts" ], "references": [ + { + "path": "../../resolving/npm-resolver" + }, { "path": "../resolve-workspace-range" }