mirror of
https://github.com/pnpm/pnpm.git
synced 2026-03-25 02:21:52 -04:00
215 lines
5.9 KiB
TypeScript
215 lines
5.9 KiB
TypeScript
import isInnerLink = require('is-inner-link')
|
|
import loadJsonFile = require('load-json-file')
|
|
import path = require('path')
|
|
import exists = require('path-exists')
|
|
import sinon = require('sinon')
|
|
import {
|
|
install,
|
|
installPkgs,
|
|
link,
|
|
unlink,
|
|
unlinkPkgs,
|
|
} from 'supi'
|
|
import tape = require('tape')
|
|
import promisifyTape from 'tape-promise'
|
|
import writeJsonFile = require('write-json-file')
|
|
import {
|
|
addDistTag,
|
|
pathToLocalPkg,
|
|
prepare,
|
|
testDefaults,
|
|
} from './utils'
|
|
|
|
const test = promisifyTape(tape)
|
|
|
|
test('unlink 1 package that exists in package.json', async (t: tape.Test) => {
|
|
const project = prepare(t, {
|
|
dependencies: {
|
|
'is-positive': '^1.0.0',
|
|
'is-subdir': '^1.0.0',
|
|
},
|
|
})
|
|
process.chdir('..')
|
|
|
|
await Promise.all([
|
|
writeJsonFile('is-subdir/package.json', {
|
|
dependencies: {
|
|
'is-windows': '^1.0.0',
|
|
},
|
|
name: 'is-subdir',
|
|
version: '1.0.0',
|
|
}),
|
|
writeJsonFile('is-positive/package.json', {
|
|
name: 'is-positive',
|
|
version: '1.0.0',
|
|
}),
|
|
])
|
|
|
|
await link(['is-subdir', 'is-positive'], path.join('project', 'node_modules'), await testDefaults({prefix: path.resolve('project')}))
|
|
|
|
process.chdir('project')
|
|
|
|
await install(await testDefaults())
|
|
|
|
await unlinkPkgs(['is-subdir'], await testDefaults())
|
|
|
|
t.equal(typeof project.requireModule('is-subdir'), 'function', 'is-subdir installed after unlinked')
|
|
t.notOk((await isInnerLink('node_modules', 'is-positive')).isInner, 'is-positive left linked')
|
|
})
|
|
|
|
test("don't update package when unlinking", async (t: tape.Test) => {
|
|
const project = prepare(t)
|
|
|
|
await addDistTag('foo', '100.0.0', 'latest')
|
|
const opts = await testDefaults({prefix: process.cwd()})
|
|
await installPkgs(['foo'], opts)
|
|
|
|
process.chdir('..')
|
|
|
|
await writeJsonFile('foo/package.json', {
|
|
name: 'foo',
|
|
version: '100.0.0',
|
|
})
|
|
|
|
await link(['foo'], path.join('project', 'node_modules'), opts)
|
|
await addDistTag('foo', '100.1.0', 'latest')
|
|
|
|
process.chdir('project')
|
|
await unlinkPkgs(['foo'], opts)
|
|
|
|
t.equal(project.requireModule('foo/package.json').version, '100.0.0', 'foo not updated after unlink')
|
|
})
|
|
|
|
test("don't update package when unlinking. Initial link is done on a package w/o shrinkwrap.yaml", async (t: tape.Test) => {
|
|
const project = prepare(t, {
|
|
dependencies: {
|
|
foo: '^100.0.0',
|
|
},
|
|
})
|
|
|
|
const opts = await testDefaults({prefix: process.cwd()})
|
|
process.chdir('..')
|
|
|
|
await writeJsonFile('foo/package.json', {
|
|
name: 'foo',
|
|
version: '100.0.0',
|
|
})
|
|
|
|
await link(['foo'], path.join('project', 'node_modules'), opts)
|
|
await addDistTag('foo', '100.1.0', 'latest')
|
|
|
|
process.chdir('project')
|
|
await unlinkPkgs(['foo'], opts)
|
|
|
|
t.equal(project.requireModule('foo/package.json').version, '100.1.0', 'latest foo is installed')
|
|
t.deepEqual((await loadJsonFile('./package.json')).dependencies, {foo: '^100.0.0'}, 'package.json not updated')
|
|
})
|
|
|
|
test('unlink 2 packages. One of them exists in package.json', async (t: tape.Test) => {
|
|
const project = prepare(t, {
|
|
dependencies: {
|
|
'is-subdir': '^1.0.0',
|
|
},
|
|
})
|
|
const opts = await testDefaults({prefix: process.cwd()})
|
|
process.chdir('..')
|
|
|
|
await Promise.all([
|
|
writeJsonFile('is-subdir/package.json', {
|
|
dependencies: {
|
|
'is-windows': '^1.0.0',
|
|
},
|
|
name: 'is-subdir',
|
|
version: '1.0.0',
|
|
}),
|
|
writeJsonFile('is-positive/package.json', {
|
|
name: 'is-positive',
|
|
version: '1.0.0',
|
|
}),
|
|
])
|
|
|
|
await link(['is-subdir', 'is-positive'], path.join('project', 'node_modules'), opts)
|
|
|
|
process.chdir('project')
|
|
await unlinkPkgs(['is-subdir', 'is-positive'], opts)
|
|
|
|
t.equal(typeof project.requireModule('is-subdir'), 'function', 'is-subdir installed after unlinked')
|
|
t.notOk(await exists(path.join('node_modules', 'is-positive')), 'is-positive removed as it is not in package.json')
|
|
})
|
|
|
|
test('unlink all packages', async (t: tape.Test) => {
|
|
const project = prepare(t, {
|
|
dependencies: {
|
|
'@zkochan/logger': '^0.1.0',
|
|
'is-subdir': '^1.0.0',
|
|
},
|
|
})
|
|
const opts = await testDefaults({prefix: process.cwd()})
|
|
process.chdir('..')
|
|
|
|
await Promise.all([
|
|
writeJsonFile('is-subdir/package.json', {
|
|
dependencies: {
|
|
'is-windows': '^1.0.0',
|
|
},
|
|
name: 'is-subdir',
|
|
version: '1.0.0',
|
|
}),
|
|
writeJsonFile('logger/package.json', {
|
|
name: '@zkochan/logger',
|
|
version: '0.1.0',
|
|
}),
|
|
])
|
|
|
|
await link(['is-subdir', 'logger'], path.join('project', 'node_modules'), opts)
|
|
|
|
await unlink(opts)
|
|
|
|
t.equal(typeof project.requireModule('is-subdir'), 'function', 'is-subdir installed after unlinked')
|
|
t.equal(typeof project.requireModule('@zkochan/logger'), 'object', '@zkochan/logger installed after unlinked')
|
|
})
|
|
|
|
test("don't warn about scoped packages when running unlink w/o params", async (t: tape.Test) => {
|
|
const project = prepare(t)
|
|
|
|
await installPkgs(['@zkochan/logger'], await testDefaults())
|
|
|
|
const reporter = sinon.spy()
|
|
await unlink(await testDefaults({reporter}))
|
|
|
|
t.notOk(reporter.calledWithMatch({
|
|
level: 'warn',
|
|
message: '@zkochan/logger is not an external link',
|
|
}), 'not reported warning')
|
|
})
|
|
|
|
test("don't unlink package that is not a link", async (t: tape.Test) => {
|
|
const project = prepare(t)
|
|
|
|
const reporter = sinon.spy()
|
|
|
|
await installPkgs(['is-positive'], await testDefaults())
|
|
|
|
await unlinkPkgs(['is-positive'], await testDefaults({reporter}))
|
|
|
|
t.ok(reporter.calledWithMatch({
|
|
level: 'warn',
|
|
message: 'is-positive is not an external link',
|
|
}), 'reported warning')
|
|
})
|
|
|
|
test("don't unlink package that is not a link when independent-leaves = true", async (t: tape.Test) => {
|
|
const project = prepare(t)
|
|
|
|
const reporter = sinon.spy()
|
|
|
|
await installPkgs(['is-positive'], await testDefaults({independentLeaves: true}))
|
|
|
|
await unlinkPkgs(['is-positive'], await testDefaults({independentLeaves: true, reporter}))
|
|
|
|
t.ok(reporter.calledWithMatch({
|
|
level: 'warn',
|
|
message: 'is-positive is not an external link',
|
|
}), 'reported warning')
|
|
})
|