UNPKG

gcl

Version:

码农村nodejs类库,完成解决回调陷阱,配置框架,IOC框架,统一多DB访问框架,可扩展日志框架和io/db/net/thread/pool 克隆表达式,加解密算法等等一系列基础类库和算法的实现

1,602 lines (1,461 loc) 61.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SNOWID = exports.GUID = exports.xml = exports.decodeEmoji = exports.encodeEmoji = exports.applyCAE = exports.include = exports.SHA1PRNG = exports.xdcrypt_a1e = exports.xcrypt_a1e = exports.xdcryptiv = exports.xcryptiv = exports.xdcrypt = exports.xcrypt = exports.xverify = exports.xsign = exports.xhmac = exports.xhash = exports.md5 = exports.create = exports.create2 = exports.inherits = exports.merge = exports.getType = exports.toTJson = exports.json = exports.toJsonString = exports.decHtml = exports.encHtml = exports.formatPrice = exports.hash2 = exports.hash = exports.hashRandom = exports.random = exports.callback = exports.callback2 = exports.tnext = exports.next = exports.finalC = exports.forC = exports.each = exports.whileC = exports.once = exports.isArray = exports.watch = exports.tryC2 = exports.tryC = exports.tryF = exports.showEx = exports.showException = exports.sb = exports.format = exports.pris = exports.getValue = exports.isValid = exports.desc = exports.link = exports.prop = exports.environment = undefined; var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck"); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require("babel-runtime/helpers/createClass"); var _createClass3 = _interopRequireDefault(_createClass2); var _toConsumableArray2 = require("babel-runtime/helpers/toConsumableArray"); var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2); var _stringify = require("babel-runtime/core-js/json/stringify"); var _stringify2 = _interopRequireDefault(_stringify); var _regenerator = require("babel-runtime/regenerator"); var _regenerator2 = _interopRequireDefault(_regenerator); var _typeof2 = require("babel-runtime/helpers/typeof"); var _typeof3 = _interopRequireDefault(_typeof2); var _apply = require("babel-runtime/core-js/reflect/apply"); var _apply2 = _interopRequireDefault(_apply); var _asyncToGenerator2 = require("babel-runtime/helpers/asyncToGenerator"); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); var _promise = require("babel-runtime/core-js/promise"); var _promise2 = _interopRequireDefault(_promise); var _symbol = require("babel-runtime/core-js/symbol"); var _symbol2 = _interopRequireDefault(_symbol); var _util = require("util"); var _util2 = _interopRequireDefault(_util); var _path = require("path"); var _crypto = require("crypto"); var _v = require("uuid/v4"); var _v2 = _interopRequireDefault(_v); var _snowflakeId = require("snowflake-id"); var _snowflakeId2 = _interopRequireDefault(_snowflakeId); var _decimal = require("decimal.js"); var _decimal2 = _interopRequireDefault(_decimal); var _fastXmlParser = require("fast-xml-parser"); var _fastXmlParser2 = _interopRequireDefault(_fastXmlParser); var _he = require("he"); var _he2 = _interopRequireDefault(_he); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /* 减少语句路径 少用pop,push 改为i++--操作和[length]=new 频繁new的对象改为inherit2方法 尽管inherit2方法无法私有对象 多用三元?少用if 多用空方法 少用if 除非必须 少用delete 使用 || 代替 getValue 或者3元 使用for if(i++>1) 判断是否为空 使用substr lastIndexOf 代替split 尽量使用原生方法(native)代替自己的方法 */ var environment = exports.environment = { os: process.cwd().indexOf("\\") >= 0 ? "windows" : "linux/unix", splitChar: process.cwd().indexOf("\\") >= 0 ? "\\" : "/" }; /** * 采用代理模式给类和类内方法添加属性 * @param(调用时的原方法对象,键值,键值上的一个新值) * @returns decorator */ var prop = exports.prop = function prop(target, k, v) { target[k] = target[k] || []; target[k].push(v); }; /** * 添加link属性用于连接方法需求 * @param (link) */ var link = exports.link = function link(url) { return function (target) { return prop(target, "link", url); }; }; /** * 添加多个desc属性用于动态显示方法描述 * @param (desc) */ var desc = exports.desc = function desc(des) { return function (target) { return prop(target, "desc", des); }; }; /** * 判断对象是否有效 含有 not in (null,undefined,'null','',\s+,0,false) */ var isValid = exports.isValid = function isValid(data) { return !!data && (data.replace == undefined || data.replace(/\s/g, "").length > 0); }; /** * 三元表达式,简化 多数情况可以用默认值或者 value || defaultValue 替换,但是当其为null时则不好判断 */ var getValue = exports.getValue = function getValue(data, defaultData) { return isValid(data) ? data : defaultData; }; /** * 私有方法,返回_,__命名的一个自身对象和一个私有对象。一般在类方法第一句使用 * @param(this,__) * @return({this,private}) */ var pris = exports.pris = function pris() { var key = (0, _symbol2.default)("private"); return function (obj, priv) { obj[key] = (priv ? merge(obj[key], priv) : obj[key]) || {}; return { _: obj, __: obj[key] }; }; }; /** * 字符串格式化,使用<%k.v%>,{k.v}等等方式进行递进的属性替换,当字符串模板不可用时使用。 */ var format = exports.format = function format(s, o) { if (!s || !o) { return getValue(s, ""); } if (s.indexOf("<%=") >= 0) return __.funrep(s, o, /<%=[^(%>)]+%>/gi, /<%=/g, /%>/g); if (s.indexOf("{") >= 0) return __.funrep(s, o, /\{[^(})]+\}/gi, /\{/g, /\}/g); return s; }; /** * 返回私有StringBuilder对象实例,含有 */ var sb = exports.sb = function sb() { return new __.StringBuilder(); }; var showException = exports.showException = function showException() { var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var e = arguments[1]; if (isValid(e)) { name += "\r\nmessage:" + getValue(e.message, e) + (e.stack ? "\r\nstack:" + e.stack + (e.fileName ? "\r\nfile:" + e.fileName : "") + (e.lineNumber ? "\r\nlineNumber:" + e.lineNumber : "") : e.description ? "\r\ndescription:" + e.description : ""); console.log(name); } }; var _showEx = showException; exports.showEx = _showEx; var tryF = exports.tryF = function tryF(func, errcall) { return new Proxy(func, __.tryHandle(errcall)); }; var tryC = exports.tryC = function tryC(func, errcall) { return tryF(func, errcall)(); }; var tryC2 = exports.tryC2 = function tryC2(err, func, errcall) { return err ? (errcall || __.showEx)(e) : tryC(func, errcall); }; var watch = exports.watch = function watch(restart) { if (!__.start || restart) { __.start = new Date(); console.log("VESH.watch开始" + __.start); } else { console.log("VESH.watch 持续了:" + __.start.diff("ms", new Date())); } }; var isArray = exports.isArray = _util2.default.isArray; var once = exports.once = function once(func, timeout) { timeout = timeout || 1; if (func.timeoutID) { clearTimeout(func.timeoutID); } if (timeout == 1) process.nextTick(function () { return tryC(func); });else func.timeoutID = setTimeout(function () { return tryC(func); }, timeout); }; //exp的非链式操作与链式操作,非链式不保证执行顺序,链式保证执行顺序,对象的随机并发操作与顺序执行,数组的map随机并发操作与顺序执行 //使用once满足非promise截止的请求,循环全部是promise截止的r //根据执行的源头不同分为 whileC(链式、非链式,promise),forC(链式、非链式,promise),each(链式、非链式,promise),next(链式 promise),finalC(非链式 promise) 不同种类 根据链式与非链式, //保证异步的同步执行 //保证当直接返回true或者call(null,true)时中断循环 var whileC = exports.whileC = function whileC(exp, func) { var isSequ = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; return isSequ ? isSequ > 1 ? __.disorderlWhile(exp, func, isSequ) : __.sequfunc(exp, func, exp()) : __.disorderfunc(exp, func, exp()); }; var each = exports.each = function each(data, func) { var isSequ = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; return isSequ ? isSequ > 1 ? __.disorderlEach(data, func, isSequ) : __.sequEach(data, func) : __.disorderEach(data, func); }; var forC = exports.forC = function forC(obj, func) { var isSequ = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; return isSequ ? isSequ > 1 ? __.disorderlFor(obj, func, isSequ) : __.sequFor(obj, func) : __.disorderFor(obj, func); }; var finalC = exports.finalC = function finalC() { for (var _len = arguments.length, funs = Array(_len), _key = 0; _key < _len; _key++) { funs[_key] = arguments[_key]; } var data = {}, finalF = funs.pop(); return each(funs, function (v) { return callback2(v, null, data); }).then(function () { return callback2(finalF, null, data); }); }; var next = exports.next = function next() { for (var _len2 = arguments.length, funs = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { funs[_key2] = arguments[_key2]; } var data = {}; return each(funs, function (v) { return callback2(v, null, data); }, true); }; /** * 用于链式处理事务 参数为成对定义的正向和回滚方法{go:func,rollback:func} 也可简写为 {g:func,r:func} */ var tnext = exports.tnext = function tnext() { for (var _len3 = arguments.length, funs = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { funs[_key3] = arguments[_key3]; } var i = 1; var data = {}, goerr = function goerr() { throw new Error("请在第" + i + "个对象定义g或者go方法"); }, rollbacks = []; return each(funs, function (v) { return callback2(v.g || v.go || goerr, v, data).then(function (v2) { rollbacks.unshift(v.r || v.rollback || function () { throw new Error("请在第" + i + "个对象定义r或者rollback方法"); }()); i++; return v2; }).catch(function (e2) { if (typeof e2 === "string" || typeof e2 === "boolean") rollbacks.unshift(v.r || v.rollback || function () { throw new Error("请在第" + i + "个对象定义r或者rollback方法"); }()); throw typeof e2 === "string" ? new Error(e2) : e2; }); }, true).catch(function (e) { return next.apply(undefined, rollbacks).then(function () { throw e; }); }); }; /** * 异步改同步请求 * 兼容直接返回值,返回一个Promise或者返回undefined 最后一个参数调用call(e,data) 三种情况 * @param {*} args */ var callback2 = exports.callback2 = function callback2() { var _this2 = this; for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { args[_key4] = arguments[_key4]; } return new _promise2.default(function () { var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(re, rj) { var call, func, _this, paras, data; return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.prev = 0; call = function call(e, data) { return e ? rj(e) : re(data); }; func = args[0]; _this = args[1] || null; paras = args.slice(2).concat([call]); data = (0, _apply2.default)(func, _this, paras); //this 不对 Reflect.apply(func, null, paras); if (!(data && data.then)) { _context.next = 13; break; } _context.next = 9; return data; case 9: _context.t0 = _context.sent; if (_context.t0) { _context.next = 12; break; } _context.t0 = false; case 12: data = _context.t0; case 13: _context.t1 = typeof data === "undefined" ? "undefined" : (0, _typeof3.default)(data); _context.next = _context.t1 === "function" ? 16 : _context.t1 === "undefined" ? 17 : 18; break; case 16: data(call); case 17: return _context.abrupt("break", 20); case 18: call(null, data); return _context.abrupt("break", 20); case 20: _context.next = 25; break; case 22: _context.prev = 22; _context.t2 = _context["catch"](0); rj(_context.t2); case 25: case "end": return _context.stop(); } } }, _callee, _this2, [[0, 22]]); })); return function (_x5, _x6) { return _ref.apply(this, arguments); }; }()); }; /** * 仅适用最后一个参数为call的情况 * @param {*} args */ var callback = exports.callback = function callback() { for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { args[_key5] = arguments[_key5]; } var func = args[0]; args[0] = function () { var that = this; for (var _len6 = arguments.length, args2 = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) { args2[_key6] = arguments[_key6]; } (0, _apply2.default)(func, that, args2); }; return callback2.apply(undefined, args); }; var random = exports.random = function random() { return parseInt("" + __.index++ + new Date().getTime()); }; var hashRandom = exports.hashRandom = function hashRandom() { var min = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var max = arguments[1]; return Math.floor(Math.abs(hash(guid()) % (max - min))) + min; }; /** * 获取字符串的哈希值 * @param {String} str * @param {Boolean} caseSensitive * @return {Number} hashCode */ var hash = exports.hash = function hash(str) { var caseSensitive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; str = str.toString(); if (!caseSensitive) { str = str.toLowerCase(); } // 1315423911=b'1001110011001111100011010100111' var hash = 1315423911, i = void 0, ch = void 0; for (i = str.length - 1; i >= 0; i--) { ch = str.charCodeAt(i); hash ^= (hash << 5) + ch + (hash >> 2); } return hash & 0x7fffffff; }; /** * 获取字符串的sha1 base64 哈希值 * @param {String} str * @param {Boolean} caseSensitive * @return {Number} hashCode */ var hash2 = exports.hash2 = function hash2(str) { var ret = (0, _crypto.createHash)("sha256").update(str).digest("base64"); return ret.substr(0, 2) + ret.substr(11, 1) + ret.substr(3, 10) + ret.substr(2, 1) + ret.substr(12); }; var formatPrice = exports.formatPrice = function formatPrice(number, decimals, dec_point, thousands_sep) { number = (number + "").replace(/[^0-9+-Ee.]/g, ""); var n = !isFinite(+number) ? 0 : +number, prec = !isFinite(+decimals) ? 2 : Math.abs(decimals), sep = typeof thousands_sep === "undefined" ? "," : thousands_sep, dec = typeof dec_point === "undefined" ? "." : dec_point, s = "", toFixedFix = function toFixedFix(n, prec) { var k = Math.pow(10, prec); return "" + Math.round(n * k) / k; }; // Fix for IE parseFloat(0.55).toFixed(0) = 0; s = (prec ? toFixedFix(n, prec) : "" + Math.round(n)).split("."); if (s[0].length > 3) { s[0] = s[0].replace(/B(?=(?:fd{3})+(?!d))/g, sep); } if ((s[1] || "").length < prec) { s[1] = s[1] || ""; s[1] += new Array(prec - s[1].length + 1).join("0"); } return s.join(dec); }; /** * 只更新标点符号不更新全半角文字的encode * @param {String} html * @return {String} encodeURIComponent之后的字段 */ //replace(/[\r\n]+/g, '>v>j>').replace(/\s+/g, ' ').replace(/>v>j>/g, '\r\n'). var encHtml = exports.encHtml = function encHtml() { var html = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; return ((html || "").match(__.encmatch) || []).join("").replace(__.encreg, function (a) { return __.encother[a] || encodeURIComponent(a); }); }; var decHtml = exports.decHtml = function decHtml() { var html = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; return decodeURIComponent(html); }; var toJsonString = exports.toJsonString = _stringify2.default; var json = exports.json = JSON.parse; /** * * @param {*} 二维数组 * @param {*} 是否需要引号 */ var toTJson = exports.toTJson = function toTJson() { var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var quotation = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; if (!isArray(data)) data = [data]; var res = []; if (data[0] && isArray(data[0])) { for (var i in data) { res[i] = toTJson(data[i]); } } else { //找到第一个不是数组的实例对象进行处理 res[0] = []; for (var k in data[0]) { res[0].push(quotation ? '"' + k + '"' : "" + k); } for (var v in data) { var obj = []; for (var k2 in data[v]) { obj.push(__.getTJsonValue(data[v][k2], quotation)); }res.push(obj); } } return res; }; var getType = exports.getType = function getType() { var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; if (x == null) { return "null"; } var t = typeof x === "undefined" ? "undefined" : (0, _typeof3.default)(x); if (t != "object" && t != "Object") { return t; } if (isArray(x)) { return "Array"; } var c = Object.prototype.toString.apply(x); c = c.substring(8, c.length - 1); if (c != "Object") { return c; } if (x.constructor == Object) { return c; } if (x.prototype && "classname" in x.prototype.constructor && typeof x.prototype.constructor.classname == "string") { return x.constructor.prototype.classname; } return "ukObject"; }; var merge = exports.merge = function merge() { for (var _len7 = arguments.length, argu = Array(_len7), _key7 = 0; _key7 < _len7; _key7++) { argu[_key7] = arguments[_key7]; } if (argu.length < 2) { return argu[0] ? argu[0] : {}; } if (argu.length > 0 && true === argu[argu.length - 1]) { var _ = argu[0]; for (var i2 = 1; i2 < argu.length; i2++) { _ = __.merge(_, argu[i2]); }return _; } else { var _2 = {}; for (var _i = 0; _i < argu.length; _i++) { _2 = __.merge(_2, argu[_i]); }return _2; } }; var inherits = exports.inherits = function inherits(parent, args) { //绕过了parent的构造函数,重新链接原型链条 var _temp = function () { var F = function F() {}; _util2.default.inherits(F, parent); //F.prototype = parent.prototype; F.prototype.isF = true; return new F(); }(); _temp.constructor = parent; if (!this.prototype) { //这里确认是实例 //确定是打断了原型链 使得this的原型为Object parent.apply(this, args); //从新接驳原型链 使得原型链上的prototype都设置到最早的类的prototype上了 if (this.__proto__ && !this.__proto__.isF) { _util2.default.inherits(this.__proto__.constructor, _temp.__proto__.constructor); //this.__proto__.constructor.prototype = _temp.__proto__.constructor.prototype; } //son.prototype = _temp; //这里可以分层 但是会使得prototype实例变了又变 废弃 this.__proto__ = _temp; //父类方法只能找到静态方法 this.base = this.__proto__.constructor.prototype; } else { console.log("如果失败,需要配合子类构造函数中使用parent.apply(this,[***])"); //这里确认是类定义 this.prototype = _temp; } }; var create2 = exports.create2 = function create2(type, args) { if (typeof type == "function") { return new (Function.prototype.bind.apply(type, [null].concat((0, _toConsumableArray3.default)(args))))(); } else showException("请传入类定义"); }; var create = exports.create = function create(type, args) { if (typeof type == "function") { args = Array.isArray(args) ? args : [args]; var ret = "(new type("; if (Array.isArray(args)) { for (var i in args) { ret += "args[" + i + "],"; } if (args.length > 0) { ret = ret.substr(0, ret.length - 1); } } return eval(ret + "))"); } else showException("请传入类定义"); }; /** * 分别尝试全路径.js/全路径.njs/全路径加载类 并对处理结果进行缓存 会导致热更新失败错误! * @param {text} md5源串 */ var md5 = exports.md5 = function md5(text) { return (0, _crypto.createHash)("md5").update(text, "utf-8").digest("hex"); }; /** * 扩展hash * https://www.jb51.net/article/50668.htm * @param {string} text 原文 * @param {string} type 算法 譬如 md5 * @param {string} ecode 入栈 譬如 utf8 * @param {string} ocode 出栈 譬如 hex */ var xhash = exports.xhash = function xhash(text) { var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "md5"; var ecode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "utf8"; var ocode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "hex"; return (0, _crypto.createHash)(type).update(text, ecode).digest(ocode); }; /** * 带秘钥hash * https://www.jb51.net/article/50668.htm * @param {string} text 原文 * @param {string} key 秘钥 譬如 111 * @param {string} type 算法 譬如 md5 * @param {string} ecode 入栈 譬如 utf8 * @param {string} ocode 出栈 譬如 hex */ var xhmac = exports.xhmac = function xhmac(text, key) { var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "sha256"; var ecode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "utf8"; var ocode = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "base64"; return (0, _crypto.createHmac)(type, key).update(text, ecode).digest(ocode); }; /** * 带秘钥生成签名 * https://www.jb51.net/article/50668.htm * openssl list-public-key-algorithms 看所有的签名算法 * @param {*} text * @param {*} key * @param {*} type * @param {*} keycode */ var xsign = exports.xsign = function xsign(text, key) { var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "RSA-SHA256"; var keycode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "hex"; var sign = (0, _crypto.createSign)(type); sign.update(text); return sign.sign(key, keycode); }; /** * 带秘钥验证签名 * https://www.jb51.net/article/50668.htm * openssl list-public-key-algorithms 看所有的签名算法 * @param {*} text * @param {*} key * @param {*} type * @param {*} keycode */ var xverify = exports.xverify = function xverify(text, key) { var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "RSA-SHA256"; var keycode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "hex"; var sign = (0, _crypto.createVerify)(type); sign.update(text); return sign.verify(key, keycode); }; /** * 加密 * https://www.jb51.net/article/50668.htm * https://blog.csdn.net/shmnh/article/details/48254001?utm_source=blogxgwz0 * @param {string} text 原文 * @param {string} key 秘钥 譬如 111 * @param {string} type 算法 譬如 md5 * @param {string} ecode 入栈 譬如 utf8 * @param {string} ocode 出栈 譬如 base64 */ var xcrypt = exports.xcrypt = function xcrypt(text, key) { var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "aes-256-cbc"; var ecode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "utf8"; var ocode = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "base64"; var cipher = (0, _crypto.createCipher)(type, key); return cipher.update(text, ecode, ocode) + cipher.final(ocode); }; /** * 解密 * https://www.jb51.net/article/50668.htm * https://blog.csdn.net/shmnh/article/details/48254001?utm_source=blogxgwz0 * @param {string} text 原文 * @param {string} key 秘钥 譬如 111 * @param {string} type 算法 譬如 md5 * @param {string} ecode 入栈 譬如 base64 * @param {string} ocode 出栈 譬如 utf8 */ var xdcrypt = exports.xdcrypt = function xdcrypt(text, key) { var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "aes-256-cbc"; var ecode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "base64"; var ocode = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "utf8"; var cipher = (0, _crypto.createDecipher)(type, key); return cipher.update(text, ecode, ocode) + cipher.final(ocode); }; /** * 加密 * https://www.jb51.net/article/50668.htm * https://blog.csdn.net/shmnh/article/details/48254001?utm_source=blogxgwz0 * @param {string} text 原文 * @param {string} key 秘钥 譬如 111 * @param {string} iv 偏移 一般是 8或者16位默认可用Buffer.alloc(0) * @param {string} type 算法 譬如 md5 * @param {string} ecode 入栈 譬如 utf8 * @param {string} ocode 出栈 譬如 base64 */ var xcryptiv = exports.xcryptiv = function xcryptiv(text, key) { var iv = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Buffer.alloc(0); var type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "aes-256-cbc"; var ecode = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "utf8"; var ocode = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : "base64"; var cipher = (0, _crypto.createCipheriv)(type, key, iv); return cipher.update(text, ecode, ocode) + cipher.final(ocode); }; /** * 解密 * https://www.jb51.net/article/50668.htm * https://blog.csdn.net/shmnh/article/details/48254001?utm_source=blogxgwz0 * @param {string} text 原文 * @param {string} key 秘钥 譬如 111 * @param {string} iv 偏移 一般是 8或者16位默认可用Buffer.alloc(0) * @param {string} type 算法 譬如 md5 * @param {string} ecode 入栈 譬如 base64 * @param {string} ocode 出栈 譬如 utf8 */ var xdcryptiv = exports.xdcryptiv = function xdcryptiv(text, key) { var iv = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Buffer.alloc(0); var type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "aes-256-cbc"; var ecode = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "base64"; var ocode = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : "utf8"; var cipher = (0, _crypto.createCipheriv)(type, key, iv); return cipher.update(text, ecode, ocode) + cipher.final(ocode); }; /** * 加密 已经被 xcryptiv取代 * https://www.jb51.net/article/50668.htm * https://blog.csdn.net/shmnh/article/details/48254001?utm_source=blogxgwz0 * @param {string} text 原文 * @param {string} key 秘钥 譬如 111 * @param {string} ecode 入栈 譬如 utf8 * @param {string} ocode 出栈 譬如 base64 */ var xcrypt_a1e = exports.xcrypt_a1e = function xcrypt_a1e(text, key) { var iv = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; var ecode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "utf8"; var ocode = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "base64"; var cipher = (0, _crypto.createCipheriv)("aes-128-ecb", key, iv); cipher.setAutoPadding(true); return cipher.update(text, ecode, ocode) + cipher.final(ocode); }; /** * 解密 已经被 xdcryptiv取代 * https://www.jb51.net/article/50668.htm * https://blog.csdn.net/shmnh/article/details/48254001?utm_source=blogxgwz0 * @param {string} text 原文 * @param {string} key 秘钥 譬如 111 * @param {string} type 算法 譬如 md5 * @param {string} ecode 入栈 譬如 base64 * @param {string} ocode 出栈 譬如 utf8 */ var xdcrypt_a1e = exports.xdcrypt_a1e = function xdcrypt_a1e(text, key) { var iv = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; var ecode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "base64"; var ocode = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "utf8"; var cipher = (0, _crypto.createDecipheriv)("aes-128-ecb", key, iv); cipher.setAutoPadding(true); return cipher.update(text, ecode, ocode) + cipher.final(ocode); }; /** 专门给Java 的 AES方法提供密码转换, https://www.zhihuclub.com/149867.shtml 一般可以用 xdcrypt_a1e(string,SHA1PRNG(key)); 与Java互通 */ var SHA1PRNG = exports.SHA1PRNG = function SHA1PRNG(pwd) { return Buffer.from((0, _crypto.createHash)("sha1").update((0, _crypto.createHash)("sha1").update(pwd).digest("buffer")).digest("hex").substring(0, 32), "hex"); }; /** * 分别尝试全路径.js/全路径.njs/全路径加载类 并对处理结果进行缓存 会导致热更新失败错误! * @param {文件上级路径} path * @param {类名} base */ var include = exports.include = function include(path) { var base = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; var paths = path + "|" + base; return __.include[paths] || function () { if (__.unclude[paths]) throw new Error("\u52A0\u8F7D" + paths + "\u5931\u8D25!"); __.include[paths] = function () { try { if (path.startWith("\\") || path.startWith("/")) { base = base ? format(base) : (0, _path.parse)((0, _path.resolve)((0, _path.normalize)(process.mainModule.filename))).dir; if ("windows".eq(environment.os || "")) { //windows base = base.replace(/\//g, "\\"); path = path.trim("/").trim("\\").replace(/\//g, "\\"); } else { //linux base = base.replace(/\\\\/g, "/"); path = path.trim("\\").trim("/").replace(/\\\\/g, "/"); } try { try { return require("" + base + environment.splitChar + path + ".njs"); } catch (e2) { if (path.endWith("action") && e2.message.indexOf("action.njs") < 0) console.log("" + base + environment.splitChar + path + ".njs \u52A0\u8F7D\u5931\u8D25!", e2.stack); return require("" + base + environment.splitChar + path + ".js"); } } catch (e3) { return require(path); } } else return require(path); } catch (e) { //console.log(e.stack); __.unclude[paths] = true; throw new Error("\u52A0\u8F7D" + paths + "\u5931\u8D25!!" + e.stack); } }(); return __.include[paths]; }(); }; var applyCAE = exports.applyCAE = function applyCAE(S) { //功能出现严重问题 无法在ES6下使用 S[__.settings] = {}; S[__.exsettings] = {}; //获取不存在就配置 S.getSettings = function (key, data) { if (!isValid(S[__.settings][key])) { if (isValid(S[__.exsettings][key])) { S[__.settings][key] = merge(getValue(data, {}), S[__.exsettings][key]); delete S[__.exsettings][key]; } else S[__.settings][key] = getValue(data, {}); } return S[__.settings][key]; }; //扩展默认配置 S.extendSettings = function (key, data) { if (isValid(S[__.settings][key])) { S[__.settings][key] = merge(S[__.settings][key], data); } else { if (S.exSettings[key]) { S[__.exsettings][key] = merge(S[__.exsettings][key], getValue(data, {})); } else { S[__.exsettings][key] = getValue(data, {}); } } }; S.clearSettings = function () { S[__.settings] = {}; }; S.registCommand = function (name, func) { var comms = S.getSettings("comms", []); var data = comms[name]; if (isValid(data) && typeof data != "function") { func.apply(null, data); } comms[name] = func; }; /* V用于调用被调用页面注册的命令以处理异步命令调用,当命令尚未注册而已经被调用时,参数会先被缓存下来,然后当命令注册时,已知的参数再被调用。 --案例 S.callCommand('showXXList',[{id:1}]) */ S.callCommand = function (name, data) { var caller = null; var comms = S.getSettings("comms", []); var func = comms[name]; data = isArray(data) ? data : [data]; if (isValid(func) && typeof func == "function") { once(function () { func.apply(caller, data); }); } else { comms[name] = data; } }; /* 用来判断是否调用页面,当已经调用过(part),返回true,否则返回false; --案例 if (!S.hasCommand('editor.open')) S.part("/FileServer/layout/editor/editor.htm"); */ S.hasCommand = function (name) { var comms = S.getSettings("comms", []); var func = comms[name]; return isValid(func) && typeof func == "function"; }; /* 仅限iframe方式调用时,先取消原页面添加的方法 //业务逻辑深度交叉,iframe落后的控件连接方式时使用 一定要在part前 --案例 S.cleanCommand('editor.open'); S.part("/FileServer/layout/editor/editor.htm",null,"iframe",function(){}); */ S.cleanCommand = function (name) { var comms = S.getSettings("comms", []); delete comms[name]; }; /* V用于被调用页面注册命令以处理异步命令调用,当命令尚未注册而已经被调用时,参数会先被缓存下来,然后当命令注册时,已知的参数再被调用。 并约定1分钟内 允许注册者多次被触发 --案例 S.registEvent('showXXList',getData),S.registEvent(['showXXList',''],getData) */ S.registEvent = function (name, func, isTop) { var fun = function fun(name, func, isTop) { var events = S.getSettings("events", []); var funs = events[name]; if (!isValid(funs)) { funs = []; events[name] = funs; } if (typeof func == "function") { if (isTop && !funs.top) { funs.top = func; funs.unshift(func); } else { if (isTop && funs.top) { showException("S.registEvent:" + name + " 事件已经有订阅者被置顶!"); } funs.push(func); } var ecall = S.getSettings("eventcall", {}); ecall = ecall[name] ? ecall[name] : {}; if (ecall.time && ecall.time >= new Date().getTime()) { once(function () { func.apply(ecall.caller, ecall.data); }); } } }; if (isArray(name)) { each(name, function (v) { fun(v, func, isTop); return false; }, true); } else { fun(name, func, isTop); } }; /* V用于调用被调用页面注册的事件以处理异步命令调用,当命令尚未注册而已经被调用时,参数会先被缓存下来,然后当命令注册时,已知的参数再被调用。 并约定1分钟内 允许注册者多次被触发 --案例 S.callEvent('showXXList',[{id:1}]) */ S.callEvent = function (name, data) { var caller = null; var events = S.getSettings("events", []); var funs = events[name]; data = isArray(data) ? data : [data]; if (isValid(funs) && isArray(funs)) { each(funs, function (func) { //报错不下火线 tryC(function () { func.apply(caller, data); }); }); } var ecall = S.getSettings("eventcall", {}); if (!ecall[name]) { ecall[name] = {}; } ecall = ecall[name]; ecall.time = new Date().add("n", 1).getTime(); ecall.data = data; ecall.caller = caller; }; /* 用来判断是否调用页面,当已经调用过(part),返回true,否则返回false; --案例 if (!S.hasEvent('editor.open')) S.part("/FileServer/layout/editor/editor.htm"); */ S.hasEvent = function (name) { var events = S.getSettings("events", []); var funs = events[name]; if (isValid(funs) && isArray(funs)) { return true; } return false; }; /* 仅限iframe方式调用时,先取消原页面添加的方法 //业务逻辑深度交叉,iframe落后的控件连接方式时使用 一定要在part前 --案例 S.cleanEvent('editor.open'); S.part("/FileServer/layout/editor/editor.htm",null,"iframe",function(){}); */ S.cleanEvent = function (name) { var events = S.getSettings("events", []); delete events[name]; }; }; /** * 转换Emoji为base64格式 * @param {*} str */ var encodeEmoji = exports.encodeEmoji = function encodeEmoji(str) { return __.convert2Base64(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) { return String.fromCharCode("0x" + p1); })); }; /** * base64还原emoji * @param {*} str */ var decodeEmoji = exports.decodeEmoji = function decodeEmoji(str) { var ret; try { ret = __.convert2Binary(str).split(""); var ret2 = []; ret.forEach(function (c) { ret2.push("%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2)); }); return decodeURIComponent(ret2.join("")); } catch (e) { ret = decodeURIComponent(str); } return ret || str; }; /** * 生成xml解析对象 toJson用于转换xml2Json toXml用于转换json2xml * @param {config} config * 譬如 attributeNamePrefix: "@_", attrNodeName: "attr", //default is 'false' textNodeName: "#text", ignoreAttributes: true, ignoreNameSpace: false, allowBooleanAttributes: false, parseNodeValue: true, parseAttributeValue: false, trimValues: true, cdataTagName: "__cdata", //default is 'false' cdataPositionChar: "\\c", localeRange: "", //To support non english character in tag/attribute values. parseTrueNumberOnly: false, attrValueProcessor: a => he.decode(a, { isAttributeValue: true }), //default is a=>a tagValueProcessor: a => he.decode(a) //default is a=>a */ var xml = exports.xml = function xml(config) { config = merge(__.xmloptions, config || {}); var Jconfig = merge(config, { tagValueProcessor: function tagValueProcessor(a) { return _he2.default.encode(a, { useNamedReferences: true }); }, // default is a=>a attrValueProcessor: function attrValueProcessor(a) { return _he2.default.encode(a, { isAttributeValue: isAttribute, useNamedReferences: true }); } // default is a=>a }); var j2x = new _fastXmlParser2.default.j2xParser(config); var ret = { toXml: function toXml(json) { try { return j2x.parse({ xml: json }); } catch (e) { if (e.message.indexOf("html.replace") >= 0) throw new Error("toXml:JSON中的值不能是非字符串内容!");else throw e; } }, toJson: function toJson(xml) { xml = (xml + "").replace(/(<\?).+\?>/g, ""); !xml.startWith("<xml") && (xml = "<xml>" + xml + "</xml>"); return ret.deCDATA(_fastXmlParser2.default.parse(xml), Jconfig); }, deCDATA: function deCDATA(json) { for (var k in json) { if (json[k][config.cdataTagName]) json[k] = json[k][config.cdataTagName];else if ((0, _typeof3.default)(json[k]) == "object") ret.deCDATA(json[k]); } return json.xml; } }; return ret; }; /** * 生成GUID */ var GUID = exports.GUID = function GUID() { return (0, _v2.default)().replace(/\-/g, ""); }; var SnowId = null; /** * 生成雪花ID */ var SNOWID = exports.SNOWID = function SNOWID() { if (!SnowId) SnowId = new _snowflakeId2.default({ mid: 42, offset: (new Date().getFullYear() - 1970) * 31536000 * 1000 }); return SnowId.generate(); }; exports.default = { environment: environment, prop: prop, link: link, desc: desc, isValid: isValid, getValue: getValue, format: format, sb: sb, showEx: _showEx, showException: showException, include: include, random: random, hashRandom: hashRandom, tryC: tryC, tryC2: tryC2, watch: watch, isArray: isArray, once: once, whileC: whileC, forC: forC, each: each, finalC: finalC, next: next, callback: callback, callback2: callback2, encHtml: encHtml, decHtml: decHtml, toJsonString: toJsonString, json: json, merge: merge, inherits: inherits, create: create, create2: create2, applyCAE: applyCAE, pris: pris, hash: hash, hash2: hash2, toTJson: toTJson, getType: getType, formatPrice: formatPrice, encodeEmoji: encodeEmoji, decodeEmoji: decodeEmoji, GUID: GUID, md5: md5, xhash: xhash, xhmac: xhmac, xsign: xsign, xverify: xverify, xcrypt: xcrypt, xdcrypt: xdcrypt, xml: xml, xcrypt_a1e: xcrypt_a1e, xdcrypt_a1e: xdcrypt_a1e, SHA1PRNG: SHA1PRNG, SNOWID: SNOWID, xcryptiv: xcryptiv, xdcryptiv: xdcryptiv }; //const symbol = Symbol; var pri = pris(); var __ = { settings: (0, _symbol2.default)("settings"), exsettings: (0, _symbol2.default)("exsettings"), encreg: /<|>|~|(\r\n)|!|@|#|\$|%|\^|;|\*|\(|\)|_|\+|\{|\}|\||:|\"|\?|`|\-|=|\[|\]|\\|;|\'|,|\.|\/|,|;|\s/g, encmatch: /[a-zA-Z0-9\u4E00-\u9FA5\uF900-\uFA2D]|[\u3002|\uff1f|\uff01|\uff0c|\u3001|\uff1b|\uff1a|\u201c|\u201d|\u2018|\u2019|\uff08|\uff09|\u300a|\u300b|\u3008|\u3009|\u3010|\u3011|\u300e|\u300f|\u300c|\u300d|\ufe43|\ufe44|\u3014|\u3015|\u2026|\u2014|\uff5e|\ufe4f|\uffe5]|<|>|~|(\r\n)|!|@|#|\$|%|\^|;|\*|\(|\)|_|\+|\{|\}|\||:|\"|\?|`|\-|=|\[|\]|\\|;|\'|,|\.|\/|,|;|\s/g, encother: { "(": "%28", ")": "%29", "*": "%2a", "'": "%27", ".": "%2e", "-": "%2d", _: "%5f" }, funrep: function funrep(s, o, reg, lreg, rreg) { return s.replace(reg, function (word) { var key = "" + word.replace(lreg, "").replace(rreg, ""); return typeof o[key] == "undefined" ? "" : o[key]; }); }, /** * StringBuilder nodejs版本 用于连续操作字符串对象而不经常移动数组 比较准确快捷的修改字符串内容 */ StringBuilder: function () { function StringBuilder() { (0, _classCallCheck3.default)(this, StringBuilder); var that = this; var _pri = pri(that, { data: [], length: 0, append: function append() { var str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var _pri2 = pri(that), _ = _pri2._, __ = _pri2.__; __.data.push(str); __.length += str.length; } }), _ = _pri._, __ = _pri.__; } (0, _createClass3.default)(StringBuilder, [{ key: "append", value: function append(str) { var _pri3 = pri(this), _ = _pri3._, __ = _pri3.__; str = !!str ? __.append(str) : ""; return this; } }, { key: "appendFormat", value: function appendFormat(fmt, data) { return this.append(format(fmt, data)); } }, { key: "insert", value: function insert(start, data) { var _pri4 = pri(this), _ = _pri4._, __ = _pri4.__; var str = _.toString(); __.data = [str.substr(0, start), data, str.substr(start)]; __.length = str.length + data.length; return this; } }, { key: "insertFormat", value: function insertFormat(start, fmt, data) { this.insert(start, format(fmt, data)); } }, { key: "remove", value: function remove(start, length) { var _pri5 = pri(this), _ = _pri5._, __ = _pri5.__; var str = _.toString(); __.data = [str.substr(0, start), str.substr(start + length)]; __.length = Math.max(0, str.length - length); return _; } }, { key: "toString", value: function toString() { var _pri6 = pri(this), _ = _pri6._, __ = _pri6.__; __.data = [__.data.join("")]; return __.data[0]; } }, { key: "clear", value: function clear() { var ret = this.toString(); var _pri7 = pri(this), _ = _pri7._, __ = _pri7.__; __.data = []; __.length = 0; return ret; } }, { key: "length", get: function get() { return pri(this).__.length; } }]); return StringBuilder; }(), showEx: function showEx(e) { return _showEx("", e); }, tryHandle: function tryHandle() { var errcall = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : __.showEx; return { apply: function apply(target, context, proxy) { try { return _apply2.default.apply(Reflect, arguments); } catch (e) { try { errcall(e); } catch (e2) { __.showEx(e); } } } }; }, start: null, emptyfunc: function emptyfunc() { return true; }, sequfunc: function () { var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(exp, func, val) { var isStop; return _regenerator2.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: isStop = false; case 1: if (!(!isStop && val != undefined)) { _context2.next = 9; break; } _context2.next = 4; return callback2(func, null, val); case 4: _context2.t0 = _context2.sent; isStop = true === _context2.t0; val = exp(); _context2.next = 1; break; case 9: return _context2.abrupt("return", true); case 10: case "end": return _context2.stop(); } } }, _callee2, undefined); })); return function sequfunc(_x47, _x48, _x49) { return _ref2.apply(this, arguments); }; }(), disorderfunc: function disorderfunc(exp, func, val) { var data = []; while (val != undefined) { data.push(callback2(func, null, val)); val = exp(); } return _promise2.default.all(data); }, disorderlfunc: function disorderlfunc(each, call) { while (!each.isStop && each.i <= each.data.length - 1 && each.count < each.limit) { each.count++; callback2(each.func, null, each.data[each.i++]).then(function (ret) { each.isStop = !!ret; each.count--; __.disorderlfunc(each, call); }).catch(function (e) { each.error = e; each.isStop = true; each.count--; __.disorderlfunc(each, call); }); } if (each.count <= 0 && (each.isStop || each.i > each.data.length - 1)) call(each.error, true); return true; }, disorderlEach: function disorderlEach() { var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var func = arguments[1]; var limit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; var each = { data: data, func: func, i: 0, count: 0, limit: limit, isStop: false, error: null }; return callback2(function (call) { __.disorderlfunc(each, call); }); }, disorderffunc: function disorderffunc(each, call) { while (!each.isStop && each.i <= each.data.length - 1 && each.count < each.limit) { each.count++; var val = each.data[each.i++]; callback2(each.func, null, val.k, val.v).then(function (ret) { each.isStop = !!ret; each.count--; __.disorderffunc(each, call); }).catch(function (e) { each.error = e; each.isStop = true; each.count--; __.disorderffunc(each, call); }); } if (each.count <= 0 && (each.isStop || each.i > each.data.length - 1)) call(each.error, true); return true; }, disorderlFor: function disorderlFor() { var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var func = arguments[1]; var limit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; var each = { data: [], func: func, i: 0, count: 0, limit: limit, isStop: false, error: null }; for (var k in data) { each.data.push({ k: k, v: data[k] }); } return callback2(function (call) { __.disorderffunc(each, call); }); }, disorderwfunc: function disorderwfunc(each, call) { while (!each.isStop && each.now != null && each.count < each.limit) { each.count++; var val = each.now; each.now = each.exp(); if (val != null) callback2(each.func, null, val).then(function (ret) { each.isStop = !!ret; each.count--; __.disorderwfunc(each, call); }).catch(function (e) { each.error = e; each.isStop = true; each.count--; __.disorderwfunc(each, call); }); } if (each.count <= 0 && (each.isStop || each.now == null)) call(each.error, true); return true; }, disorderlWhile: function disorderlWhile(exp, func) { var limit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; var each = { exp: exp, func: func, i: 0, count: 0, limit: limit, isStop: false, error: null }; return callback2(function (call) { each.now = exp(); __.disorderwfunc(each, call); }); }, sequEach: function sequEach() { var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var func = arguments[1]; var i = 0; return __.sequfunc(function () { return data[i++]; }, func, data[i++]); }, disorderEach: function disorderEach() { var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var func = arguments[1]; var ret = []; data.forEach(function (k) { return ret.push(callback2(func, null, k)); }); return _promise2.default.all(ret); }, sequFor: function () { var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3() { var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var func = arguments[1]; var k; return _regenerator2.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _context3.t0 = _regenerator2.default.keys(obj); case 1: if ((_context3.t1 = _context3.t0()).done) { _context3.next = 10; break; } k = _context3.t1.value; _context3.next = 5; return callback2(func, obj, k, obj[k]); case 5: _context3.t2 = _context3.sent; if (!(true === _context3.t2)) { _context3.next = 8; break; } return _context3.abrupt("return", true); case 8: _context3.next = 1; break; case 10: return _context3.abrupt("return", true); case 11: case "end": return _context3.stop(); } } }, _callee3, undefined); })); return function sequFor() { return _ref3.apply(this, arguments); }; }(), disorderFor: function disorderFor() { var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var func = arguments[1]; var data = []; for (var k in obj) { data.push(callback2(func, obj, k, obj[k])); }return _promise2.default.all(data); }, index: 0, getTJsonValue: function getTJsonValue(p) { var quotation = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; switch (typeof p === "undefined" ? "undefined" : (0, _typeof3.default)(p)) { //case 'number': //case 'boolean': // return p; case "undefined": return '""'; case "object": switch (p + "") { case "null": return '""'; default: return quotation ? '"' + (p + "").replace(/['"\\]/g, function (v) { return "\\" + v; }) + '"' : "" + p; } default: return quotation ? '"' + (p + "").replace(/['"\\]/g, function (v) { return "\\" + v; }) + '"' : "" + p; } }, clone: function clone(source) { switch (getType(source)) { case "Object": case "object": return __.merge({}, source); case "array": case "Array": var aim = []; for (var i in source) { aim.push(__.clone(source[i])); } return aim; default: return so