gamelet-cli
Version:
Download project from code.gamelet.com, edit/test in vscode and sync back to server.
350 lines • 25 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
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;
exports.vscodeLink = vscodeLink;
exports.unlink = unlink;
exports.renderTwig = renderTwig;
exports.downloadFile = downloadFile;
exports.getFileZip = getFileZip;
exports.rmdir = rmdir;
exports.copyFile = copyFile;
exports.isEmptyFolder = isEmptyFolder;
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;
const setFileCacheFolder = function (folder) {
fileCacheFolder = folder && `${folder}/.cg/cache`;
};
exports.setFileCacheFolder = setFileCacheFolder;
const wait = function (duration) {
return new Promise(resolve => {
setTimeout(resolve, duration);
});
};
exports.wait = wait;
const mkdir = function (filenameWithPath) {
if (!filenameWithPath.endsWith('/')) {
filenameWithPath = path_1.default.dirname(filenameWithPath);
}
return (0, mkdirp_1.default)(filenameWithPath);
};
exports.mkdir = mkdir;
const getFileData = function (filenameWithPath) {
return new Promise((resolve, reject) => {
fs_1.default.readFile(filenameWithPath, (err, data) => {
if (err) {
reject(err);
}
else {
resolve(data);
}
});
});
};
exports.getFileData = getFileData;
const getFileString = function (filenameWithPath, trimContent) {
return (0, exports.getFileData)(filenameWithPath)
.then(data => data.toString('utf8'))
.then(str => {
if (trimContent && str) {
str = str.trim();
}
return str;
});
};
exports.getFileString = getFileString;
const getFileJson = function (filenameWithPath, removeComments) {
return (0, exports.getFileString)(filenameWithPath)
.then(data => {
if (removeComments) {
data = data.replace(/(^|\n|\r)\s*?\/\/.*?(\n|\r|$)/gm, '');
}
return JSON.parse(data);
});
};
exports.getFileJson = getFileJson;
const 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.listFiles = listFiles;
const fileExists = function (filenameWithPath) {
return fs_1.default.existsSync(filenameWithPath);
};
exports.fileExists = fileExists;
const moveFile = function (filenameWithPath, destFilenameWithPath, retries = 2) {
return (0, exports.mkdir)(destFilenameWithPath)
.then(() => {
return new Promise((resolve, reject) => {
fs_1.default.rename(filenameWithPath, destFilenameWithPath, err => {
if (err) {
if (retries > 0) {
(0, exports.wait)(100)
.then(() => (0, exports.moveFile)(filenameWithPath, destFilenameWithPath, retries - 1))
.then(resolve)
.catch(reject);
}
else {
reject(err);
}
}
else {
resolve(1);
}
});
});
});
};
exports.moveFile = moveFile;
const fileStat = function (filenameWithPath) {
return new Promise((resolve, reject) => {
fs_1.default.stat(filenameWithPath, (err, stats) => {
if (err) {
reject(err);
}
else {
resolve(stats);
}
});
});
};
exports.fileStat = fileStat;
const fileSize = function (filenameWithPath) {
return (0, exports.fileStat)(filenameWithPath).then(state => state.size);
};
exports.fileSize = fileSize;
const isGitCommitted = function (folder) {
if ((0, exports.fileExists)(`${folder}/.git`)) {
let git = (0, 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.isGitCommitted = isGitCommitted;
const saveData = function (filenameWithPath, data) {
return new Promise((resolve, reject) => {
(0, 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);
}
});
});
});
};
exports.saveData = saveData;
function checkCache(url, dest) {
if ((0, exports.fileExists)(dest)) {
let cacheFile = `${fileCacheFolder}/${(0, md5_1.default)(url.trim())}`;
if ((0, exports.fileExists)(cacheFile)) {
return (0, exports.getFileString)(cacheFile, true)
.then(cachemd5 => {
return (0, md5_file_1.default)(dest)
.then(filemd5 => {
return cachemd5 == filemd5;
});
})
.catch(_err => false);
}
}
return Promise.resolve(false);
}
function saveCache(url, dest) {
let cacheFile = `${fileCacheFolder}/${(0, md5_1.default)(url.trim())}`;
return (0, md5_file_1.default)(dest)
.then(filemd5 => {
return (0, 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;
}
function unlink(filenameWithPath) {
return new Promise((resolve, reject) => {
fs_1.default.unlink(filenameWithPath, err => {
if (err && err.code != 'ENOENT') {
reject(err);
}
else {
resolve(true);
}
});
});
}
function renderTwig(twigFile, args) {
return new Promise((resolve, reject) => {
twig_1.default.renderFile(twigFile, args, (err, content) => {
if (err) {
reject(err);
}
else {
resolve(content);
}
});
});
}
/**
*
* @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 (0, exports.mkdir)(dest)
.then(() => options.tempFile && (0, 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 (0, exports.moveFile)(options.tempFile, dest);
}
else {
return Promise.resolve();
}
})
.then(() => {
if (options.modifyContent) {
return (0, exports.getFileString)(dest)
.then(content => options.modifyContent(content))
.then(content => (0, 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;
}
});
});
}
function getFileZip(filename) {
return (0, exports.getFileData)(filename)
.then(data => {
return new jszip_1.default().loadAsync(data);
});
}
function rmdir(folderPath) {
return new Promise((resolve, reject) => {
(0, rimraf_1.default)(folderPath, {}, err => {
if (err && err.code != 'ENOENT') {
reject(err);
}
else {
resolve(true);
}
});
});
}
function copyFile(filenameWithPath, destFilenameWithPath) {
return (0, exports.mkdir)(destFilenameWithPath)
.then(() => {
return new Promise((resolve, reject) => {
fs_1.default.copyFile(filenameWithPath, destFilenameWithPath, err => {
if (err) {
reject(err);
}
else {
resolve(true);
}
});
});
});
}
function isEmptyFolder(folderPath) {
return (0, exports.listFiles)(folderPath)
.then(list => !list.length);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQXlMQSxnQ0FTQztBQUNELHdCQVVDO0FBQ0QsZ0NBVUM7QUFVRCxvQ0EyREM7QUFFRCxnQ0FLQztBQUVELHNCQVVDO0FBRUQsNEJBYUM7QUFDRCxzQ0FHQztBQW5VRCxrREFBMEI7QUFDMUIsZ0RBQXdCO0FBQ3hCLG9EQUE0QjtBQUM1QixnREFBd0I7QUFDeEIsNENBQW9CO0FBQ3BCLGtEQUEwQjtBQUMxQiw0REFBbUM7QUFDbkMsb0RBQTRCO0FBQzVCLHdEQUErQjtBQUMvQiw4Q0FBc0I7QUFDdEIsK0NBQStDO0FBQy9DLGdDQUFnQztBQUNoQyxvQ0FBb0M7QUFDcEMsZ0NBQWdDO0FBQ2hDLDRCQUE0QjtBQUM1QixrQ0FBa0M7QUFDbEMsMkNBQTJDO0FBQzNDLG9DQUFvQztBQUNwQyx1Q0FBdUM7QUFDdkMsOEJBQThCO0FBRTlCLElBQUksZUFBZSxDQUFDO0FBQ2IsTUFBTSxrQkFBa0IsR0FBRyxVQUFVLE1BQU07SUFDOUMsZUFBZSxHQUFHLE1BQU0sSUFBSSxHQUFHLE1BQU0sWUFBWSxDQUFDO0FBQ3RELENBQUMsQ0FBQTtBQUZZLFFBQUEsa0JBQWtCLHNCQUU5QjtBQUVNLE1BQU0sSUFBSSxHQUFHLFVBQVUsUUFBUTtJQUNsQyxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ3pCLFVBQVUsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbEMsQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUE7QUFKWSxRQUFBLElBQUksUUFJaEI7QUFFTSxNQUFNLEtBQUssR0FBRyxVQUFVLGdCQUFnQjtJQUMzQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbEMsZ0JBQWdCLEdBQUcsY0FBSSxDQUFDLE9BQU8sQ0FB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