Skip to content

fix(config): avoid exporting persistent allow-scripts - #9913

Open
Fnine59 wants to merge 5 commits into
npm:latestfrom
Fnine59:fix/npm-allow-scripts-env-9912
Open

fix(config): avoid exporting persistent allow-scripts#9913
Fnine59 wants to merge 5 commits into
npm:latestfrom
Fnine59:fix/npm-allow-scripts-env-9912

Conversation

@Fnine59

@Fnine59 Fnine59 commented Aug 24, 2026

Copy link
Copy Markdown

What / Why

A user or global .npmrc can define allow-scripts as persistent policy. setEnvs() currently carries that non-default value into lifecycle child processes as npm_config_allow_scripts. If a lifecycle script runs a nested project-scoped npm install, the inner process treats the inherited value as an environment override and rejects it with EALLOWSCRIPTS instead of reloading the policy from its persistent config source.

Mark allow-scripts as non-exportable. This only prevents setEnvs() from synthesizing the lifecycle environment variable; it does not remove an explicitly supplied environment value or change how the outer command reads its config. Pacote's git-preparation environment filtering and #9783 are outside this change.

The regression test models a user-level value in the inherited config chain and verifies that lifecycle scripts do not receive npm_config_allow_scripts.

AI assistance

OpenAI Codex assisted with analysis, implementation, and test design. The patch was verified with the focused regression, the complete @npmcli/config suite, lint, and template checks.

References

Fixes #9912

Comment thread workspaces/config/test/set-envs.js
Comment thread workspaces/config/test/set-envs.js
default: '',
type: [String, Array],
hint: '<package-list>',
envExport: false,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the fix. Marking allow-scripts  as envExport: false is the right shared solution: it prevents Config.load() / setEnvs() from turning file-backed policy into an environment-layer override before either npm run or Pacote Git preparation starts a child process. This addresses #9912 and actually fixes the persistent- .npmrc case in #9783 .

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Fnine59 Setting envExport: false causes Definition.describe() to append the non-export notice. test/lib/docs.js snapshots every generated config description, but the committed docs.js.test.cjs snapshot still lacks that notice for allow-scripts. Regenerate and commit tap-snapshots/test/lib/docs.js.test.cjs

TAP_SNAPSHOT=1 node test/lib/docs.js

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated in c06d865: regenerated and committed the config description snapshot. Verified node test/lib/docs.js passes on Node 24.15.0 (6/6).

@martinrrm martinrrm self-assigned this Aug 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] A user/local .npmrc allow-scripts setting is forwarded to an inner npm install spawned by npm run-script and fails with EALLOWSCRIPTS

2 participants