Commit Graph

23 Commits

Author SHA1 Message Date
Zoltan Kochan
fd511e4676 feat: isolated global packages (#10697)
**TLDR:** Global packages in pnpm v10 are annoying and slow because they all are installed to a single global package. Instead, we will now use a system that is similar to the one used by "pnpm dlx" (aka "pnpx").

Each globally installed package (or group of packages installed together) now gets its own isolated installation directory with its own `package.json`, `node_modules`, and lockfile. This prevents global packages from interfering with each other through peer dependency conflicts or version resolution shifts.

## Changes

- Add `@pnpm/global-packages` shared utilities package for scanning, hashing, and managing isolated global installs
- `pnpm add -g` creates isolated installs in `{pnpmHomeDir}/global/v11/{hash}/`
- `pnpm remove -g` removes the entire installation group containing the package
- `pnpm update -g` re-installs into new isolated directories and swaps symlinks
- `pnpm list -g` scans isolated directories to show installed global packages
- `pnpm outdated -g` checks each isolated installation for outdated dependencies
- `pnpm store prune` cleans up orphaned global installation directories

## Breaking changes

- `pnpm install -g` (no args) is no longer supported — use `pnpm add -g <pkg>`
- `pnpm link <pkg-name>` no longer resolves packages from the global store — only relative or absolute paths are accepted
- `pnpm link --global` is removed — use `pnpm add -g .` to register a local package's bins globally
2026-03-01 15:49:18 +01:00
Zoltan Kochan
71de2b3f2b feat!: remove use-node-version CLI option and pnpm.executionEnv.nodeVersion manifest field (#10373) 2025-12-27 22:41:53 +01:00
Brandon Cheng
099ac93e08 refactor: use Catalogs config type instead of CatalogSnapshots for updatedCatalogs (#9589)
* refactor: use Catalogs config type instead of CatalogSnapshots

* refactor: create catalogMetadata instead of manually patching snapshots
2025-06-01 23:53:04 +02:00
Khải
c8341cca57 feat: pnpm add option to add new entries to catalogs (#9484)
close #9425

---------

Co-authored-by: Zoltan Kochan <z@kochan.io>
2025-05-14 18:32:05 +02:00
Zoltan Kochan
750ae7d1d7 feat(cli): installing new configurational dependencies (#9377) 2025-04-07 13:38:18 +02:00
Zoltan Kochan
80338543fb fix: pnpm link should update overrides in pnpm-workspace.yaml (#9365) 2025-04-03 01:12:31 +02:00
Zoltan Kochan
9591a18d96 feat: configurational dependencies (#8915)
* feat: configuration dependencies

* feat: remove configuration dependencies

* feat: update configuration dependencies

* feat: configuration dependencies fast check on repeat install

* revert: comment

* refactor: install configurational deps

* refactor: install config deps

* refactor: install config deps

* test: config deps

* test: config deps

* docs: add changeset

* test: loading a pnpmfile from config deps

* fix: reading hooks after installing config deps

* test: fix

* test: fix

* test: fix

* test: fix

* test: loading patch from config dep

* fix: do not allow config deps w/o integrity checksum
2025-01-04 11:29:22 +01:00
Zoltan Kochan
d47c4266db perf: faster repeat install (#8838) 2024-12-08 23:42:33 +01:00
Khải
19d5b51558 feat(exec): check dependencies before running scripts (#8645)
* refactor: break a long line into multiple lines

* feat: cache that tracks workspace structures

* feat: handle hash collisions

* docs(changeset): packages-list-cache

* feat(packages-list-cache): store mtime

* fix(packages-list-cache): JSON5 and YAML manifests

* feat(packages-list-cache): add catalogs

* style: sort fields alphabetically

* fix: actually fix it

* lint: fix

* lint: fix

* test(packages-list-cache): test

* feat(exec): check deps before run scripts

Resolves https://github.com/pnpm/pnpm/issues/8585

* style: fix eslint

* feat: use a single lastValidatedTimestamp

* refactor: rearrange

* perf: don't do pointless comparisons

* perf: optimize non-workspace

* perf: optimize sharedWorkspaceLockfile=false

* perf: remove unnecessary fs reads

* refactor: statManifestFile

* perf: skip comparing manifest to lockfile by stats

* feat: add wantedLockfileDir to error message

* refactor: shorten a function name

* refactor: rename a function

* docs: improve wordings

* feat: export `linkedPackagesAreUpToDate`

* feat: make sure lockfile specs satisfy manifest (wip)

* docs: todo

* fix: projectId

* feat: skip install-related scripts

* fix: type errors

* refactor: use tagged union

* refactor: remove unnecessary type expression

* docs: todo

* feat: add linkedPackagesAreUpToDate (wip)

* refactor: rearrange fields

* refactor: remove a temporary variable

* feat: export `getWorkspacePackagesByDirectory`

* feat: make workspacePackages optional

* feat: complete `linkedPackagesAreUpToDate`

* docs: remove unapplicable todo

* docs: explain why check is skipped

* feat: load allProjects and try again

* refactor: remove unused dependencies

* refactor: remove commented-out code

* refactor: replace `else if` with `return`

* feat: use-case without workspace manifest

* perf: skip unnecessary work

* feat: add a guard

* fix: eslint

* refactor: move code to new package

* refactor: sort dependencies

* test: outline

* refactor: extract assertLockfilesEqual for testing

* test: skip failing tests for now

* fix: eslint

* test: assertLockfilesEqual

* refactor: extract statManifestFile for testing

* test: todo

* test: statManifestFile

* test: shouldRunCheck

* refactor: rename a test file

* test: add

* test: todo

* docs: remove a commented-out code

* test: create groups

* test: todo

* test: add

* test: platform agnostic

* test: remove unnecessary scripts

* test: use `assert.strictEqual` instead

* test: export bin locations

* test: nested `pnpm run`

* test: todo

* test: add `cwd` option to `execPnpmSync`

* test: add

* fix: recursive

* test: add

* test: fix package names

* fix: catalogs comparison

* test: add

* refactor: just use ramda filter

* test: add

* test: mutations

* fix: package.json

* fix: jest

* feat(packages-list): debug logs

* feat: add debug messages

* fix: eslint

* test: check debug messages in other case

* docs: add next step

* test: mtime updates without modification

* docs: correct test description

* test: mtime changes

* test: check should be skipped

* docs: remove fulfilled todos

* fix: remove `.only`

* docs: todo

* docs: correct test names

* test: workspace structure changes

* test: packages list cache

* test: add

* refactor: divide a test file into 2

* docs: consistent wordings

* refactor: clearer error messages

* fix: ignore check in recursive nested scripts

* test: no dependencies

* test: print error messages on failures

* test: improve stdout/stderr in error messages

* docs: consistent wordings

* docs: clarify what did what

* test: nested script

* docs: consistent test descriptions

* docs(changeset): correction

* fix: save catalogs to packages list

* test: catalogs

* test: fix

* test: fix windows

* refactor: remove unused option field

* refactor: prefer `!= null`

* feat: use `node_modules` instead

* refactor: rename a package

* refactor: apply suggestion

* refactor: remove workspaceDir

* refactor: move `shouldRunCheck` to `exec`

* feat: rename config key

* refactor: rename a test dir

* refactor: correct grammar

* refactor: make loadPackagesList sync

* test: multiple lockfiles

* feat: prevent deletion of `node_modules`

* feat: skip checking on filtered install

* fix: accidentally dropping catalogs

* refactor: remove unnecessary `Promise.all`

* refactor: use `virtualStoreDir` from config

* refactor: split `opts` into `ctx` and `opts`

* test: fix

* style: fix eslint

* test: fix windows

* feat(exec): add `verifyDepsBeforeRun` to `exec`

* refactor: sync stat

* feat: stop ignoring filtered install

* test: filtered install

* refactor: rearrange imports

* feat: rename "packages list" to "workspace state"

* test: fix

* fix: workspace state on failed install
2024-11-15 01:01:09 +01:00
Zoltan Kochan
477e0c1f74 feat!: the link command should add overrides (#8653) 2024-10-24 16:59:55 +02:00
Khải
5bf6aaa407 refactor: move @pnpm/logger to the monorepo (#8385)
* chore: create @pnpm/logger

* fix: workaround typescript error

* chore: update manifests

* chore(deps): link @pnpm/logger from workspace
2024-08-07 18:02:08 +02:00
Zoltan Kochan
797ef0fc46 refactor: rename lockfile-types to lockfile.types 2024-07-27 14:46:23 +02:00
Khải
0ef168b77d feat: per-package node version (#8277)
close #6720
2024-07-13 14:08:57 +02:00
Zoltan Kochan
576f13878e refactor: deduplicate arrayOfWorkspacePackagesToMap (#8265) 2024-07-01 14:45:13 +02:00
Brandon Cheng
75a98e12b3 refactor: improve type checking when finding workspace packages (#8214)
---------

Co-authored-by: Zoltan Kochan <z@kochan.io>
2024-06-17 17:34:54 +02:00
Brandon Cheng
5de89d81a6 chore: remove top-level composite property from tsconfig.json files (#8130)
* chore: remove no-op composite property

* chore: remove top-level composite property from existing files
2024-05-28 02:37:40 +02:00
Brandon Cheng
a2f5f5c990 test: fix file system race conditions in tests by switching to an IPC server (#7472)
* test: create new @pnpm/test-ipc-server private util package

* test: use @pnpm/test-ipc-server for previously refactored tests

* test: use @pnpm/test-ipc-server for tests using json-append

* test: change how --no-bail is passed to avoid passing it to scripts

This test began failing after the conversion to use
`@pnpm/test-echo-server` since the `--no-bail` script was being passed
to scripts.

Changing how --no-bail is configured to fix this test.

* test: use @pnpm/test-ipc-server in exec/lifecycle fixture tests

* test: use @pnpm/test-ipc-server in pkg-manager/headless fixture tests

* test: use @pnpm/test-ipc-server in exec/prepare-package fixture tests

* test: switch pnpm test from json-append to @pnpm.e2e/hello-world-js-bin

* test: fix and re-enable 'rebuild multiple packages in correct order'

The pnpm-workspace.yaml file didn't contain all packages, causing:

```
2023-12-22T02:24:46.2277155Z FAIL test/recursive.ts
2023-12-22T02:24:46.2277881Z   ● rebuild multiple packages in correct order
2023-12-22T02:24:46.2278348Z
2023-12-22T02:24:46.2278734Z     expect(received).toStrictEqual(expected) // deep equality
2023-12-22T02:24:46.2279302Z
2023-12-22T02:24:46.2279517Z     - Expected  - 1
2023-12-22T02:24:46.2279932Z     + Received  + 0
2023-12-22T02:24:46.2280186Z
2023-12-22T02:24:46.2280791Z       Array [
2023-12-22T02:24:46.2281256Z         "project-1",
2023-12-22T02:24:46.2281733Z     -   "project-2",
2023-12-22T02:24:46.2282135Z       ]
2023-12-22T02:24:46.2282334Z
2023-12-22T02:24:46.2282475Z       216 |   }, [])
2023-12-22T02:24:46.2282870Z       217 |
2023-12-22T02:24:46.2283788Z     > 218 |   expect(server1.getMessages()).toStrictEqual(['project-1', 'project-2'])
2023-12-22T02:24:46.2284725Z           |                                 ^
2023-12-22T02:24:46.2285802Z       219 |   expect(server2.getMessages()).toStrictEqual(['project-1', 'project-3'])
2023-12-22T02:24:46.2286683Z       220 | })
2023-12-22T02:24:46.2287049Z       221 |
2023-12-22T02:24:46.2287269Z
2023-12-22T02:24:46.2287588Z       at Object.<anonymous> (test/recursive.ts:218:33)
```
2024-01-01 16:40:03 +01:00
Zoltan Kochan
955d07394a refactor: rename find-workspace-packages package 2023-06-09 16:27:00 +03:00
Brandon Cheng
6850bb135e feat: add pnpm dedupe --check (#6409) 2023-04-16 20:00:04 +00:00
Zoltan Kochan
b11fa7093c fix: dedupe-peer-dependents when running a command inside a workspace project (#6175)
ref #6171
2023-03-04 19:20:09 +02:00
Zoltan Kochan
583e3954be fix: remove suppressImplicitAnyIndexErrors from typescript settings (#5991) 2023-01-28 18:19:26 +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