pnpm 12.4.0 → 12.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +190 -0
- package/dist/node_modules/.pnpm-workspace-state-v1.json +9 -12
- package/dist/node_modules/get-pnpm/lib/platformPackageName.js +21 -6
- package/dist/node_modules/get-pnpm/package.json +1 -1
- package/package.json +15 -15
- package/pn +35 -1
- package/pnpm +13 -3
- package/pnpx +35 -1
- package/pnx +35 -1
- package/dist/node_modules/.package-map.json +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,195 @@
|
|
|
1
1
|
# pnpm
|
|
2
2
|
|
|
3
|
+
## 12.4.2
|
|
4
|
+
|
|
5
|
+
pnpm 12.4.2 includes security fixes for executable shims and GitHub Actions links, more reliable installs, faster peer dependency checks in workspaces, and Python lockfiles that work across compatible targets.
|
|
6
|
+
|
|
7
|
+
### Patch Changes
|
|
8
|
+
|
|
9
|
+
#### Security
|
|
10
|
+
|
|
11
|
+
- Dependency executables can no longer take over another package's POSIX bin shim through its shell helpers. Reinstall dependencies to replace existing shims [#14837](https://github.com/pnpm/pnpm/issues/14837).
|
|
12
|
+
|
|
13
|
+
On Cygwin, MSYS2, and WSL, shims still use `PATH` for Windows path conversion, so dependency executables can still redirect them there.
|
|
14
|
+
|
|
15
|
+
- GitHub Actions homepage links no longer expose server credentials. GitHub server URLs now require HTTPS, with HTTP allowed only for loopback hosts.
|
|
16
|
+
|
|
17
|
+
#### Installing packages
|
|
18
|
+
|
|
19
|
+
- pnpm no longer crashes at startup on FreeBSD and other Unix-like platforms. Platforms other than Windows and macOS use `~/.local/share/pnpm/store` by default [#14859](https://github.com/pnpm/pnpm/issues/14859).
|
|
20
|
+
|
|
21
|
+
- `pnpm install` on Windows no longer fails with `ERR_PNPM_PACKAGE_MANAGER_REMOVE_MODULES_DIR` when clearing `node_modules` containing linked dependencies, such as when changing `nodeLinker` [#14790](https://github.com/pnpm/pnpm/issues/14790).
|
|
22
|
+
|
|
23
|
+
- `pnpm install <pkg>` now accepts `--prod` and `--dev`, including `--prod=false` [#14868](https://github.com/pnpm/pnpm/issues/14868).
|
|
24
|
+
|
|
25
|
+
- `pnpm install` and `pnpm update` now honor `--ignore-workspace` in nested projects excluded from the surrounding workspace. The flag also skips that workspace's settings during the `packageManager` check [#14809](https://github.com/pnpm/pnpm/issues/14809).
|
|
26
|
+
|
|
27
|
+
- `pnpm install` on macOS no longer reuses stale files for `file:` tarball or git-hosted tarball dependencies.
|
|
28
|
+
|
|
29
|
+
- `pnpm install` in a single-project directory now detects `package.json` edits made while the previous install was finishing [#14890](https://github.com/pnpm/pnpm/issues/14890).
|
|
30
|
+
|
|
31
|
+
- `pnpm install --frozen-lockfile` now removes packages no longer reachable from any project in `pnpm-lock.yaml`. This also prevents repeated lifecycle script execution and unnecessary installs before `pnpm run` and `pnpm exec` with `verifyDepsBeforeRun` [#14891](https://github.com/pnpm/pnpm/issues/14891).
|
|
32
|
+
|
|
33
|
+
#### Resolving and updating dependencies
|
|
34
|
+
|
|
35
|
+
- Node.js runtime resolution now reports network failures from unofficial-builds.nodejs.org. These failures previously omitted musl builds from `pnpm-lock.yaml`, making its contents depend on network access [#14813](https://github.com/pnpm/pnpm/issues/14813).
|
|
36
|
+
|
|
37
|
+
- `pnpm install` now rejects invalid `peerDependencies` specifiers with `ERR_PNPM_INVALID_PEER_DEPENDENCY_SPECIFICATION`. A value such as `"foo": "foo@1.0.0"` previously created a broken directory link [#14791](https://github.com/pnpm/pnpm/issues/14791).
|
|
38
|
+
|
|
39
|
+
- `pnpm deploy` now writes plain registry versions in the deployed `package.json`, without peer dependency suffixes. The lockfile retains peer bindings, and npm aliases retain their target package names [#14873](https://github.com/pnpm/pnpm/issues/14873).
|
|
40
|
+
|
|
41
|
+
- `pnpm add <git repository>` now names repositories without a `package.json` as `@owner/repo`, allowing dependencies on equally named repositories from different owners [#14870](https://github.com/pnpm/pnpm/issues/14870).
|
|
42
|
+
|
|
43
|
+
- Peer dependency resolution now deduplicates packages whose child dependency resolves an optional peer in only some workspace projects, such as `next` with `styled-jsx`'s optional `babel-plugin-macros` peer [#14800](https://github.com/pnpm/pnpm/issues/14800).
|
|
44
|
+
|
|
45
|
+
- `pnpm update` now settles the lockfile in one run when an upgrade removes the package providing an optional peer dependency [#14895](https://github.com/pnpm/pnpm/issues/14895).
|
|
46
|
+
|
|
47
|
+
- `pnpm update --no-save` now preserves override-applied specifiers for dependencies it is not updating, preventing subsequent frozen installs from failing with `ERR_PNPM_OUTDATED_LOCKFILE` [#14836](https://github.com/pnpm/pnpm/issues/14836).
|
|
48
|
+
|
|
49
|
+
- `pnpm update --no-save` now succeeds under `minimumReleaseAgeStrict` when every resolved version is old enough [#14835](https://github.com/pnpm/pnpm/issues/14835).
|
|
50
|
+
|
|
51
|
+
#### Performance
|
|
52
|
+
|
|
53
|
+
- Workspace installs and `pnpm peers check` are faster when projects depend on each other, fixing a slowdown introduced in 12.3.0. Unmet peer dependencies of workspace packages are now reported only under projects that link them directly [#14906](https://github.com/pnpm/pnpm/issues/14906).
|
|
54
|
+
|
|
55
|
+
- Hoisted installs use less memory when packages are cached. Frozen-lockfile hoisted installs on macOS are also faster when reusable package directories are cached.
|
|
56
|
+
|
|
57
|
+
#### Python projects
|
|
58
|
+
|
|
59
|
+
- `pnpm install --frozen-lockfile` now reuses `pylock.toml` across compatible Python targets, including after kernel updates. Reuse requires unchanged requirements, index, and `requires-python`, compatible wheels, and a locked dependency graph matching the target's markers [#14843](https://github.com/pnpm/pnpm/issues/14843).
|
|
60
|
+
|
|
61
|
+
The lockfile's `environments` marker now includes only the interpreter version and marker variables used by the dependency graph. Without `--frozen-lockfile`, pnpm warns and resolves again when the locked graph no longer matches the target.
|
|
62
|
+
|
|
63
|
+
- Python resolution no longer fails on malformed `Requires-Python` values, such as the trailing comma in `openpyxl` 3.0.x. pnpm treats these releases as declaring no interpreter range [#14910](https://github.com/pnpm/pnpm/issues/14910).
|
|
64
|
+
|
|
65
|
+
- `pnpm add pypi:...` now rejects unsupported `--save-prefix` values before editing the manifest or resolving dependencies.
|
|
66
|
+
|
|
67
|
+
#### Workspaces and scripts
|
|
68
|
+
|
|
69
|
+
- Scripts listed in `syncInjectedDepsAfterScripts` no longer fail with `ERR_PNPM_INJECTED_DEPS_SYNC_READ_DIR` when the lockfile contains an injected package copy that no project depends on.
|
|
70
|
+
|
|
71
|
+
- `shellEmulator` now expands `${VAR}`, `${VAR:-default}`, and `${VAR:+alternative}` in scripts [#14814](https://github.com/pnpm/pnpm/issues/14814).
|
|
72
|
+
|
|
73
|
+
- Cargo and Python project discovery now honors `!` exclusions in `pnpm-workspace.yaml` `packages`, skipping both parsing and generated source configuration for excluded projects [#14844](https://github.com/pnpm/pnpm/issues/14844).
|
|
74
|
+
|
|
75
|
+
- `pnpm --filter "./packages/{app,lib}"` now selects either alternative. Brace alternatives can nest, span path separators, and combine with other wildcards.
|
|
76
|
+
|
|
77
|
+
- GitHub Actions updates now stop if an action reference changes during version resolution, and preserve unrelated workflow edits.
|
|
78
|
+
|
|
79
|
+
#### CLI and output
|
|
80
|
+
|
|
81
|
+
- `pn`, `pnpx`, and `pnx` now run the pnpm installed alongside them, even when that directory is absent from `PATH` or another pnpm comes first [#14803](https://github.com/pnpm/pnpm/issues/14803).
|
|
82
|
+
|
|
83
|
+
- `pnpm --version` now reports failures to install or record a project's pinned pnpm, then prints the running CLI's version. It also honors `--store-dir` and `--store` [#14831](https://github.com/pnpm/pnpm/issues/14831).
|
|
84
|
+
|
|
85
|
+
- `pnpm self-update` no longer reinstalls the active version when it was installed by the standalone installation script [#14823](https://github.com/pnpm/pnpm/issues/14823).
|
|
86
|
+
|
|
87
|
+
- `pnpm t` and `pnpm tst` work again as aliases for `pnpm test`.
|
|
88
|
+
|
|
89
|
+
- `pnpm sbom` now emits valid repository URLs in CycloneDX `externalReferences[].url` and SPDX `homepage`. Shorthands such as `vercel/ms` become `git+https` URLs, embedded credentials are removed, and invalid repository values are omitted [#14773](https://github.com/pnpm/pnpm/issues/14773).
|
|
90
|
+
|
|
91
|
+
## 12.4.1
|
|
92
|
+
|
|
93
|
+
pnpm 12.4.1 fixes installs that failed on filesystems refusing hard links or clones, on Android, and under `nodeLinker: hoisted`. Repeat installs are faster.
|
|
94
|
+
|
|
95
|
+
### Patch Changes
|
|
96
|
+
|
|
97
|
+
#### Installing packages
|
|
98
|
+
|
|
99
|
+
- `pnpm install` no longer fails with `Operation not permitted` when the filesystem refuses a hard link or a copy-on-write clone [#14722](https://github.com/pnpm/pnpm/issues/14722). Under `packageImportMethod: auto` and `clone-or-copy`, pnpm copies the file instead. EdenFS checkouts, which have no hard links, and rootless containers, which refuse the clone syscall, both hit this. An explicit `packageImportMethod: hardlink` or `clone` still reports the error.
|
|
100
|
+
|
|
101
|
+
pnpm also copies a package file whose store entry has reached the filesystem's limit on names for one file, 1024 on NTFS and 65000 on ext4. Such a file failed the install under `packageImportMethod: hardlink`, and under `auto` it stopped pnpm hard linking for the rest of the install.
|
|
102
|
+
|
|
103
|
+
- `pnpm install` no longer writes a package file through a symlink left at the path it is importing to. Copying such a file overwrote whatever the link pointed at, and created that file when the link pointed nowhere. An executable package file also made the link's target executable.
|
|
104
|
+
|
|
105
|
+
- Fixed `pnpm install` and `pnpm dlx` on Android. Registry requests crashed because pnpm found no system CA certificates, so pnpm uses bundled ones there [#14777](https://github.com/pnpm/pnpm/issues/14777). Imports also failed with "Permission denied" on filesystems that deny hard links and reflinks, and now fall back to copying [#14780](https://github.com/pnpm/pnpm/issues/14780).
|
|
106
|
+
|
|
107
|
+
- `pnpm install` no longer fails with "Invalid cross-device link" while preserving a package's nested `node_modules` directory during a Docker build [#14758](https://github.com/pnpm/pnpm/issues/14758).
|
|
108
|
+
|
|
109
|
+
- `pnpm install` no longer fails on a package tarball that carries a file at the archive root, such as the `._*` entries macOS `tar` adds [#14701](https://github.com/pnpm/pnpm/issues/14701). The file is installed at the root of the package.
|
|
110
|
+
|
|
111
|
+
A `file:` tarball packed without the usual `package/` directory is now recorded under the name and version from its own `package.json`. It was recorded under the alias the dependency was given, at version 0.0.0.
|
|
112
|
+
|
|
113
|
+
- Under `nodeLinker: hoisted`, `pnpm install` no longer re-imports packages that are already in place. A repeat install replaced the whole `node_modules` tree and reported `Packages: +N`. A package is still imported when its directory is missing, when its `package.json` no longer carries the installed version, when it is a `file:` dependency, and when it is patched. Lifecycle scripts no longer run again for a package left in place, and `pnpm rebuild` and a change to `allowBuilds` still reach it.
|
|
114
|
+
|
|
115
|
+
- `pnpm install` now runs a dependency's build scripts again when its side-effects cache entry has no files to restore [#14717](https://github.com/pnpm/pnpm/issues/14717). Such builds were skipped and nothing was put in their place, so a script whose whole effect lands outside its own package directory, such as a git hook installer, never took effect. pnpm no longer publishes empty artifacts to the shared side-effects cache either.
|
|
116
|
+
|
|
117
|
+
#### Resolving and linking dependencies
|
|
118
|
+
|
|
119
|
+
- `pnpm install`, `pnpm add`, and `pnpm dedupe` now apply `ignoredOptionalDependencies` [#14729](https://github.com/pnpm/pnpm/issues/14729). Matching optional dependencies are left out of the lockfile and are not installed. pnpm 12 installed them whenever it resolved dependencies from scratch.
|
|
120
|
+
|
|
121
|
+
- `pnpm install` no longer links a transitive dependency to a workspace package when `linkWorkspacePackages` is `true` and the dependency is declared with a plain version range [#14781](https://github.com/pnpm/pnpm/issues/14781). Enabling `preferWorkspacePackages` does not change this. Set `linkWorkspacePackages: deep` to link them.
|
|
122
|
+
|
|
123
|
+
- `pnpm install` no longer leaves dangling dependency links in workspace packages located above the workspace root [#14726](https://github.com/pnpm/pnpm/issues/14726).
|
|
124
|
+
|
|
125
|
+
- `pnpm install` and `pnpm add` no longer leave a dangling symlink in `node_modules` when a project starts depending directly on a package that the lockfile holds only as a transitive dependency with resolved peer dependencies [#14714](https://github.com/pnpm/pnpm/issues/14714).
|
|
126
|
+
|
|
127
|
+
- `pnpm dedupe` now keeps a compatible auto-installed peer when another workspace project depends on a newer major [#14697](https://github.com/pnpm/pnpm/issues/14697). Repeated runs alternated between compatible and incompatible peer versions.
|
|
128
|
+
|
|
129
|
+
- `pnpm peers check` no longer reports a peer dependency declared as `workspace:^`, `workspace:~`, or a bare `workspace:` as unmet [#14770](https://github.com/pnpm/pnpm/issues/14770). pnpm reported these as unmet whatever version the linked workspace project supplied.
|
|
130
|
+
|
|
131
|
+
#### Performance
|
|
132
|
+
|
|
133
|
+
- Sped up repeat installs [#14540](https://github.com/pnpm/pnpm/issues/14540). pnpm checks the store's files only for the packages it links into `node_modules`, instead of every package in the lockfile. Creating the command shims in `node_modules/.bin` makes about 1,500 fewer filesystem calls in a 76 project workspace. Installs that use the global virtual store read their slot paths from the cache directory instead of deriving them every time. Verifying a large lockfile also allocates less memory.
|
|
134
|
+
|
|
135
|
+
- Sped up `pnpm install` in Cargo workspaces with many member crates. Repeated installs reuse verified Cargo checksum metadata.
|
|
136
|
+
|
|
137
|
+
- Installing several packages from the same Git repository and commit now downloads the source once per install [#14725](https://github.com/pnpm/pnpm/issues/14725). Each package still runs its prepare scripts in its own copy of the checkout.
|
|
138
|
+
|
|
139
|
+
#### Running scripts and tasks
|
|
140
|
+
|
|
141
|
+
- pnpm now passes Ctrl+C on to the script or command it started and waits for it to shut down [#14723](https://github.com/pnpm/pnpm/issues/14723). pnpm exited first, so a script that was still writing landed on the shell prompt.
|
|
142
|
+
|
|
143
|
+
- `pnpm run "/pattern/" --no-bail` now lets every matched script finish after one of them fails [#14718](https://github.com/pnpm/pnpm/issues/14718). The command exits with `ERR_PNPM_RUN_FAILED`, and its message lists the scripts that failed in the order they were selected.
|
|
144
|
+
|
|
145
|
+
- `pnpm pipeline` no longer fails on a project that tracks a symlink, such as a `CLAUDE.md` pointing at `AGENTS.md` [#14692](https://github.com/pnpm/pnpm/issues/14692). Changing a symlinked input's target invalidates that task's cache, and `pnpm pipeline --no-cache` no longer hashes task inputs.
|
|
146
|
+
|
|
147
|
+
#### Commands
|
|
148
|
+
|
|
149
|
+
- `pnpm add -g`, `pnpm update -g`, and `pnpm remove -g` no longer change global bins or install directories after reading only part of an installed package group [#13796](https://github.com/pnpm/pnpm/issues/13796). If any declared package manifest is missing, malformed, or unreadable, pnpm now fails before it activates or removes anything and leaves the existing global installation intact.
|
|
150
|
+
|
|
151
|
+
- `pnpm dedupe` now processes every workspace project by default, including workspaces that keep a separate lockfile per project [#14732](https://github.com/pnpm/pnpm/issues/14732). Workspace filters select which projects it processes, and `--fail-if-no-match` exits with an error when no project matches.
|
|
152
|
+
|
|
153
|
+
- `pnpm update <name>@<version>` now keeps the range operator the manifest declares [#14745](https://github.com/pnpm/pnpm/issues/14745). Running `pnpm update react@19.3.0` on `"react": "^19.2.8"` writes `"react": "^19.3.0"`. A `jsr:` entry keeps its `jsr:` prefix, and a plain `pnpm update` now moves a `jsr:` range the way it moves an npm range.
|
|
154
|
+
|
|
155
|
+
- `pnpm --filter` directory selectors now support `?` wildcards and character classes such as `[ab]`. A `*` or `?` wildcard no longer selects a directory whose name starts with a dot, as on pnpm 11.
|
|
156
|
+
|
|
157
|
+
- `pnpm deploy --legacy` now prefers the dependency versions pinned in the source workspace lockfile when they still satisfy the deployed project's range [#13857](https://github.com/pnpm/pnpm/issues/13857).
|
|
158
|
+
|
|
159
|
+
- `pnpm sbom` now leaves out a package's author field when the manifest author name is empty or contains only whitespace [#14685](https://github.com/pnpm/pnpm/issues/14685). In a filtered or split workspace run, only a project with no `author` field inherits the workspace root's author.
|
|
160
|
+
|
|
161
|
+
`pnpm sbom --sbom-format spdx` now writes `creationInfo.created` with whole seconds, such as `2026-09-08T10:38:21Z` [#14684](https://github.com/pnpm/pnpm/issues/14684). The fractional seconds it carried were rejected by strict SPDX consumers.
|
|
162
|
+
|
|
163
|
+
#### Configuration
|
|
164
|
+
|
|
165
|
+
- The `updateConfig` pnpmfile hook now receives the resolved configuration, including settings that came from `.npmrc`, the command line, or a default [#14676](https://github.com/pnpm/pnpm/issues/14676). Scoped registries are reported under `registriesByScope`, and a hook may rewrite that map to change where packages are fetched from. Registry credentials are reported under `configByUri`, as pnpm 11 reports them. An unset setting is left out rather than reported as `null`.
|
|
166
|
+
|
|
167
|
+
- `pnpm audit --fix` and the `minimumReleaseAgeStrict` approval prompt now keep the comments in `minimumReleaseAgeExclude` when they append an entry to it in `pnpm-workspace.yaml`. The rest of the list is left as written, and the `trustPolicyExcludePrune` and `minimumReleaseAgeExcludePrune` cleanups keep the comments of the entries they retain.
|
|
168
|
+
|
|
169
|
+
`pnpm install` and `pnpm dedupe` now run those cleanups too [#14759](https://github.com/pnpm/pnpm/issues/14759). Only `pnpm add`, `pnpm update`, and `pnpm remove` pruned the entries that the freshly written lockfile no longer resolves.
|
|
170
|
+
|
|
171
|
+
- `pnpm config set --global node-download-mirrors` no longer rejects the key [#13611](https://github.com/pnpm/pnpm/issues/13611). The global config file already accepted `nodeDownloadMirrors`, but the command refused to write it.
|
|
172
|
+
|
|
173
|
+
- `NO_PROXY` entries that start with a dot, such as `.npmjs.org`, now bypass the proxy for the domain and its subdomains [#14686](https://github.com/pnpm/pnpm/issues/14686).
|
|
174
|
+
|
|
175
|
+
- pnpm no longer creates a project `pnpm-lock.yaml` when `devEngines.packageManager.onFail` is `download` and lockfile writing is off through `lockfile: false` or `--no-lockfile` [#14728](https://github.com/pnpm/pnpm/issues/14728). pnpm still switches to the pinned version.
|
|
176
|
+
|
|
177
|
+
- pnpm now writes `node_modules/.package-map.json` only when `nodeExperimentalPackageMap` is enabled. Nothing reads the file without that setting, and an install that stops writing the map removes the one a previous install left.
|
|
178
|
+
|
|
179
|
+
#### Windows
|
|
180
|
+
|
|
181
|
+
- `pnpm pipeline` no longer fails with intermittent access denied errors when concurrent tasks save their cache entries on Windows.
|
|
182
|
+
|
|
183
|
+
- Windows filesystem operations now retry permission errors for up to one second [#14682](https://github.com/pnpm/pnpm/issues/14682). A permanent permission error delayed the failure by a minute. Sharing and lock violations keep their one minute retry budget.
|
|
184
|
+
|
|
185
|
+
#### Messages and output
|
|
186
|
+
|
|
187
|
+
- pnpm now warns when the root `package.json` declares a non-empty `workspaces` array and the project has no `pnpm-workspace.yaml` [#2255](https://github.com/pnpm/pnpm/issues/2255). Such an install linked no project and said nothing about why.
|
|
188
|
+
|
|
189
|
+
- `ERR_PNPM_PACKAGE_MANAGER_REMOVE_MODULES_DIR` now names the file or directory in `node_modules` that pnpm could not clean up. It reported only the underlying OS error, such as "Access is denied (os error 5)".
|
|
190
|
+
|
|
191
|
+
- `pnpm --help` no longer describes pnpm as experimental.
|
|
192
|
+
|
|
3
193
|
## 12.4.0
|
|
4
194
|
|
|
5
195
|
### Minor Changes
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
|
-
"lastValidatedTimestamp":
|
|
2
|
+
"lastValidatedTimestamp": 1789466800429,
|
|
3
3
|
"projects": {
|
|
4
4
|
"/home/runner/_work/pnpm/pnpm/pnpm/npm/pnpm/temp-deploy": {
|
|
5
5
|
"name": "pacquet",
|
|
6
|
-
"version": "12.4.
|
|
6
|
+
"version": "12.4.2"
|
|
7
7
|
}
|
|
8
8
|
},
|
|
9
9
|
"pnpmfiles": [],
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"@commitlint/prompt-cli": "^21.2.2",
|
|
29
29
|
"@cyclonedx/cyclonedx-library": "10.2.0",
|
|
30
30
|
"@eslint/js": "^10.0.1",
|
|
31
|
-
"@inquirer/prompts": "^8.7.
|
|
31
|
+
"@inquirer/prompts": "^8.7.2",
|
|
32
32
|
"@jest/globals": "30.4.1",
|
|
33
33
|
"@npm/types": "^2.1.0",
|
|
34
34
|
"@openpgp/web-stream-tools": "0.3.1",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"@pnpm/tabtab": "^0.5.4",
|
|
49
49
|
"@pnpm/tgz-fixtures": "0.0.0",
|
|
50
50
|
"@reflink/reflink": "0.1.19",
|
|
51
|
-
"@rushstack/worker-pool": "0.7.
|
|
51
|
+
"@rushstack/worker-pool": "0.7.26",
|
|
52
52
|
"@stylistic/eslint-plugin": "^5.10.0",
|
|
53
53
|
"@types/adm-zip": "^0.5.8",
|
|
54
54
|
"@types/archy": "0.0.36",
|
|
@@ -87,14 +87,13 @@
|
|
|
87
87
|
"@types/write-file-atomic": "^4.0.3",
|
|
88
88
|
"@types/yarnpkg__lockfile": "^1.1.9",
|
|
89
89
|
"@types/zkochan__table": "npm:@types/table@6.3.2",
|
|
90
|
-
"@typescript-eslint/utils": "^8.
|
|
90
|
+
"@typescript-eslint/utils": "^8.70.0",
|
|
91
91
|
"@typescript/native-preview": "7.0.0-dev.20260707.2",
|
|
92
92
|
"@yarnpkg/core": "4.9.1",
|
|
93
93
|
"@yarnpkg/extensions": "2.0.7",
|
|
94
94
|
"@yarnpkg/lockfile": "^1.1.0",
|
|
95
95
|
"@yarnpkg/nm": "4.1.1",
|
|
96
96
|
"@yarnpkg/pnp": "^4.1.7",
|
|
97
|
-
"@zkochan/cmd-shim": "^9.0.7",
|
|
98
97
|
"@zkochan/retry": "^0.2.0",
|
|
99
98
|
"@zkochan/rimraf": "^4.0.0",
|
|
100
99
|
"@zkochan/table": "^2.0.1",
|
|
@@ -142,7 +141,7 @@
|
|
|
142
141
|
"fast-glob": "^3.3.3",
|
|
143
142
|
"fs-extra": "^11.4.0",
|
|
144
143
|
"fuse-native": "^2.2.6",
|
|
145
|
-
"get-pnpm": "^0.0.
|
|
144
|
+
"get-pnpm": "^0.0.4",
|
|
146
145
|
"get-port": "^7.2.0",
|
|
147
146
|
"ghooks": "2.0.4",
|
|
148
147
|
"graceful-fs": "^4.2.11",
|
|
@@ -172,6 +171,7 @@
|
|
|
172
171
|
"lru-cache": "^11.5.2",
|
|
173
172
|
"make-empty-dir": "^4.0.0",
|
|
174
173
|
"mdast-util-to-string": "^4.0.0",
|
|
174
|
+
"memfs": "^3.5.3",
|
|
175
175
|
"memoize": "^11.0.0",
|
|
176
176
|
"micromatch": "^4.0.8",
|
|
177
177
|
"msgpackr": "2.1.0",
|
|
@@ -246,7 +246,7 @@
|
|
|
246
246
|
"tree-kill": "^1.2.2",
|
|
247
247
|
"ts-jest-resolver": "2.0.1",
|
|
248
248
|
"typescript": "6.0.3",
|
|
249
|
-
"typescript-eslint": "^8.
|
|
249
|
+
"typescript-eslint": "^8.70.0",
|
|
250
250
|
"undici": "^7.29.0",
|
|
251
251
|
"unified": "^11.0.5",
|
|
252
252
|
"validate-npm-package-name": "7.0.2",
|
|
@@ -311,8 +311,7 @@
|
|
|
311
311
|
"write-ini-file",
|
|
312
312
|
"write-json5-file",
|
|
313
313
|
"write-yaml-file",
|
|
314
|
-
"http-proxy-middleware@3.0.7"
|
|
315
|
-
"get-pnpm@0.0.3"
|
|
314
|
+
"http-proxy-middleware@3.0.7"
|
|
316
315
|
],
|
|
317
316
|
"minimumReleaseAgeIgnoreMissingTime": true,
|
|
318
317
|
"minimumReleaseAgeStrict": true,
|
|
@@ -330,10 +329,8 @@
|
|
|
330
329
|
"trustPolicyExclude": [
|
|
331
330
|
"@pnpm/*",
|
|
332
331
|
"@yarnpkg/libzip@3.2.2",
|
|
333
|
-
"fastq@1.20.2",
|
|
334
332
|
"pnpm",
|
|
335
333
|
"rxjs@7.8.2",
|
|
336
|
-
"tinyexec@1.2.2",
|
|
337
334
|
"undici-types@6.21.0"
|
|
338
335
|
],
|
|
339
336
|
"trustPolicyIgnoreAfter": 10080
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
const V12_ONLY_TARGETS = new Set([
|
|
2
|
+
'android-arm64',
|
|
3
|
+
'android-x64',
|
|
4
|
+
'freebsd-x64',
|
|
5
|
+
'linux-ppc64',
|
|
6
|
+
'linux-riscv64',
|
|
7
|
+
'linux-s390x',
|
|
8
|
+
]);
|
|
1
9
|
/**
|
|
2
10
|
* Name of the npm package that carries the pnpm executable for `target`.
|
|
3
11
|
*
|
|
@@ -6,15 +14,22 @@
|
|
|
6
14
|
* publishes `@pnpm/exe.<process.platform>-<arch>[-musl]`, while v11 and older
|
|
7
15
|
* publish `@pnpm/<macos|win|linux|linuxstatic>-<arch>`.
|
|
8
16
|
*
|
|
9
|
-
* @throws if pnpm publishes no binary for the host —
|
|
10
|
-
*
|
|
17
|
+
* @throws if pnpm publishes no binary for the host — because the host is not
|
|
18
|
+
* built for at all, because the binary arrived in v12 and an older major was
|
|
19
|
+
* asked for, or because of the v11-only Intel macOS gap.
|
|
11
20
|
*/
|
|
12
21
|
export function platformPackageName({ major, platform, arch, musl }) {
|
|
13
|
-
|
|
14
|
-
|
|
22
|
+
const target = `${platform}-${arch}`;
|
|
23
|
+
if (V12_ONLY_TARGETS.has(target)) {
|
|
24
|
+
if (major >= 12)
|
|
25
|
+
return `@pnpm/exe.${target}`;
|
|
26
|
+
throw new Error(`pnpm v${major} does not provide a pre-built binary for ${target}. pnpm 12 does:
|
|
27
|
+
|
|
28
|
+
npx get-pnpm 12`);
|
|
15
29
|
}
|
|
16
|
-
if (
|
|
17
|
-
|
|
30
|
+
if ((arch !== 'x64' && arch !== 'arm64') ||
|
|
31
|
+
(platform !== 'darwin' && platform !== 'linux' && platform !== 'win32')) {
|
|
32
|
+
throw new Error(`Sorry! pnpm does not provide a pre-built binary for ${target}.`);
|
|
18
33
|
}
|
|
19
34
|
if (platform === 'darwin' && arch === 'x64' && major === 11) {
|
|
20
35
|
throw new Error(`pnpm v11 does not provide a working binary for Intel macOS (darwin-x64) due to an upstream Node.js SEA bug.
|
package/package.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"./dist/node_modules/node-gyp/gyp/gyp"
|
|
10
10
|
]
|
|
11
11
|
},
|
|
12
|
-
"version": "12.4.
|
|
12
|
+
"version": "12.4.2",
|
|
13
13
|
"description": "Fast, disk space efficient package manager",
|
|
14
14
|
"keywords": [
|
|
15
15
|
"pnpm",
|
|
@@ -46,20 +46,20 @@
|
|
|
46
46
|
"THIRD-PARTY-NOTICES.md"
|
|
47
47
|
],
|
|
48
48
|
"optionalDependencies": {
|
|
49
|
-
"@pnpm/exe.win32-x64": "12.4.
|
|
50
|
-
"@pnpm/exe.win32-arm64": "12.4.
|
|
51
|
-
"@pnpm/exe.darwin-x64": "12.4.
|
|
52
|
-
"@pnpm/exe.darwin-arm64": "12.4.
|
|
53
|
-
"@pnpm/exe.linux-x64": "12.4.
|
|
54
|
-
"@pnpm/exe.linux-arm64": "12.4.
|
|
55
|
-
"@pnpm/exe.linux-riscv64": "12.4.
|
|
56
|
-
"@pnpm/exe.linux-ppc64": "12.4.
|
|
57
|
-
"@pnpm/exe.linux-s390x": "12.4.
|
|
58
|
-
"@pnpm/exe.linux-x64-musl": "12.4.
|
|
59
|
-
"@pnpm/exe.linux-arm64-musl": "12.4.
|
|
60
|
-
"@pnpm/exe.freebsd-x64": "12.4.
|
|
61
|
-
"@pnpm/exe.android-arm64": "12.4.
|
|
62
|
-
"@pnpm/exe.android-x64": "12.4.
|
|
49
|
+
"@pnpm/exe.win32-x64": "12.4.2",
|
|
50
|
+
"@pnpm/exe.win32-arm64": "12.4.2",
|
|
51
|
+
"@pnpm/exe.darwin-x64": "12.4.2",
|
|
52
|
+
"@pnpm/exe.darwin-arm64": "12.4.2",
|
|
53
|
+
"@pnpm/exe.linux-x64": "12.4.2",
|
|
54
|
+
"@pnpm/exe.linux-arm64": "12.4.2",
|
|
55
|
+
"@pnpm/exe.linux-riscv64": "12.4.2",
|
|
56
|
+
"@pnpm/exe.linux-ppc64": "12.4.2",
|
|
57
|
+
"@pnpm/exe.linux-s390x": "12.4.2",
|
|
58
|
+
"@pnpm/exe.linux-x64-musl": "12.4.2",
|
|
59
|
+
"@pnpm/exe.linux-arm64-musl": "12.4.2",
|
|
60
|
+
"@pnpm/exe.freebsd-x64": "12.4.2",
|
|
61
|
+
"@pnpm/exe.android-arm64": "12.4.2",
|
|
62
|
+
"@pnpm/exe.android-x64": "12.4.2"
|
|
63
63
|
},
|
|
64
64
|
"scripts": {
|
|
65
65
|
"preinstall": "node install.js",
|
package/pn
CHANGED
|
@@ -1,2 +1,36 @@
|
|
|
1
1
|
#!/bin/sh
|
|
2
|
-
|
|
2
|
+
# `pn` is `pnpm`. The pnpm it hands over to is the one installed alongside it,
|
|
3
|
+
# found relative to this file: a `PATH` lookup would run whatever other pnpm
|
|
4
|
+
# comes first there, and would find nothing at all when the directory holding
|
|
5
|
+
# these bins is not on `PATH`.
|
|
6
|
+
#
|
|
7
|
+
# $0 is whatever shim or symlink `pn` was launched through, so walk to the file
|
|
8
|
+
# itself first. The hop cap matches the kernel's ELOOP limit, so a cycle cannot
|
|
9
|
+
# hang the script. Directories come from `${self%/*}` and `readlink` runs through
|
|
10
|
+
# `command -p`, so the caller's `PATH` decides nothing here.
|
|
11
|
+
self=$0
|
|
12
|
+
# `${self%/*}` needs a slash to strip. A bare name came from a `PATH` lookup and
|
|
13
|
+
# stands for a file in the current directory.
|
|
14
|
+
case $self in
|
|
15
|
+
*/*) ;;
|
|
16
|
+
*) self=./$self ;;
|
|
17
|
+
esac
|
|
18
|
+
hops=0
|
|
19
|
+
while [ -L "$self" ] && [ "$hops" -lt 40 ]; do
|
|
20
|
+
hops=$((hops + 1))
|
|
21
|
+
link=$(command -p readlink "$self")
|
|
22
|
+
case $link in
|
|
23
|
+
/*) self=$link ;;
|
|
24
|
+
*) self=${self%/*}/$link ;;
|
|
25
|
+
esac
|
|
26
|
+
done
|
|
27
|
+
# The walk has to end at a regular file. Running out of hops leaves $self a
|
|
28
|
+
# symlink; a chain that changed under us can leave it dangling or a directory, and
|
|
29
|
+
# a failed readlink leaves a trailing slash. Each case would take `pnpm` from the
|
|
30
|
+
# wrong directory — the substitution this script exists to prevent.
|
|
31
|
+
if [ -L "$self" ] || [ ! -f "$self" ]; then
|
|
32
|
+
echo "pn: could not resolve $0 to a regular file within 40 symlink hops." >&2
|
|
33
|
+
exit 1
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
exec "${self%/*}/pnpm" "$@"
|
package/pnpm
CHANGED
|
@@ -24,15 +24,25 @@ fi
|
|
|
24
24
|
# $0 is whatever shim or symlink pnpm was launched through; ./bin/pnpm.mjs is
|
|
25
25
|
# found relative to this file. The hop cap matches the kernel's ELOOP limit, so
|
|
26
26
|
# a cycle cannot hang the script.
|
|
27
|
+
#
|
|
28
|
+
# `readlink` runs through `command -p`, which searches the system default path,
|
|
29
|
+
# and directories come from `${self%/*}`, which runs nothing at all. The caller's
|
|
30
|
+
# PATH therefore decides only which `node` runs, which is what it is for.
|
|
27
31
|
self=$0
|
|
32
|
+
# `${self%/*}` needs a slash to strip. A bare name came from a PATH lookup and
|
|
33
|
+
# stands for a file in the current directory.
|
|
34
|
+
case $self in
|
|
35
|
+
*/*) ;;
|
|
36
|
+
*) self=./$self ;;
|
|
37
|
+
esac
|
|
28
38
|
hops=0
|
|
29
39
|
while [ -L "$self" ] && [ "$hops" -lt 40 ]; do
|
|
30
40
|
hops=$((hops + 1))
|
|
31
|
-
link=$(readlink "$self")
|
|
41
|
+
link=$(command -p readlink "$self")
|
|
32
42
|
case $link in
|
|
33
43
|
/*) self=$link ;;
|
|
34
|
-
*) self=$
|
|
44
|
+
*) self=${self%/*}/$link ;;
|
|
35
45
|
esac
|
|
36
46
|
done
|
|
37
47
|
|
|
38
|
-
exec node "$
|
|
48
|
+
exec node "${self%/*}/bin/pnpm.mjs" "$@"
|
package/pnpx
CHANGED
|
@@ -1,2 +1,36 @@
|
|
|
1
1
|
#!/bin/sh
|
|
2
|
-
|
|
2
|
+
# `pnpx` is `pnpm dlx`. The pnpm it hands over to is the one installed alongside
|
|
3
|
+
# it, found relative to this file: a `PATH` lookup would run whatever other pnpm
|
|
4
|
+
# comes first there, and would find nothing at all when the directory holding
|
|
5
|
+
# these bins is not on `PATH`.
|
|
6
|
+
#
|
|
7
|
+
# $0 is whatever shim or symlink `pnpx` was launched through, so walk to the file
|
|
8
|
+
# itself first. The hop cap matches the kernel's ELOOP limit, so a cycle cannot
|
|
9
|
+
# hang the script. Directories come from `${self%/*}` and `readlink` runs through
|
|
10
|
+
# `command -p`, so the caller's `PATH` decides nothing here.
|
|
11
|
+
self=$0
|
|
12
|
+
# `${self%/*}` needs a slash to strip. A bare name came from a `PATH` lookup and
|
|
13
|
+
# stands for a file in the current directory.
|
|
14
|
+
case $self in
|
|
15
|
+
*/*) ;;
|
|
16
|
+
*) self=./$self ;;
|
|
17
|
+
esac
|
|
18
|
+
hops=0
|
|
19
|
+
while [ -L "$self" ] && [ "$hops" -lt 40 ]; do
|
|
20
|
+
hops=$((hops + 1))
|
|
21
|
+
link=$(command -p readlink "$self")
|
|
22
|
+
case $link in
|
|
23
|
+
/*) self=$link ;;
|
|
24
|
+
*) self=${self%/*}/$link ;;
|
|
25
|
+
esac
|
|
26
|
+
done
|
|
27
|
+
# The walk has to end at a regular file. Running out of hops leaves $self a
|
|
28
|
+
# symlink; a chain that changed under us can leave it dangling or a directory, and
|
|
29
|
+
# a failed readlink leaves a trailing slash. Each case would take `pnpm` from the
|
|
30
|
+
# wrong directory — the substitution this script exists to prevent.
|
|
31
|
+
if [ -L "$self" ] || [ ! -f "$self" ]; then
|
|
32
|
+
echo "pnpx: could not resolve $0 to a regular file within 40 symlink hops." >&2
|
|
33
|
+
exit 1
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
exec "${self%/*}/pnpm" dlx "$@"
|
package/pnx
CHANGED
|
@@ -1,2 +1,36 @@
|
|
|
1
1
|
#!/bin/sh
|
|
2
|
-
|
|
2
|
+
# `pnx` is `pnpm dlx`. The pnpm it hands over to is the one installed alongside
|
|
3
|
+
# it, found relative to this file: a `PATH` lookup would run whatever other pnpm
|
|
4
|
+
# comes first there, and would find nothing at all when the directory holding
|
|
5
|
+
# these bins is not on `PATH`.
|
|
6
|
+
#
|
|
7
|
+
# $0 is whatever shim or symlink `pnx` was launched through, so walk to the file
|
|
8
|
+
# itself first. The hop cap matches the kernel's ELOOP limit, so a cycle cannot
|
|
9
|
+
# hang the script. Directories come from `${self%/*}` and `readlink` runs through
|
|
10
|
+
# `command -p`, so the caller's `PATH` decides nothing here.
|
|
11
|
+
self=$0
|
|
12
|
+
# `${self%/*}` needs a slash to strip. A bare name came from a `PATH` lookup and
|
|
13
|
+
# stands for a file in the current directory.
|
|
14
|
+
case $self in
|
|
15
|
+
*/*) ;;
|
|
16
|
+
*) self=./$self ;;
|
|
17
|
+
esac
|
|
18
|
+
hops=0
|
|
19
|
+
while [ -L "$self" ] && [ "$hops" -lt 40 ]; do
|
|
20
|
+
hops=$((hops + 1))
|
|
21
|
+
link=$(command -p readlink "$self")
|
|
22
|
+
case $link in
|
|
23
|
+
/*) self=$link ;;
|
|
24
|
+
*) self=${self%/*}/$link ;;
|
|
25
|
+
esac
|
|
26
|
+
done
|
|
27
|
+
# The walk has to end at a regular file. Running out of hops leaves $self a
|
|
28
|
+
# symlink; a chain that changed under us can leave it dangling or a directory, and
|
|
29
|
+
# a failed readlink leaves a trailing slash. Each case would take `pnpm` from the
|
|
30
|
+
# wrong directory — the substitution this script exists to prevent.
|
|
31
|
+
if [ -L "$self" ] || [ ! -f "$self" ]; then
|
|
32
|
+
echo "pnx: could not resolve $0 to a regular file within 40 symlink hops." >&2
|
|
33
|
+
exit 1
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
exec "${self%/*}/pnpm" dlx "$@"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"packages":{".":{"url":"..","dependencies":{"get-pnpm":"get-pnpm","node-gyp":"node-gyp","pacquet":"."}},"@isaacs/fs-minipass":{"url":"./@isaacs/fs-minipass","dependencies":{"@isaacs/fs-minipass":"@isaacs/fs-minipass","minipass":"minipass"}},"abbrev":{"url":"./abbrev","dependencies":{"abbrev":"abbrev"}},"chownr":{"url":"./chownr","dependencies":{"chownr":"chownr"}},"env-paths":{"url":"./env-paths","dependencies":{"env-paths":"env-paths"}},"exponential-backoff":{"url":"./exponential-backoff","dependencies":{"exponential-backoff":"exponential-backoff"}},"fdir":{"url":"./fdir","dependencies":{"fdir":"fdir","picomatch":"picomatch"}},"get-pnpm":{"url":"./get-pnpm","dependencies":{"get-pnpm":"get-pnpm"}},"graceful-fs":{"url":"./graceful-fs","dependencies":{"graceful-fs":"graceful-fs"}},"isexe":{"url":"./isexe","dependencies":{"isexe":"isexe"}},"minipass":{"url":"./minipass","dependencies":{"minipass":"minipass"}},"minizlib":{"url":"./minizlib","dependencies":{"minipass":"minipass","minizlib":"minizlib"}},"node-gyp":{"url":"./node-gyp","dependencies":{"env-paths":"env-paths","exponential-backoff":"exponential-backoff","graceful-fs":"graceful-fs","node-gyp":"node-gyp","nopt":"nopt","proc-log":"proc-log","semver":"semver","tar":"tar","tinyglobby":"tinyglobby","undici":"undici","which":"which"}},"nopt":{"url":"./nopt","dependencies":{"abbrev":"abbrev","nopt":"nopt"}},"picomatch":{"url":"./picomatch","dependencies":{"picomatch":"picomatch"}},"proc-log":{"url":"./proc-log","dependencies":{"proc-log":"proc-log"}},"semver":{"url":"./semver","dependencies":{"semver":"semver"}},"tar":{"url":"./tar","dependencies":{"@isaacs/fs-minipass":"@isaacs/fs-minipass","chownr":"chownr","minipass":"minipass","minizlib":"minizlib","tar":"tar","yallist":"yallist"}},"tinyglobby":{"url":"./tinyglobby","dependencies":{"fdir":"fdir","picomatch":"picomatch","tinyglobby":"tinyglobby"}},"undici":{"url":"./undici","dependencies":{"undici":"undici"}},"which":{"url":"./which","dependencies":{"isexe":"isexe","which":"which"}},"yallist":{"url":"./yallist","dependencies":{"yallist":"yallist"}}}}
|