UNPKG

omelop

Version:

[![Build Status](https://travis-ci.org/node-omelop/omelop.svg?branch=master)](https://travis-ci.org/node-omelop/omelop)

253 lines 18.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.emptyDirectory = void 0; const constants_1 = require("../utils/constants"); const utils_1 = require("../utils/utils"); const fs = require("fs"); const path = require("path"); const mkdirp = require("mkdirp"); function default_1(program) { program.command('init [path]') .description('create a new application') .action(function (path) { init(path || constants_1.CUR_DIR); }); } exports.default = default_1; /** * Get user's choice on connector selecting * * @param {Function} cb */ function connectorType(cb) { (0, utils_1.prompt)('Please select underly connector, 1 for websocket(native socket), 2 for socket.io, 3 for wss, 4 for socket.io(wss), 5 for udp, 6 for mqtt: [1]', function (msg) { console.log('selected', msg); switch (msg.trim()) { case '': cb(1); break; case '1': case '2': case '3': case '4': case '5': case '6': cb(msg.trim()); break; default: console.log('Invalid choice! Please input 1 - 5.'.red + '\n'); connectorType(cb); break; } }); } /** * Check if the given directory `path` is empty. * * @param {String} path * @param {Function} fn */ function emptyDirectory(path) { if (!fs.existsSync(path)) return true; let files = fs.readdirSync(path); return (!files || !files.length); } exports.emptyDirectory = emptyDirectory; /** * Init application at the given directory `path`. * * @param {String} path */ function init(path) { console.log(constants_1.INIT_PROJ_NOTICE); connectorType(function (type) { let empty = emptyDirectory(path); if (empty) { console.log('start createApplication'); selectClientEngine(path, type); } else { (0, utils_1.confirm)('Destination is not empty, continue? (y/n) [no] ', function (force) { if (force) { selectClientEngine(path, type); } else { (0, utils_1.abort)('Fail to init a project'.red); } }); } }); } /** * Mkdir -p. * * @param {String} path * @param {Function} fn */ function mkdir(path) { let err = mkdirp.sync(path, 0o755); console.log(' create : '.green + path); } /** * Copy template files to project. * * @param {String} origin * @param {String} target */ function copy(origin, target) { if (!fs.existsSync(origin)) { (0, utils_1.abort)(origin + 'does not exist.'); } if (!fs.existsSync(target)) { mkdir(target); console.log(' create : '.green + target); } let datalist = fs.readdirSync(origin); for (let i = 0; i < datalist.length; i++) { let oCurrent = path.resolve(origin, datalist[i]); let tCurrent = path.resolve(target, datalist[i]); if (fs.statSync(oCurrent).isFile()) { console.log(' create : '.green + tCurrent + ' from : ' + oCurrent); fs.writeFileSync(tCurrent, fs.readFileSync(oCurrent)); } else if (fs.statSync(oCurrent).isDirectory()) { copy(oCurrent, tCurrent); } } } function selectClientEngine(ph, type) { (0, utils_1.prompt)('Please select underly client engine, 1 for cocos, 2 for unity: [1]', (msg) => { let engine = ""; switch (msg.trim()) { case "": case "1": engine = "cocos"; break; case "2": engine = "unity"; break; default: console.log('Invalid choice! Please input 1 - 2.'.red + '\n'); selectClientEngine(ph, type); return; } process.stdin.destroy(); createApplicationAt(ph, type, engine); }); } /** * Create directory and files at the given directory `path`. * * @param {String} ph */ function createApplicationAt(ph, type, engine) { let name = path.basename(path.resolve(constants_1.CUR_DIR, ph)); // 拷贝后端 copy(path.join(__dirname, '../../../template/backend'), `${ph}/backend`); // 拷贝前端 copy(path.join(__dirname, `../../../template/frontend/${engine}`), `${ph}/frontend`); // rmdir -r let rmdir = function (dir) { let list = fs.readdirSync(dir); for (let i = 0; i < list.length; i++) { let filename = path.join(dir, list[i]); let stat = fs.statSync(filename); if (filename === '.' || filename === '..') { } else if (stat.isDirectory()) { rmdir(filename); } else { fs.unlinkSync(filename); } } fs.rmdirSync(dir); }; let unlinkFiles; switch (type) { case '1': // use websocket unlinkFiles = ['backend/app.ts.sio', 'backend/app.ts.wss', 'backend/app.ts.mqtt', 'backend/app.ts.sio.wss', 'backend/app.ts.udp']; for (let i = 0; i < unlinkFiles.length; ++i) { let f = path.resolve(ph, unlinkFiles[i]); console.log('delete : ' + f); fs.unlinkSync(f); } break; case '2': // use socket.io unlinkFiles = ['backend/app.ts', 'backend/app.ts.wss', 'backend/app.ts.udp', 'backend/app.ts.mqtt', 'backend/app.ts.sio.wss']; for (let i = 0; i < unlinkFiles.length; ++i) { fs.unlinkSync(path.resolve(ph, unlinkFiles[i])); } fs.renameSync(path.resolve(ph, 'backend/app.ts.sio'), path.resolve(ph, 'backend/app.ts')); break; case '3': // use websocket wss unlinkFiles = ['backend/app.ts.sio', 'backend/app.ts', 'backend/app.ts.udp', 'backend/app.ts.sio.wss', 'backend/app.ts.mqtt']; for (let i = 0; i < unlinkFiles.length; ++i) { fs.unlinkSync(path.resolve(ph, unlinkFiles[i])); } fs.renameSync(path.resolve(ph, 'backend/app.ts.wss'), path.resolve(ph, 'backend/app.ts')); break; case '4': // use socket.io wss unlinkFiles = ['backend/app.ts.sio', 'backend/app.ts', 'backend/app.ts.udp', 'backend/app.ts.wss', 'backend/app.ts.mqtt']; for (let i = 0; i < unlinkFiles.length; ++i) { fs.unlinkSync(path.resolve(ph, unlinkFiles[i])); } fs.renameSync(path.resolve(ph, 'backend/app.ts.sio.wss'), path.resolve(ph, 'backend/app.ts')); break; case '5': // use socket.io wss unlinkFiles = ['backend/app.ts.sio', 'backend/app.ts', 'backend/app.ts.wss', 'backend/app.ts.mqtt', 'backend/app.ts.sio.wss']; for (let i = 0; i < unlinkFiles.length; ++i) { fs.unlinkSync(path.resolve(ph, unlinkFiles[i])); } fs.renameSync(path.resolve(ph, 'backend/app.ts.udp'), path.resolve(ph, 'backend/app.ts')); break; case '6': // use socket.io unlinkFiles = ['backend/app.ts', 'backend/app.ts.wss', 'backend/app.ts.udp', 'backend/app.ts.sio', 'backend/app.ts.sio.wss']; for (let i = 0; i < unlinkFiles.length; ++i) { fs.unlinkSync(path.resolve(ph, unlinkFiles[i])); } fs.renameSync(path.resolve(ph, 'backend/app.ts.mqtt'), path.resolve(ph, 'backend/app.ts')); break; } let replaceFiles = ['backend/app.ts', 'backend/package.json']; for (let j = 0; j < replaceFiles.length; j++) { let str = fs.readFileSync(path.resolve(ph, replaceFiles[j])).toString(); fs.writeFileSync(path.resolve(ph, replaceFiles[j]), str.replace('$', name)); } let f = path.resolve(ph, 'backend/package.json'); let content = fs.readFileSync(f).toString(); fs.writeFileSync(f, content.replace('#', utils_1.version)); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2Jpbi9jb21tYW5kcy9pbml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGtEQUErRDtBQUMvRCwwQ0FBaUU7QUFDakUseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QixpQ0FBaUM7QUFHakMsbUJBQXlCLE9BQWdCO0lBQ3JDLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1NBQ3pCLFdBQVcsQ0FBQywwQkFBMEIsQ0FBQztTQUN2QyxNQUFNLENBQUMsVUFBVSxJQUFJO1FBQ2xCLElBQUksQ0FBQyxJQUFJLElBQUksbUJBQU8sQ0FBQyxDQUFDO0lBQzFCLENBQUMsQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQU5ELDRCQU1DO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsYUFBYSxDQUFDLEVBQVk7SUFDL0IsSUFBQSxjQUFNLEVBQUMsK0lBQStJLEVBQUUsVUFBVSxHQUFXO1FBQ3pLLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLFFBQVEsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2hCLEtBQUssRUFBRTtnQkFDSCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ04sTUFBTTtZQUNWLEtBQUssR0FBRyxDQUFDO1lBQ1QsS0FBSyxHQUFHLENBQUM7WUFDVCxLQUFLLEdBQUcsQ0FBQztZQUNULEtBQUssR0FBRyxDQUFDO1lBQ1QsS0FBSyxHQUFHLENBQUM7WUFDVCxLQUFLLEdBQUc7Z0JBQ0osRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNmLE1BQU07WUFDVjtnQkFDSSxPQUFPLENBQUMsR0FBRyxDQUFFLHFDQUE2QyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQztnQkFDdkUsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNsQixNQUFNO1NBQ2I7SUFDTCxDQUFDLENB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