🚀 Big News: Socket Acquires Coana to Bring Reachability Analysis to Every Appsec Team.Learn more
Socket
Sign inDemoInstall
Socket

@pnpm/npm-resolver

Package Overview
Dependencies
Maintainers
2
Versions
221
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@pnpm/npm-resolver - npm Package Compare versions

Comparing version

to
1004.0.0

lib/parseBareSpecifier.d.ts

18

lib/index.d.ts
import { PnpmError } from '@pnpm/error';
import { type FetchFromRegistry, type GetAuthHeader, type RetryTimeoutOptions } from '@pnpm/fetching-types';
import { type PreferredVersions, type ResolveResult, type WantedDependency, type WorkspacePackages } from '@pnpm/resolver-base';
import { type Registries } from '@pnpm/types';
import { type PackageMeta, type PackageMetaCache } from './pickPackage';
import { parsePref, type RegistryPackageSpec } from './parsePref';
import { type Registries, type PinnedVersion } from '@pnpm/types';
import { type PackageMeta, type PackageMetaCache, type PickPackageOptions, pickPackage } from './pickPackage';
import { parseBareSpecifier, type RegistryPackageSpec } from './parseBareSpecifier';
import { RegistryResponseError } from './fetch';

@@ -17,3 +17,3 @@ import { workspacePrefToNpm } from './workspacePrefToNpm';

}
export { parsePref, workspacePrefToNpm, type PackageMeta, type PackageMetaCache, type RegistryPackageSpec, RegistryResponseError, };
export { parseBareSpecifier, workspacePrefToNpm, type PackageMeta, type PackageMetaCache, type RegistryPackageSpec, RegistryResponseError, };
export interface ResolverFactoryOptions {

@@ -28,2 +28,3 @@ cacheDir: string;

registries: Registries;
saveWorkspaceProtocol?: boolean | 'rolling';
}

@@ -33,4 +34,11 @@ export type NpmResolver = (wantedDependency: WantedDependency, opts: ResolveFromNpmOptions) => Promise<ResolveResult | null>;

