From e07fe17d9e0ebed06efb624d870cf2cbbc75bf6c Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Tue, 23 Nov 2021 00:20:32 +0200 Subject: [PATCH] fix: don't add trailing slash to registry URLs ref #2933 close #4034 --- .changeset/forty-yaks-cheat.md | 10 +++++++++ .changeset/silent-kangaroos-whisper.md | 12 ++++++++++ packages/config/package.json | 1 + packages/config/src/getScopeRegistries.ts | 8 +++---- packages/config/src/index.ts | 5 +++-- packages/config/test/index.ts | 4 +++- packages/config/test/scoped-registries.ini | 1 + packages/lockfile-utils/package.json | 2 +- packages/normalize-registries/package.json | 2 +- packages/resolve-dependencies/package.json | 2 +- pnpm-lock.yaml | 26 +++++++++++----------- 11 files changed, 49 insertions(+), 24 deletions(-) create mode 100644 .changeset/forty-yaks-cheat.md create mode 100644 .changeset/silent-kangaroos-whisper.md diff --git a/.changeset/forty-yaks-cheat.md b/.changeset/forty-yaks-cheat.md new file mode 100644 index 00000000000..a34dc9076cd --- /dev/null +++ b/.changeset/forty-yaks-cheat.md @@ -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). diff --git a/.changeset/silent-kangaroos-whisper.md b/.changeset/silent-kangaroos-whisper.md new file mode 100644 index 00000000000..cc841421e4f --- /dev/null +++ b/.changeset/silent-kangaroos-whisper.md @@ -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= +``` diff --git a/packages/config/package.json b/packages/config/package.json index acf2f9917ea..4770e3883da 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -41,6 +41,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" diff --git a/packages/config/src/getScopeRegistries.ts b/packages/config/src/getScopeRegistries.ts index 710cc74168d..dafa323fe17 100644 --- a/packages/config/src/getScopeRegistries.ts +++ b/packages/config/src/getScopeRegistries.ts @@ -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}/` -} diff --git a/packages/config/src/index.ts b/packages/config/src/index.ts index 09942b56aad..73961e18a5c 100644 --- a/packages/config/src/index.ts +++ b/packages/config/src/index.ts @@ -9,10 +9,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 { @@ -249,7 +250,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 diff --git a/packages/config/test/index.ts b/packages/config/test/index.ts index 1d830965768..a09b362b482 100644 --- a/packages/config/test/index.ts +++ b/packages/config/test/index.ts @@ -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', }) }) diff --git a/packages/config/test/scoped-registries.ini b/packages/config/test/scoped-registries.ini index 946a21fbd8c..ce97b843d09 100644 --- a/packages/config/test/scoped-registries.ini +++ b/packages/config/test/scoped-registries.ini @@ -1,3 +1,4 @@ @foo:registry=https://foo.com @bar:registry=https://bar.com +@qar:registry=https://qar.com/qar registry=https://default.com diff --git a/packages/lockfile-utils/package.json b/packages/lockfile-utils/package.json index 9d53a2fd300..da92240a09e 100644 --- a/packages/lockfile-utils/package.json +++ b/packages/lockfile-utils/package.json @@ -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" diff --git a/packages/normalize-registries/package.json b/packages/normalize-registries/package.json index 0226e4d4fa9..e8074de0ddd 100644 --- a/packages/normalize-registries/package.json +++ b/packages/normalize-registries/package.json @@ -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" diff --git a/packages/resolve-dependencies/package.json b/packages/resolve-dependencies/package.json index e2a38b3691c..dfcd8ed756f 100644 --- a/packages/resolve-dependencies/package.json +++ b/packages/resolve-dependencies/package.json @@ -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", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7dc4612a077..7b129bfe2a3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -337,6 +337,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 @@ -351,6 +352,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 @@ -1412,7 +1414,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 @@ -1422,7 +1424,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:' @@ -1617,10 +1619,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:' @@ -3050,7 +3052,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 @@ -3072,7 +3074,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 @@ -9052,11 +9054,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: @@ -11868,8 +11868,8 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - /normalize-registry-url/1.0.0: - resolution: {integrity: sha512-0v6T4851b72ykk5zEtFoN4QX/Fqyk7pouIj9xZyAvAe9jlDhAwT4z6FlwsoQCHjeuK2EGUoAwy/F4y4B1uZq9A==} + /normalize-registry-url/2.0.0: + resolution: {integrity: sha512-3e9FwDyRAhbxXw4slm4Tjv40u78yPwMc/WZkACpqNQOs5sM7wic853AeTLkMFEVhivZkclGYlse8iYsklz0Yvg==} dev: false /now-and-later/2.0.1: