snyk-poetry-lockfile-parser
Version:
Generate a dep graph given poetry.lock and pyproject.toml files
41 lines • 1.81 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.packageSpecsFrom = packageSpecsFrom;
const toml = require("@iarna/toml");
const error_catalog_nodejs_public_1 = require("@snyk/error-catalog-nodejs-public");
function packageSpecsFrom(lockFileContents) {
var _a;
let lockFile;
try {
lockFile = toml.parse(lockFileContents);
}
catch (error) {
throw new error_catalog_nodejs_public_1.OpenSourceEcosystems.UnparseableLockFileError('The poetry.lock file is not parsable.', { error });
}
if (!lockFile.package) {
throw new error_catalog_nodejs_public_1.OpenSourceEcosystems.UnparseableLockFileError('The poetry.lock file contains no package stanza.');
}
// In lock-version 1.x hashes live in a separate `[metadata.files]` table keyed by package
// name; in 2.x they are inline as `files` on each `[[package]]`. Support both.
const metadataFiles = metadataFilesIndex((_a = lockFile.metadata) === null || _a === void 0 ? void 0 : _a.files);
return lockFile.package.map((pkg) => {
var _a, _b;
return {
name: pkg.name,
version: pkg.version,
dependencies: Object.keys(pkg.dependencies || []),
files: (_b = (_a = pkg.files) !== null && _a !== void 0 ? _a : metadataFiles[pkg.name.toLowerCase()]) !== null && _b !== void 0 ? _b : [],
source: pkg.source,
};
});
}
// Index the v1 `[metadata.files]` table case-insensitively so it can be joined back to each
// package regardless of name casing.
function metadataFilesIndex(files) {
const index = {};
for (const [name, entries] of Object.entries(files || {})) {
index[name.toLowerCase()] = entries;
}
return index;
}
//# sourceMappingURL=lock-file-parser.js.map