You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

155 lines
3.6 KiB

var fs = require('fs')
var join = require('path').join
var mkdirp = require('mkdirp')
var rimraf = require('rimraf')
var test = require('tap').test
var common = require('../common-tap.js')
var pkg = join(__dirname, 'dedupe-scoped')
var modules = join(pkg, 'node_modules')
var EXEC_OPTS = { cwd: pkg }
var body = [
'move\t@scope/shared\t2.1.6\tnode_modules/@scope/shared\t\tnode_modules/first/node_modules/@scope/shared',
'move\tfirstUnique\t0.6.0\tnode_modules/firstUnique\t\tnode_modules/first/node_modules/firstUnique',
'remove\t@scope/shared\t2.1.6\tnode_modules/second/node_modules/@scope/shared',
'move\tsecondUnique\t1.2.0\tnode_modules/secondUnique\t\tnode_modules/second/node_modules/secondUnique'
]
var deduper = {
'name': 'dedupe',
'version': '0.0.0',
'dependencies': {
'first': '1.0.0',
'second': '2.0.0'
}
}
var first = {
'name': 'first',
'version': '1.0.0',
'dependencies': {
'firstUnique': '0.6.0',
'@scope/shared': '2.1.6'
},
'_resolved': 'foo',
'_integrity': 'sha1-deadbeef'
}
var second = {
'name': 'second',
'version': '2.0.0',
'dependencies': {
'secondUnique': '1.2.0',
'@scope/shared': '2.1.6'
},
'_resolved': 'foo',
'_integrity': 'sha1-deadbeef'
}
var shared = {
'name': '@scope/shared',
'version': '2.1.6',
'_resolved': 'foo',
'_integrity': 'sha1-deadbeef'
}
var firstUnique = {
'name': 'firstUnique',
'version': '0.6.0',
'_resolved': 'foo',
'_integrity': 'sha1-deadbeef'
}
var secondUnique = {
'name': 'secondUnique',
'version': '1.2.0',
'_resolved': 'foo',
'_integrity': 'sha1-deadbeef'
}
test('setup', function (t) {
setup()
t.end()
})
// we like the cars
function ltrimm (l) { return l.trim() }
test('dedupe finds the common scoped modules and moves it up one level', function (t) {
common.npm(
[
'find-dupes' // I actually found a use for this command!
],
EXEC_OPTS,
function (err, code, stdout, stderr) {
t.ifError(err, 'successful dry run against fake install')
t.notOk(code, 'npm ran without issue')
t.notOk(stderr, 'npm printed no errors')
t.same(
stdout.trim().replace(/\\/g, '/').split('\n').map(ltrimm),
body.map(ltrimm),
'got expected output'
)
t.end()
}
)
})
test('cleanup', function (t) {
cleanup()
t.end()
})
function setup (cb) {
cleanup()
mkdirp.sync(pkg)
fs.writeFileSync(
join(pkg, 'package.json'),
JSON.stringify(deduper, null, 2)
)
mkdirp.sync(join(modules, 'first'))
fs.writeFileSync(
join(modules, 'first', 'package.json'),
JSON.stringify(first, null, 2)
)
mkdirp.sync(join(modules, 'first', 'node_modules', 'firstUnique'))
fs.writeFileSync(
join(modules, 'first', 'node_modules', 'firstUnique', 'package.json'),
JSON.stringify(firstUnique, null, 2)
)
mkdirp.sync(join(modules, 'first', 'node_modules', '@scope', 'shared'))
fs.writeFileSync(
join(modules, 'first', 'node_modules', '@scope', 'shared', 'package.json'),
JSON.stringify(shared, null, 2)
)
mkdirp.sync(join(modules, 'second'))
fs.writeFileSync(
join(modules, 'second', 'package.json'),
JSON.stringify(second, null, 2)
)
mkdirp.sync(join(modules, 'second', 'node_modules', 'secondUnique'))
fs.writeFileSync(
join(modules, 'second', 'node_modules', 'secondUnique', 'package.json'),
JSON.stringify(secondUnique, null, 2)
)
mkdirp.sync(join(modules, 'second', 'node_modules', '@scope', 'shared'))
fs.writeFileSync(
join(modules, 'second', 'node_modules', '@scope', 'shared', 'package.json'),
JSON.stringify(shared, null, 2)
)
}
function cleanup () {
rimraf.sync(pkg)
}