UNPKG

gamelet-cli

Version:

Download project from code.gamelet.com, edit/test in vscode and sync back to server.

277 lines 21.1 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.prepare = void 0; const file_1 = require("../utils/file"); const inquirer_1 = __importDefault(require("inquirer")); const sourcesHandlerCandidates = ['overwrite', 'merge', 'skip']; function prepare({ command, tokenFile = null, folder = null, sourceHandler = null, debug = false }) { if (debug) { console.log('debug = true'); } let result = { token: null, projectCode: null, folder: null, sourceHandler: 'download', }; if (sourcesHandlerCandidates.includes(sourceHandler)) { result.sourceHandler = sourceHandler; } let cwd = process.cwd(); if (cwd.match(/\/$/)) { cwd = cwd.substring(0, cwd.length - 1); } if (folder && folder.match(/\/$/)) { folder = folder.substr(0, folder.length - 1); } if (folder) { result.folder = folder = `${cwd}/${folder}`; } return Promise.resolve() .then(() => { let packageFolder = folder ? `${result.folder}` : cwd; let packageJsonFile = `${packageFolder}/package.json`; if (file_1.fileExists(packageJsonFile)) { if (tokenFile) { return Promise.reject('Cannot create a project inside a project folder.'); } return file_1.getFileJson(packageJsonFile) .then(projectJson => { result.projectCode = projectJson.name.toLowerCase(); return findCgProjectTokenFile(packageFolder, result.projectCode) .then(tokenFile => { if (tokenFile) { return file_1.getFileString(tokenFile, true) .then(token => { let arr = token.split('|'); if (arr && arr.length == 3) { if (arr[0].toLowerCase() != result.projectCode) { return Promise.reject('Invalid token file (project does not match'); } result.token = token; result.folder = packageFolder; if (sourcesHandlerCandidates.includes(sourceHandler)) { result.sourceHandler = sourceHandler; } else { return inquirer_1.default.prompt([ { type: 'list', name: 'confirm', message: 'What do you want to do with the sources(src/*)?', choices: [ 'Do NOT touch the sources', 'Overwrite', 'Merge', ], } ]) .then(choice => { if (choice.confirm == 'Overwrite') { result.sourceHandler = 'overwrite'; } else if (choice.confirm == 'Merge') { result.sourceHandler = 'merge'; } else { result.sourceHandler = 'skip'; } }); } } else { return Promise.reject('Invalid token file'); } }); } else { return Promise.reject('package name does not match project code.'); } }); }); } else { if (tokenFile) { if (!file_1.fileExists(tokenFile)) { tokenFile = `${cwd}/${tokenFile}`; } if (file_1.fileExists(tokenFile)) { return file_1.getFileString(tokenFile, true) .then(token => { let arr = token.split('|'); if (arr && arr.length == 3) { result.projectCode = arr[0]; result.token = token; } else { return Promise.reject('Invalid token file'); } return Promise.resolve(); }); } else { return Promise.reject('Cannot find the token file.'); } } else if (command == 'download' || command == 'merge') { return chooseATokenFile(cwd, folder) .then(tokenFile => { if (file_1.fileExists(tokenFile)) { return file_1.getFileString(tokenFile, true) .then(token => { let arr = token.split('|'); if (arr && arr.length == 3) { result.projectCode = arr[0]; result.token = token; } else { return Promise.reject('Invalid token file'); } return Promise.resolve(); }); } else { return Promise.reject('Cannot find the token file.'); } }); } else { return Promise.reject('No token exists in the workspace.'); } } }) .then(() => { if (!result.folder && result.projectCode) { folder = `${cwd}/${result.projectCode}`; return file_1.isEmptyFolder(folder) .then(empty => { if (!empty) { return Promise.reject('The target directory is not empty.'); } else { result.folder = folder; } return Promise.resolve(); }); } else { return Promise.resolve(); } }) .then(() => result) .catch(err => { console.error(err); return null; }); } exports.prepare = prepare; function findCgProjectTokenFile(folder, projectCode) { if (folder) { let path = `${folder}/.cg`; return file_1.listFiles(path) .then(files => findCgProjectTokenFileInFiles(path, files, projectCode)) .then(tokenFile => { if (tokenFile) { return tokenFile; } else { path = `${folder}`; return file_1.listFiles(path) .then(files => findCgProjectTokenFileInFiles(path, files, projectCode)); } }); } else { return Promise.resolve(null); } } function findCgProjectTokenFileInFiles(path, files, projectCode) { if (files.length) { let lowerPcode = projectCode.toLowerCase(); let fileIndex = files.findIndex(f => f == `${lowerPcode}.token`); let file = null; if (fileIndex == -1) { file = files.shift(); } else { file = files[fileIndex]; files.splice(fileIndex, 1); } if (file.toLowerCase().endsWith('.token')) { let tokenFile = `${path}/${file}`; return file_1.getFileString(tokenFile, true) .then(token => { let arr = token.split('|'); if (arr && arr.length == 3 && projectCode == arr[0].toLowerCase()) { return tokenFile; } else { return findCgProjectTokenFileInFiles(path, files, projectCode); } }); } else { return findCgProjectTokenFileInFiles(path, files, projectCode); } } else { return Promise.resolve(null); } } function findCgTokenFile(folder) { if (folder) { return file_1.listFiles(`${folder}/.cg`) .then(files => { let file = files.find(file => file.endsWith('.token')); return file && `${folder}/.cg/${file}`; }); } else { return Promise.resolve(null); } } function chooseATokenFile(cwd, folder) { return findCgTokenFile(folder) .then(tokenFile => { if (tokenFile) { return tokenFile; } else { return file_1.listFiles(cwd) .then(files => { files = files.filter(file => file.match(/\.token$/)); console.log(''); return inquirer_1.default.prompt([ { type: 'list', name: 'file', message: 'Select a token to install:', choices: ['[enter the token file myself]'].concat(files) } ]); }) .then(choice => { if (choice.file.startsWith('[')) { return inquirer_1.default.prompt([ { type: 'input', name: 'file', message: 'Enter the filename of the token:', } ]) .then(input => input.file); } else { return choice.file; } }) .then(file => { return `${cwd}/${file}`; }); } }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlcGFyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nYW1lbGV0L3ByZXBhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsd0NBQWlHO0FBQ2pHLHdEQUFnQztBQUVoQyxNQUFNLHdCQUF3QixHQUFHLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztBQVdoRSxTQUFnQixPQUFPLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxHQUFHLElBQUksRUFBRSxNQUFNLEdBQUcsSUFBSSxFQUFFLGFBQWEsR0FBRyxJQUFJLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBRTtJQUNyRyxJQUFJLEtBQUssRUFBRTtRQUNQLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7S0FDL0I7SUFFRCxJQUFJLE1BQU0sR0FBbUI7UUFDekIsS0FBSyxFQUFFLElBQUk7UUFDWCxXQUFXLEVBQUUsSUFBSTtRQUNqQixNQUFNLEVBQUUsSUFBSTtRQUNaLGFBQWEsRUFBRSxVQUFVO0tBQzVCLENBQUE7SUFDRCxJQUFJLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRTtRQUNsRCxNQUFNLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztLQUN4QztJQUVELElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN4QixJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDbEIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDMUM7SUFDRCxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQy9CLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENB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