UNPKG

gamelet-cli

Version:

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

350 lines 25 kB
"use strict"; 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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