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