Commit Graph

37 Commits

Author SHA1 Message Date
Zoltan Kochan
54c4fc4fb4 fix: respect peer dep range in hoistPeers when preferred versions exist (#10655)
* fix: respect peer dep range in hoistPeers when preferred versions exist

Previously, hoistPeers used semver.maxSatisfying(versions, '*') which
picked the highest preferred version from the lockfile regardless of the
peer dep range. This caused overrides that narrow a peer dep range to be
ignored when a stale version existed in the lockfile.

Now hoistPeers first tries semver.maxSatisfying(versions, range) to find
a preferred version that satisfies the actual peer dep range. If none
satisfies it and autoInstallPeers is enabled, it falls back to the range
itself so pnpm resolves a matching version from the registry.

* fix: only fall back to exact-version range for overrides, handle workspace: protocol

- When no preferred version satisfies the peer dep range, only use the
  range directly if it is an exact version (e.g. "4.3.0" from an override).
  For semver ranges (e.g. "1", "^2.0.0"), fall back to the old behavior
  of picking the highest preferred version for deduplication.
- Guard against workspace: protocol ranges that would cause
  semver.maxSatisfying to throw.
- Add unit tests for hoisting deduplication and workspace: ranges.

* fix: only apply range-constrained peer selection for exact versions

The previous approach used semver.maxSatisfying(versions, range) for all
peer dep ranges, which broke aliased-dependency deduplication — e.g. when
three aliases of @pnpm.e2e/peer-c existed at 1.0.0, 1.0.1, and 2.0.0,
range ^1.0.0 would pick 1.0.1 instead of 2.0.0.

Now the range-aware logic only activates when the range is an exact
version (semver.valid), which is the override case (e.g. "4.3.0").
Regular semver ranges fall back to picking the highest preferred version.
2026-02-22 22:04:35 +01:00
Brandon Cheng
d404c55ac8 fix: handle npm aliases without a bare specifier in unwrapPackageName (#10374)
* refactor: factor out a `getRealNameAndSpec` function

* fix: handle npm aliases without a bare specifier in `unwrapPackageName`

* Fix formatting in unwrapPackageName.ts
2025-12-29 02:00:21 +01:00
Zoltan Kochan
dab9abef5c Merge remote-tracking branch 'origin/main' into v11 2025-10-24 14:19:07 +02:00
Ryo Matsukawa
9c65b96f2c fix: preserve version and hasBin for variations packages (#10065)
close #10022
2025-10-13 10:00:56 +02:00
Zoltan Kochan
491a84fb26 feat: use ESM instead of commonjs (#9870) 2025-08-25 10:02:00 +02:00
Zoltan Kochan
facd7656e8 refactor: always use extensions in relative imports (#9878) 2025-08-19 15:25:11 +02:00
Zoltan Kochan
aa24e7fe7f fix: when automatically installing peer deps, prefer the version found in the root of the workspace (#9835) 2025-08-07 14:07:13 +02:00
Zoltan Kochan
8a9f3a4835 refactor: rename pref to bare specifier (#9445) 2025-04-20 22:58:08 +02:00
Khải
ea58bfdc47 fix(validatePeerDependencies): allow combinations (#8946) 2025-01-08 11:31:37 +01:00
Khải
26fe99440d feat!: prevent nonsense peerDependencies (#8942)
* feat!: prevent nonsense `peerDependencies`

close #8934

* fix: eslint

* feat: refuse aliases

* feat: only validate packages from the workspace

* refactor: change call signature and error messages

* docs(hint): improve wordings

* docs: add quotes to make it more readable

* test: remove `use-`
2025-01-07 14:55:22 +01:00
Zoltan Kochan
2393a49ec6 fix: out-of-memory on peers resolution (#8457) 2024-08-24 20:58:41 +02:00
Khải
9b4f73caaf chore(scripts): typecheck-only (#8395)
* chore(scripts): typecheck-only

* feat: change all configuration

* feat: include pnpm/ and pnpm/test/

* chore(deps): remove unused dependency

* refactor(typescript-only): use find-packages

* refactor(typescript-only): refactor paths

* fix: typescript-only

* fix: update compile-only

* fix: compile pnpm

* fix: windows

* fix: windows

* chore: meta-updater

* refactor(tsconfig): remove explicit composite

* fix: path in windows

* feat: don't depend on cwd

---------

Co-authored-by: Zoltan Kochan <z@kochan.io>
2024-08-11 08:26:01 +02:00
Zoltan Kochan
0406d4ad3d refactor: use a branded type for project root dir paths (#8272) 2024-07-04 13:13:34 +02:00
Zoltan Kochan
47341e5004 fix: make the peers suffix shorter (#8177)
ref #7079
2024-06-07 23:37:07 +02:00
Brandon Cheng
c7e1b6fae8 chore: configure TypeScript project references for tests (#8128)
* refactor: store link values before converting to references

* fix: use .sort() without localeCompare

https://github.com/pnpm/pnpm/pull/8128#discussion_r1614031566

> Nit, but you probably just want to call sort without a comparison
> function; these are already strings and locale compare is not a good
> comparison for anything but human readable strings since it will
> differ on different people's machines based on their language setting.
> I've hit this too many times before for code gen.

* feat: configure meta-updater to write test/tsconfig.json files

* fix: relative imports for __typings__

* chore: `pnpm run meta-updater`

* fix: explicitly use test/tsconfig.json for ts-jest
2024-05-31 12:48:13 +02:00
Zoltan Kochan
81d90c9dd2 fix: reduce memory usage by using numbers for Node IDs (#8135) 2024-05-27 00:54:34 +02:00
Zoltan Kochan
f0b51bb444 refactor: use branded types for IDs (#8105) 2024-05-20 22:30:09 +02:00
Zoltan Kochan
c649954e41 refactor: create a separate type for DepPath (#8094) 2024-05-20 16:11:46 +02:00
Zoltan Kochan
45f4262f03 refactor: create a separate type for NodeId (#8092) 2024-05-17 11:23:52 +02:00
Zoltan Kochan
ef73c19f15 perf: reduce memory usage (#8084)
ref #8072
2024-05-16 20:55:08 +02:00
Zoltan Kochan
5a03c1f284 perf: improve performance of peer dependencies resolution (#8060) 2024-05-12 01:29:19 +02:00
Zoltan Kochan
1a6f7fb7e5 fix: only automatically resolve optional peers with versions that satisfy the ranges (#8028)
close #7985
2024-04-29 14:19:40 +02:00
Zoltan Kochan
9719a42d0e feat: configurable max length of directories inside node_modules/.pnpm (#7994)
close #7355
2024-04-28 11:07:29 +02:00
Zoltan Kochan
abaf12e8cf fix: resolving peer deps with prerelease versions (#7981)
close #7977
2024-04-21 14:31:58 +02:00
Zoltan Kochan
8a0798d514 fix: resolution of aliased dependencies (#7982)
close #7957
2024-04-21 13:16:20 +02:00
Zoltan Kochan
98a126699c fix: resolve peer of peer from the deps of direct dependent package (#7606)
close #7444

Peer dependencies of peer dependencies are now resolved correctly. When peer dependencies have peer dependencies of their own, the peer dependencies are grouped with their own peer dependencies before being linked to their dependents.

For instance, if `card` has `react` in peer dependencies and `react` has `typescript` in its peer dependencies, then the same version of `react` may be linked from different places if there are multiple versions of `typescript`. For instance:

```
project1/package.json
{
  "dependencies": {
    "card": "1.0.0",
    "react": "16.8.0",
    "typescript": "7.0.0"
  }
}
project2/package.json
{
  "dependencies": {
    "card": "1.0.0",
    "react": "16.8.0",
    "typescript": "8.0.0"
  }
}
node_modules
  .pnpm
    card@1.0.0(react@16.8.0(typescript@7.0.0))
      node_modules
        card
        react --> ../../react@16.8.0(typescript@7.0.0)/node_modules/react
    react@16.8.0(typescript@7.0.0)
      node_modules
        react
        typescript --> ../../typescript@7.0.0/node_modules/typescript
    typescript@7.0.0
      node_modules
        typescript
    card@1.0.0(react@16.8.0(typescript@8.0.0))
      node_modules
        card
        react --> ../../react@16.8.0(typescript@8.0.0)/node_modules/react
    react@16.8.0(typescript@8.0.0)
      node_modules
        react
        typescript --> ../../typescript@8.0.0/node_modules/typescript
    typescript@8.0.0
      node_modules
        typescript
```

In the above example, both projects have `card` in dependencies but the projects use different versions of `typescript`. Hence, even though the same version of `card` is used, `card` in `project1` will reference `react` from a directory where it is placed with `typescript@7.0.0` (because it resolves `typescript` from the dependencies of `project1`), while `card` in `project2` will reference `react` with `typescript@8.0.0`.
2024-02-09 00:50:08 +01:00
Zoltan Kochan
f5eadba943 revert: resolve peer having peer correctly
ref #7583
2024-02-03 21:57:55 +01:00
Zoltan Kochan
977060fc67 fix: resolve peer having peer correctly (#7583)
close #7444
2024-01-31 00:28:16 +01:00
Zoltan Kochan
672c559e49 feat: dedupe injected dependencies (#7416)
A new setting added for symlinking [injected dependencies](https://pnpm.io/package_json#dependenciesmetainjected) from the workspace, if their dependencies use the same peer dependencies as the dependent package. The setting is called `dedupe-injected-deps`
2023-12-14 16:13:22 +01:00
Bogdan Savluk
fee263822c refactor(resolve-dependencies): use Maps and Sets instead of objects (#6749) 2023-07-03 01:19:23 +03:00
Zoltan Kochan
0119ac05b7 test(resolve-dependencies): fix 2023-06-23 02:22:41 +03:00
Magnus Klingenberg
e83eacdcc8 fix(resolvePeers): fix deduplication when version missmatch (#6606)
When dedupe-peer-dependents is enabled (default), use the path to
determine compatibility.

When multiple dependency groups can be deduplicated, the
latter ones are sorted according to number of peers to allow them to
benefit from deduplication.

close #6605

---------

Co-authored-by: Zoltan Kochan <z@kochan.io>
2023-06-03 01:32:27 +03:00
Zoltan Kochan
1d105e7fcd fix!: save the whole tarball URL, when it doesn't use the standard format (#6265) 2023-03-24 01:36:13 +02:00
Rex Zeng
cfb6bb3bfe feat: support resolving peers with npm aliases (#6220)
close #4301
Co-authored-by: Zoltan Kochan <z@kochan.io>
2023-03-22 04:39:11 +02:00
Zoltan Kochan
158d8cf22f feat!: only allow lockfile v6 (#6240) 2023-03-19 04:23:51 +02:00
Zoltan Kochan
9cbe293876 refactor: put all non-public projects to directories that start with __ 2022-11-20 02:40:44 +02:00
Zoltan Kochan
4ca53b0b50 refactor: group projects in different subdirectories (#5659) 2022-11-20 01:35:22 +02:00