gamelet-cli
Version:
Download project from code.gamelet.com, edit/test in vscode and sync back to server.
337 lines • 23.8 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.isEmptyFolder = exports.copyFile = exports.rmdir = exports.getFileZip = exports.downloadFile = exports.renderTwig = exports.unlink = exports.vscodeLink = exports.saveData = exports.isGitCommitted = exports.fileSize = exports.fileStat = exports.moveFile = exports.fileExists = exports.listFiles = exports.getFileJson = exports.getFileString = exports.getFileData = exports.mkdir = exports.wait = exports.setFileCacheFolder = void 0;
const axios_1 = __importDefault(require("axios"));
const path_1 = __importDefault(require("path"));
const mkdirp_1 = __importDefault(require("mkdirp"));
const twig_1 = __importDefault(require("twig"));
const fs_1 = __importDefault(require("fs"));
const jszip_1 = __importDefault(require("jszip"));
const simple_git_1 = __importDefault(require("simple-git"));
const rimraf_1 = __importDefault(require("rimraf"));
const md5_file_1 = __importDefault(require("md5-file"));
const md5_1 = __importDefault(require("md5"));
// const { default: axios } = require("axios");
// const path = require("path");
// const mkdirp = require("mkdirp");
// const Twig = require("twig");
// const fs = require("fs");
// const JSZip = require("jszip");
// const simpleGit = require('simple-git');
// const rimraf = require("rimraf");
// const md5File = require("md5-file");
// const md5 = require('md5');
let fileCacheFolder;
exports.setFileCacheFolder = function (folder) {
fileCacheFolder = folder && `${folder}/.cg/cache`;
};
exports.wait = function (duration) {
return new Promise(resolve => {
setTimeout(resolve, duration);
});
};
exports.mkdir = function (filenameWithPath) {
if (!filenameWithPath.endsWith('/')) {
filenameWithPath = path_1.default.dirname(filenameWithPath);
}
return mkdirp_1.default(filenameWithPath);
};
exports.getFileData = function (filenameWithPath) {
return new Promise((resolve, reject) => {
fs_1.default.readFile(filenameWithPath, (err, data) => {
if (err) {
reject(err);
}
else {
resolve(data);
}
});
});
};
exports.getFileString = function (filenameWithPath, trimContent) {
return exports.getFileData(filenameWithPath)
.then(data => data.toString('utf8'))
.then(str => {
if (trimContent && str) {
str = str.trim();
}
return str;
});
};
exports.getFileJson = function (filenameWithPath, removeComments) {
return exports.getFileString(filenameWithPath)
.then(data => {
if (removeComments) {
data = data.replace(/(^|\n|\r)\s*?\/\/.*?(\n|\r|$)/gm, '');
}
return JSON.parse(data);
});
};
exports.listFiles = function (folderPath) {
return new Promise((resolve, reject) => {
if (fs_1.default.existsSync(folderPath)) {
fs_1.default.readdir(folderPath, (err, files) => {
if (err) {
reject(err);
}
else {
resolve(files);
}
});
}
else {
resolve([]);
}
});
};
exports.fileExists = function (filenameWithPath) {
return fs_1.default.existsSync(filenameWithPath);
};
exports.moveFile = function (filenameWithPath, destFilenameWithPath, retries = 2) {
return exports.mkdir(destFilenameWithPath)
.then(() => {
return new Promise((resolve, reject) => {
fs_1.default.rename(filenameWithPath, destFilenameWithPath, err => {
if (err) {
if (retries > 0) {
exports.wait(100)
.then(() => exports.moveFile(filenameWithPath, destFilenameWithPath, retries - 1))
.then(resolve)
.catch(reject);
}
else {
reject(err);
}
}
else {
resolve(1);
}
});
});
});
};
exports.fileStat = function (filenameWithPath) {
return new Promise((resolve, reject) => {
fs_1.default.stat(filenameWithPath, (err, stats) => {
if (err) {
reject(err);
}
else {
resolve(stats);
}
});
});
};
exports.fileSize = function (filenameWithPath) {
return exports.fileStat(filenameWithPath).then(state => state.size);
};
exports.isGitCommitted = function (folder) {
if (exports.fileExists(`${folder}/.git`)) {
let git = simple_git_1.default({
baseDir: folder,
binary: 'git',
maxConcurrentProcesses: 6,
});
return git.status()
.then(status => {
return status.files.length == 0;
});
}
else {
return Promise.resolve(true);
}
};
exports.saveData = function (filenameWithPath, data) {
return new Promise((resolve, reject) => {
exports.mkdir(filenameWithPath)
.then(() => {
fs_1.default.writeFile(filenameWithPath, data, err => {
if (err) {
console.error('saveData: writeFile error: ', err);
reject(err);
}
else {
// sometimes the file is locked right after writeFile
setTimeout(resolve, 300);
}
});
});
});
};
function checkCache(url, dest) {
if (exports.fileExists(dest)) {
let cacheFile = `${fileCacheFolder}/${md5_1.default(url.trim())}`;
if (exports.fileExists(cacheFile)) {
return exports.getFileString(cacheFile, true)
.then(cachemd5 => {
return md5_file_1.default(dest)
.then(filemd5 => {
return cachemd5 == filemd5;
});
})
.catch(_err => false);
}
}
return Promise.resolve(false);
}
function saveCache(url, dest) {
let cacheFile = `${fileCacheFolder}/${md5_1.default(url.trim())}`;
return md5_file_1.default(dest)
.then(filemd5 => {
return exports.saveData(cacheFile, filemd5);
});
}
function vscodeLink(link, message) {
if (link.startsWith('/')) {
link = link.substr(1);
}
let line = `vscode://file/${link}`;
if (message) {
line = `${message} ${link}`;
}
return line;
}
exports.vscodeLink = vscodeLink;
function unlink(filenameWithPath) {
return new Promise((resolve, reject) => {
fs_1.default.unlink(filenameWithPath, err => {
if (err && err.code != 'ENOENT') {
reject(err);
}
else {
resolve(true);
}
});
});
}
exports.unlink = unlink;
function renderTwig(twigFile, args) {
return new Promise((resolve, reject) => {
twig_1.default.renderFile(twigFile, args, (err, content) => {
if (err) {
reject(err);
}
else {
resolve(content);
}
});
});
}
exports.renderTwig = renderTwig;
/**
*
* @param {*} url
* @param {*} dest
* @param {*} progressBar
* @param {*} options {dispName: string, tempFile: string}
* @returns
*/
function downloadFile(url, dest, progressBar, options) {
options = options || {};
let axiosSource = axios_1.default.CancelToken.source();
return Promise.resolve()
.then(() => options.noCache ? false : checkCache(url, dest))
.then(result => {
if (result) {
return false;
}
return exports.mkdir(dest)
.then(() => options.tempFile && exports.mkdir(options.tempFile))
.then(() => axios_1.default.get(url, {
responseType: 'stream',
cancelToken: axiosSource.token,
}))
.then(response => {
if (response) {
if (progressBar) {
let contentSize = Number(response.headers['content-length']);
progressBar.start(contentSize, 0, { file: options.dispName || url });
response.data.on('data', chunk => progressBar.increment(chunk.length));
}
let writer = fs_1.default.createWriteStream(options.tempFile || dest);
response.data.pipe(writer);
return new Promise((resolve, reject) => {
writer.on('finish', resolve);
writer.on('error', reject);
})
.then(() => {
if (options.tempFile) {
return exports.moveFile(options.tempFile, dest);
}
else {
return Promise.resolve();
}
})
.then(() => {
if (options.modifyContent) {
return exports.getFileString(dest)
.then(content => options.modifyContent(content))
.then(content => exports.saveData(dest, content));
}
else {
return Promise.resolve();
}
})
.then(() => saveCache(url, dest))
.then(() => true);
}
else {
return Promise.reject('File failed to download: ' + url);
}
})
.catch(err => {
if (axios_1.default.isCancel(err)) {
// canceled
}
else {
throw err;
}
});
});
}
exports.downloadFile = downloadFile;
function getFileZip(filename) {
return exports.getFileData(filename)
.then(data => {
return new jszip_1.default().loadAsync(data);
});
}
exports.getFileZip = getFileZip;
function rmdir(folderPath) {
return new Promise((resolve, reject) => {
rimraf_1.default(folderPath, {}, err => {
if (err && err.code != 'ENOENT') {
reject(err);
}
else {
resolve(true);
}
});
});
}
exports.rmdir = rmdir;
function copyFile(filenameWithPath, destFilenameWithPath) {
return exports.mkdir(destFilenameWithPath)
.then(() => {
return new Promise((resolve, reject) => {
fs_1.default.copyFile(filenameWithPath, destFilenameWithPath, err => {
if (err) {
reject(err);
}
else {
resolve(true);
}
});
});
});
}
exports.copyFile = copyFile;
function isEmptyFolder(folderPath) {
return exports.listFiles(folderPath)
.then(list => !list.length);
}
exports.isEmptyFolder = isEmptyFolder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtEQUEwQjtBQUMxQixnREFBd0I7QUFDeEIsb0RBQTRCO0FBQzVCLGdEQUF3QjtBQUN4Qiw0Q0FBb0I7QUFDcEIsa0RBQTBCO0FBQzFCLDREQUFtQztBQUNuQyxvREFBNEI7QUFDNUIsd0RBQStCO0FBQy9CLDhDQUFzQjtBQUN0QiwrQ0FBK0M7QUFDL0MsZ0NBQWdDO0FBQ2hDLG9DQUFvQztBQUNwQyxnQ0FBZ0M7QUFDaEMsNEJBQTRCO0FBQzVCLGtDQUFrQztBQUNsQywyQ0FBMkM7QUFDM0Msb0NBQW9DO0FBQ3BDLHVDQUF1QztBQUN2Qyw4QkFBOEI7QUFFOUIsSUFBSSxlQUFlLENBQUM7QUFDUCxRQUFBLGtCQUFrQixHQUFHLFVBQVUsTUFBTTtJQUM5QyxlQUFlLEdBQUcsTUFBTSxJQUFJLEdBQUcsTUFBTSxZQUFZLENBQUM7QUFDdEQsQ0FBQyxDQUFBO0FBRVksUUFBQSxJQUFJLEdBQUcsVUFBVSxRQUFRO0lBQ2xDLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDekIsVUFBVSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNsQyxDQUFDLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQTtBQUVZLFFBQUEsS0FBSyxHQUFHLFVBQVUsZ0JBQWdCO0lBQzNDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDakMsZ0JBQWdCLEdBQUcsY0FBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0tBQ3JEO0lBQ0QsT0FBTyxnQkFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDcEMsQ0FBQyxDQUFBO0FBQ1ksUUFBQSxXQUFXLEdBQUcsVUFBVSxnQkFBZ0I7SUFDakQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFD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