express-21c
Version:
Express Module' application generator
121 lines (102 loc) • 3.18 kB
JavaScript
import path from 'path'
import fs from 'fs'
import readline from 'readline'
import mkdirp from 'mkdirp'
import minimatch from 'minimatch'
// ejs file render
import ejs from 'ejs'
// ESCAPE
import util from 'util'
const packageJSON = new URL('../package.json', import.meta.url)
const packageData = fs.readFileSync(packageJSON, 'utf-8')
const VERSION = JSON.parse(packageData).version
const MODE_0666 = parseInt('0666', 8)
const MODE_0755 = parseInt('0755', 8)
const tempURL = new URL('../templates', import.meta.url) // path.join("templates");
const TEMPLATE_DIR =
process.platform === 'win32'
? tempURL.pathname.substring(1)
: tempURL.pathname
// console confirm blocking input
const confirm = (msg, cb) => {
const keyInput = readline.createInterface({
input: process.stdin,
output: process.stdout,
})
keyInput.question(msg, (key) => {
keyInput.close()
cb(/^y|yes|ok|true$/i.test(key))
})
}
const mkdir = (base, dir) => {
const localDir = path.join(base, dir)
// Ansi Console Text
console.log(` \x1b[36mcreate\x1b[0m : ${localDir}${path.sep}`)
mkdirp.sync(localDir, MODE_0755)
}
// fileRead
const loadTemplate = (tempName) => {
const tempFile = path.join(TEMPLATE_DIR, tempName + '.ejs')
console.log(tempFile)
const contents = fs.readFileSync(tempFile, 'utf-8')
const locals = {} // Object.create(null);
const render = () => {
return ejs.render(contents, locals, {
escape: util.inspect,
})
}
return {
locals: locals,
render: render,
}
}
const fileWrite = (file, str, mode) => {
fs.writeFileSync(file, str, { mode: mode || MODE_0666 })
console.log(' \x1b[36mcreate\x1b[0m : ' + file)
}
const copyTemplate = (from, to) => {
fileWrite(to, fs.readFileSync(path.join(TEMPLATE_DIR, from), 'utf-8'))
}
// Copy multiple files from template directory.
const copyTemplateMulti = (fromDir, toDir, nameGlob) => {
fs.readdirSync(path.join(TEMPLATE_DIR, fromDir))
.filter(minimatch.filter(nameGlob, { matchBase: true }))
.forEach(function (name) {
copyTemplate(path.join(fromDir, name), path.join(toDir, name))
})
}
const finish = (dir, appName, app = null) => {
const launchedCmd =
process.platform === 'win32' && process.env._ === undefined
const prompt = launchedCmd ? '>' : '$'
if (dir !== '.') {
console.log()
console.log(' change directory:')
console.log(' %s cd %s', prompt, dir)
}
if (app?.locals.sequelizeModuesList.DB) {
console.log()
console.log(' set the database config:')
console.log(' %s edit ./%s/config/db_config.js', prompt, dir)
}
console.log()
console.log(' install dependencies:')
console.log(' %s npm install', prompt)
console.log()
console.log(' run the app:')
if (launchedCmd) {
console.log(' %s SET DEBUG=%s:* & npm start', prompt, appName)
} else {
console.log(' %s DEBUG=%s:* npm start', prompt, appName)
}
}
export {
VERSION,
confirm,
mkdir,
loadTemplate,
fileWrite,
copyTemplate,
copyTemplateMulti,
finish,
}