snyk-nodejs-lockfile-parser
Version:
Generate a dep tree given a lockfile
93 lines • 3.84 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.rewriteAliasesInOverrides = exports.rewriteAliases = exports.rewriteAliasesPkgJson = exports.parseNpmAlias = void 0;
const util_1 = require("../dep-graph-builders/util");
/**
* Parses a npm alias string (e.g., "npm:package@1.0.0") and returns the package name and version
*/
const parseNpmAlias = (aliasString) => {
if (!aliasString.startsWith('npm:')) {
return null;
}
const lastAtIndex = aliasString.lastIndexOf('@');
if (lastAtIndex <= 4) {
// Invalid format: must have content after 'npm:' and before '@'
return null;
}
return {
packageName: aliasString.substring(4, lastAtIndex),
version: aliasString.substring(lastAtIndex + 1),
};
};
exports.parseNpmAlias = parseNpmAlias;
/**
* Adds an alias entry to the package.json aliases field
*/
const addAlias = (pkgJson, aliasName, targetDepName, semver) => {
if (!pkgJson['aliases']) {
pkgJson['aliases'] = {};
}
pkgJson['aliases'][aliasName] = {
aliasName,
aliasTargetDepName: targetDepName,
semver,
version: null,
};
};
const rewriteAliasesPkgJson = (packageJsonContent) => {
const pkgJsonPreprocessed = (0, util_1.parsePkgJson)(packageJsonContent);
pkgJsonPreprocessed.dependencies = (0, exports.rewriteAliases)(pkgJsonPreprocessed, pkgJsonPreprocessed.dependencies);
pkgJsonPreprocessed.devDependencies = (0, exports.rewriteAliases)(pkgJsonPreprocessed, pkgJsonPreprocessed.devDependencies);
pkgJsonPreprocessed.optionalDependencies = (0, exports.rewriteAliases)(pkgJsonPreprocessed, pkgJsonPreprocessed.optionalDependencies);
pkgJsonPreprocessed.peerDependencies = (0, exports.rewriteAliases)(pkgJsonPreprocessed, pkgJsonPreprocessed.peerDependencies);
// Process overrides field to extract aliases
if (pkgJsonPreprocessed.overrides) {
(0, exports.rewriteAliasesInOverrides)(pkgJsonPreprocessed, pkgJsonPreprocessed.overrides);
}
// Process resolutions field to extract aliases (yarn)
if (pkgJsonPreprocessed.resolutions) {
(0, exports.rewriteAliasesInOverrides)(pkgJsonPreprocessed, pkgJsonPreprocessed.resolutions);
}
return JSON.stringify(pkgJsonPreprocessed);
};
exports.rewriteAliasesPkgJson = rewriteAliasesPkgJson;
const rewriteAliases = (pkgJsonPreprocessed, dependencies) => {
if (!dependencies) {
return undefined;
}
const newDependencies = {};
for (const key in dependencies) {
const value = dependencies[key];
const parsed = (0, exports.parseNpmAlias)(value);
if (parsed) {
addAlias(pkgJsonPreprocessed, key, parsed.packageName, parsed.version);
}
newDependencies[key] = value;
}
return newDependencies;
};
exports.rewriteAliases = rewriteAliases;
/**
* Recursively processes the overrides object to extract aliases
*/
const rewriteAliasesInOverrides = (pkgJsonPreprocessed, overrides) => {
if (typeof overrides === 'string') {
return; // String values are handled at the parent level where we have the key
}
// Recursive case: process each key-value pair in the overrides object
for (const key in overrides) {
const value = overrides[key];
if (typeof value === 'string') {
const parsed = (0, exports.parseNpmAlias)(value);
if (parsed) {
addAlias(pkgJsonPreprocessed, key, parsed.packageName, parsed.version);
}
}
else if (typeof value === 'object') {
// Recursively process nested overrides
(0, exports.rewriteAliasesInOverrides)(pkgJsonPreprocessed, value);
}
}
};
exports.rewriteAliasesInOverrides = rewriteAliasesInOverrides;
//# sourceMappingURL=pkgJson.js.map