UNPKG

@clynn-fe/akfe-editor-jsonf

Version:

JSON methods support function parse and stringify

130 lines 4.98 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.parse = void 0; const defines_1 = require("./defines"); const type_detectors_1 = require("./type_detectors"); const parseReplaceString = (str) => { // 由于 dataString 里可能还有 Segment,这里的意思是只取前两个,剩下的,还给拼起来,留着下面用 const [, type, ...dataStringArr] = str.split(defines_1.Segment); const dataString = dataStringArr.join(defines_1.Segment); return { type, dataString }; }; const stringParse = (str, parse) => { if (str.startsWith(defines_1.LeFE_Prefix)) { const { type, dataString } = parseReplaceString(str); switch (type) { // undefined 比较坑,这里不处理,最后遍历统一处理 // case ETypeStrings.undefined: // return undefined case defines_1.ETypeStrings.Infinity: return dataString === defines_1.EInfinityString.positive ? Infinity : -Infinity; case defines_1.ETypeStrings.NaN: return NaN; case defines_1.ETypeStrings.BigInt: try { return BigInt(dataString); } catch (error) { console.error(error); return BigInt(0); } case defines_1.ETypeStrings.Symbol: return Symbol(dataString); case defines_1.ETypeStrings.Function: try { return Function(`return ${dataString}`)(); } catch (error) { console.error(error); return function placeholder() { console.warn('注意!该函数在 JSON 解析时出现错误。'); }; } case defines_1.ETypeStrings.Date: return new Date(Number(dataString)); case defines_1.ETypeStrings.Set: try { return new Set(parse(dataString)); } catch (error) { console.error(error); return new Set(); } case defines_1.ETypeStrings.Map: try { return new Map(parse(dataString)); } catch (error) { console.error(error); return new Map(); } default: return str; } } else { /* Start: 老 Function 逻辑兼容 */ if (str.startsWith('function')) { try { return Function(`return ${str}`)(); } catch (error) { console.error(error); return function placeholder() { console.warn('注意!该函数在 JSON 解析时出现错误。'); }; } } /* End: 老 Function 逻辑兼容 */ return str; } }; const isTypesNeededTraverse = (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)) || (0, type_detectors_1.isArray)(val); const needNotTraverseHandler = (val) => (0, type_detectors_1.isString)(val) ? stringParse(val, exports.parse) : // 在无需遍历的类型中,除了 string 就是 boolean, number, null, 直接返回 val; const undefinedHandler = (val) => (0, type_detectors_1.isObject)(val) ? Object.entries(val).reduce((prev, [k, v]) => { if (isTypesNeededTraverse(v)) { return Object.assign(prev, { [k]: undefinedHandler(v) }); } else { const { type } = (0, type_detectors_1.isString)(v) && v.startsWith(defines_1.LeFE_Prefix) ? parseReplaceString(v) : { type: '' }; return Object.assign(prev, { [k]: type === defines_1.ETypeStrings.undefined || v === defines_1.UndefinedReplacer ? undefined : v }); } }, {}) : val.map(item => { if (isTypesNeededTraverse(item)) { return undefinedHandler(item); } else { const { type } = (0, type_detectors_1.isString)(item) && item.startsWith(defines_1.LeFE_Prefix) ? parseReplaceString(item) : { type: '' }; return type === defines_1.ETypeStrings.undefined ? undefined : item; } }); const parse = (json) => { const result = JSON.parse(json, (key, val) => { return !isTypesNeededTraverse(val) ? needNotTraverseHandler(val) : val; }); return undefinedHandler(result); }; exports.parse = parse; //# sourceMappingURL=parse.js.map