HEX
Server: Apache
System: Linux webd004.cluster130.gra.hosting.ovh.net 5.15.206-ovh-vps-grsec-zfs-classid #1 SMP Fri May 15 02:41:25 UTC 2026 x86_64
User: frenchy (106757)
PHP: 7.4.33
Disabled: _dyuweyrj4,_dyuweyrj4r,dl
Upload Files
File: /home/frenchy/www/french-american.org/current/node_modules/@snyk/dep-graph/dist/legacy/index.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var _ = require("lodash");
var crypto = require("crypto");
var builder_1 = require("../core/builder");
var event_loop_spinner_1 = require("./event-loop-spinner");
var objectHash = require("object-hash");
function addLabel(dep, key, value) {
    if (!dep.labels) {
        dep.labels = {};
    }
    dep.labels[key] = value;
}
function depTreeToGraph(depTree, pkgManagerName) {
    return tslib_1.__awaiter(this, void 0, void 0, function () {
        var rootPkg, pkgManagerInfo, targetOS, builder, eventLoopSpinner, depGraph;
        return tslib_1.__generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    rootPkg = {
                        name: depTree.name,
                        version: depTree.version,
                    };
                    pkgManagerInfo = {
                        name: pkgManagerName,
                    };
                    targetOS = depTree.targetOS;
                    if (targetOS) {
                        pkgManagerInfo.repositories = [
                            {
                                alias: targetOS.name + ":" + targetOS.version,
                            },
                        ];
                    }
                    builder = new builder_1.DepGraphBuilder(pkgManagerInfo, rootPkg);
                    eventLoopSpinner = new event_loop_spinner_1.EventLoopSpinner();
                    return [4 /*yield*/, buildGraph(builder, depTree, depTree.name, eventLoopSpinner, true)];
                case 1:
                    _a.sent();
                    return [4 /*yield*/, builder.build()];
                case 2:
                    depGraph = _a.sent();
                    return [2 /*return*/, shortenNodeIds(depGraph, eventLoopSpinner)];
            }
        });
    });
}
exports.depTreeToGraph = depTreeToGraph;
function buildGraph(builder, depTree, pkgName, eventLoopSpinner, isRoot) {
    if (isRoot === void 0) { isRoot = false; }
    return tslib_1.__awaiter(this, void 0, void 0, function () {
        var getNodeId, depNodesIds, hash, deps, depNames, _i, _a, depName, dep, subtreeHash, depPkg, depNodeId, nodeInfo, treeHash, pkgNodeId, pkg, nodeInfo, _b, depNodesIds_1, depNodeId;
        return tslib_1.__generator(this, function (_c) {
            switch (_c.label) {
                case 0:
                    getNodeId = function (name, version, hashId) {
                        return name + "@" + (version || '') + "|" + hashId;
                    };
                    depNodesIds = [];
                    hash = crypto.createHash('sha1');
                    if (depTree.versionProvenance) {
                        hash.update(objectHash(depTree.versionProvenance));
                    }
                    if (depTree.labels) {
                        hash.update(objectHash(depTree.labels));
                    }
                    deps = depTree.dependencies || {};
                    depNames = _.keys(deps).filter(function (d) { return !!deps[d]; });
                    _i = 0, _a = depNames.sort();
                    _c.label = 1;
                case 1:
                    if (!(_i < _a.length)) return [3 /*break*/, 4];
                    depName = _a[_i];
                    dep = deps[depName];
                    return [4 /*yield*/, buildGraph(builder, dep, depName, eventLoopSpinner)];
                case 2:
                    subtreeHash = _c.sent();
                    depPkg = {
                        name: depName,
                        version: dep.version,
                    };
                    depNodeId = getNodeId(depPkg.name, depPkg.version, subtreeHash);
                    depNodesIds.push(depNodeId);
                    nodeInfo = {};
                    if (dep.versionProvenance) {
                        nodeInfo.versionProvenance = dep.versionProvenance;
                    }
                    if (dep.labels) {
                        nodeInfo.labels = dep.labels;
                    }
                    builder.addPkgNode(depPkg, depNodeId, nodeInfo);
                    hash.update(depNodeId);
                    _c.label = 3;
                case 3:
                    _i++;
                    return [3 /*break*/, 1];
                case 4:
                    treeHash = hash.digest('hex');
                    if (isRoot) {
                        pkgNodeId = builder.rootNodeId;
                    }
                    else {
                        pkg = {
                            name: pkgName,
                            version: depTree.version,
                        };
                        pkgNodeId = getNodeId(pkg.name, pkg.version, treeHash);
                        nodeInfo = {};
                        if (depTree.versionProvenance) {
                            nodeInfo.versionProvenance = depTree.versionProvenance;
                        }
                        if (depTree.labels) {
                            nodeInfo.labels = depTree.labels;
                        }
                        builder.addPkgNode(pkg, pkgNodeId, nodeInfo);
                    }
                    for (_b = 0, depNodesIds_1 = depNodesIds; _b < depNodesIds_1.length; _b++) {
                        depNodeId = depNodesIds_1[_b];
                        builder.connectDep(pkgNodeId, depNodeId);
                    }
                    if (!(depNodesIds.length > 0 && eventLoopSpinner.isStarving())) return [3 /*break*/, 6];
                    return [4 /*yield*/, eventLoopSpinner.spin()];
                case 5:
                    _c.sent();
                    _c.label = 6;
                case 6: return [2 /*return*/, treeHash];
            }
        });
    });
}
function shortenNodeIds(depGraph, eventLoopSpinner) {
    return tslib_1.__awaiter(this, void 0, void 0, function () {
        var builder, nodesMap, _i, _a, pkg, nodeIds, i, nodeId, nodeInfo, newNodeId, _b, _c, pkg, _d, _e, nodeId, _f, _g, depNodeId, parentNode, childNode;
        return tslib_1.__generator(this, function (_h) {
            switch (_h.label) {
                case 0:
                    builder = new builder_1.DepGraphBuilder(depGraph.pkgManager, depGraph.rootPkg);
                    nodesMap = {};
                    _i = 0, _a = depGraph.getPkgs();
                    _h.label = 1;
                case 1:
                    if (!(_i < _a.length)) return [3 /*break*/, 4];
                    pkg = _a[_i];
                    nodeIds = depGraph.getPkgNodeIds(pkg);
                    for (i = 0; i < nodeIds.length; i++) {
                        nodeId = nodeIds[i];
                        if (nodeId === depGraph.rootNodeId) {
                            continue;
                        }
                        nodeInfo = depGraph.getNode(nodeId);
                        newNodeId = void 0;
                        if (nodeIds.length === 1) {
                            newNodeId = "" + trimAfterLastSep(nodeId, '|');
                        }
                        else {
                            newNodeId = trimAfterLastSep(nodeId, '|') + "|" + (i + 1);
                        }
                        nodesMap[nodeId] = newNodeId;
                        builder.addPkgNode(pkg, newNodeId, nodeInfo);
                    }
                    if (!eventLoopSpinner.isStarving()) return [3 /*break*/, 3];
                    return [4 /*yield*/, eventLoopSpinner.spin()];
                case 2:
                    _h.sent();
                    _h.label = 3;
                case 3:
                    _i++;
                    return [3 /*break*/, 1];
                case 4:
                    _b = 0, _c = depGraph.getPkgs();
                    _h.label = 5;
                case 5:
                    if (!(_b < _c.length)) return [3 /*break*/, 8];
                    pkg = _c[_b];
                    for (_d = 0, _e = depGraph.getPkgNodeIds(pkg); _d < _e.length; _d++) {
                        nodeId = _e[_d];
                        for (_f = 0, _g = depGraph.getNodeDepsNodeIds(nodeId); _f < _g.length; _f++) {
                            depNodeId = _g[_f];
                            parentNode = nodesMap[nodeId] || nodeId;
                            childNode = nodesMap[depNodeId] || depNodeId;
                            builder.connectDep(parentNode, childNode);
                        }
                    }
                    if (!eventLoopSpinner.isStarving()) return [3 /*break*/, 7];
                    return [4 /*yield*/, eventLoopSpinner.spin()];
                case 6:
                    _h.sent();
                    _h.label = 7;
                case 7:
                    _b++;
                    return [3 /*break*/, 5];
                case 8: return [2 /*return*/, builder.build()];
            }
        });
    });
}
function graphToDepTree(depGraphInterface, pkgType, opts) {
    if (opts === void 0) { opts = { deduplicateWithinTopLevelDeps: false }; }
    return tslib_1.__awaiter(this, void 0, void 0, function () {
        var depGraph, eventLoopSpinner, depTree, targetOS;
        return tslib_1.__generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    depGraph = depGraphInterface;
                    // TODO: implement cycles support
                    if (depGraph.hasCycles()) {
                        throw new Error('Conversion to DepTree does not support cyclic graphs yet');
                    }
                    eventLoopSpinner = new event_loop_spinner_1.EventLoopSpinner();
                    return [4 /*yield*/, buildSubtree(depGraph, depGraph.rootNodeId, eventLoopSpinner, opts.deduplicateWithinTopLevelDeps ? null : false)];
                case 1:
                    depTree = _a.sent();
                    depTree.type = depGraph.pkgManager.name;
                    depTree.packageFormatVersion = constructPackageFormatVersion(pkgType);
                    targetOS = constructTargetOS(depGraph);
                    if (targetOS) {
                        depTree.targetOS = targetOS;
                    }
                    return [2 /*return*/, depTree];
            }
        });
    });
}
exports.graphToDepTree = graphToDepTree;
function constructPackageFormatVersion(pkgType) {
    if (pkgType === 'maven') {
        pkgType = 'mvn';
    }
    return pkgType + ":0.0.1";
}
function constructTargetOS(depGraph) {
    if (['apk', 'apt', 'deb', 'rpm'].indexOf(depGraph.pkgManager.name) === -1) {
        // .targetOS is undefined unless its a linux pkgManager
        return;
    }
    if (!depGraph.pkgManager.repositories
        || !depGraph.pkgManager.repositories.length
        || !depGraph.pkgManager.repositories[0].alias) {
        throw new Error('Incomplete .pkgManager, could not create .targetOS');
    }
    var _a = depGraph.pkgManager.repositories[0].alias.split(':'), name = _a[0], version = _a[1];
    return { name: name, version: version };
}
function buildSubtree(depGraph, nodeId, eventLoopSpinner, maybeDeduplicationSet) {
    if (maybeDeduplicationSet === void 0) { maybeDeduplicationSet = null; }
    return tslib_1.__awaiter(this, void 0, void 0, function () {
        var isRoot, nodePkg, nodeInfo, depTree, depInstanceIds, _i, depInstanceIds_1, depInstId, subtree;
        return tslib_1.__generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    isRoot = nodeId === depGraph.rootNodeId;
                    nodePkg = depGraph.getNodePkg(nodeId);
                    nodeInfo = depGraph.getNode(nodeId);
                    depTree = {};
                    depTree.name = nodePkg.name;
                    depTree.version = nodePkg.version;
                    if (nodeInfo.versionProvenance) {
                        depTree.versionProvenance = nodeInfo.versionProvenance;
                    }
                    if (nodeInfo.labels) {
                        depTree.labels = nodeInfo.labels;
                    }
                    depInstanceIds = depGraph.getNodeDepsNodeIds(nodeId);
                    if (!depInstanceIds || depInstanceIds.length === 0) {
                        return [2 /*return*/, depTree];
                    }
                    if (maybeDeduplicationSet) {
                        if (maybeDeduplicationSet.has(nodeId)) {
                            if (depInstanceIds.length > 0) {
                                addLabel(depTree, 'pruned', 'true');
                            }
                            return [2 /*return*/, depTree];
                        }
                        maybeDeduplicationSet.add(nodeId);
                    }
                    _i = 0, depInstanceIds_1 = depInstanceIds;
                    _a.label = 1;
                case 1:
                    if (!(_i < depInstanceIds_1.length)) return [3 /*break*/, 4];
                    depInstId = depInstanceIds_1[_i];
                    // Deduplication of nodes occurs only within a scope of a top-level dependency.
                    // Therefore, every top-level dep gets an independent set to track duplicates.
                    if (isRoot && maybeDeduplicationSet !== false) {
                        maybeDeduplicationSet = new Set();
                    }
                    return [4 /*yield*/, buildSubtree(depGraph, depInstId, eventLoopSpinner, maybeDeduplicationSet)];
                case 2:
                    subtree = _a.sent();
                    if (!subtree) {
                        return [3 /*break*/, 3];
                    }
                    if (!depTree.dependencies) {
                        depTree.dependencies = {};
                    }
                    depTree.dependencies[subtree.name] = subtree;
                    _a.label = 3;
                case 3:
                    _i++;
                    return [3 /*break*/, 1];
                case 4:
                    if (!eventLoopSpinner.isStarving()) return [3 /*break*/, 6];
                    return [4 /*yield*/, eventLoopSpinner.spin()];
                case 5:
                    _a.sent();
                    _a.label = 6;
                case 6: return [2 /*return*/, depTree];
            }
        });
    });
}
function trimAfterLastSep(str, sep) {
    return str.slice(0, str.lastIndexOf(sep));
}
//# sourceMappingURL=index.js.map