rollup-plugin-install
Version:
auto install dependence while vite/rollup build
71 lines • 2.69 kB
JavaScript
;
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