Last active
March 29, 2017 10:17
-
-
Save legend80s/f9b9d9aad7947468294aa3b647ee2d9b to your computer and use it in GitHub Desktop.
Koa.js Boilerplate Generator for route, controller and model
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* | |
* @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