mirror of
https://github.com/pnpm/pnpm.git
synced 2026-03-27 11:31:45 -04:00
* feat: switch from pkg to Node.js SEA for creating standalone executables Replace @yao-pkg/pkg with Node.js native Single Executable Applications (--build-sea, Node.js 25.5+). The SEA binary embeds only pnpm.cjs (CJS bootstrap), while pnpm.mjs and all assets live in a dist/ directory shipped alongside the binary in platform-specific tarballs. * refactor: move dist/ from platform packages to @pnpm/exe The dist/ directory (pnpm.mjs, worker.js, templates, etc.) is identical across all platforms, so ship it once in @pnpm/exe instead of duplicating it in each platform package. Platform packages now only contain the binary. The self-updater installs @pnpm/exe (not the platform package) so it gets both dist/ and the binary via optionalDependencies. * refactor: externalize @reflink/reflink in esbuild bundle Make @reflink/reflink external in both the main and worker esbuild bundles so the require() calls resolve at runtime from dist/node_modules instead of being inlined. Add @reflink/reflink as a production dependency of both pnpm (bundled into dist/node_modules by bundle-deps.ts) and @pnpm/exe (installed by npm alongside the binary). For GitHub release tarballs, only the target platform's reflink package is kept. For @pnpm/exe npm publishing, all reflink platform packages are stripped from dist/ since npm installs the right one automatically. * chore: update cspell list * test: update system-node-version tests for SEA detection Mock @pnpm/cli-meta's detectIfCurrentPkgIsExecutable instead of setting process.pkg, which is no longer used for SEA detection. * test: improve cli-meta test coverage for SEA migration Add tests for detectIfCurrentPkgIsExecutable() (non-SEA path) and isExecutedByCorepack() which were previously untested. The SEA=true path of detectIfCurrentPkgIsExecutable() cannot be unit tested since node:sea is unavailable in an ESM test environment. * refactor: move GitHub tarball assembly to copy-artifacts.ts build-artifacts.ts (prepublishOnly of @pnpm/exe) now only builds the SEA executables and prepares the exe npm dist/. The per-target dist/ assembly for GitHub release tarballs moves to copy-artifacts.ts, which is the natural owner of that concern. Other changes: - Extract getReflinkKeepPackages/stripReflinkPackages to reflink-utils.ts with tests using node:test - Move --force from top-level pnpm install in release.yml to the pnpm deploy in bundle-deps.ts, where it is actually needed to install all @reflink/reflink-* platform packages into dist/node_modules - Change @pnpm/exe prepublishOnly to run pnpm's full prepublishOnly (compile + bundle-deps) so dist/node_modules is populated before build-artifacts.ts and copy-artifacts.ts read from pnpm/dist * fix: copy dist/ alongside binary when running pnpm setup for SEA When the pnpm CLI is a Node.js SEA binary, it requires a dist/ directory adjacent to the executable at runtime (containing pnpm.mjs and bundled node_modules). The copyCli function in plugin-commands-setup now copies dist/ from alongside the current binary into the tools directory so that the installed pnpm works correctly after `pnpm setup`. * fix: avoid argument list too long when creating Windows zip archives * fix: propagate errors in copy-artifacts script Previously errors in createArtifactTarball were swallowed, causing the script to exit 0 even when artifact creation failed. Now errors are re-thrown with a descriptive message, and the top-level IIFE has a .catch() handler that sets a non-zero exit code. * refactor: remove reflink-utils.ts from @pnpm/exe The stripReflinkPackages call in build-artifacts.ts stripped all platform packages while keeping @reflink/reflink. Instead, just remove the entire @reflink directory from dist/ — @pnpm/exe already declares @reflink/reflink as a runtime dependency, so npm installs it (along with the right platform package via optionalDependencies) automatically. This eliminates reflink-utils.ts, its tests, and the code duplication with copy-artifacts.ts.
40 lines
1.3 KiB
TypeScript
40 lines
1.3 KiB
TypeScript
const defaultManifest = {
|
|
name: process.env.npm_package_name != null && process.env.npm_package_name !== ''
|
|
? process.env.npm_package_name
|
|
: 'pnpm',
|
|
version: process.env.npm_package_version != null && process.env.npm_package_version !== ''
|
|
? process.env.npm_package_version
|
|
: '0.0.0',
|
|
}
|
|
const pkgJson = defaultManifest
|
|
|
|
export const packageManager = {
|
|
name: pkgJson.name,
|
|
// Never a prerelease version
|
|
stableVersion: pkgJson.version.includes('-')
|
|
? pkgJson.version.slice(0, pkgJson.version.indexOf('-'))
|
|
: pkgJson.version,
|
|
// This may be a 3.0.0-beta.2
|
|
version: pkgJson.version,
|
|
}
|
|
|
|
export function detectIfCurrentPkgIsExecutable (_proc?: unknown): boolean {
|
|
try {
|
|
// require() is available here because esbuild injects a createRequire shim
|
|
// via the banner in pnpm/bundle.ts. node:sea is not available as an ESM
|
|
// import, so require() is the correct approach.
|
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
return require('node:sea').isSea()
|
|
} catch {
|
|
return false
|
|
}
|
|
}
|
|
|
|
export function isExecutedByCorepack (env: NodeJS.ProcessEnv = process.env): boolean {
|
|
return env.COREPACK_ROOT != null
|
|
}
|
|
|
|
export function getCurrentPackageName (): string {
|
|
return detectIfCurrentPkgIsExecutable() ? '@pnpm/exe' : 'pnpm'
|
|
}
|