@aniyajs/rotor
Version:
基于webpack5开发的一款专注于打包、运行的工具
95 lines (82 loc) • 2.42 kB
JavaScript
const browserslist = require("browserslist");
const chalk = require("chalk");
const os = require("os");
const pkgUp = require("pkg-up");
const prompts = require("prompts");
const fs = require("fs-extra");
// 默认browserslist
const defaultBrowsers = {
production: [">0.2%", "not dead", "not op_mini all"],
development: [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version",
],
};
function shouldSetBrowsers(isInteractive) {
// 没有连接到终端上下文
if (!isInteractive) {
return Promise.resolve(true);
}
const questions = [
{
type: "confirm",
name: "shouldSetBrowsers",
message:
chalk.yellow("我们找不到 browserslist 配置") +
`\n\n您要将默认值添加到您的${chalk.bold("package.json")}吗?`,
initial: true,
},
];
return prompts(questions).then((answer) => answer.shouldSetBrowsers);
}
/**
* 指定browserslist配置
*
* @param {string} dir 文件路径
* @param {any} isInteractive 终端上下文
* @param {*} retry
* @returns
*/
function checkBrowsers(dir, isInteractive, retry = true) {
// 检查browerslist配置是否存在
const current = browserslist.loadConfig({ path: dir });
if (current != null) {
return Promise.resolve(current);
}
if (!retry) {
return Promise.reject(
new Error(
chalk.red("您必须指定browserslist。") +
os.EOL +
`请添加${chalk.underline("browserslist")}到你的${chalk.bold(
"package.json",
)}文件。`,
),
);
}
return shouldSetBrowsers(isInteractive).then((shouldSetBrowsers) => {
if (!shouldSetBrowsers) {
return checkBrowsers(dir, isInteractive, false);
}
return (
pkgUp({ cwd: dir })
.then((filePath) => {
if (!filePath) {
return Promise.reject();
}
const pkg = JSON.parse(fs.readFileSync(filePath));
pkg.browserslist = defaultBrowsers;
fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + os.EOL);
browserslist.clearCaches();
console.log();
})
// 忽略任何错误
.catch(() => {})
.then(() => checkBrowsers(dir, isInteractive, false))
);
});
}
module.exports = {
checkBrowsers,
};