diff --git a/.changeset/loud-teachers-kiss.md b/.changeset/loud-teachers-kiss.md new file mode 100644 index 0000000000..ee76a13a7d --- /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 6009802f5e..03355585d1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6482,6 +6482,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 12391cd72a..f8c7f4a662 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/npm-resolver": "workspace:*", "@pnpm/resolve-workspace-range": "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 881bdc4460..d09f8220d7 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 30c99a5236..12ac8ccde7 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 fa2982e57b..d060d45a88 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" },