jsurl2
Version:
URL friendly JSON-like formatting and parsing
97 lines (96 loc) • 4.08 kB
JavaScript
const S = /^[a-zA-Z]/, D = /^[\d-]/, g = "_N", y = { T: !0, F: !1, N: null, U: void 0, n: NaN, I: 1 / 0, J: -1 / 0 }, J = { "*": "*", _: "_", "-": "~", S: "$", P: "+", '"': "'", C: "(", D: ")", L: "<", G: ">", ".": "%", Q: "?", H: "#", A: "&", E: "=", B: "\\", N: `
`, R: "\r", U: "\u2028", V: "\u2029", Z: "\0" }, b = { "*": "*", _: "_", "~": "-", $: "S", "+": "P", "'": '"', "(": "C", ")": "D", "<": "L", ">": "G", "%": ".", "?": "Q", "#": "H", "&": "A", "=": "E", "\\": "B", "\n": "N", "\r": "R", "\0": "Z", "\u2028": "U", "\u2029": "V" }, p = (e, t) => {
throw Error(`${e} ${JSON.stringify(t)}`);
}, O = (e) => {
if (e === "_")
return " ";
const t = J[e.charAt(1)];
return t || p("Illegal escape code", e), t;
}, C = (e) => e === " " ? "_" : "*" + b[e], A = /(_|\*.)/g, a = (e) => A.test(e) ? e.replace(A, O) : e, $ = /([*_~$+'() <>%?#&=\\\n\r\0\u2028\u2029])/g, I = (e) => $.test(e) ? e.replace($, C) : e, c = (e) => {
let t, s;
for (t = e.t; t < e.o && (s = e.l.charAt(t), s !== "~" && s !== ")"); t++)
;
const l = e.l.slice(e.t, t);
return s === "~" && t++, e.t = t, l;
}, h = (e) => e.l.charAt(e.t), f = (e) => {
e.t++;
}, U = {}, d = (e) => {
let t, s, l = h(e);
if (!l)
return U;
if (l === "(") {
let r;
for (f(e), t = {}; l = h(e), l && l !== ")"; )
s = a(c(e)), l = h(e), r = !l || l === ")" || d(e), t[s] = r;
l === ")" && f(e);
} else if (l === "!") {
for (f(e), t = []; l = h(e), l && l !== "~" && l !== ")"; )
t.push(d(e));
l === "~" && f(e);
} else
l === "_" ? (f(e), s = a(c(e)), s.charAt(0) === "D" ? t = new Date(s.slice(1)) : s in y ? t = y[s] : p("Unknown dict reference", s)) : l === "*" ? (f(e), t = a(c(e))) : l === "~" ? (f(e), t = !0) : D.test(l) ? (t = +c(e), isNaN(t) && p("Not a number", l)) : S.test(l) ? t = a(c(e)) : p("Cannot decode part ", e.l.slice(e.t, e.t + 10));
return t;
}, _ = (e, t, s, l) => {
let r, i = typeof e;
if (i === "number")
t.push(isFinite(e) ? e.toString() : s ? isNaN(e) ? "_n" : e > 0 ? "_I" : "_J" : g);
else if (i === "boolean")
t.push(e ? "" : "_F");
else if (i === "string")
r = I(e), S.test(r) ? t.push(r) : t.push("*" + r);
else if (i === "object")
if (e)
if (s && e instanceof Date)
t.push("_D" + e.toJSON().replace("T00:00:00.000Z", ""));
else if (typeof e.toJSON == "function")
_(e.toJSON(), t, s, l);
else if (Array.isArray(e)) {
t.push("!");
for (let n = 0; n < e.length; n++)
r = e[n], r === !0 ? t.push("_T") : _(r, t, s, l + 1);
t.push("");
} else {
t.push("(");
for (const n of Object.keys(e))
r = e[n], r !== void 0 && typeof r != "function" && (t.push(I(n)), _(r, t, s, l + 1));
for (; t[t.length - 1] === ""; )
t.pop();
t.push(")");
}
else
t.push(g);
else
t.push(s || l === 0 ? "_U" : g);
}, w = { true: "*true", false: "*false", null: "*null" }, m = (e, t) => {
let s, l = [], r = "", i = !1, n = t?.short, o = t?.rich;
_(e, l, o, 0);
let u = l.length;
do
s = l[--u];
while (s === "" || n && s === ")");
for (let N = 0; u >= N; N++)
s = l[N], i && s !== ")" && (r += "~"), r += s, i = !(s === "!" || s === "(" || s === ")");
return n ? 6 > r.length && (s = w[r], s && (r = s)) : r += "~", r;
}, R = /^({|\[|"|true$|false$|null$)/, Z = (e, t) => {
if (t && t.deURI && (e = ((r) => {
let i, n = "", o = 0, u = 0;
for (; o < r.length; )
i = r.charCodeAt(o), i === 37 ? (o > u && (n += r.slice(u, o)), r = decodeURIComponent(r.slice(o)), o = u = 0) : i === 32 || i === 10 || i === 13 || i === 0 || i === 8232 || i === 8233 ? (o > u && (n += r.slice(u, o)), o++, u = o) : o++;
return o > u && (n += r.slice(u, o)), n;
})(e)), R.test(e))
return JSON.parse(e);
const s = e.length, l = d({ l: e, t: 0, o: s });
return l === U || l;
}, E = (e, t, s) => {
try {
return Z(e, s);
} catch {
return t;
}
};
export {
Z as parse,
m as stringify,
E as tryParse
};
//# sourceMappingURL=index.mjs.map