Skip to content

Instantly share code, notes, and snippets.

@legend80s
Last active March 29, 2017 10:17
Show Gist options
  • Save legend80s/f9b9d9aad7947468294aa3b647ee2d9b to your computer and use it in GitHub Desktop.
Save legend80s/f9b9d9aad7947468294aa3b647ee2d9b to your computer and use it in GitHub Desktop.
Koa.js Boilerplate Generator for route, controller and model
/**
*
* @fileOverview create route/controller/model by CLI
*
* usage: `npm run generate module`
* `module` in the form of hyphen-separated
* three files will be generated:
*
* app/routes/module.js
* app/controllers/Module.js
* app/models/Module.js
* // and update routes/index.js
*/
const path = require('path');
const { writeFile } = require('fs');
const { upperFirst, camelCase } = require('lodash');
const updateRouteEntry = require('./update-route-entry.js');
const routePath = '../app/routes';
const controllerPath = '../app/controllers';
const modelPath = '../app/models';
const routeEntryPath = path.resolve(__dirname, '../app/routes/index.js');
/**
* Promised writeFile
* @param {String} path
* @param {String} content
* @return {Promise}
*/
function pWriteFile(filepath, content) {
return new Promise((resolve, reject) => {
writeFile(filepath, content, (err) => {
/* eslint-disable no-unused-expressions */
err ? reject(err) : resolve(filepath);
});
});
}
/**
* create route/controller/model
* @param {string} module
* @return {[Promise]}
*/
function create(module) {
const upperCamelCase = upperFirst(camelCase(module));
const upper = module.toUpperCase();
const route = `
const Router = require('koa-router');
const ${upperCamelCase}Controller = require('../controllers/${upperCamelCase}');
const router = new Router();
router.get('/${module}s/:id', ${upperCamelCase}Controller.details);
router.get('/${module}s', ${upperCamelCase}Controller.list);
module.exports = router;
`;
const controller = `
const ${upperCamelCase} = require('../models/${upperCamelCase}');
class ${upperCamelCase}Controller {
static * details() {
// yield Auth.checkPermission(this.session.user, acl.permissions.${upper}_DETAILS);
this.body = yield ${upperCamelCase}.details(this.params.id);
}
static * list() {
// yield Auth.checkPermission(this.session.user, acl.permissions.${upper}_LIST);
const { data, count } = yield ${upperCamelCase}.list(this.query);
this.set('X-Total-Count', count);
this.body = data;
}
}
module.exports = ${upperCamelCase}Controller;
`;
const model = `
class ${upperCamelCase} {
static details(id) {
return { id };
}
static list(filters) {
console.log('filters:', filters);
return { data: [{ id: 'scheduled-tasks' }], count: 1 };
}
}
module.exports = ${upperCamelCase};
`;
return [
pWriteFile(path.resolve(__dirname, routePath, `${module}.js`), route.trimLeft()),
pWriteFile(path.resolve(__dirname, controllerPath, `${upperCamelCase}.js`), controller.trimLeft()),
pWriteFile(path.resolve(__dirname, modelPath, `${upperCamelCase}.js`), model.trimLeft()),
];
}
/**
* main function
* @param {[string]} modules to create
* @return undefined
*/
function main(modules) {
const lowCasedModules = modules.map(m => m.toLowerCase());
// console.log('lowCasedModules:', lowCasedModules);
Promise.all(lowCasedModules.map(create).reduce((prev, cur) => prev.concat(cur), []))
.then((messages) => {
/* eslint-disable no-console */
console.log(messages.join('\n'));
updateRouteEntry(routeEntryPath, lowCasedModules, (err) => {
if (err) throw err;
console.log(`${routeEntryPath} updated!`);
});
})
.catch((error) => {
console.error(error);
});
}
main(process.argv.slice(2));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment