mirror of
https://github.com/pnpm/pnpm.git
synced 2026-03-25 10:31:55 -04:00
224 lines
5.8 KiB
TypeScript
224 lines
5.8 KiB
TypeScript
import RegClient = require('anonymous-npm-registry-client')
|
|
import path = require('path')
|
|
import registryMock = require('pnpm-registry-mock')
|
|
import rimraf = require('rimraf-then')
|
|
import {install, installPkgs} from 'supi'
|
|
import tape = require('tape')
|
|
import promisifyTape from 'tape-promise'
|
|
import {
|
|
prepare,
|
|
testDefaults,
|
|
} from '../utils'
|
|
|
|
const test = promisifyTape(tape)
|
|
|
|
test('a package that need authentication', async (t: tape.Test) => {
|
|
const project = prepare(t)
|
|
|
|
const client = new RegClient()
|
|
|
|
const data = await new Promise((resolve, reject) => {
|
|
client.adduser('http://localhost:4873', {
|
|
auth: {
|
|
email: 'foo@bar.com',
|
|
password: 'bar',
|
|
username: 'foo',
|
|
},
|
|
}, (err: Error, d: object) => err ? reject(err) : resolve(d))
|
|
}) as {token: string}
|
|
|
|
let rawNpmConfig = {
|
|
'//localhost:4873/:_authToken': data.token,
|
|
'registry': 'http://localhost:4873/',
|
|
}
|
|
await installPkgs(['needs-auth'], await testDefaults({}, {
|
|
rawNpmConfig,
|
|
}, {
|
|
rawNpmConfig,
|
|
}))
|
|
|
|
const m = project.requireModule('needs-auth')
|
|
|
|
t.ok(typeof m === 'function', 'needs-auth() is available')
|
|
|
|
// should work when a shrinkwrap is available
|
|
// and the registry in .npmrc is not the same as the one in shrinkwrap
|
|
await rimraf('node_modules')
|
|
await rimraf(path.join('..', '.store'))
|
|
|
|
rawNpmConfig = {
|
|
'//localhost:4873/:_authToken': data.token,
|
|
'registry': 'https://registry.npmjs.org/',
|
|
}
|
|
await installPkgs(['needs-auth'], await testDefaults({}, {
|
|
rawNpmConfig,
|
|
registry: 'https://registry.npmjs.org/',
|
|
}, {
|
|
rawNpmConfig,
|
|
}))
|
|
|
|
await project.has('needs-auth')
|
|
})
|
|
|
|
test('a package that need authentication, legacy way', async (t: tape.Test) => {
|
|
const project = prepare(t)
|
|
|
|
const client = new RegClient()
|
|
|
|
const data = await new Promise((resolve, reject) => {
|
|
client.adduser('http://localhost:4873', {
|
|
auth: {
|
|
email: 'foo@bar.com',
|
|
password: 'bar',
|
|
username: 'foo',
|
|
},
|
|
}, (err: Error, d: object) => err ? reject(err) : resolve(d))
|
|
})
|
|
|
|
const rawNpmConfig = {
|
|
'_auth': 'Zm9vOmJhcg==', // base64 encoded foo:bar
|
|
'always-auth': true,
|
|
'registry': 'http://localhost:4873',
|
|
}
|
|
await installPkgs(['needs-auth'], await testDefaults({}, {
|
|
rawNpmConfig,
|
|
}, {
|
|
rawNpmConfig,
|
|
}))
|
|
|
|
const m = project.requireModule('needs-auth')
|
|
|
|
t.ok(typeof m === 'function', 'needs-auth() is available')
|
|
})
|
|
|
|
test('a scoped package that need authentication specific to scope', async (t: tape.Test) => {
|
|
const project = prepare(t)
|
|
|
|
const client = new RegClient()
|
|
|
|
const data = await new Promise((resolve, reject) => {
|
|
client.adduser('http://localhost:4873', {
|
|
auth: {
|
|
email: 'foo@bar.com',
|
|
password: 'bar',
|
|
username: 'foo',
|
|
},
|
|
}, (err: Error, d: object) => err ? reject(err) : resolve(d))
|
|
}) as {token: string}
|
|
|
|
const rawNpmConfig = {
|
|
'//localhost:4873/:_authToken': data.token,
|
|
'@private:registry': 'http://localhost:4873/',
|
|
'registry': 'https://registry.npmjs.org/',
|
|
}
|
|
let opts = await testDefaults({}, {
|
|
rawNpmConfig,
|
|
registry: 'https://registry.npmjs.org/',
|
|
}, {
|
|
rawNpmConfig,
|
|
})
|
|
await installPkgs(['@private/foo'], opts)
|
|
|
|
await project.has('@private/foo')
|
|
|
|
// should work when a shrinkwrap is available
|
|
await rimraf('node_modules')
|
|
await rimraf(path.join('..', '.store'))
|
|
|
|
// Recreating options to have a new storeController with clean cache
|
|
opts = await testDefaults({}, {
|
|
rawNpmConfig,
|
|
registry: 'https://registry.npmjs.org/',
|
|
}, {
|
|
rawNpmConfig,
|
|
})
|
|
await installPkgs(['@private/foo'], opts)
|
|
|
|
await project.has('@private/foo')
|
|
})
|
|
|
|
test('a package that need authentication reuses authorization tokens for tarball fetching', async (t: tape.Test) => {
|
|
const project = prepare(t)
|
|
|
|
const client = new RegClient()
|
|
|
|
const data = await new Promise((resolve, reject) => {
|
|
client.adduser('http://localhost:4873', {
|
|
auth: {
|
|
email: 'foo@bar.com',
|
|
password: 'bar',
|
|
username: 'foo',
|
|
},
|
|
}, (err: Error, d: object) => err ? reject(err) : resolve(d))
|
|
}) as {token: string}
|
|
|
|
const rawNpmConfig = {
|
|
'//127.0.0.1:4873/:_authToken': data.token,
|
|
'//127.0.0.1:4873/:always-auth': true,
|
|
'registry': 'http://127.0.0.1:4873',
|
|
}
|
|
await installPkgs(['needs-auth'], await testDefaults({
|
|
registry: 'http://127.0.0.1:4873',
|
|
}, {
|
|
rawNpmConfig,
|
|
registry: 'http://127.0.0.1:4873',
|
|
}, {
|
|
rawNpmConfig,
|
|
}))
|
|
|
|
const m = project.requireModule('needs-auth')
|
|
|
|
t.ok(typeof m === 'function', 'needs-auth() is available')
|
|
})
|
|
|
|
test('a package that need authentication reuses authorization tokens for tarball fetching when meta info is cached', async (t: tape.Test) => {
|
|
const project = prepare(t)
|
|
|
|
const client = new RegClient()
|
|
|
|
const data = await new Promise((resolve, reject) => {
|
|
client.adduser('http://localhost:4873', {
|
|
auth: {
|
|
email: 'foo@bar.com',
|
|
password: 'bar',
|
|
username: 'foo',
|
|
},
|
|
}, (err: Error, d: object) => err ? reject(err) : resolve(d))
|
|
}) as {token: string}
|
|
|
|
const rawNpmConfig = {
|
|
'//127.0.0.1:4873/:_authToken': data.token,
|
|
'//127.0.0.1:4873/:always-auth': true,
|
|
'registry': 'http://127.0.0.1:4873',
|
|
}
|
|
let opts = await testDefaults({
|
|
registry: 'http://127.0.0.1:4873',
|
|
}, {
|
|
rawNpmConfig,
|
|
registry: 'http://127.0.0.1:4873',
|
|
}, {
|
|
rawNpmConfig,
|
|
})
|
|
|
|
await installPkgs(['needs-auth'], opts)
|
|
|
|
await rimraf('node_modules')
|
|
await rimraf(path.join('..', '.registry'))
|
|
await rimraf(path.join('..', '.store'))
|
|
|
|
// Recreating options to clean store cache
|
|
opts = await testDefaults({
|
|
registry: 'http://127.0.0.1:4873',
|
|
}, {
|
|
rawNpmConfig,
|
|
registry: 'http://127.0.0.1:4873',
|
|
}, {
|
|
rawNpmConfig,
|
|
})
|
|
await install(opts)
|
|
|
|
const m = project.requireModule('needs-auth')
|
|
|
|
t.ok(typeof m === 'function', 'needs-auth() is available')
|
|
})
|