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