mirror of https://github.com/nodejs/node.git
118 lines
2.9 KiB
JavaScript
118 lines
2.9 KiB
JavaScript
'use strict'
|
|
|
|
const BB = require('bluebird')
|
|
|
|
const common = require('../common-tap.js')
|
|
const fs = BB.promisifyAll(require('fs'))
|
|
const path = require('path')
|
|
const rimraf = BB.promisify(require('rimraf'))
|
|
const test = require('tap').test
|
|
const Tacks = require('tacks')
|
|
|
|
const File = Tacks.File
|
|
const Dir = Tacks.Dir
|
|
|
|
const testDir = path.resolve(__dirname, path.basename(__filename, '.js'))
|
|
const modAdir = path.resolve(testDir, 'modA')
|
|
const modBdir = path.resolve(testDir, 'modB')
|
|
const modCdir = path.resolve(testDir, 'modC')
|
|
|
|
test('conflicts in shrinkwrap are auto-resolved on install', (t) => {
|
|
const fixture = new Tacks(Dir({
|
|
'package.json': File({
|
|
name: 'foo',
|
|
dependencies: {
|
|
modA: 'file://' + modAdir,
|
|
modB: 'file://' + modBdir
|
|
},
|
|
devDependencies: {
|
|
modC: 'file://' + modCdir
|
|
}
|
|
}),
|
|
'npm-shrinkwrap.json': File(
|
|
`
|
|
{
|
|
"name": "foo",
|
|
"requires": true,
|
|
"lockfileVersion": 1,
|
|
"dependencies": {
|
|
<<` + `<<` + `<<` + `< HEAD
|
|
"modA": {
|
|
"version": "file:modA"
|
|
||` + `||` + `||` + `| merged common ancestors
|
|
"modB": {
|
|
"version": "file:modB"
|
|
==` + `==` + `==` + `=
|
|
"modC": {
|
|
"version": "file:modC",
|
|
"dev": true
|
|
>>` + `>>` + `>>` + `> branch
|
|
}
|
|
}
|
|
}
|
|
`),
|
|
'modA': Dir({
|
|
'package.json': File({
|
|
name: 'modA',
|
|
version: '1.0.0'
|
|
})
|
|
}),
|
|
'modB': Dir({
|
|
'package.json': File({
|
|
name: 'modB',
|
|
version: '1.0.0'
|
|
})
|
|
}),
|
|
'modC': Dir({
|
|
'package.json': File({
|
|
name: 'modC',
|
|
version: '1.0.0'
|
|
})
|
|
})
|
|
}))
|
|
fixture.create(testDir)
|
|
function readJson (file) {
|
|
return fs.readFileAsync(path.join(testDir, file)).then(JSON.parse)
|
|
}
|
|
return BB.fromNode((cb) => {
|
|
common.npm([
|
|
'install',
|
|
'--loglevel', 'warn'
|
|
], {cwd: testDir}, (err, code, out, stderr) => {
|
|
t.comment(stderr)
|
|
t.match(stderr, /warn.*conflict/gi, 'warns about a conflict')
|
|
cb(err || (code && new Error('non-zero exit code')) || null, out)
|
|
})
|
|
})
|
|
.then(() => BB.join(
|
|
readJson('npm-shrinkwrap.json'),
|
|
readJson('node_modules/modA/package.json'),
|
|
readJson('node_modules/modB/package.json'),
|
|
readJson('node_modules/modC/package.json'),
|
|
(lockfile, A, B, C) => {
|
|
t.deepEqual(lockfile, {
|
|
name: 'foo',
|
|
requires: true,
|
|
lockfileVersion: 1,
|
|
dependencies: {
|
|
modA: {
|
|
version: 'file:modA'
|
|
},
|
|
modB: {
|
|
version: 'file:modB'
|
|
},
|
|
modC: {
|
|
version: 'file:modC',
|
|
dev: true
|
|
}
|
|
}
|
|
}, 'resolved lockfile matches expectations')
|
|
t.equal(A.name, 'modA', 'installed modA')
|
|
t.equal(B.name, 'modB', 'installed modB')
|
|
t.equal(C.name, 'modC', 'installed modC')
|
|
}
|
|
))
|
|
})
|
|
|
|
test('cleanup', () => rimraf(testDir))
|