UNPKG

@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
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), };