fix: don't add trailing slash to registry URLs

ref #2933
ref #4034
ref #4032
This commit is contained in:
Zoltan Kochan
2021-11-23 00:20:32 +02:00
parent ee85f8c7f1
commit 30bfca9671
11 changed files with 47 additions and 27 deletions

View File

@@ -0,0 +1,10 @@
---
"@pnpm/config": patch
"@pnpm/normalize-registries": patch
---
When normalizing registry URLs, a trailing slash should only be added if the registry URL has no path.
So `https://registry.npmjs.org` is changed to `https://registry.npmjs.org/` but `https://npm.pkg.github.com/owner` is unchanged.
Related issue: [#4034](https://github.com/pnpm/pnpm/issues/4034).

View File

@@ -0,0 +1,12 @@
---
"pnpm": patch
---
pnpm should read the auth token of a github-registry-hosted package, when the registry path contains the owner [#4034](https://github.com/pnpm/pnpm/issues/4034).
So this should work:
```
@owner:registry=https://npm.pkg.github.com/owner
//npm.pkg.github.com/:_authToken=<token>
```

View File

@@ -42,6 +42,7 @@
"camelcase": "^6.2.0",
"can-write-to-dir": "^1.1.1",
"is-subdir": "^1.1.1",
"normalize-registry-url": "2.0.0",
"ramda": "^0.27.1",
"realpath-missing": "^1.1.0",
"which": "^2.0.2"

View File

@@ -1,13 +1,11 @@
import normalizeRegistryUrl from 'normalize-registry-url'
export default function getScopeRegistries (rawConfig: Object) {
const registries = {}
for (const configKey of Object.keys(rawConfig)) {
if (configKey[0] === '@' && configKey.endsWith(':registry')) {
registries[configKey.substr(0, configKey.indexOf(':'))] = normalizeRegistry(rawConfig[configKey])
registries[configKey.substr(0, configKey.indexOf(':'))] = normalizeRegistryUrl(rawConfig[configKey])
}
}
return registries
}
export function normalizeRegistry (registry: string) {
return registry.endsWith('/') ? registry : `${registry}/`
}

View File

@@ -10,10 +10,11 @@ import camelcase from 'camelcase'
import loadNpmConf from '@zkochan/npm-conf'
import npmTypes from '@zkochan/npm-conf/lib/types'
import { sync as canWriteToDir } from 'can-write-to-dir'
import normalizeRegistryUrl from 'normalize-registry-url'
import fromPairs from 'ramda/src/fromPairs'
import realpathMissing from 'realpath-missing'
import whichcb from 'which'
import getScopeRegistries, { normalizeRegistry } from './getScopeRegistries'
import getScopeRegistries from './getScopeRegistries'
import findBestGlobalPrefix from './findBestGlobalPrefix'
import { getCacheDir, getConfigDir, getDataDir, getStateDir } from './dirs'
import {
@@ -250,7 +251,7 @@ export default async (
{ 'user-agent': pnpmConfig.userAgent },
] as any) // eslint-disable-line @typescript-eslint/no-explicit-any
pnpmConfig.registries = {
default: normalizeRegistry(pnpmConfig.rawConfig.registry),
default: normalizeRegistryUrl(pnpmConfig.rawConfig.registry),
...getScopeRegistries(pnpmConfig.rawConfig),
}
pnpmConfig.lockfileDir = pnpmConfig.lockfileDir ?? pnpmConfig.lockfileDirectory ?? pnpmConfig.shrinkwrapDirectory

View File

@@ -178,7 +178,7 @@ test('when using --global, link-workspace-packages, shared-workspace-shrinwrap a
}
})
test('registries of scoped packages are read', async () => {
test('registries of scoped packages are read and normalized', async () => {
const { config } = await getConfig({
cliOptions: {
userconfig: path.join(__dirname, 'scoped-registries.ini'),
@@ -193,6 +193,7 @@ test('registries of scoped packages are read', async () => {
default: 'https://default.com/',
'@foo': 'https://foo.com/',
'@bar': 'https://bar.com/',
'@qar': 'https://qar.com/qar',
})
})
@@ -215,6 +216,7 @@ test('registries in current directory\'s .npmrc have bigger priority then global
default: 'https://pnpm.io/',
'@foo': 'https://foo.com/',
'@bar': 'https://bar.com/',
'@qar': 'https://qar.com/qar',
})
})

View File

@@ -1,3 +1,4 @@
@foo:registry=https://foo.com
@bar:registry=https://bar.com
@qar:registry=https://qar.com/qar
registry=https://default.com

View File

@@ -42,7 +42,7 @@
"@pnpm/resolver-base": "workspace:8.1.1",
"@pnpm/types": "workspace:7.6.0",
"dependency-path": "workspace:8.0.6",
"get-npm-tarball-url": "2.0.2",
"get-npm-tarball-url": "^2.0.3",
"ramda": "^0.27.1"
},
"funding": "https://opencollective.com/pnpm"

View File

@@ -27,7 +27,7 @@
},
"dependencies": {
"@pnpm/types": "workspace:7.6.0",
"normalize-registry-url": "1.0.0"
"normalize-registry-url": "2.0.0"
},
"homepage": "https://github.com/pnpm/pnpm/blob/master/packages/normalize-registries#readme",
"funding": "https://opencollective.com/pnpm"

