diff --git a/node_modules/@npmcli/arborist/lib/arborist/rebuild.js b/node_modules/@npmcli/arborist/lib/arborist/rebuild.js index f4f3ca12b7011..9c52d009d6fd8 100644 --- a/node_modules/@npmcli/arborist/lib/arborist/rebuild.js +++ b/node_modules/@npmcli/arborist/lib/arborist/rebuild.js @@ -49,6 +49,7 @@ module.exports = cls => class Builder extends cls { rebuildBundle = true, } = options + this.scriptsRun = new Set() this[_binLinks] = binLinks this[_ignoreScripts] = !!ignoreScripts this[_scriptShell] = scriptShell @@ -241,6 +242,8 @@ module.exports = cls => class Builder extends cls { return process.emit('time', `build:run:${event}`) + const stdio = this.options.foregroundScripts ? 'inherit' : 'pipe' + const limit = this.options.foregroundScripts ? 1 : undefined await promiseCallLimit(queue.map(node => async () => { const { path, @@ -261,27 +264,41 @@ module.exports = cls => class Builder extends cls { const timer = `build:run:${event}:${location}` process.emit('time', timer) this.log.info('run', pkg._id, event, location, pkg.scripts[event]) - const p = runScript({ + const env = { + npm_package_resolved: resolved, + npm_package_integrity: integrity, + npm_package_json: resolve(path, 'package.json'), + npm_package_optional: boolEnv(optional), + npm_package_dev: boolEnv(dev), + npm_package_peer: boolEnv(peer), + npm_package_dev_optional: + boolEnv(devOptional && !dev && !optional), + } + const runOpts = { event, path, pkg, stdioString: true, - env: { - npm_package_resolved: resolved, - npm_package_integrity: integrity, - npm_package_json: resolve(path, 'package.json'), - npm_package_optional: boolEnv(optional), - npm_package_dev: boolEnv(dev), - npm_package_peer: boolEnv(peer), - npm_package_dev_optional: - boolEnv(devOptional && !dev && !optional), - }, + stdio, + env, scriptShell: this[_scriptShell], - }).catch(er => { + } + const p = runScript(runOpts).catch(er => { const { code, signal } = er this.log.info('run', pkg._id, event, {code, signal}) throw er - }).then(({code, signal}) => { + }).then(({args, code, signal, stdout, stderr}) => { + this.scriptsRun.add({ + pkg, + path, + event, + cmd: args && args[args.length - 1], + env, + code, + signal, + stdout, + stderr, + }) this.log.info('run', pkg._id, event, {code, signal}) }) @@ -290,7 +307,7 @@ module.exports = cls => class Builder extends cls { : p) process.emit('timeEnd', timer) - })) + }), limit) process.emit('timeEnd', `build:run:${event}`) } diff --git a/node_modules/@npmcli/arborist/lib/arborist/reify.js b/node_modules/@npmcli/arborist/lib/arborist/reify.js index 1f979ba1402c3..661d879eb19e6 100644 --- a/node_modules/@npmcli/arborist/lib/arborist/reify.js +++ b/node_modules/@npmcli/arborist/lib/arborist/reify.js @@ -66,6 +66,7 @@ const _copyIdealToActual = Symbol('copyIdealToActual') const _addOmitsToTrashList = Symbol('addOmitsToTrashList') const _packageLockOnly = Symbol('packageLockOnly') const _dryRun = Symbol('dryRun') +const _validatePath = Symbol('validatePath') const _reifyPackages = Symbol('reifyPackages') const _omitDev = Symbol('omitDev') @@ -120,7 +121,8 @@ module.exports = cls => class Reifier extends cls { // start tracker block this.addTracker('reify') process.emit('time', 'reify') - await this[_loadTrees](options) + await this[_validatePath]() + .then(() => this[_loadTrees](options)) .then(() => this[_diffTrees]()) .then(() => this[_reifyPackages]()) .then(() => this[_saveIdealTree](options)) @@ -132,6 +134,14 @@ module.exports = cls => class Reifier extends cls { return treeCheck(this.actualTree) } + async [_validatePath] () { + // don't create missing dirs on dry runs + if (this[_packageLockOnly] || this[_dryRun] || this[_global]) + return + + await mkdirp(resolve(this.path)) + } + async [_reifyPackages] () { // we don't submit the audit report or write to disk on dry runs if (this[_dryRun]) diff --git a/node_modules/@npmcli/arborist/package.json b/node_modules/@npmcli/arborist/package.json index b8b27c29fdf3c..6300a5e867d4c 100644 --- a/node_modules/@npmcli/arborist/package.json +++ b/node_modules/@npmcli/arborist/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/arborist", - "version": "2.0.2", + "version": "2.0.3", "description": "Manage node_modules trees", "dependencies": { "@npmcli/installed-package-contents": "^1.0.5", @@ -19,13 +19,14 @@ "npm-install-checks": "^4.0.0", "npm-package-arg": "^8.1.0", "npm-pick-manifest": "^6.1.0", - "pacote": "^11.1.13", + "pacote": "^11.1.14", "parse-conflict-json": "^1.1.1", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^1.0.1", "read-package-json-fast": "^1.2.1", "readdir-scoped-modules": "^1.1.0", "semver": "^7.3.4", + "tar": "^6.1.0", "treeverse": "^1.0.4", "walk-up-path": "^1.0.0" }, diff --git a/package-lock.json b/package-lock.json index b9faf6cdb8974..9dd28212e8caa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -354,7 +354,7 @@ ], "license": "Artistic-2.0", "dependencies": { - "@npmcli/arborist": "^2.0.2", + "@npmcli/arborist": "^2.0.3", "@npmcli/ci-detect": "^1.2.0", "@npmcli/config": "^1.2.8", "@npmcli/run-script": "^1.8.1", @@ -682,9 +682,9 @@ } }, "node_modules/@npmcli/arborist": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-2.0.2.tgz", - "integrity": "sha512-QMMUSeGW6u9/T8zH0zCGSRtOqCMmv8LnRNjZFX+zv4u1dauIx5iJ4i8e7EJbvXkKEZyGjK8sJ45NIoF+umMgIQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-2.0.3.tgz", + "integrity": "sha512-iqahzDZaqdUyAHLG1SIG9jrbkLtT5xNbKX1ppAnx7mKx1u+BXYjkxi5ohewLAfyERH6IpODPAiRVc8c3kxA5jQ==", "inBundle": true, "dependencies": { "@npmcli/installed-package-contents": "^1.0.5", @@ -703,13 +703,14 @@ "npm-install-checks": "^4.0.0", "npm-package-arg": "^8.1.0", "npm-pick-manifest": "^6.1.0", - "pacote": "^11.1.13", + "pacote": "^11.1.14", "parse-conflict-json": "^1.1.1", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^1.0.1", "read-package-json-fast": "^1.2.1", "readdir-scoped-modules": "^1.1.0", "semver": "^7.3.4", + "tar": "^6.1.0", "treeverse": "^1.0.4", "walk-up-path": "^1.0.0" } @@ -9855,9 +9856,9 @@ } }, "@npmcli/arborist": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-2.0.2.tgz", - "integrity": "sha512-QMMUSeGW6u9/T8zH0zCGSRtOqCMmv8LnRNjZFX+zv4u1dauIx5iJ4i8e7EJbvXkKEZyGjK8sJ45NIoF+umMgIQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-2.0.3.tgz", + "integrity": "sha512-iqahzDZaqdUyAHLG1SIG9jrbkLtT5xNbKX1ppAnx7mKx1u+BXYjkxi5ohewLAfyERH6IpODPAiRVc8c3kxA5jQ==", "requires": { "@npmcli/installed-package-contents": "^1.0.5", "@npmcli/map-workspaces": "^1.0.1", @@ -9875,13 +9876,14 @@ "npm-install-checks": "^4.0.0", "npm-package-arg": "^8.1.0", "npm-pick-manifest": "^6.1.0", - "pacote": "^11.1.13", + "pacote": "^11.1.14", "parse-conflict-json": "^1.1.1", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^1.0.1", "read-package-json-fast": "^1.2.1", "readdir-scoped-modules": "^1.1.0", "semver": "^7.3.4", + "tar": "^6.1.0", "treeverse": "^1.0.4", "walk-up-path": "^1.0.0" } diff --git a/package.json b/package.json index c7c417c4e710f..17c25ec27abb6 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "./package.json": "./package.json" }, "dependencies": { - "@npmcli/arborist": "^2.0.2", + "@npmcli/arborist": "^2.0.3", "@npmcli/ci-detect": "^1.2.0", "@npmcli/config": "^1.2.8", "@npmcli/run-script": "^1.8.1",