UNPKG

sly-svelte-router

Version:

A spa router for svelte based on the History API

578 lines (577 loc) 13 kB
var rt = Object.defineProperty; var ot = (t, e, n) => e in t ? rt(t, e, { enumerable: !0, configurable: !0, writable: !0, value: n }) : t[e] = n; var S = (t, e, n) => ot(t, typeof e != "symbol" ? e + "" : e, n); import { onDestroy as it } from "svelte"; function k() { } function ut(t, e) { for (const n in e) t[n] = e[n]; return ( /** @type {T & S} */ t ); } function X(t) { return t(); } function A() { return /* @__PURE__ */ Object.create(null); } function R(t) { t.forEach(X); } function Y(t) { return typeof t == "function"; } function ft(t, e) { return t != t ? e == e : t !== e || t && typeof t == "object" || typeof t == "function"; } function st(t) { return Object.keys(t).length === 0; } function ct(t, e, n, r) { if (t) { const i = Z(t, e, n, r); return t[0](i); } } function Z(t, e, n, r) { return t[1] && r ? ut(n.ctx.slice(), t[1](r(e))) : n.ctx; } function lt(t, e, n, r) { if (t[2] && r) { const i = t[2](r(n)); if (e.dirty === void 0) return i; if (typeof i == "object") { const o = [], u = Math.max(e.dirty.length, i.length); for (let c = 0; c < u; c += 1) o[c] = e.dirty[c] | i[c]; return o; } return e.dirty | i; } return e.dirty; } function at(t, e, n, r, i, o) { if (i) { const u = Z(e, n, r, o); t.p(u, i); } } function dt(t) { if (t.ctx.length > 32) { const e = [], n = t.ctx.length / 32; for (let r = 0; r < n; r++) e[r] = -1; return e; } return -1; } function ht(t, e) { t.appendChild(e); } function N(t, e, n) { t.insertBefore(e, n || null); } function b(t) { t.parentNode && t.parentNode.removeChild(t); } function tt(t) { return document.createTextNode(t); } function et() { return tt(" "); } function O() { return tt(""); } function _t(t) { return Array.from(t.childNodes); } function K(t, e) { return new t(e); } let T; function E(t) { T = t; } const v = [], V = []; let $ = []; const z = [], gt = /* @__PURE__ */ Promise.resolve(); let I = !1; function pt() { I || (I = !0, gt.then(nt)); } function P(t) { $.push(t); } const j = /* @__PURE__ */ new Set(); let w = 0; function nt() { if (w !== 0) return; const t = T; do { try { for (; w < v.length; ) { const e = v[w]; w++, E(e), mt(e.$$); } } catch (e) { throw v.length = 0, w = 0, e; } for (E(null), v.length = 0, w = 0; V.length; ) V.pop()(); for (let e = 0; e < $.length; e += 1) { const n = $[e]; j.has(n) || (j.add(n), n()); } $.length = 0; } while (v.length); for (; z.length; ) z.pop()(); I = !1, j.clear(), E(t); } function mt(t) { if (t.fragment !== null) { t.update(), R(t.before_update); const e = t.dirty; t.dirty = [-1], t.fragment && t.fragment.p(t.ctx, e), t.after_update.forEach(P); } } function yt(t) { const e = [], n = []; $.forEach((r) => t.indexOf(r) === -1 ? e.push(r) : n.push(r)), n.forEach((r) => r()), $ = e; } const C = /* @__PURE__ */ new Set(); let m; function B() { m = { r: 0, c: [], p: m // parent group }; } function D() { m.r || R(m.c), m = m.p; } function d(t, e) { t && t.i && (C.delete(t), t.i(e)); } function y(t, e, n, r) { if (t && t.o) { if (C.has(t)) return; C.add(t), m.c.push(() => { C.delete(t), r && (n && t.d(1), r()); }), t.o(e); } else r && r(); } function F(t) { t && t.c(); } function U(t, e, n) { const { fragment: r, after_update: i } = t.$$; r && r.m(e, n), P(() => { const o = t.$$.on_mount.map(X).filter(Y); t.$$.on_destroy ? t.$$.on_destroy.push(...o) : R(o), t.$$.on_mount = []; }), i.forEach(P); } function M(t, e) { const n = t.$$; n.fragment !== null && (yt(n.after_update), R(n.on_destroy), n.fragment && n.fragment.d(e), n.on_destroy = n.fragment = null, n.ctx = []); } function wt(t, e) { t.$$.dirty[0] === -1 && (v.push(t), pt(), t.$$.dirty.fill(0)), t.$$.dirty[e / 31 | 0] |= 1 << e % 31; } function vt(t, e, n, r, i, o, u = null, c = [-1]) { const f = T; E(t); const s = t.$$ = { fragment: null, ctx: [], // state props: o, update: k, not_equal: i, bound: A(), // lifecycle on_mount: [], on_destroy: [], on_disconnect: [], before_update: [], after_update: [], context: new Map(e.context || (f ? f.$$.context : [])), // everything else callbacks: A(), dirty: c, skip_bound: !1, root: e.target || f.$$.root }; u && u(s.root); let a = !1; if (s.ctx = n ? n(t, e.props || {}, (l, h, ...p) => { const _ = p.length ? p[0] : h; return s.ctx && i(s.ctx[l], s.ctx[l] = _) && (!s.skip_bound && s.bound[l] && s.bound[l](_), a && wt(t, l)), h; }) : [], s.update(), a = !0, R(s.before_update), s.fragment = r ? r(s.ctx) : !1, e.target) { if (e.hydrate) { const l = _t(e.target); s.fragment && s.fragment.l(l), l.forEach(b); } else s.fragment && s.fragment.c(); e.intro && d(t.$$.fragment), U(t, e.target, e.anchor), nt(); } E(f); } class kt { constructor() { /** * ### PRIVATE API * * Do not use, may change at any time * * @type {any} */ S(this, "$$"); /** * ### PRIVATE API * * Do not use, may change at any time * * @type {any} */ S(this, "$$set"); } /** @returns {void} */ $destroy() { M(this, 1), this.$destroy = k; } /** * @template {Extract<keyof Events, string>} K * @param {K} type * @param {((e: Events[K]) => void) | null | undefined} callback * @returns {() => void} */ $on(e, n) { if (!Y(n)) return k; const r = this.$$.callbacks[e] || (this.$$.callbacks[e] = []); return r.push(n), () => { const i = r.indexOf(n); i !== -1 && r.splice(i, 1); }; } /** * @param {Partial<Props>} props * @returns {void} */ $set(e) { this.$$set && !st(e) && (this.$$.skip_bound = !0, this.$$set(e), this.$$.skip_bound = !1); } } const bt = "4"; typeof window < "u" && (window.__svelte || (window.__svelte = { v: /* @__PURE__ */ new Set() })).v.add(bt); function G(t) { return document.title = /*currRoute*/ t[0].title, { c: k, m: k, d: k }; } function H(t) { let e, n, r, i, o = !/*currRoute*/ t[0].disableSlot && J(t); var u = ( /*currRoute*/ t[0].comp ); function c(f, s) { return {}; } return u && (n = K(u, c())), { c() { o && o.c(), e = et(), n && F(n.$$.fragment), r = O(); }, m(f, s) { o && o.m(f, s), N(f, e, s), n && U(n, f, s), N(f, r, s), i = !0; }, p(f, s) { if (/*currRoute*/ f[0].disableSlot ? o && (B(), y(o, 1, 1, () => { o = null; }), D()) : o ? (o.p(f, s), s & /*currRoute*/ 1 && d(o, 1)) : (o = J(f), o.c(), d(o, 1), o.m(e.parentNode, e)), s & /*currRoute*/ 1 && u !== (u = /*currRoute*/ f[0].comp)) { if (n) { B(); const a = n; y(a.$$.fragment, 1, 0, () => { M(a, 1); }), D(); } u ? (n = K(u, c()), F(n.$$.fragment), d(n.$$.fragment, 1), U(n, r.parentNode, r)) : n = null; } }, i(f) { i || (d(o), n && d(n.$$.fragment, f), i = !0); }, o(f) { y(o), n && y(n.$$.fragment, f), i = !1; }, d(f) { f && (b(e), b(r)), o && o.d(f), n && M(n, f); } }; } function J(t) { let e; const n = ( /*#slots*/ t[4].default ), r = ct( n, t, /*$$scope*/ t[3], null ); return { c() { r && r.c(); }, m(i, o) { r && r.m(i, o), e = !0; }, p(i, o) { r && r.p && (!e || o & /*$$scope*/ 8) && at( r, n, i, /*$$scope*/ i[3], e ? lt( n, /*$$scope*/ i[3], o, null ) : dt( /*$$scope*/ i[3] ), null ); }, i(i) { e || (d(r, i), e = !0); }, o(i) { y(r, i), e = !1; }, d(i) { r && r.d(i); } }; } function $t(t) { let e, n, r, i, o = ( /*currRoute*/ t[0] && G(t) ), u = ( /*currRoute*/ t[0] && H(t) ); return { c() { o && o.c(), e = O(), n = et(), u && u.c(), r = O(); }, m(c, f) { o && o.m(document.head, null), ht(document.head, e), N(c, n, f), u && u.m(c, f), N(c, r, f), i = !0; }, p(c, [f]) { /*currRoute*/ c[0] ? o || (o = G(c), o.c(), o.m(e.parentNode, e)) : o && (o.d(1), o = null), /*currRoute*/ c[0] ? u ? (u.p(c, f), f & /*currRoute*/ 1 && d(u, 1)) : (u = H(c), u.c(), d(u, 1), u.m(r.parentNode, r)) : u && (B(), y(u, 1, 1, () => { u = null; }), D()); }, i(c) { i || (d(u), i = !0); }, o(c) { y(u), i = !1; }, d(c) { c && (b(n), b(r)), o && o.d(c), b(e), u && u.d(c); } }; } function Et(t, e, n) { let { $$slots: r = {}, $$scope: i } = e, { routes: o } = e, { restrictions: u } = e; function c(s) { n(0, f = s); } let f = xt({ routes: o, restrictions: u, onRouteChanged: c, rewriteInvalid: !0 }); return t.$$set = (s) => { "routes" in s && n(1, o = s.routes), "restrictions" in s && n(2, u = s.restrictions), "$$scope" in s && n(3, i = s.$$scope); }, [f, o, u, i, r]; } class St extends kt { constructor(e) { super(), vt(this, e, Et, $t, ft, { routes: 1, restrictions: 2 }); } } let g, x, Rt; function L(t, e) { let n = g[Object.keys(g).find((r) => r === t) || Object.keys(g)[0]]; return n.data = e, n; } function Q(t, e) { let n = null, r = null, i = !1; for (let o of Object.keys(g)) if (n = g[o], n && t === n.path) { r = o; break; } return (!r || !n) && (r = Object.keys(g)[0], n = g[r], i = !0), n.data = e, { route: n, key: r, invalid: i }; } function jt(t, e) { function n(r) { r.preventDefault(), r.stopPropagation(), window.dispatchEvent(new CustomEvent("routing-url-changed", { detail: { url: t.href, data: e } })); } return t.addEventListener("click", n), { destroy() { t.removeEventListener("click", n); } }; } function Ot(t, e) { function n(r) { if (r.preventDefault(), r.stopPropagation(), !e) throw new Error("No route info given"); typeof e == "string" ? window.dispatchEvent(new CustomEvent("routing-changed", { detail: { key: e, changeState: "push" } })) : window.dispatchEvent(new CustomEvent("routing-changed", { detail: { ...e, changeState: "push" } })); } return t.addEventListener("click", n), { destroy() { t.removeEventListener("click", n); } }; } function It(t, e) { q( typeof t == "string" ? { key: t } : t, e === void 0 ? "push" : e ); } function Pt() { window.history.forward(), q({ key: window.history.state }); } function Bt() { window.history.back(), q({ key: window.history.state }); } function q(t, e) { window.dispatchEvent(new CustomEvent("routing-changed", { detail: { changeState: e, ...t } })); } function Ct(t) { var e; if (console.log("Checking restrictions for " + t.title), !x) return !1; for (let n of Object.keys(x)) if ((e = t.restrictions) != null && e.includes(n)) { const r = x[n](t); if (r) return r; } return !1; } function W(t, e) { const n = Ct(e); return n ? { route: L(n, e.data), key: n } : { key: t, route: e }; } function xt(t) { function e({ detail: { key: a, data: l, changeState: h } }) { i(a, L(a, l), h); } function n({ detail: { url: a, data: l, changeState: h } }) { const p = Q(a, l); i(p.key, p.route, h); } function r({ state: { key: a, data: l } }) { i(a, L(a, l)); } function i(a, l, h) { const { key: p, route: _ } = W(a, l); t.onRouteChanged(_), Rt = _, h && window.history[`${h}State`]({ key: p, data: _.data }, _.title, _.path); } window.addEventListener("routing-changed", e), window.addEventListener("routing-url-changed", n), window.addEventListener("popstate", r), it(() => { window.removeEventListener("routing-changed", e), window.removeEventListener("routing-url-changed", n), window.removeEventListener("popstate", r); }), g = t.routes, x = t.restrictions; const o = Q(window.location.pathname); let u = { ...W(o.key, o.route), invalid: o.invalid, prev: o.key }; t.onInvalidRoute && o.invalid && (u = { ...u, key: t.onInvalidRoute, route: L(t.onInvalidRoute), prev: o.key }); const { key: c, route: f, prev: s } = u; return window.history.replaceState({ key: c, data: f.data, prev: s }, f.title, f.path), f; } export { St as Router, xt as createRouter, Rt as currRoute, jt as default, Pt as goNext, Bt as goPrev, It as goTo, Ct as isRouteRestricted, jt as link, Ot as route };