pkgs-graph
Version:
Create a graph from an array of packages
91 lines • 3.76 kB
JavaScript
;
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