春希 9f12b3c026 Merge branch 'feat/merge-rax-generator' into refactor/merge-rax-generator
* feat/merge-rax-generator: (80 commits)
  fix: fix test result
  fix: miniAppBuildType config(temp)
  fix: miss scope
  refactor: 💡 support scope info & use middleware style plugin
  chore: 🤖 fix lint error
  feat: 🎸 数据源的类型默认是 fetch
  fix: 🐛 根据低代码规范,数据源的配置中isInit和 type 都是有默认值的,所以应该是可选的
  feat: 🎸 与国凯的数据源引擎联调,对齐包名和导出方式
  feat: 🎸 与国凯的数据源保持一致,将 urlParams 所需的 search 参数直接传入
  feat: 🎸 按 826 对齐结论调整出码和数据源引擎
  test: 💍 为 Rax 出码的各个测试用例的添加注释描述
  chore: 🤖 recore 模板有问题,故暂且屏蔽掉
  fix: 🐛 Rax 出码到小程序, 事件处理函数绑定 JSExpression 时也不应该包裹一个 eval, 小程序会报错
  fix: 🐛 经验证发现小程序里面还是得包上 eval 否则 Rax 框架会误把 context 发送到渲染进程而出错
  feat: 🎸 为 Rax 出码增加对 i18n 的支持
  docs: ✏️ 根据春希的解释修改 generateAttr 中这块特殊处理的
  feat: 🎸 globalStyle 支持定制样式文件的后缀名
  docs: ✏️ 整理优化注释
  docs: ✏️ 去掉一些意见处理了的 TODO
  docs: ✏️ 补充对 transformThis2Context 的说明
  ...
2020-09-15 09:48:09 +08:00

199 lines
6.1 KiB
JavaScript