View File

@@ -44,7 +44,7 @@
"@pnpm/types": "workspace:7.6.0",
"dependency-path": "workspace:8.0.6",
"encode-registry": "^3.0.0",
"get-npm-tarball-url": "2.0.2",
"get-npm-tarball-url": "^2.0.3",
"path-exists": "^4.0.0",
"ramda": "^0.27.1",
"replace-string": "^3.1.0",

27
pnpm-lock.yaml generated
View File

@@ -338,6 +338,7 @@ importers:
camelcase: ^6.2.0
can-write-to-dir: ^1.1.1
is-subdir: ^1.1.1
normalize-registry-url: 2.0.0
ramda: ^0.27.1
realpath-missing: ^1.1.0
symlink-dir: ^5.0.0
@@ -353,6 +354,7 @@ importers:
camelcase: 6.2.1
can-write-to-dir: 1.1.1
is-subdir: 1.2.0
normalize-registry-url: 2.0.0
ramda: 0.27.1
realpath-missing: 1.1.0
which: 2.0.2
@@ -1416,7 +1418,7 @@ importers:
'@types/js-yaml': ^4.0.0
'@types/ramda': 0.27.39
dependency-path: workspace:8.0.6
get-npm-tarball-url: 2.0.2
get-npm-tarball-url: ^2.0.3
ramda: ^0.27.1
tempy: ^1.0.0
write-yaml-file: ^4.2.0
@@ -1426,7 +1428,7 @@ importers:
'@pnpm/resolver-base': link:../resolver-base
'@pnpm/types': link:../types
dependency-path: link:../dependency-path
get-npm-tarball-url: 2.0.2
get-npm-tarball-url: 2.0.3
ramda: 0.27.1
devDependencies:
'@pnpm/lockfile-utils': 'link:'
@@ -1621,10 +1623,10 @@ importers:
specifiers:
'@pnpm/normalize-registries': 'link:'
'@pnpm/types': workspace:7.6.0
normalize-registry-url: 1.0.0
normalize-registry-url: 2.0.0
dependencies:
'@pnpm/types': link:../types
normalize-registry-url: 1.0.0
normalize-registry-url: 2.0.0
devDependencies:
'@pnpm/normalize-registries': 'link:'
@@ -3069,7 +3071,7 @@ importers:
'@types/semver': ^7.3.4
dependency-path: workspace:8.0.6
encode-registry: ^3.0.0
get-npm-tarball-url: 2.0.2
get-npm-tarball-url: ^2.0.3
path-exists: ^4.0.0
ramda: ^0.27.1
replace-string: ^3.1.0
@@ -3091,7 +3093,7 @@ importers:
'@pnpm/types': link:../types
dependency-path: link:../dependency-path
encode-registry: 3.0.0
get-npm-tarball-url: 2.0.2
get-npm-tarball-url: 2.0.3
path-exists: 4.0.0
ramda: 0.27.1
replace-string: 3.1.0
@@ -9315,11 +9317,9 @@ packages:
has: 1.0.3
has-symbols: 1.0.2
/get-npm-tarball-url/2.0.2:
resolution: {integrity: sha512-2dPhgT0K4pVyciTqdS0gr9nEwyCQwt9ql1/t5MCUMvcjWjAysjGJgT7Sx4n6oq3tFBjBN238mxX4RfTjT3838Q==}
engines: {node: '>=4'}
dependencies:
normalize-registry-url: 1.0.0
/get-npm-tarball-url/2.0.3:
resolution: {integrity: sha512-R/PW6RqyaBQNWYaSyfrh54/qtcnOp22FHCCiRhSSZj0FP3KQWCsxxt0DzIdVTbwTqe9CtQfvl/FPD4UIPt4pqw==}
engines: {node: '>=12.17'}
dev: false
/get-package-type/0.1.0:
@@ -12211,13 +12211,8 @@ packages:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
/normalize-registry-url/1.0.0:
resolution: {integrity: sha512-0v6T4851b72ykk5zEtFoN4QX/Fqyk7pouIj9xZyAvAe9jlDhAwT4z6FlwsoQCHjeuK2EGUoAwy/F4y4B1uZq9A==}
dev: false
/normalize-registry-url/2.0.0:
resolution: {integrity: sha512-3e9FwDyRAhbxXw4slm4Tjv40u78yPwMc/WZkACpqNQOs5sM7wic853AeTLkMFEVhivZkclGYlse8iYsklz0Yvg==}
dev: true
/normalize-url/6.1.0:
resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==}