model/pkg.js

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const { clone, values } = require('lodash');
/**
 * flatten deps and devDep into key:value pairs where key ~= name;version.
 * this function is atrocious. it should be ashamed of itself. and me! i'm sorry,
 * other guy/girl.
 * @param {any} pkgs
 * @returns {any} flatSet new set
 */
function flattenPkgs({ pkgs, flatSet, root }) {
    flatSet = flatSet || {};
    if (!pkgs)
        return flatSet;
    if (pkgs.__ripcordFlatSet)
        return pkgs.__ripcordFlatSet; // @HACK, is flatSet already
    for (let pkgName in pkgs) {
        if (pkgName.indexOf(';') > -1)
            return pkgs; // @HACK, is flatSet already
        const pkg = pkgs[pkgName];
        let directConsumer = null;
        let consumerTaggedRequestedVersion = null;
        if (pkg.from)
            directConsumer = pkg.from[pkg.from.length - 2];
        if (pkg.requestedVersion)
            consumerTaggedRequestedVersion = `${pkg.requestedVersion} (${directConsumer})`;
        const _key = key(pkg);
        const flatPkg = flatSet[_key];
        /* istanbul ignore else */
        if (!flatPkg) {
            // do the flattening!
            const tPkg = clone(pkg);
            if (tPkg.requestedVersion)
                tPkg.requestedVersion = consumerTaggedRequestedVersion;
            if (tPkg.from)
                tPkg.from = tPkg.from.join('>');
            flatSet[_key] = tPkg;
            delete tPkg.dependencies;
        }
        else if (!flatPkg._ripcord_hasBeenAddedAsSecondary) {
            flatPkg.author = flatPkg.author || pkg.author;
            // ^^ HACK @TODO FIGURE IT OUT
            // add additional from reference, as this pkg was depended on from multiple parents
            if (flatPkg.from)
                flatPkg.from = `${flatPkg.from}; ${pkg.from.join('>')}`;
            if (flatPkg.requestedVersion)
                flatPkg.requestedVersion = `${consumerTaggedRequestedVersion}; ${flatPkg.requestedVersion}`;
            flatPkg._ripcord_hasBeenAddedAsSecondary = true;
        }
        flattenPkgs({ pkgs: pkg.dependencies, flatSet, root: false });
    }
    if (root) {
        for (let key in flatSet) {
            let pkg = flatSet[key];
            delete pkg._ripcord_hasBeenAddedAsSecondary;
        }
        if (!pkgs.__ripcordFlatSet) {
            Object.defineProperty(pkgs, '__ripcordFlatSet', {
                set() { return; },
                get() { return flatSet; },
                enumerable: false
            });
        }
    }
    return flatSet;
}
exports.flattenPkgs = flattenPkgs;
function key(pkg) { return `${pkg.name};${pkg.version}`; }
exports.key = key;
//# sourceMappingURL=pkg.js.map