pnpm
Version:
A fast implementation of npm install
65 lines • 3 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator.throw(value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments)).next());
});
};
const path = require('path');
const mkdirp_1 = require('../fs/mkdirp');
const symlinkToModules_1 = require('./symlinkToModules');
function flattenDependencies(id, store, pkgs, storePkg) {
const newPkgs = getNewPkgs(pkgs, [id]);
const todo = newPkgs.map(newPkg => newPkg.id).concat([id]);
const tree = {};
flattenPkgs(id, storePkg, 1, [], tree);
return createFlatTree(id, store, id, storePkg, todo, tree, 1);
}
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = flattenDependencies;
function getNewPkgs(pkgs, keypath) {
return pkgs.filter(pkg => !pkg.fromCache).concat(pkgs
.filter(pkg => keypath.indexOf(pkg.id) === -1)
.reduce((newPkgs, pkg) => newPkgs.concat(getNewPkgs(pkg.dependencies, keypath.concat([pkg.id]))), []));
}
function createFlatTree(id, store, root, storePkg, todo, tree, depth) {
return __awaiter(this, void 0, void 0, function* () {
if (todo.indexOf(id) === -1)
return;
todo.splice(todo.indexOf(id), 1);
const modules = path.join(root, 'node_modules');
yield mkdirp_1.default(modules);
yield Promise.all(Object.keys(tree[id])
.map(function (depName) {
return __awaiter(this, void 0, void 0, function* () {
if (!tree || !tree[id] || !tree[id][depName])
throw new Error('Error during creating flat tree');
const target = path.join(store, tree[id][depName].id, '_');
if (tree[id][depName].depth > depth) {
yield symlinkToModules_1.default(target, modules);
}
return createFlatTree(tree[id][depName].id, store, target, storePkg, todo, tree, depth + 1);
});
}));
});
}
function flattenPkgs(id, storePkg, depth, keypath, tree) {
if (tree[id])
return tree[id];
if (keypath.indexOf(id) !== -1)
return {};
tree[id] = Object.keys(storePkg[id].dependencies || {})
.reduce((prev, depName) => {
const depId = storePkg[id].dependencies[depName];
const subdeps = flattenPkgs(depId, storePkg, depth + 1, keypath.concat([id]), tree);
prev[depName] = {
id: depId,
depth,
};
return Object.assign({}, subdeps, prev);
}, {});
return tree[id];
}
//# sourceMappingURL=flattenDependencies.js.map