UNPKG

jsurl2

Version:

URL friendly JSON-like formatting and parsing

97 lines (96 loc) 4.08 kB
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