Resolver for npm-hosted packages with caching, offline support, and registry authentication
npx @tessl/cli install tessl/npm-pnpm--npm-resolver@2.2.0@pnpm/npm-resolver is a TypeScript library that provides comprehensive package resolution for npm-hosted packages. It handles package metadata fetching, caching, version selection, offline support, and registry authentication as part of the pnpm ecosystem.
npm install @pnpm/npm-resolver@pnpm/logger@^1.0.0 || ^2.0.0ES6/TypeScript:
import createResolveFromNpm, { PackageMeta, PackageMetaCache } from '@pnpm/npm-resolver';
import type { ResolveResult, LocalPackages } from '@pnpm/resolver-base';
import type { PackageJson } from '@pnpm/types';CommonJS:
const createResolveFromNpm = require('@pnpm/npm-resolver').default;
const { PackageMeta, PackageMetaCache } = require('@pnpm/npm-resolver');import createResolveFromNpm from '@pnpm/npm-resolver';
// Create resolver with configuration
const resolve = createResolveFromNpm({
metaCache: new Map(),
store: '.store',
offline: false,
rawNpmConfig: {
registry: 'https://registry.npmjs.org/',
},
});
// Resolve a package
const result = await resolve(
{ alias: 'is-positive', pref: '1.0.0' },
{
registry: 'https://registry.npmjs.org/',
prefix: process.cwd()
}
);
console.log(result.id); // 'registry.npmjs.org/is-positive/1.0.0'
console.log(result.latest); // '3.1.0'
console.log(result.resolvedVia); // 'npm-registry'The resolver follows a factory pattern where createResolveFromNpm creates a configured resolver function. Key components include:
Creates a resolver function that can resolve npm packages by name and version preference.
function createResolveFromNpm(opts: ResolverOptions): ResolveFunction;
interface ResolverOptions {
cert?: string;
fullMetadata?: boolean;
key?: string;
ca?: string;
strictSsl?: boolean;
rawNpmConfig: object;
metaCache: PackageMetaCache;
store: string;
proxy?: string;
httpsProxy?: string;
localAddress?: string;
userAgent?: string;
offline?: boolean;
preferOffline?: boolean;
fetchRetries?: number;
fetchRetryFactor?: number;
fetchRetryMintimeout?: number;
fetchRetryMaxtimeout?: number;
}
type ResolveFunction = (
wantedDependency: WantedDependency,
opts: ResolveOptions
) => Promise<ResolveResult | null>;Package metadata caching and retrieval from npm registries.
interface PackageMetaCache {
get(key: string): PackageMeta | undefined;
set(key: string, meta: PackageMeta): void;
has(key: string): boolean;
}
interface PackageMeta {
'dist-tags': { [name: string]: string };
versions: { [name: string]: PackageInRegistry };
cachedAt?: number;
}Intelligent package version selection based on preferences and constraints.
interface WantedDependency {
alias?: string;
pref?: string;
}
interface ResolveOptions {
defaultTag?: string;
dryRun?: boolean;
registry: string;
preferredVersions?: {
[packageName: string]: {
selector: string;
type: 'version' | 'range' | 'tag';
};
};
prefix: string;
localPackages?: LocalPackages;
}Note: ResolveResult and LocalPackages are imported from @pnpm/resolver-base, PackageJson from @pnpm/types, and PackageManifest from @pnpm/types.
interface ResolveResult {
id: string;
latest: string;
normalizedPref?: string;
package: PackageInRegistry;
resolution: {
integrity: string;
registry: string;
tarball: string;
} | {
directory: string;
type: 'directory';
};
resolvedVia: 'npm-registry' | 'local-filesystem';
}
interface RegistryPackageSpec {
type: 'tag' | 'version' | 'range';
name: string;
fetchSpec: string;
normalizedPref?: string;
}
type PackageInRegistry = PackageManifest & {
dist: {
integrity?: string;
shasum: string;
tarball: string;
};
};
interface LocalPackages {
[packageName: string]: {
[version: string]: {
directory: string;
package: PackageJson;
};
};
}