@clynn-fe/akfe-editor-jsonf
Version:
JSON methods support function parse and stringify
130 lines • 4.98 kB
JavaScript
;
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