omelop
Version:
[](https://travis-ci.org/node-omelop/omelop)
253 lines • 18.6 kB
JavaScript
;
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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