initialize components, routes, and services

This commit is contained in:
2020-07-08 18:54:19 -05:00
parent d212d3b36c
commit 69466406cd
13 changed files with 333 additions and 11 deletions

View File

@ -0,0 +1,92 @@
import {
SystemDef,
ViewDef
} from '../systemGenService';
import * as path from 'path';
import * as fs from 'fs';
const ncp = require('ncp').ncp;
export function createViews(systemDef: SystemDef) {
let viewsPromises = [];
for (let i in systemDef.views) {
viewsPromises.push(createComponent(systemDef.views[i], systemDef.name));
}
return Promise.all(viewsPromises);
}
function createComponent(view: ViewDef, outDir: string) {
let componentPromise = new Promise((componentResolve, componentReject) => {
ncp(path.join(process.cwd(), 'frame', 'src', 'components', '{{component}}'), path.join(process.cwd(), outDir, 'src', 'components', view.component), (err: any) => {
if (err) {
console.log(err);
} else {
let mapperPromise = initializeComponentFile(path.join(process.cwd(), outDir, 'src', 'components', view.component, '{{component}}Mapper.ets'), path.join(process.cwd(), outDir, 'src', 'components', view.component, `${view.component}Mapper.ts`), view.component, outDir);
let routesPromise = initializeComponentFile(path.join(process.cwd(), outDir, 'src', 'components', view.component, '{{component}}Routes.ets'), path.join(process.cwd(), outDir, 'src', 'components', view.component, `${view.component}Routes.ts`), view.component, outDir);
addInitializeRoutesCode(view.component, outDir);
let serviceFileLocation: string = path.join(process.cwd(), outDir, 'src', 'components', view.component, `${view.component}Service.ts`);
let servicePromise = initializeComponentFile(path.join(process.cwd(), outDir, 'src', 'components', view.component, '{{component}}Service.ets'), serviceFileLocation, view.component, outDir);
addInitializeServiceCode(view.component, outDir);
Promise.all([mapperPromise, routesPromise, servicePromise]).then(() => {
console.log(`success creating component ${view.component}`);
componentResolve();
});
}
});
});
return componentPromise;
}
function initializeComponentFile(sourceFile: string, destinationFile: string, component: string, outDir: string) {
let filePromise = new Promise((resolve, reject) => {
fs.rename(sourceFile, destinationFile, (err: any) => {
let fileContents = fs.readFileSync(destinationFile, 'utf8');
var uppercaseFirstLetterComponentName = uppercaseFirstLetter(component);
var lowercaseFirstLetterComponentName = lowercaseFirstLetter(component);
let newFileContents = fileContents.split('{{Component}}').join(uppercaseFirstLetterComponentName);
newFileContents = newFileContents.split('{{component}}').join(lowercaseFirstLetterComponentName);
fs.writeFileSync(destinationFile, newFileContents, 'utf8');
resolve();
});
});
return filePromise
}
function addInitializeServiceCode(component: string, outDir: string) {
let fileLocation = path.join(process.cwd(), outDir, 'src', 'initializeServices.ts');
let initServicesFile: string = fs.readFileSync(fileLocation, 'utf8');
let parts = initServicesFile.split('// SYSTEM-BUILDER-initialize-import');
parts[0] = parts[0] + `import { ${component}Service } from './components/${component}/${component}Service';
`;
let newServicesFile = parts.join('// SYSTEM-BUILDER-initialize-import');
parts = newServicesFile.split('// SYSTEM-BUILDER-initialize-service');
parts[0] = parts[0] + `${component}Service.initialize(),
`;
newServicesFile = parts.join(' // SYSTEM-BUILDER-initialize-service');
fs.writeFileSync(fileLocation, newServicesFile, 'utf8');
}
function addInitializeRoutesCode(component: string, outDir: string) {
let fileLocation = path.join(process.cwd(), outDir, 'src', 'app.ts');
let initRoutesFile: string = fs.readFileSync(fileLocation, 'utf8');
let parts = initRoutesFile.split('// SYSTEM-BUILDER-router.require');
parts[0] = parts[0] + `var ${component}Router = require('./components/${component}/${component}Routes');
`;
let newRoutesFile = parts.join('// SYSTEM-BUILDER-router.require');
parts = newRoutesFile.split('// SYSTEM-BUILDER-app.use');
parts[0] = parts[0] + `app.use('/api/v1/${component}', ${component}Router);
`;
newRoutesFile = parts.join('// SYSTEM-BUILDER-app.use');
fs.writeFileSync(fileLocation, newRoutesFile, 'utf8');
}
function uppercaseFirstLetter(input: string)
{
return input.charAt(0).toUpperCase() + input.slice(1);
}
function lowercaseFirstLetter(input: string)
{
return input.charAt(0).toLowerCase() + input.slice(1);
}