@manyducks.co/dolla 2.0.0-alpha.61 → 2.0.0-alpha.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +20 -26
  2. package/dist/core/context.d.ts +23 -4
  3. package/dist/core/index.d.ts +5 -3
  4. package/dist/core/markup.d.ts +6 -11
  5. package/dist/core/nodes/dynamic.d.ts +3 -3
  6. package/dist/core/nodes/element.d.ts +2 -0
  7. package/dist/core/nodes/repeat.d.ts +1 -1
  8. package/dist/core/nodes/view.d.ts +4 -4
  9. package/dist/core/scheduler.d.ts +17 -0
  10. package/dist/core/signals.d.ts +48 -14
  11. package/dist/core/views/default-crash-view.d.ts +1 -1
  12. package/dist/core/views/for.d.ts +23 -0
  13. package/dist/core/views/show.d.ts +26 -0
  14. package/dist/hooks/index.d.ts +5 -8
  15. package/dist/hooks.js +26 -31
  16. package/dist/hooks.js.map +1 -1
  17. package/dist/i18n.js +23 -23
  18. package/dist/i18n.js.map +1 -1
  19. package/dist/index.js +69 -53
  20. package/dist/index.js.map +1 -1
  21. package/dist/jsx-dev-runtime.js +1 -1
  22. package/dist/jsx-runtime.js +1 -1
  23. package/dist/logger-B7RBYtzP.js +82 -0
  24. package/dist/logger-B7RBYtzP.js.map +1 -0
  25. package/dist/{markup-CX27GJ1M.js → markup-CW_lWDfq.js} +410 -325
  26. package/dist/markup-CW_lWDfq.js.map +1 -0
  27. package/dist/router/router.d.ts +10 -5
  28. package/dist/{router-CjCkk4dA.js → router-CBGsADQ4.js} +100 -100
  29. package/dist/router-CBGsADQ4.js.map +1 -0
  30. package/dist/router.js +1 -1
  31. package/dist/{signals-gCwiIe5X.js → signals-DbDmN2gr.js} +190 -161
  32. package/dist/signals-DbDmN2gr.js.map +1 -0
  33. package/docs/signals.md +16 -14
  34. package/notes/scratch.md +23 -1
  35. package/package.json +3 -2
  36. package/dist/logger-Bl496yfY.js +0 -91
  37. package/dist/logger-Bl496yfY.js.map +0 -1
  38. package/dist/markup-CX27GJ1M.js.map +0 -1
  39. package/dist/router-CjCkk4dA.js.map +0 -1
  40. package/dist/signals-gCwiIe5X.js.map +0 -1
