import fs from 'fs'; import util from 'util'; import path from 'path'; async function generateRoute(routeName:string, upperName:string, lowerName:string){ try{ const generateArr = [ { fileName: upperName + "Service.ts", content: `import { Knex } from 'knex'; export class ${upperName}Service { constructor(private knex: Knex) {} async getUser(): Promise { return await this.knex.select('*').from('users'); } } ` }, { fileName: upperName + "Controller.ts", content: `import express from 'express'; import { ${upperName}Service } from './${upperName}Service'; export class ${upperName}Controller { constructor(private ${lowerName}Service: ${upperName}Service) {} login = async (req: express.Request, res: express.Response) => { try{ let user = await this.${lowerName}Service.getUser(); return res.status(200).json({ status: true, data: user }) } catch(err:any){ return res.status(200).json({ status: false }) } }; }` }, { fileName: upperName + "Route.ts", content: `import express from "express"; import { knex } from "../../server" import { ${upperName}Service } from './${upperName}Service'; import { ${upperName}Controller } from './${upperName}Controller'; const ${lowerName}Service = new ${upperName}Service(knex); const ${lowerName}Controller = new ${upperName}Controller(${lowerName}Service); export const ${lowerName}Router = express.Router(); ${lowerName}Router.get('/login', ${lowerName}Controller.login);` }] // Start of coding const existsDir = util.promisify(fs.exists); const mkdirSync = util.promisify(fs.mkdir); const dir = path.join(__dirname, "router", `${routeName}Route`); const currentDirExist = await existsDir(dir); if (!currentDirExist) { await mkdirSync(dir); console.log(`Directory ${routeName}Route Created.`); } for(let val of generateArr){ fs.writeFile( path.join(dir, val.fileName) , val.content, (err) => { if (err){ console.log(err); throw new Error(`Error while creating ${val.fileName}`); } console.log("\x1b[33m", val.fileName, "\x1b[0m", "written success."); }); } const routerFileDir = path.join(__dirname, 'router', 'router.ts'); fs.appendFileSync(routerFileDir, ` import { ${lowerName}Router } from './${lowerName}Route/${upperName}Route'; router.use("/${lowerName}", ${lowerName}Router); `); console.log("\x1b[34m", `${lowerName}Router`, "\x1b[0m", "success to add in router/route.ts."); } catch(err:any){ console.log(err); return; } } ( async () => { const inputArgs = process.argv.slice(2); if(inputArgs.length === 0){ throw new Error("Please input a name for your route. e.g. `ts-node routeBuilder.ts apple` OR `yarn gen apple`"); } const routeName = inputArgs[0].trim(); const upperName = routeName.charAt(0).toUpperCase() + routeName.slice(1); const lowerName = routeName.charAt(0).toLowerCase() + routeName.slice(1); generateRoute(routeName, upperName, lowerName) })()