ant-g
Version:
antDesignPro辅助代码生成器
155 lines (141 loc) • 5.31 kB
JavaScript
const BasicGenerator = require('../../BasicGenerator');
const chalk = require('chalk');
const fs = require('fs');
const path = require('path');
const inquirer = require('inquirer');
const {ejsGetGridColumn,
ejsGetMomentImport,
ejsGetAntImport,
ejsGetSearchFormItem,
ejsGetEditFormItem} = require('../../utils/ejs')
const { join } = path;
const _ = require('lodash');
const fuzzy = require('fuzzy');
inquirer.registerPrompt('autocomplete', require('inquirer-autocomplete-prompt'));
module.exports = class extends BasicGenerator {
initializing(){
this.checkDataStructure();
this.checkConfigFile();
}
_getPageConfigs=()=>{
const configPath = path.resolve(this.getProjectPath(),".g");
let ren= fs
.readdirSync(`${configPath}`)
.filter(f => !f.startsWith('.'))
.map(f => {
const fileName =path.resolve(configPath,`${f}`);
const configData = require(fileName);
const configOption = `${configData.dataSource}(${configData.title})`;
return `${f.padEnd(25)} -${chalk.grey(configOption)}`;
});
return ren;
}
_searchPageConfigs=(answers, input)=> {
input = input || '';
const pageConfigs= this._getPageConfigs();
return new Promise(function(resolve) {
setTimeout(function() {
var fuzzyResult = fuzzy.filter(input, pageConfigs);
resolve(
fuzzyResult.map(function(el) {
return el.original;
})
);
}, _.random(30, 500));
});
}
async prompting() {
const answers1 =
await inquirer.prompt([
{
type: 'autocomplete',
name: 'pageConfig',
message: 'Which pageConfig do you want to use ?',
source: this._searchPageConfigs,
},
{
type: 'confirm',
name: 'changeRoute',
message: 'are you want to change the route ?',
default: false,
},
]);
this.prompts = {
...answers1,
};
}
_getPageConfigData(){
const {pageConfig} = this.prompts;
const fileName = pageConfig.substr(0,pageConfig.indexOf('-')).trim();
const filePath = path.resolve(this.getProjectPath(),`.g/${fileName}`);
let pageConfigData = require(filePath);
const {dataSource} = pageConfigData;
const tables = this.getTablesMap();
pageConfigData={
...pageConfigData,
...tables[dataSource],
ejsGetGridColumn,
ejsGetMomentImport,
ejsGetAntImport,
ejsGetSearchFormItem,
ejsGetEditFormItem
}
return pageConfigData;
}
_writingSimple(pageConfigData){
const {dir} = pageConfigData.menu;
const srcPath = `src/pages/${dir}`;
const simplePath = path.resolve(__dirname,"templates/simple");
let files= fs
.readdirSync(simplePath)
.map(f => {
return f;
});
for(let i=0 ; i<files.length ;i=i+1){
const fileName = files[i];
this.fs.copyTpl(
this.templatePath(`simple/${fileName}`),
this.destinationPath(`${srcPath}/${fileName}`),
pageConfigData
);
if(fileName==='searchForm.tsx' || fileName==='dataTable.tsx' || fileName==='edit.tsx'){
this.prettierCode(`${srcPath}/${fileName}`)
}
}
}
writing() {
const pageConfigData = this._getPageConfigData();
if(pageConfigData['pageType']==='simple'){
this._writingSimple(pageConfigData);
this._changeRoute(pageConfigData);
this._changeMenu(pageConfigData);
}
}
_changeMenu(pageConfigData){
const {changeRoute} = this.prompts;
if(changeRoute) {
const {getNewMenuMsgCode} = require('../../utils/editjs/localeMsg');
const filePath = join(this.getProjectPath(), 'src/locales//zh-CN/menu.ts');
const {title,menu} = pageConfigData;
const newCode = getNewMenuMsgCode(filePath,`menu.${menu.name}`,title);
this.fs.write(filePath,newCode)
}
}
_changeRoute(pageConfigData){
const {changeRoute} = this.prompts;
if(changeRoute){
const {writeNewRoute} = require('../../utils/editjs/writeNewRoute');
const configPath = join(this.getProjectPath(),'config/config.ts');
if(fs.existsSync(configPath)){
const {path,name,dir} = pageConfigData.menu;
const newRoute ={
name,
icon: 'smile',
path: `/${path}`,
component: `./${dir}`,
};
writeNewRoute(newRoute,configPath,'');
}
}
}
};