From 714ca05d84f5cb7c55df0e32d3496b8ca6a9d47a Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Sun, 24 Mar 2019 22:45:26 +0200 Subject: [PATCH] fix: "pnpm store add" should read the registries of scoped pkgs close #1737 --- packages/package-store/typings/index.d.ts | 5 ---- packages/pnpm/src/cmd/store.ts | 2 +- packages/pnpm/src/types.ts | 2 ++ packages/pnpm/test/storeAdd.ts | 23 +++++++++++++++++++ packages/pnpm/typings/local.d.ts | 5 ---- .../src/resolveDependencies.ts | 13 ++--------- packages/supi/package.json | 1 - packages/supi/src/storeAdd.ts | 10 +++++--- packages/supi/test/storeUsages.ts | 6 ++--- packages/supi/typings/local.d.ts | 5 ---- packages/utils/src/index.ts | 2 ++ packages/utils/src/pickRegistryForPackage.ts | 13 +++++++++++ pnpm-lock.yaml | 2 -- 13 files changed, 53 insertions(+), 36 deletions(-) create mode 100644 packages/utils/src/pickRegistryForPackage.ts diff --git a/packages/package-store/typings/index.d.ts b/packages/package-store/typings/index.d.ts index 53985caf95..dc56c00b76 100644 --- a/packages/package-store/typings/index.d.ts +++ b/packages/package-store/typings/index.d.ts @@ -208,11 +208,6 @@ declare module 'is-subdir' { export = anything; } -declare module 'normalize-registry-url' { - function normalizeRegistryUrl (registry: string): string - export = normalizeRegistryUrl; -} - declare module 'rename-overwrite' { const anything: any; export = anything; diff --git a/packages/pnpm/src/cmd/store.ts b/packages/pnpm/src/cmd/store.ts index e989d3d7b7..12d2156f43 100644 --- a/packages/pnpm/src/cmd/store.ts +++ b/packages/pnpm/src/cmd/store.ts @@ -37,7 +37,7 @@ export default async function (input: string[], opts: PnpmOptions) { store = await createStoreController(opts) return storeAdd(input.slice(1), { prefix: opts.prefix, - registry: opts.registry, + registries: opts.registries, reporter: opts.reporter, storeController: store.ctrl, tag: opts.tag, diff --git a/packages/pnpm/src/types.ts b/packages/pnpm/src/types.ts index f8f90bf75b..6a8963baf4 100644 --- a/packages/pnpm/src/types.ts +++ b/packages/pnpm/src/types.ts @@ -1,6 +1,7 @@ import { LogBase, PackageManifest, + Registries, } from '@pnpm/types' export type ReadPackageHook = (pkg: PackageManifest) => PackageManifest @@ -35,6 +36,7 @@ export interface PnpmOptions { engineStrict?: boolean, nodeVersion?: string, offline?: boolean, + registries?: Registries, registry?: string, optional?: boolean, unsafePerm?: boolean, diff --git a/packages/pnpm/test/storeAdd.ts b/packages/pnpm/test/storeAdd.ts index 82b7de2852..8b0c03f75d 100644 --- a/packages/pnpm/test/storeAdd.ts +++ b/packages/pnpm/test/storeAdd.ts @@ -1,4 +1,5 @@ import { tempDir } from '@pnpm/prepare' +import fs = require('mz/fs') import loadJsonFile from 'load-json-file' import path = require('path') import exists = require('path-exists') @@ -7,6 +8,7 @@ import promisifyTape from 'tape-promise' import { execPnpm } from './utils' const test = promisifyTape(tape) +const testOnly = promisifyTape(tape.only) test('pnpm store add express@4.16.3', async function (t: tape.Test) { tempDir(t) @@ -27,3 +29,24 @@ test('pnpm store add express@4.16.3', async function (t: tape.Test) { 'package has been added to the store index', ) }) + +test('pnpm store add scoped package that uses not the standard registry', async function (t: tape.Test) { + tempDir(t) + await fs.writeFile('.npmrc', '@foo:registry=http://localhost:4873/', 'utf8') + + const storeDir = path.resolve('store') + + await execPnpm('store', 'add', '@foo/no-deps@1.0.0', '--registry', 'https://registry.npmjs.org/', '--store', storeDir) + + const pathToCheck = path.join(storeDir, '2', 'localhost+4873', '@foo', 'no-deps', '1.0.0') + t.ok(await exists(pathToCheck), `@foo/no-deps@1.0.0 is in store (at ${pathToCheck})`) + + const storeIndex = await loadJsonFile(path.join(storeDir, '2', 'store.json')) + t.deepEqual( + storeIndex, + { + 'localhost+4873/@foo/no-deps/1.0.0': [], + }, + 'package has been added to the store index', + ) +}) diff --git a/packages/pnpm/typings/local.d.ts b/packages/pnpm/typings/local.d.ts index 1df83bfaf7..c5dd18acd5 100644 --- a/packages/pnpm/typings/local.d.ts +++ b/packages/pnpm/typings/local.d.ts @@ -213,11 +213,6 @@ declare module 'is-subdir' { export = anything; } -declare module 'normalize-registry-url' { - function normalizeRegistryUrl (registry: string): string - export = normalizeRegistryUrl; -} - declare module 'encode-registry' { function encodeRegistry (registry: string): string export = encodeRegistry; diff --git a/packages/resolve-dependencies/src/resolveDependencies.ts b/packages/resolve-dependencies/src/resolveDependencies.ts index 4fbb67e1fb..c26502754c 100644 --- a/packages/resolve-dependencies/src/resolveDependencies.ts +++ b/packages/resolve-dependencies/src/resolveDependencies.ts @@ -36,6 +36,7 @@ import { createNodeId, getNonDevWantedDependencies, nodeIdContainsSequence, + pickRegistryForPackage, splitNodeId, WantedDependency, } from '@pnpm/utils' @@ -433,9 +434,6 @@ async function resolveDependency ( return null } - const scope = wantedDependency.alias && getScope(wantedDependency.alias) - const registry = scope && ctx.registries[scope] || ctx.registries.default - let pkgResponse!: PackageResponse try { pkgResponse = await ctx.storeController.requestPackage(wantedDependency, { @@ -447,7 +445,7 @@ async function resolveDependency ( lockfileDirectory: ctx.lockfileDirectory, preferredVersions: ctx.preferredVersions, prefix: ctx.prefix, - registry, + registry: wantedDependency.alias && pickRegistryForPackage(ctx.registries, wantedDependency.alias) || ctx.registries.default, sideEffectsCache: ctx.sideEffectsCache, // Unfortunately, even when run with --lockfile-only, we need the *real* package.json // so fetching of the tarball cannot be ever avoided. Related issue: https://github.com/pnpm/pnpm/issues/1176 @@ -715,13 +713,6 @@ function getResolvedPackage ( } } -function getScope (pkgName: string): string | null { - if (pkgName[0] === '@') { - return pkgName.substr(0, pkgName.indexOf('/')) - } - return null -} - function peerDependenciesWithoutOwn (pkg: PackageManifest) { if (!pkg.peerDependencies) return pkg.peerDependencies const ownDeps = new Set( diff --git a/packages/supi/package.json b/packages/supi/package.json index 4594fb3a09..1f48dceb20 100644 --- a/packages/supi/package.json +++ b/packages/supi/package.json @@ -69,7 +69,6 @@ "mkdirp-promise": "5.0.1", "mz": "2.7.0", "normalize-path": "3.0.0", - "normalize-registry-url": "1.0.0", "p-every": "2.0.0", "p-filter": "2.0.0", "p-limit": "2.2.0", diff --git a/packages/supi/src/storeAdd.ts b/packages/supi/src/storeAdd.ts index 07842e915e..f91a52067a 100644 --- a/packages/supi/src/storeAdd.ts +++ b/packages/supi/src/storeAdd.ts @@ -3,7 +3,8 @@ import { streamParser, } from '@pnpm/logger' import { StoreController } from '@pnpm/store-controller-types' -import normalizeRegistryUrl = require('normalize-registry-url') +import { Registries } from '@pnpm/types' +import { pickRegistryForPackage } from '@pnpm/utils' import parseWantedDependencies from './parseWantedDependencies' import { ReporterFunction } from './types' @@ -11,7 +12,7 @@ export default async function ( fuzzyDeps: string[], opts: { prefix?: string, - registry?: string, + registries?: Registries, reporter?: ReporterFunction, storeController: StoreController, tag?: string, @@ -34,6 +35,9 @@ export default async function ( let hasFailures = false const prefix = opts.prefix || process.cwd() + const registries = opts.registries || { + default: 'https://registry.npmjs.org/', + } await Promise.all(deps.map(async (dep) => { try { const pkgResponse = await opts.storeController.requestPackage(dep, { @@ -41,7 +45,7 @@ export default async function ( lockfileDirectory: prefix, preferredVersions: {}, prefix, - registry: normalizeRegistryUrl(opts.registry || 'https://registry.npmjs.org/'), + registry: dep.alias && pickRegistryForPackage(registries, dep.alias) || registries.default, }) await pkgResponse['fetchingFiles'] // tslint:disable-line:no-string-literal storeLogger.info(`+ ${pkgResponse.body.id}`) diff --git a/packages/supi/test/storeUsages.ts b/packages/supi/test/storeUsages.ts index 773b919a0a..570362e2e3 100644 --- a/packages/supi/test/storeUsages.ts +++ b/packages/supi/test/storeUsages.ts @@ -110,7 +110,7 @@ test('find usages for package in store but not in any projects', async (t: tape. // Add dependency directly to store (not to the project) await storeAdd(['is-negative'], { - registry: registries.default, + registries, tag: '2.1.0', ...opts }) @@ -142,13 +142,13 @@ test('find usages for multiple packages in store but not in any projects', async // Add dependencies directly to store (not to the project). Note we add different versions of the same package await storeAdd(['is-negative'], { - registry: registries.default, + registries, tag: '2.0.0', ...opts }) await store.storeHas('is-negative', '2.0.0') await storeAdd(['is-negative'], { - registry: registries.default, + registries, tag: '2.1.0', ...opts }) diff --git a/packages/supi/typings/local.d.ts b/packages/supi/typings/local.d.ts index f9919d0fcc..c45b6cc3f7 100644 --- a/packages/supi/typings/local.d.ts +++ b/packages/supi/typings/local.d.ts @@ -207,11 +207,6 @@ declare module 'is-subdir' { export = anything; } -declare module 'normalize-registry-url' { - function normalizeRegistryUrl (registry: string): string - export = normalizeRegistryUrl; -} - declare module 'rename-overwrite' { const anything: any; export = anything; diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index ba0aa431fd..14749c374c 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1,6 +1,7 @@ import getAllDependenciesFromPackage from './getAllDependenciesFromPackage' import getSaveType from './getSaveType' import normalizeRegistries, { DEFAULT_REGISTRIES } from './normalizeRegistries' +import pickRegistryForPackage from './pickRegistryForPackage' import realNodeModulesDir from './realNodeModulesDir' import safeReadPackage, { fromDir as safeReadPackageFromDir } from './safeReadPkg' @@ -11,6 +12,7 @@ export { getAllDependenciesFromPackage, getSaveType, normalizeRegistries, + pickRegistryForPackage, realNodeModulesDir, safeReadPackage, safeReadPackageFromDir, diff --git a/packages/utils/src/pickRegistryForPackage.ts b/packages/utils/src/pickRegistryForPackage.ts new file mode 100644 index 0000000000..6c9c4b870f --- /dev/null +++ b/packages/utils/src/pickRegistryForPackage.ts @@ -0,0 +1,13 @@ +import { Registries } from '@pnpm/types' + +export default (registries: Registries, packageName: string) => { + const scope = getScope(packageName) + return scope && registries[scope] || registries.default +} + +function getScope (pkgName: string): string | null { + if (pkgName[0] === '@') { + return pkgName.substr(0, pkgName.indexOf('/')) + } + return null +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7cacc2fefd..042f1cc911 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1836,7 +1836,6 @@ importers: mkdirp-promise: 5.0.1 mz: 2.7.0 normalize-path: 3.0.0 - normalize-registry-url: 1.0.0 p-every: 2.0.0 p-filter: 2.0.0 p-limit: 2.2.0 @@ -1971,7 +1970,6 @@ importers: mz: 2.7.0 ncp: 2.0.0 normalize-path: 3.0.0 - normalize-registry-url: 1.0.0 npm-run-all: 4.1.5 npm-scripts-info: 0.3.9 p-every: 2.0.0