@@ -1,28 +1,28 @@
1
- var et = Object.defineProperty;
2
- var V = (n) => {
1
+ var rt = Object.defineProperty;
2
+ var B = (n) => {
3
3
  throw TypeError(n);
4
4
  };
5
- var rt = (n, t, e) => t in n ? et(n, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[t] = e;
6
- var P = (n, t, e) => rt(n, typeof t != "symbol" ? t + "" : t, e), C = (n, t, e) => t.has(n) || V("Cannot " + e);
7
- var l = (n, t, e) => (C(n, t, "read from private field"), e ? e.call(n) : t.get(n)), b = (n, t, e) => t.has(n) ? V("Cannot add the same private member more than once") : t instanceof WeakSet ? t.add(n) : t.set(n, e), M = (n, t, e, r) => (C(n, t, "write to private field"), r ? r.call(n, e) : t.set(n, e), e), g = (n, t, e) => (C(n, t, "access private method"), e);
5
+ var nt = (n, t, e) => t in n ? rt(n, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[t] = e;
6
+ var L = (n, t, e) => nt(n, typeof t != "symbol" ? t + "" : t, e), C = (n, t, e) => t.has(n) || B("Cannot " + e);
7
+ var l = (n, t, e) => (C(n, t, "read from private field"), e ? e.call(n) : t.get(n)), b = (n, t, e) => t.has(n) ? B("Cannot add the same private member more than once") : t instanceof WeakSet ? t.add(n) : t.set(n, e), S = (n, t, e, r) => (C(n, t, "write to private field"), r ? r.call(n, e) : t.set(n, e), e), g = (n, t, e) => (C(n, t, "access private method"), e);
8
8
  var D = (n, t, e, r) => ({
9
9
  set _(a) {
10
- M(n, t, a, e);
10
+ S(n, t, a, e);
11
11
  },
12
12
  get _() {
13
13
  return l(n, t, r);
14
14
  }
15
15
  });
16
- import { c as nt } from "./logger-Bl496yfY.js";
17
- import { D as st, V as it, m as at, b as ot } from "./markup-CX27GJ1M.js";
18
- import { $ as R, d as ct, s as B, u as H, b as lt } from "./signals-gCwiIe5X.js";
19
- import { d as ht, e as X, c as G, f as ft, g as J, i as ut, b as U, h as pt } from "./typeChecking-CbltMOUt.js";
16
+ import { c as st } from "./logger-B7RBYtzP.js";
17
+ import { D as it, V as at, m as ot, d as ct } from "./markup-CW_lWDfq.js";
18
+ import { w as F, m as A, d as lt, s as H, u as J, b as ht } from "./signals-DbDmN2gr.js";
19
+ import { d as ft, e as Y, c as G, f as ut, g as X, i as pt, b as U, h as dt } from "./typeChecking-CbltMOUt.js";
20
20
  function O(n) {
21
- return X(n, "Expected `path` to be a string. Got type: %t, value: %v"), n.split("/").map((t) => t.trim()).filter((t) => t !== "");
21
+ return Y(n, "Expected `path` to be a string. Got type: %t, value: %v"), n.split("/").map((t) => t.trim()).filter((t) => t !== "");
22
22
  }
23
23
  function N(n) {
24
24
  var e;
25
- ht(
25
+ ft(
26
26
  (r) => G(r == null ? void 0 : r.toString),
27
27
  n,
28
28
  "Expected `parts` to be an array of objects with a .toString() method. Got type: %t, value: %v"
@@ -36,7 +36,7 @@ function N(n) {
36
36
  return t ?? "";
37
37
  }
38
38
  function T(n, t) {
39
- if (X(n, "Expected `base` to be a string. Got type: %t, value: %v"), t == null && (t = n, n = ""), t.startsWith("/"))
39
+ if (Y(n, "Expected `base` to be a string. Got type: %t, value: %v"), t == null && (t = n, n = ""), t.startsWith("/"))
40
40
  return t;
41
41
  let e = n;
42
42
  for (; ; )
@@ -52,7 +52,7 @@ function T(n, t) {
52
52
  break;
53
53
  return N([e, t]);
54
54
  }
55
- function dt(n) {
55
+ function mt(n) {
56
56
  if (!n) return {};
57
57
  n.startsWith("?") && (n = n.slice(1));
58
58
  const t = n.split("&").filter((e) => e.trim() !== "").map(
@@ -60,7 +60,7 @@ function dt(n) {
60
60
  );
61
61
  return Object.fromEntries(t);
62
62
  }
63
- function Y(n, t, e = {}) {
63
+ function Z(n, t, e = {}) {
64
64
  var s;
65
65
  const [r, a] = t.split("?"), i = O(r);
66
66
  t: for (const h of n) {
@@ -101,12 +101,12 @@ function Y(n, t, e = {}) {
101
101
  path: "/" + f.map((c) => c.value).join("/"),
102
102
  pattern: "/" + o.map((c) => c.type === 2 ? `{${c.name}}` : c.type === 4 ? `{#${c.name}}` : c.name).join("/"),
103
103
  params: p,
104
- query: dt(a),
104
+ query: mt(a),
105
105
  meta: h.meta
106
106
  };
107
107
  }
108
108
  }
109
- function mt(n) {
109
+ function wt(n) {
110
110
  const t = [], e = [], r = [], a = [];
111
111
  for (const s of n) {
112
112
  const { fragments: h } = s;
@@ -124,7 +124,7 @@ function mt(n) {
124
124
  const i = (s, h) => s.fragments.length > h.fragments.length ? -1 : 1;
125
125
  return t.sort(i), e.sort(i), r.sort(i), a.sort(i), [...t, ...e, ...r, ...a];
126
126
  }
127
- function wt(n) {
127
+ function yt(n) {
128
128
  const t = O(n), e = [];
129
129
  for (let r = 0; r < t.length; r++) {
130
130
  const a = t[r];
@@ -148,8 +148,8 @@ function wt(n) {
148
148
  }
149
149
  return e;
150
150
  }
151
- const yt = /(noopener|noreferrer) (noopener|noreferrer)/, gt = /^[\w-_]+:/;
152
- function bt(n, t, e = window) {
151
+ const gt = /(noopener|noreferrer) (noopener|noreferrer)/, bt = /^[\w-_]+:/;
152
+ function vt(n, t, e = window) {
153
153
  function r(i) {
154
154
  return !i || i === n ? null : i.localName !== "a" || i.href === void 0 ? r(i.parentNode) : i;
155
155
  }
@@ -157,7 +157,7 @@ function bt(n, t, e = window) {
157
157
  if (i.button && i.button !== 0 || i.ctrlKey || i.metaKey || i.altKey || i.shiftKey || i.defaultPrevented)
158
158
  return;
159
159
  const s = r(i.target);
160
- s && (e.location.protocol !== s.protocol || e.location.hostname !== s.hostname || e.location.port !== s.port || s.hasAttribute("data-router-ignore") || s.hasAttribute("download") || s.getAttribute("target") === "_blank" && yt.test(s.getAttribute("rel")) || gt.test(s.getAttribute("href")) || (i.preventDefault(), t(s)));
160
+ s && (e.location.protocol !== s.protocol || e.location.hostname !== s.hostname || e.location.port !== s.port || s.hasAttribute("data-router-ignore") || s.hasAttribute("download") || s.getAttribute("target") === "_blank" && gt.test(s.getAttribute("rel")) || bt.test(s.getAttribute("href")) || (i.preventDefault(), t(s)));
161
161
  }
162
162
  return n.addEventListener("click", a), function() {
163
163
  n.removeEventListener("click", a);
@@ -170,17 +170,17 @@ function $t(n, t) {
170
170
  }
171
171
  return n;
172
172
  }
173
- const vt = Symbol(), kt = Symbol();
174
- var S, I, v, j, Q, x, k, L, $, w, Z, _, tt, W, F, K;
175
- class xt {
173
+ const kt = Symbol(), Et = Symbol();
174
+ var R, I, $, P, Q, j, k, M, v, w, _, tt, et, W, K, z;
175
+ class At {
176
176
  constructor(t) {
177
177
  b(this, w);
178
- b(this, S, nt("dolla.router"));
178
+ b(this, R, st("dolla.router"));
179
179
  b(this, I, 0);
180
- b(this, v, []);
181
- b(this, j, []);
180
+ b(this, $, []);
181
+ b(this, P, []);
182
182
  b(this, Q, !1);
183
- b(this, x);
183
+ b(this, j);
184
184
  /**
185
185
  * Use hash routing when true. Configured in router options.
186
186
  */
@@ -188,17 +188,17 @@ class xt {
188
188
  /**
189
189
  * Cleanup functions to call on unmount.
190
190
  */
191
- b(this, L, []);
191
+ b(this, M, []);
192
192
  /**
193
193
  * The current match object (internal).
194
194
  */
195
- b(this, $, R());
195
+ b(this, v, F());
196
196
  /**
197
197
  * The current match object.
198
198
  */
199
- P(this, "$match", R(
199
+ L(this, "$match", A(
200
200
  () => {
201
- const t = l(this, $).call(this);
201
+ const t = l(this, v).call(this);
202
202
  if (t)
203
203
  return {
204
204
  path: t.path,
@@ -208,67 +208,67 @@ class xt {
208
208
  data: t.meta.data ?? {}
209
209
  };
210
210
  },
211
- { equals: ct }
211
+ { equals: lt }
212
212
  ));
213
213
  /**
214
214
  * The currently matched route pattern, if any.
215
215
  */
216
- P(this, "$pattern", R(() => {
216
+ L(this, "$pattern", A(() => {
217
217
  var t;
218
- return (t = l(this, $).call(this)) == null ? void 0 : t.pattern;
218
+ return (t = l(this, v).call(this)) == null ? void 0 : t.pattern;
219
219
  }));
220
220
  /**
221
221
  * The current URL path.
222
222
  */
223
- P(this, "$path", R(() => {
223
+ L(this, "$path", A(() => {
224
224
  var t;
225
- return ((t = l(this, $).call(this)) == null ? void 0 : t.path) ?? window.location.pathname;
225
+ return ((t = l(this, v).call(this)) == null ? void 0 : t.path) ?? window.location.pathname;
226
226
  }));
227
227
  /**
228
228
  * The current named path params.
229
229
  */
230
- P(this, "$params", R(() => {
230
+ L(this, "$params", A(() => {
231
231
  var t;
232
- return ((t = l(this, $).call(this)) == null ? void 0 : t.params) ?? {};
233
- }, { equals: B }));
232
+ return ((t = l(this, v).call(this)) == null ? void 0 : t.params) ?? {};
233
+ }, { equals: H }));
234
234
  /**
235
235
  * The current query params.
236
236
  */
237
- P(this, "$query", R(() => {
237
+ L(this, "$query", A(() => {
238
238
  var t;
239
- return ((t = l(this, $).call(this)) == null ? void 0 : t.query) ?? {};
240
- }, { equals: B }));
241
- ft(t, "Options must be an object. Got: %t"), t.hash && M(this, k, !0), M(this, j, mt(
242
- t.routes.flatMap((e) => g(this, w, K).call(this, e)).map((e) => ({
239
+ return ((t = l(this, v).call(this)) == null ? void 0 : t.query) ?? {};
240
+ }, { equals: H }));
241
+ ut(t, "Options must be an object. Got: %t"), t.hash && S(this, k, !0), S(this, P, wt(
242
+ t.routes.flatMap((e) => g(this, w, z).call(this, e)).map((e) => ({
243
243
  pattern: e.pattern,
244
244
  meta: e.meta,
245
- fragments: wt(e.pattern)
245
+ fragments: yt(e.pattern)
246
246
  }))
247
- )), Et(l(this, j));
247
+ )), qt(l(this, P));
248
248
  }
249
- async [vt](t, e) {
250
- const r = R();
251
- M(this, x, {
249
+ async [kt](t, e) {
250
+ const r = F();
251
+ S(this, j, {
252
252
  id: D(this, I)._++,
253
- node: new st(e, r),
253
+ node: new it(e, r),
254
254
  context: e,
255
- $slot: r
255
+ slot: r
256
256
  });
257
257
  const a = () => g(this, w, W).call(this);
258
- return window.addEventListener("popstate", a), l(this, L).push(() => window.removeEventListener("popstate", a)), l(this, L).push(
259
- bt(t, (i) => {
260
- l(this, S).info("intercepted click on <a> tag", i);
258
+ return window.addEventListener("popstate", a), l(this, M).push(() => window.removeEventListener("popstate", a)), l(this, M).push(
259
+ vt(t, (i) => {
260
+ l(this, R).info("intercepted click on <a> tag", i);
261
261
  const s = i.getAttribute("href"), h = i.getAttribute("data-router-preserve-query");
262
262
  this.go(s, {
263
- preserveQuery: qt(h)
263
+ preserveQuery: Rt(h)
264
264
  });
265
265
  })
266
- ), l(this, S).info("will intercept clicks on <a> tags within parent element:", t), M(this, Q, !0), await g(this, w, W).call(this), l(this, x).node;
266
+ ), l(this, R).info("will intercept clicks on <a> tags within parent element:", t), S(this, Q, !0), await g(this, w, W).call(this), l(this, j).node;
267
267
  }
268
- async [kt]() {
269
- for (const t of l(this, L))
268
+ async [Et]() {
269
+ for (const t of l(this, M))
270
270
  t();
271
- l(this, L).length = 0;
271
+ l(this, M).length = 0;
272
272
  }
273
273
  /**
274
274
  * Navigate backward. Pass a number of steps to hit the back button that many times.
@@ -291,13 +291,13 @@ class xt {
291
291
  */
292
292
  go(t, e = {}) {
293
293
  let r;
294
- Array.isArray(t) ? r = N(t) : r = t.toString(), r = T(window.location.pathname, r), e.replace ? g(this, w, _).call(this, r, e) : g(this, w, Z).call(this, r, e);
294
+ Array.isArray(t) ? r = N(t) : r = t.toString(), r = T(window.location.pathname, r), e.replace ? g(this, w, tt).call(this, r, e) : g(this, w, _).call(this, r, e);
295
295
  }
296
296
  /**
297
297
  * Updates query params, keeping existing ones and applying new ones. Removes the query param if value is set to `null`.
298
298
  */
299
299
  updateQuery(t) {
300
- const e = H(l(this, $)), r = { ...this.$query() };
300
+ const e = J(l(this, v)), r = { ...this.$query() };
301
301
  for (const s in t) {
302
302
  const h = t[s];
303
303
  h === null ? delete r[s] : r[s] = h.toString();
@@ -306,17 +306,17 @@ class xt {
306
306
  for (const s in r)
307
307
  a.push(`${s}=${r[s]}`);
308
308
  const i = a.length > 0 ? "?" + a.join("&") : "";
309
- l(this, $).call(this, { ...e, query: r }), window.history.replaceState(null, "", l(this, k) ? "/#" + e.path + i : e.path + i);
309
+ l(this, v).set({ ...e, query: r }), window.history.replaceState(null, "", l(this, k) ? "/#" + e.path + i : e.path + i);
310
310
  }
311
311
  }
312
- S = new WeakMap(), I = new WeakMap(), v = new WeakMap(), j = new WeakMap(), Q = new WeakMap(), x = new WeakMap(), k = new WeakMap(), L = new WeakMap(), $ = new WeakMap(), w = new WeakSet(), Z = function(t, e) {
313
- l(this, S).info("(push)", t), window.history.pushState(null, "", l(this, k) ? "/#" + t : t), g(this, w, W).call(this, t, e);
314
- }, _ = function(t, e) {
315
- l(this, S).info("(replace)", t), window.history.replaceState(null, "", l(this, k) ? "/#" + t : t), g(this, w, W).call(this, t, e);
316
- }, tt = function() {
312
+ R = new WeakMap(), I = new WeakMap(), $ = new WeakMap(), P = new WeakMap(), Q = new WeakMap(), j = new WeakMap(), k = new WeakMap(), M = new WeakMap(), v = new WeakMap(), w = new WeakSet(), _ = function(t, e) {
313
+ l(this, R).info("(push)", t), window.history.pushState(null, "", l(this, k) ? "/#" + t : t), g(this, w, W).call(this, t, e);
314
+ }, tt = function(t, e) {
315
+ l(this, R).info("(replace)", t), window.history.replaceState(null, "", l(this, k) ? "/#" + t : t), g(this, w, W).call(this, t, e);
316
+ }, et = function() {
317
317
  return l(this, k) ? new URL(window.location.hash.slice(1), window.location.origin) : new URL(window.location.pathname, window.location.origin);
318
318
  }, W = async function(t, e = {}) {
319
- const r = l(this, S), a = t ? new URL(t, window.location.origin) : g(this, w, tt).call(this), { match: i, journey: s, state: h } = await g(this, w, F).call(this, a);
319
+ const r = l(this, R), a = t ? new URL(t, window.location.origin) : g(this, w, et).call(this), { match: i, journey: s, state: h } = await g(this, w, K).call(this, a);
320
320
  for (let p = 0; p < s.length; p++) {
321
321
  const c = s[p], u = `(update: step ${p + 1} of ${s.length})`;
322
322
  switch (c.kind) {
@@ -333,13 +333,13 @@ S = new WeakMap(), I = new WeakMap(), v = new WeakMap(), j = new WeakMap(), Q =
333
333
  }
334
334
  if (!i) {
335
335
  if (l(this, Q))
336
- throw r.crash(new Rt(`Failed to match route '${a.pathname}'`));
336
+ throw r.crash(new St(`Failed to match route '${a.pathname}'`));
337
337
  return;
338
338
  }
339
339
  let o = i.query, d = [];
340
340
  if (e.preserveQuery === !0)
341
341
  o = Object.assign({}, this.$query(), i.query);
342
- else if (J(e.preserveQuery)) {
342
+ else if (X(e.preserveQuery)) {
343
343
  const p = {}, c = this.$query();
344
344
  for (const u in c)
345
345
  e.preserveQuery.includes(u) && (p[u] = c[u]);
@@ -348,10 +348,10 @@ S = new WeakMap(), I = new WeakMap(), v = new WeakMap(), j = new WeakMap(), Q =
348
348
  for (const p in o)
349
349
  d.push(`${p}=${o[p]}`);
350
350
  const f = d.length > 0 ? "?" + d.join("&") : "";
351
- return (i.path !== location.pathname || location.search !== f) && window.history.replaceState(null, "", l(this, k) ? "/#" + i.path + f : i.path + f), lt(() => {
352
- const p = H(this.$pattern);
353
- if (l(this, $).call(this, { ...i, query: o }), i.pattern === p) {
354
- for (const u of l(this, v)) {
351
+ return (i.path !== location.pathname || location.search !== f) && window.history.replaceState(null, "", l(this, k) ? "/#" + i.path + f : i.path + f), ht(() => {
352
+ const p = J(this.$pattern);
353
+ if (l(this, v).set({ ...i, query: o }), i.pattern === p) {
354
+ for (const u of l(this, $)) {
355
355
  const m = h.get(u.id);
356
356
  m && u.context.setState(m);
357
357
  }
@@ -360,28 +360,28 @@ S = new WeakMap(), I = new WeakMap(), v = new WeakMap(), j = new WeakMap(), Q =
360
360
  const c = i.meta.layers;
361
361
  r.info("mounting", i);
362
362
  for (let u = 0; u < c.length; u++) {
363
- const m = c[u], y = l(this, v)[u];
363
+ const m = c[u], y = l(this, $)[u];
364
364
  if ((y == null ? void 0 : y.id) !== m.id) {
365
- M(this, v, l(this, v).slice(0, u)), y == null || y.node.unmount();
366
- const E = l(this, v).at(-1) ?? l(this, x), q = R(), A = new it(E.context, m.view, {
367
- children: at(ot.Dynamic, { source: q })
368
- }), z = h.get(m.id);
369
- z && A.context.setState(z), l(this, v).push({
365
+ S(this, $, l(this, $).slice(0, u)), y == null || y.node.unmount();
366
+ const E = l(this, $).at(-1) ?? l(this, j), q = F(), x = new at(E.context, m.view, {
367
+ children: ot(ct.Dynamic, { source: q })
368
+ }), V = h.get(m.id);
369
+ V && x.context.setState(V), l(this, $).push({
370
370
  id: m.id,
371
- node: A,
372
- context: A.context,
373
- $slot: q
374
- }), E.$slot(A);
371
+ node: x,
372
+ context: x.context,
373
+ slot: q
374
+ }), E.slot.set(x);
375
375
  } else {
376
376
  const E = h.get(y.id);
377
377
  E && y.context.setState(E);
378
378
  }
379
379
  }
380
380
  }), { match: i, journey: s };
381
- }, F = async function(t, e = [], r = /* @__PURE__ */ new Map()) {
381
+ }, K = async function(t, e = [], r = /* @__PURE__ */ new Map()) {
382
382
  return new Promise((a, i) => {
383
383
  var d;
384
- const s = Y(l(this, j), t.pathname);
384
+ const s = Z(l(this, P), t.pathname);
385
385
  if (!s)
386
386
  return a({
387
387
  match: null,
@@ -408,7 +408,7 @@ S = new WeakMap(), I = new WeakMap(), v = new WeakMap(), j = new WeakMap(), Q =
408
408
  } else
409
409
  return i(new TypeError("Redirect must either be a path string or a function."));
410
410
  a(
411
- g(this, w, F).call(this, new URL(f, window.location.origin), [
411
+ g(this, w, K).call(this, new URL(f, window.location.origin), [
412
412
  ...e,
413
413
  { kind: "redirect", message: `redirecting '${s.path}' -> '${f}'` }
414
414
  ])
@@ -432,7 +432,7 @@ S = new WeakMap(), I = new WeakMap(), v = new WeakMap(), j = new WeakMap(), Q =
432
432
  data: s.meta.data ?? {},
433
433
  setState: (...y) => {
434
434
  const E = f[p].layerId, q = [];
435
- if (y.length === 1 && pt(J, y[0]))
435
+ if (y.length === 1 && dt(X, y[0]))
436
436
  q.push(...y[0]);
437
437
  else if (y.length === 2)
438
438
  q.push([y[0], y[1]]);
@@ -457,8 +457,8 @@ S = new WeakMap(), I = new WeakMap(), v = new WeakMap(), j = new WeakMap(), Q =
457
457
  * @param route - Route config object.
458
458
  * @param layers - Array of parent layers. Passed when this function calls itself on nested routes.
459
459
  */
460
- K = function(t, e = [], r = []) {
461
- if (!ut(t) || !U(t.path))
460
+ z = function(t, e = [], r = []) {
461
+ if (!pt(t) || !U(t.path))
462
462
  throw new TypeError(`Route configs must be objects with a 'path' string property. Got: ${t}`);
463
463
  if (t.redirect && t.routes)
464
464
  throw new Error("Route cannot have both a 'redirect' and nested 'routes'.");
@@ -490,7 +490,7 @@ K = function(t, e = [], r = []) {
490
490
  const h = { id: D(this, I)._++, view: s };
491
491
  if (t.routes)
492
492
  for (const o of t.routes)
493
- i.push(...g(this, w, K).call(this, o, [...e, t], [...r, h]));
493
+ i.push(...g(this, w, z).call(this, o, [...e, t], [...r, h]));
494
494
  else {
495
495
  const o = {
496
496
  pattern: e.length ? N([...e.map((d) => d.path), t.path]) : t.path,
@@ -509,12 +509,12 @@ K = function(t, e = [], r = []) {
509
509
  }
510
510
  return i;
511
511
  };
512
- function Et(n) {
512
+ function qt(n) {
513
513
  for (const t of n)
514
514
  if (t.meta.redirect) {
515
515
  let e;
516
516
  if (!G(t.meta.redirect)) if (U(t.meta.redirect)) {
517
- if (e = t.meta.redirect, !Y(n, e, {
517
+ if (e = t.meta.redirect, !Z(n, e, {
518
518
  willMatch(a) {
519
519
  return a !== t;
520
520
  }
@@ -524,7 +524,7 @@ function Et(n) {
524
524
  throw new TypeError(`Expected a string or redirect function. Got: ${t.meta.redirect}`);
525
525
  }
526
526
  }
527
- function qt(n) {
527
+ function Rt(n) {
528
528
  if (n === null)
529
529
  return !1;
530
530
  if (n === !0 || n === !1)
@@ -533,11 +533,11 @@ function qt(n) {
533
533
  return n = n.trim(), n === "" || n === "true" ? !0 : n === "false" ? !1 : n.split(",").map((t) => t.trim()).filter((t) => t.length > 0);
534
534
  throw new Error(`Invalid type for data-router-preserve-query attribute: ${typeof n} (value: ${n})`);
535
535
  }
536
- class Rt extends Error {
536
+ class St extends Error {
537
537
  }
538
538
  export {
539
- vt as M,
540
- xt as R,
541
- kt as U
539
+ kt as M,
540
+ At as R,
541
+ Et as U
542
542
  };
543
- //# sourceMappingURL=router-CjCkk4dA.js.map
543
+ //# sourceMappingURL=router-CBGsADQ4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-CBGsADQ4.js","sources":["../src/router/router.utils.ts","../src/router/router.ts"],"sourcesContent":["import { assertString, assertArrayOf, isFunction } from \"../typeChecking.js\";\n\nexport type RouteMatch<T = Record<string, any>> = {\n /**\n * The path string that triggered this match.\n */\n path: string;\n\n /**\n * The pattern satisfied by `path`.\n */\n pattern: string;\n\n /**\n * Named params as parsed from `path`.\n */\n params: Record<string, string>;\n\n /**\n * Query params as parsed from `path`.\n */\n query: Record<string, string>;\n\n /**\n * Metadata registered to this route.\n */\n meta: T;\n};\n\nexport enum FragTypes {\n Literal = 1,\n Param = 2,\n Wildcard = 3,\n NumericParam = 4,\n}\n\nexport type RouteFragment = {\n name: string;\n type: FragTypes;\n value: string | number | null;\n};\n\nexport type ParsedRoute<T> = {\n pattern: string;\n fragments: RouteFragment[];\n meta: T;\n};\n\nexport type RouteMatchOptions<T> = {\n willMatch?: (route: ParsedRoute<T>) => boolean;\n};\n\n/**\n * Separates a URL path into multiple fragments.\n *\n * @param path - A path string (e.g. `\"/api/users/5\"`)\n * @returns an array of fragments (e.g. `[\"api\", \"users\", \"5\"]`)\n */\nexport function splitPath(path: string): string[] {\n assertString(path, \"Expected `path` to be a string. Got type: %t, value: %v\");\n\n return path\n .split(\"/\")\n .map((f) => f.trim())\n .filter((f) => f !== \"\");\n}\n\n/**\n * Joins multiple URL path fragments into a single string.\n *\n * @param parts - One or more URL fragments (e.g. `[\"api\", \"users\", 5]`)\n * @returns a joined path (e.g. `\"api/users/5\"`)\n */\nexport function joinPath(parts: { toString(): string }[]): string {\n assertArrayOf(\n (part) => isFunction(part?.toString),\n parts,\n \"Expected `parts` to be an array of objects with a .toString() method. Got type: %t, value: %v\",\n );\n\n parts = parts.filter((x) => x).flatMap(String);\n\n let joined = parts.shift()?.toString();\n\n if (joined) {\n for (const part of parts.map((p) => p.toString())) {\n if (part.startsWith(\".\")) {\n // Resolve relative path against joined\n joined = resolvePath(joined, part);\n } else if (joined[joined.length - 1] !== \"/\") {\n if (part[0] !== \"/\") {\n joined += \"/\" + part;\n } else {\n joined += part;\n }\n } else {\n if (part[0] === \"/\") {\n joined += part.slice(1);\n } else {\n joined += part;\n }\n }\n }\n\n // Remove trailing slash (unless path is just '/')\n if (joined && joined !== \"/\" && joined.endsWith(\"/\")) {\n joined = joined.slice(0, joined.length - 1);\n }\n }\n\n return joined ?? \"\";\n}\n\nexport function resolvePath(base: string, part: string | null) {\n assertString(base, \"Expected `base` to be a string. Got type: %t, value: %v\");\n\n if (part == null) {\n part = base;\n base = \"\";\n }\n\n if (part.startsWith(\"/\")) {\n return part;\n }\n\n let resolved = base;\n\n while (true) {\n if (part.startsWith(\"..\")) {\n for (let i = resolved.length; i > 0; --i) {\n if (resolved[i] === \"/\" || i === 0) {\n resolved = resolved.slice(0, i);\n part = part.replace(/^\\.\\.\\/?/, \"\");\n break;\n }\n }\n } else if (part.startsWith(\".\")) {\n part = part.replace(/^\\.\\/?/, \"\");\n } else {\n break;\n }\n }\n\n return joinPath([resolved, part]);\n}\n\nexport function parseQueryParams(query: string): Record<string, string> {\n if (!query) return {};\n\n if (query.startsWith(\"?\")) {\n query = query.slice(1);\n }\n\n const entries = query\n .split(\"&\")\n .filter((x) => x.trim() !== \"\")\n .map((entry) =>\n entry\n .split(\"=\")\n .map((x) => x.trim())\n .slice(0, 2),\n );\n\n return Object.fromEntries(entries);\n}\n\n/**\n * Returns the nearest match, or undefined if the path matches no route.\n *\n * @param url - Path to match against routes.\n * @param options - Options to customize how matching operates.\n */\nexport function matchRoutes<T>(\n routes: ParsedRoute<T>[],\n url: string,\n options: RouteMatchOptions<T> = {},\n): RouteMatch<T> | undefined {\n const [path, query] = url.split(\"?\");\n const parts = splitPath(path);\n\n routes: for (const route of routes) {\n const { fragments } = route;\n const hasWildcard = fragments[fragments.length - 1]?.type === FragTypes.Wildcard;\n\n if (!hasWildcard && fragments.length !== parts.length) {\n continue routes;\n }\n\n if (options.willMatch && !options.willMatch(route)) {\n continue routes;\n }\n\n const matched: RouteFragment[] = [];\n\n fragments: for (let i = 0; i < fragments.length; i++) {\n const part = parts[i];\n const frag = fragments[i];\n\n if (part == null && frag.type !== FragTypes.Wildcard) {\n continue routes;\n }\n\n switch (frag.type) {\n case FragTypes.Literal:\n if (frag.name.toLowerCase() === part.toLowerCase()) {\n matched.push(frag);\n break;\n } else {\n continue routes;\n }\n case FragTypes.Param:\n matched.push({ ...frag, value: part });\n break;\n case FragTypes.Wildcard:\n matched.push({ ...frag, value: parts.slice(i).join(\"/\") });\n break fragments;\n case FragTypes.NumericParam:\n if (!isNaN(Number(part))) {\n matched.push({ ...frag, value: part });\n break;\n } else {\n continue routes;\n }\n default:\n throw new Error(`Unknown fragment type: ${frag.type}`);\n }\n }\n\n const params: Record<string, string> = {};\n\n for (const frag of matched) {\n if (frag.type === FragTypes.Param) {\n params[frag.name] = decodeURIComponent(frag.value as string);\n }\n\n if (frag.type === FragTypes.NumericParam) {\n params[frag.name] = String(frag.value);\n }\n\n if (frag.type === FragTypes.Wildcard) {\n params.wildcard = \"/\" + decodeURIComponent(frag.value as string);\n }\n }\n\n return {\n path: \"/\" + matched.map((f) => f.value).join(\"/\"),\n pattern:\n \"/\" +\n fragments\n .map((f) => {\n if (f.type === FragTypes.Param) {\n return `{${f.name}}`;\n }\n\n if (f.type === FragTypes.NumericParam) {\n return `{#${f.name}}`;\n }\n\n return f.name;\n })\n .join(\"/\"),\n params,\n query: parseQueryParams(query),\n meta: route.meta,\n };\n }\n}\n\n/**\n * Sort routes descending by specificity. Guarantees that the most specific route matches first\n * no matter the order in which they were added.\n *\n * Routes without named params and routes with more fragments are weighted more heavily.\n */\nexport function sortRoutes<T>(routes: ParsedRoute<T>[]): ParsedRoute<T>[] {\n const withoutParams = [];\n const withNumericParams = [];\n const withParams = [];\n const wildcard = [];\n\n for (const route of routes) {\n const { fragments } = route;\n\n if (fragments.some((f) => f.type === FragTypes.Wildcard)) {\n wildcard.push(route);\n } else if (fragments.some((f) => f.type === FragTypes.NumericParam)) {\n withNumericParams.push(route);\n } else if (fragments.some((f) => f.type === FragTypes.Param)) {\n withParams.push(route);\n } else {\n withoutParams.push(route);\n }\n }\n\n const bySizeDesc = (a: ParsedRoute<T>, b: ParsedRoute<T>) => {\n if (a.fragments.length > b.fragments.length) {\n return -1;\n } else {\n return 1;\n }\n };\n\n withoutParams.sort(bySizeDesc);\n withNumericParams.sort(bySizeDesc);\n withParams.sort(bySizeDesc);\n wildcard.sort(bySizeDesc);\n\n return [...withoutParams, ...withNumericParams, ...withParams, ...wildcard];\n}\n\n/**\n * Converts a route pattern into a set of matchable fragments.\n *\n * @param route - A route string (e.g. \"/api/users/{id}\")\n */\nexport function patternToFragments(pattern: string): RouteFragment[] {\n const parts = splitPath(pattern);\n const fragments = [];\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n\n if (part === \"*\") {\n if (i !== parts.length - 1) {\n throw new Error(`Wildcard must be at the end of a pattern. Received: ${pattern}`);\n }\n fragments.push({\n type: FragTypes.Wildcard,\n name: \"*\",\n value: null,\n });\n } else if (part.at(0) === \"{\" && part.at(-1) === \"}\") {\n fragments.push({\n type: part[1] === \"#\" ? FragTypes.NumericParam : FragTypes.Param,\n name: part[1] === \"#\" ? part.slice(2, -1) : part.slice(1, -1),\n value: null,\n });\n } else {\n fragments.push({\n type: FragTypes.Literal,\n name: part,\n value: part,\n });\n }\n }\n\n return fragments;\n}\n\nconst safeExternalLink = /(noopener|noreferrer) (noopener|noreferrer)/;\nconst protocolLink = /^[\\w-_]+:/;\n\n/**\n * Intercepts links within the root node.\n *\n * This is adapted from https://github.com/choojs/nanohref/blob/master/index.js\n *\n * @param root - Element under which to intercept link clicks\n * @param callback - Function to call when a click event is intercepted\n * @param _window - (optional) Override for global window object\n */\nexport function catchLinks(root: Element, callback: (anchor: HTMLAnchorElement) => void, _window = window) {\n function traverse(node: HTMLElement | null): HTMLAnchorElement | null {\n if (!node || node === root) {\n return null;\n }\n\n if (node.localName !== \"a\" || (node as any).href === undefined) {\n return traverse(node.parentNode as HTMLElement | null);\n }\n\n return node as HTMLAnchorElement;\n }\n\n function handler(e: MouseEvent) {\n if ((e.button && e.button !== 0) || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey || e.defaultPrevented) {\n return;\n }\n\n const anchor = traverse(e.target as HTMLElement);\n\n if (!anchor) {\n return;\n }\n\n if (\n _window.location.protocol !== anchor.protocol ||\n _window.location.hostname !== anchor.hostname ||\n _window.location.port !== anchor.port ||\n anchor.hasAttribute(\"data-router-ignore\") ||\n anchor.hasAttribute(\"download\") ||\n (anchor.getAttribute(\"target\") === \"_blank\" && safeExternalLink.test(anchor.getAttribute(\"rel\")!)) ||\n protocolLink.test(anchor.getAttribute(\"href\")!)\n ) {\n return;\n }\n\n e.preventDefault();\n callback(anchor);\n }\n\n root.addEventListener(\"click\", handler as any);\n\n return function cancel() {\n root.removeEventListener(\"click\", handler as any);\n };\n}\n\n/**\n * Replace route pattern param placeholders with real matched values.\n */\nexport function replaceParams(path: string, params: Record<string, string | number>) {\n for (const key in params) {\n const value = params[key].toString();\n path = path.replace(`{${key}}`, value).replace(`{#${key}}`, value);\n }\n\n return path;\n}\n","import { Context } from \"../core/context.js\";\nimport { createLogger } from \"../core/logger.js\";\nimport { m, MarkupType, type MarkupNode } from \"../core/markup.js\";\nimport { DynamicNode } from \"../core/nodes/dynamic.js\";\nimport { ViewNode } from \"../core/nodes/view.js\";\nimport { writable, memo, batch, untracked, type Writable, type Signal } from \"../core/signals.js\";\nimport { assertObject, isArray, isArrayOf, isFunction, isObject, isString } from \"../typeChecking.js\";\nimport type { View } from \"../types.js\";\nimport { deepEqual, shallowEqual } from \"../utils.js\";\nimport {\n catchLinks,\n joinPath,\n matchRoutes,\n patternToFragments,\n replaceParams,\n resolvePath,\n sortRoutes,\n splitPath,\n type ParsedRoute,\n type RouteMatch,\n} from \"./router.utils.js\";\n\n// ----- Types ----- //\n\nexport type Stringable = { toString(): string };\n\nexport interface Match {\n /**\n * The path as it appears in the URL bar.\n */\n path: string;\n\n /**\n * The pattern that this path was matched with.\n */\n pattern: string;\n\n /**\n * Named route params parsed from `path`.\n */\n params: Record<string, string>;\n\n /**\n * Query params parsed from `path`.\n */\n query: Record<string, string>;\n\n /**\n * Freeform data you wish to store with this route.\n * Merged `data` from all matched layers are available from `router.$match()`.\n */\n data: Record<string, any>;\n}\n\nexport interface RouteMatchContext extends Match {\n /**\n * Stores `value` at `key` in this context's state.\n */\n setState<T>(key: any, value: T): void;\n\n /**\n * For each tuple in `entries`, stores `value` at `key` in this context's state.\n */\n setState(entries: [key: any, value: any][]): void;\n\n /**\n * Redirects the user to a different route instead of matching the current one.\n */\n redirect(path: string): void;\n}\n\nexport interface Route {\n /**\n * The path or path fragment to match.\n */\n path: string;\n\n /**\n * Path to redirect to when this route is matched, or a callback function that returns such path.\n */\n redirect?: string | ((ctx: RouteRedirectContext) => string) | ((ctx: RouteRedirectContext) => Promise<string>);\n\n /**\n * View to display when this route is matched.\n */\n view?: View<any>;\n\n /**\n * Subroutes.\n */\n routes?: Route[];\n\n /**\n * Called after the match is identified but before it is acted on. Use this to set state, load data, etc.\n */\n beforeMatch?: (ctx: RouteMatchContext) => void | Promise<void>;\n\n /**\n * Arbitrary data you'd like to store on this route.\n * This object will be available at `router.$match` while the route is active.\n *\n * In the case of nested routes, data from all layers will be merged into a single data object.\n */\n data?: Record<string, any>;\n}\n\nexport interface RouteMeta {\n redirect?: string | ((ctx: RouteRedirectContext) => string) | ((ctx: RouteRedirectContext) => Promise<string>);\n pattern?: string;\n layers?: RouteLayer[];\n beforeMatch?: { fn: (ctx: RouteMatchContext) => void | Promise<void>; layerId: number }[];\n data?: Record<string, any>;\n}\n\nexport interface RouteConfig {\n pattern: string;\n meta: RouteMeta;\n}\n\nexport interface RouteLayer {\n id: number;\n view: View<{}>;\n}\n\n/**\n * An active route layer whose markup has been initialized into a view.\n */\ninterface ActiveLayer {\n id: number;\n node: MarkupNode;\n context: Context;\n slot: Writable<MarkupNode | undefined>;\n}\n\n/**\n * Object passed to redirect callbacks. Contains information useful for determining how to redirect.\n */\nexport interface RouteRedirectContext extends Match {}\n\n/**\n * A log for a single step in the route resolution process.\n */\ninterface JourneyStep {\n kind: \"match\" | \"redirect\" | \"miss\";\n message: string;\n}\n\nexport interface NavigateOptions {\n /**\n * Replace the current item in the history stack instead of adding a new one.\n * The back button will send the user to the page they visited before this. Defaults to false.\n */\n replace?: boolean;\n\n /**\n * Preserve existing query params (if any) when navigating. Defaults to false.\n * If true, all existing query params are preserved and merged with new ones.\n * If an array of strings is passed only those keys will be preserved, then merged with any new ones.\n */\n preserveQuery?: boolean | string[];\n}\n\nexport interface RouterOptions {\n routes: Route[];\n\n /**\n * When true, the router will construct routes like \"https://www.example.com/#/sub/route\" which work without any backend intervention.\n */\n hash?: boolean;\n}\n\n// ----- Code ----- //\n\nexport const MOUNT = Symbol();\nexport const UNMOUNT = Symbol();\nexport const ROOT_VIEW = Symbol();\n\nexport class Router {\n #logger = createLogger(\"dolla.router\");\n\n #nextLayerId = 0;\n #activeLayers: ActiveLayer[] = [];\n #routes: ParsedRoute<RouteMeta>[] = [];\n\n #isMounted = false;\n\n #rootLayer!: ActiveLayer;\n\n /**\n * Use hash routing when true. Configured in router options.\n */\n #hash = false;\n\n /**\n * Cleanup functions to call on unmount.\n */\n #cleanup: (() => void)[] = [];\n\n /**\n * The current match object (internal).\n */\n #match = writable<RouteMatch>();\n\n /**\n * The current match object.\n */\n readonly $match = memo<Match | undefined>(\n () => {\n const match = this.#match();\n if (match) {\n return {\n path: match.path,\n pattern: match.pattern,\n params: { ...match.params },\n query: { ...match.query },\n data: match.meta.data ?? {},\n };\n }\n },\n { equals: deepEqual },\n );\n\n /**\n * The currently matched route pattern, if any.\n */\n readonly $pattern = memo(() => this.#match()?.pattern);\n\n /**\n * The current URL path.\n */\n readonly $path = memo(() => this.#match()?.path ?? window.location.pathname);\n\n /**\n * The current named path params.\n */\n readonly $params = memo(() => this.#match()?.params ?? {}, { equals: shallowEqual });\n\n /**\n * The current query params.\n */\n readonly $query = memo(() => this.#match()?.query ?? {}, { equals: shallowEqual });\n\n constructor(options: RouterOptions) {\n assertObject(options, \"Options must be an object. Got: %t\");\n\n if (options.hash) {\n this.#hash = true;\n }\n\n // Add routes.\n this.#routes = sortRoutes(\n options.routes\n .flatMap((route) => this.#prepareRoute(route))\n .map((route) => ({\n pattern: route.pattern,\n meta: route.meta,\n fragments: patternToFragments(route.pattern),\n })),\n );\n\n assertValidRedirects(this.#routes);\n }\n\n async [MOUNT](parent: Element, context: Context): Promise<MarkupNode> {\n const slot = writable<MarkupNode>();\n this.#rootLayer = {\n id: this.#nextLayerId++,\n node: new DynamicNode(context, slot),\n context,\n slot,\n };\n\n // Listen for popstate events and update route accordingly.\n const onPopState = () => this.#updateRoute();\n window.addEventListener(\"popstate\", onPopState);\n this.#cleanup.push(() => window.removeEventListener(\"popstate\", onPopState));\n\n // Listen for clicks on <a> tags within the app.\n this.#cleanup.push(\n catchLinks(parent, (anchor) => {\n this.#logger.info(\"intercepted click on <a> tag\", anchor);\n\n const href = anchor.getAttribute(\"href\")!;\n const preserveQuery = anchor.getAttribute(\"data-router-preserve-query\");\n\n this.go(href, {\n preserveQuery: parsePreserveQueryAttribute(preserveQuery),\n });\n }),\n );\n this.#logger.info(\"will intercept clicks on <a> tags within parent element:\", parent);\n\n this.#isMounted = true;\n\n // Mount initial route.\n await this.#updateRoute();\n\n return this.#rootLayer.node;\n }\n\n async [UNMOUNT]() {\n for (const callback of this.#cleanup) {\n callback();\n }\n this.#cleanup.length = 0;\n }\n\n /**\n * Navigate backward. Pass a number of steps to hit the back button that many times.\n */\n back(steps = 1) {\n window.history.go(-steps);\n }\n\n /**\n * Navigate forward. Pass a number of steps to hit the forward button that many times.\n */\n forward(steps = 1) {\n window.history.go(steps);\n }\n\n /**\n * Navigates to another route.\n *\n * @example\n * router.go(\"/login\"); // navigate to `/login`\n * router.go[\"/users\", 215], { replace: true }); // replace current history entry with `/users/215`\n */\n go(path: Stringable | Stringable[], options: NavigateOptions = {}) {\n let joined: string;\n\n if (Array.isArray(path)) {\n joined = joinPath(path);\n } else {\n joined = path.toString();\n }\n\n joined = resolvePath(window.location.pathname, joined);\n\n if (options.replace) {\n this.#replace(joined, options);\n } else {\n this.#push(joined, options);\n }\n }\n\n /**\n * Updates query params, keeping existing ones and applying new ones. Removes the query param if value is set to `null`.\n */\n updateQuery(values: Record<string, Stringable | null>) {\n const match = untracked(this.#match)!;\n const query = { ...this.$query() };\n\n for (const key in values) {\n const value = values[key];\n if (value === null) {\n delete query[key];\n } else {\n query[key] = value.toString();\n }\n }\n\n let queryParts: string[] = [];\n\n for (const key in query) {\n queryParts.push(`${key}=${query[key]}`);\n }\n const queryString = queryParts.length > 0 ? \"?\" + queryParts.join(\"&\") : \"\";\n\n this.#match.set({ ...match, query });\n\n window.history.replaceState(null, \"\", this.#hash ? \"/#\" + match.path + queryString : match.path + queryString);\n }\n\n #push(href: string, options: NavigateOptions) {\n this.#logger.info(\"(push)\", href);\n\n window.history.pushState(null, \"\", this.#hash ? \"/#\" + href : href);\n this.#updateRoute(href, options);\n }\n\n #replace(href: string, options: NavigateOptions) {\n this.#logger.info(\"(replace)\", href);\n\n window.history.replaceState(null, \"\", this.#hash ? \"/#\" + href : href);\n this.#updateRoute(href, options);\n }\n\n #getCurrentURL(): URL {\n if (this.#hash) {\n return new URL(window.location.hash.slice(1), window.location.origin);\n } else {\n return new URL(window.location.pathname, window.location.origin);\n }\n }\n\n /**\n * Run when the location changes. Diffs and mounts new routes and updates\n * the $path, $route, $params and $query states accordingly.\n */\n async #updateRoute(href?: string | undefined, options: NavigateOptions = {}) {\n const logger = this.#logger;\n const url = href ? new URL(href, window.location.origin) : this.#getCurrentURL();\n\n const { match, journey, state } = await this.#resolveRoute(url);\n\n for (let i = 0; i < journey.length; i++) {\n const step = journey[i];\n const tag = `(update: step ${i + 1} of ${journey.length})`;\n\n switch (step.kind) {\n case \"match\":\n logger?.info(`${tag} 📍 ${step.message}`);\n break;\n case \"redirect\":\n logger?.info(`${tag} ↩️ ${step.message}`);\n break;\n case \"miss\":\n logger?.info(`${tag} 💀 ${step.message}`);\n break;\n default:\n break;\n }\n }\n\n if (!match) {\n // Only crash if routing has been configured.\n if (this.#isMounted) {\n throw logger.crash(new NoRouteError(`Failed to match route '${url.pathname}'`));\n }\n return;\n }\n\n // Merge query params.\n let query = match.query;\n let queryParts: string[] = [];\n\n if (options.preserveQuery === true) {\n query = Object.assign({}, this.$query(), match.query);\n } else if (isArray(options.preserveQuery)) {\n const preserved: Record<string, any> = {};\n const current = this.$query();\n for (const key in current) {\n if (options.preserveQuery.includes(key)) {\n preserved[key] = current[key];\n }\n }\n query = Object.assign({}, preserved, match.query);\n }\n\n for (const key in query) {\n queryParts.push(`${key}=${query[key]}`);\n }\n const queryString = queryParts.length > 0 ? \"?\" + queryParts.join(\"&\") : \"\";\n\n // Update the URL if matched path differs from navigator path.\n // This happens if route resolution involved redirects.\n if (match.path !== location.pathname || location.search !== queryString) {\n window.history.replaceState(null, \"\", this.#hash ? \"/#\" + match.path + queryString : match.path + queryString);\n }\n\n // Run in batch so all new layers are mounted simultaneously with match signal change.\n // This avoids the old route effects receiving new signal values just before they unmount.\n batch(() => {\n const oldPattern = untracked(this.$pattern);\n\n this.#match.set({ ...match, query });\n\n if (match.pattern === oldPattern) {\n // If pattern has not changed, update state on current layers.\n for (const layer of this.#activeLayers) {\n const stateEntries = state.get(layer.id);\n if (stateEntries) {\n layer.context.setState(stateEntries);\n }\n }\n return;\n }\n\n const layers = match.meta.layers!;\n logger.info(\"mounting\", match);\n\n // Diff and update route layers.\n for (let i = 0; i < layers.length; i++) {\n const matchedLayer = layers[i];\n const activeLayer = this.#activeLayers[i];\n\n if (activeLayer?.id !== matchedLayer.id) {\n // Discard all previously active layers starting at this depth.\n this.#activeLayers = this.#activeLayers.slice(0, i);\n activeLayer?.node.unmount();\n\n const parentLayer = this.#activeLayers.at(-1) ?? this.#rootLayer;\n\n // Create a $slot and element for this layer.\n const slot = writable<MarkupNode>();\n const node = new ViewNode(parentLayer.context, matchedLayer.view, {\n children: m(MarkupType.Dynamic, { source: slot }),\n });\n\n // Set state for new layer.\n const stateEntries = state.get(matchedLayer.id);\n if (stateEntries) {\n node.context.setState(stateEntries);\n }\n\n // TODO: Handle route suspense. Route views should be able to suspend route mounting until they have loaded their data.\n\n // const routeLoader = {\n // next() {},\n // error(err: Error) {},\n // };\n // node.context.setState(\"ROUTE_LOADER\", routeLoader);\n // TODO: Views will look for a ROUTE_LOADER on their own context and call next() on it if they find it.\n // This will complete the mounting of the route.\n\n // Add new layer to activeLayers.\n this.#activeLayers.push({\n id: matchedLayer.id,\n node,\n context: node.context,\n slot,\n });\n\n // Slot this layer into parent.\n parentLayer.slot.set(node);\n } else {\n // Update state for layers that are still active.\n const stateEntries = state.get(activeLayer.id);\n if (stateEntries) {\n activeLayer.context.setState(stateEntries);\n }\n }\n }\n });\n\n return { match, journey };\n }\n\n /**\n * Takes a URL and finds a match, following redirects.\n */\n async #resolveRoute(\n url: URL,\n journey: JourneyStep[] = [],\n state = new Map<number, [any, any][]>(),\n ): Promise<{\n match: RouteMatch<RouteMeta> | null;\n journey: JourneyStep[];\n state: Map<number, [any, any][]>; // map of layerId to state entries\n }> {\n return new Promise((resolve, reject) => {\n const match = matchRoutes(this.#routes, url.pathname);\n\n if (!match) {\n return resolve({\n match: null,\n journey: [...journey, { kind: \"miss\", message: `no match for '${url.pathname}'` }],\n state,\n });\n }\n\n let redirect = match.meta.redirect;\n\n const finalize = async () => {\n if (redirect != null) {\n let path: string;\n\n if (isString(redirect)) {\n path = replaceParams(redirect, match.params);\n } else if (isFunction(redirect)) {\n const redirectContext: RouteRedirectContext = {\n path: match.path,\n pattern: match.pattern,\n params: match.params,\n query: match.query,\n data: match.meta.data ?? {},\n };\n path = await redirect(redirectContext);\n if (!isString(path)) {\n return reject(new Error(`Redirect function must return a path to redirect to.`));\n }\n if (!path.startsWith(\"/\")) {\n // Not absolute. Resolve against matched path.\n path = resolvePath(match.path, path);\n }\n } else {\n return reject(new TypeError(`Redirect must either be a path string or a function.`));\n }\n\n resolve(\n this.#resolveRoute(new URL(path, window.location.origin), [\n ...journey,\n { kind: \"redirect\", message: `redirecting '${match.path}' -> '${path}'` },\n ]),\n );\n } else {\n resolve({ match, journey: [...journey, { kind: \"match\", message: `matched route '${match.path}'` }], state });\n }\n };\n\n if (match.meta.beforeMatch?.length) {\n const callbacks = match.meta.beforeMatch;\n let i = -1;\n const next = () => {\n i++;\n if (i === callbacks.length) {\n // Mount route\n finalize();\n } else {\n // Next callback\n let finalized = false;\n const result = callbacks[i].fn({\n path: match.path,\n pattern: match.pattern,\n params: match.params,\n query: match.query,\n data: match.meta.data ?? {},\n\n setState: (...args: any[]) => {\n const id = callbacks[i].layerId;\n const entries: [any, any][] = [];\n\n if (args.length === 1 && isArrayOf(isArray, args[0])) {\n entries.push(...(args[0] as [any, any][]));\n } else if (args.length === 2) {\n entries.push([args[0], args[1]]);\n } else {\n throw new Error(\"Invalid arguments.\");\n }\n\n const current = state.get(id);\n if (!current) {\n state.set(id, entries);\n } else {\n entries.push(...entries);\n }\n },\n\n redirect: (path) => {\n redirect = path;\n finalized = true;\n finalize();\n },\n });\n if (!finalized) {\n if (result instanceof Promise) {\n result.then(next);\n } else {\n next();\n }\n }\n }\n };\n\n next();\n\n // TODO: Show warning after timeout if next hasn't been called?\n } else {\n finalize();\n }\n });\n }\n\n /**\n * Parses a route definition object into a set of matchable routes.\n *\n * @param route - Route config object.\n * @param layers - Array of parent layers. Passed when this function calls itself on nested routes.\n */\n #prepareRoute(route: Route, parents: Route[] = [], layers: RouteLayer[] = []) {\n if (!isObject(route) || !isString(route.path)) {\n throw new TypeError(`Route configs must be objects with a 'path' string property. Got: ${route}`);\n }\n\n if (route.redirect && route.routes) {\n throw new Error(`Route cannot have both a 'redirect' and nested 'routes'.`);\n } else if (route.redirect && route.view) {\n throw new Error(`Route cannot have both a 'redirect' and a 'view'.`);\n } else if (!route.view && !route.routes && !route.redirect) {\n throw new Error(`Route must have a 'view', a 'redirect', or a set of nested 'routes'.`);\n }\n\n let parts: string[] = [];\n\n for (const parent of parents) {\n parts.push(...splitPath(parent.path));\n }\n\n parts.push(...splitPath(route.path));\n\n // Remove trailing wildcard for joining with nested routes.\n if (parts[parts.length - 1] === \"*\") {\n parts.pop();\n }\n\n const routes: RouteConfig[] = [];\n\n if (route.redirect) {\n let redirect = route.redirect;\n\n if (isString(redirect)) {\n redirect = resolvePath(joinPath(parts), redirect);\n\n if (!redirect.startsWith(\"/\")) {\n redirect = \"/\" + redirect;\n }\n }\n\n const config: RouteConfig = {\n pattern: \"/\" + joinPath([...parts, ...splitPath(route.path)]),\n meta: {\n redirect,\n },\n };\n routes.push(config);\n\n return routes;\n }\n\n let view: View<any> = (props: any) => props.children;\n\n if (isFunction(route.view)) {\n view = route.view;\n } else if (route.view) {\n throw new TypeError(`Route '${route.path}' expected a view function or undefined. Got: ${route.view}`);\n }\n\n const layer: RouteLayer = { id: this.#nextLayerId++, view };\n\n // Parse nested routes if they exist.\n if (route.routes) {\n for (const subroute of route.routes) {\n routes.push(...this.#prepareRoute(subroute, [...parents, route], [...layers, layer]));\n }\n } else {\n const config: RouteConfig = {\n pattern: parents.length ? joinPath([...parents.map((p) => p.path), route.path]) : route.path,\n meta: {\n pattern: route.path,\n layers: [...layers, layer],\n // Store the layer ID with each beforeMatch so we can correlate which context needs to get any state that is set.\n beforeMatch: parents\n .flatMap((parent, i) => (parent.beforeMatch ? { fn: parent.beforeMatch, layerId: layers[i].id } : null))\n .concat(route.beforeMatch ? { fn: route.beforeMatch, layerId: layer.id } : null)\n .filter((x) => x != null),\n },\n };\n if (route.data) {\n const parent = parents.at(-1);\n if (parent) {\n config.meta.data = { ...parent.data, ...route.data };\n } else {\n config.meta.data = route.data;\n }\n }\n routes.push(config);\n }\n\n return routes;\n }\n}\n\nfunction assertValidRedirects(routes: ParsedRoute<RouteMeta>[]) {\n // Test redirects to make sure all possible redirect targets actually exist.\n for (const route of routes) {\n if (route.meta.redirect) {\n let redirectPath: string;\n\n if (isFunction(route.meta.redirect)) {\n // throw new Error(`Redirect functions are not yet supported.`);\n // Just allow, though it could fail later. Best not to call the function and cause potential side effects.\n } else if (isString(route.meta.redirect)) {\n redirectPath = route.meta.redirect;\n\n const match = matchRoutes(routes, redirectPath, {\n willMatch(r) {\n return r !== route;\n },\n });\n\n if (!match) {\n throw new Error(`Found a redirect to an undefined URL. From '${route.pattern}' to '${route.meta.redirect}'`);\n }\n } else {\n throw new TypeError(`Expected a string or redirect function. Got: ${route.meta.redirect}`);\n }\n }\n }\n}\n\n/**\n * Parses the data-router-preserve-query attribute from a link.\n */\nfunction parsePreserveQueryAttribute(value: null | string | boolean): boolean | string[] {\n if (value === null) {\n return false;\n } else if (value === true || value === false) {\n return value;\n } else if (typeof value === \"string\") {\n value = value.trim();\n if (value === \"\" || value === \"true\") {\n return true;\n } else if (value === \"false\") {\n return false;\n }\n\n return value\n .split(\",\")\n .map((k) => k.trim())\n .filter((k) => k.length > 0);\n } else {\n throw new Error(`Invalid type for data-router-preserve-query attribute: ${typeof value} (value: ${value})`);\n }\n}\n\nclass NoRouteError extends Error {}\n"],"names":["splitPath","path","assertString","f","joinPath","parts","assertArrayOf","part","isFunction","x","joined","_a","p","resolvePath","base","resolved","i","parseQueryParams","query","entries","entry","matchRoutes","routes","url","options","route","fragments","matched","frag","params","sortRoutes","withoutParams","withNumericParams","withParams","wildcard","bySizeDesc","a","b","patternToFragments","pattern","safeExternalLink","protocolLink","catchLinks","root","callback","_window","traverse","node","handler","e","anchor","replaceParams","key","value","MOUNT","UNMOUNT","Router","__privateAdd","_Router_instances","_logger","createLogger","_nextLayerId","_activeLayers","_routes","_isMounted","_rootLayer","_hash","_cleanup","_match","writable","__publicField","memo","match","__privateGet","deepEqual","shallowEqual","assertObject","__privateSet","__privateMethod","prepareRoute_fn","assertValidRedirects","parent","context","slot","__privateWrapper","DynamicNode","onPopState","updateRoute_fn","href","preserveQuery","parsePreserveQueryAttribute","steps","replace_fn","push_fn","values","untracked","queryParts","queryString","getCurrentURL_fn","logger","journey","state","resolveRoute_fn","step","tag","NoRouteError","isArray","preserved","current","batch","oldPattern","layer","stateEntries","layers","matchedLayer","activeLayer","parentLayer","ViewNode","m","MarkupType","resolve","reject","redirect","finalize","isString","redirectContext","callbacks","next","finalized","result","args","id","isArrayOf","parents","isObject","config","view","props","subroute","redirectPath","r","k"],"mappings":"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"}
package/dist/router.js CHANGED
@@ -1,4 +1,4 @@
1
- import { R as e } from "./router-CjCkk4dA.js";
1
+ import { R as e } from "./router-CBGsADQ4.js";
2
2
  function o(r) {
3
3
  return new e(r);
4
4
  }