%PDF- %PDF-
| Direktori : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/npm/test/lib/commands/ |
| Current File : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/npm/test/lib/commands/config.js |
const { join } = require('path')
const fs = require('fs/promises')
const ini = require('ini')
const tspawk = require('../../fixtures/tspawk')
const t = require('tap')
const spawk = tspawk(t)
const Sandbox = require('../../fixtures/sandbox.js')
t.test('config no args', async t => {
const sandbox = new Sandbox(t)
await t.rejects(
sandbox.run('config', []),
{
code: 'EUSAGE',
},
'rejects with usage'
)
})
t.test('config ignores workspaces', async t => {
const sandbox = new Sandbox(t)
await t.rejects(
sandbox.run('config', ['--workspaces']),
{
code: 'ENOWORKSPACES',
},
'rejects with usage'
)
})
t.test('config list', async t => {
const temp = t.testdir({
global: {
npmrc: 'globalloaded=yes',
},
project: {
'.npmrc': 'projectloaded=yes',
},
home: {
'.npmrc': 'userloaded=yes',
},
})
const global = join(temp, 'global')
const project = join(temp, 'project')
const home = join(temp, 'home')
const sandbox = new Sandbox(t, { global, project, home })
await sandbox.run('config', ['list'])
t.matchSnapshot(sandbox.output, 'output matches snapshot')
})
t.test('config list --long', async t => {
const temp = t.testdir({
global: {
npmrc: 'globalloaded=yes',
},
project: {
'.npmrc': 'projectloaded=yes',
},
home: {
'.npmrc': 'userloaded=yes',
},
})
const global = join(temp, 'global')
const project = join(temp, 'project')
const home = join(temp, 'home')
const sandbox = new Sandbox(t, { global, project, home })
await sandbox.run('config', ['list', '--long'])
t.matchSnapshot(sandbox.output, 'output matches snapshot')
})
t.test('config list --json', async t => {
const temp = t.testdir({
global: {
npmrc: 'globalloaded=yes',
},
project: {
'.npmrc': 'projectloaded=yes',
},
home: {
'.npmrc': 'userloaded=yes',
},
})
const global = join(temp, 'global')
const project = join(temp, 'project')
const home = join(temp, 'home')
const sandbox = new Sandbox(t, { global, project, home })
await sandbox.run('config', ['list', '--json'])
t.matchSnapshot(sandbox.output, 'output matches snapshot')
})
t.test('config list with publishConfig', async t => {
const temp = t.testdir({
project: {
'package.json': JSON.stringify({
publishConfig: {
registry: 'https://some.registry',
_authToken: 'mytoken',
},
}),
},
})
const project = join(temp, 'project')
const sandbox = new Sandbox(t, { project })
await sandbox.run('config', ['list', ''])
await sandbox.run('config', ['list', '--global'])
t.matchSnapshot(sandbox.output, 'output matches snapshot')
})
t.test('config delete no args', async t => {
const sandbox = new Sandbox(t)
await t.rejects(
sandbox.run('config', ['delete']),
{
code: 'EUSAGE',
},
'rejects with usage'
)
})
t.test('config delete single key', async t => {
// location defaults to user, so we work with a userconfig
const home = t.testdir({
'.npmrc': 'access=public\nall=true',
})
const sandbox = new Sandbox(t, { home })
await sandbox.run('config', ['delete', 'access'])
t.equal(sandbox.config.get('access'), null, 'acces should be defaulted')
const contents = await fs.readFile(join(home, '.npmrc'), { encoding: 'utf8' })
const rc = ini.parse(contents)
t.not(rc.access, 'access is not set')
})
t.test('config delete multiple keys', async t => {
const home = t.testdir({
'.npmrc': 'access=public\nall=true\naudit=false',
})
const sandbox = new Sandbox(t, { home })
await sandbox.run('config', ['delete', 'access', 'all'])
t.equal(sandbox.config.get('access'), null, 'access should be defaulted')
t.equal(sandbox.config.get('all'), false, 'all should be defaulted')
const contents = await fs.readFile(join(home, '.npmrc'), { encoding: 'utf8' })
const rc = ini.parse(contents)
t.not(rc.access, 'access is not set')
t.not(rc.all, 'all is not set')
})
t.test('config delete key --location=global', async t => {
const global = t.testdir({
npmrc: 'access=public\nall=true',
})
const sandbox = new Sandbox(t, { global })
await sandbox.run('config', ['delete', 'access', '--location=global'])
t.equal(sandbox.config.get('access', 'global'), undefined, 'access should be defaulted')
const contents = await fs.readFile(join(global, 'npmrc'), { encoding: 'utf8' })
const rc = ini.parse(contents)
t.not(rc.access, 'access is not set')
})
t.test('config delete key --global', async t => {
const global = t.testdir({
npmrc: 'access=public\nall=true',
})
const sandbox = new Sandbox(t, { global })
await sandbox.run('config', ['delete', 'access', '--global'])
t.equal(sandbox.config.get('access', 'global'), undefined, 'access should no longer be set')
const contents = await fs.readFile(join(global, 'npmrc'), { encoding: 'utf8' })
const rc = ini.parse(contents)
t.not(rc.access, 'access is not set')
})
t.test('config set invalid option', async t => {
const sandbox = new Sandbox(t)
await t.rejects(
sandbox.run('config', ['set', 'nonexistantconfigoption', 'something']),
/not a valid npm option/
)
})
t.test('config set deprecated option', async t => {
const sandbox = new Sandbox(t)
await t.rejects(
sandbox.run('config', ['set', 'shrinkwrap', 'true']),
/deprecated/
)
})
t.test('config set nerf-darted option', async t => {
const sandbox = new Sandbox(t)
await sandbox.run('config', ['set', '//npm.pkg.github.com/:_authToken', '0xdeadbeef'])
t.equal(
sandbox.config.get('//npm.pkg.github.com/:_authToken'),
'0xdeadbeef',
'nerf-darted config is set'
)
})
t.test('config set scoped optoin', async t => {
const sandbox = new Sandbox(t)
await sandbox.run('config', ['set', '@npm:registry', 'https://registry.npmjs.org'])
t.equal(
sandbox.config.get('@npm:registry'),
'https://registry.npmjs.org',
'scoped config is set'
)
})
t.test('config set no args', async t => {
const sandbox = new Sandbox(t)
await t.rejects(
sandbox.run('config', ['set']),
{
code: 'EUSAGE',
},
'rejects with usage'
)
})
t.test('config set key', async t => {
const home = t.testdir({
'.npmrc': 'access=public',
})
const sandbox = new Sandbox(t, { home })
await sandbox.run('config', ['set', 'access'])
t.equal(sandbox.config.get('access'), null, 'set the value for access')
await t.rejects(fs.stat(join(home, '.npmrc'), { encoding: 'utf8' }), 'removed empty config')
})
t.test('config set key value', async t => {
const home = t.testdir({
'.npmrc': 'access=public',
})
const sandbox = new Sandbox(t, { home })
await sandbox.run('config', ['set', 'access', 'restricted'])
t.equal(sandbox.config.get('access'), 'restricted', 'set the value for access')
const contents = await fs.readFile(join(home, '.npmrc'), { encoding: 'utf8' })
const rc = ini.parse(contents)
t.equal(rc.access, 'restricted', 'access is set to restricted')
})
t.test('config set key=value', async t => {
const home = t.testdir({
'.npmrc': 'access=public',
})
const sandbox = new Sandbox(t, { home })
await sandbox.run('config', ['set', 'access=restricted'])
t.equal(sandbox.config.get('access'), 'restricted', 'set the value for access')
const contents = await fs.readFile(join(home, '.npmrc'), { encoding: 'utf8' })
const rc = ini.parse(contents)
t.equal(rc.access, 'restricted', 'access is set to restricted')
})
t.test('config set key1 value1 key2=value2 key3', async t => {
const home = t.testdir({
'.npmrc': 'access=public\nall=true\naudit=true',
})
const sandbox = new Sandbox(t, { home })
await sandbox.run('config', ['set', 'access', 'restricted', 'all=false', 'audit'])
t.equal(sandbox.config.get('access'), 'restricted', 'access was set')
t.equal(sandbox.config.get('all'), false, 'all was set')
t.equal(sandbox.config.get('audit'), true, 'audit was unset and restored to its default')
const contents = await fs.readFile(join(home, '.npmrc'), { encoding: 'utf8' })
const rc = ini.parse(contents)
t.equal(rc.access, 'restricted', 'access is set to restricted')
t.equal(rc.all, false, 'all is set to false')
t.not(contents.includes('audit='), 'config file does not set audit')
})
t.test('config set invalid key logs warning', async t => {
const sandbox = new Sandbox(t)
// this doesn't reject, it only logs a warning
await sandbox.run('config', ['set', 'access=foo'])
t.match(
sandbox.logs.warn,
[['invalid config', 'access="foo"', `set in ${join(sandbox.home, '.npmrc')}`]],
'logged warning'
)
})
t.test('config set key=value --location=global', async t => {
const global = t.testdir({
npmrc: 'access=public\nall=true',
})
const sandbox = new Sandbox(t, { global })
await sandbox.run('config', ['set', 'access=restricted', '--location=global'])
t.equal(sandbox.config.get('access', 'global'), 'restricted', 'foo should be set')
const contents = await fs.readFile(join(global, 'npmrc'), { encoding: 'utf8' })
const rc = ini.parse(contents)
t.equal(rc.access, 'restricted', 'access is set to restricted')
})
t.test('config set key=value --global', async t => {
const global = t.testdir({
npmrc: 'access=public\nall=true',
})
const sandbox = new Sandbox(t, { global })
await sandbox.run('config', ['set', 'access=restricted', '--global'])
t.equal(sandbox.config.get('access', 'global'), 'restricted', 'access should be set')
const contents = await fs.readFile(join(global, 'npmrc'), { encoding: 'utf8' })
const rc = ini.parse(contents)
t.equal(rc.access, 'restricted', 'access is set to restricted')
})
t.test('config get no args', async t => {
const sandbox = new Sandbox(t)
await sandbox.run('config', ['get'])
const getOutput = sandbox.output
sandbox.reset()
await sandbox.run('config', ['list'])
const listOutput = sandbox.output
t.equal(listOutput, getOutput, 'get with no args outputs list')
})
t.test('config get single key', async t => {
const sandbox = new Sandbox(t)
await sandbox.run('config', ['get', 'all'])
t.equal(sandbox.output, `${sandbox.config.get('all')}`, 'should get the value')
})
t.test('config get multiple keys', async t => {
const sandbox = new Sandbox(t)
await sandbox.run('config', ['get', 'yes', 'all'])
t.ok(
sandbox.output.includes(`yes=${sandbox.config.get('yes')}`),
'outputs yes'
)
t.ok(
sandbox.output.includes(`all=${sandbox.config.get('all')}`),
'outputs all'
)
})
t.test('config get private key', async t => {
const sandbox = new Sandbox(t)
await t.rejects(
sandbox.run('config', ['get', '_authToken']),
/_authToken option is protected/,
'rejects with protected string'
)
await t.rejects(
sandbox.run('config', ['get', '//localhost:8080/:_password']),
/_password option is protected/,
'rejects with protected string'
)
})
t.test('config edit', async t => {
const home = t.testdir({
'.npmrc': 'foo=bar\nbar=baz',
})
const EDITOR = 'vim'
const editor = spawk.spawn(EDITOR).exit(0)
const sandbox = new Sandbox(t, { home, env: { EDITOR } })
await sandbox.run('config', ['edit'])
t.ok(editor.called, 'editor was spawned')
t.same(
editor.calledWith.args,
[join(sandbox.home, '.npmrc')],
'editor opened the user config file'
)
const contents = await fs.readFile(join(home, '.npmrc'), { encoding: 'utf8' })
t.ok(contents.includes('foo=bar'), 'kept foo')
t.ok(contents.includes('bar=baz'), 'kept bar')
t.ok(contents.includes('shown below with default values'), 'appends defaults to file')
})
t.test('config edit - editor exits non-0', async t => {
const EDITOR = 'vim'
const editor = spawk.spawn(EDITOR).exit(1)
const sandbox = new Sandbox(t)
sandbox.process.env.EDITOR = EDITOR
await t.rejects(
sandbox.run('config', ['edit']),
{
message: 'editor process exited with code: 1',
},
'rejects with error about editor code'
)
t.ok(editor.called, 'editor was spawned')
t.same(
editor.calledWith.args,
[join(sandbox.home, '.npmrc')],
'editor opened the user config file'
)
})
t.test('config fix', (t) => {
t.test('no problems', async (t) => {
const home = t.testdir({
'.npmrc': '',
})
const sandbox = new Sandbox(t, { home })
await sandbox.run('config', ['fix'])
t.equal(sandbox.output, '', 'printed nothing')
})
t.test('repairs all configs by default', async (t) => {
const root = t.testdir({
global: {
npmrc: '_authtoken=notatoken\n_authToken=afaketoken',
},
home: {
'.npmrc': '_authtoken=thisisinvalid\n_auth=beef',
},
})
const registry = `//registry.npmjs.org/`
const sandbox = new Sandbox(t, {
global: join(root, 'global'),
home: join(root, 'home'),
})
await sandbox.run('config', ['fix'])
// global config fixes
t.match(sandbox.output, '`_authtoken` deleted from global config',
'output has deleted global _authtoken')
t.match(sandbox.output, `\`_authToken\` renamed to \`${registry}:_authToken\` in global config`,
'output has renamed global _authToken')
t.not(sandbox.config.get('_authtoken', 'global'), '_authtoken is not set globally')
t.not(sandbox.config.get('_authToken', 'global'), '_authToken is not set globally')
t.equal(sandbox.config.get(`${registry}:_authToken`, 'global'), 'afaketoken',
'global _authToken was scoped')
const globalConfig = await fs.readFile(join(root, 'global', 'npmrc'), { encoding: 'utf8' })
t.equal(globalConfig, `${registry}:_authToken=afaketoken\n`, 'global config was written')
// user config fixes
t.match(sandbox.output, '`_authtoken` deleted from user config',
'output has deleted user _authtoken')
t.match(sandbox.output, `\`_auth\` renamed to \`${registry}:_auth\` in user config`,
'output has renamed user _auth')
t.not(sandbox.config.get('_authtoken', 'user'), '_authtoken is not set in user config')
t.not(sandbox.config.get('_auth'), '_auth is not set in user config')
t.equal(sandbox.config.get(`${registry}:_auth`, 'user'), 'beef', 'user _auth was scoped')
const userConfig = await fs.readFile(join(root, 'home', '.npmrc'), { encoding: 'utf8' })
t.equal(userConfig, `${registry}:_auth=beef\n`, 'user config was written')
})
t.test('repairs only the config specified by --location if asked', async (t) => {
const root = t.testdir({
global: {
npmrc: '_authtoken=notatoken\n_authToken=afaketoken',
},
home: {
'.npmrc': '_authtoken=thisisinvalid\n_auth=beef',
},
})
const registry = `//registry.npmjs.org/`
const sandbox = new Sandbox(t, {
global: join(root, 'global'),
home: join(root, 'home'),
})
await sandbox.run('config', ['fix', '--location=user'])
// global config should be untouched
t.notMatch(sandbox.output, '`_authtoken` deleted from global',
'output has deleted global _authtoken')
t.notMatch(sandbox.output, `\`_authToken\` renamed to \`${registry}:_authToken\` in global`,
'output has renamed global _authToken')
t.equal(sandbox.config.get('_authtoken', 'global'), 'notatoken', 'global _authtoken untouched')
t.equal(sandbox.config.get('_authToken', 'global'), 'afaketoken', 'global _authToken untouched')
t.not(sandbox.config.get(`${registry}:_authToken`, 'global'), 'global _authToken not scoped')
const globalConfig = await fs.readFile(join(root, 'global', 'npmrc'), { encoding: 'utf8' })
t.equal(globalConfig, '_authtoken=notatoken\n_authToken=afaketoken',
'global config was not written')
// user config fixes
t.match(sandbox.output, '`_authtoken` deleted from user',
'output has deleted user _authtoken')
t.match(sandbox.output, `\`_auth\` renamed to \`${registry}:_auth\` in user`,
'output has renamed user _auth')
t.not(sandbox.config.get('_authtoken', 'user'), '_authtoken is not set in user config')
t.not(sandbox.config.get('_auth', 'user'), '_auth is not set in user config')
t.equal(sandbox.config.get(`${registry}:_auth`, 'user'), 'beef', 'user _auth was scoped')
const userConfig = await fs.readFile(join(root, 'home', '.npmrc'), { encoding: 'utf8' })
t.equal(userConfig, `${registry}:_auth=beef\n`, 'user config was written')
})
t.end()
})
t.test('completion', async t => {
const sandbox = new Sandbox(t)
let allKeys
const testComp = async (argv, expect) => {
t.match(await sandbox.complete('config', argv), expect, argv.join(' '))
if (!allKeys) {
allKeys = Object.keys(sandbox.config.definitions)
}
sandbox.reset()
}
await testComp([], ['get', 'set', 'delete', 'ls', 'rm', 'edit', 'fix', 'list'])
await testComp(['set', 'foo'], [])
await testComp(['get'], allKeys)
await testComp(['set'], allKeys)
await testComp(['delete'], allKeys)
await testComp(['rm'], allKeys)
await testComp(['edit'], [])
await testComp(['fix'], [])
await testComp(['list'], [])
await testComp(['ls'], [])
const getCommand = await sandbox.complete('get')
t.match(getCommand, allKeys, 'also works for just npm get')
sandbox.reset()
const partial = await sandbox.complete('config', 'l')
t.match(partial, ['get', 'set', 'delete', 'ls', 'rm', 'edit'], 'and works on partials')
})