2021-04-15 21:53:45 -04:00
|
|
|
const t = require('tap')
|
2024-05-30 04:21:05 -07:00
|
|
|
const path = require('node:path')
|
|
|
|
const fs = require('node:fs')
|
2022-04-14 21:57:02 +00:00
|
|
|
|
2021-12-02 22:04:46 +00:00
|
|
|
const { load: loadMockNpm } = require('../../fixtures/mock-npm')
|
2022-12-06 22:18:33 -05:00
|
|
|
const MockRegistry = require('@npmcli/mock-registry')
|
2021-03-04 17:40:28 -05:00
|
|
|
|
2021-06-24 21:39:48 +00:00
|
|
|
t.test('should throw in global mode', async (t) => {
|
2021-12-02 22:04:46 +00:00
|
|
|
const { npm } = await loadMockNpm(t, {
|
|
|
|
config: {
|
|
|
|
global: true,
|
|
|
|
},
|
|
|
|
})
|
2021-06-24 21:39:48 +00:00
|
|
|
t.rejects(
|
2021-11-04 20:42:47 +00:00
|
|
|
npm.exec('dedupe', []),
|
2021-06-24 21:39:48 +00:00
|
|
|
{ code: 'EDEDUPEGLOBAL' },
|
|
|
|
'throws EDEDUPEGLOBALE'
|
|
|
|
)
|
2021-02-23 17:29:16 -05:00
|
|
|
})
|
|
|
|
|
2022-04-14 21:57:02 +00:00
|
|
|
const treeWithDupes = {
|
|
|
|
'package.json': JSON.stringify({
|
|
|
|
name: 'test-top',
|
|
|
|
version: '1.0.0',
|
|
|
|
dependencies: {
|
|
|
|
'test-dep-a': '*',
|
|
|
|
'test-dep-b': '*',
|
|
|
|
},
|
|
|
|
}),
|
|
|
|
node_modules: {
|
|
|
|
'test-dep-a': {
|
|
|
|
'package.json': JSON.stringify({
|
|
|
|
name: 'test-dep-a',
|
|
|
|
version: '1.0.1',
|
|
|
|
dependencies: { 'test-sub': '*' },
|
|
|
|
}),
|
|
|
|
node_modules: {
|
|
|
|
'test-sub': {
|
|
|
|
'package.json': JSON.stringify({
|
|
|
|
name: 'test-sub',
|
|
|
|
version: '1.0.0',
|
|
|
|
}),
|
|
|
|
},
|
2021-12-02 22:04:46 +00:00
|
|
|
},
|
2020-10-02 17:52:19 -04:00
|
|
|
},
|
2022-04-14 21:57:02 +00:00
|
|
|
'test-dep-b': {
|
|
|
|
'package.json': JSON.stringify({
|
|
|
|
name: 'test-dep-b',
|
|
|
|
version: '1.0.0',
|
|
|
|
dependencies: { 'test-sub': '*' },
|
|
|
|
}),
|
|
|
|
node_modules: {
|
|
|
|
'test-sub': {
|
|
|
|
'package.json': JSON.stringify({
|
|
|
|
name: 'test-sub',
|
|
|
|
version: '1.0.0',
|
|
|
|
}),
|
|
|
|
},
|
|
|
|
},
|
2020-11-17 15:37:44 -05:00
|
|
|
},
|
2022-04-14 21:57:02 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
t.test('dedupe', async (t) => {
|
|
|
|
const { npm, joinedOutput } = await loadMockNpm(t, {
|
|
|
|
prefixDir: treeWithDupes,
|
|
|
|
})
|
|
|
|
const registry = new MockRegistry({
|
|
|
|
tap: t,
|
|
|
|
registry: npm.config.get('registry'),
|
|
|
|
})
|
|
|
|
const manifestSub = registry.manifest({
|
|
|
|
name: 'test-sub',
|
|
|
|
packuments: [{ version: '1.0.0' }],
|
2020-10-02 17:52:19 -04:00
|
|
|
})
|
|
|
|
|
2022-04-14 21:57:02 +00:00
|
|
|
await registry.package({
|
|
|
|
manifest: manifestSub,
|
|
|
|
tarballs: {
|
|
|
|
'1.0.0': path.join(npm.prefix, 'node_modules', 'test-dep-a', 'node_modules', 'test-sub'),
|
2020-10-02 17:52:19 -04:00
|
|
|
},
|
|
|
|
})
|
2021-11-04 20:42:47 +00:00
|
|
|
await npm.exec('dedupe', [])
|
2022-04-14 21:57:02 +00:00
|
|
|
t.match(joinedOutput(), /added 1 package, and removed 2 packages/)
|
|
|
|
t.ok(
|
|
|
|
fs.existsSync(path.join(npm.prefix, 'node_modules', 'test-sub')),
|
|
|
|
'test-sub was hoisted'
|
|
|
|
)
|
|
|
|
t.notOk(
|
|
|
|
fs.existsSync(path.join(npm.prefix, 'node_modules', 'test-dep-a', 'node_modules', 'test-sub')),
|
|
|
|
'test-dep-a/test-sub was removed'
|
|
|
|
)
|
|
|
|
t.notOk(
|
|
|
|
fs.existsSync(path.join(npm.prefix, 'node_modules', 'test-dep-b', 'node_modules', 'test-sub')),
|
|
|
|
'test-dep-b/test-sub was removed')
|
2020-10-02 17:52:19 -04:00
|
|
|
})
|