[BUG] "npm approve-scripts --allow-scripts-pending" shows approved depdencies · Issue #9558 · npm/cli · GitHub
Skip to content

[BUG] "npm approve-scripts --allow-scripts-pending" shows approved depdencies #9558

Closed

Description

@calle2010

Is there an existing issue for this?

  • I have searched the existing issues

This issue exists in the latest npm version

  • I am using the latest npm

This is not just a request to bump a dependency for a CVE

  • This is not solely a request to bump a dependency for a CVE

Current Behavior

I run npm 11.17.0

I have added this to package.json:

    "allowScripts": {
        "esbuild@0.21.5": true,
        "@sap/hana-client@2.23.27": true,
        "esbuild@0.25.0": true,
        "protobufjs@8.4.2": true,
        "mbt@1.2.27": true,
        "protobufjs@7.6.1": true,
        "sqlite3@5.1.7": true,
        "xsd-schema-validator@0.11.0": true
    }

The output of "--allow-scripts-pending" is:

$ npm approve-scripts --allow-scripts-pending
5 packages have install scripts not yet covered by allowScripts:
  @sap/hana-client@2.23.27 (install: node checkbuild.js)
  esbuild@0.25.0 (postinstall: node install.js)
  mbt@1.2.27 (install: node install cloud-mta-build-tool)
  sqlite3@5.1.7 (install: node-gyp rebuild)
  xsd-schema-validator@0.11.0 (postinstall: node ./lib/post-install.js)

Run `npm approve-scripts <pkg>` to allow, or `npm deny-scripts <pkg>` to deny.

The same output appears for "npm install" or "npm ci".

When I remove the allowScripts section and run npm approve-scripts --all, only three packages are added to package.json:

$ npm approve-scripts --all
Approved esbuild:
  added esbuild@0.21.5
Approved protobufjs:
  added protobufjs@8.4.2
  added protobufjs@7.6.1

This is in a workspace root. For the omitted dependencies I can see no clear picture: devDependencies from root, devDependencies from workspaces, prod dependencies from workspaces.

Expected Behavior

  • npm approve-scripts --allow-scripts-pending should not list already approved dependencies
  • npm approve-scripts --all should add all listed dependencies to allowScripts in package.json

Environment

  • npm: 11.17.0
  • Node.js: 22.21.1
  • OS Name: Linux
  • System Model Name: x86_64 GNU/Linux
  • npm config:
; "project" config from /home/wsl/git/redacted/.npmrc

engine-strict = true
min-release-age = 3

; node bin location = /home/wsl/.local/share/fnm/node-versions/v22.21.1/installation/bin/node
; node version = v22.21.1
; npm local prefix = /home/wsl/git/sol24c-main
; npm version = 11.17.0
; cwd = /home/wsl/git/redacted
; HOME = /home/wsl
; Run `npm config ls -l` to show all defaults.

