snyk-nodejs-lockfile-parser
Version:
Generate a dep tree given a lockfile
133 lines • 10.3 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.getYarnLockfileType = exports.NodeLockfileVersion = exports.getPnpmLockfileVersion = exports.getYarnLockfileVersion = exports.getNpmLockfileVersion = exports.getLockfileVersionFromFile = exports.parsePkgJson = exports.parsePnpmWorkspace = exports.parsePnpmProject = exports.getPnpmLockfileParser = exports.buildDepGraphYarnLockV2Simple = exports.parseYarnLockV2Project = exports.extractPkgsFromYarnLockV2 = exports.buildDepGraphYarnLockV1Workspace = exports.buildDepGraphYarnLockV1WorkspaceCyclesPruned = exports.buildDepGraphYarnLockV1Simple = exports.buildDepGraphYarnLockV1SimpleCyclesPruned = exports.parseYarnLockV1WorkspaceProject = exports.parseYarnLockV1Project = exports.extractPkgsFromYarnLockV1 = exports.parseNpmLockV2Project = exports.OutOfSyncError = exports.InvalidUserInputError = exports.UnsupportedRuntimeError = exports.LockfileType = exports.Scope = exports.getPnpmWorkspaces = exports.getYarnWorkspaces = exports.getYarnWorkspacesFromFiles = exports.buildDepGraphFromCliOutput = exports.buildDepTreeFromFiles = exports.buildDepTree = void 0;
const fs = require("fs");
const path = require("path");
const parsers_1 = require("./parsers");
Object.defineProperty(exports, "Scope", { enumerable: true, get: function () { return parsers_1.Scope; } });
Object.defineProperty(exports, "LockfileType", { enumerable: true, get: function () { return parsers_1.LockfileType; } });
Object.defineProperty(exports, "getYarnWorkspaces", { enumerable: true, get: function () { return parsers_1.getYarnWorkspaces; } });
Object.defineProperty(exports, "getPnpmWorkspaces", { enumerable: true, get: function () { return parsers_1.getPnpmWorkspaces; } });
const package_lock_parser_1 = require("./parsers/package-lock-parser");
const yarn_lock_parser_1 = require("./parsers/yarn-lock-parser");
const yarn2_lock_parser_1 = require("./parsers/yarn2-lock-parser");
const errors_1 = require("./errors");
Object.defineProperty(exports, "UnsupportedRuntimeError", { enumerable: true, get: function () { return errors_1.UnsupportedRuntimeError; } });
Object.defineProperty(exports, "InvalidUserInputError", { enumerable: true, get: function () { return errors_1.InvalidUserInputError; } });
Object.defineProperty(exports, "OutOfSyncError", { enumerable: true, get: function () { return errors_1.OutOfSyncError; } });
const cli_parsers_1 = require("./cli-parsers");
Object.defineProperty(exports, "buildDepGraphFromCliOutput", { enumerable: true, get: function () { return cli_parsers_1.buildDepGraphFromCliOutput; } });
// Straight to Depgraph Functionality *************
// ************************************************
const dep_graph_builders_1 = require("./dep-graph-builders");
Object.defineProperty(exports, "parseNpmLockV2Project", { enumerable: true, get: function () { return dep_graph_builders_1.parseNpmLockV2Project; } });
Object.defineProperty(exports, "extractPkgsFromYarnLockV1", { enumerable: true, get: function () { return dep_graph_builders_1.extractPkgsFromYarnLockV1; } });
Object.defineProperty(exports, "parseYarnLockV1Project", { enumerable: true, get: function () { return dep_graph_builders_1.parseYarnLockV1Project; } });
Object.defineProperty(exports, "parseYarnLockV1WorkspaceProject", { enumerable: true, get: function () { return dep_graph_builders_1.parseYarnLockV1WorkspaceProject; } });
Object.defineProperty(exports, "buildDepGraphYarnLockV1SimpleCyclesPruned", { enumerable: true, get: function () { return dep_graph_builders_1.buildDepGraphYarnLockV1SimpleCyclesPruned; } });
Object.defineProperty(exports, "buildDepGraphYarnLockV1Simple", { enumerable: true, get: function () { return dep_graph_builders_1.buildDepGraphYarnLockV1Simple; } });
Object.defineProperty(exports, "buildDepGraphYarnLockV1WorkspaceCyclesPruned", { enumerable: true, get: function () { return dep_graph_builders_1.buildDepGraphYarnLockV1WorkspaceCyclesPruned; } });
Object.defineProperty(exports, "buildDepGraphYarnLockV1Workspace", { enumerable: true, get: function () { return dep_graph_builders_1.buildDepGraphYarnLockV1Workspace; } });
Object.defineProperty(exports, "extractPkgsFromYarnLockV2", { enumerable: true, get: function () { return dep_graph_builders_1.extractPkgsFromYarnLockV2; } });
Object.defineProperty(exports, "parseYarnLockV2Project", { enumerable: true, get: function () { return dep_graph_builders_1.parseYarnLockV2Project; } });
Object.defineProperty(exports, "buildDepGraphYarnLockV2Simple", { enumerable: true, get: function () { return dep_graph_builders_1.buildDepGraphYarnLockV2Simple; } });
Object.defineProperty(exports, "parsePnpmProject", { enumerable: true, get: function () { return dep_graph_builders_1.parsePnpmProject; } });
Object.defineProperty(exports, "parsePnpmWorkspace", { enumerable: true, get: function () { return dep_graph_builders_1.parsePnpmWorkspace; } });
Object.defineProperty(exports, "parsePkgJson", { enumerable: true, get: function () { return dep_graph_builders_1.parsePkgJson; } });
const lockfile_parser_1 = require("./dep-graph-builders/pnpm/lockfile-parser");
Object.defineProperty(exports, "getPnpmLockfileParser", { enumerable: true, get: function () { return lockfile_parser_1.getPnpmLockfileParser; } });
const utils_1 = require("./utils");
Object.defineProperty(exports, "getLockfileVersionFromFile", { enumerable: true, get: function () { return utils_1.getLockfileVersionFromFile; } });
Object.defineProperty(exports, "getNpmLockfileVersion", { enumerable: true, get: function () { return utils_1.getNpmLockfileVersion; } });
Object.defineProperty(exports, "getYarnLockfileVersion", { enumerable: true, get: function () { return utils_1.getYarnLockfileVersion; } });
Object.defineProperty(exports, "getPnpmLockfileVersion", { enumerable: true, get: function () { return utils_1.getPnpmLockfileVersion; } });
Object.defineProperty(exports, "NodeLockfileVersion", { enumerable: true, get: function () { return utils_1.NodeLockfileVersion; } });
// **********************************
async function buildDepTree(manifestFileContents, lockFileContents, includeDev = false, lockfileType, strictOutOfSync = true, defaultManifestFileName = 'package.json') {
if (!lockfileType) {
lockfileType = parsers_1.LockfileType.npm;
}
else if (lockfileType === parsers_1.LockfileType.yarn) {
lockfileType = getYarnLockfileType(lockFileContents);
}
let lockfileParser;
switch (lockfileType) {
case parsers_1.LockfileType.npm:
lockfileParser = new package_lock_parser_1.PackageLockParser();
break;
case parsers_1.LockfileType.yarn:
lockfileParser = new yarn_lock_parser_1.YarnLockParser();
break;
case parsers_1.LockfileType.yarn2:
lockfileParser = new yarn2_lock_parser_1.Yarn2LockParser();
break;
default:
throw new errors_1.InvalidUserInputError('Unsupported lockfile type ' +
`${lockfileType} provided. Only 'npm' or 'yarn' is currently ` +
'supported.');
}
const manifestFile = (0, parsers_1.parseManifestFile)(manifestFileContents);
if (!manifestFile.name) {
manifestFile.name = path.isAbsolute(defaultManifestFileName)
? path.basename(defaultManifestFileName)
: defaultManifestFileName;
}
const lockFile = lockfileParser.parseLockFile(lockFileContents);
return lockfileParser.getDependencyTree(manifestFile, lockFile, includeDev, strictOutOfSync);
}
exports.buildDepTree = buildDepTree;
async function buildDepTreeFromFiles(root, manifestFilePath, lockFilePath, includeDev = false, strictOutOfSync = true) {
if (!root || !manifestFilePath || !lockFilePath) {
throw new Error('Missing required parameters for buildDepTreeFromFiles()');
}
const manifestFileFullPath = path.resolve(root, manifestFilePath);
const lockFileFullPath = path.resolve(root, lockFilePath);
if (!fs.existsSync(manifestFileFullPath)) {
throw new errors_1.InvalidUserInputError('Target file package.json not found at ' +
`location: ${manifestFileFullPath}`);
}
if (!fs.existsSync(lockFileFullPath)) {
throw new errors_1.InvalidUserInputError('Lockfile not found at location: ' + lockFileFullPath);
}
const manifestFileContents = fs.readFileSync(manifestFileFullPath, 'utf-8');
const lockFileContents = fs.readFileSync(lockFileFullPath, 'utf-8');
let lockFileType;
if (lockFilePath.endsWith('package-lock.json')) {
lockFileType = parsers_1.LockfileType.npm;
}
else if (lockFilePath.endsWith('yarn.lock')) {
lockFileType = getYarnLockfileType(lockFileContents, root, lockFilePath);
}
else {
throw new errors_1.InvalidUserInputError(`Unknown lockfile ${lockFilePath}. ` +
'Please provide either package-lock.json or yarn.lock.');
}
return await buildDepTree(manifestFileContents, lockFileContents, includeDev, lockFileType, strictOutOfSync, manifestFilePath);
}
exports.buildDepTreeFromFiles = buildDepTreeFromFiles;
function getYarnWorkspacesFromFiles(root, manifestFilePath) {
if (!root || !manifestFilePath) {
throw new Error('Missing required parameters for getYarnWorkspacesFromFiles()');
}
const manifestFileFullPath = path.resolve(root, manifestFilePath);
if (!fs.existsSync(manifestFileFullPath)) {
throw new errors_1.InvalidUserInputError('Target file package.json not found at ' +
`location: ${manifestFileFullPath}`);
}
const manifestFileContents = fs.readFileSync(manifestFileFullPath, 'utf-8');
return (0, parsers_1.getYarnWorkspaces)(manifestFileContents);
}
exports.getYarnWorkspacesFromFiles = getYarnWorkspacesFromFiles;
function getYarnLockfileType(lockFileContents, root, lockFilePath) {
if (lockFileContents.includes('__metadata') ||
(root &&
lockFilePath &&
fs.existsSync(path.resolve(root, lockFilePath.replace('yarn.lock', '.yarnrc.yml'))))) {
return parsers_1.LockfileType.yarn2;
}
else {
return parsers_1.LockfileType.yarn;
}
}
exports.getYarnLockfileType = getYarnLockfileType;
//# sourceMappingURL=index.js.map
;