From 61565f8a04aaeade612eeaed33729b339bafeab1 Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Sun, 24 Mar 2024 11:35:22 +0100 Subject: [PATCH] fix: ordering workspace projects that are in peer dependencies (#7821) close #7813 --- .changeset/loud-teachers-kiss.md | 6 ++++ pnpm-lock.yaml | 3 ++ workspace/pkgs-graph/package.json | 1 + workspace/pkgs-graph/src/index.ts | 18 ++--------- workspace/pkgs-graph/test/index.ts | 52 ++++++++++++++++++++++++++++++ workspace/pkgs-graph/tsconfig.json | 3 ++ 6 files changed, 68 insertions(+), 15 deletions(-) create mode 100644 .changeset/loud-teachers-kiss.md diff --git a/.changeset/loud-teachers-kiss.md b/.changeset/loud-teachers-kiss.md new file mode 100644 index 00000000000..ee76a13a7d8 --- /dev/null +++ b/.changeset/loud-teachers-kiss.md @@ -0,0 +1,6 @@ +--- +"@pnpm/workspace.pkgs-graph": patch +"pnpm": patch +--- + +When sorting packages in a workspace, take into account workspace dependencies specified as `peerDependencies` [#7813](https://github.com/pnpm/pnpm/issues/7813). diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c4740a04e12..c14fa517eb2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6382,6 +6382,9 @@ importers: '@pnpm/resolve-workspace-range': specifier: workspace:* version: link:../resolve-workspace-range + '@pnpm/types': + specifier: workspace:* + version: link:../../packages/types ramda: specifier: npm:@pnpm/ramda@0.28.1 version: '@pnpm/ramda@0.28.1' diff --git a/workspace/pkgs-graph/package.json b/workspace/pkgs-graph/package.json index ebb92dd1949..d93537958f7 100644 --- a/workspace/pkgs-graph/package.json +++ b/workspace/pkgs-graph/package.json @@ -33,6 +33,7 @@ "@pnpm/npm-package-arg": "^1.0.0", "@pnpm/resolve-workspace-range": "workspace:*", "@pnpm/npm-resolver": "workspace:*", + "@pnpm/types": "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 dd937fc3b80..fe2490f3b43 100644 --- a/workspace/pkgs-graph/src/index.ts +++ b/workspace/pkgs-graph/src/index.ts @@ -2,24 +2,11 @@ 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 { type BaseManifest } from '@pnpm/types' import mapValues from 'ramda/src/map' -export interface Manifest { - name?: string - version?: string - dependencies?: { - [name: string]: string - } - devDependencies?: { - [name: string]: string - } - optionalDependencies?: { - [name: string]: string - } -} - export interface Package { - manifest: Manifest + manifest: BaseManifest dir: string } @@ -48,6 +35,7 @@ export function createPkgGraph (pkgs: Array, opts?: { function createNode (pkg: Package): string[] { const dependencies = { + ...pkg.manifest.peerDependencies, ...(!opts?.ignoreDevDeps && pkg.manifest.devDependencies), ...pkg.manifest.optionalDependencies, ...pkg.manifest.dependencies, diff --git a/workspace/pkgs-graph/test/index.ts b/workspace/pkgs-graph/test/index.ts index 30c99a52362..12ac8ccde77 100644 --- a/workspace/pkgs-graph/test/index.ts +++ b/workspace/pkgs-graph/test/index.ts @@ -112,6 +112,58 @@ test('create package graph', () => { }) }) +test('create package graph using peer dependencies', () => { + const result = createPkgGraph([ + { + dir: BAR1_PATH, + manifest: { + name: 'bar', + version: '1.0.0', + + peerDependencies: { + foo: '^1.0.0', + 'is-positive': '1.0.0', + }, + }, + }, + { + dir: FOO1_PATH, + manifest: { + name: 'foo', + version: '1.0.0', + }, + }, + ]) + expect(result.unmatched).toStrictEqual([]) + expect(result.graph).toStrictEqual({ + [BAR1_PATH]: { + dependencies: [FOO1_PATH], + package: { + dir: BAR1_PATH, + manifest: { + name: 'bar', + version: '1.0.0', + + peerDependencies: { + foo: '^1.0.0', + 'is-positive': '1.0.0', + }, + }, + }, + }, + [FOO1_PATH]: { + dependencies: [], + package: { + dir: FOO1_PATH, + manifest: { + name: 'foo', + version: '1.0.0', + }, + }, + }, + }) +}) + test('create package graph for local directory dependencies', () => { const result = createPkgGraph([ { diff --git a/workspace/pkgs-graph/tsconfig.json b/workspace/pkgs-graph/tsconfig.json index fa2982e57ba..d060d45a882 100644 --- a/workspace/pkgs-graph/tsconfig.json +++ b/workspace/pkgs-graph/tsconfig.json @@ -9,6 +9,9 @@ "../../__typings__/**/*.d.ts" ], "references": [ + { + "path": "../../packages/types" + }, { "path": "../../resolving/npm-resolver" },