resolveFromNpm: NpmResolver;
resolveFromJsr: NpmResolver;
clearCache: () => void;
};
export interface ResolveFromNpmContext {
pickPackage: (spec: RegistryPackageSpec, opts: PickPackageOptions) => ReturnType<typeof pickPackage>;
getAuthHeaderValueByURI: (registry: string) => string | undefined;
registries: Registries;
saveWorkspaceProtocol?: boolean | 'rolling';
}
export type ResolveFromNpmOptions = {

@@ -47,2 +55,4 @@ alwaysTryWorkspacePackages?: boolean;

injectWorkspacePackages?: boolean;
calcSpecifier?: boolean;
pinnedVersion?: PinnedVersion;
} & ({

@@ -49,0 +59,0 @@ projectDir?: string;

@@ -6,3 +6,3 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.RegistryResponseError = exports.workspacePrefToNpm = exports.parsePref = exports.NoMatchingVersionError = void 0;
exports.RegistryResponseError = exports.workspacePrefToNpm = exports.parseBareSpecifier = exports.NoMatchingVersionError = void 0;
exports.createNpmResolver = createNpmResolver;

@@ -20,5 +20,6 @@ const path_1 = __importDefault(require("path"));

const ssri_1 = __importDefault(require("ssri"));
const version_selector_type_1 = __importDefault(require("version-selector-type"));
const pickPackage_1 = require("./pickPackage");
const parsePref_1 = require("./parsePref");
Object.defineProperty(exports, "parsePref", { enumerable: true, get: function () { return parsePref_1.parsePref; } });
const parseBareSpecifier_1 = require("./parseBareSpecifier");
Object.defineProperty(exports, "parseBareSpecifier", { enumerable: true, get: function () { return parseBareSpecifier_1.parseBareSpecifier; } });
const fetch_1 = require("./fetch");

@@ -28,7 +29,8 @@ Object.defineProperty(exports, "RegistryResponseError", { enumerable: true, get: function () { return fetch_1.RegistryResponseError; } });

Object.defineProperty(exports, "workspacePrefToNpm", { enumerable: true, get: function () { return workspacePrefToNpm_1.workspacePrefToNpm; } });
const whichVersionIsPinned_1 = require("./whichVersionIsPinned");
class NoMatchingVersionError extends error_1.PnpmError {
constructor(opts) {
const dep = opts.wantedDependency.alias
? `${opts.wantedDependency.alias}@${opts.wantedDependency.pref ?? ''}`
: opts.wantedDependency.pref;
? `${opts.wantedDependency.alias}@${opts.wantedDependency.bareSpecifier ?? ''}`
: opts.wantedDependency.bareSpecifier;
super('NO_MATCHING_VERSION', `No matching version found for ${dep} while fetching it from ${opts.registry}`);

@@ -55,16 +57,19 @@ this.packageMeta = opts.packageMeta;

});
const ctx = {
getAuthHeaderValueByURI: getAuthHeader,
pickPackage: pickPackage_1.pickPackage.bind(null, {
fetch,
filterMetadata: opts.filterMetadata,
metaCache,
metaDir: opts.fullMetadata ? (opts.filterMetadata ? constants_1.FULL_FILTERED_META_DIR : constants_1.FULL_META_DIR) : constants_1.ABBREVIATED_META_DIR,
offline: opts.offline,
preferOffline: opts.preferOffline,
cacheDir: opts.cacheDir,
}),
registries: opts.registries,
saveWorkspaceProtocol: opts.saveWorkspaceProtocol,
};
return {
resolveFromNpm: resolveNpm.bind(null, {
getAuthHeaderValueByURI: getAuthHeader,
pickPackage: pickPackage_1.pickPackage.bind(null, {
fetch,
filterMetadata: opts.filterMetadata,
metaCache,
metaDir: opts.fullMetadata ? (opts.filterMetadata ? constants_1.FULL_FILTERED_META_DIR : constants_1.FULL_META_DIR) : constants_1.ABBREVIATED_META_DIR,
offline: opts.offline,
preferOffline: opts.preferOffline,
cacheDir: opts.cacheDir,
}),
registries: opts.registries,
}),
resolveFromNpm: resolveNpm.bind(null, ctx),
resolveFromJsr: resolveJsr.bind(null, ctx),
clearCache: () => {

@@ -78,6 +83,6 @@ metaCache.clear();

const registry = wantedDependency.alias
? (0, pick_registry_for_package_1.pickRegistryForPackage)(ctx.registries, wantedDependency.alias, wantedDependency.pref)
? (0, pick_registry_for_package_1.pickRegistryForPackage)(ctx.registries, wantedDependency.alias, wantedDependency.bareSpecifier)
: ctx.registries.default;
if (wantedDependency.pref?.startsWith('workspace:')) {
if (wantedDependency.pref.startsWith('workspace:.'))
if (wantedDependency.bareSpecifier?.startsWith('workspace:')) {
if (wantedDependency.bareSpecifier.startsWith('workspace:.'))
return null;

@@ -92,2 +97,5 @@ const resolvedFromWorkspace = tryResolveFromWorkspace(wantedDependency, {

update: Boolean(opts.update),
saveWorkspaceProtocol: ctx.saveWorkspaceProtocol !== false ? ctx.saveWorkspaceProtocol : true,
calcSpecifier: opts.calcSpecifier,
pinnedVersion: opts.pinnedVersion,
});

@@ -99,4 +107,4 @@ if (resolvedFromWorkspace != null) {

const workspacePackages = opts.alwaysTryWorkspacePackages !== false ? opts.workspacePackages : undefined;
const spec = wantedDependency.pref
? (0, parsePref_1.parsePref)(wantedDependency.pref, wantedDependency.alias, defaultTag, registry)
const spec = wantedDependency.bareSpecifier
? (0, parseBareSpecifier_1.parseBareSpecifier)(wantedDependency.bareSpecifier, wantedDependency.alias, defaultTag, registry)
: defaultTagForAlias(wantedDependency.alias, defaultTag);

@@ -127,2 +135,5 @@ if (spec == null)

update: Boolean(opts.update),
saveWorkspaceProtocol: ctx.saveWorkspaceProtocol,
calcSpecifier: opts.calcSpecifier,
pinnedVersion: opts.pinnedVersion,
});

@@ -147,2 +158,5 @@ }

update: Boolean(opts.update),
saveWorkspaceProtocol: ctx.saveWorkspaceProtocol,
calcSpecifier: opts.calcSpecifier,
pinnedVersion: opts.pinnedVersion,
});

@@ -161,6 +175,10 @@ }

return {
...resolveFromLocalPackage(matchedPkg, spec.normalizedPref, {
...resolveFromLocalPackage(matchedPkg, spec, {
wantedDependency,
projectDir: opts.projectDir,
lockfileDir: opts.lockfileDir,
hardLinkLocalPackages: opts.injectWorkspacePackages === true || wantedDependency.injected,
saveWorkspaceProtocol: ctx.saveWorkspaceProtocol,
calcSpecifier: opts.calcSpecifier,
pinnedVersion: opts.pinnedVersion,
}),

@@ -173,6 +191,10 @@ latest: meta['dist-tags'].latest,

return {
...resolveFromLocalPackage(workspacePkgsMatchingName.get(localVersion), spec.normalizedPref, {
...resolveFromLocalPackage(workspacePkgsMatchingName.get(localVersion), spec, {
wantedDependency,
projectDir: opts.projectDir,
lockfileDir: opts.lockfileDir,
hardLinkLocalPackages: opts.injectWorkspacePackages === true || wantedDependency.injected,
saveWorkspaceProtocol: ctx.saveWorkspaceProtocol,
calcSpecifier: opts.calcSpecifier,
pinnedVersion: opts.pinnedVersion,
}),

@@ -188,2 +210,11 @@ latest: meta['dist-tags'].latest,

};
let normalizedBareSpecifier;
if (opts.calcSpecifier) {
normalizedBareSpecifier = spec.normalizedBareSpecifier ?? calcSpecifier({
wantedDependency,
spec,
version: pickedPackage.version,
defaultPinnedVersion: opts.pinnedVersion,
});
}
return {

@@ -193,16 +224,84 @@ id,

manifest: pickedPackage,
normalizedPref: spec.normalizedPref,
resolution,
resolvedVia: 'npm-registry',
publishedAt: meta.time?.[pickedPackage.version],
normalizedBareSpecifier,
};
}
async function resolveJsr(ctx, wantedDependency, opts) {
if (!wantedDependency.bareSpecifier)
return null;
const defaultTag = opts.defaultTag ?? 'latest';
const registry = ctx.registries['@jsr']; // '@jsr' is always defined
const spec = (0, parseBareSpecifier_1.parseJsrSpecifierToRegistryPackageSpec)(wantedDependency.bareSpecifier, wantedDependency.alias, defaultTag);
if (spec == null)
return null;
const authHeaderValue = ctx.getAuthHeaderValueByURI(registry);
const { meta, pickedPackage } = await ctx.pickPackage(spec, {
pickLowestVersion: opts.pickLowestVersion,
publishedBy: opts.publishedBy,
authHeaderValue,
dryRun: opts.dryRun === true,
preferredVersionSelectors: opts.preferredVersions?.[spec.name],
registry,
updateToLatest: opts.update === 'latest',
});
if (pickedPackage == null) {
throw new NoMatchingVersionError({ wantedDependency, packageMeta: meta, registry });
}
const id = `${pickedPackage.name}@${pickedPackage.version}`;
const resolution = {
integrity: getIntegrity(pickedPackage.dist),
tarball: pickedPackage.dist.tarball,
};
return {
id,
latest: meta['dist-tags'].latest,
manifest: pickedPackage,
normalizedBareSpecifier: opts.calcSpecifier
? calcJsrSpecifier({
wantedDependency,
spec,
version: pickedPackage.version,
defaultPinnedVersion: opts.pinnedVersion,
})
: undefined,
resolution,
resolvedVia: 'jsr-registry',
publishedAt: meta.time?.[pickedPackage.version],
alias: spec.jsrPkgName,
};
}
function calcJsrSpecifier({ wantedDependency, spec, version, defaultPinnedVersion, }) {
const range = calcRange(version, wantedDependency, defaultPinnedVersion);
if (!wantedDependency.alias || spec.jsrPkgName === wantedDependency.alias)
return `jsr:${range}`;
return `jsr:${spec.jsrPkgName}@${range}`;
}
function calcSpecifier({ wantedDependency, spec, version, defaultPinnedVersion, }) {
if (wantedDependency.prevSpecifier === wantedDependency.bareSpecifier && wantedDependency.prevSpecifier && (0, version_selector_type_1.default)(wantedDependency.prevSpecifier)?.type === 'tag') {
return wantedDependency.prevSpecifier;
}
const range = calcRange(version, wantedDependency, defaultPinnedVersion);
if (!wantedDependency.alias || spec.name === wantedDependency.alias)
return range;
return `npm:${spec.name}@${range}`;
}
function calcRange(version, wantedDependency, defaultPinnedVersion) {
if (semver_1.default.parse(version)?.prerelease.length) {
return version;
}
const pinnedVersion = (wantedDependency.prevSpecifier ? (0, whichVersionIsPinned_1.whichVersionIsPinned)(wantedDependency.prevSpecifier) : undefined) ??
(wantedDependency.bareSpecifier ? (0, whichVersionIsPinned_1.whichVersionIsPinned)(wantedDependency.bareSpecifier) : undefined) ??
defaultPinnedVersion;
return createVersionSpec(version, pinnedVersion);
}
function tryResolveFromWorkspace(wantedDependency, opts) {
if (!wantedDependency.pref?.startsWith('workspace:')) {
if (!wantedDependency.bareSpecifier?.startsWith('workspace:')) {
return null;
}
const pref = (0, workspacePrefToNpm_1.workspacePrefToNpm)(wantedDependency.pref);
const spec = (0, parsePref_1.parsePref)(pref, wantedDependency.alias, opts.defaultTag, opts.registry);
const bareSpecifier = (0, workspacePrefToNpm_1.workspacePrefToNpm)(wantedDependency.bareSpecifier);
const spec = (0, parseBareSpecifier_1.parseBareSpecifier)(bareSpecifier, wantedDependency.alias, opts.defaultTag, opts.registry);
if (spec == null)
throw new Error(`Invalid workspace: spec (${wantedDependency.pref})`);
throw new Error(`Invalid workspace: spec (${wantedDependency.bareSpecifier})`);
if (opts.workspacePackages == null) {

@@ -220,2 +319,5 @@ throw new Error('Cannot resolve package from workspace because opts.workspacePackages is not defined');

update: opts.update,
saveWorkspaceProtocol: opts.saveWorkspaceProtocol,
calcSpecifier: opts.calcSpecifier,
pinnedVersion: opts.pinnedVersion,
});

@@ -226,3 +328,3 @@ }

if (!workspacePkgsMatchingName) {
throw new error_1.PnpmError('WORKSPACE_PKG_NOT_FOUND', `In ${path_1.default.relative(process.cwd(), opts.projectDir)}: "${spec.name}@${opts.wantedDependency.pref ?? ''}" is in the dependencies but no package named "${spec.name}" is present in the workspace`, {
throw new error_1.PnpmError('WORKSPACE_PKG_NOT_FOUND', `In ${path_1.default.relative(process.cwd(), opts.projectDir)}: "${spec.name}@${opts.wantedDependency.bareSpecifier ?? ''}" is in the dependencies but no package named "${spec.name}" is present in the workspace`, {
hint: 'Packages found in the workspace: ' + Object.keys(workspacePackages).join(', '),

@@ -233,5 +335,5 @@ });

if (!localVersion) {
throw new error_1.PnpmError('NO_MATCHING_VERSION_INSIDE_WORKSPACE', `In ${path_1.default.relative(process.cwd(), opts.projectDir)}: No matching version found for ${opts.wantedDependency.alias ?? ''}@${opts.wantedDependency.pref ?? ''} inside the workspace`);
throw new error_1.PnpmError('NO_MATCHING_VERSION_INSIDE_WORKSPACE', `In ${path_1.default.relative(process.cwd(), opts.projectDir)}: No matching version found for ${opts.wantedDependency.alias ?? ''}@${opts.wantedDependency.bareSpecifier ?? ''} inside the workspace`);
}
return resolveFromLocalPackage(workspacePkgsMatchingName.get(localVersion), spec.normalizedPref, opts);
return resolveFromLocalPackage(workspacePkgsMatchingName.get(localVersion), spec, opts);
}

@@ -252,3 +354,3 @@ function pickMatchingLocalVersionOrNull(versions, spec) {

}
function resolveFromLocalPackage(localPackage, normalizedPref, opts) {
function resolveFromLocalPackage(localPackage, spec, opts) {
let id;

@@ -265,6 +367,15 @@ let directory;

}
let normalizedBareSpecifier;
if (opts.calcSpecifier) {
normalizedBareSpecifier = spec.normalizedBareSpecifier ?? calcSpecifierForWorkspaceDep({
wantedDependency: opts.wantedDependency,
spec,
saveWorkspaceProtocol: opts.saveWorkspaceProtocol,
version: localPackage.manifest.version,
defaultPinnedVersion: opts.pinnedVersion,
});
}
return {
id,
manifest: (0, clone_1.default)(localPackage.manifest),
normalizedPref,
resolution: {

@@ -275,4 +386,32 @@ directory,

resolvedVia: 'workspace',
normalizedBareSpecifier,
};
}
function calcSpecifierForWorkspaceDep({ wantedDependency, spec, saveWorkspaceProtocol, version, defaultPinnedVersion, }) {
if (!saveWorkspaceProtocol && !wantedDependency.bareSpecifier?.startsWith('workspace:')) {
return calcSpecifier({ wantedDependency, spec, version, defaultPinnedVersion });
}
const prefix = (!wantedDependency.alias || spec.name === wantedDependency.alias) ? 'workspace:' : `workspace:${spec.name}@`;
if (saveWorkspaceProtocol === 'rolling') {
const specifier = wantedDependency.prevSpecifier ?? wantedDependency.bareSpecifier;
if (specifier) {
if ([`${prefix}*`, `${prefix}^`, `${prefix}~`].includes(specifier))
return specifier;
const pinnedVersion = (0, whichVersionIsPinned_1.whichVersionIsPinned)(specifier);
switch (pinnedVersion) {
case 'major': return `${prefix}^`;
case 'minor': return `${prefix}~`;
case 'patch':
case 'none': return `${prefix}*`;
}
}
return `${prefix}^`;
}
if (semver_1.default.parse(version)?.prerelease.length) {
return `${prefix}${version}`;
}
const pinnedVersion = (wantedDependency.prevSpecifier ? (0, whichVersionIsPinned_1.whichVersionIsPinned)(wantedDependency.prevSpecifier) : undefined) ?? defaultPinnedVersion;
const range = createVersionSpec(version, pinnedVersion);
return `${prefix}${range}`;
}
function resolveLocalPackageDir(localPackage) {

@@ -304,2 +443,15 @@ if (localPackage.manifest.publishConfig?.directory == null ||

}
function createVersionSpec(version, pinnedVersion) {
switch (pinnedVersion ?? 'major') {
case 'none':
case 'major':
return `^${version}`;
case 'minor':
return `~${version}`;
case 'patch':
return version;
default:
throw new error_1.PnpmError('BAD_PINNED_VERSION', `Cannot pin '${pinnedVersion ?? 'undefined'}'`);
}
}
//# sourceMappingURL=index.js.map
import { type VersionSelectors } from '@pnpm/resolver-base';
import { type PackageManifest } from '@pnpm/types';
import { type RegistryPackageSpec } from './parsePref';
import { type RegistryPackageSpec } from './parseBareSpecifier';
export interface PackageMeta {

@@ -5,0 +5,0 @@ name: string;

import { type VersionSelectors } from '@pnpm/resolver-base';
import { type RegistryPackageSpec } from './parsePref';
import { type RegistryPackageSpec } from './parseBareSpecifier';
import { type PackageInRegistry, type PackageMeta } from './pickPackage';

@@ -4,0 +4,0 @@ export type PickVersionByVersionRange = (meta: PackageMeta, versionRange: string, preferredVerSels?: VersionSelectors, publishedBy?: Date) => string | null;

@@ -1,2 +0,2 @@

import { type RegistryPackageSpec } from './parsePref';
import { type RegistryPackageSpec } from './parseBareSpecifier';
export declare function toRaw(spec: RegistryPackageSpec): string;

@@ -1,1 +0,1 @@

export declare function workspacePrefToNpm(workspacePref: string): string;
export declare function workspacePrefToNpm(workspaceBareSpecifier: string): string;

@@ -5,6 +5,6 @@ "use strict";

const workspace_spec_parser_1 = require("@pnpm/workspace.spec-parser");
function workspacePrefToNpm(workspacePref) {
const parseResult = workspace_spec_parser_1.WorkspaceSpec.parse(workspacePref);
function workspacePrefToNpm(workspaceBareSpecifier) {
const parseResult = workspace_spec_parser_1.WorkspaceSpec.parse(workspaceBareSpecifier);
if (parseResult == null) {
throw new Error(`Invalid workspace spec: ${workspacePref}`);
throw new Error(`Invalid workspace spec: ${workspaceBareSpecifier}`);
}

@@ -11,0 +11,0 @@ const { alias, version } = parseResult;

{
"name": "@pnpm/npm-resolver",
"version": "1003.0.0",
"version": "1004.0.0",
"description": "Resolver for npm-hosted packages",

@@ -40,14 +40,16 @@ "keywords": [

"semver": "^7.7.1",
"semver-utils": "^1.1.4",
"ssri": "10.0.5",
"version-selector-type": "^3.0.0",
"@pnpm/core-loggers": "1001.0.0",
"@pnpm/crypto.hash": "1000.1.1",
"@pnpm/constants": "1001.1.0",
"@pnpm/core-loggers": "1000.2.0",
"@pnpm/crypto.hash": "1000.1.1",
"@pnpm/error": "1000.0.2",
"@pnpm/fetching-types": "1000.1.0",
"@pnpm/graceful-fs": "1000.0.0",
"@pnpm/error": "1000.0.2",
"@pnpm/pick-registry-for-package": "1000.0.6",
"@pnpm/resolver-base": "1002.0.0",
"@pnpm/pick-registry-for-package": "1000.0.7",
"@pnpm/resolve-workspace-range": "1000.0.0",
"@pnpm/types": "1000.4.0",
"@pnpm/resolving.jsr-specifier-parser": "1000.0.0",
"@pnpm/resolver-base": "1003.0.0",
"@pnpm/types": "1000.5.0",
"@pnpm/workspace.spec-parser": "1000.0.0"

@@ -65,5 +67,5 @@ },

"tempy": "^1.0.1",
"@pnpm/fetch": "1000.2.0",
"@pnpm/logger": "1000.0.0",
"@pnpm/npm-resolver": "1003.0.0",
"@pnpm/fetch": "1000.2.1",
"@pnpm/logger": "1001.0.0",
"@pnpm/npm-resolver": "1004.0.0",
"@pnpm/test-fixtures": "0.1.37"

@@ -70,0 +72,0 @@ },

@@ -30,3 +30,3 @@ # @pnpm/npm-resolver

resolveFromNpm({alias: 'is-positive', pref: '1.0.0'}, {
resolveFromNpm({alias: 'is-positive', bareSpecifier: '1.0.0'}, {
registry: 'https://registry.npmjs.org/',

@@ -33,0 +33,0 @@ })

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet