UNPKG

rollup-plugin-install

Version:
71 lines 2.69 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.autoInstallPlugin = void 0; const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const child_process_1 = require("child_process"); const pluginutils_1 = require("@rollup/pluginutils"); function autoInstallPlugin(optons) { const bin = (optons === null || optons === void 0 ? void 0 : optons.bin) || "npm"; const npmDir = "node_modules"; const npmRoot = tryGetPkgDir(__dirname); return { name: "auto-install", resolveId(source, importer, options) { const normalizeSource = pluginutils_1.normalizePath(source); // 1. source校验 if (!source || // 非空(保险点) /^\W?[./]/.test(normalizeSource) || // 非相对路径 normalizeSource.includes(npmDir) // 不含node_modules ) { return null; } // 2. npm模块名处理&校验 const match = source.match(/^((@\w+\/)?[^/]*)\/?.*$/); if (!match) { console.error("正则写错了o(╥﹏╥)o ... ", source, " 提个issue吧~"); return null; } const module = match[1]; // 3. 判断是否已经安装npm if (fs_1.default.existsSync(path_1.default.resolve(npmRoot, npmDir, module))) { return null; } // 4. 开始安装 console.info("Installing %s... ", module); const output = child_process_1.execSync(`${bin} install ${module}`, { encoding: "utf-8", timeout: 60000, stdio: ["ignore", "pipe", "inherit"], }); if (output.includes("error")) { console.error("安装出错了o(╥﹏╥)o ... ", module); return null; } return module; }, }; } exports.autoInstallPlugin = autoInstallPlugin; /** * 从某个目录开始,向上查找pkgJson所在目录 * * @param {string} dir * @returns {string} */ function tryGetPkgDir(dir) { const pkgDir = path_1.default.resolve(dir, "./package.json"); if (fs_1.default.existsSync(pkgDir)) { return pkgDir; } const nextDir = path_1.default.resolve(dir, "../"); if (/\/$/.test(nextDir)) { console.error("无法找到package.json所在的目录"); return ""; } return tryGetPkgDir(nextDir); } //# sourceMappingURL=index.js.map