mirror of
https://github.com/pnpm/pnpm.git
synced 2026-05-12 01:54:53 -04:00
* fix(global): avoid doubled modulesDir when approving builds in global add The global add → approve-builds flow used to forward an absolute `modulesDir` (`<installDir>/node_modules`) into the install run by `approve-builds`. The install layer treats `modulesDir` as a path relative to `lockfileDir` and joins it again — producing a doubled path on Windows because `path.join` does not collapse an embedded absolute path. The hoist step then failed with `ENOENT` while trying to symlink under `<installDir>\<installDir>\node_modules\.pnpm\...`. Closes #11403. * test: type test fixtures correctly * fix(install): tolerate absolute modulesDir in headless install context Replace the prior unit test (which only checked the call shape) with an integration test that exercises `install()` with an absolute `modulesDir` through both the regular and frozen-lockfile paths — the failure mode the global add → approve-builds chain originally hit on Windows. `headlessInstall` and `readProjectsContext` now resolve `modulesDir` via `pathAbsolute` instead of `path.join(lockfileDir, modulesDir)`, so an absolute value no longer produces a doubled prefix. The `promptApproveGlobalBuilds` change from the previous commit is retained as the contract-level fix. * test: add e2e test driving the pnpm CLI with --modules-dir=<abs> Replace the programmatic install() regression test with an e2e test in pnpm/test/install/absoluteModulesDir.ts that runs the bundled pnpm binary with `pnpm install --modules-dir=<abs>` (regular and frozen). This is the closest CLI-level reproduction of the doubled-prefix path bug from #11403 — the bug fired specifically in the headless install path that --frozen-lockfile triggers. * test(global): drive add -g + approve-builds chain end-to-end Add an e2e test that runs the bundled pnpm CLI through the full `pnpm add -g <pkg-with-build>` → approve-builds → install chain that produced the doubled-prefix `ENOENT` in #11403. The chain only fires when `process.stdin.isTTY` is true, which CI subprocesses don't satisfy. Add a test-only env var `PNPM_AUTO_APPROVE_BUILDS_FOR_TESTS` that bypasses the TTY guard in `promptApproveGlobalBuilds` and forwards `all: true` so `approve-builds` skips its multiselect and confirm prompts. The post-approval install then runs the same code path a real user hit, and the test asserts the build artifacts ended up in the global install dir. Replaces the narrower `--modules-dir=<abs>` regression test, which only exercised the install layer and not the global-add flow that originally surfaced the bug. * test: enable global add -g + approve-builds e2e test on Windows - Switch to @pnpm.e2e/install-script-example which is cross-platform. - Use pathAbsolute for modulesDir to prevent doubled path bugs on Windows. - Add path-absolute dependency to affected packages.