@technobuddha/library
Version:
A large library of useful functions
79 lines (78 loc) • 3.14 kB
JavaScript
;
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 };