gamelet-cli
Version:
Download project from code.gamelet.com, edit/test in vscode and sync back to server.
276 lines • 21.6 kB
JavaScript
;
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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