UNPKG

@clynn-fe/akfe-editor-jsonf

Version:

JSON methods support function parse and stringify

77 lines 3.98 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.stringify = void 0; const defines_1 = require("./defines"); const type_detectors_1 = require("./type_detectors"); const utils_1 = require("./utils"); const assemble = (type, data) => `${defines_1.LeFE_Prefix}${defines_1.Segment}${type}${data ? defines_1.Segment + data : ''}`; const isTypesNeededTraverse = (val) => (0, type_detectors_1.isArray)(val) || ((0, type_detectors_1.isObject)(val) && !(0, type_detectors_1.isDate)(val) && !(0, type_detectors_1.isSet)(val) && !(0, type_detectors_1.isMap)(val)); const isArrowFunction = (str) => { // TODO: 这块判断有点不太好,后期考虑一下,搞个完善的正则什么的 const arr = str.split('=>'); if (arr.length === 1) { // 只有一项说明字符串里没有 =>, 肯定不是箭头函数 return false; } const part1 = arr[0].trim(); // 取 => 前面的部分 if (part1.startsWith('(') && part1.endsWith(')')) { // 如果这一部分是 (...) 的话,认为是箭头函数,排除这种: function () { return () => {} } return true; } // 如果不是 (....), 那只能是单独是形参变量名,不可能包含 {, 排除这种: function () { return a => {} }, 保住这种 a => {} return part1.indexOf('{') === -1; }; const functionStringify = (func) => { const str = func.toString(); if (str.startsWith('function') || str.startsWith('async function') || isArrowFunction(str)) { return str; } // 这个是为了处理方法,如 { test () {} } return str.startsWith('async') ? `async function ${str.slice(6)}` : `function ${str}`; }; const needNotTraverseHandler = (val) => { switch (true) { case (0, type_detectors_1.isUndefined)(val): return assemble(defines_1.ETypeStrings.undefined); case (0, type_detectors_1.isNegativeInfinity)(val): return assemble(defines_1.ETypeStrings.Infinity, defines_1.EInfinityString.negative); case (0, type_detectors_1.isPositiveInfinity)(val): return assemble(defines_1.ETypeStrings.Infinity, defines_1.EInfinityString.positive); case (0, type_detectors_1.isNaN)(val): return assemble(defines_1.ETypeStrings.NaN); case (0, type_detectors_1.isBigInt)(val): return assemble(defines_1.ETypeStrings.BigInt, val.toString()); case (0, type_detectors_1.isSymbol)(val): // TODO: 辣鸡 TS 有 Bug, 目前不支持 symbol.prototype.description 属性。 // 请关注官方 Release, 支持了以后升级改掉这个 any 类型声明。 return assemble(defines_1.ETypeStrings.Symbol, val.description); case (0, type_detectors_1.isFunction)(val): return assemble(defines_1.ETypeStrings.Function, functionStringify(val)); case (0, type_detectors_1.isDate)(val): return assemble(defines_1.ETypeStrings.Date, `${val.getTime()}`); case (0, type_detectors_1.isMap)(val): return assemble(defines_1.ETypeStrings.Map, (0, exports.stringify)(Array.from(val.entries()))); case (0, type_detectors_1.isSet)(val): return assemble(defines_1.ETypeStrings.Set, (0, exports.stringify)([...val])); default: return val; } }; const stringify = (data) => JSON.stringify(data, (key, val) => { if (!isTypesNeededTraverse(val)) { return needNotTraverseHandler(val); } else { return (0, type_detectors_1.isObject)(val) ? Object.entries(val).reduce((prev, [k, v]) => Object.assign(prev, { [k]: (0, utils_1.shouldBlockSelfToJSON)(v) ? (0, utils_1.blockSelfToJSON)(v) : v }), {}) : val.map(item => (0, utils_1.shouldBlockSelfToJSON)(item) ? (0, utils_1.blockSelfToJSON)(item) : item); } }); exports.stringify = stringify; //# sourceMappingURL=stringify.js.map