Files
pnpm/resolving/default-resolver/src/index.ts
Zoltan Kochan dba4153767 refactor: rename packages and consolidate runtime resolvers (#10999)
* refactor: rename workspace.sort-packages and workspace.pkgs-graph

- workspace.sort-packages -> workspace.projects-sorter
- workspace.pkgs-graph -> workspace.projects-graph

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: rename packages/ to core/ and pkg-manifest.read-package-json to reader

- Rename packages/ directory to core/ for clarity
- Rename pkg-manifest/read-package-json to pkg-manifest/reader (@pnpm/pkg-manifest.reader)
- Update all tsconfig, package.json, and lockfile references

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: consolidate runtime resolvers under engine/runtime domain

- Remove unused @pnpm/engine.runtime.node.fetcher package
- Rename engine/runtime/node.resolver to node-resolver (dash convention)
- Move resolving/bun-resolver to engine/runtime/bun-resolver
- Move resolving/deno-resolver to engine/runtime/deno-resolver
- Update all package names, tsconfig paths, and lockfile references

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: update lockfile after removing node.fetcher

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: sort tsconfig references and package.json deps alphabetically

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: auto-fix import sorting

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: update __typings__ paths in tsconfig.lint.json for moved resolvers

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: remove deno-resolver from deps of bun-resolver

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-18 00:19:58 +01:00

132 lines
5.2 KiB
TypeScript

import { type BunRuntimeResolveResult, resolveBunRuntime } from '@pnpm/engine.runtime.bun-resolver'
import { type DenoRuntimeResolveResult, resolveDenoRuntime } from '@pnpm/engine.runtime.deno-resolver'
import { type NodeRuntimeResolveResult, resolveNodeRuntime } from '@pnpm/engine.runtime.node-resolver'
import { PnpmError } from '@pnpm/error'
import type { FetchFromRegistry, GetAuthHeader } from '@pnpm/fetching.types'
import { checkCustomResolverCanResolve, type CustomResolver } from '@pnpm/hooks.types'
import { createGitResolver, type GitResolveResult } from '@pnpm/resolving.git-resolver'
import { type LocalResolveResult, resolveFromLocal } from '@pnpm/resolving.local-resolver'
import {
createNpmResolver,
type JsrResolveResult,
type NpmResolveResult,
type PackageMeta,
type PackageMetaCache,
type ResolveFromNpmOptions,
type ResolverFactoryOptions,
type WorkspaceResolveResult,
} from '@pnpm/resolving.npm-resolver'
import type {
ResolveFunction,
ResolveOptions,
ResolveResult,
WantedDependency,
} from '@pnpm/resolving.resolver-base'
import { resolveFromTarball, type TarballResolveResult } from '@pnpm/resolving.tarball-resolver'
export type {
PackageMeta,
PackageMetaCache,
ResolveFunction,
ResolverFactoryOptions,
}
export interface CustomResolverResolveResult extends ResolveResult {
resolvedVia: 'custom-resolver'
}
export type DefaultResolveResult =
| NpmResolveResult
| JsrResolveResult
| GitResolveResult
| LocalResolveResult
| TarballResolveResult
| WorkspaceResolveResult
| NodeRuntimeResolveResult
| DenoRuntimeResolveResult
| BunRuntimeResolveResult
| CustomResolverResolveResult
export type DefaultResolver = (wantedDependency: WantedDependency, opts: ResolveOptions) => Promise<DefaultResolveResult>
async function resolveFromCustomResolvers (
customResolvers: CustomResolver[],
wantedDependency: WantedDependency,
opts: ResolveOptions
): Promise<DefaultResolveResult | null> {
if (!customResolvers || customResolvers.length === 0) {
return null
}
for (const customResolver of customResolvers) {
// Skip custom resolvers that don't support both canResolve and resolve
if (!customResolver.canResolve || !customResolver.resolve) continue
// eslint-disable-next-line no-await-in-loop
const canResolve = await checkCustomResolverCanResolve(customResolver, wantedDependency)
if (canResolve) {
// eslint-disable-next-line no-await-in-loop
const result = await customResolver.resolve(wantedDependency, {
lockfileDir: opts.lockfileDir,
projectDir: opts.projectDir,
preferredVersions: (opts.preferredVersions ?? {}) as unknown as Record<string, string>,
currentPkg: opts.currentPkg,
})
return {
...result,
resolvedVia: 'custom-resolver',
} as DefaultResolveResult
}
}
return null
}
export function createResolver (
fetchFromRegistry: FetchFromRegistry,
getAuthHeader: GetAuthHeader,
pnpmOpts: ResolverFactoryOptions & {
rawConfig: Record<string, string>
customResolvers?: CustomResolver[]
}
): { resolve: DefaultResolver, clearCache: () => void } {
const { resolveFromNpm, resolveFromJsr, clearCache } = createNpmResolver(fetchFromRegistry, getAuthHeader, pnpmOpts)
const resolveFromGit = createGitResolver(pnpmOpts)
const _resolveFromLocal = resolveFromLocal.bind(null, {
preserveAbsolutePaths: pnpmOpts.preserveAbsolutePaths,
})
const _resolveNodeRuntime = resolveNodeRuntime.bind(null, { fetchFromRegistry, offline: pnpmOpts.offline, rawConfig: pnpmOpts.rawConfig })
const _resolveDenoRuntime = resolveDenoRuntime.bind(null, { fetchFromRegistry, offline: pnpmOpts.offline, rawConfig: pnpmOpts.rawConfig, resolveFromNpm })
const _resolveBunRuntime = resolveBunRuntime.bind(null, { fetchFromRegistry, offline: pnpmOpts.offline, rawConfig: pnpmOpts.rawConfig, resolveFromNpm })
const _resolveFromCustomResolvers = pnpmOpts.customResolvers
? resolveFromCustomResolvers.bind(null, pnpmOpts.customResolvers)
: null
return {
resolve: async (wantedDependency, opts) => {
const resolution = await _resolveFromCustomResolvers?.(wantedDependency, opts) ??
await resolveFromNpm(wantedDependency, opts as ResolveFromNpmOptions) ??
await resolveFromJsr(wantedDependency, opts as ResolveFromNpmOptions) ??
(wantedDependency.bareSpecifier && (
await resolveFromGit(wantedDependency as { bareSpecifier: string }, opts) ??
await resolveFromTarball(fetchFromRegistry, wantedDependency as { bareSpecifier: string }) ??
await _resolveFromLocal(wantedDependency as { bareSpecifier: string }, opts)
)) ??
await _resolveNodeRuntime(wantedDependency, opts) ??
await _resolveDenoRuntime(wantedDependency, opts) ??
await _resolveBunRuntime(wantedDependency, opts)
if (!resolution) {
let specifier = `${wantedDependency.alias ? wantedDependency.alias + '@' : ''}${wantedDependency.bareSpecifier ?? ''}`
if (specifier !== '') {
specifier = `"${specifier}"`
}
throw new PnpmError(
'SPEC_NOT_SUPPORTED_BY_ANY_RESOLVER',
`${specifier} isn't supported by any available resolver.`)
}
return resolution
},
clearCache,
}
}