packages/build-plugin-lowcode/src/compile/meta.js (83 lines of code) (raw):

/** 生成 lowcode 的入口文件(meta.js, view.js) */ const fs = require("fs-extra"); const path = require("path"); const babel = require("@babel/core"); const { getBabelConfig } = require("./babel"); const { glob } = require("glob"); const getAvailableFileName = ({ fileName, lowcodeDir, rootDir }) => { let finalName = fileName; while (true) { const files = glob.sync(`${finalName}.*`, { cwd: lowcodeDir, ignore: ["node_modules/**"], }); const fileHasExists = files.some((f) => { return /\.j|tsx?$/.test(f); }); if (fileHasExists) { finalName = `${finalName}_entry` } else { break; } } return finalName; }; module.exports = async ({ rootDir, tmpDir = ".tmp", lowcodeDir = "lowcode", userOptions, type = "react", package, }) => { const { babelPlugins = [], babelOptions = [], alias } = userOptions; const exportsData = { "./prototype": {}, "./prototypeView": {}, "./*": './*', }; const targetExportsMap = { 'lib': 'require', 'es': 'import', }; const fileNameEntryMap = { meta: './prototype', view: './prototypeView', }; ['lib', 'es'].forEach((target) => { const babelConfigOptions = { target, babelOptions, babelPlugins, type, alias, rootDir, }; const babelConfig = getBabelConfig(babelConfigOptions); ["meta", "view"].forEach((fileName) => { const filePath = path.join(rootDir, tmpDir, `${fileName}.js`); let fileContent = fs.readFileSync(filePath, "utf-8"); fileContent = fileContent .replace(new RegExp(path.join(rootDir, "lowcode"), "g"), ".") .replace(new RegExp(path.join(rootDir, "src"), "g"), `../${target}`) .replace(/\.ts(x)?('|")/g, "$2") .replace(/\\\\/g, "/"); const targetPath = `${lowcodeDir}_${target}`; if (!package.files.includes(`${targetPath}/`)) { package.files.push(`${targetPath}/`); } const entryName = getAvailableFileName({ fileName, lowcodeDir, rootDir }); exportsData[fileNameEntryMap[fileName]][targetExportsMap[target]] = `./${targetPath}/${entryName}.js`; const distFilePath = path.join(rootDir, targetPath, `${entryName}.js`); const { code } = babel.transformSync(fileContent, { filename: distFilePath, ...babelConfig, }); fs.ensureDirSync(path.dirname(distFilePath)); fs.writeFileSync(distFilePath, code, "utf-8"); }); }); package.exports = { ...package.exports, ...exportsData, }; };