npm / cli

the package manager for JavaScript
https://docs.npmjs.com/cli/
Other
8.34k stars 3.07k forks source link

[BUG] Running `npm i` fails with Cannot read properties of null (reading 'isDescendantOf') #5687

Open fatso83 opened 1 year ago

fatso83 commented 1 year ago

Is there an existing issue for this?

This issue exists in the latest npm version

Current Behavior

When installing a project using PNPM first and then subsequently using standard npm to install it, the install process borks after a long time with:

npm ERR! Cannot read properties of null (reading 'isDescendantOf')

Looking at the generated debug log one can see a null pointer being mentioned:

``` 9918 timing idealTree:node_modules/.pnpm/node_modules/eslint/node_modules/table/node_modules/strip-ansi Completed in 1ms 9919 timing idealTree:node_modules/.pnpm/node_modules/eslint/node_modules/table/node_modules/ansi-regex Completed in 0ms 9920 timing idealTree:node_modules/.pnpm/node_modules/fast-glob/node_modules/glob-parent/node_modules/is-glob Completed in 0ms 9921 timing idealTree Completed in 14547ms 9922 timing command:i Completed in 14573ms 9923 verbose stack TypeError: Cannot read properties of null (reading 'isDescendantOf') 9923 verbose stack at [resolveLinks] (/usr/local/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js:1419:37) 9923 verbose stack at [buildDepStep] (/usr/local/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js:792:33) 9923 verbose stack at [buildDepStep] (/usr/local/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js:1047:31) 9924 verbose cwd /home/carlerik/code/example-encrypt-properties 9925 verbose Linux 5.15.0-47-generic 9926 verbose node v18.10.0 9927 verbose npm v8.19.2 9928 error Cannot read properties of null (reading 'isDescendantOf') 9929 verbose exit 1 9930 timing npm Completed in 14748ms 9931 verbose unfinished npm timer reify 1665582899091 9932 verbose unfinished npm timer reify:loadTrees 1665582899109 9933 verbose unfinished npm timer idealTree:buildDeps 1665582899389 9934 verbose unfinished npm timer idealTree:node_modules/.pnpm/yargs@16.2.0/node_modules/yargs 1665582906713 9935 verbose code 1 9936 error A complete log of this run can be found in: 9936 error /home/carlerik/.npm/_logs/2022-10-12T13_54_58_915Z-debug-0.log ```

Adding a console.log("link.target is null!", link) just before it fails shows this: image

This points at one of the PNPM installed files being an issue of some sort. Maybe due to the symlinks created? image

Expected Behavior

I would expect that NPM would go about its business and handle the situation where PNPM previously has stepped all over its turf gracefully :smile:

It took some attempts (actually writing this) to discover that wiping with rm -r node_modules would fix the issue, so maybe one could add some heuristics to detect weird symlinks where there should not be and just delete the directory before re-installing? That would be very user friendly, at least.

Steps To Reproduce

  1. hub clone fatso83/example-encrypt-properties (clone this repo)
  2. cd example-encrypt-properties && pnpm i && npm i
  3. Observe an error: npm ERR! Cannot read properties of null (reading 'isDescendantOf')

Environment

//registry.npmjs.org/:_authToken = (protected) flex-sdk:npm_cmd_ran = "install"

; node bin location = /usr/local/bin/node ; node version = v18.10.0 ; npm local prefix = /home/carlerik/code/nimble ; npm version = 8.19.2 ; cwd = /home/carlerik/code/nimble ; HOME = /home/carlerik ; Run npm config ls -l to show all defaults.

fritzy commented 1 year ago

Theoretically, links shouldn't be an issue. This is worth fixing.

trusktr commented 10 months ago

I'm also having this issue. In a workspace I have to run npm run version --no-workspaces ... to avoid the error. Other workspaces outside of the workspace where I'm running npm version are linked together using yarn install.

I also have a similar problem when not using --no-workspaces with this error for npm install:

trusktr commented 9 months ago

@fritzy this isn't only about links. I have no links in node_modules of the project with this error, but the project is simply a workspace (a git submodule in a super repo).

SimenB commented 8 months ago

getting a similar error trying to run npm dedupe in https://github.com/open-telemetry/opentelemetry-js-contrib - npm install completes just fine.

6004 verbose stack TypeError: Cannot read properties of null (reading 'isDescendantOf')
6004 verbose stack     at #resolveLinks (/Users/simen/.nvm/versions/node/v20.10.0/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js:1414:37)
6004 verbose stack     at #buildDepStep (/Users/simen/.nvm/versions/node/v20.10.0/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js:783:32)
6004 verbose stack     at #buildDepStep (/Users/simen/.nvm/versions/node/v20.10.0/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js:1035:30)
6004 verbose stack     at async Arborist.buildIdealTree (/Users/simen/.nvm/versions/node/v20.10.0/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js:196:7)
6004 verbose stack     at async Promise.all (index 1)
6004 verbose stack     at async Arborist.reify (/Users/simen/.nvm/versions/node/v20.10.0/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js:159:5)
6004 verbose stack     at async Dedupe.exec (/Users/simen/.nvm/versions/node/v20.10.0/lib/node_modules/npm/lib/commands/dedupe.js:47:5)
6004 verbose stack     at async module.exports (/Users/simen/.nvm/versions/node/v20.10.0/lib/node_modules/npm/lib/cli-entry.js:61:5)
6005 verbose cwd /Users/simen/repos/opentelemetry-js-contrib
6006 verbose Darwin 23.2.0
6007 verbose node v20.10.0
6008 verbose npm  v10.2.5
6009 error Cannot read properties of null (reading 'isDescendantOf')
mikemaccana commented 3 weeks ago

This seems to occur when running npm i outside a directory with an existing package.json. Others may wish to check if they're actually in the directory they think they are. The error message is still poor though.

ljharb commented 3 weeks ago

@mikemaccana when i run npm in a dir that doesn't have a package.json file, i get a pretty clear ENOENT error about a missing package.json. (when it's not valid JSON, i get a clear EJSONPARSE error)