mirror of
https://github.com/pnpm/pnpm.git
synced 2025-12-24 07:38:12 -05:00
refactor: pass whole registries to the resolver (#9375)
This commit is contained in:
17
.changeset/evil-areas-thank.md
Normal file
17
.changeset/evil-areas-thank.md
Normal file
@@ -0,0 +1,17 @@
|
||||
---
|
||||
"@pnpm/store-controller-types": major
|
||||
"@pnpm/resolver-base": major
|
||||
"@pnpm/npm-resolver": major
|
||||
"@pnpm/plugin-commands-publishing": patch
|
||||
"@pnpm/resolve-dependencies": patch
|
||||
"@pnpm/package-store": major
|
||||
"@pnpm/package-requester": major
|
||||
"@pnpm/plugin-commands-store": patch
|
||||
"@pnpm/outdated": patch
|
||||
"@pnpm/server": major
|
||||
"@pnpm/store-connection-manager": major
|
||||
"@pnpm/core": major
|
||||
"@pnpm/headless": major
|
||||
---
|
||||
|
||||
The resolving function now takes a `registries` object, so it finds the required registry itself instead of receiving it from package requester.
|
||||
@@ -47,7 +47,6 @@
|
||||
"@pnpm/log.group": "catalog:",
|
||||
"@pnpm/package-bins": "workspace:*",
|
||||
"@pnpm/parse-wanted-dependency": "workspace:*",
|
||||
"@pnpm/pick-registry-for-package": "workspace:*",
|
||||
"@pnpm/plugin-commands-env": "workspace:*",
|
||||
"@pnpm/plugin-commands-installation": "workspace:*",
|
||||
"@pnpm/read-package-json": "workspace:*",
|
||||
|
||||
@@ -11,7 +11,6 @@ import { PnpmError } from '@pnpm/error'
|
||||
import { add } from '@pnpm/plugin-commands-installation'
|
||||
import { readPackageJsonFromDir } from '@pnpm/read-package-json'
|
||||
import { getBinsFromPackageManifest } from '@pnpm/package-bins'
|
||||
import { pickRegistryForPackage } from '@pnpm/pick-registry-for-package'
|
||||
import { type PnpmSettings } from '@pnpm/types'
|
||||
import execa from 'execa'
|
||||
import pick from 'ramda/src/pick'
|
||||
@@ -95,7 +94,6 @@ export async function handler (
|
||||
lockfileDir: opts.lockfileDir ?? opts.dir,
|
||||
preferredVersions: {},
|
||||
projectDir: opts.dir,
|
||||
registry: pickRegistryForPackage(opts.registries, alias, pref),
|
||||
})
|
||||
return resolved.id
|
||||
}))
|
||||
|
||||
@@ -27,9 +27,6 @@
|
||||
{
|
||||
"path": "../../config/config"
|
||||
},
|
||||
{
|
||||
"path": "../../config/pick-registry-for-package"
|
||||
},
|
||||
{
|
||||
"path": "../../crypto/hash"
|
||||
},
|
||||
|
||||
@@ -45,7 +45,6 @@
|
||||
"@pnpm/parse-wanted-dependency": "workspace:*",
|
||||
"@pnpm/patching.apply-patch": "workspace:*",
|
||||
"@pnpm/pick-fetcher": "workspace:*",
|
||||
"@pnpm/pick-registry-for-package": "workspace:*",
|
||||
"@pnpm/plugin-commands-installation": "workspace:*",
|
||||
"@pnpm/read-package-json": "workspace:*",
|
||||
"@pnpm/read-project-manifest": "workspace:*",
|
||||
|
||||
@@ -3,7 +3,6 @@ import {
|
||||
createOrConnectStoreController,
|
||||
type CreateStoreControllerOptions,
|
||||
} from '@pnpm/store-connection-manager'
|
||||
import { pickRegistryForPackage } from '@pnpm/pick-registry-for-package'
|
||||
import type { ParseWantedDependencyResult } from '@pnpm/parse-wanted-dependency'
|
||||
|
||||
export type WritePackageOptions = CreateStoreControllerOptions & Pick<Config, 'registries'>
|
||||
@@ -18,7 +17,6 @@ export async function writePackage (dep: ParseWantedDependencyResult, dest: stri
|
||||
lockfileDir: opts.dir,
|
||||
preferredVersions: {},
|
||||
projectDir: opts.dir,
|
||||
registry: (dep.alias && pickRegistryForPackage(opts.registries, dep.alias)) ?? opts.registries.default,
|
||||
})
|
||||
const { files } = await pkgResponse.fetching!()
|
||||
await store.ctrl.importPackage(dest, {
|
||||
|
||||
@@ -24,9 +24,6 @@
|
||||
{
|
||||
"path": "../../config/config-writer"
|
||||
},
|
||||
{
|
||||
"path": "../../config/pick-registry-for-package"
|
||||
},
|
||||
{
|
||||
"path": "../../crypto/hash"
|
||||
},
|
||||
|
||||
@@ -6,6 +6,9 @@ test('createClient()', () => {
|
||||
authConfig: { registry: 'https://registry.npmjs.org/' },
|
||||
cacheDir: '',
|
||||
rawConfig: {},
|
||||
registries: {
|
||||
default: 'https://reigstry.npmjs.org/',
|
||||
},
|
||||
})
|
||||
expect(typeof client === 'object').toBeTruthy()
|
||||
})
|
||||
@@ -15,6 +18,9 @@ test('createResolver()', () => {
|
||||
authConfig: { registry: 'https://registry.npmjs.org/' },
|
||||
cacheDir: '',
|
||||
rawConfig: {},
|
||||
registries: {
|
||||
default: 'https://reigstry.npmjs.org/',
|
||||
},
|
||||
})
|
||||
expect(typeof resolve === 'function').toBeTruthy()
|
||||
})
|
||||
|
||||
@@ -6,16 +6,18 @@ import { testDefaults } from '../utils'
|
||||
test('a package with a huge amount of circular dependencies and many peer dependencies should successfully be resolved', async () => {
|
||||
prepareEmpty()
|
||||
|
||||
const registries = {
|
||||
default: 'https://registry.npmjs.org/',
|
||||
'@teambit': 'https://node-registry.bit.cloud/',
|
||||
}
|
||||
await addDependenciesToPackage({},
|
||||
['@teambit/bit@0.0.745'],
|
||||
testDefaults({
|
||||
fastUnpack: true,
|
||||
lockfileOnly: true,
|
||||
registries: {
|
||||
'@teambit': 'https://node-registry.bit.cloud/',
|
||||
},
|
||||
registries,
|
||||
strictPeerDependencies: false,
|
||||
})
|
||||
}, { registries })
|
||||
)
|
||||
|
||||
expect(fs.existsSync('pnpm-lock.yaml')).toBeTruthy()
|
||||
|
||||
@@ -1208,6 +1208,7 @@ test('two dependencies have the same version and name. The only difference is th
|
||||
rootDir: process.cwd() as ProjectRootDir,
|
||||
}, testDefaults({
|
||||
fastUnpack: false,
|
||||
}, {
|
||||
registries: {
|
||||
default: 'https://registry.npmjs.org/',
|
||||
},
|
||||
|
||||
@@ -450,11 +450,12 @@ test('package is not marked optional if it is also a subdep of a regular depende
|
||||
test('scoped module from different registry', async () => {
|
||||
const project = prepareEmpty()
|
||||
|
||||
const opts = testDefaults()
|
||||
opts.registries!.default = 'https://registry.npmjs.org/'
|
||||
opts.registries!['@zkochan'] = `http://localhost:${REGISTRY_MOCK_PORT}`
|
||||
opts.registries!['@foo'] = `http://localhost:${REGISTRY_MOCK_PORT}`
|
||||
await addDependenciesToPackage({}, ['@zkochan/foo', '@foo/has-dep-from-same-scope', 'is-positive'], opts)
|
||||
const registries = {
|
||||
default: 'https://registry.npmjs.org/',
|
||||
'@zkochan': `http://localhost:${REGISTRY_MOCK_PORT}`,
|
||||
'@foo': `http://localhost:${REGISTRY_MOCK_PORT}`,
|
||||
}
|
||||
await addDependenciesToPackage({}, ['@zkochan/foo', '@foo/has-dep-from-same-scope', 'is-positive'], testDefaults({ registries }, { registries }))
|
||||
|
||||
project.has('@zkochan/foo')
|
||||
|
||||
@@ -1081,10 +1082,11 @@ test('tarball domain differs from registry domain', async () => {
|
||||
], testDefaults({
|
||||
fastUnpack: false,
|
||||
lockfileOnly: true,
|
||||
save: true,
|
||||
}, {
|
||||
registries: {
|
||||
default: 'https://registry.example.com',
|
||||
},
|
||||
save: true,
|
||||
})
|
||||
)
|
||||
|
||||
|
||||
@@ -185,7 +185,6 @@ async function resolveAndFetch (
|
||||
preferredVersions: options.preferredVersions,
|
||||
preferWorkspacePackages: options.preferWorkspacePackages,
|
||||
projectDir: options.projectDir,
|
||||
registry: options.registry,
|
||||
workspacePackages: options.workspacePackages,
|
||||
updateToLatest: options.update === 'latest',
|
||||
injectWorkspacePackages: options.injectWorkspacePackages,
|
||||
|
||||
@@ -21,12 +21,15 @@ const registry = `http://localhost:${REGISTRY_MOCK_PORT}`
|
||||
const f = fixtures(__dirname)
|
||||
const IS_POSITIVE_TARBALL = f.find('is-positive-1.0.0.tgz')
|
||||
|
||||
const registries = { default: registry }
|
||||
|
||||
const authConfig = { registry }
|
||||
|
||||
const { resolve, fetchers } = createClient({
|
||||
authConfig,
|
||||
cacheDir: '.store',
|
||||
rawConfig: {},
|
||||
registries,
|
||||
})
|
||||
|
||||
test('request package', async () => {
|
||||
@@ -49,7 +52,6 @@ test('request package', async () => {
|
||||
lockfileDir: projectDir,
|
||||
preferredVersions: {},
|
||||
projectDir,
|
||||
registry,
|
||||
})
|
||||
|
||||
expect(pkgResponse).toBeTruthy()
|
||||
@@ -91,7 +93,6 @@ test('request package but skip fetching', async () => {
|
||||
lockfileDir: projectDir,
|
||||
preferredVersions: {},
|
||||
projectDir,
|
||||
registry,
|
||||
skipFetch: true,
|
||||
})
|
||||
|
||||
@@ -138,7 +139,6 @@ test('request package but skip fetching, when resolution is already available',
|
||||
lockfileDir: projectDir,
|
||||
preferredVersions: {},
|
||||
projectDir,
|
||||
registry,
|
||||
skipFetch: true,
|
||||
update: false,
|
||||
}) as PackageResponse & {
|
||||
@@ -179,7 +179,6 @@ test('refetch local tarball if its integrity has changed', async () => {
|
||||
lockfileDir: projectDir,
|
||||
preferredVersions: {},
|
||||
projectDir,
|
||||
registry,
|
||||
skipFetch: true,
|
||||
update: false,
|
||||
} satisfies RequestPackageOptions
|
||||
@@ -286,7 +285,6 @@ test('refetch local tarball if its integrity has changed. The requester does not
|
||||
lockfileDir: projectDir,
|
||||
preferredVersions: {},
|
||||
projectDir,
|
||||
registry,
|
||||
update: false,
|
||||
} satisfies RequestPackageOptions
|
||||
|
||||
@@ -504,6 +502,7 @@ test('fetchPackageToStore() does not cache errors', async () => {
|
||||
rawConfig: {},
|
||||
retry: { retries: 0 },
|
||||
cacheDir: '.pnpm',
|
||||
registries,
|
||||
})
|
||||
|
||||
const storeDir = tempy.directory()
|
||||
@@ -578,7 +577,6 @@ test('always return a package manifest in the response', async () => {
|
||||
lockfileDir: projectDir,
|
||||
preferredVersions: {},
|
||||
projectDir,
|
||||
registry,
|
||||
}) as PackageResponse & { body: { manifest: { name: string } } }
|
||||
|
||||
expect(pkgResponse.body).toBeTruthy()
|
||||
@@ -598,7 +596,6 @@ test('always return a package manifest in the response', async () => {
|
||||
lockfileDir: projectDir,
|
||||
preferredVersions: {},
|
||||
projectDir,
|
||||
registry,
|
||||
}) as PackageResponse & { fetching: () => Promise<PkgRequestFetchResult> }
|
||||
|
||||
expect(pkgResponse.body).toBeTruthy()
|
||||
@@ -774,7 +771,6 @@ test('do not fetch an optional package that is not installable', async () => {
|
||||
lockfileDir: projectDir,
|
||||
preferredVersions: {},
|
||||
projectDir,
|
||||
registry,
|
||||
})
|
||||
|
||||
expect(pkgResponse).toBeTruthy()
|
||||
@@ -813,7 +809,6 @@ test('fetch a git package without a package.json', async () => {
|
||||
lockfileDir: projectDir,
|
||||
preferredVersions: {},
|
||||
projectDir,
|
||||
registry,
|
||||
}) as PackageResponse & { body: { manifest: { name: string } } }
|
||||
|
||||
expect(pkgResponse.body).toBeTruthy()
|
||||
@@ -845,7 +840,6 @@ test('throw exception if the package data in the store differs from the expected
|
||||
lockfileDir: projectDir,
|
||||
preferredVersions: {},
|
||||
projectDir,
|
||||
registry,
|
||||
})
|
||||
await pkgResponse.fetching!()
|
||||
}
|
||||
@@ -982,7 +976,6 @@ test("don't throw an error if the package was updated, so the expectedPkg has a
|
||||
lockfileDir: projectDir,
|
||||
preferredVersions: {},
|
||||
projectDir,
|
||||
registry,
|
||||
})
|
||||
await pkgResponse.fetching!()
|
||||
}
|
||||
@@ -1001,7 +994,6 @@ test("don't throw an error if the package was updated, so the expectedPkg has a
|
||||
lockfileDir: tempy.directory(),
|
||||
preferredVersions: {},
|
||||
projectDir,
|
||||
registry,
|
||||
expectedPkg: {
|
||||
name: 'is-positive',
|
||||
version: '3.0.0',
|
||||
@@ -1029,7 +1021,6 @@ test('the version in the bundled manifest should be normalized', async () => {
|
||||
lockfileDir: tempy.directory(),
|
||||
preferredVersions: {},
|
||||
projectDir: tempy.directory(),
|
||||
registry,
|
||||
})
|
||||
expect((await pkgResponse.fetching!()).bundledManifest).toStrictEqual(expect.objectContaining({
|
||||
version: '1.2.1',
|
||||
@@ -1060,7 +1051,6 @@ test('should skip store integrity check and resolve manifest if fetchRawManifest
|
||||
lockfileDir: projectDir,
|
||||
preferredVersions: {},
|
||||
projectDir,
|
||||
registry,
|
||||
})
|
||||
|
||||
await pkgResponse.fetching!()
|
||||
|
||||
@@ -46,7 +46,6 @@
|
||||
"@pnpm/patching.config": "workspace:*",
|
||||
"@pnpm/patching.types": "workspace:*",
|
||||
"@pnpm/pick-fetcher": "workspace:*",
|
||||
"@pnpm/pick-registry-for-package": "workspace:*",
|
||||
"@pnpm/read-package-json": "workspace:*",
|
||||
"@pnpm/resolver-base": "workspace:*",
|
||||
"@pnpm/semver.peer-range": "workspace:*",
|
||||
|
||||
@@ -17,7 +17,6 @@ import {
|
||||
} from '@pnpm/lockfile.utils'
|
||||
import { logger } from '@pnpm/logger'
|
||||
import { type PatchGroupRecord, getPatchInfo } from '@pnpm/patching.config'
|
||||
import { pickRegistryForPackage } from '@pnpm/pick-registry-for-package'
|
||||
import {
|
||||
type DirectoryResolution,
|
||||
DIRECT_DEP_SELECTOR_WEIGHT,
|
||||
@@ -1279,7 +1278,6 @@ async function resolveDependency (
|
||||
)
|
||||
? ctx.lockfileDir
|
||||
: options.parentPkg.rootDir,
|
||||
registry: wantedDependency.alias && pickRegistryForPackage(ctx.registries, wantedDependency.alias, wantedDependency.pref) || ctx.registries.default,
|
||||
skipFetch: ctx.dryRun,
|
||||
update: options.update,
|
||||
workspacePackages: ctx.workspacePackages,
|
||||
|
||||
@@ -15,9 +15,6 @@
|
||||
{
|
||||
"path": "../../catalogs/types"
|
||||
},
|
||||
{
|
||||
"path": "../../config/pick-registry-for-package"
|
||||
},
|
||||
{
|
||||
"path": "../../fetching/pick-fetcher"
|
||||
},
|
||||
|
||||
24
pnpm-lock.yaml
generated
24
pnpm-lock.yaml
generated
@@ -2619,9 +2619,6 @@ importers:
|
||||
'@pnpm/parse-wanted-dependency':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/parse-wanted-dependency
|
||||
'@pnpm/pick-registry-for-package':
|
||||
specifier: workspace:*
|
||||
version: link:../../config/pick-registry-for-package
|
||||
'@pnpm/plugin-commands-env':
|
||||
specifier: workspace:*
|
||||
version: link:../../env/plugin-commands-env
|
||||
@@ -4327,9 +4324,6 @@ importers:
|
||||
'@pnpm/pick-fetcher':
|
||||
specifier: workspace:*
|
||||
version: link:../../fetching/pick-fetcher
|
||||
'@pnpm/pick-registry-for-package':
|
||||
specifier: workspace:*
|
||||
version: link:../../config/pick-registry-for-package
|
||||
'@pnpm/plugin-commands-installation':
|
||||
specifier: workspace:*
|
||||
version: link:../../pkg-manager/plugin-commands-installation
|
||||
@@ -5750,9 +5744,6 @@ importers:
|
||||
'@pnpm/pick-fetcher':
|
||||
specifier: workspace:*
|
||||
version: link:../../fetching/pick-fetcher
|
||||
'@pnpm/pick-registry-for-package':
|
||||
specifier: workspace:*
|
||||
version: link:../../config/pick-registry-for-package
|
||||
'@pnpm/read-package-json':
|
||||
specifier: workspace:*
|
||||
version: link:../../pkg-manifest/read-package-json
|
||||
@@ -6081,9 +6072,6 @@ importers:
|
||||
'@pnpm/parse-cli-args':
|
||||
specifier: workspace:*
|
||||
version: link:../cli/parse-cli-args
|
||||
'@pnpm/pick-registry-for-package':
|
||||
specifier: workspace:*
|
||||
version: link:../config/pick-registry-for-package
|
||||
'@pnpm/plugin-commands-audit':
|
||||
specifier: workspace:*
|
||||
version: link:../lockfile/plugin-commands-audit
|
||||
@@ -6755,6 +6743,9 @@ importers:
|
||||
'@pnpm/graceful-fs':
|
||||
specifier: workspace:*
|
||||
version: link:../../fs/graceful-fs
|
||||
'@pnpm/pick-registry-for-package':
|
||||
specifier: workspace:*
|
||||
version: link:../../config/pick-registry-for-package
|
||||
'@pnpm/resolve-workspace-range':
|
||||
specifier: workspace:*
|
||||
version: link:../../workspace/resolve-workspace-range
|
||||
@@ -7625,9 +7616,6 @@ importers:
|
||||
'@pnpm/parse-wanted-dependency':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/parse-wanted-dependency
|
||||
'@pnpm/pick-registry-for-package':
|
||||
specifier: workspace:*
|
||||
version: link:../../config/pick-registry-for-package
|
||||
'@pnpm/store-connection-manager':
|
||||
specifier: workspace:*
|
||||
version: link:../store-connection-manager
|
||||
@@ -7731,9 +7719,6 @@ importers:
|
||||
'@pnpm/parse-wanted-dependency':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/parse-wanted-dependency
|
||||
'@pnpm/pick-registry-for-package':
|
||||
specifier: workspace:*
|
||||
version: link:../../config/pick-registry-for-package
|
||||
'@pnpm/store-path':
|
||||
specifier: workspace:*
|
||||
version: link:../store-path
|
||||
@@ -7993,9 +7978,6 @@ importers:
|
||||
'@pnpm/logger':
|
||||
specifier: '>=5.1.0 <1001.0.0'
|
||||
version: 1000.0.0
|
||||
'@pnpm/pick-registry-for-package':
|
||||
specifier: workspace:*
|
||||
version: link:../../config/pick-registry-for-package
|
||||
'@pnpm/read-project-manifest':
|
||||
specifier: workspace:*
|
||||
version: link:../../pkg-manifest/read-project-manifest
|
||||
|
||||
@@ -99,7 +99,6 @@
|
||||
"@pnpm/modules-yaml": "workspace:*",
|
||||
"@pnpm/nopt": "catalog:",
|
||||
"@pnpm/parse-cli-args": "workspace:*",
|
||||
"@pnpm/pick-registry-for-package": "workspace:*",
|
||||
"@pnpm/plugin-commands-audit": "workspace:*",
|
||||
"@pnpm/plugin-commands-completion": "workspace:*",
|
||||
"@pnpm/plugin-commands-config": "workspace:*",
|
||||
|
||||
@@ -2,7 +2,6 @@ import path from 'path'
|
||||
import { packageManager } from '@pnpm/cli-meta'
|
||||
import { type Config } from '@pnpm/config'
|
||||
import { createResolver } from '@pnpm/client'
|
||||
import { pickRegistryForPackage } from '@pnpm/pick-registry-for-package'
|
||||
import { updateCheckLogger } from '@pnpm/core-loggers'
|
||||
import loadJsonFile from 'load-json-file'
|
||||
import writeJsonFile from 'write-json-file'
|
||||
@@ -36,7 +35,6 @@ export async function checkForUpdates (config: Config): Promise<void> {
|
||||
lockfileDir: config.lockfileDir ?? config.dir,
|
||||
preferredVersions: {},
|
||||
projectDir: config.dir,
|
||||
registry: pickRegistryForPackage(config.registries, packageManager.name, 'latest'),
|
||||
})
|
||||
if (resolution?.manifest?.version) {
|
||||
updateCheckLogger.debug({
|
||||
|
||||
@@ -51,9 +51,6 @@
|
||||
{
|
||||
"path": "../config/config"
|
||||
},
|
||||
{
|
||||
"path": "../config/pick-registry-for-package"
|
||||
},
|
||||
{
|
||||
"path": "../config/plugin-commands-config"
|
||||
},
|
||||
|
||||
@@ -158,7 +158,6 @@ async function isAlreadyPublished (
|
||||
lockfileDir: opts.lockfileDir,
|
||||
preferredVersions: {},
|
||||
projectDir: opts.dir,
|
||||
registry: pickRegistryForPackage(opts.registries, pkgName, pkgVersion),
|
||||
})
|
||||
return true
|
||||
} catch (err: any) { // eslint-disable-line
|
||||
|
||||
@@ -6,6 +6,9 @@ test('createResolver()', () => {
|
||||
const getAuthHeader = () => undefined
|
||||
const { resolve } = createResolver(createFetchFromRegistry({}), getAuthHeader, {
|
||||
cacheDir: '.cache',
|
||||
registries: {
|
||||
default: 'https://registry.npmjs.org/',
|
||||
},
|
||||
})
|
||||
expect(typeof resolve).toEqual('function')
|
||||
})
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
"@pnpm/error": "workspace:*",
|
||||
"@pnpm/fetching-types": "workspace:*",
|
||||
"@pnpm/graceful-fs": "workspace:*",
|
||||
"@pnpm/pick-registry-for-package": "workspace:*",
|
||||
"@pnpm/resolve-workspace-range": "workspace:*",
|
||||
"@pnpm/resolver-base": "workspace:*",
|
||||
"@pnpm/types": "workspace:*",
|
||||
|
||||
@@ -6,6 +6,7 @@ import {
|
||||
type GetAuthHeader,
|
||||
type RetryTimeoutOptions,
|
||||
} from '@pnpm/fetching-types'
|
||||
import { pickRegistryForPackage } from '@pnpm/pick-registry-for-package'
|
||||
import { resolveWorkspaceRange } from '@pnpm/resolve-workspace-range'
|
||||
import {
|
||||
type PkgResolutionId,
|
||||
@@ -17,6 +18,7 @@ import {
|
||||
type WorkspacePackagesByVersion,
|
||||
type WorkspaceResolveResult,
|
||||
} from '@pnpm/resolver-base'
|
||||
import { type Registries } from '@pnpm/types'
|
||||
import { LRUCache } from 'lru-cache'
|
||||
import normalize from 'normalize-path'
|
||||
import pMemoize from 'p-memoize'
|
||||
@@ -65,6 +67,7 @@ export interface ResolverFactoryOptions {
|
||||
preferOffline?: boolean
|
||||
retry?: RetryTimeoutOptions
|
||||
timeout?: number
|
||||
registries: Registries
|
||||
}
|
||||
|
||||
export type NpmResolver = (wantedDependency: WantedDependency, opts: ResolveFromNpmOptions) => Promise<ResolveResult | null>
|
||||
@@ -101,6 +104,7 @@ export function createNpmResolver (
|
||||
preferOffline: opts.preferOffline,
|
||||
cacheDir: opts.cacheDir,
|
||||
}),
|
||||
registries: opts.registries,
|
||||
}),
|
||||
clearCache: () => {
|
||||
metaCache.clear()
|
||||
@@ -115,7 +119,6 @@ export type ResolveFromNpmOptions = {
|
||||
pickLowestVersion?: boolean
|
||||
dryRun?: boolean
|
||||
lockfileDir?: string
|
||||
registry: string
|
||||
preferredVersions?: PreferredVersions
|
||||
preferWorkspacePackages?: boolean
|
||||
updateToLatest?: boolean
|
||||
@@ -132,18 +135,22 @@ async function resolveNpm (
|
||||
ctx: {
|
||||
pickPackage: (spec: RegistryPackageSpec, opts: PickPackageOptions) => ReturnType<typeof pickPackage>
|
||||
getAuthHeaderValueByURI: (registry: string) => string | undefined
|
||||
registries: Registries
|
||||
},
|
||||
wantedDependency: WantedDependency,
|
||||
opts: ResolveFromNpmOptions
|
||||
): Promise<ResolveResult | null> {
|
||||
const defaultTag = opts.defaultTag ?? 'latest'
|
||||
const registry = wantedDependency.alias
|
||||
? pickRegistryForPackage(ctx.registries, wantedDependency.alias, wantedDependency.pref)
|
||||
: ctx.registries.default
|
||||
if (wantedDependency.pref?.startsWith('workspace:')) {
|
||||
if (wantedDependency.pref.startsWith('workspace:.')) return null
|
||||
const resolvedFromWorkspace = tryResolveFromWorkspace(wantedDependency, {
|
||||
defaultTag,
|
||||
lockfileDir: opts.lockfileDir,
|
||||
projectDir: opts.projectDir,
|
||||
registry: opts.registry,
|
||||
registry,
|
||||
workspacePackages: opts.workspacePackages,
|
||||
injectWorkspacePackages: opts.injectWorkspacePackages,
|
||||
})
|
||||
@@ -153,11 +160,11 @@ async function resolveNpm (
|
||||
}
|
||||
const workspacePackages = opts.alwaysTryWorkspacePackages !== false ? opts.workspacePackages : undefined
|
||||
const spec = wantedDependency.pref
|
||||
? parsePref(wantedDependency.pref, wantedDependency.alias, defaultTag, opts.registry)
|
||||
? parsePref(wantedDependency.pref, wantedDependency.alias, defaultTag, registry)
|
||||
: defaultTagForAlias(wantedDependency.alias!, defaultTag)
|
||||
if (spec == null) return null
|
||||
|
||||
const authHeaderValue = ctx.getAuthHeaderValueByURI(opts.registry)
|
||||
const authHeaderValue = ctx.getAuthHeaderValueByURI(registry)
|
||||
let pickResult!: { meta: PackageMeta, pickedPackage: PackageInRegistry | null }
|
||||
try {
|
||||
pickResult = await ctx.pickPackage(spec, {
|
||||
@@ -166,7 +173,7 @@ async function resolveNpm (
|
||||
authHeaderValue,
|
||||
dryRun: opts.dryRun === true,
|
||||
preferredVersionSelectors: opts.preferredVersions?.[spec.name],
|
||||
registry: opts.registry,
|
||||
registry,
|
||||
updateToLatest: opts.updateToLatest,
|
||||
})
|
||||
} catch (err: any) { // eslint-disable-line
|
||||
@@ -199,7 +206,7 @@ async function resolveNpm (
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
throw new NoMatchingVersionError({ wantedDependency, packageMeta: meta, registry: opts.registry })
|
||||
throw new NoMatchingVersionError({ wantedDependency, packageMeta: meta, registry })
|
||||
}
|
||||
|
||||
const workspacePkgsMatchingName = workspacePackages?.get(pickedPackage.name)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -3,13 +3,17 @@ import path from 'path'
|
||||
import { FULL_FILTERED_META_DIR } from '@pnpm/constants'
|
||||
import { createFetchFromRegistry } from '@pnpm/fetch'
|
||||
import { createNpmResolver } from '@pnpm/npm-resolver'
|
||||
import { type Registries } from '@pnpm/types'
|
||||
import { fixtures } from '@pnpm/test-fixtures'
|
||||
import loadJsonFile from 'load-json-file'
|
||||
import nock from 'nock'
|
||||
import tempy from 'tempy'
|
||||
|
||||
const f = fixtures(__dirname)
|
||||
const registry = 'https://registry.npmjs.org/'
|
||||
|
||||
const registries: Registries = {
|
||||
default: 'https://registry.npmjs.org/',
|
||||
}
|
||||
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
const badDatesMeta = loadJsonFile.sync<any>(f.find('bad-dates.json'))
|
||||
@@ -29,7 +33,7 @@ beforeEach(() => {
|
||||
})
|
||||
|
||||
test('fall back to a newer version if there is no version published by the given date', async () => {
|
||||
nock(registry)
|
||||
nock(registries.default)
|
||||
.get('/bad-dates')
|
||||
.reply(200, badDatesMeta)
|
||||
|
||||
@@ -38,9 +42,9 @@ test('fall back to a newer version if there is no version published by the given
|
||||
cacheDir,
|
||||
filterMetadata: true,
|
||||
fullMetadata: true,
|
||||
registries,
|
||||
})
|
||||
const resolveResult = await resolveFromNpm({ alias: 'bad-dates', pref: '^1.0.0' }, {
|
||||
registry,
|
||||
publishedBy: new Date('2015-08-17T19:26:00.508Z'),
|
||||
})
|
||||
|
||||
@@ -59,7 +63,7 @@ test('request metadata when the one in cache does not have a version satisfying
|
||||
fs.mkdirSync(path.join(cacheDir, `${FULL_FILTERED_META_DIR}/registry.npmjs.org`), { recursive: true })
|
||||
fs.writeFileSync(path.join(cacheDir, `${FULL_FILTERED_META_DIR}/registry.npmjs.org/bad-dates.json`), JSON.stringify(cachedMeta), 'utf8')
|
||||
|
||||
nock(registry)
|
||||
nock(registries.default)
|
||||
.get('/bad-dates')
|
||||
.reply(200, badDatesMeta)
|
||||
|
||||
@@ -67,9 +71,9 @@ test('request metadata when the one in cache does not have a version satisfying
|
||||
cacheDir,
|
||||
filterMetadata: true,
|
||||
fullMetadata: true,
|
||||
registries,
|
||||
})
|
||||
const resolveResult = await resolveFromNpm({ alias: 'bad-dates', pref: '^1.0.0' }, {
|
||||
registry,
|
||||
publishedBy: new Date('2015-08-17T19:26:00.508Z'),
|
||||
})
|
||||
|
||||
|
||||
@@ -12,6 +12,9 @@
|
||||
{
|
||||
"path": "../../__utils__/test-fixtures"
|
||||
},
|
||||
{
|
||||
"path": "../../config/pick-registry-for-package"
|
||||
},
|
||||
{
|
||||
"path": "../../crypto/hash"
|
||||
},
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
import { type ProjectRootDir, type DependencyManifest, type PkgResolutionId } from '@pnpm/types'
|
||||
import {
|
||||
type ProjectRootDir,
|
||||
type DependencyManifest,
|
||||
type PkgResolutionId,
|
||||
} from '@pnpm/types'
|
||||
|
||||
export { type PkgResolutionId }
|
||||
|
||||
@@ -92,7 +96,6 @@ export interface ResolveOptions {
|
||||
lockfileDir: string
|
||||
preferredVersions: PreferredVersions
|
||||
preferWorkspacePackages?: boolean
|
||||
registry: string
|
||||
workspacePackages?: WorkspacePackages
|
||||
updateToLatest?: boolean
|
||||
injectWorkspacePackages?: boolean
|
||||
|
||||
@@ -3,14 +3,12 @@ import {
|
||||
createResolver,
|
||||
type ResolveFunction,
|
||||
} from '@pnpm/client'
|
||||
import { pickRegistryForPackage } from '@pnpm/pick-registry-for-package'
|
||||
import { type DependencyManifest, type Registries } from '@pnpm/types'
|
||||
import { type DependencyManifest } from '@pnpm/types'
|
||||
|
||||
interface GetManifestOpts {
|
||||
dir: string
|
||||
lockfileDir: string
|
||||
rawConfig: object
|
||||
registries: Registries
|
||||
}
|
||||
|
||||
export type ManifestGetterOptions = Omit<ClientOptions, 'authConfig'>
|
||||
@@ -34,7 +32,6 @@ export async function getManifest (
|
||||
lockfileDir: opts.lockfileDir,
|
||||
preferredVersions: {},
|
||||
projectDir: opts.dir,
|
||||
registry: pickRegistryForPackage(opts.registries, packageName, pref),
|
||||
})
|
||||
return resolution?.manifest ?? null
|
||||
}
|
||||
|
||||
@@ -7,14 +7,9 @@ test('getManifest()', async () => {
|
||||
dir: '',
|
||||
lockfileDir: '',
|
||||
rawConfig: {},
|
||||
registries: {
|
||||
'@scope': 'https://pnpm.io/',
|
||||
default: 'https://registry.npmjs.org/',
|
||||
},
|
||||
}
|
||||
|
||||
const resolve: ResolveFunction = async function (wantedPackage, opts) {
|
||||
expect(opts.registry).toEqual('https://registry.npmjs.org/')
|
||||
return {
|
||||
id: 'foo/1.0.0' as PkgResolutionId,
|
||||
latest: '1.0.0',
|
||||
@@ -35,7 +30,6 @@ test('getManifest()', async () => {
|
||||
})
|
||||
|
||||
const resolve2: ResolveFunction = async function (wantedPackage, opts) {
|
||||
expect(opts.registry).toEqual('https://pnpm.io/')
|
||||
return {
|
||||
id: 'foo/2.0.0' as PkgResolutionId,
|
||||
latest: '2.0.0',
|
||||
|
||||
@@ -16,6 +16,9 @@ describe('store.importPackage()', () => {
|
||||
authConfig,
|
||||
cacheDir: path.join(tmp, 'cache'),
|
||||
rawConfig: {},
|
||||
registries: {
|
||||
default: registry,
|
||||
},
|
||||
})
|
||||
const storeController = createPackageStore(resolve, fetchers, {
|
||||
storeDir,
|
||||
@@ -55,6 +58,9 @@ describe('store.importPackage()', () => {
|
||||
authConfig,
|
||||
cacheDir: path.join(tmp, 'cache'),
|
||||
rawConfig: {},
|
||||
registries: {
|
||||
default: registry,
|
||||
},
|
||||
})
|
||||
const storeController = createPackageStore(resolve, fetchers, {
|
||||
packageImportMethod: 'copy',
|
||||
|
||||
@@ -37,7 +37,6 @@
|
||||
"@pnpm/lockfile.types": "workspace:*",
|
||||
"@pnpm/object.key-sorting": "workspace:*",
|
||||
"@pnpm/parse-wanted-dependency": "workspace:*",
|
||||
"@pnpm/pick-registry-for-package": "workspace:*",
|
||||
"@pnpm/store-path": "workspace:*",
|
||||
"@pnpm/store.cafs": "workspace:*",
|
||||
"@pnpm/types": "workspace:*",
|
||||
|
||||
@@ -6,7 +6,6 @@ import { PnpmError } from '@pnpm/error'
|
||||
import { sortDeepKeys } from '@pnpm/object.key-sorting'
|
||||
import { getStorePath } from '@pnpm/store-path'
|
||||
import { getIndexFilePathInCafs, type PackageFilesIndex } from '@pnpm/store.cafs'
|
||||
import { pickRegistryForPackage } from '@pnpm/pick-registry-for-package'
|
||||
import { parseWantedDependency } from '@pnpm/parse-wanted-dependency'
|
||||
|
||||
import loadJsonFile from 'load-json-file'
|
||||
@@ -78,7 +77,6 @@ export async function handler (opts: CatIndexCommandOptions, params: string[]):
|
||||
lockfileDir: opts.lockfileDir ?? opts.dir,
|
||||
preferredVersions: {},
|
||||
projectDir: opts.dir,
|
||||
registry: pickRegistryForPackage(opts.registries, alias, pref),
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@@ -15,9 +15,6 @@
|
||||
{
|
||||
"path": "../../config/config"
|
||||
},
|
||||
{
|
||||
"path": "../../config/pick-registry-for-package"
|
||||
},
|
||||
{
|
||||
"path": "../../fs/graceful-fs"
|
||||
},
|
||||
|
||||
@@ -39,7 +39,6 @@
|
||||
"@pnpm/lockfile.utils": "workspace:*",
|
||||
"@pnpm/normalize-registries": "workspace:*",
|
||||
"@pnpm/parse-wanted-dependency": "workspace:*",
|
||||
"@pnpm/pick-registry-for-package": "workspace:*",
|
||||
"@pnpm/store-connection-manager": "workspace:*",
|
||||
"@pnpm/store-controller-types": "workspace:*",
|
||||
"@pnpm/store-path": "workspace:*",
|
||||
|
||||
@@ -104,7 +104,6 @@ export async function handler (opts: StoreCommandOptions, params: string[]): Pro
|
||||
store = await createOrConnectStoreController(opts)
|
||||
return storeAdd(params.slice(1), {
|
||||
prefix: opts.dir,
|
||||
registries: opts.registries,
|
||||
reporter: opts.reporter,
|
||||
storeController: store.ctrl,
|
||||
tag: opts.tag,
|
||||
|
||||
@@ -1,16 +1,14 @@
|
||||
import { PnpmError } from '@pnpm/error'
|
||||
import { logger, globalInfo, streamParser } from '@pnpm/logger'
|
||||
import { parseWantedDependency } from '@pnpm/parse-wanted-dependency'
|
||||
import { pickRegistryForPackage } from '@pnpm/pick-registry-for-package'
|
||||
import { type StoreController } from '@pnpm/store-controller-types'
|
||||
import { type SupportedArchitectures, type Registries } from '@pnpm/types'
|
||||
import { type SupportedArchitectures } from '@pnpm/types'
|
||||
import { type ReporterFunction } from './types'
|
||||
|
||||
export async function storeAdd (
|
||||
fuzzyDeps: string[],
|
||||
opts: {
|
||||
prefix?: string
|
||||
registries?: Registries
|
||||
reporter?: ReporterFunction
|
||||
storeController: StoreController
|
||||
tag?: string
|
||||
@@ -26,9 +24,6 @@ export async function storeAdd (
|
||||
|
||||
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, {
|
||||
@@ -36,7 +31,6 @@ export async function storeAdd (
|
||||
lockfileDir: prefix,
|
||||
preferredVersions: {},
|
||||
projectDir: prefix,
|
||||
registry: (dep.alias && pickRegistryForPackage(registries, dep.alias)) ?? registries.default,
|
||||
supportedArchitectures: opts.supportedArchitectures,
|
||||
})
|
||||
await pkgResponse.fetching!()
|
||||
|
||||
@@ -24,9 +24,6 @@
|
||||
{
|
||||
"path": "../../config/normalize-registries"
|
||||
},
|
||||
{
|
||||
"path": "../../config/pick-registry-for-package"
|
||||
},
|
||||
{
|
||||
"path": "../../exec/plugin-commands-script-runners"
|
||||
},
|
||||
|
||||
@@ -5,6 +5,7 @@ import getPort from 'get-port'
|
||||
import { createClient } from '@pnpm/client'
|
||||
import { createPackageStore } from '@pnpm/package-store'
|
||||
import { connectStoreController, createServer } from '@pnpm/server'
|
||||
import { type Registries } from '@pnpm/types'
|
||||
import fetch from 'node-fetch'
|
||||
import { sync as rimraf } from '@zkochan/rimraf'
|
||||
import loadJsonFile from 'load-json-file'
|
||||
@@ -13,6 +14,8 @@ import isPortReachable from 'is-port-reachable'
|
||||
|
||||
const registry = 'https://registry.npmjs.org/'
|
||||
|
||||
const registries: Registries = { default: registry }
|
||||
|
||||
async function createStoreController (storeDir?: string) {
|
||||
const tmp = tempy.directory()
|
||||
if (!storeDir) {
|
||||
@@ -24,6 +27,7 @@ async function createStoreController (storeDir?: string) {
|
||||
authConfig,
|
||||
cacheDir,
|
||||
rawConfig: {},
|
||||
registries,
|
||||
})
|
||||
return createPackageStore(resolve, fetchers, {
|
||||
networkConcurrency: 1,
|
||||
@@ -53,7 +57,6 @@ test('server', async () => {
|
||||
lockfileDir: projectDir,
|
||||
preferredVersions: {},
|
||||
projectDir,
|
||||
registry,
|
||||
sideEffectsCache: false,
|
||||
}
|
||||
)
|
||||
@@ -131,7 +134,6 @@ test('server errors should arrive to the client', async () => {
|
||||
lockfileDir: projectDir,
|
||||
preferredVersions: {},
|
||||
projectDir,
|
||||
registry,
|
||||
sideEffectsCache: false,
|
||||
}
|
||||
)
|
||||
|
||||
@@ -34,7 +34,7 @@ export type CreateNewStoreControllerOptions = CreateResolverOptions & Pick<Confi
|
||||
| 'offline'
|
||||
| 'packageImportMethod'
|
||||
| 'preferOffline'
|
||||
| 'registry'
|
||||
| 'registries'
|
||||
| 'registrySupportsTimeField'
|
||||
| 'resolutionMode'
|
||||
| 'strictSsl'
|
||||
@@ -72,6 +72,7 @@ export async function createNewStoreController (
|
||||
preferOffline: opts.preferOffline,
|
||||
rawConfig: opts.rawConfig,
|
||||
sslConfigs: opts.sslConfigs,
|
||||
registries: opts.registries,
|
||||
retry: {
|
||||
factor: opts.fetchRetryFactor,
|
||||
maxTimeout: opts.fetchRetryMaxtimeout,
|
||||
|
||||
@@ -123,7 +123,6 @@ export interface RequestPackageOptions {
|
||||
lockfileDir: string
|
||||
preferredVersions: PreferredVersions
|
||||
preferWorkspacePackages?: boolean
|
||||
registry: string
|
||||
sideEffectsCache?: boolean
|
||||
skipFetch?: boolean
|
||||
update?: false | 'compatible' | 'latest'
|
||||
|
||||
@@ -30,6 +30,9 @@ export function createTempStore (opts?: {
|
||||
minTimeout: 10_000,
|
||||
},
|
||||
cacheDir,
|
||||
registries: {
|
||||
default: registry,
|
||||
},
|
||||
...opts?.clientOptions,
|
||||
})
|
||||
const storeDir = opts?.storeDir ?? path.resolve('.store')
|
||||
|
||||
@@ -37,7 +37,6 @@
|
||||
"@pnpm/error": "workspace:*",
|
||||
"@pnpm/exec.pnpm-cli-runner": "workspace:*",
|
||||
"@pnpm/link-bins": "workspace:*",
|
||||
"@pnpm/pick-registry-for-package": "workspace:*",
|
||||
"@pnpm/read-project-manifest": "workspace:*",
|
||||
"@pnpm/tools.path": "workspace:*",
|
||||
"@zkochan/rimraf": "catalog:",
|
||||
|
||||
@@ -2,7 +2,6 @@ import path from 'path'
|
||||
import { docsUrl } from '@pnpm/cli-utils'
|
||||
import { packageManager, isExecutedByCorepack } from '@pnpm/cli-meta'
|
||||
import { createResolver } from '@pnpm/client'
|
||||
import { pickRegistryForPackage } from '@pnpm/pick-registry-for-package'
|
||||
import { type Config, types as allTypes } from '@pnpm/config'
|
||||
import { PnpmError } from '@pnpm/error'
|
||||
import { globalWarn } from '@pnpm/logger'
|
||||
@@ -65,7 +64,6 @@ export async function handler (
|
||||
lockfileDir: opts.lockfileDir ?? opts.dir,
|
||||
preferredVersions: {},
|
||||
projectDir: opts.dir,
|
||||
registry: pickRegistryForPackage(opts.registries, pkgName, pref),
|
||||
})
|
||||
if (!resolution?.manifest) {
|
||||
throw new PnpmError('CANNOT_RESOLVE_PNPM', `Cannot find "${pref}" version of pnpm`)
|
||||
|
||||
@@ -21,9 +21,6 @@
|
||||
{
|
||||
"path": "../../config/config"
|
||||
},
|
||||
{
|
||||
"path": "../../config/pick-registry-for-package"
|
||||
},
|
||||
{
|
||||
"path": "../../env/path"
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user