diff options
author | Ruy Adorno <ruyadorno@hotmail.com> | 2022-05-10 21:19:04 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-10 21:19:04 +0300 |
commit | 5a50762faa37ae5964ae6f12595b20b367056c0a (patch) | |
tree | ab51e6b8696431b544aace41a94d2e7bf7651661 /workspaces/arborist/test | |
parent | f985dbbd9ad3910c65e023f55beac9ec691c5e2c (diff) |
fix(arborist): link deps lifecycle scripts (#4875)
- Fixes running proper lifecycle scripts for linked deps and
workspaces.
- Added test to validate lifecycle scripts don't run twice
for linked deps
- Tweaked "reify workspaces bin files" test to also validate
proper lifecycle scripts ran before check for linked bins.
- Tweaked reify test running lifecycle scripts of unchanged link
nodes to also validate that the install lifecycle scripts are
also called.
Fixes: https://github.com/npm/cli/issues/4277
Fixes: https://github.com/npm/cli/issues/4552
Fixes: https://github.com/npm/statusboard/issues/439
Relates to: https://github.com/npm/cli/issues/2905
Diffstat (limited to 'workspaces/arborist/test')
8 files changed, 59 insertions, 3 deletions
diff --git a/workspaces/arborist/test/arborist/rebuild.js b/workspaces/arborist/test/arborist/rebuild.js index e75895628..37551c748 100644 --- a/workspaces/arborist/test/arborist/rebuild.js +++ b/workspaces/arborist/test/arborist/rebuild.js @@ -459,6 +459,51 @@ t.test('do not rebuild node-gyp dependencies with gypfile:false', async t => { await arb.rebuild() }) +// ref: https://github.com/npm/cli/issues/2905 +t.test('do not run lifecycle scripts of linked deps twice', async t => { + const testdir = t.testdir({ + project: { + 'package.json': JSON.stringify({ + name: 'my-project', + version: '1.0.0', + dependencies: { + foo: 'file:../foo', + }, + }), + node_modules: { + foo: t.fixture('symlink', '../../foo'), + }, + }, + foo: { + 'package.json': JSON.stringify({ + name: 'foo', + version: '1.0.0', + scripts: { + postinstall: 'echo "ok"', + }, + }), + }, + }) + + const path = resolve(testdir, 'project') + const RUNS = [] + const Arborist = t.mock('../../lib/arborist/index.js', { + '@npmcli/run-script': opts => { + RUNS.push(opts) + return require('@npmcli/run-script')(opts) + }, + }) + const arb = new Arborist({ path, registry }) + await arb.rebuild() + t.equal(RUNS.length, 1, 'should run postinstall script only once') + t.match(RUNS, [ + { + event: 'postinstall', + pkg: { name: 'foo' }, + }, + ]) +}) + t.test('workspaces', async t => { const path = t.testdir({ 'package.json': JSON.stringify({ diff --git a/workspaces/arborist/test/arborist/reify.js b/workspaces/arborist/test/arborist/reify.js index 509700404..a77b0fbb2 100644 --- a/workspaces/arborist/test/arborist/reify.js +++ b/workspaces/arborist/test/arborist/reify.js @@ -1770,6 +1770,8 @@ t.test('running lifecycle scripts of unchanged link nodes on reify', async t => t.ok(fs.lstatSync(resolve(path, 'a/a-prepare')).isFile(), 'should run prepare lifecycle scripts for links directly linked to the tree') + t.ok(fs.lstatSync(resolve(path, 'a/a-post-install')).isFile(), + 'should run postinstall lifecycle scripts for links directly linked to the tree') }) t.test('save-prod, with optional', async t => { diff --git a/workspaces/arborist/test/fixtures/link-dep-lifecycle-scripts/a/package.json b/workspaces/arborist/test/fixtures/link-dep-lifecycle-scripts/a/package.json index e545ad686..f239bf31d 100644 --- a/workspaces/arborist/test/fixtures/link-dep-lifecycle-scripts/a/package.json +++ b/workspaces/arborist/test/fixtures/link-dep-lifecycle-scripts/a/package.json @@ -2,6 +2,7 @@ "name": "a", "version": "1.0.0", "scripts": { - "prepare": "node -e \"require('fs').writeFileSync(require('path').resolve('a-prepare'), '')\"" + "prepare": "node -e \"require('fs').writeFileSync('a-prepare', '')\"", + "postinstall": "node -e \"require('fs').writeFileSync('a-post-install', '')\"" } } diff --git a/workspaces/arborist/test/fixtures/reify-cases/link-dep-lifecycle-scripts.js b/workspaces/arborist/test/fixtures/reify-cases/link-dep-lifecycle-scripts.js index 651761d5a..5f75cf33f 100644 --- a/workspaces/arborist/test/fixtures/reify-cases/link-dep-lifecycle-scripts.js +++ b/workspaces/arborist/test/fixtures/reify-cases/link-dep-lifecycle-scripts.js @@ -6,7 +6,8 @@ module.exports = t => { "name": "a", "version": "1.0.0", "scripts": { - "prepare": "node -e \"require('fs').writeFileSync(require('path').resolve('a-prepare'), '')\"" + "prepare": "node -e \"require('fs').writeFileSync('a-prepare', '')\"", + "postinstall": "node -e \"require('fs').writeFileSync('a-post-install', '')\"" } }) }, diff --git a/workspaces/arborist/test/fixtures/reify-cases/workspaces-link-bin.js b/workspaces/arborist/test/fixtures/reify-cases/workspaces-link-bin.js index ceca15eeb..59120e2ed 100644 --- a/workspaces/arborist/test/fixtures/reify-cases/workspaces-link-bin.js +++ b/workspaces/arborist/test/fixtures/reify-cases/workspaces-link-bin.js @@ -25,13 +25,16 @@ module.exports = t => { }) }, "b": { - "file.js": "", + "create-file.js": "require('fs').writeFileSync('file.js', '')\n", "package.json": JSON.stringify({ "name": "b", "version": "1.0.0", "files": [ "file.js" ], + "scripts": { + "preinstall": "node create-file.js" + }, "bin": "file.js" }) } diff --git a/workspaces/arborist/test/fixtures/workspaces-link-bin/packages/b/create-file.js b/workspaces/arborist/test/fixtures/workspaces-link-bin/packages/b/create-file.js new file mode 100644 index 000000000..937f47da3 --- /dev/null +++ b/workspaces/arborist/test/fixtures/workspaces-link-bin/packages/b/create-file.js @@ -0,0 +1 @@ +require('fs').writeFileSync('file.js', '') diff --git a/workspaces/arborist/test/fixtures/workspaces-link-bin/packages/b/file.js b/workspaces/arborist/test/fixtures/workspaces-link-bin/packages/b/file.js deleted file mode 100644 index e69de29bb..000000000 --- a/workspaces/arborist/test/fixtures/workspaces-link-bin/packages/b/file.js +++ /dev/null diff --git a/workspaces/arborist/test/fixtures/workspaces-link-bin/packages/b/package.json b/workspaces/arborist/test/fixtures/workspaces-link-bin/packages/b/package.json index 52a65b6fa..3d0b8d0b8 100644 --- a/workspaces/arborist/test/fixtures/workspaces-link-bin/packages/b/package.json +++ b/workspaces/arborist/test/fixtures/workspaces-link-bin/packages/b/package.json @@ -2,5 +2,8 @@ "name": "b", "version": "1.0.0", "files": ["file.js"], + "scripts": { + "preinstall": "node create-file.js" + }, "bin": "file.js" } |