mirror of
https://github.com/pnpm/pnpm.git
synced 2026-01-06 05:58:20 -05:00
248 lines
6.5 KiB
TypeScript
248 lines
6.5 KiB
TypeScript
import path from 'path'
|
|
import { prepareEmpty } from '@pnpm/prepare'
|
|
import { addUser, REGISTRY_MOCK_PORT } from '@pnpm/registry-mock'
|
|
import { addDependenciesToPackage, install } from '@pnpm/core'
|
|
import { sync as rimraf } from '@zkochan/rimraf'
|
|
import { testDefaults } from '../utils'
|
|
|
|
const skipOnNode17 = ['v14', 'v16'].includes(process.version.split('.')[0]) ? test : test.skip
|
|
|
|
test('a package that need authentication', async () => {
|
|
const project = prepareEmpty()
|
|
|
|
const data = await addUser({
|
|
email: 'foo@bar.com',
|
|
password: 'bar',
|
|
username: 'foo',
|
|
})
|
|
|
|
let authConfig = {
|
|
[`//localhost:${REGISTRY_MOCK_PORT}/:_authToken`]: data.token,
|
|
registry: `http://localhost:${REGISTRY_MOCK_PORT}/`,
|
|
}
|
|
const { updatedManifest: manifest } = await addDependenciesToPackage({}, ['@pnpm.e2e/needs-auth'], testDefaults({}, {
|
|
authConfig,
|
|
}, {
|
|
authConfig,
|
|
}))
|
|
|
|
project.has('@pnpm.e2e/needs-auth')
|
|
|
|
// should work when a lockfile is available
|
|
// and the registry in .npmrc is not the same as the one in lockfile
|
|
rimraf('node_modules')
|
|
rimraf(path.join('..', '.store'))
|
|
|
|
authConfig = {
|
|
[`//localhost:${REGISTRY_MOCK_PORT}/:_authToken`]: data.token,
|
|
registry: 'https://registry.npmjs.org/',
|
|
}
|
|
await addDependenciesToPackage(manifest, ['@pnpm.e2e/needs-auth'], testDefaults({}, {
|
|
authConfig,
|
|
registry: 'https://registry.npmjs.org/',
|
|
}, {
|
|
authConfig,
|
|
}))
|
|
|
|
project.has('@pnpm.e2e/needs-auth')
|
|
})
|
|
|
|
test('installing a package that need authentication, using password', async () => {
|
|
const project = prepareEmpty()
|
|
|
|
await addUser({
|
|
email: 'foo@bar.com',
|
|
password: 'bar',
|
|
username: 'foo',
|
|
})
|
|
|
|
const encodedPassword = Buffer.from('bar').toString('base64')
|
|
const authConfig = {
|
|
[`//localhost:${REGISTRY_MOCK_PORT}/:_password`]: encodedPassword,
|
|
[`//localhost:${REGISTRY_MOCK_PORT}/:username`]: 'foo',
|
|
registry: `http://localhost:${REGISTRY_MOCK_PORT}/`,
|
|
}
|
|
await addDependenciesToPackage({}, ['@pnpm.e2e/needs-auth'], testDefaults({}, {
|
|
authConfig,
|
|
}, {
|
|
authConfig,
|
|
}))
|
|
|
|
project.has('@pnpm.e2e/needs-auth')
|
|
})
|
|
|
|
test('a package that need authentication, legacy way', async () => {
|
|
const project = prepareEmpty()
|
|
|
|
await addUser({
|
|
email: 'foo@bar.com',
|
|
password: 'bar',
|
|
username: 'foo',
|
|
})
|
|
|
|
const authConfig = {
|
|
_auth: 'Zm9vOmJhcg==', // base64 encoded foo:bar
|
|
registry: `http://localhost:${REGISTRY_MOCK_PORT}`,
|
|
}
|
|
await addDependenciesToPackage({}, ['@pnpm.e2e/needs-auth'], testDefaults({}, {
|
|
authConfig,
|
|
}, {
|
|
authConfig,
|
|
}))
|
|
|
|
project.has('@pnpm.e2e/needs-auth')
|
|
})
|
|
|
|
test('a scoped package that need authentication specific to scope', async () => {
|
|
const project = prepareEmpty()
|
|
|
|
const data = await addUser({
|
|
email: 'foo@bar.com',
|
|
password: 'bar',
|
|
username: 'foo',
|
|
})
|
|
|
|
const authConfig = {
|
|
[`//localhost:${REGISTRY_MOCK_PORT}/:_authToken`]: data.token,
|
|
'@private:registry': `http://localhost:${REGISTRY_MOCK_PORT}/`,
|
|
registry: 'https://registry.npmjs.org/',
|
|
}
|
|
let opts = testDefaults({}, {
|
|
authConfig,
|
|
registry: 'https://registry.npmjs.org/',
|
|
}, {
|
|
authConfig,
|
|
})
|
|
const { updatedManifest: manifest } = await addDependenciesToPackage({}, ['@private/foo'], opts)
|
|
|
|
project.has('@private/foo')
|
|
|
|
// should work when a lockfile is available
|
|
rimraf('node_modules')
|
|
rimraf(path.join('..', '.store'))
|
|
|
|
// Recreating options to have a new storeController with clean cache
|
|
opts = testDefaults({}, {
|
|
authConfig,
|
|
registry: 'https://registry.npmjs.org/',
|
|
}, {
|
|
authConfig,
|
|
})
|
|
await addDependenciesToPackage(manifest, ['@private/foo'], opts)
|
|
|
|
project.has('@private/foo')
|
|
})
|
|
|
|
test('a scoped package that need legacy authentication specific to scope', async () => {
|
|
const project = prepareEmpty()
|
|
|
|
await addUser({
|
|
email: 'foo@bar.com',
|
|
password: 'bar',
|
|
username: 'foo',
|
|
})
|
|
|
|
const authConfig = {
|
|
[`//localhost:${REGISTRY_MOCK_PORT}/:_auth`]: 'Zm9vOmJhcg==', // base64 encoded foo:bar
|
|
'@private:registry': `http://localhost:${REGISTRY_MOCK_PORT}/`,
|
|
registry: 'https://registry.npmjs.org/',
|
|
}
|
|
let opts = testDefaults({}, {
|
|
authConfig,
|
|
registry: 'https://registry.npmjs.org/',
|
|
}, {
|
|
authConfig,
|
|
})
|
|
const { updatedManifest: manifest } = await addDependenciesToPackage({}, ['@private/foo'], opts)
|
|
|
|
project.has('@private/foo')
|
|
|
|
// should work when a lockfile is available
|
|
rimraf('node_modules')
|
|
rimraf(path.join('..', '.store'))
|
|
|
|
// Recreating options to have a new storeController with clean cache
|
|
opts = testDefaults({}, {
|
|
authConfig,
|
|
registry: 'https://registry.npmjs.org/',
|
|
}, {
|
|
authConfig,
|
|
})
|
|
await addDependenciesToPackage(manifest, ['@private/foo'], opts)
|
|
|
|
project.has('@private/foo')
|
|
})
|
|
|
|
skipOnNode17('a package that need authentication reuses authorization tokens for tarball fetching', async () => {
|
|
const project = prepareEmpty()
|
|
|
|
const data = await addUser({
|
|
email: 'foo@bar.com',
|
|
password: 'bar',
|
|
username: 'foo',
|
|
})
|
|
|
|
const authConfig = {
|
|
[`//127.0.0.1:${REGISTRY_MOCK_PORT}/:_authToken`]: data.token,
|
|
registry: `http://127.0.0.1:${REGISTRY_MOCK_PORT}`,
|
|
}
|
|
await addDependenciesToPackage({}, ['@pnpm.e2e/needs-auth'], testDefaults({
|
|
registries: {
|
|
default: `http://127.0.0.1:${REGISTRY_MOCK_PORT}`,
|
|
},
|
|
}, {
|
|
authConfig,
|
|
registry: `http://127.0.0.1:${REGISTRY_MOCK_PORT}`,
|
|
}, {
|
|
authConfig,
|
|
}))
|
|
|
|
project.has('@pnpm.e2e/needs-auth')
|
|
})
|
|
|
|
skipOnNode17('a package that need authentication reuses authorization tokens for tarball fetching when meta info is cached', async () => {
|
|
const project = prepareEmpty()
|
|
|
|
const data = await addUser({
|
|
email: 'foo@bar.com',
|
|
password: 'bar',
|
|
username: 'foo',
|
|
})
|
|
|
|
const authConfig = {
|
|
[`//127.0.0.1:${REGISTRY_MOCK_PORT}/:_authToken`]: data.token,
|
|
registry: `http://127.0.0.1:${REGISTRY_MOCK_PORT}`,
|
|
}
|
|
let opts = testDefaults({
|
|
registries: {
|
|
default: `http://127.0.0.1:${REGISTRY_MOCK_PORT}`,
|
|
},
|
|
}, {
|
|
authConfig,
|
|
registry: `http://127.0.0.1:${REGISTRY_MOCK_PORT}`,
|
|
}, {
|
|
authConfig,
|
|
})
|
|
|
|
const { updatedManifest: manifest } = await addDependenciesToPackage({}, ['@pnpm.e2e/needs-auth'], opts)
|
|
|
|
rimraf('node_modules')
|
|
rimraf(path.join('..', '.registry'))
|
|
rimraf(path.join('..', '.store'))
|
|
|
|
// Recreating options to clean store cache
|
|
opts = testDefaults({
|
|
registries: {
|
|
default: `http://127.0.0.1:${REGISTRY_MOCK_PORT}`,
|
|
},
|
|
}, {
|
|
authConfig,
|
|
registry: `http://127.0.0.1:${REGISTRY_MOCK_PORT}`,
|
|
}, {
|
|
authConfig,
|
|
})
|
|
await install(manifest, opts)
|
|
|
|
project.has('@pnpm.e2e/needs-auth')
|
|
})
|