pnpm
Version:
Fast, disk space efficient package manager
69 lines • 3.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const utils_1 = require("@pnpm/utils");
const pLimit = require("p-limit");
const path = require("path");
const pathAbsolute = require("path-absolute");
const R = require("ramda");
const supi_1 = require("supi");
const createStoreController_1 = require("../createStoreController");
const findWorkspacePackages_1 = require("../findWorkspacePackages");
const getConfigs_1 = require("../getConfigs");
const readImporterManifest_1 = require("../readImporterManifest");
const installLimit = pLimit(4);
exports.default = async (input, opts) => {
const cwd = opts && opts.prefix || process.cwd();
const storeControllerCache = new Map();
let workspacePackages;
let localPackages;
if (opts.linkWorkspacePackages && opts.workspacePrefix) {
workspacePackages = await findWorkspacePackages_1.default(opts.workspacePrefix);
localPackages = findWorkspacePackages_1.arrayOfLocalPackagesToMap(workspacePackages);
}
else {
localPackages = {};
}
const store = await createStoreController_1.cached(storeControllerCache, opts);
const linkOpts = Object.assign(opts, {
localPackages,
store: store.path,
storeController: store.ctrl,
});
// pnpm link
if (!input || !input.length) {
await supi_1.linkToGlobal(cwd, Object.assign({}, linkOpts, { manifest: await utils_1.safeReadPackageFromDir(opts.globalPrefix) || {} }));
return;
}
const [pkgPaths, pkgNames] = R.partition((inp) => inp.startsWith('.'), input);
if (pkgNames.length) {
let globalPkgNames;
if (opts.workspacePrefix) {
workspacePackages = await findWorkspacePackages_1.default(opts.workspacePrefix);
const pkgsFoundInWorkspace = workspacePackages.filter((pkg) => pkgNames.includes(pkg.manifest.name));
pkgsFoundInWorkspace.forEach((pkgFromWorkspace) => pkgPaths.push(pkgFromWorkspace.path));
if (pkgsFoundInWorkspace.length && !linkOpts.saveDev && !linkOpts.saveProd && !linkOpts.saveOptional) {
linkOpts.saveProd = true;
}
globalPkgNames = pkgNames.filter((pkgName) => !pkgsFoundInWorkspace.some((pkgFromWorkspace) => pkgFromWorkspace.manifest.name === pkgName));
}
else {
globalPkgNames = pkgNames;
}
const globalPkgPath = pathAbsolute(opts.globalPrefix);
globalPkgNames.forEach((pkgName) => pkgPaths.push(path.join(globalPkgPath, 'node_modules', pkgName)));
}
await Promise.all(pkgPaths.map((prefix) => installLimit(async () => {
const s = await createStoreController_1.cached(storeControllerCache, opts);
await supi_1.install(await readImporterManifest_1.readImporterManifestFromDir(prefix), Object.assign({}, await getConfigs_1.default(Object.assign({}, opts.cliArgs, { prefix }), {
command: ['link'],
excludeReporter: true,
}), { localPackages, store: s.path, storeController: s.ctrl }));
})));
await supi_1.link(pkgPaths, path.join(cwd, 'node_modules'), Object.assign({}, linkOpts, { manifest: await readImporterManifest_1.readImporterManifestFromDir(cwd) }));
await Promise.all(Array.from(storeControllerCache.values())
.map(async (storeControllerPromise) => {
const storeControllerHolder = await storeControllerPromise;
await storeControllerHolder.ctrl.close();
}));
};
//# sourceMappingURL=link.js.map