123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- // lifted from here: https://github.com/lucagez/slow-json-stringify
- var _prepare = function(e) {
- var r = JSON.stringify(e, function(e, r) {
- return r.isSJS ? r.type + "__sjs" : r
- });
- return {
- preparedString: r,
- preparedSchema: JSON.parse(r)
- }
- },
- _find = function(path) {
- for (var length = path.length, str = "obj", i = 0; i < length; i++) str = str.replace(/^/, "("), str += " || {})." + path[i];
- return just.vm.runScript("((obj) => " + str + ")")
- },
- _makeArraySerializer = function(e) {
- return e instanceof Function ? function(r) {
- for (var n = "", t = r.length, a = 0; a < t - 1; a++) n += e(r[a]) + ",";
- return "[" + (n += e(r[t - 1])) + "]"
- } : function(e) {
- return JSON.stringify(e)
- }
- },
- TYPES = ["number", "string", "boolean", "array", "null"],
- attr = function(e, r) {
- if (!TYPES.includes(e)) throw new Error('Expected one of: "number", "string", "boolean", "null". received "' + e + '" instead');
- var n = r || function(e) {
- return e
- };
- return {
- isSJS: !0,
- type: e,
- serializer: "array" === e ? _makeArraySerializer(r) : n
- }
- },
- defaultRegex = new RegExp('\\n|\\r|\\t|\\"|\\\\', "gm"),
- escape = function(e) {
- return void 0 === e && (e = defaultRegex),
- function(r) {
- return r.replace(e, function(e) {
- return "\\" + e
- })
- }
- },
- _makeQueue = function(e, r) {
- var n = [];
- return function e(t, a) {
- if (void 0 === a && (a = []), !/__sjs/.test(t)) return Object.keys(t).map(function(r) {
- return e(t[r], a.concat([r]))
- });
- var i = Array.from(a),
- u = _find(i),
- s = u(r);
- n.push({
- serializer: s.serializer,
- find: u,
- name: a[a.length - 1]
- })
- }(e), n
- },
- _makeChunks = function(e, r) {
- return e.replace(/"\w+__sjs"/gm, function(e) {
- return /string/.test(e) ? '"__par__"' : "__par__"
- }).split("__par__").map(function(e, n, t) {
- var a = '("' + (r[n] || {}).name + '":("?))$',
- i = "(,?)" + a,
- u = /^("}|})/.test(t[n + 1] || ""),
- s = new RegExp(u ? i : a),
- f = /^(\"\,|\,|\")/;
- return {
- flag: !1,
- pure: e,
- prevUndef: e.replace(f, ""),
- isUndef: e.replace(s, ""),
- bothUndef: e.replace(f, "").replace(s, "")
- }
- })
- },
- _select = function(e) {
- return function(r, n) {
- var t = e[n];
- return void 0 !== r ? t.flag ? t.prevUndef + r : t.pure + r : (e[n + 1].flag = !0, t.flag ? t.bothUndef : t.isUndef)
- }
- },
- sjs = function(e) {
- var r = _prepare(e),
- n = r.preparedString,
- t = _makeQueue(r.preparedSchema, e),
- a = _makeChunks(n, t),
- i = _select(a),
- u = t.length;
- return function(e) {
- for (var r = "", n = 0; n !== u;) {
- var s = t[n],
- f = s.serializer,
- p = (0, s.find)(e);
- r += i(f(p), n), n += 1
- }
- var o = a[a.length - 1];
- return r + (o.flag ? o.prevUndef : o.pure)
- }
- };
- exports.sjs = sjs, exports.attr = attr, exports.escape = escape;
|