CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-pnpm--npm-resolver

Resolver for npm-hosted packages with caching, offline support, and registry authentication

Pending
Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

SecuritybySnyk

Pending

The risk profile of this skill

Overview
Eval results
Files

@pnpm/npm-resolver

@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.

Package Information

  • Package Name: @pnpm/npm-resolver
  • Package Type: npm
  • Language: TypeScript
  • Installation: npm install @pnpm/npm-resolver
  • Peer Dependencies: @pnpm/logger@^1.0.0 || ^2.0.0

Core Imports

ES6/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');

Basic Usage

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'

Architecture

The resolver follows a factory pattern where createResolveFromNpm creates a configured resolver function. Key components include:

  • Registry Fetcher: Handles HTTP requests to npm registries with authentication
  • Metadata Cache: Caches package metadata to reduce registry requests
  • Version Picker: Selects appropriate package versions based on preferences
  • Local Package Fallback: Falls back to local packages when registry resolution fails
  • Offline Support: Works with cached metadata when offline

Capabilities

Package Resolution

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 Resolution

Metadata Management

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;
}

Metadata Management

Version Selection

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;
}

Version Selection

Core Types

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;
    };
  };
}
Workspace
tessl
Visibility
Public
Created
Last updated
Describes
npmpkg:npm/@pnpm/npm-resolver@2.2.x
Publish Source
CLI
Badge
tessl/npm-pnpm--npm-resolver badge