UNPKG

gamelet-cli

Version:

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

276 lines 21.6 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 = prepare; 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 ((0, file_1.fileExists)(packageJsonFile)) { if (tokenFile) { return Promise.reject('Cannot create a project inside a project folder.'); } return (0, file_1.getFileJson)(packageJsonFile) .then(projectJson => { result.projectCode = projectJson.name.toLowerCase(); return findCgProjectTokenFile(packageFolder, result.projectCode) .then(tokenFile => { if (tokenFile) { return (0, 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 (!(0, file_1.fileExists)(tokenFile)) { tokenFile = `${cwd}/${tokenFile}`; } if ((0, file_1.fileExists)(tokenFile)) { return (0, 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 ((0, file_1.fileExists)(tokenFile)) { return (0, 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 (0, 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; }); } function findCgProjectTokenFile(folder, projectCode) { if (folder) { let path = `${folder}/.cg`; return (0, file_1.listFiles)(path) .then(files => findCgProjectTokenFileInFiles(path, files, projectCode)) .then(tokenFile => { if (tokenFile) { return tokenFile; } else { path = `${folder}`; return (0, 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 (0, 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 (0, 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 (0, 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlcGFyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nYW1lbGV0L3ByZXBhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFjQSwwQkFxSkM7QUFuS0Qsd0NBQWlHO0FBQ2pHLHdEQUFnQztBQUVoQyxNQUFNLHdCQUF3QixHQUFHLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztBQVdoRSxTQUFnQixPQUFPLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxHQUFHLElBQUksRUFBRSxNQUFNLEdBQUcsSUFBSSxFQUFFLGFBQWEsR0FBRyxJQUFJLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBRTtJQUNyRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBSSxNQUFNLEdBQW1CO1FBQ3pCLEtBQUssRUFBRSxJQUFJO1FBQ1gsV0FBVyxFQUFFLElBQUk7UUFDakIsTUFBTSxFQUFFLElBQUk7UUFDWixhQUFhLEVBQUUsVUFBVTtLQUM1QixDQUFBO0lBQ0QsSUFBSSx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUNuRCxNQUFNLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ25CLEdBQUcsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFDRCxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEMsTUFBTSxHQUFHLE1BQU0s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