-
Notifications
You must be signed in to change notification settings - Fork 3.9k
Description
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
Current Behavior
I am getting the error:
46 verbose stack TypeError: Cannot set properties of null (setting 'peer')
46 verbose stack at visit (/usr/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/calc-dep-flags.js:101:54)
46 verbose stack at visitNode (/usr/lib/node_modules/npm/node_modules/treeverse/lib/depth-descent.js:58:25)
46 verbose stack at next (/usr/lib/node_modules/npm/node_modules/treeverse/lib/depth-descent.js:44:19)
46 verbose stack at depth (/usr/lib/node_modules/npm/node_modules/treeverse/lib/depth-descent.js:83:10)
46 verbose stack at depth (/usr/lib/node_modules/npm/node_modules/treeverse/lib/depth.js:27:12)
46 verbose stack at unsetFlag (/usr/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/calc-dep-flags.js:96:5)
46 verbose stack at /usr/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/calc-dep-flags.js:63:7
46 verbose stack at Map.forEach (<anonymous>)
46 verbose stack at calcDepFlagsStep (/usr/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/calc-dep-flags.js:41:17)
46 verbose stack at visit (/usr/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/calc-dep-flags.js:12:20)
I've then checked /usr/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/calc-dep-flags.js:101:54) and added a console.error({node}); to line 101, to get more insight. It seems like target is null, I've put the last three nodes below.
I've created a mwe here. To reproduce, execute npm i and then try to install npm i measuresuite@latest again. It works well for the first install and any subsequent install, iff node_modules are deleted beforehand.
I am the maintainer of measuresuite, which is a C-library with a gyp file. The native code it build into ./build/Release/measuresuite which I am trying to reference from measuresuite-native-module. c.f. package.json:47
Possibly it is not an issue with npmcli (although it seems related like here), but with how I am packaging measuresuite, but I could not find any better documentation of how to package a native module. (and it used to work fine just like that).
I'm more than happy to provide more information or data if needed, but I am lost and don't know where to debug / which data is needed.
Last three nodes:
{
node: ArboristLink {
name: 'measuresuite-native-module',
location: 'node_modules/measuresuite-native-module',
path: '/home/joel/dev/6mwe/mwe-measuresuite/node_modules/measuresuite-native-module',
realpath: '/home/joel/dev/6mwe/mwe-measuresuite/node_modules/measuresuite/build/Release/measuresuite.node',
resolved: 'file:measuresuite/build/Release/measuresuite.node',
optional: true,
errors: [ [Object] ],
edgesIn: Set(1) {
{ node_modules/measuresuite prod measuresuite-native-module@file:./build/Release/measuresuite.node }
},
target: ArboristNode {
name: 'measuresuite.node',
location: 'node_modules/measuresuite/build/Release/measuresuite.node',
path: '/home/joel/dev/6mwe/mwe-measuresuite/node_modules/measuresuite/build/Release/measuresuite.node',
dev: true,
optional: true,
errors: [Array]
}
}
}
{
node: ArboristLink {
name: 'measuresuite-native-module',
location: 'node_modules/measuresuite-native-module',
path: '/home/joel/dev/6mwe/mwe-measuresuite/node_modules/measuresuite-native-module',
realpath: '/home/joel/dev/6mwe/mwe-measuresuite/node_modules/measuresuite/build/Release/measuresuite.node',
resolved: 'file:measuresuite/build/Release/measuresuite.node',
errors: [ [Object] ],
edgesIn: Set(1) {
{ node_modules/measuresuite prod measuresuite-native-module@file:./build/Release/measuresuite.node }
},
target: ArboristNode {
name: 'measuresuite.node',
location: 'node_modules/measuresuite/build/Release/measuresuite.node',
path: '/home/joel/dev/6mwe/mwe-measuresuite/node_modules/measuresuite/build/Release/measuresuite.node',
optional: true,
errors: [Array]
}
}
}
{⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂) ⠼ idealTree: timing arborist:ctor Completed in 1ms
node: ArboristLink {
name: 'measuresuite-native-module',
packageName: 'measuresuite.node',
location: 'node_modules/measuresuite-native-module',
path: '/home/joel/dev/6mwe/mwe-measuresuite/node_modules/measuresuite-native-module',
realpath: '/home/joel/dev/6mwe/mwe-measuresuite/node_modules/measuresuite/build/Release/measuresuite.node',
resolved: 'file:measuresuite/build/Release/measuresuite.node',
dev: true,
optional: true,
edgesIn: Set(1) {
{ node_modules/measuresuite prod measuresuite-native-module@file:./build/Release/measuresuite.node }
},
target: null
}
}Expected Behavior
That npm i measuresuite@latest does not fail.
Steps To Reproduce
git clone https://github.com/dderjoel/mwe-measuresuite.git
cd mwe-measuresuite
npm i
npm i measuresuite@latestEnvironment
- npm: 9.8.0
- Node.js: v20.3.1
- OS Name: ArchLinux: (
uname -a: Linux arch4 6.3.9-arch1-1 archive: committable offline dependency archive #1 SMP PREEMPT_DYNAMIC Wed, 21 Jun 2023 20:46:20 +0000 x86_64 GNU/Linux) - System Model Name: Lenovo T490
- npm config:
npm config ls:
; "user" config from /home/joel/.npmrc
//registry.npmjs.org/:_authToken = (protected)
; node bin location = /usr/bin/node
; node version = v20.3.1
; npm local prefix = /home/joel/dev/6mwe/mwe-measuresuite
; npm version = 9.7.2
; cwd = /home/joel/dev/6mwe/mwe-measuresuite
; HOME = /home/joel
npm config ls -l:
; "default" config from default values
_auth = (protected)
access = null
all = false
allow-same-version = false
also = null
audit = true
audit-level = null
auth-type = "web"
before = null
bin-links = true
browser = null
ca = null
cache = "/home/joel/.npm"
cache-max = null
cache-min = 0
cafile = null
call = ""
cert = null
ci-name = null
cidr = null
color = true
commit-hooks = true
depth = null
description = true
dev = false
diff = []
diff-dst-prefix = "b/"
diff-ignore-all-space = false
diff-name-only = false
diff-no-prefix = false
diff-src-prefix = "a/"
diff-text = false
diff-unified = 3
dry-run = false
editor = "nvim"
engine-strict = false
fetch-retries = 2
fetch-retry-factor = 10
fetch-retry-maxtimeout = 60000
fetch-retry-mintimeout = 10000
fetch-timeout = 300000
force = false
foreground-scripts = false
format-package-lock = true
fund = true
git = "git"
git-tag-version = true
global = false
global-style = false
globalconfig = "/usr/etc/npmrc"
heading = "npm"
https-proxy = null
if-present = false
ignore-scripts = false
include = []
include-staged = false
include-workspace-root = false
init-author-email = ""
init-author-name = ""
init-author-url = ""
init-license = "ISC"
init-module = "/home/joel/.npm-init.js"
init-version = "1.0.0"
init.author.email = ""
init.author.name = ""
init.author.url = ""
init.license = "ISC"
init.module = "/home/joel/.npm-init.js"
init.version = "1.0.0"
install-links = false
install-strategy = "hoisted"
json = false
key = null
legacy-bundling = false
legacy-peer-deps = false
link = false
local-address = null
location = "user"
lockfile-version = null
loglevel = "notice"
logs-dir = null
logs-max = 10
; long = false ; overridden by cli
maxsockets = 15
message = "%s"
metrics-registry = "https://registry.npmjs.org/"
node-options = null
noproxy = [""]
npm-version = "9.7.2"
offline = false
omit = []
omit-lockfile-registry-resolved = false
only = null
optional = null
otp = null
pack-destination = "."
package = []
package-lock = true
package-lock-only = false
parseable = false
prefer-dedupe = false
prefer-offline = false
prefer-online = false
prefix = "/usr"
preid = ""
production = null
progress = true
provenance = false
provenance-file = null
proxy = null
read-only = false
rebuild-bundle = true
registry = "https://registry.npmjs.org/"
replace-registry-host = "npmjs"
save = true
save-bundle = false
save-dev = false
save-exact = false
save-optional = false
save-peer = false
save-prefix = "^"
save-prod = false
scope = ""
script-shell = null
searchexclude = ""
searchlimit = 20
searchopts = ""
searchstaleness = 900
shell = "/bin/zsh"
shrinkwrap = true
sign-git-commit = false
sign-git-tag = false
strict-peer-deps = false
strict-ssl = true
tag = "latest"
tag-version-prefix = "v"
timing = false
tmp = "/tmp"
umask = 0
unicode = true
update-notifier = true
usage = false
user-agent = "npm/{npm-version} node/{node-version} {platform} {arch} workspaces/{workspaces} {ci}"
userconfig = "/home/joel/.npmrc"
version = false
versions = false
viewer = "man"
which = null
workspace = []
workspaces = null
workspaces-update = true
yes = null
; "user" config from /home/joel/.npmrc
//registry.npmjs.org/:_authToken = (protected)
; "cli" config from command line options
long = true