UNPKG

snyk-poetry-lockfile-parser

Version:

Generate a dep graph given poetry.lock and pyproject.toml files

41 lines • 1.81 kB
"use strict"; 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