UNPKG

vtils

Version:

一个面向业务的 JavaScript/TypeScript 实用程序库。

108 lines (103 loc) 3.65 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; exports.__esModule = true; exports.DataPacker = void 0; var _createForOfIteratorHelperLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelperLoose")); var _lodashUni = require("lodash-uni"); var _base = require("./base64"); var _rot = require("./rot13"); /** * 数据打包器。 */ var DataPacker = exports.DataPacker = /*#__PURE__*/function () { function DataPacker() {} DataPacker.encodeIndexes = function encodeIndexes(indexes) { return (0, _rot.rot13)((0, _base.base64UrlEncode)(Math.random().toString(36).slice(2) + "." + indexes.join('.'))); }; DataPacker.decodeIndexes = function decodeIndexes(value) { return (0, _base.base64UrlDecode)((0, _rot.rot13)(value)).split('.').slice(1).map(Number); } /** * 打包数据。 */; DataPacker.pack = function pack(rawData) { var notArray = !Array.isArray(rawData); var rawList = notArray ? [rawData] : rawData; var keys = rawList.length ? (0, _lodashUni.shuffle)(Object.keys(rawList[0])) : []; var indexes = (0, _lodashUni.shuffle)((0, _lodashUni.range)(0, keys.length)); var values = []; for (var _iterator = (0, _createForOfIteratorHelperLoose2.default)(rawList), _step; !(_step = _iterator()).done;) { var rawItem = _step.value; var item = []; for (var i = 0, len = indexes.length; i < len; i++) { item[indexes[i]] = rawItem[keys[i]]; } values.push(item); } return { _k: keys, _v: values, _s: DataPacker.encodeIndexes(notArray ? [-1].concat(indexes) : indexes) }; } /** * 返回结果同 `pack()`,不过类型是原数据的类型。 */; DataPacker.packAsRawType = function packAsRawType(rawData) { return DataPacker.pack(rawData); } /** * 解包数据。 */; DataPacker.unpack = function unpack(packedData) { var rawList = []; var indexes = DataPacker.decodeIndexes(packedData._s); var notArray = indexes[0] === -1; if (notArray) { indexes.shift(); } for (var _iterator2 = (0, _createForOfIteratorHelperLoose2.default)(packedData._v), _step2; !(_step2 = _iterator2()).done;) { var values = _step2.value; var item = {}; for (var i = 0, len = indexes.length; i < len; i++) { item[packedData._k[i]] = values[indexes[i]]; } rawList.push(item); } return notArray ? rawList[0] : rawList; } /** * 如果是打包后的数据,则解包后返回,否则直接返回。如果是对象,则递归尝试解包。 * * @param value 数据 * @param depth 递归层级,默认:2 * @returns 返回结果数据 */; DataPacker.unpackIfNeeded = function unpackIfNeeded(value, depth) { if (depth === void 0) { depth = 2; } if ((0, _lodashUni.isPlainObject)(value)) { // 兼容 v2 的 StructuredListTransformer 产生的数据 // https://github.com/fjc0k/vtils/blob/v2/packages/vtils/src/StructuredListTransformer.ts if (value.__IS_PACKED_STRUCTURED_LIST__) { value._k = value.keys; value._v = value.values; value._s = value.signature; delete value.__IS_PACKED_STRUCTURED_LIST__; } if (true) { if (value._k && value._v && value._s) { return DataPacker.unpack(value); } if (depth > 0) { return (0, _lodashUni.mapValues)(value, function (v) { return DataPacker.unpackIfNeeded(v, depth - 1); }); } } } return value; }; return DataPacker; }();