UNPKG

pkgs-graph

Version:

Create a graph from an array of packages

91 lines 3.76 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createPkgGraph = void 0; const path_1 = __importDefault(require("path")); const npm_package_arg_1 = __importDefault(require("@pnpm/npm-package-arg")); const resolve_workspace_range_1 = require("@pnpm/resolve-workspace-range"); function createPkgGraph(pkgs, opts) { const pkgMap = createPkgMap(pkgs); const unmatched = []; const graph = Object.entries(pkgMap) .reduce((acc, [pkgSpec, pkg]) => { acc[pkgSpec] = { dependencies: createNode(pkg), package: pkg, }; return acc; }, {}); return { graph, unmatched }; function createNode(pkg) { const dependencies = { ...(!opts?.ignoreDevDeps && pkg.manifest.devDependencies), ...pkg.manifest.optionalDependencies, ...pkg.manifest.dependencies, }; return Object.entries(dependencies) .map(([depName, rawSpec]) => { let spec; const isWorkspaceSpec = rawSpec.startsWith('workspace:'); try { if (isWorkspaceSpec) { rawSpec = rawSpec.slice(10); if (rawSpec === '^' || rawSpec === '~') { rawSpec = '*'; } } spec = npm_package_arg_1.default.resolve(depName, rawSpec, pkg.dir); } catch (err) { // eslint-disable-line return ''; } if (spec.type === 'directory') { const matchedPkg = Object.values(pkgMap).find(pkg => path_1.default.relative(pkg.dir, spec.fetchSpec) === ''); if (matchedPkg == null) { return ''; } return matchedPkg.dir; } if (spec.type !== 'version' && spec.type !== 'range') return ''; const pkgs = Object.values(pkgMap).filter(pkg => pkg.manifest.name === depName); if (pkgs.length === 0) return ''; const versions = pkgs.filter(({ manifest }) => manifest.version) .map(pkg => pkg.manifest.version); // explicitly check if false, backwards-compatibility (can be undefined) const strictWorkspaceMatching = opts?.linkWorkspacePackages === false && !isWorkspaceSpec; if (strictWorkspaceMatching) { unmatched.push({ pkgName: depName, range: rawSpec }); return ''; } if (isWorkspaceSpec && versions.length === 0) { const matchedPkg = pkgs.find(pkg => pkg.manifest.name === depName); return matchedPkg.dir; } if (versions.includes(rawSpec)) { const matchedPkg = pkgs.find(pkg => pkg.manifest.name === depName && pkg.manifest.version === rawSpec); return matchedPkg.dir; } const matched = (0, resolve_workspace_range_1.resolveWorkspaceRange)(rawSpec, versions); if (!matched) { unmatched.push({ pkgName: depName, range: rawSpec }); return ''; } const matchedPkg = pkgs.find(pkg => pkg.manifest.name === depName && pkg.manifest.version === matched); return matchedPkg.dir; }) .filter(Boolean); } } exports.createPkgGraph = createPkgGraph; function createPkgMap(pkgs) { const pkgMap = {}; for (const pkg of pkgs) { pkgMap[pkg.dir] = pkg; } return pkgMap; } //# sourceMappingURL=index.js.map