UNPKG

@technobuddha/library

Version:
79 lines (78 loc) 3.14 kB
"use strict"; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.reviver = exports.replacer = exports.specialFinish = exports.specialBegin = void 0; var isNaN_1 = __importDefault(require("lodash/isNaN")); var isFinite_1 = __importDefault(require("lodash/isFinite")); exports.specialBegin = '﴾'; exports.specialFinish = '﴿'; /** * Used with JSON.stringify to encode a wider range of objects into strings that can later be decoded with {@link revive} * * @remarks Will encode Date, RegExp and BigInt objects. The numeric values 'Infinity' and 'NaN' are also encoded. * @param this The raw object being stringified * @param key The key for the field * @param value The value (may have already been encoded into a string) * @returns the encoded value */ function replacer(key, value) { var raw = this[key]; if (raw instanceof Date) return exports.specialBegin + "Date:" + raw.toISOString() + exports.specialFinish; else if (raw instanceof RegExp) return exports.specialBegin + "RegExp:/" + raw.source + "/" + raw.flags + exports.specialFinish; else if (typeof raw === 'number' && (isNaN_1.default(raw) || !isFinite_1.default(raw))) return exports.specialBegin + "Number:" + raw.toString() + exports.specialFinish; else if (typeof raw === 'bigint') return exports.specialBegin + "BigInt:" + raw.toString() + exports.specialFinish; return value; } exports.replacer = replacer; /** * Used with JSON.parse to decode objected encoded by {@link replacer} * * @param this The raw object * @param _key The key * @param value The value * @returns the decoded value */ function reviver(_key, value) { if (typeof value === 'string' && value.startsWith(exports.specialBegin) && value.endsWith(exports.specialFinish)) { var _a = __read(value.slice(1, -1).split(/:(.+)/u), 2), type = _a[0], jsonValue = _a[1]; switch (type) { case 'Date': return new Date(jsonValue); case 'RegExp': { var matches = /^\/(.*)\/([a-z]*)$/u.exec(jsonValue); return matches ? new RegExp(matches[1], matches[2]) : new RegExp(jsonValue, 'u'); } case 'Number': return Number(jsonValue); case 'BigInt': return BigInt(jsonValue); default: return value; } } return value; } exports.reviver = reviver; exports.default = { replacer: replacer, reviver: reviver };