@mega-apps/cli
Version:
Mom builder for all mega modules apps. The recommended basic operation dependency package is attached, and users can check and repair defects in actual applications.
166 lines (148 loc) • 4.74 kB
JavaScript
const fs = require("fs");
const path = require("path");
const chalk = require('chalk');
const logger = require("./logger");
const { checkProjectConfigAndSomeFiles: _checkProjectConfigAndSomeFiles } = require("./check");
/**
* 注入Vue Loader, 解决组件name自动使用文件路径的问题(适用于开发环境和生产环境)
*/
/**
* 查找文本内容,并替换
* @param content 文本内容
* @param searchText 要查找的字符串
* @param replaceText 要替换的字符串
* @param options 扩展选项
* @return {{replaced: boolean, content}}
*/
const findAndReplaceContent = (
content,
searchText,
replaceText,
options = {}
) => {
try {
let replaced = false;
if (content.includes(searchText) && !content.includes(replaceText)) {
content = content.replace(searchText,replaceText);
replaced = true;
}
return {
content,
replaced,
};
} catch (e) {
logger.error(e);
throw e;
}
};
const prefixName = chalk.black.bgKeyword('green')("[Mom CLI]");
module.exports = {
toolPrefixName: prefixName,
/**
* 对Vue-Loader进行注入
*/
injectVueLoader() {
const actionName = `${prefixName} Inject 'vue-loader' actions`;
try {
logger.info(`${actionName} running ...`);
const path = require.resolve("vue-loader");
const content = fs.readFileSync(path,"utf-8");
// eslint-disable-next-line no-template-curly-in-string
const searchText =
"component.options.__file = ${JSON.stringify(filename)}";
// eslint-disable-next-line no-template-curly-in-string
const replaceText =
"component.options.__file = ${JSON.stringify(rawShortFilePath.replace(/\\\\/g, '/'))}";
const { content: newContent,replaced } = findAndReplaceContent(
content,
searchText,
replaceText
);
if (replaced) {
fs.writeFileSync(path,newContent,"utf8");
}
logger.success(`${actionName} perform success ...`);
} catch (e) {
logger.error(e);
throw e;
}
},
/**
* 应用Vue的补丁
*/
applyVuePatch() {
const actionName = `${prefixName} Apply 'Vue' patch actions`;
try {
logger.info(`${actionName} running ...`);
const semver = require("semver");
const { version } = require("vue/package.json");
const majorV = semver.major(version);
const minorV = semver.minor(version);
if (majorV === 2 && minorV === 6) {
const patchRulesMap = require(`./patch.vue.${majorV}.${minorV}.js`);
const rules = patchRulesMap[version] || [];
if (rules.length < 1) {
logger.warn(
` ${actionName} \n`,
chalk.black.bgKeyword('yellow')(`✘▁▂▃▄ Found current Vue's version is ${version}, not match [${Object.keys(
patchRulesMap
).join(",")}], It can't apply the Vue patches.`)
);
return;
}
// for Vue 2 dist files
const distDir = path.join(
require.resolve("vue/package.json"),
"..",
"dist"
);
const fileNames = [
"common.dev.js",
"common.prod.js",
"esm.browser.js",
"esm.js",
"min.js",
"js",
]
.map((e) => ["vue","vue.runtime"].map((item) => `${item}.${e}`))
.flat();
fileNames.forEach((name) => {
const filePath = path.join(distDir,name);
if (!fs.existsSync(filePath)) return;
const replacedFlags = [];
let content = fs.readFileSync(filePath,"utf-8");
// important for all rules
rules.forEach((rule) => {
const { search,replace } = rule;
const searchCode = search.trim(),
replaceCode = replace.trim();
const { content: newContent,replaced } = findAndReplaceContent(
content,
searchCode,
replaceCode
);
if (replaced) {
content = newContent;
replacedFlags.push(replaced);
}
});
// If content had replaced. rewrite file
if (replacedFlags.some((e) => !!e)) {
fs.writeFileSync(filePath,content,"utf8");
}
});
logger.success(
`${actionName} perform success: `,
`${chalk.black.bgKeyword('orange')(`Vue@${version}'s patches has be applied`)} ...`
);
}
} catch (e) {
logger.error(e);
throw e;
}
},
/**
* 检查必备的工程文件
*/
checkProjectConfigAndSomeFiles: (workdir = process.cwd(),prefixName = "") => _checkProjectConfigAndSomeFiles(workdir,logger,prefixName),
};