sly-svelte-router
Version:
A spa router for svelte based on the History API
578 lines (577 loc) • 13 kB
JavaScript
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
};