const fs = require('fs');
// ../lib 可以替换成 @ali/lowcode-code-generator
const CodeGenerator = require('../lib').default;
function flatFiles(rootName, dir) {
const dirRoot = rootName ? `${rootName}/${dir.name}` : dir.name;
const files = dir.files.map((file) => ({
name: `${dirRoot}/${file.name}.${file.ext}`,
content: file.content,
ext: '',
}));
const filesInSub = dir.dirs.map((subDir) => flatFiles(`${dirRoot}`, subDir));
const result = files.concat(...filesInSub);
return result;
}
function displayResultInConsole(root, fileName) {
const files = flatFiles('.', root);
files.forEach((file) => {
if (!fileName || fileName === file.name) {
console.log(`========== ${file.name} Start ==========`);
console.log(file.content);
console.log(`========== ${file.name} End ==========`);
}
});
}
async function writeResultToDisk(root, path) {
const publisher = CodeGenerator.publishers.disk();
return publisher.publish({
project: root,
outputPath: path,
projectSlug: 'demo-project',
createProjectFolder: true,
});
}
function getComponentsMap() {
const assetJson = fs.readFileSync('./demo/assets.json', { encoding: 'utf8' });
const assets = JSON.parse(assetJson);
const { components } = assets;
const componentsMap = components
.filter((c) => !!c.npm)
.map((c) => ({
componentName: c.componentName,
...(c.npm || {}),
}));
return componentsMap;
}
function main() {
const schemaJson = fs.readFileSync('./demo/sampleSchema.json', { encoding: 'utf8' });
const createIceJsProjectBuilder = CodeGenerator.solutions.icejs;
const builder = createIceJsProjectBuilder();
builder.generateProject(schemaJson).then((result) => {
displayResultInConsole(result);
writeResultToDisk(result, 'output/lowcodeDemo').then((response) => console.log('Write to disk: ', JSON.stringify(response)),);
return result;
});
}
function demo() {
const schemaJson = fs.readFileSync('./demo/schema.json', { encoding: 'utf8' });
const createIceJsProjectBuilder = CodeGenerator.solutions.icejs;
const builder = createIceJsProjectBuilder();
const componentsMap = getComponentsMap();
const root = JSON.parse(schemaJson);
const fullSchema = {
version: '1.0.0',
config: {
historyMode: 'hash',
targetRootID: 'J_Container',
},
meta: {
name: 'demoproject',
},
componentsTree: [root],
componentsMap,
};
builder.generateProject(fullSchema).then((result) => {
displayResultInConsole(result);
return result;
});
}
function demo() {
const schemaJson = fs.readFileSync('./demo/schema.json', { encoding: 'utf8' });
const createIceJsProjectBuilder = CodeGenerator.solutions.icejs;
const builder = createIceJsProjectBuilder();
const componentsMap = getComponentsMap();
const root = JSON.parse(schemaJson);
const fullSchema = {
version: '1.0.0',
config: {
historyMode: 'hash',
targetRootID: 'J_Container',
},
meta: {
name: 'demoproject',
},
componentsTree: [root],
componentsMap,
};
builder.generateProject(fullSchema).then((result) => {
displayResultInConsole(result);
return result;
});
}
function exportModule() {
const schemaJson = fs.readFileSync('./demo/shenmaSample.json', { encoding: 'utf8' });
const moduleBuilder = CodeGenerator.createModuleBuilder({
plugins: [
CodeGenerator.plugins.react.reactCommonDeps(),
CodeGenerator.plugins.common.esmodule({
fileType: 'jsx',
}),
CodeGenerator.plugins.react.containerClass(),
CodeGenerator.plugins.react.containerInitState(),
CodeGenerator.plugins.react.containerLifeCycle(),
CodeGenerator.plugins.react.containerMethod(),
CodeGenerator.plugins.react.jsx(),
CodeGenerator.plugins.style.css(),
],
postProcessors: [CodeGenerator.postprocessor.prettier()],
mainFileName: 'index',
});
moduleBuilder.generateModuleCode(schemaJson).then((result) => {
displayResultInConsole(result);
return result;
});
}
function exportProject() {
const schemaJson = fs.readFileSync('./demo/sampleSchema.json', { encoding: 'utf8' });
const builder = CodeGenerator.createProjectBuilder({
template: CodeGenerator.solutionParts.icejs.template,
plugins: {
components: [
CodeGenerator.plugins.react.reactCommonDeps(),
CodeGenerator.plugins.common.esmodule({
fileType: 'jsx',
}),
CodeGenerator.plugins.react.containerClass(),
CodeGenerator.plugins.react.containerInitState(),
CodeGenerator.plugins.react.containerLifeCycle(),
CodeGenerator.plugins.react.containerMethod(),
CodeGenerator.plugins.react.jsx(),
CodeGenerator.plugins.style.css(),
],
pages: [
CodeGenerator.plugins.react.reactCommonDeps(),
CodeGenerator.plugins.common.esmodule({
fileType: 'jsx',
}),
CodeGenerator.plugins.react.containerClass(),
CodeGenerator.plugins.react.containerInitState(),
CodeGenerator.plugins.react.containerLifeCycle(),
CodeGenerator.plugins.react.containerMethod(),
CodeGenerator.plugins.react.jsx(),
CodeGenerator.plugins.style.css(),
],
router: [CodeGenerator.plugins.common.esmodule(), CodeGenerator.solutionParts.icejs.plugins.router()],
entry: [CodeGenerator.solutionParts.icejs.plugins.entry()],
constants: [CodeGenerator.plugins.project.constants()],
utils: [CodeGenerator.plugins.common.esmodule(), CodeGenerator.plugins.project.utils()],
i18n: [CodeGenerator.plugins.project.i18n()],
globalStyle: [CodeGenerator.solutionParts.icejs.plugins.globalStyle()],
htmlEntry: [CodeGenerator.solutionParts.icejs.plugins.entryHtml()],
packageJSON: [CodeGenerator.solutionParts.icejs.plugins.packageJSON()],
},
postProcessors: [CodeGenerator.postprocessor.prettier()],
});
builder.generateProject(schemaJson).then((result) => {
displayResultInConsole(result);
writeResultToDisk(result, 'output/lowcodeDemo').then((response) => console.log('Write to disk: ', JSON.stringify(response)),);
return result;
});
}
// main();
// exportModule();
// exportProject();
demo();