Activity

  1. KoenDG commented on Jun 20, 2026

    @KoenDG

    I am experiencing this as well.

    Node version 22.20.0
    NPM version 11.17.0

    Let's say I have code repo A.

    The scripts that get added by npm approve-scripts --all are all scripts from dependencies directly in code repo A's package.json.

    The scripts that don't get added, are from deeper down the dependency tree.

    I even tested updating a dependency I control, setting the allowScripts there, publishing, then installing the new version in repo A.

    Upon doing npm ci again after the install(I double checked, it's set to the new version in package.json and package-lock.json), the output list remains identical. The scripts I've allowed for the dependency I control are still listed. And I can confirm these are not themselves also direct dependencies of repo A.

    So it seems there's a discrepancy between the "allow" logic for a repo, and scripts and allow logic deeper down the dependency tree.

    Even if I manually add an "allowScripts" list to repo A, with the correct entries, they will still show up in the output of npm ci.

    I would assume that the intended behavior is that every code project has to explicitly approve every single script, regardless of depth in the dependency tree. The whole reason this functionality came to be was malicious dependencies. So, there's no trusting the allow list of a dependency further down the tree.

  2. JamieMagee commented on Jun 22, 2026

    @JamieMagee
    Contributor

    Thanks for the report, and thanks @KoenDG for confirming.

    Could you share, sanitised (redact hostnames and tokens, but keep the URL shape):

    1. The allowScripts and workspaces fields from your root package.json.
    2. The resolved URLs for the affected and working packages, from the project root:
      node -e "const p=require('./package-lock.json').packages;const names=['esbuild','hana-client','mbt','sqlite3','xsd-schema-validator','protobufjs'];for(const [k,v] of Object.entries(p)){if(names.some(n=>k.includes(n)))console.log((v.resolved||'(no resolved)')+' <- '+k)}"
    3. npm config get registry, and whether the lockfile points at a private registry or proxy.
  3. KoenDG commented on Jun 23, 2026

    @KoenDG

    @JamieMagee

    1/

    allowScripts:

        "allowScripts": {
            "esbuild@0.23.1": true,
            "puppeteer@14.4.1": true,
            "electron@33.0.2": true,
            "diskusage@1.2.0": true,
            "full-icu@1.5.0": true
        }
    

    With that present, npm ci prints this:

    npm warn allow-scripts 2 packages have install scripts not yet covered by allowScripts:
    npm warn allow-scripts   diskusage@1.2.0 (install: node-gyp rebuild)
    npm warn allow-scripts   electron@33.0.2 (postinstall: node install.js)
    npm warn allow-scripts
    npm warn allow-scripts Run `npm approve-scripts --allow-scripts-pending` to review, or `npm approve-scripts <pkg>` to allow.
    

    No workspaces field defined.

    2/

    $ node -e "const p=require('./package-lock.json').packages;const names=['esbuild','puppeteer','electron','diskusage','full-icu'];for(const [k,v] of Object.entries(p)){if(names.some(n=>k.includes(n)))console.log((v.resolved||'(no resolved)')+'  <-  '+k)}"
    (no resolved)  <-  node_modules/@electron/asar
    (no resolved)  <-  node_modules/@electron/asar/node_modules/brace-expansion
    (no resolved)  <-  node_modules/@electron/asar/node_modules/glob
    (no resolved)  <-  node_modules/@electron/asar/node_modules/minimatch
    (no resolved)  <-  node_modules/@electron/get
    (no resolved)  <-  node_modules/@electron/get/node_modules/@sindresorhus/is
    (no resolved)  <-  node_modules/@electron/get/node_modules/@szmarczak/http-timer
    (no resolved)  <-  node_modules/@electron/get/node_modules/cacheable-lookup
    (no resolved)  <-  node_modules/@electron/get/node_modules/cacheable-request
    (no resolved)  <-  node_modules/@electron/get/node_modules/fs-extra
    (no resolved)  <-  node_modules/@electron/get/node_modules/got
    (no resolved)  <-  node_modules/@electron/get/node_modules/http2-wrapper
    (no resolved)  <-  node_modules/@electron/get/node_modules/jsonfile
    (no resolved)  <-  node_modules/@electron/get/node_modules/lowercase-keys
    (no resolved)  <-  node_modules/@electron/get/node_modules/normalize-url
    (no resolved)  <-  node_modules/@electron/get/node_modules/p-cancelable
    (no resolved)  <-  node_modules/@electron/get/node_modules/responselike
    (no resolved)  <-  node_modules/@electron/get/node_modules/semver
    (no resolved)  <-  node_modules/@electron/get/node_modules/universalify
    (no resolved)  <-  node_modules/@electron/notarize
    (no resolved)  <-  node_modules/@electron/notarize/node_modules/fs-extra
    (no resolved)  <-  node_modules/@electron/osx-sign
    (no resolved)  <-  node_modules/@electron/osx-sign/node_modules/fs-extra
    (no resolved)  <-  node_modules/@electron/osx-sign/node_modules/isbinaryfile
    (no resolved)  <-  node_modules/@electron/universal
    (no resolved)  <-  node_modules/@electron/universal/node_modules/brace-expansion
    (no resolved)  <-  node_modules/@electron/universal/node_modules/fs-extra
    (no resolved)  <-  node_modules/@electron/universal/node_modules/minimatch
    https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz  <-  node_modules/@esbuild/aix-ppc64
    https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz  <-  node_modules/@esbuild/android-arm
    https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz  <-  node_modules/@esbuild/android-arm64
    https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz  <-  node_modules/@esbuild/android-x64
    https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz  <-  node_modules/@esbuild/darwin-arm64
    https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz  <-  node_modules/@esbuild/darwin-x64
    https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz  <-  node_modules/@esbuild/freebsd-arm64
    https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz  <-  node_modules/@esbuild/freebsd-x64
    https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz  <-  node_modules/@esbuild/linux-arm
    https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz  <-  node_modules/@esbuild/linux-arm64
    https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz  <-  node_modules/@esbuild/linux-ia32
    https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz  <-  node_modules/@esbuild/linux-loong64
    https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz  <-  node_modules/@esbuild/linux-mips64el
    https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz  <-  node_modules/@esbuild/linux-ppc64
    https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz  <-  node_modules/@esbuild/linux-riscv64
    https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz  <-  node_modules/@esbuild/linux-s390x
    https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz  <-  node_modules/@esbuild/linux-x64
    https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz  <-  node_modules/@esbuild/netbsd-x64
    https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz  <-  node_modules/@esbuild/openbsd-arm64
    https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz  <-  node_modules/@esbuild/openbsd-x64
    https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz  <-  node_modules/@esbuild/sunos-x64
    https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz  <-  node_modules/@esbuild/win32-arm64
    https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz  <-  node_modules/@esbuild/win32-ia32
    https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz  <-  node_modules/@esbuild/win32-x64
    (no resolved)  <-  node_modules/app-builder-lib/node_modules/@electron/notarize
    (no resolved)  <-  node_modules/app-builder-lib/node_modules/@electron/notarize/node_modules/fs-extra
    (no resolved)  <-  node_modules/app-builder-lib/node_modules/electron-publish
    (no resolved)  <-  node_modules/diskusage
    (no resolved)  <-  node_modules/electron
    (no resolved)  <-  node_modules/electron-builder
    (no resolved)  <-  node_modules/electron-builder-squirrel-windows
    (no resolved)  <-  node_modules/electron-builder-squirrel-windows/node_modules/agent-base
    (no resolved)  <-  node_modules/electron-builder-squirrel-windows/node_modules/app-builder-bin
    (no resolved)  <-  node_modules/electron-builder-squirrel-windows/node_modules/builder-util
    (no resolved)  <-  node_modules/electron-builder-squirrel-windows/node_modules/builder-util-runtime
    (no resolved)  <-  node_modules/electron-builder-squirrel-windows/node_modules/fs-extra
    (no resolved)  <-  node_modules/electron-builder-squirrel-windows/node_modules/http-proxy-agent
    (no resolved)  <-  node_modules/electron-builder-squirrel-windows/node_modules/https-proxy-agent
    (no resolved)  <-  node_modules/electron-builder/node_modules/agent-base
    (no resolved)  <-  node_modules/electron-builder/node_modules/app-builder-bin
    (no resolved)  <-  node_modules/electron-builder/node_modules/builder-util
    (no resolved)  <-  node_modules/electron-builder/node_modules/builder-util-runtime
    (no resolved)  <-  node_modules/electron-builder/node_modules/fs-extra
    (no resolved)  <-  node_modules/electron-builder/node_modules/http-proxy-agent
    (no resolved)  <-  node_modules/electron-builder/node_modules/https-proxy-agent
    (no resolved)  <-  node_modules/electron-is-dev
    (no resolved)  <-  node_modules/electron-publish
    (no resolved)  <-  node_modules/electron-publish/node_modules/@types/fs-extra
    (no resolved)  <-  node_modules/electron-publish/node_modules/fs-extra
    (no resolved)  <-  node_modules/electron-publish/node_modules/mime
    (no resolved)  <-  node_modules/electron-to-chromium
    (no resolved)  <-  node_modules/electron/node_modules/@types/node
    https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz  <-  node_modules/esbuild
    https://registry.npmjs.org/full-icu/-/full-icu-1.5.0.tgz  <-  node_modules/full-icu
    https://registry.npmjs.org/puppeteer/-/puppeteer-14.4.1.tgz  <-  node_modules/puppeteer
    https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz  <-  node_modules/puppeteer/node_modules/agent-base
    https://registry.npmjs.org/debug/-/debug-4.3.4.tgz  <-  node_modules/puppeteer/node_modules/debug
    https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz  <-  node_modules/puppeteer/node_modules/https-proxy-agent
    https://registry.npmjs.org/ms/-/ms-2.1.2.tgz  <-  node_modules/puppeteer/node_modules/ms
    

    3/

    $ npm config get registry
    https://registry.npmjs.org/
    

    Finding 235 "resolved": "https:// and then also 235 registry.npmjs.org/

    So, no private repo in lockfile, all registery.npmjs.org

  4. added a commit that references this issue on Jun 23, 2026
    971500f
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Bugthing that needs fixingNeeds Triageneeds review for next steps

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions