feat: support scoped client certificates (#7626)

close #7427

---------

Co-authored-by: Zoltan Kochan <z@kochan.io>
This commit is contained in:
Nacho Aldama
2024-02-14 12:11:12 +01:00
committed by GitHub
parent 57424e77b0
commit 7733f3a943
30 changed files with 446 additions and 286 deletions

View File

@@ -0,0 +1,25 @@
---
"@pnpm/plugin-commands-store-inspecting": minor
"@pnpm/plugin-commands-publishing": minor
"@pnpm/resolve-dependencies": minor
"@pnpm/store-connection-manager": minor
"@pnpm/plugin-commands-rebuild": minor
"@pnpm/plugin-commands-env": minor
"@pnpm/client": minor
"@pnpm/core": minor
"@pnpm/types": minor
"@pnpm/config": minor
"@pnpm/fetch": minor
"pnpm": minor
---
Added support for registry-scoped SSL configurations (cert, key, and ca). Three new settings supported: `<registryURL>:certfile`, `<registryURL>:keyfile`, and `<registryURL>:ca`. For instance:
```
//registry.mycomp.com/:certfile=server-cert.pem
//registry.mycomp.com/:keyfile=server-key.pem
//registry.mycomp.com/:cafile=client-cert.pem
```
Related issue: [#7427](https://github.com/pnpm/pnpm/issues/7427).
Related PR: [#7626](https://github.com/pnpm/pnpm/pull/7626).

View File

@@ -3,6 +3,7 @@ import {
type ProjectManifest,
type ProjectsGraph,
type Registries,
type SslConfig,
} from '@pnpm/types'
import type { Hooks } from '@pnpm/pnpmfile'
@@ -166,6 +167,7 @@ export interface Config {
packGzipLevel?: number
registries: Registries
sslConfigs: Record<string, SslConfig>
ignoreWorkspaceRootCheck: boolean
workspaceRoot: boolean

View File

@@ -0,0 +1,36 @@
import { type SslConfig } from '@pnpm/types'
import normalizeRegistryUrl from 'normalize-registry-url'
import fs from 'fs'
export interface GetNetworkConfigsResult {
sslConfigs: Record<string, SslConfig>
registries: Record<string, string>
}
export function getNetworkConfigs (rawConfig: Record<string, object>): GetNetworkConfigsResult {
// Get all the auth options that have :certfile or :keyfile in their name
const sslConfigs: Record<string, SslConfig> = {}
const registries: Record<string, string> = {}
for (const [configKey, value] of Object.entries(rawConfig)) {
if (configKey[0] === '@' && configKey.endsWith(':registry')) {
registries[configKey.slice(0, configKey.indexOf(':'))] = normalizeRegistryUrl(value as unknown as string)
} else if (configKey.includes(':certfile') || configKey.includes(':keyfile') || configKey.includes(':cafile')) {
// Split by '/:' because the registry may contain a port
const registry = configKey.split('/:')[0] + '/'
if (!sslConfigs[registry]) {
sslConfigs[registry] = { cert: '', key: '' }
}
if (configKey.includes(':certfile')) {
sslConfigs[registry].cert = fs.readFileSync(value as unknown as string, 'utf8')
} else if (configKey.includes(':keyfile')) {
sslConfigs[registry].key = fs.readFileSync(value as unknown as string, 'utf8')
} else if (configKey.includes(':cafile')) {
sslConfigs[registry].ca = fs.readFileSync(value as unknown as string, 'utf8')
}
}
}
return {
registries,
sslConfigs,
}
}

View File

@@ -1,11 +0,0 @@
import normalizeRegistryUrl from 'normalize-registry-url'
export function getScopeRegistries (rawConfig: Record<string, object>) {
const registries: Record<string, string> = {}
for (const configKey of Object.keys(rawConfig)) {
if (configKey[0] === '@' && configKey.endsWith(':registry')) {
registries[configKey.slice(0, configKey.indexOf(':'))] = normalizeRegistryUrl(rawConfig[configKey] as unknown as string)
}
}
return registries
}

View File

@@ -16,7 +16,7 @@ import realpathMissing from 'realpath-missing'
import pathAbsolute from 'path-absolute'
import which from 'which'
import { checkGlobalBinDir } from './checkGlobalBinDir'
import { getScopeRegistries } from './getScopeRegistries'
import { getNetworkConfigs } from './getNetworkConfigs'
import { getCacheDir, getConfigDir, getDataDir, getStateDir } from './dirs'
import {
type Config,
@@ -319,10 +319,12 @@ export async function getConfig (
cliOptions,
{ 'user-agent': pnpmConfig.userAgent },
] as any) // eslint-disable-line @typescript-eslint/no-explicit-any
const networkConfigs = getNetworkConfigs(pnpmConfig.rawConfig)
pnpmConfig.registries = {
default: normalizeRegistryUrl(pnpmConfig.rawConfig.registry),
...getScopeRegistries(pnpmConfig.rawConfig),
...networkConfigs.registries,
}
pnpmConfig.sslConfigs = networkConfigs.sslConfigs
pnpmConfig.useLockfile = (() => {
if (typeof pnpmConfig.lockfile === 'boolean') return pnpmConfig.lockfile
if (typeof pnpmConfig.packageLock === 'boolean') return pnpmConfig.packageLock

View File

@@ -1,5 +1,6 @@
{
"words": [
"TLSV",
"adduser",
"adipiscing",
"amet",
@@ -24,6 +25,7 @@
"cafs",
"camelcase",
"canonicalizer",
"certfile",
"clonedeep",
"cmds",
"colorterm",
@@ -120,6 +122,7 @@
"mintimeout",
"monorepolint",
"mountpoint",
"mycomp",
"mycompany",
"myorg",
"mypackage",

View File

@@ -31,7 +31,7 @@ export type NvmNodeCommandOptions = Pick<Config,
| 'storeDir'
| 'useNodeVersion'
| 'pnpmHomeDir'
> & Partial<Pick<Config, 'configDir' | 'cliOptions'>> & {
> & Partial<Pick<Config, 'configDir' | 'cliOptions' | 'sslConfigs'>> & {
remote?: boolean
}

View File

@@ -6,7 +6,7 @@ import { type StoreController } from '@pnpm/store-controller-types'
import { type Registries } from '@pnpm/types'
import loadJsonFile from 'load-json-file'
export interface StrictRebuildOptions {
export type StrictRebuildOptions = {
autoInstallPeers: boolean
cacheDir: string
childConcurrency: number
@@ -48,7 +48,7 @@ export interface StrictRebuildOptions {
deployAllFiles: boolean
neverBuiltDependencies?: string[]
onlyBuiltDependencies?: string[]
}
} & Pick<Config, 'sslConfigs'>
export type RebuildOptions = Partial<StrictRebuildOptions> &
Pick<StrictRebuildOptions, 'storeDir' | 'storeController'> & Pick<Config, 'rootProjectManifest' | 'rootProjectManifestDir'>

View File

@@ -34,20 +34,17 @@ export function createFuseHandlersFromLockfile (lockfile: Lockfile, cafsDir: str
open (p: string, flags: string | number, cb: (exitCode: number, fd?: number) => void) {
const dirEnt = getDirEnt(p)
if (dirEnt?.entryType !== 'index') {
// eslint-disable-next-line n/no-callback-literal
cb(-1)
return
}
const fileInfo = dirEnt.index.files[dirEnt.subPath]
if (!fileInfo) {
// eslint-disable-next-line n/no-callback-literal
cb(-1)
return
}
const filePathInStore = getFilePathByModeInCafs(cafsDir, fileInfo.integrity, fileInfo.mode)
fs.open(filePathInStore, flags, (err, fd) => {
if (err != null) {
// eslint-disable-next-line n/no-callback-literal
cb(-1)
return
}
@@ -57,13 +54,12 @@ export function createFuseHandlersFromLockfile (lockfile: Lockfile, cafsDir: str
},
release (p: string, fd: number, cb: (exitCode: number) => void) {
fs.close(fd, (err) => {
cb((err != null) ? -1 : 0) // eslint-disable-line n/no-callback-literal
cb((err != null) ? -1 : 0)
})
},
read (p: string, fd: number, buffer: Buffer, length: number, position: number, cb: (readBytes: number) => void) {
fs.read(fd, buffer, 0, length, position, (err, bytesRead) => {
if (err != null) {
// eslint-disable-next-line n/no-callback-literal
cb(-1)
return
}

View File

@@ -35,12 +35,14 @@
"dependencies": {
"@pnpm/core-loggers": "workspace:*",
"@pnpm/fetching-types": "workspace:*",
"@pnpm/network.agent": "0.1.0",
"@pnpm/network.agent": "^1.0.1",
"@pnpm/types": "workspace:*",
"@zkochan/retry": "^0.2.0",
"node-fetch": "npm:@pnpm/node-fetch@1.0.0"
},
"devDependencies": {
"@pnpm/fetch": "workspace:*",
"https-proxy-server-express": "0.1.2",
"nock": "13.3.4"
},
"funding": "https://opencollective.com/pnpm",

View File

@@ -1,4 +1,5 @@
import { URL } from 'url'
import { type SslConfig } from '@pnpm/types'
import { type FetchFromRegistry } from '@pnpm/fetching-types'
import { getAgent, type AgentOptions } from '@pnpm/network.agent'
import { fetch, isRedirect, type Response, type RequestInfo, type RequestInit } from './fetch'
@@ -33,6 +34,7 @@ export function createFetchFromRegistry (
defaultOpts: {
fullMetadata?: boolean
userAgent?: string
sslConfigs?: Record<string, SslConfig>
} & AgentOptions
): FetchFromRegistry {
return async (url, opts): Promise<Response> => {
@@ -59,7 +61,10 @@ export function createFetchFromRegistry (
// We should pass a URL object to node-fetch till this is not resolved:
// https://github.com/bitinn/node-fetch/issues/245
const response = await fetchWithAgent(urlObject, {
agentOptions,
agentOptions: {
...agentOptions,
clientCertificates: defaultOpts.sslConfigs,
},
// if verifying integrity, node-fetch must not decompress
compress: opts?.compress ?? false,
headers,

View File

@@ -0,0 +1,22 @@
-----BEGIN CERTIFICATE-----
MIIDpzCCAo+gAwIBAgIUBfn11L/8a6yyGNPKT+wsjQXxkJwwDQYJKoZIhvcNAQEL
BQAwYzELMAkGA1UEBhMCVVMxETAPBgNVBAgMCE5ldyBZb3JrMREwDwYDVQQHDAhO
ZXcgWW9yazENMAsGA1UECgwEcG5wbTELMAkGA1UECwwCSVQxEjAQBgNVBAMMCWxv
Y2FsaG9zdDAeFw0yNDAxMTcxMDQxMTdaFw00NDAxMTIxMDQxMTdaMGMxCzAJBgNV
BAYTAlVTMREwDwYDVQQIDAhOZXcgWW9yazERMA8GA1UEBwwITmV3IFlvcmsxDTAL
BgNVBAoMBHBucG0xCzAJBgNVBAsMAklUMRIwEAYDVQQDDAlsb2NhbGhvc3QwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCJw+DkWokdplyEWDi/AYbT7XeP
ytgKdUJ2bfJBrj6G2JU6MAOZ/fzlZ1c2mD5U+gKIvr7rvsWKsLZohXIGsE5EjL7s
/ruoYJo4jTD+gmdPaFCNXuDp6XmH1htf/msPo3Kv0eNL29Dx1l5pFvVrj96R+gsQ
6V/ydqXxqgC3v89CUgjScApfjcCsnxqYp4Y+TtHUEzvHRgmHNpxXjJGrkjroofKi
PkACxLSG8CIC+btIytwmjLyCfdqYtHaYpoIQwTK2ui7BAZ1Kl4LYBgfvNqfkr0uZ
v4nwmB3z4RTWyBDL7xrfH5gR9f+d49ZwskZ2ztmMcRbGxbiAMjHzOPjiFLLPAgMB
AAGjUzBRMB0GA1UdDgQWBBRFxjUWfdYIom50aQHSxft/r0/fNDAfBgNVHSMEGDAW
gBRFxjUWfdYIom50aQHSxft/r0/fNDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
DQEBCwUAA4IBAQAT4cgBafJA/KNBXLoOM5bixKn/Q1Rdef9ZkbTe0zPYu8+hfquc
yVkk7o0VMYdT4JqdNsqJLHCe3fU4Ns7qXeumECUyW81L/PaFMYP4o5/02iTgcvSO
7uEG5rJEQ4p3dPtgz4kP1Vkt5G+tMHsKY5okk9iaWNA7TxiG0avqFKIT8tFm1wMx
VJ33DNM6jC55b5Z/zeiB7cxp+NrEmCHcyFwwpGNuPmQvBWOXttz0oriYjqRXc78Y
fqOcQc1I8PaliLkJ5e5XUTtVCjMEU7pwz2LyhA7tGLTIx+skEltKQAxVgksQStxV
ZWk1RfHDSczvFFzn57eAxpt8lohkf2Votsii
-----END CERTIFICATE-----

View File

@@ -0,0 +1 @@
28412AF275E88F449B30A1071D25827F67DB59AE

View File

@@ -0,0 +1,30 @@
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFJDBWBgkqhkiG9w0BBQ0wSTAxBgkqhkiG9w0BBQwwJAQQsj4+WcsErreSm8GA
usXR8AICCAAwDAYIKoZIhvcNAgkFADAUBggqhkiG9w0DBwQI2Ze4AnQo+8sEggTI
MxH2IntXHK6TjTubMqpuwm/uaz4oPnz22nsXx3ZynqEV7I9lCisVqRGe/BmlSahD
LnEnbjyqTxhpT/29wHVhVTvTLbHdQ+Zeasl67FRVtZGldNy1eWXQ/fcynvFOt5De
Zk2OZ8ynW6bLdDn697UNGs8zXUSug9yYk3lF/R1//uluOCEhNLLI1+++8dgmoiD6
9hxNt4O0/aU2xQVzy/7IalF+8yRCgWDO5lBJg1sYXpFrxU+zXN27r5pb1fQ3UFTj
d6ihjifP4agMjdA7ubIbBsfI20+IQ3aI4zK2Se057DXMlaMJI7YIcB2E13B81zuw
Tx8TBnYcNiWRMCdPdW4iNsaLGJBWIYE6gND6wSPFdJxDN3K5MuvsvD/zHi7HEpOW
ry7o030Q4XNN/y9ZL5rH1bitVnO8GljZF2d4913iS70vbabXqZLuR59qfKfUv1/+
ddly17oLhwoXxkowut8PCG0CejxToOSkD0rkvHl7wBhDPuiCcUGRaZKR69kuxO/d
lPDDgDpDCRN3xAlHfBI+lB2nyICxk7/mJnOYi+uhg6X9lpD2EnryS46FZ5EllB+H
pbgXiNFPGCulnREXyLOyD7sqmpuCYHehAIv6qiK3aFHk0F29SKJV0JI7yEYDDSYV
2hna3aa7I8lf92oslAJp7DPjh9WmTKELRLoGElYzkYMlJLtMWMLJMqQt0lyzpW24
fFDeQWjraZ0CfrpuftXwqvdrLhqwmLRUYFBFa0Y/gScsKGwiG8mX5It236oYcRAV
yQS6d1SWkZ01PUEs8zryvOkErUd1WTxLz91ivVpizcg2I/gNYJYU4y9IAJrrw+nY
hqDjZrvKl2lfxTHWViZRQ2a2sLQqrmquB+nee9/05XkQmwPKAzDIzYVBy3JOfMP5
0UvdyHpGR3HsFIvguMmOzxetAWF1W5pYHyIzkMgWB4u/3WY4DooRejljEQ1s4pDS
EE+SYNXNhb3z/lvsymYnUXzrZb1cVWSK9e638UOsvl7zXzLfK6LxX856HdobyS9q
FK7CkKacxpgLw1IHa5Lh9ELCyWoKM21Cvx+PRKWPCy3qOTWKS5wbJLvU/0Occnvp
0qnDBuqdX6oKGiL8Nl8vaY1PZ7I07P23cw5jcEK/zf6E6OFLuVU3fCuJvJ1MZWhk
h/hJPoZQsOhFR24GmqZoZXj+H3iMvjos5OoX/itB1KmNvKWeQY6q7/ke7fA+ennR
2ESV/zCthzRDL/1bs9ZePu9eKOc+2qpJZusJSMjip/KCapNCjis9huu3ri97+IBT
brvIAX4rFupqmGQELtZGMqe7cktEc31NoAGNf+UWGfqqEWxgTzaPcXBsz3xBWfwJ
wX1xcswMpTHoRDv3OpxG2Uo9Ff2ZxA7r2ZsLqZV8+p20fD70CwvZhhz4mPPjlTFo
nRXoE10Sri5jwzjy/fb+mXj1oOYftMvbnRxhB6MBB+R5vFmvHtVMFP2q6L3cGvEj
dBEcLElyN210Ybhp2JuvhJ+93LyjF93QQN7HYwLO9dqDJPFUjWBFduMy+EmdzCCr
yR5knsEFkjXIqbuDgSIqdkljpTRKQuiXQQMl52YmiQMb4AEeJFhxW8RmPKWVwxTz
9BzxrLP3jf6eWsWG6bUi+CI51Kmb8Oqk
-----END ENCRYPTED PRIVATE KEY-----

View File

@@ -0,0 +1,22 @@
-----BEGIN CERTIFICATE-----
MIIDlTCCAn2gAwIBAgIUKEEq8nXoj0SbMKEHHSWCf2fbWa4wDQYJKoZIhvcNAQEL
BQAwYzELMAkGA1UEBhMCVVMxETAPBgNVBAgMCE5ldyBZb3JrMREwDwYDVQQHDAhO
ZXcgWW9yazENMAsGA1UECgwEcG5wbTELMAkGA1UECwwCSVQxEjAQBgNVBAMMCWxv
Y2FsaG9zdDAeFw0yNDAxMTcxMDQxNDFaFw00NDAxMTIxMDQxNDFaMGIxCzAJBgNV
BAYTAlVTMREwDwYDVQQIDAhOZXcgWW9yazERMA8GA1UEBwwITmV3IFlvcmsxDTAL
BgNVBAoMBHBucG0xCzAJBgNVBAsMAklUMREwDwYDVQQDDAhKb2huIERvZTCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALSL84hy3lcdWgmXr8zhErwpemVA
gneW4JH4leYneuSztkOMEyXegExNY4mjYcPX75N0X7oJyK+sIdpMCU6JN2AttU8h
BmSGd5cuDQ/ZgfMs36hnmUIrOL67QAsLa7MU7pG9XrZHpbG/MLP0fCO7+4aF3LCh
7nt0aR1mFjhHJFn5CSgF0fuoSrvIzpSIjtdnX6ivF16AfU71UhhuW4aAlZPfybh7
PzICBeIs6Qx8J7lICJUOaL+dIdGem+/oOHN0Td3V58enVfFGwbtJMzrjaeiGTNnU
xv2WfnDThsXParTZ+rTBT0qL8LrUIYDgaPkeDum83EUvoHQO4g31xsxoTPsCAwEA
AaNCMEAwHQYDVR0OBBYEFLJGGqvXCUyoGjMyaWPFNT55jIUBMB8GA1UdIwQYMBaA
FEXGNRZ91giibnRpAdLF+3+vT980MA0GCSqGSIb3DQEBCwUAA4IBAQAa+0WrCAxF
vahes28wJdmy38I9qc60P6ye6fcADCNqQYszC8Y6rAau65eKjorO/ypA3qPm7d8t
9zydxYpScejE792G5UiWnFeWRLDfl2xaEElfIELdIzEvXDslrXRalIn1vakTTYXG
cIGc5GgKN1Wq1aehQOKo5kwRuwd63hbnG0x3TrIx1BWUURa8J2R8gKbp9QNfgHmf
EM66R+QwrLmboEKtB+3uVGxJUPugpfEPcwbhCdcyKNF9MgNzECjSn8jCkduqIHv5
Mv9e6Cs1zjjksbknsrHW+Se9VfWEm0mcZw+xs5FAJ8fUBFcyouyHxqTGLSThbwAK
JbIqq5FLFOco
-----END CERTIFICATE-----

View File

@@ -0,0 +1,17 @@
-----BEGIN CERTIFICATE REQUEST-----
MIICpzCCAY8CAQAwYjELMAkGA1UEBhMCVVMxETAPBgNVBAgMCE5ldyBZb3JrMREw
DwYDVQQHDAhOZXcgWW9yazENMAsGA1UECgwEcG5wbTELMAkGA1UECwwCSVQxETAP
BgNVBAMMCEpvaG4gRG9lMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
tIvziHLeVx1aCZevzOESvCl6ZUCCd5bgkfiV5id65LO2Q4wTJd6ATE1jiaNhw9fv
k3RfugnIr6wh2kwJTok3YC21TyEGZIZ3ly4ND9mB8yzfqGeZQis4vrtACwtrsxTu
kb1etkelsb8ws/R8I7v7hoXcsKHue3RpHWYWOEckWfkJKAXR+6hKu8jOlIiO12df
qK8XXoB9TvVSGG5bhoCVk9/JuHs/MgIF4izpDHwnuUgIlQ5ov50h0Z6b7+g4c3RN
3dXnx6dV8UbBu0kzOuNp6IZM2dTG/ZZ+cNOGxc9qtNn6tMFPSovwutQhgOBo+R4O
6bzcRS+gdA7iDfXGzGhM+wIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBABQOQj2X
ox/SXBdBqPNhAM1TH0R0J+/83Du/nQmj2xPOTlIq35h0ZUzCS04SGK0dXBJnrRLs
fTiZsYmuDLf3n5ggB84d1kljldZFnJyDXWU0gzbF04cBuA0+lvjTBSKHFahijndV
dp/HHID9qhJiMIsf+moL/KU1UI/mMaQIf+59QSPlHngKol1yZuwiEtfBzPITL4qY
nkDu9JlfRks+4q8ICnj3PlBNuMgVF+9cOe/QMmPP+JyT1YsWqINczJLHN1Mnj+yg
GVZxqBmN6OTeWcFrZrHssSB/RCvec+0fD9/wwSvGwPDqECDhhgcFBBzV+jCISfP9
MqLCYYYRWplklvk=
-----END CERTIFICATE REQUEST-----

View File

@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC0i/OIct5XHVoJ
l6/M4RK8KXplQIJ3luCR+JXmJ3rks7ZDjBMl3oBMTWOJo2HD1++TdF+6CcivrCHa
TAlOiTdgLbVPIQZkhneXLg0P2YHzLN+oZ5lCKzi+u0ALC2uzFO6RvV62R6WxvzCz
9Hwju/uGhdywoe57dGkdZhY4RyRZ+QkoBdH7qEq7yM6UiI7XZ1+orxdegH1O9VIY
bluGgJWT38m4ez8yAgXiLOkMfCe5SAiVDmi/nSHRnpvv6DhzdE3d1efHp1XxRsG7
STM642nohkzZ1Mb9ln5w04bFz2q02fq0wU9Ki/C61CGA4Gj5Hg7pvNxFL6B0DuIN
9cbMaEz7AgMBAAECggEABHafQc92gAMplNTLU6POzEMJk745W3kp5RdBpsEcGyeh
iQr0oDo0xBjNA1E8MKoXx0vttTzaWWlxJCM+vv0fwYDFG4cupXE4505hTp6AcBa7
Er/jkeIH/ZhweArDZ1fMTA25QoVZQHXVtOUwOnaXvGwhGBFwwrGOiwZZOfFG90ho
9uHO1gaWhrRJ4P07DJHxfwWGcFUbsmd88rExXS/I/ifu/zVE73no/J9kXlnscYig
FNT9EbhXnd3cZ2Zfkfak/cLD/MMwCOTpq+T5YpK29bUsUySwGJiSB4h45jw69Zkm
3qLy98y3vILlKoraXD6+sV4MH0WULvY/zoRjJa54bQKBgQDsZEO4Wyr6JerXHGSv
mALXNVdOKWZp2tLD1cUY9772BDvXJ0vlE8EOoxlKjpHCt2/XR6uXZFOlgqZF/Lbz
f0MWMIkIQNrPMWnudKBCbOnz1PZ3m81TAvx2TYFafqcldz8q/NTTYGvKYQ1ClyLT
viehMhDoRpHMG0WEesEQ6iGJjQKBgQDDhdQa3VWy+n66JPvqjOWkSrs7cZXYOZBK
IVoQA5R7yA+h6GPQgbfYvt824P5PSay/mHtMYse1Gxga+LtLYQaxrKds6dD00NSZ
Nkh1azrRoNOjyc/ZUqOE0Q0OEMgrq50bixP4OlaT+OxX55q7KcaWkj0IaACyeVIU
UoYBldxapwKBgQCAAF7HEd64qxV5u28twdMv8zs+IJ7LDOl5j2R1e5lUn8BDZYzs
EwFDyr8kJwT4edm+qZlZlcLRaWhdl1T9jtilyEw7Qtr4vFoO++nXbiBUnumCpMPO
glxwNtGnTdN2LxbuUQ9xEdHsORc0CqCaJWpSF8kd7TB/Y/kFnm6ymQTl9QKBgQCP
3kaPKfPoSXe8QoB3Owuy0yZn/BE1VE3+rgHWLLwyRKh0C0p+3yRHQVN/zxhxgRWy
uWFoeHrYoUIgfotaUN+bFx7u/jE6Ivt8bTvt4mQaYcu5BkOBdtRJY4XGpsSTlah5
3uFn0o1oPk6x9AKf24J7wslUCSsSKEEkIQDn47yLmwKBgDbhGWZdGAL8r5SQy/76
MKj+kvGQeGuH32OtnAP1z5yT8tDQ3XN5q1/nYXHqos/VACHcp/FaY3Dck+UeLobw
5lRHq7GG2tXCTXIFVJ4WNqNGhTQV+woqpZ5UgZhHlkI9ni8Zy6VcP9OJeLZpwchl
MBIuC60QuxBeGZNOcJyG3k5+
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,22 @@
-----BEGIN CERTIFICATE-----
MIIDljCCAn6gAwIBAgIUKEEq8nXoj0SbMKEHHSWCf2fbWa0wDQYJKoZIhvcNAQEL
BQAwYzELMAkGA1UEBhMCVVMxETAPBgNVBAgMCE5ldyBZb3JrMREwDwYDVQQHDAhO
ZXcgWW9yazENMAsGA1UECgwEcG5wbTELMAkGA1UECwwCSVQxEjAQBgNVBAMMCWxv
Y2FsaG9zdDAeFw0yNDAxMTcxMDQxMzFaFw00NDAxMTIxMDQxMzFaMGMxCzAJBgNV
BAYTAlVTMREwDwYDVQQIDAhOZXcgWW9yazERMA8GA1UEBwwITmV3IFlvcmsxDTAL
BgNVBAoMBHBucG0xCzAJBgNVBAsMAklUMRIwEAYDVQQDDAlsb2NhbGhvc3QwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTnJiL8joJ931yrZ5Z7oImjRw9
u0Aq7WVuwxDPPJURIeCd6RRW5lggiCz05uhNlKYNb7R5OaXDMSSVKc62y7y6/H3J
Tmw2oaC1H869d2h04ohUMkVYOvVeealGQqmszKIy0RbqnVLRPDtdqpMouSxFNWe2
ieBtWCuuR5tgomcg6ohioWArGP2gChab1WI9vqPzaQRbmO1FkDyUZlxMD+WLCqKV
ULBtCW4Stfwne1DjWJu23yibTAZ8vrJavfWW0+MqjkG6TQroYaVTiHD0DXAWD4wl
JFTe5cQfjR4QCn7JdlJZmnOFfuY3pIM8YTm18bqgUTg0VssySczOiISgabT9AgMB
AAGjQjBAMB0GA1UdDgQWBBSlNwhSYvQgXSwu7tbabU15/QRz1TAfBgNVHSMEGDAW
gBRFxjUWfdYIom50aQHSxft/r0/fNDANBgkqhkiG9w0BAQsFAAOCAQEAab/pE+zR
JSNJg2OrurXlEdLgjpmczrbe3AddeLRxE6mEiNQADS66QmAMpNKNAyprYY+229VT
SDFap37EXgtBMvbqFugXhhclT5lckVHwAt1tNxhaeiUZnyDa/nGghdQgX2UqwZ0t
S35/lGKt8RA1Z1SRiT5Hnldp46mb5Hgkfe/yKQKtU0weCVR0JEHJ4MA3Mv2A+Pge
NiKGf019ZuhmsaX5i1NC8HM9DvhH0MeTd07FDSLmyILdu6Ai+ebKnano3RVMFcnk
pIu+qMnnhdp/sNw2C5KZ2QNjE1XHCXDGJtDGRPtHrvHGqVDsRGtW2MPK2Uda/a6o
sZhEFANmSRKUkg==
-----END CERTIFICATE-----

View File

@@ -0,0 +1,17 @@
-----BEGIN CERTIFICATE REQUEST-----
MIICqDCCAZACAQAwYzELMAkGA1UEBhMCVVMxETAPBgNVBAgMCE5ldyBZb3JrMREw
DwYDVQQHDAhOZXcgWW9yazENMAsGA1UECgwEcG5wbTELMAkGA1UECwwCSVQxEjAQ
BgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
ANOcmIvyOgn3fXKtnlnugiaNHD27QCrtZW7DEM88lREh4J3pFFbmWCCILPTm6E2U
pg1vtHk5pcMxJJUpzrbLvLr8fclObDahoLUfzr13aHTiiFQyRVg69V55qUZCqazM
ojLRFuqdUtE8O12qkyi5LEU1Z7aJ4G1YK65Hm2CiZyDqiGKhYCsY/aAKFpvVYj2+
o/NpBFuY7UWQPJRmXEwP5YsKopVQsG0JbhK1/Cd7UONYm7bfKJtMBny+slq99ZbT
4yqOQbpNCuhhpVOIcPQNcBYPjCUkVN7lxB+NHhAKfsl2Ulmac4V+5jekgzxhObXx
uqBRODRWyzJJzM6IhKBptP0CAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4IBAQBrxzLs
R3yfCivqGZOMSHDi7L7X1y2TRLbxvxJ2/Wk1Li3vedTWFZuPDUAtplXR4CKzQksp
bCZtVPBsURveZrs4QfIYPg7NqQevAG/yYYT2jSfxJ1VBbuhX/qDtb7VcmPe2xA+K
aWySheodqvycsSh4EHzy8Ra50mfEciTTqiUNgNQ4blVBohdbw2vkxXWWK4LdtpCh
2k6aAdf6ifeQxcNjZFd23I/lFK5xqZUjDJvPUDQhu7p9JnoT9mDL5EvHSyiRAUMM
mdUHQ7YJe7HsH5ONWHoa4EKZ+PvWjdjtsdfYLJhB5Uirleb2+0w6jHV0y7ujvBdx
BwRVzpHakuvN/2Mn
-----END CERTIFICATE REQUEST-----

View File

@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDTnJiL8joJ931y
rZ5Z7oImjRw9u0Aq7WVuwxDPPJURIeCd6RRW5lggiCz05uhNlKYNb7R5OaXDMSSV
Kc62y7y6/H3JTmw2oaC1H869d2h04ohUMkVYOvVeealGQqmszKIy0RbqnVLRPDtd
qpMouSxFNWe2ieBtWCuuR5tgomcg6ohioWArGP2gChab1WI9vqPzaQRbmO1FkDyU
ZlxMD+WLCqKVULBtCW4Stfwne1DjWJu23yibTAZ8vrJavfWW0+MqjkG6TQroYaVT
iHD0DXAWD4wlJFTe5cQfjR4QCn7JdlJZmnOFfuY3pIM8YTm18bqgUTg0VssySczO
iISgabT9AgMBAAECggEAHVoq1LqgL1K7fWU0wk+xkOxg3vUyxOGSAMeg9MX3/Vzg
Hbc/YYBo9/Y7mirPTTeRwupcM7Z51jXiV6hpanSfNKaiQgKVQwyvUIBdem1uOUxU
0az5bnAbKeQhRUQo6fWmh/r1vUxeOPSsXWU0LWFmESGDxc+hKDmjMXTwSfqs6GUv
PKxWwhLHKKCF05NIVXJ646ZEmXxbFSBOORTIur0o4kXuEO1w88T+/NdiQ74cAcUU
TsEY5KjDKZgoLlEMnG43HKkbD8G7fYhjiFLzupjY555NIifQ7LzkYAiSan2BqNV0
1Vgp2rC1SFaDzX1vlK9SUt5uZV5vQjO8ByGjOq/UUQKBgQDqRUTbMd8nsJAKq5Zs
gOyMgpGLucD5YL/hGlKEyny04rnkfbZyV5R9s0KHzmlkR6ewwUMTZ29j2bdsHiOB
bHg4dh/Bnb4tNLXOpKUJC/R5cPU7v7UaTXUr8MVHil0NT6nsW1tEzju/I6G/KBND
jAFX9cuLfCwJwqcvDBDLRENTtQKBgQDnPUtM/c0VnFqJFZlKLDQnWSdUXg+G7J4i
zjWHLOzhV9mN9FvFJ0UvLVPaxFNkZUC/0i99I3tQoqAKnr0mhoGyiYH7VcYDTcJP
OLImfJNdyVrIPNsDhoEbnQwsNxTjs86wWDGo08YaclCD5k969HMNryIozbcUYZjW
eu7y3sY5KQKBgQDic+7pSz4A6aVzCwYvADioYhY60GX/KUyRVZZqkikV2QwEGJjh
0lLRZxRqnlY1/yXTsB0chqGgDXZGZqO/mZBkU5rC165bmFYd1/1Hz2yUb2I+TUPM
lw8qWGT6kH7+PQFuXajNy+TpEJJra1ujsZQi6I/G11LiZGyjB7C8K9JA+QKBgFxf
e+kxqe9sGi6Q1j9vERZ24uMs//7iHvnAblmldKtAMMQoTVCgs155OPo3WyjL2eXG
zPmsZuJ7VHtplh4BtWXg0G/af9NqCKkk+OWu9h+NBBrhVIw/+utQ/T/ccRfVCEgh
sxTCJG0EJW3LXwy7AgsBXx/1raESq79iNHoIzB6hAoGALzyPorYuI8X2WM+MT2me
B3TgH4zQMEzEtLoTikkm5t81b9za2Cfe+mv7aKImsYtkDZira7+ldRqlUXvTswUZ
//OAfc0e1nHQJSUvFWH6ya4RiE20QaM8RzMComRD8i82WVZFFaqLJutCTfgcxlUp
+X8N9jxLQfL805sNsCrbL4o=
-----END PRIVATE KEY-----

View File

@@ -1,6 +1,11 @@
/// <reference path="../../../__typings__/index.d.ts"/>
import path from 'path'
import { createFetchFromRegistry } from '@pnpm/fetch'
import nock from 'nock'
import { ProxyServer } from 'https-proxy-server-express'
import fs from 'fs'
const CERTS_DIR = path.join(__dirname, '__certs__')
test('fetchFromRegistry', async () => {
const fetchFromRegistry = createFetchFromRegistry({})
@@ -68,3 +73,68 @@ test('switch to the correct agent for requests on redirect from http: to https:'
expect(status).toEqual(200)
})
test('fetch from registry with client certificate authentication', async () => {
const randomPort = Math.floor(Math.random() * 10000 + 10000)
const proxyServer = new ProxyServer(randomPort, {
key: fs.readFileSync(path.join(CERTS_DIR, 'server-key.pem')),
cert: fs.readFileSync(path.join(CERTS_DIR, 'server-crt.pem')),
ca: fs.readFileSync(path.join(CERTS_DIR, 'ca-crt.pem')),
rejectUnauthorized: true,
requestCert: true,
}, 'https://registry.npmjs.org/')
await proxyServer.start()
const sslConfigs = {
[`//localhost:${randomPort}/`]: {
ca: fs.readFileSync(path.join(CERTS_DIR, 'ca-crt.pem'), 'utf8'),
cert: fs.readFileSync(path.join(CERTS_DIR, 'client-crt.pem'), 'utf8'),
key: fs.readFileSync(path.join(CERTS_DIR, 'client-key.pem'), 'utf8'),
},
}
const fetchFromRegistry = createFetchFromRegistry({
sslConfigs,
strictSsl: false,
})
try {
const res = await fetchFromRegistry(`https://localhost:${randomPort}/is-positive`)
const metadata = await res.json() as any // eslint-disable-line
expect(metadata.name).toEqual('is-positive')
} finally {
await proxyServer.stop()
}
})
test('fail if the client certificate is not provided', async () => {
const randomPort = Math.floor(Math.random() * 10000 + 10000)
const proxyServer = new ProxyServer(randomPort, {
key: fs.readFileSync(path.join(CERTS_DIR, 'server-key.pem')),
cert: fs.readFileSync(path.join(CERTS_DIR, 'server-crt.pem')),
ca: fs.readFileSync(path.join(CERTS_DIR, 'ca-crt.pem')),
rejectUnauthorized: true,
requestCert: true,
}, 'https://registry.npmjs.org/')
await proxyServer.start()
const fetchFromRegistry = createFetchFromRegistry({
strictSsl: false,
})
let err!: Error & { code: string }
try {
await fetchFromRegistry(`https://localhost:${randomPort}/is-positive`, {
retry: {
retries: 0,
},
})
} catch (_err: any) { // eslint-disable-line
err = _err
} finally {
await proxyServer.stop()
}
expect(err?.code).toMatch(/ECONNRESET|ERR_SSL_TLSV13_ALERT_CERTIFICATE_REQUIRED/)
})

View File

@@ -12,6 +12,9 @@
{
"path": "../../packages/core-loggers"
},
{
"path": "../../packages/types"
},
{
"path": "../fetching-types"
}

View File

@@ -19,6 +19,12 @@ export interface Registries {
[scope: string]: string
}
export interface SslConfig {
cert: string
key: string
ca?: string
}
export type HoistedDependencies = Record<string, Record<string, 'public' | 'private'>>
export interface PatchFile {

View File

@@ -39,6 +39,7 @@
"@pnpm/network.auth-header": "workspace:*",
"@pnpm/resolver-base": "workspace:*",
"@pnpm/tarball-fetcher": "workspace:*",
"@pnpm/types": "workspace:*",
"ramda": "npm:@pnpm/ramda@0.28.1"
},
"devDependencies": {

View File

@@ -4,6 +4,7 @@ import {
type ResolverFactoryOptions,
} from '@pnpm/default-resolver'
import { type AgentOptions, createFetchFromRegistry } from '@pnpm/fetch'
import { type SslConfig } from '@pnpm/types'
import { type FetchFromRegistry, type GetAuthHeader, type RetryTimeoutOptions } from '@pnpm/fetching-types'
import type { CustomFetchers, GitFetcher, DirectoryFetcher } from '@pnpm/fetcher-base'
import { createDirectoryFetcher } from '@pnpm/directory-fetcher'
@@ -18,7 +19,8 @@ export type ClientOptions = {
authConfig: Record<string, string>
customFetchers?: CustomFetchers
ignoreScripts?: boolean
rawConfig: object
rawConfig: Record<string, string>
sslConfigs?: Record<string, SslConfig>
retry?: RetryTimeoutOptions
timeout?: number
unsafePerm?: boolean

View File

@@ -30,6 +30,9 @@
{
"path": "../../network/fetching-types"
},
{
"path": "../../packages/types"
},
{
"path": "../../resolving/default-resolver"
},

347
pnpm-lock.yaml generated
View File

@@ -2489,8 +2489,11 @@ importers:
specifier: ^5.0.0
version: 5.0.0
'@pnpm/network.agent':
specifier: 0.1.0
version: 0.1.0
specifier: ^1.0.1
version: 1.0.1
'@pnpm/types':
specifier: workspace:*
version: link:../../packages/types
'@zkochan/retry':
specifier: ^0.2.0
version: 0.2.0
@@ -2501,6 +2504,9 @@ importers:
'@pnpm/fetch':
specifier: workspace:*
version: 'link:'
https-proxy-server-express:
specifier: 0.1.2
version: 0.1.2
nock:
specifier: 13.3.4
version: 13.3.4
@@ -2949,6 +2955,9 @@ importers:
'@pnpm/tarball-fetcher':
specifier: workspace:*
version: link:../../fetching/tarball-fetcher
'@pnpm/types':
specifier: workspace:*
version: link:../../packages/types
ramda:
specifier: npm:@pnpm/ramda@0.28.1
version: /@pnpm/ramda@0.28.1
@@ -8502,11 +8511,12 @@ packages:
write-json-file: 5.0.0
dev: true
/@pnpm/network.agent@0.1.0:
resolution: {integrity: sha512-RurhhwXMdrKnr4swyx0E6g3tfsfP27kB7czoGTmEvSCgmrrZ5pGToZ0MahiwGRkpSRoTlUmVE97nwqjxCOfboA==}
/@pnpm/network.agent@1.0.1:
resolution: {integrity: sha512-yRm8MzpZvst5IYF5IUgK7q5SvcncCUWOVBqpl527Pz6BafmDlcxAYyFy7lV4AiQr+VZ9VWudQsaHQeaYikyDGw==}
engines: {node: '>=12.22.0'}
dependencies:
'@pnpm/network.proxy-agent': 0.1.0
'@pnpm/network.config': 1.0.1
'@pnpm/network.proxy-agent': 1.0.1
agentkeepalive: 4.2.1
lru-cache: 7.10.1
transitivePeerDependencies:
@@ -8519,8 +8529,15 @@ packages:
dependencies:
graceful-fs: 4.2.10
/@pnpm/network.proxy-agent@0.1.0:
resolution: {integrity: sha512-nl7xLKiYlkTEpaM0U4JaZ1ce6JSYIzuorH+JVn33jry/k3ombpK1xbOzFFwfFhWptXFN9IMcZACjQxmvBbElgg==}
/@pnpm/network.config@1.0.1:
resolution: {integrity: sha512-ZmTsSFxd4QT5+IZvwHtQjzSlkB7OXAty6MfSenRyHOvR1f8j3l1VDWVXJiNaiLrKeidiZH6ADfsMTr2N0CGDeA==}
engines: {node: '>=12.22.0'}
dependencies:
nerf-dart: 1.0.0
dev: false
/@pnpm/network.proxy-agent@1.0.1:
resolution: {integrity: sha512-0q9Btpw43aTPzEJJmQY1TNBrwNlPINRae8EpO7VpqbmFflBRO6u6qady6XFfbi+wwPxpcpVOYr6rCDBzALXYHA==}
engines: {node: '>=12.22.0'}
dependencies:
'@pnpm/error': 4.0.1
@@ -9025,6 +9042,12 @@ packages:
/@types/http-cache-semantics@4.0.4:
resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==}
/@types/http-proxy@1.17.14:
resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==}
dependencies:
'@types/node': 18.19.15
dev: true
/@types/ini@1.3.31:
resolution: {integrity: sha512-8ecxxaG4AlVEM1k9+BsziMw8UsX0qy3jYI1ad/71RrDZ+rdL6aZB0wLfAuflQiDhkD5o4yJ0uPK3OSUic3fG0w==}
dev: true
@@ -11884,7 +11907,6 @@ packages:
/eventemitter3@4.0.7:
resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
dev: false
/execa@5.1.1:
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
@@ -12190,6 +12212,16 @@ packages:
readable-stream: 2.3.8
dev: true
/follow-redirects@1.15.5:
resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==}
engines: {node: '>=4.0'}
peerDependencies:
debug: '*'
peerDependenciesMeta:
debug:
optional: true
dev: true
/for-each@0.3.3:
resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
dependencies:
@@ -12824,6 +12856,35 @@ packages:
- supports-color
dev: false
/http-proxy-middleware@2.0.6:
resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==}
engines: {node: '>=12.0.0'}
peerDependencies:
'@types/express': ^4.17.13
peerDependenciesMeta:
'@types/express':
optional: true
dependencies:
'@types/http-proxy': 1.17.14
http-proxy: 1.18.1
is-glob: 4.0.3
is-plain-obj: 3.0.0
micromatch: 4.0.5
transitivePeerDependencies:
- debug
dev: true
/http-proxy@1.18.1:
resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==}
engines: {node: '>=8.0.0'}
dependencies:
eventemitter3: 4.0.7
follow-redirects: 1.15.5
requires-port: 1.0.0
transitivePeerDependencies:
- debug
dev: true
/http-signature@1.2.0:
resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==}
engines: {node: '>=0.8', npm: '>=1.3.7'}
@@ -12861,6 +12922,17 @@ packages:
- supports-color
dev: false
/https-proxy-server-express@0.1.2:
resolution: {integrity: sha512-wG6/7qwT/DVwI2PW428uoanIjfq5VsfdauROg8HVPSvrXfS8CEoKGkmilanBX8kzUgj145ab3da2Qvci3UbQhw==}
dependencies:
express: 4.18.2
http-proxy-middleware: 2.0.6
transitivePeerDependencies:
- '@types/express'
- debug
- supports-color
dev: true
/human-id@1.0.2:
resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==}
dev: true
@@ -13217,6 +13289,11 @@ packages:
resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==}
engines: {node: '>=8'}
/is-plain-obj@3.0.0:
resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==}
engines: {node: '>=10'}
dev: true
/is-plain-obj@4.1.0:
resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
engines: {node: '>=12'}
@@ -17987,258 +18064,6 @@ packages:
dev: false
time:
/@babel/core@7.23.9: '2024-01-25T16:57:56.838Z'
/@babel/plugin-proposal-dynamic-import@7.18.6: '2022-06-27T19:49:50.843Z'
/@babel/plugin-transform-modules-commonjs@7.23.3: '2023-11-09T07:04:12.992Z'
/@babel/preset-typescript@7.23.3: '2023-11-09T07:04:16.375Z'
/@babel/types@7.23.9: '2024-01-25T16:57:51.834Z'
/@changesets/cli@2.27.1: '2023-11-28T11:18:23.079Z'
/@commitlint/cli@17.8.1: '2023-10-20T12:09:20.185Z'
/@commitlint/config-conventional@17.8.1: '2023-10-20T12:09:20.694Z'
/@commitlint/prompt-cli@17.8.1: '2023-10-20T12:09:23.467Z'
/@gwhitney/detect-indent@7.0.1: '2022-11-22T14:07:22.341Z'
/@pnpm/builder.policy@1.1.0: '2023-10-07T22:16:55.698Z'
/@pnpm/byline@1.0.0: '2021-10-31T23:25:00.031Z'
/@pnpm/colorize-semver-diff@1.0.1: '2020-10-25T15:50:17.812Z'
/@pnpm/config.env-replace@1.1.0: '2023-04-04T18:59:45.025Z'
/@pnpm/exec@2.0.0: '2020-10-29T23:51:01.271Z'
/@pnpm/fs.packlist@1.0.3: '2024-01-22T09:17:00.735Z'
/@pnpm/hosted-git-info@1.0.0: '2024-02-05T14:40:06.830Z'
/@pnpm/log.group@1.0.1: '2023-10-21T01:56:15.610Z'
/@pnpm/logger@5.0.0: '2022-10-14T13:56:04.285Z'
/@pnpm/meta-updater@1.0.0: '2023-08-02T15:08:06.459Z'
/@pnpm/network.agent@0.1.0: '2023-02-18T01:03:06.709Z'
/@pnpm/node-fetch@1.0.0: '2023-04-19T11:13:43.487Z'
/@pnpm/nopt@0.2.1: '2021-06-01T19:45:54.552Z'
/@pnpm/npm-conf@2.2.2: '2023-06-14T04:08:06.108Z'
/@pnpm/npm-lifecycle@3.0.1: '2024-02-12T21:42:14.112Z'
/@pnpm/npm-package-arg@1.0.0: '2022-06-28T12:48:31.287Z'
/@pnpm/os.env.path-extender@0.2.12: '2023-10-21T04:28:56.803Z'
/@pnpm/patch-package@0.0.0: '2023-06-17T11:49:20.604Z'
/@pnpm/ramda@0.28.1: '2022-08-03T13:56:59.597Z'
/@pnpm/registry-mock@3.25.0: '2024-02-08T22:03:39.172Z'
/@pnpm/semver-diff@1.1.0: '2021-11-16T12:40:59.941Z'
/@pnpm/tabtab@0.5.2: '2024-02-05T11:11:20.511Z'
/@pnpm/util.lex-comparator@1.0.0: '2022-11-04T01:03:46.134Z'
/@pnpm/which@3.0.1: '2023-05-14T22:08:27.551Z'
/@reflink/reflink@0.1.16: '2024-01-02T17:41:22.200Z'
/@rushstack/worker-pool@0.4.9: '2023-10-01T03:01:09.960Z'
/@types/adm-zip@0.5.5: '2023-11-20T23:37:23.167Z'
/@types/archy@0.0.33: '2023-09-22T20:01:08.161Z'
/@types/byline@4.2.36: '2023-11-07T00:13:37.410Z'
/@types/cross-spawn@6.0.6: '2023-11-20T23:55:06.550Z'
/@types/fs-extra@9.0.13: '2021-09-21T19:02:27.512Z'
/@types/graceful-fs@4.1.9: '2023-11-07T06:37:38.558Z'
/@types/hosted-git-info@3.0.5: '2023-11-07T07:29:23.149Z'
/@types/ini@1.3.31: '2021-10-07T21:01:49.672Z'
/@types/is-gzip@2.0.0: '2020-08-21T05:11:34.796Z'
/@types/is-windows@1.0.2: '2023-11-07T08:08:49.243Z'
/@types/isexe@2.0.2: '2023-09-26T15:11:19.397Z'
/@types/jest@29.5.12: '2024-02-01T17:07:05.881Z'
/@types/js-yaml@4.0.9: '2023-11-07T20:20:13.264Z'
/@types/lodash.clonedeep@4.5.9: '2023-11-07T09:58:37.962Z'
/@types/lodash.throttle@4.1.7: '2022-04-18T23:23:51.676Z'
/@types/micromatch@4.0.6: '2023-11-21T01:30:53.522Z'
/@types/mz@2.7.8: '2023-11-21T00:37:43.061Z'
/@types/node@18.19.15: '2024-02-08T20:37:07.254Z'
/@types/normalize-package-data@2.4.4: '2023-11-07T12:04:03.711Z'
/@types/normalize-path@3.0.2: '2023-11-07T12:04:09.416Z'
/@types/object-hash@3.0.6: '2023-11-07T12:14:41.852Z'
/@types/parse-json@4.0.2: '2023-11-07T12:35:13.182Z'
/@types/proxyquire@1.3.31: '2023-11-07T13:34:37.730Z'
/@types/ramda@0.28.20: '2022-11-11T10:32:59.530Z'
/@types/retry@0.12.5: '2023-11-07T15:32:02.572Z'
/@types/rimraf@3.0.2: '2021-08-18T21:02:03.570Z'
/@types/semver@7.5.3: '2023-09-25T14:19:37.089Z'
/@types/semver@7.5.7: '2024-02-11T14:35:16.597Z'
/@types/signal-exit@3.0.4: '2023-11-07T16:33:34.502Z'
/@types/sinon@10.0.20: '2023-10-18T15:02:12.573Z'
/@types/ssri@7.1.5: '2023-11-21T01:08:19.305Z'
/@types/table@6.0.0: '2020-09-17T17:56:44.787Z'
/@types/tar-stream@2.2.3: '2023-09-12T12:36:52.726Z'
/@types/tar@6.1.11: '2024-01-25T07:07:06.203Z'
/@types/touch@3.1.5: '2023-11-07T18:04:29.681Z'
/@types/uuid@8.3.4: '2022-01-06T07:32:21.196Z'
/@types/validate-npm-package-name@4.0.2: '2023-11-07T18:40:02.727Z'
/@types/which@2.0.2: '2023-02-14T10:32:38.403Z'
/@types/wrap-ansi@8.0.2: '2023-10-18T19:10:52.205Z'
/@types/write-file-atomic@4.0.3: '2023-11-07T19:26:42.209Z'
/@types/yarnpkg__lockfile@1.1.9: '2023-11-07T19:39:01.690Z'
/@typescript-eslint/eslint-plugin@6.18.1: '2024-01-08T22:37:31.558Z'
/@typescript-eslint/parser@6.18.1: '2024-01-08T22:36:56.059Z'
/@yarnpkg/core@4.0.3: '2024-01-30T15:48:34.196Z'
/@yarnpkg/extensions@2.0.1: '2024-01-30T15:47:23.585Z'
/@yarnpkg/lockfile@1.1.0: '2018-09-10T13:37:58.652Z'
/@yarnpkg/nm@4.0.2: '2024-01-30T15:48:54.376Z'
/@yarnpkg/parsers@3.0.0: '2023-10-22T16:54:15.950Z'
/@yarnpkg/pnp@2.3.2: '2020-11-30T14:45:51.504Z'
/@zkochan/cmd-shim@6.0.0: '2023-03-16T02:26:12.592Z'
/@zkochan/diable@1.0.2: '2020-07-07T02:01:35.635Z'
/@zkochan/js-yaml@0.0.6: '2022-05-10T14:42:39.813Z'
/@zkochan/retry@0.2.0: '2020-06-06T23:36:55.687Z'
/@zkochan/rimraf@2.1.3: '2023-08-19T10:36:23.394Z'
/@zkochan/table@2.0.1: '2023-03-20T00:49:51.928Z'
/adm-zip@0.5.10: '2022-12-20T11:08:08.848Z'
/ansi-diff@1.1.1: '2018-06-16T13:37:28.365Z'
/archy@1.0.0: '2014-09-14T07:57:58.806Z'
/better-path-resolve@1.0.0: '2019-03-01T23:22:26.750Z'
/bin-links@4.0.3: '2023-10-12T16:22:47.134Z'
/boxen@5.1.2: '2021-09-17T05:31:40.311Z'
/c8@7.14.0: '2023-05-28T16:35:16.590Z'
/camelcase-keys@6.2.2: '2020-04-03T03:51:03.816Z'
/camelcase@6.3.0: '2022-01-01T20:29:34.388Z'
/can-link@2.0.0: '2021-02-11T22:53:11.538Z'
/can-write-to-dir@1.1.1: '2021-04-01T00:51:46.475Z'
/chalk@4.1.2: '2021-07-30T12:02:52.839Z'
/ci-info@3.9.0: '2023-10-04T04:56:10.209Z'
/cli-columns@4.0.0: '2021-09-23T18:51:13.897Z'
/cli-truncate@2.1.0: '2019-12-06T07:47:55.662Z'
/cmd-extension@1.0.2: '2021-09-28T21:08:51.481Z'
/comver-to-semver@1.0.0: '2021-04-04T23:59:39.895Z'
/concurrently@8.2.1: '2023-08-22T07:23:44.734Z'
/cross-env@7.0.3: '2020-12-01T20:25:26.541Z'
/cross-spawn@7.0.3: '2020-05-25T15:35:07.209Z'
/cspell@7.3.8: '2023-10-13T17:12:23.371Z'
/deep-require-cwd@1.0.0: '2017-05-08T20:09:31.558Z'
/delay@5.0.0: '2021-02-01T15:29:35.501Z'
/detect-libc@2.0.2: '2023-07-18T08:38:01.781Z'
/didyoumean2@6.0.1: '2023-09-07T04:09:42.951Z'
/dint@5.1.0: '2021-02-12T01:22:54.214Z'
/dir-is-case-sensitive@2.0.0: '2021-02-11T22:53:28.072Z'
/encode-registry@3.0.1: '2023-09-19T12:19:16.127Z'
/enquirer@2.4.1: '2023-07-28T12:26:30.586Z'
/esbuild@0.19.12: '2024-01-23T17:41:40.695Z'
/escape-string-regexp@4.0.0: '2020-04-23T07:31:25.491Z'
/eslint-config-standard-with-typescript@39.1.1: '2023-10-07T08:26:15.756Z'
/eslint-plugin-import@2.29.1: '2023-12-14T18:54:57.111Z'
/eslint-plugin-n@16.6.2: '2024-01-09T03:28:40.565Z'
/eslint-plugin-node@11.1.0: '2020-03-28T11:46:46.795Z'
/eslint-plugin-promise@6.1.1: '2022-10-19T21:06:14.552Z'
/eslint@8.56.0: '2023-12-15T22:55:11.833Z'
/exists-link@2.0.0: '2017-03-02T20:50:23.918Z'
/fast-deep-equal@3.1.3: '2020-06-08T07:27:28.474Z'
/fast-glob@3.3.2: '2023-11-06T12:41:11.203Z'
/filenamify@4.3.0: '2021-04-26T16:15:18.365Z'
/find-up@5.0.0: '2020-08-11T18:44:24.748Z'
/fs-extra@11.2.0: '2023-11-28T00:46:35.100Z'
/@pnpm/network.agent@1.0.1: '2024-02-13T13:27:13.674Z'
/fuse-native@2.2.6: '2020-06-03T19:26:36.838Z'
/get-npm-tarball-url@2.1.0: '2023-11-07T13:09:03.185Z'
/get-port@5.1.1: '2020-01-15T08:08:35.951Z'
/ghooks@2.0.4: '2018-04-29T00:47:15.439Z'
/graceful-git@3.1.2: '2021-09-16T00:23:26.185Z'
/graph-cycles@1.2.1: '2021-04-11T09:47:00.295Z'
/husky@8.0.3: '2023-01-03T08:01:18.807Z'
/hyperdrive-schemas@2.0.0: '2020-07-14T11:16:33.671Z'
/ini@4.1.1: '2023-05-16T17:58:46.240Z'
/is-gzip@2.0.0: '2017-08-13T15:56:02.298Z'
/is-inner-link@4.0.0: '2021-02-11T22:54:33.386Z'
/is-port-reachable@3.0.0: '2019-11-12T09:49:42.096Z'
/is-subdir@1.2.0: '2021-01-05T16:52:45.485Z'
/is-windows@1.0.2: '2018-02-14T07:36:43.207Z'
/isexe@2.0.0: '2017-03-23T00:53:16.356Z'
/jest-diff@29.7.0: '2023-09-12T06:43:43.883Z'
/jest@29.7.0: '2023-09-12T06:44:08.561Z'
/json5@2.2.3: '2022-12-31T17:11:32.047Z'
/keyv@4.5.4: '2023-10-07T16:53:54.487Z'
/lcov-result-merger@3.3.0: '2022-06-21T06:32:52.863Z'
/load-json-file@6.2.0: '2019-07-11T08:30:09.981Z'
/lodash.clonedeep@4.5.0: '2016-08-13T17:37:19.945Z'
/lodash.throttle@4.1.1: '2016-08-13T17:45:38.195Z'
/loud-rejection@2.2.0: '2019-09-28T16:02:58.271Z'
/lru-cache@10.2.0: '2024-01-25T21:11:56.776Z'
/make-empty-dir@2.1.0: '2023-08-19T10:36:58.989Z'
/mdast-util-to-string@2.0.0: '2020-11-11T09:15:26.835Z'
/mem@8.1.1: '2021-04-20T15:49:07.407Z'
/micromatch@4.0.5: '2022-03-24T19:31:47.722Z'
/nerf-dart@1.0.0: '2015-08-20T12:22:17.009Z'
/nock@13.3.4: '2023-10-10T23:18:23.819Z'
/node-gyp@10.0.1: '2023-11-02T18:13:42.360Z'
/normalize-newline@3.0.0: '2016-09-06T12:35:43.571Z'
/normalize-package-data@5.0.0: '2022-10-14T05:22:41.916Z'
/normalize-path@3.0.0: '2018-04-19T14:54:47.609Z'
/normalize-registry-url@2.0.0: '2021-11-22T21:36:37.421Z'
/npm-packlist@5.1.3: '2022-08-25T19:33:59.963Z'
/object-hash@3.0.0: '2022-02-18T15:10:47.040Z'
/p-any@3.0.0: '2020-02-22T14:44:06.005Z'
/p-defer@3.0.0: '2019-06-07T08:11:13.854Z'
/p-every@2.0.0: '2019-03-15T09:22:34.849Z'
/p-filter@2.1.0: '2019-04-04T04:54:11.010Z'
/p-limit@3.1.0: '2020-11-25T07:42:37.364Z'
/p-map-values@1.0.0: '2022-11-19T01:54:52.912Z'
/p-memoize@4.0.1: '2020-09-24T12:12:05.234Z'
/p-queue@6.6.2: '2020-10-11T19:09:45.773Z'
/p-settle@4.1.1: '2020-05-29T08:07:35.109Z'
/parse-json@5.2.0: '2021-01-18T11:15:13.459Z'
/parse-npm-tarball-url@3.0.0: '2019-05-27T23:50:09.183Z'
/path-absolute@1.0.1: '2018-11-28T20:25:53.253Z'
/path-exists@4.0.0: '2019-04-04T03:29:16.887Z'
/path-name@1.0.0: '2016-10-20T18:43:50.780Z'
/path-temp@2.1.0: '2023-07-16T21:25:05.258Z'
/pidtree@0.6.0: '2022-06-05T18:35:44.206Z'
/preferred-pm@3.1.2: '2023-09-05T00:02:00.039Z'
/pretty-bytes@5.6.0: '2021-02-21T14:04:35.036Z'
/pretty-ms@7.0.1: '2020-09-24T09:37:39.213Z'
/process-exists@4.1.0: '2021-07-09T07:06:51.313Z'
/promise-share@1.0.0: '2019-09-13T19:01:32.578Z'
/proxyquire@2.1.3: '2019-08-12T13:54:46.049Z'
/ps-list@7.2.0: '2020-06-17T09:02:36.119Z'
/publish-packed@4.1.2: '2023-12-24T23:27:28.807Z'
/read-ini-file@4.0.0: '2022-12-23T20:19:57.971Z'
/read-yaml-file@2.1.0: '2021-02-11T22:53:46.064Z'
/realpath-missing@1.1.0: '2021-02-11T22:53:50.718Z'
/remark-parse@9.0.0: '2020-10-14T08:48:35.392Z'
/remark-stringify@9.0.1: '2020-12-09T17:54:33.099Z'
/rename-overwrite@5.0.0: '2023-12-24T01:49:00.212Z'
/render-help@1.0.3: '2023-01-29T01:46:41.262Z'
/resolve-link-target@2.0.0: '2021-02-11T22:54:11.438Z'
/rfc4648@1.5.3: '2023-10-27T18:22:37.670Z'
/right-pad@1.0.1: '2016-08-04T20:06:31.415Z'
/rimraf@3.0.2: '2020-02-09T06:18:37.504Z'
/root-link-target@3.1.0: '2021-02-11T22:54:37.968Z'
/run-groups@3.0.1: '2020-06-06T16:33:09.423Z'
/rxjs@7.8.1: '2023-04-26T22:56:33.678Z'
/safe-buffer@5.2.1: '2020-05-10T16:37:30.776Z'
/safe-execa@0.1.2: '2022-07-18T01:09:17.517Z'
/safe-execa@0.1.3: '2023-01-04T13:29:20.746Z'
/safe-promise-defer@1.0.1: '2022-06-18T13:48:40.297Z'
/sanitize-filename@1.6.3: '2019-08-26T02:10:56.988Z'
/semver-range-intersect@0.3.1: '2019-07-20T15:11:40.243Z'
/semver-utils@1.1.4: '2018-10-09T04:14:32.485Z'
/semver@7.6.0: '2024-02-05T17:06:51.520Z'
/shx@0.3.4: '2022-01-10T02:16:53.953Z'
/signal-exit@3.0.7: '2022-02-03T21:05:34.544Z'
/sinon@16.1.3: '2023-10-19T06:07:46.164Z'
/sort-keys@4.2.0: '2020-12-30T07:11:45.350Z'
/split-cmd@1.1.0: '2023-12-21T02:01:15.343Z'
/ssri@10.0.5: '2023-08-14T18:54:54.458Z'
/stacktracey@2.1.8: '2022-01-10T09:22:17.926Z'
/string-length@4.0.2: '2021-03-17T06:47:19.439Z'
/strip-ansi@6.0.1: '2021-09-23T16:34:41.798Z'
/strip-bom@4.0.0: '2019-04-28T04:40:47.887Z'
/strip-comments-strings@1.2.0: '2022-06-12T23:34:53.852Z'
/symlink-dir@5.2.1: '2023-12-24T23:15:15.543Z'
/syncpack@8.5.14: '2023-02-07T19:51:38.723Z'
/tar-stream@2.2.0: '2020-12-29T10:22:57.508Z'
/tar@6.2.0: '2023-09-05T05:33:49.378Z'
/tempy@1.0.1: '2021-03-17T07:03:04.830Z'
/touch@3.1.0: '2017-06-30T23:40:39.606Z'
/tree-kill@1.2.2: '2019-12-11T18:34:21.876Z'
/ts-jest@29.1.1: '2023-06-30T07:49:33.771Z'
/ts-node@10.9.2: '2023-12-08T12:04:46.154Z'
/typescript@5.3.3: '2023-12-06T19:07:51.067Z'
/unified@9.2.2: '2021-07-01T16:39:11.345Z'
/unique-string@2.0.0: '2019-04-29T04:18:06.804Z'
/uuid@9.0.1: '2023-09-12T08:56:35.205Z'
/v8-compile-cache@2.4.0: '2023-08-14T21:38:46.534Z'
/validate-npm-package-name@5.0.0: '2022-10-14T05:22:33.343Z'
/verdaccio@5.20.1: '2023-01-29T15:45:43.205Z'
/version-selector-type@3.0.0: '2020-05-02T19:53:43.038Z'
/which@4.0.0: '2023-08-29T18:39:57.339Z'
/wrap-ansi@7.0.0: '2020-04-22T16:53:23.889Z'
/write-file-atomic@5.0.1: '2023-04-26T19:28:58.689Z'
/write-ini-file@4.0.1: '2022-12-23T20:19:59.977Z'
/write-json-file@4.3.0: '2020-02-07T08:54:49.528Z'
/write-json5-file@3.1.0: '2021-02-11T22:54:24.439Z'
/write-pkg@4.0.0: '2019-04-29T10:37:09.855Z'
/write-yaml-file@5.0.0: '2023-04-27T22:24:56.969Z'
/yaml-tag@1.1.0: '2017-06-06T16:19:00.523Z'

View File

@@ -42,6 +42,7 @@ Partial<Pick<Config,
| 'offline'
| 'selectedProjectsGraph'
| 'strictSsl'
| 'sslConfigs'
| 'unsafePerm'
| 'userAgent'
| 'userConfig'

View File

@@ -39,6 +39,7 @@ Config,
| 'dir'
| 'registries'
| 'cacheDir'
| 'sslConfigs'
>
export async function handler (opts: CatIndexCommandOptions, params: string[]) {

View File

@@ -44,7 +44,7 @@ export type CreateNewStoreControllerOptions = CreateResolverOptions & Pick<Confi
> & {
cafsLocker?: CafsLocker
ignoreFile?: (filename: string) => boolean
} & Partial<Pick<Config, 'userConfig' | 'deployAllFiles'>> & Pick<ClientOptions, 'resolveSymlinksInInjectedDirs'>
} & Partial<Pick<Config, 'userConfig' | 'deployAllFiles' | 'sslConfigs'>> & Pick<ClientOptions, 'resolveSymlinksInInjectedDirs'>
export async function createNewStoreController (
opts: CreateNewStoreControllerOptions
@@ -69,6 +69,7 @@ export async function createNewStoreController (
offline: opts.offline,
preferOffline: opts.preferOffline,
rawConfig: opts.rawConfig,
sslConfigs: opts.sslConfigs,
retry: {
factor: opts.fetchRetryFactor,
maxTimeout: opts.fetchRetryMaxtimeout,