UNPKG

@yuebai008/cli

Version:

Command line interface for rapid qg-minigame development

201 lines (192 loc) 8.62 kB
"use strict";var _Array$from = require("@babel/runtime-corejs2/core-js/array/from");var _Symbol = require("@babel/runtime-corejs2/core-js/symbol");var _Symbol$iterator = require("@babel/runtime-corejs2/core-js/symbol/iterator");var _Array$isArray = require("@babel/runtime-corejs2/core-js/array/is-array");function _createForOfIteratorHelper(r, e) {var t = "undefined" != typeof _Symbol && r[_Symbol$iterator] || r["@@iterator"];if (!t) {if (_Array$isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) {t && (r = t);var _n = 0,F = function F() {};return { s: F, n: function n() {return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] };}, e: function e(r) {throw r;}, f: F };}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");}var o,a = !0,u = !1;return { s: function s() {t = t.call(r);}, n: function n() {var r = t.next();return a = r.done, r;}, e: function e(r) {u = !0, o = r;}, f: function f() {try {a || null == t["return"] || t["return"]();} finally {if (u) throw o;}} };}function _unsupportedIterableToArray(r, a) {if (r) {if ("string" == typeof r) return _arrayLikeToArray(r, a);var t = {}.toString.call(r).slice(8, -1);return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? _Array$from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;}}function _arrayLikeToArray(r, a) {(null == a || a > r.length) && (a = r.length);for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];return n;} /** * author: * time: * describtion: fs适配层 */ var _require = require('../../cli-shared-utils'),warn = _require.warn; var fs = require('fs'); var $path = require('path'); // path <string> | <Buffer> | <URL> // options <Object> // recursive <boolean> 如果为 true,则执行递归的目录删除。在递归模式中,如果 path 不存在则不报告错误,并且在失败时重试操作。默认值: false。 // exclude <Regexp> 符合该正则的就不删除 // 在文件(而不是目录)上使用 fs.rmdirSync() 会导致在 Windows 上出现 ENOENT 错误、在 POSIX 上出现 ENOTDIR 错误。 // 稳定性 - 递归的删除是实验性的(因此不在生产环境中使用原来的参数,2而采用更兼容的方式) var _rmdirSync = function rmdirSync(path, options) { if (options && options.recursive) { var files = []; if (fs.existsSync(path)) { if (fs.statSync(path).isDirectory()) { files = fs.readdirSync(path);var _iterator = _createForOfIteratorHelper( files),_step;try {for (_iterator.s(); !(_step = _iterator.n()).done;) {var file = _step.value; var currentPath = $path.join(path, file); if (fs.statSync(currentPath).isDirectory()) { _rmdirSync(currentPath, options); } else { fs.unlinkSync(currentPath); } }} catch (err) {_iterator.e(err);} finally {_iterator.f();} } } } return fs.rmdirSync(path); }; // 拓展 // 将指定路径上的文件内容解析为json对象 var parse = function parse(path) { var json = fs.readFileSync(path); return JSON.parse(json) || {}; }; // 依赖 rmdirSync var _clearDir = function clearDir(path, options) { if (fs.existsSync(path)) { var files = []; if (fs.existsSync(path)) { files = fs.readdirSync(path);var _iterator2 = _createForOfIteratorHelper( files),_step2;try {for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {var file = _step2.value; var currentPath = $path.join(path, file); if (options && options.exclude && options.exclude.test(currentPath)) { console.log("\u4E0D\u5220\u9664".concat(currentPath)); continue; } if (fs.statSync(currentPath).isDirectory()) { _clearDir(currentPath, options); var currentFiles = []; currentFiles = fs.readdirSync(currentPath); if (!currentFiles.length) { fs.rmdirSync(currentPath); } } else { fs.unlinkSync(currentPath); } }} catch (err) {_iterator2.e(err);} finally {_iterator2.f();} } } else { if (options && options.build) { console.log("\u521B\u5EFA\u76EE\u5F55".concat(path)); fs.mkdirSync(path); } } }; var overwrite = function overwrite(src, dest, options) { if (options) { options.basePath = $path.normalize(src); } _overwriteFile(src, dest, options); }; // 覆盖指定的文件或者文件夹中同名的文件和文件夹(不会删除dest中存在但是src中不存在的文件和文件夹) var _overwriteFile = function overwriteFile(src, dest, options) { if (!fs.existsSync(src)) { console.log("\u4E0D\u5B58\u5728".concat(src)); return; } if (options && options.exclude) { var relativePath = $path.relative(options.basePath, $path.normalize(src)); if (options.basePath !== $path.normalize(src) && options.exclude.test(relativePath)) { console.log("".concat(src, "-x->").concat(dest)); return; } } if (fs.statSync(src).isDirectory()) { if (!fs.existsSync(dest)) { fs.mkdirSync(dest); } var files = []; files = fs.readdirSync(src);var _iterator3 = _createForOfIteratorHelper( files),_step3;try {for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {var file = _step3.value; if (options && options.exclude && options.exclude.test(file)) { continue; } _overwriteFile($path.join(src, file), $path.join(dest, file), options); }} catch (err) {_iterator3.e(err);} finally {_iterator3.f();} } else { var directory = $path.dirname(dest); fs.mkdirSync(directory, { recursive: true }); // 默认情况下,如果 dest 已经存在,则覆盖它。 fs.copyFileSync(src, dest); } return true; }; /** * 遍历目录文件 同步方法 * @param dir * @param files 收集的文件列表 */ var _traverseDirSync = function traverseDirSync(dir, files, options) { var st = fs.statSync(dir); if (st && st.isFile()) { files.push(dir); return; } var list = fs.readdirSync(dir); list.forEach(function (file) { var isExclude = options && options.exclude && options.exclude.test(file); if (!isExclude) { file = $path.join(dir, file); var stat = fs.statSync(file); if (stat && stat.isDirectory()) { _traverseDirSync(file, files, options); } else { if (options && options.include) { if (options.include.test(file)) { files.push(file); } return; } files.push(file); } } }); }; /** * 替换文件夹中文件的字符串 * @param {*} dir 文件夹 * @param {*} options {include: 需要替换的文件, exclude: 需要排除的文件或文件夹,map: 需要替换的字符串, to:需要替换成该字符串} * options: replaceFrom:map找到字符串,其中需要被替换的字符串,replaceTo:其中需要替换成的字符串 * @returns */ var replaceFiles = function replaceFiles(dir, options) { if (!fs.existsSync(dir)) { console.log("\u4E0D\u5B58\u5728".concat(dir)); return; } if (!options || !options.map) { console.log("options\u6216map\u3001to\u4E3A\u7A7A\uFF0C".concat(options)); return; } var files = []; _traverseDirSync(dir, files, options); // console.log(files) for (var _i = 0, _files = files; _i < _files.length; _i++) {var file = _files[_i]; var content = fs.readFileSync(file, { encoding: 'utf-8' }); var regexp = new RegExp(options.map, 'g'); if (content && options.map.test(content)) { if (options.replaceFrom && options.replaceTo) { warn(">>>> ".concat(file, " replaceTo ").concat(options.replaceTo)); var match; while ((match = regexp.exec(content)) !== null) { var replaceStr = match[0].replace(options.replaceFrom, options.replaceTo); content = content.replace(match[0], replaceStr); } fs.writeFileSync(file, content); } else if (options.to) { warn(">>>> ".concat(file, " replaceTo ").concat(options.to)); content = content.replace(regexp, options.to); fs.writeFileSync(file, content); } } } return true; }; var fsExt = { clearDir: _clearDir, parse: parse, overwrite: overwrite }; module.exports = { rmdirSync: _rmdirSync, replaceFiles: replaceFiles, fsExt: fsExt };