UNPKG

gamelet-cli

Version:

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

337 lines 23.8 kB
"use strict"; 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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