@manyducks.co/dolla 2.0.0-alpha.30 → 2.0.0-alpha.32
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.
- package/README.md +2 -2
- package/dist/core/context.d.ts +12 -4
- package/dist/core/dolla.d.ts +17 -8
- package/dist/core/markup.d.ts +23 -2
- package/dist/core/nodes/view.d.ts +1 -2
- package/dist/core/store.d.ts +3 -9
- package/dist/core/symbols.d.ts +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +808 -797
- package/dist/index.js.map +1 -1
- package/dist/jsx-dev-runtime.js +2 -2
- package/dist/jsx-dev-runtime.js.map +1 -1
- package/dist/jsx-runtime.js +2 -2
- package/dist/jsx-runtime.js.map +1 -1
- package/dist/{passthrough-d2lcM0cd.js → markup-C-1VlVZi.js} +562 -592
- package/dist/markup-C-1VlVZi.js.map +1 -0
- package/dist/modules/router.d.ts +16 -6
- package/docs/i18n.md +2 -2
- package/docs/router.md +12 -9
- package/docs/state.md +2 -2
- package/docs/stores.md +5 -6
- package/docs/views.md +53 -67
- package/notes/scratch.md +135 -0
- package/notes/stores.md +14 -32
- package/package.json +1 -1
- package/build.js +0 -34
- package/dist/passthrough-d2lcM0cd.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,29 +1,430 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
1
|
+
var ue = Object.defineProperty;
|
|
2
|
+
var At = (o) => {
|
|
3
3
|
throw TypeError(o);
|
|
4
4
|
};
|
|
5
|
-
var
|
|
6
|
-
var d = (o,
|
|
7
|
-
var i = (o,
|
|
8
|
-
var
|
|
5
|
+
var fe = (o, t, e) => t in o ? ue(o, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : o[t] = e;
|
|
6
|
+
var d = (o, t, e) => fe(o, typeof t != "symbol" ? t + "" : t, e), Pt = (o, t, e) => t.has(o) || At("Cannot " + e);
|
|
7
|
+
var i = (o, t, e) => (Pt(o, t, "read from private field"), e ? e.call(o) : t.get(o)), l = (o, t, e) => t.has(o) ? At("Cannot add the same private member more than once") : t instanceof WeakSet ? t.add(o) : t.set(o, e), m = (o, t, e, s) => (Pt(o, t, "write to private field"), s ? s.call(o, e) : t.set(o, e), e), f = (o, t, e) => (Pt(o, t, "access private method"), e);
|
|
8
|
+
var st = (o, t, e, s) => ({
|
|
9
9
|
set _(n) {
|
|
10
|
-
m(o,
|
|
10
|
+
m(o, t, n, e);
|
|
11
11
|
},
|
|
12
12
|
get _() {
|
|
13
|
-
return i(o,
|
|
13
|
+
return i(o, t, s);
|
|
14
14
|
}
|
|
15
15
|
});
|
|
16
|
-
import {
|
|
17
|
-
import { F as
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
16
|
+
import { a as Zt, b as de, i as tt, I as te, c as me, d as Wt, e as x, s as Gt, f as v, g as et, P as ee, h as we, t as Bt, j as Ht, k as pe, l as zt, p as ge, m as Kt, S as ye, n as be, o as $e, q as Ee, r as ve, u as ke, C as Re, v as Qt, w as Jt, x as Se, y as vt, z as kt, V as _e, A as Le, B as Me, D as xe } from "./markup-C-1VlVZi.js";
|
|
17
|
+
import { F as ls, G as hs, E as cs } from "./markup-C-1VlVZi.js";
|
|
18
|
+
function nt(o) {
|
|
19
|
+
return Zt(o, "Expected `path` to be a string. Got type: %t, value: %v"), o.split("/").map((t) => t.trim()).filter((t) => t !== "");
|
|
20
|
+
}
|
|
21
|
+
function z(o) {
|
|
22
|
+
var e;
|
|
23
|
+
de(
|
|
24
|
+
(s) => tt(s == null ? void 0 : s.toString),
|
|
25
|
+
o,
|
|
26
|
+
"Expected `parts` to be an array of objects with a .toString() method. Got type: %t, value: %v"
|
|
27
|
+
), o = o.filter((s) => s).flatMap(String);
|
|
28
|
+
let t = (e = o.shift()) == null ? void 0 : e.toString();
|
|
29
|
+
if (t) {
|
|
30
|
+
for (const s of o.map((n) => n.toString()))
|
|
31
|
+
s.startsWith(".") ? t = Rt(t, s) : t[t.length - 1] !== "/" ? s[0] !== "/" ? t += "/" + s : t += s : s[0] === "/" ? t += s.slice(1) : t += s;
|
|
32
|
+
t && t !== "/" && t.endsWith("/") && (t = t.slice(0, t.length - 1));
|
|
33
|
+
}
|
|
34
|
+
return t ?? "";
|
|
35
|
+
}
|
|
36
|
+
function Rt(o, t) {
|
|
37
|
+
if (Zt(o, "Expected `base` to be a string. Got type: %t, value: %v"), t == null && (t = o, o = ""), t.startsWith("/"))
|
|
38
|
+
return t;
|
|
39
|
+
let e = o;
|
|
40
|
+
for (; ; )
|
|
41
|
+
if (t.startsWith("..")) {
|
|
42
|
+
for (let s = e.length; s > 0; --s)
|
|
43
|
+
if (e[s] === "/" || s === 0) {
|
|
44
|
+
e = e.slice(0, s), t = t.replace(/^\.\.\/?/, "");
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
} else if (t.startsWith("."))
|
|
48
|
+
t = t.replace(/^\.\/?/, "");
|
|
49
|
+
else
|
|
50
|
+
break;
|
|
51
|
+
return z([e, t]);
|
|
52
|
+
}
|
|
53
|
+
function De(o) {
|
|
54
|
+
if (!o) return {};
|
|
55
|
+
o.startsWith("?") && (o = o.slice(1));
|
|
56
|
+
const t = o.split("&").filter((e) => e.trim() !== "").map((e) => {
|
|
57
|
+
const [s, n] = e.split("=").map((r) => r.trim());
|
|
58
|
+
return n.toLowerCase() === "true" ? [s, !0] : n.toLowerCase() === "false" ? [s, !1] : isNaN(Number(n)) ? [s, n] : [s, Number(n)];
|
|
59
|
+
});
|
|
60
|
+
return Object.fromEntries(t);
|
|
61
|
+
}
|
|
62
|
+
function se(o, t, e = {}) {
|
|
63
|
+
var a;
|
|
64
|
+
const [s, n] = t.split("?"), r = nt(s);
|
|
65
|
+
t: for (const c of o) {
|
|
66
|
+
const { fragments: h } = c;
|
|
67
|
+
if (!(((a = h[h.length - 1]) == null ? void 0 : a.type) === 3) && h.length !== r.length || e.willMatch && !e.willMatch(c))
|
|
68
|
+
continue t;
|
|
69
|
+
const E = [];
|
|
70
|
+
e: for (let u = 0; u < h.length; u++) {
|
|
71
|
+
const F = r[u], R = h[u];
|
|
72
|
+
if (F == null && R.type !== 3)
|
|
73
|
+
continue t;
|
|
74
|
+
switch (R.type) {
|
|
75
|
+
case 1:
|
|
76
|
+
if (R.name.toLowerCase() === F.toLowerCase()) {
|
|
77
|
+
E.push(R);
|
|
78
|
+
break;
|
|
79
|
+
} else
|
|
80
|
+
continue t;
|
|
81
|
+
case 2:
|
|
82
|
+
E.push({ ...R, value: F });
|
|
83
|
+
break;
|
|
84
|
+
case 3:
|
|
85
|
+
E.push({ ...R, value: r.slice(u).join("/") });
|
|
86
|
+
break e;
|
|
87
|
+
case 4:
|
|
88
|
+
if (isNaN(Number(F)))
|
|
89
|
+
continue t;
|
|
90
|
+
E.push({ ...R, value: Number(F) });
|
|
91
|
+
break;
|
|
92
|
+
default:
|
|
93
|
+
throw new Error(`Unknown fragment type: ${R.type}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const k = {};
|
|
97
|
+
for (const u of E)
|
|
98
|
+
u.type === 2 && (k[u.name] = decodeURIComponent(u.value)), u.type === 4 && (k[u.name] = u.value), u.type === 3 && (k.wildcard = "/" + decodeURIComponent(u.value));
|
|
99
|
+
return {
|
|
100
|
+
path: "/" + E.map((u) => u.value).join("/"),
|
|
101
|
+
pattern: "/" + h.map((u) => u.type === 2 ? `{${u.name}}` : u.type === 4 ? `{#${u.name}}` : u.name).join("/"),
|
|
102
|
+
params: k,
|
|
103
|
+
query: De(n),
|
|
104
|
+
meta: c.meta
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function Fe(o) {
|
|
109
|
+
const t = [], e = [], s = [], n = [];
|
|
110
|
+
for (const a of o) {
|
|
111
|
+
const { fragments: c } = a;
|
|
112
|
+
c.some(
|
|
113
|
+
(h) => h.type === 3
|
|
114
|
+
/* Wildcard */
|
|
115
|
+
) ? n.push(a) : c.some(
|
|
116
|
+
(h) => h.type === 4
|
|
117
|
+
/* NumericParam */
|
|
118
|
+
) ? e.push(a) : c.some(
|
|
119
|
+
(h) => h.type === 2
|
|
120
|
+
/* Param */
|
|
121
|
+
) ? s.push(a) : t.push(a);
|
|
122
|
+
}
|
|
123
|
+
const r = (a, c) => a.fragments.length > c.fragments.length ? -1 : 1;
|
|
124
|
+
return t.sort(r), e.sort(r), s.sort(r), n.sort(r), [...t, ...e, ...s, ...n];
|
|
125
|
+
}
|
|
126
|
+
function Pe(o) {
|
|
127
|
+
const t = nt(o), e = [];
|
|
128
|
+
for (let s = 0; s < t.length; s++) {
|
|
129
|
+
const n = t[s];
|
|
130
|
+
if (n === "*") {
|
|
131
|
+
if (s !== t.length - 1)
|
|
132
|
+
throw new Error(`Wildcard must be at the end of a pattern. Received: ${o}`);
|
|
133
|
+
e.push({
|
|
134
|
+
type: 3,
|
|
135
|
+
name: "*",
|
|
136
|
+
value: null
|
|
137
|
+
});
|
|
138
|
+
} else n.at(0) === "{" && n.at(-1) === "}" ? e.push({
|
|
139
|
+
type: n[1] === "#" ? 4 : 2,
|
|
140
|
+
name: n[1] === "#" ? n.slice(2, -1) : n.slice(1, -1),
|
|
141
|
+
value: null
|
|
142
|
+
}) : e.push({
|
|
143
|
+
type: 1,
|
|
144
|
+
name: n,
|
|
145
|
+
value: n
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
return e;
|
|
149
|
+
}
|
|
150
|
+
function ss(o) {
|
|
151
|
+
return new Ne(o);
|
|
152
|
+
}
|
|
153
|
+
const re = Symbol.for("DollaRouterMountMethod"), ne = Symbol.for("DollaRouterUnmountMethod");
|
|
154
|
+
function Tt(o) {
|
|
155
|
+
return (o == null ? void 0 : o[te]) === !0;
|
|
156
|
+
}
|
|
157
|
+
async function Te(o, t) {
|
|
158
|
+
return o[re](t);
|
|
159
|
+
}
|
|
160
|
+
async function Oe(o) {
|
|
161
|
+
return o[ne]();
|
|
162
|
+
}
|
|
163
|
+
var Yt, K, L, _t, P, Q, it, I, q, T, at, p, Ot, ie, ae, rt, Nt, oe, Ut;
|
|
164
|
+
class Ne {
|
|
165
|
+
constructor(t) {
|
|
166
|
+
l(this, p);
|
|
167
|
+
d(this, Yt, !0);
|
|
168
|
+
l(this, K);
|
|
169
|
+
l(this, L);
|
|
170
|
+
l(this, _t, 0);
|
|
171
|
+
l(this, P, []);
|
|
172
|
+
l(this, Q, []);
|
|
173
|
+
l(this, it, !1);
|
|
174
|
+
/**
|
|
175
|
+
* Use hash routing when true. Configured in router options.
|
|
176
|
+
*/
|
|
177
|
+
l(this, I, !1);
|
|
178
|
+
// Callbacks that need to be called on unmount.
|
|
179
|
+
l(this, q, []);
|
|
180
|
+
/**
|
|
181
|
+
* The current match object.
|
|
182
|
+
*/
|
|
183
|
+
l(this, T);
|
|
184
|
+
l(this, at);
|
|
185
|
+
/**
|
|
186
|
+
* The currently matched route pattern, if any.
|
|
187
|
+
*/
|
|
188
|
+
d(this, "$pattern");
|
|
189
|
+
/**
|
|
190
|
+
* The current URL path.
|
|
191
|
+
*/
|
|
192
|
+
d(this, "$path");
|
|
193
|
+
/**
|
|
194
|
+
* The current named path params.
|
|
195
|
+
*/
|
|
196
|
+
d(this, "$params");
|
|
197
|
+
/**
|
|
198
|
+
* The current query params. Changes to this object will be reflected in the URL.
|
|
199
|
+
*/
|
|
200
|
+
d(this, "$query");
|
|
201
|
+
me(t, "Options must be an object. Got: %t"), [st(this, T)._, st(this, at)._] = Wt(), this.$pattern = x([i(this, T)], (e) => e == null ? void 0 : e.pattern), this.$path = x([i(this, T)], (e) => (e == null ? void 0 : e.path) ?? window.location.pathname), this.$params = x([i(this, T)], (e) => (e == null ? void 0 : e.params) ?? {}, { equals: Gt }), this.$query = x([i(this, T)], (e) => (e == null ? void 0 : e.query) ?? {}, { equals: Gt }), t.hash && m(this, I, !0), m(this, Q, Fe(
|
|
202
|
+
t.routes.flatMap((e) => f(this, p, Ut).call(this, e)).map((e) => ({
|
|
203
|
+
pattern: e.pattern,
|
|
204
|
+
meta: e.meta,
|
|
205
|
+
fragments: Pe(e.pattern)
|
|
206
|
+
}))
|
|
207
|
+
)), Ie(i(this, Q));
|
|
208
|
+
}
|
|
209
|
+
async [(Yt = te, re)](t) {
|
|
210
|
+
m(this, K, t), m(this, L, t.createLogger("Dolla.router"));
|
|
211
|
+
const e = () => {
|
|
212
|
+
f(this, p, rt).call(this);
|
|
213
|
+
};
|
|
214
|
+
window.addEventListener("popstate", e), i(this, q).push(() => window.removeEventListener("popstate", e));
|
|
215
|
+
const s = t.getRootElement();
|
|
216
|
+
i(this, q).push(
|
|
217
|
+
je(s, (n) => {
|
|
218
|
+
let r = n.getAttribute("href");
|
|
219
|
+
i(this, L).info("intercepted click on <a> tag", n), /^https?:\/\/|^\//.test(r) || (r = z([window.location.pathname, r])), f(this, p, Ot).call(this, r);
|
|
220
|
+
})
|
|
221
|
+
), i(this, L).info("will intercept clicks on <a> tags within root element", s), m(this, it, !0), await f(this, p, rt).call(this);
|
|
222
|
+
}
|
|
223
|
+
async [ne]() {
|
|
224
|
+
for (const t of i(this, q))
|
|
225
|
+
t();
|
|
226
|
+
m(this, q, []);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Navigate backward. Pass a number of steps to hit the back button that many times.
|
|
230
|
+
*/
|
|
231
|
+
back(t = 1) {
|
|
232
|
+
window.history.go(-t);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Navigate forward. Pass a number of steps to hit the forward button that many times.
|
|
236
|
+
*/
|
|
237
|
+
forward(t = 1) {
|
|
238
|
+
window.history.go(t);
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Navigates to another route.
|
|
242
|
+
*
|
|
243
|
+
* @example
|
|
244
|
+
* router.go("/login"); // navigate to `/login`
|
|
245
|
+
* router.go["/users", 215], { replace: true }); // replace current history entry with `/users/215`
|
|
246
|
+
*/
|
|
247
|
+
go(t, e = {}) {
|
|
248
|
+
if (i(this, K) == null)
|
|
249
|
+
throw new Error("Routa methods won't work until you register it: Dolla.use(Routa, { /* ...options */ })");
|
|
250
|
+
let s;
|
|
251
|
+
Array.isArray(t) ? s = z(t) : s = t.toString(), s = Rt(window.location.pathname, s), e.preserveQuery && (s += window.location.search), e.replace ? f(this, p, ie).call(this, s) : f(this, p, Ot).call(this, s);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
K = new WeakMap(), L = new WeakMap(), _t = new WeakMap(), P = new WeakMap(), Q = new WeakMap(), it = new WeakMap(), I = new WeakMap(), q = new WeakMap(), T = new WeakMap(), at = new WeakMap(), p = new WeakSet(), Ot = function(t, e) {
|
|
255
|
+
var s;
|
|
256
|
+
(s = i(this, L)) == null || s.info("(push)", t), window.history.pushState(e, "", i(this, I) ? "/#" + t : t), f(this, p, rt).call(this, t);
|
|
257
|
+
}, ie = function(t, e) {
|
|
258
|
+
var s;
|
|
259
|
+
(s = i(this, L)) == null || s.info("(replace)", t), window.history.replaceState(e, "", i(this, I) ? "/#" + t : t), f(this, p, rt).call(this, t);
|
|
260
|
+
}, ae = function() {
|
|
261
|
+
return i(this, I) ? new URL(window.location.hash.slice(1), window.location.origin) : new URL(window.location.pathname, window.location.origin);
|
|
262
|
+
}, rt = async function(t) {
|
|
263
|
+
var c;
|
|
264
|
+
const e = i(this, L), s = (c = i(this, K)) == null ? void 0 : c.getRootView(), n = t ? new URL(t, window.location.origin) : f(this, p, ae).call(this), { match: r, journey: a } = await f(this, p, Nt).call(this, n);
|
|
265
|
+
for (const h of a)
|
|
266
|
+
switch (h.kind) {
|
|
267
|
+
case "match":
|
|
268
|
+
e == null || e.info(`📍 ${h.message}`);
|
|
269
|
+
break;
|
|
270
|
+
case "redirect":
|
|
271
|
+
e == null || e.info(`↩️ ${h.message}`);
|
|
272
|
+
break;
|
|
273
|
+
case "miss":
|
|
274
|
+
e == null || e.info(`💀 ${h.message}`);
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
if (r) {
|
|
278
|
+
const h = this.$pattern.get();
|
|
279
|
+
i(this, at).call(this, r), s && r.pattern !== h && f(this, p, oe).call(this, s, r);
|
|
280
|
+
} else
|
|
281
|
+
i(this, it) && e.crash(new qe(`Failed to match route '${n.pathname}'`));
|
|
282
|
+
return { match: r, journey: a };
|
|
283
|
+
}, Nt = async function(t, e = []) {
|
|
284
|
+
const s = se(i(this, Q), t.pathname);
|
|
285
|
+
if (!s)
|
|
286
|
+
return {
|
|
287
|
+
match: null,
|
|
288
|
+
journey: [...e, { kind: "miss", message: `no match for '${t.pathname}'` }]
|
|
289
|
+
};
|
|
290
|
+
let n = s.meta.redirect;
|
|
291
|
+
if (s.meta.beforeMatch && await s.meta.beforeMatch({
|
|
292
|
+
// TODO: Allow setting context variables from here? Would apply to the context of the matched view.
|
|
293
|
+
redirect: (r) => {
|
|
294
|
+
n = r;
|
|
295
|
+
}
|
|
296
|
+
}), n != null) {
|
|
297
|
+
let r;
|
|
298
|
+
if (v(n))
|
|
299
|
+
r = Ve(n, s.params);
|
|
300
|
+
else if (tt(n)) {
|
|
301
|
+
const a = {
|
|
302
|
+
path: s.path,
|
|
303
|
+
pattern: s.pattern,
|
|
304
|
+
params: s.params,
|
|
305
|
+
query: s.query
|
|
306
|
+
};
|
|
307
|
+
if (r = await n(a), !v(r))
|
|
308
|
+
throw new Error("Redirect function must return a path to redirect to.");
|
|
309
|
+
r.startsWith("/") || (r = Rt(s.path, r));
|
|
310
|
+
} else
|
|
311
|
+
throw new TypeError("Redirect must either be a path string or a function.");
|
|
312
|
+
return f(this, p, Nt).call(this, new URL(r, window.location.origin), [
|
|
313
|
+
...e,
|
|
314
|
+
{ kind: "redirect", message: `redirecting '${s.path}' -> '${r}'` }
|
|
315
|
+
]);
|
|
316
|
+
} else
|
|
317
|
+
return { match: s, journey: [...e, { kind: "match", message: `matched route '${s.path}'` }] };
|
|
318
|
+
}, /**
|
|
319
|
+
* Takes a matched route and mounts it.
|
|
320
|
+
*/
|
|
321
|
+
oe = function(t, e) {
|
|
322
|
+
const s = e.meta.layers;
|
|
323
|
+
for (let n = 0; n < s.length; n++) {
|
|
324
|
+
const r = s[n], a = i(this, P)[n];
|
|
325
|
+
if ((a == null ? void 0 : a.id) !== r.id) {
|
|
326
|
+
m(this, P, i(this, P).slice(0, n)), a == null || a.view.unmount();
|
|
327
|
+
const c = i(this, P).at(-1), w = ((c == null ? void 0 : c.view) ?? t).setChildView(r.view);
|
|
328
|
+
i(this, P).push({ id: r.id, view: w });
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}, /**
|
|
332
|
+
* Parses a route definition object into a set of matchable routes.
|
|
333
|
+
*
|
|
334
|
+
* @param route - Route config object.
|
|
335
|
+
* @param layers - Array of parent layers. Passed when this function calls itself on nested routes.
|
|
336
|
+
*/
|
|
337
|
+
Ut = function(t, e = [], s = []) {
|
|
338
|
+
if (!et(t) || !v(t.path))
|
|
339
|
+
throw new TypeError(`Route configs must be objects with a 'path' string property. Got: ${t}`);
|
|
340
|
+
if (t.redirect && t.routes)
|
|
341
|
+
throw new Error("Route cannot have both a 'redirect' and nested 'routes'.");
|
|
342
|
+
if (t.redirect && t.view)
|
|
343
|
+
throw new Error("Route cannot have both a 'redirect' and a 'view'.");
|
|
344
|
+
if (!t.view && !t.routes && !t.redirect)
|
|
345
|
+
throw new Error("Route must have a 'view', a 'redirect', or a set of nested 'routes'.");
|
|
346
|
+
let n = [];
|
|
347
|
+
for (const h of e)
|
|
348
|
+
n.push(...nt(h.path));
|
|
349
|
+
n.push(...nt(t.path)), n[n.length - 1] === "*" && n.pop();
|
|
350
|
+
const r = [];
|
|
351
|
+
if (t.redirect) {
|
|
352
|
+
let h = t.redirect;
|
|
353
|
+
return v(h) && (h = Rt(z(n), h), h.startsWith("/") || (h = "/" + h)), r.push({
|
|
354
|
+
pattern: "/" + z([...n, ...nt(t.path)]),
|
|
355
|
+
meta: {
|
|
356
|
+
redirect: h
|
|
357
|
+
}
|
|
358
|
+
}), r;
|
|
359
|
+
}
|
|
360
|
+
let a = ee;
|
|
361
|
+
if (tt(t.view))
|
|
362
|
+
a = t.view;
|
|
363
|
+
else if (t.view)
|
|
364
|
+
throw new TypeError(`Route '${t.path}' expected a view function or undefined. Got: ${t.view}`);
|
|
365
|
+
const c = { id: st(this, _t)._++, view: a };
|
|
366
|
+
if (t.routes)
|
|
367
|
+
for (const h of t.routes)
|
|
368
|
+
r.push(...f(this, p, Ut).call(this, h, [...e, t], [...s, c]));
|
|
369
|
+
else
|
|
370
|
+
r.push({
|
|
371
|
+
pattern: parent ? z([...e.map((h) => h.path), t.path]) : t.path,
|
|
372
|
+
meta: {
|
|
373
|
+
pattern: t.path,
|
|
374
|
+
layers: [...s, c],
|
|
375
|
+
beforeMatch: t.beforeMatch
|
|
376
|
+
}
|
|
377
|
+
});
|
|
378
|
+
return r;
|
|
379
|
+
};
|
|
380
|
+
const Ue = /(noopener|noreferrer) (noopener|noreferrer)/, Ce = /^[\w-_]+:/;
|
|
381
|
+
function je(o, t, e = window) {
|
|
382
|
+
function s(r) {
|
|
383
|
+
return !r || r === o ? null : r.localName !== "a" || r.href === void 0 ? s(r.parentNode) : r;
|
|
384
|
+
}
|
|
385
|
+
function n(r) {
|
|
386
|
+
if (r.button && r.button !== 0 || r.ctrlKey || r.metaKey || r.altKey || r.shiftKey || r.defaultPrevented)
|
|
387
|
+
return;
|
|
388
|
+
const a = s(r.target);
|
|
389
|
+
a && (e.location.protocol !== a.protocol || e.location.hostname !== a.hostname || e.location.port !== a.port || a.hasAttribute("data-router-ignore") || a.hasAttribute("download") || a.getAttribute("target") === "_blank" && Ue.test(a.getAttribute("rel")) || Ce.test(a.getAttribute("href")) || (r.preventDefault(), t(a)));
|
|
390
|
+
}
|
|
391
|
+
return o.addEventListener("click", n), function() {
|
|
392
|
+
o.removeEventListener("click", n);
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
function Ve(o, t) {
|
|
396
|
+
for (const e in t) {
|
|
397
|
+
const s = t[e].toString();
|
|
398
|
+
o = o.replace(`{${e}}`, s).replace(`{#${e}}`, s);
|
|
399
|
+
}
|
|
400
|
+
return o;
|
|
401
|
+
}
|
|
402
|
+
function Ie(o) {
|
|
403
|
+
for (const t of o)
|
|
404
|
+
if (t.meta.redirect) {
|
|
405
|
+
let e;
|
|
406
|
+
if (!tt(t.meta.redirect)) if (v(t.meta.redirect)) {
|
|
407
|
+
if (e = t.meta.redirect, !se(o, e, {
|
|
408
|
+
willMatch(n) {
|
|
409
|
+
return n !== t;
|
|
410
|
+
}
|
|
411
|
+
}))
|
|
412
|
+
throw new Error(`Found a redirect to an undefined URL. From '${t.pattern}' to '${t.meta.redirect}'`);
|
|
413
|
+
} else
|
|
414
|
+
throw new TypeError(`Expected a string or redirect function. Got: ${t.meta.redirect}`);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
class qe extends Error {
|
|
418
|
+
}
|
|
419
|
+
var W, Lt, Mt, ot, S, _;
|
|
420
|
+
class We {
|
|
421
|
+
constructor(t) {
|
|
422
|
+
l(this, S);
|
|
423
|
+
l(this, W, []);
|
|
424
|
+
l(this, Lt, Ae());
|
|
425
|
+
l(this, Mt);
|
|
426
|
+
l(this, ot);
|
|
427
|
+
m(this, Mt, t), m(this, ot, t.createLogger("Dolla.http"));
|
|
27
428
|
}
|
|
28
429
|
/**
|
|
29
430
|
* Adds a new middleware that will apply to subsequent requests.
|
|
@@ -31,136 +432,136 @@ class St {
|
|
|
31
432
|
*
|
|
32
433
|
* @param middleware - A middleware function that will intercept requests.
|
|
33
434
|
*/
|
|
34
|
-
use(
|
|
35
|
-
return i(this,
|
|
36
|
-
i(this,
|
|
435
|
+
use(t) {
|
|
436
|
+
return i(this, W).push(t), () => {
|
|
437
|
+
i(this, W).splice(i(this, W).indexOf(t), 1);
|
|
37
438
|
};
|
|
38
439
|
}
|
|
39
|
-
async get(
|
|
40
|
-
return
|
|
440
|
+
async get(t, e) {
|
|
441
|
+
return f(this, S, _).call(this, "get", t, e);
|
|
41
442
|
}
|
|
42
|
-
async put(
|
|
43
|
-
return
|
|
443
|
+
async put(t, e) {
|
|
444
|
+
return f(this, S, _).call(this, "put", t, e);
|
|
44
445
|
}
|
|
45
|
-
async patch(
|
|
46
|
-
return
|
|
446
|
+
async patch(t, e) {
|
|
447
|
+
return f(this, S, _).call(this, "patch", t, e);
|
|
47
448
|
}
|
|
48
|
-
async post(
|
|
49
|
-
return
|
|
449
|
+
async post(t, e) {
|
|
450
|
+
return f(this, S, _).call(this, "post", t, e);
|
|
50
451
|
}
|
|
51
|
-
async delete(
|
|
52
|
-
return
|
|
452
|
+
async delete(t, e) {
|
|
453
|
+
return f(this, S, _).call(this, "delete", t, e);
|
|
53
454
|
}
|
|
54
|
-
async head(
|
|
55
|
-
return
|
|
455
|
+
async head(t, e) {
|
|
456
|
+
return f(this, S, _).call(this, "head", t, e);
|
|
56
457
|
}
|
|
57
|
-
async options(
|
|
58
|
-
return
|
|
458
|
+
async options(t, e) {
|
|
459
|
+
return f(this, S, _).call(this, "options", t, e);
|
|
59
460
|
}
|
|
60
|
-
async trace(
|
|
61
|
-
return
|
|
461
|
+
async trace(t, e) {
|
|
462
|
+
return f(this, S, _).call(this, "trace", t, e);
|
|
62
463
|
}
|
|
63
464
|
}
|
|
64
|
-
|
|
65
|
-
return new
|
|
465
|
+
W = new WeakMap(), Lt = new WeakMap(), Mt = new WeakMap(), ot = new WeakMap(), S = new WeakSet(), _ = async function(t, e, s) {
|
|
466
|
+
return new He({
|
|
66
467
|
...s,
|
|
67
|
-
method:
|
|
68
|
-
uri:
|
|
69
|
-
middleware: i(this,
|
|
70
|
-
fetch: i(this,
|
|
71
|
-
logger: i(this,
|
|
468
|
+
method: t,
|
|
469
|
+
uri: e,
|
|
470
|
+
middleware: i(this, W),
|
|
471
|
+
fetch: i(this, Lt),
|
|
472
|
+
logger: i(this, ot)
|
|
72
473
|
}).fetch();
|
|
73
474
|
};
|
|
74
|
-
function
|
|
475
|
+
function Ae() {
|
|
75
476
|
if (typeof window < "u" && window.fetch)
|
|
76
477
|
return window.fetch.bind(window);
|
|
77
478
|
if (typeof global < "u" && global.fetch)
|
|
78
479
|
return global.fetch.bind(global);
|
|
79
480
|
throw new Error("Running in neither browser nor node. Please run this app in one of the supported environments.");
|
|
80
481
|
}
|
|
81
|
-
class
|
|
82
|
-
constructor(
|
|
83
|
-
const { status: s, statusText: n, method: r, url: a } =
|
|
84
|
-
super(
|
|
482
|
+
class Ge extends Error {
|
|
483
|
+
constructor(e) {
|
|
484
|
+
const { status: s, statusText: n, method: r, url: a } = e, c = `${s} ${n}: Request failed (${r.toUpperCase()} ${a.toString()})`;
|
|
485
|
+
super(c);
|
|
85
486
|
d(this, "response");
|
|
86
|
-
this.response =
|
|
487
|
+
this.response = e;
|
|
87
488
|
}
|
|
88
489
|
}
|
|
89
|
-
class
|
|
90
|
-
constructor(
|
|
490
|
+
class Be {
|
|
491
|
+
constructor(t) {
|
|
91
492
|
d(this, "method");
|
|
92
493
|
d(this, "url");
|
|
93
494
|
d(this, "headers", new Headers());
|
|
94
495
|
d(this, "body");
|
|
95
|
-
this.method =
|
|
496
|
+
this.method = t.method, this.body = t.body, t.uri.startsWith("http") ? this.url = new URL(t.uri) : this.url = new URL(t.uri, window.location.origin), this._applyHeaders(t.headers), this._applyQueryParams(t.query);
|
|
96
497
|
}
|
|
97
498
|
get isSameOrigin() {
|
|
98
499
|
return this.url.origin === window.location.origin;
|
|
99
500
|
}
|
|
100
|
-
_applyHeaders(
|
|
101
|
-
if (
|
|
102
|
-
if (
|
|
103
|
-
|
|
104
|
-
this.headers.set(s,
|
|
501
|
+
_applyHeaders(t) {
|
|
502
|
+
if (t != null)
|
|
503
|
+
if (t instanceof Map || t instanceof Headers)
|
|
504
|
+
t.forEach((e, s) => {
|
|
505
|
+
this.headers.set(s, e);
|
|
105
506
|
});
|
|
106
|
-
else if (
|
|
107
|
-
for (const
|
|
108
|
-
const s = e
|
|
109
|
-
s instanceof Date ? this.headers.set(
|
|
507
|
+
else if (et(t))
|
|
508
|
+
for (const e in t) {
|
|
509
|
+
const s = t[e];
|
|
510
|
+
s instanceof Date ? this.headers.set(e, s.toISOString()) : s != null && this.headers.set(e, String(s));
|
|
110
511
|
}
|
|
111
512
|
else
|
|
112
|
-
throw new TypeError(`Unknown headers type. Got: ${
|
|
513
|
+
throw new TypeError(`Unknown headers type. Got: ${t}`);
|
|
113
514
|
}
|
|
114
|
-
_applyQueryParams(
|
|
115
|
-
if (
|
|
116
|
-
if (
|
|
117
|
-
|
|
118
|
-
this.url.searchParams.set(s,
|
|
515
|
+
_applyQueryParams(t) {
|
|
516
|
+
if (t != null)
|
|
517
|
+
if (t instanceof Map || t instanceof URLSearchParams)
|
|
518
|
+
t.forEach((e, s) => {
|
|
519
|
+
this.url.searchParams.set(s, e);
|
|
119
520
|
});
|
|
120
|
-
else if (
|
|
121
|
-
for (const
|
|
122
|
-
const s = e
|
|
123
|
-
s instanceof Date ? this.url.searchParams.set(
|
|
521
|
+
else if (et(t))
|
|
522
|
+
for (const e in t) {
|
|
523
|
+
const s = t[e];
|
|
524
|
+
s instanceof Date ? this.url.searchParams.set(e, s.toISOString()) : s != null && this.url.searchParams.set(e, String(s));
|
|
124
525
|
}
|
|
125
526
|
else
|
|
126
|
-
throw new TypeError(`Unknown query params type. Got: ${
|
|
527
|
+
throw new TypeError(`Unknown query params type. Got: ${t}`);
|
|
127
528
|
}
|
|
128
529
|
}
|
|
129
|
-
class
|
|
130
|
-
constructor(
|
|
530
|
+
class He {
|
|
531
|
+
constructor(t) {
|
|
131
532
|
d(this, "_middleware");
|
|
132
533
|
d(this, "_fetch");
|
|
133
534
|
d(this, "_request");
|
|
134
535
|
d(this, "_response");
|
|
135
|
-
this._middleware =
|
|
536
|
+
this._middleware = t.middleware, this._fetch = t.fetch, this._request = new Be(t);
|
|
136
537
|
}
|
|
137
538
|
async fetch() {
|
|
138
539
|
if (this._middleware.length > 0) {
|
|
139
|
-
const
|
|
140
|
-
const s = this._middleware[
|
|
540
|
+
const t = (e = 0) => {
|
|
541
|
+
const s = this._middleware[e], n = this._middleware[e + 1] ? t(e + 1) : this._handler.bind(this);
|
|
141
542
|
return async () => s(this._request, async () => (await n(), this._response));
|
|
142
543
|
};
|
|
143
|
-
await
|
|
544
|
+
await t()();
|
|
144
545
|
} else
|
|
145
546
|
await this._handler();
|
|
146
547
|
if (this._response.status < 200 || this._response.status >= 400)
|
|
147
|
-
throw new
|
|
548
|
+
throw new Ge(this._response);
|
|
148
549
|
return this._response;
|
|
149
550
|
}
|
|
150
551
|
// This is the function that performs the actual request after the final middleware.
|
|
151
552
|
async _handler() {
|
|
152
|
-
let
|
|
153
|
-
const
|
|
154
|
-
!
|
|
155
|
-
const s = await this._fetch(
|
|
156
|
-
method:
|
|
157
|
-
headers:
|
|
158
|
-
body:
|
|
553
|
+
let t;
|
|
554
|
+
const e = this._request;
|
|
555
|
+
!e.headers.has("content-type") && et(e.body) ? (e.headers.set("content-type", "application/json"), t = JSON.stringify(e.body)) : t = e.body;
|
|
556
|
+
const s = await this._fetch(e.url.toString(), {
|
|
557
|
+
method: e.method,
|
|
558
|
+
headers: e.headers,
|
|
559
|
+
body: t
|
|
159
560
|
}), n = s.headers.get("content-type");
|
|
160
561
|
let r;
|
|
161
562
|
n != null && n.includes("application/json") ? r = await s.json() : n != null && n.includes("application/x-www-form-urlencoded") ? r = await s.formData() : r = await s.text(), this._response = {
|
|
162
|
-
method:
|
|
163
|
-
url:
|
|
563
|
+
method: e.method,
|
|
564
|
+
url: e.url,
|
|
164
565
|
status: s.status,
|
|
165
566
|
statusText: s.statusText,
|
|
166
567
|
headers: s.headers,
|
|
@@ -168,28 +569,28 @@ class Mt {
|
|
|
168
569
|
};
|
|
169
570
|
}
|
|
170
571
|
}
|
|
171
|
-
var
|
|
172
|
-
class
|
|
173
|
-
constructor(
|
|
174
|
-
l(this,
|
|
572
|
+
var xt, J, H, Ct, le;
|
|
573
|
+
class ze {
|
|
574
|
+
constructor(t, e) {
|
|
575
|
+
l(this, H);
|
|
175
576
|
d(this, "dolla");
|
|
176
577
|
d(this, "config");
|
|
177
|
-
l(this,
|
|
178
|
-
l(this,
|
|
179
|
-
this.config =
|
|
578
|
+
l(this, xt, !1);
|
|
579
|
+
l(this, J, /* @__PURE__ */ new Map());
|
|
580
|
+
this.config = t, this.dolla = e;
|
|
180
581
|
}
|
|
181
582
|
async load() {
|
|
182
|
-
let
|
|
183
|
-
if (!i(this,
|
|
184
|
-
if (
|
|
185
|
-
if (
|
|
186
|
-
throw new Error(`Fetch function did not return an object of language strings: ${
|
|
187
|
-
} else if (
|
|
188
|
-
const
|
|
189
|
-
if (
|
|
190
|
-
const s = await
|
|
191
|
-
if (
|
|
192
|
-
|
|
583
|
+
let t;
|
|
584
|
+
if (!i(this, xt)) {
|
|
585
|
+
if (tt(this.config.fetch)) {
|
|
586
|
+
if (t = await this.config.fetch(), !et(t))
|
|
587
|
+
throw new Error(`Fetch function did not return an object of language strings: ${t}`);
|
|
588
|
+
} else if (v(this.config.path)) {
|
|
589
|
+
const e = await fetch(this.config.path);
|
|
590
|
+
if (e.ok) {
|
|
591
|
+
const s = await e.json();
|
|
592
|
+
if (et(s))
|
|
593
|
+
t = s;
|
|
193
594
|
else
|
|
194
595
|
throw new Error(
|
|
195
596
|
`Language path '${this.config.path}' did not return an object of language strings: ${s}`
|
|
@@ -198,49 +599,49 @@ class xt {
|
|
|
198
599
|
throw new Error("HTTP request failed.");
|
|
199
600
|
}
|
|
200
601
|
}
|
|
201
|
-
if (
|
|
202
|
-
const
|
|
203
|
-
for (const s of
|
|
204
|
-
i(this,
|
|
602
|
+
if (t) {
|
|
603
|
+
const e = f(this, H, Ct).call(this, t);
|
|
604
|
+
for (const s of e)
|
|
605
|
+
i(this, J).set(s[0], s[1]);
|
|
205
606
|
} else
|
|
206
607
|
throw new Error("Language could not be loaded.");
|
|
207
608
|
}
|
|
208
|
-
getTemplate(
|
|
209
|
-
return i(this,
|
|
210
|
-
segments: [{ type: 0, text: `[MISSING: ${
|
|
609
|
+
getTemplate(t) {
|
|
610
|
+
return i(this, J).get(t) ?? {
|
|
611
|
+
segments: [{ type: 0, text: `[MISSING: ${t}]` }]
|
|
211
612
|
};
|
|
212
613
|
}
|
|
213
|
-
hasTemplate(
|
|
214
|
-
return i(this,
|
|
614
|
+
hasTemplate(t) {
|
|
615
|
+
return i(this, J).has(t);
|
|
215
616
|
}
|
|
216
617
|
}
|
|
217
|
-
|
|
618
|
+
xt = new WeakMap(), J = new WeakMap(), H = new WeakSet(), Ct = function(t, e = []) {
|
|
218
619
|
const s = [];
|
|
219
|
-
for (const n in
|
|
220
|
-
switch (
|
|
620
|
+
for (const n in t)
|
|
621
|
+
switch (Bt(t[n])) {
|
|
221
622
|
case "string":
|
|
222
|
-
s.push([[...
|
|
623
|
+
s.push([[...e, n].join("."), f(this, H, le).call(this, t[n])]);
|
|
223
624
|
break;
|
|
224
625
|
case "object":
|
|
225
|
-
s.push(...
|
|
626
|
+
s.push(...f(this, H, Ct).call(this, t[n], [...e, n]));
|
|
226
627
|
break;
|
|
227
628
|
default:
|
|
228
629
|
throw new Error(
|
|
229
|
-
`Expected to find a string or object at ${[...
|
|
630
|
+
`Expected to find a string or object at ${[...e, n].join(".")}. Got: ${Bt(t[n])}`
|
|
230
631
|
);
|
|
231
632
|
}
|
|
232
633
|
return s;
|
|
233
|
-
},
|
|
234
|
-
let
|
|
235
|
-
((
|
|
236
|
-
|
|
237
|
-
})(
|
|
634
|
+
}, le = function(t) {
|
|
635
|
+
let e;
|
|
636
|
+
((u) => {
|
|
637
|
+
u[u.Static = 0] = "Static", u[u.ValueName = 1] = "ValueName", u[u.FormatName = 2] = "FormatName", u[u.FormatOptionName = 3] = "FormatOptionName", u[u.FormatOptionValue = 4] = "FormatOptionValue", u[u.FormatOptionEnd = 5] = "FormatOptionEnd";
|
|
638
|
+
})(e || (e = {}));
|
|
238
639
|
const s = {
|
|
239
640
|
segments: []
|
|
240
641
|
};
|
|
241
|
-
let n = "", r = 0, a = 0,
|
|
242
|
-
const
|
|
243
|
-
|
|
642
|
+
let n = "", r = 0, a = 0, c, h, w;
|
|
643
|
+
const E = () => {
|
|
644
|
+
c = {
|
|
244
645
|
type: 1,
|
|
245
646
|
name: "",
|
|
246
647
|
formats: []
|
|
@@ -251,91 +652,91 @@ _e = new WeakMap(), Q = new WeakMap(), z = new WeakSet(), Pe = function(e, t = [
|
|
|
251
652
|
options: {}
|
|
252
653
|
};
|
|
253
654
|
};
|
|
254
|
-
for (; r <
|
|
255
|
-
if (a !== 0 &&
|
|
655
|
+
for (; r < t.length; ) {
|
|
656
|
+
if (a !== 0 && t[r] === " ") {
|
|
256
657
|
r++;
|
|
257
658
|
continue;
|
|
258
659
|
}
|
|
259
660
|
switch (a) {
|
|
260
661
|
case 0:
|
|
261
|
-
|
|
662
|
+
t[r] === "{" && t[r + 1] === "{" ? (a = 1, r += 2, n.length > 0 && (s.segments.push({ type: 0, text: n }), n = ""), E()) : (n += t[r], r++);
|
|
262
663
|
break;
|
|
263
664
|
case 1:
|
|
264
|
-
|
|
665
|
+
t[r] === "|" ? (a = 2, r += 1, c.name = n, n = "", k()) : t[r] === "}" && t[r + 1] === "}" ? (a = 0, r += 2, c.name = n, n = "", s.segments.push(c)) : (n += t[r], r++);
|
|
265
666
|
break;
|
|
266
667
|
case 2:
|
|
267
|
-
|
|
668
|
+
t[r] === "(" ? (a = 3, r += 1, h.name = n, n = "") : t[r] === "}" && t[r + 1] === "}" ? (a = 0, r += 2, c.formats.push(h), s.segments.push(c)) : (n += t[r], r++);
|
|
268
669
|
break;
|
|
269
670
|
case 3:
|
|
270
|
-
|
|
671
|
+
t[r] === ")" || (t[r] === ":" ? (a = 4, r += 1, w = n, n = "") : t[r] === "}" && t[r + 1] === "}" || (n += t[r], r++));
|
|
271
672
|
break;
|
|
272
673
|
case 4:
|
|
273
|
-
|
|
674
|
+
t[r] === ")" ? (a = 5, r += 1, h.options[w] = n, n = "", c.formats.push(h)) : t[r] === "," ? (a = 3, r += 1, h.options[w] = n, n = "") : t[r] === "}" && t[r + 1] === "}" || (n += t[r], r++);
|
|
274
675
|
break;
|
|
275
676
|
case 5:
|
|
276
|
-
|
|
677
|
+
t[r] === "|" ? (a = 2, r += 1, k()) : t[r] === "}" && t[r + 1] === "}" && (a = 0, r += 2, s.segments.push(c));
|
|
277
678
|
break;
|
|
278
679
|
}
|
|
279
680
|
}
|
|
280
681
|
return a === 0 && n.length > 0 && s.segments.push({ type: 0, text: n }), s;
|
|
281
682
|
};
|
|
282
|
-
var
|
|
283
|
-
class
|
|
284
|
-
constructor(
|
|
683
|
+
var lt, O, b, ht, ct, ut, ft, $, he, jt, Vt, It, ce;
|
|
684
|
+
class Ke {
|
|
685
|
+
constructor(t) {
|
|
285
686
|
l(this, $);
|
|
286
|
-
l(this,
|
|
287
|
-
l(this,
|
|
687
|
+
l(this, lt);
|
|
688
|
+
l(this, O);
|
|
288
689
|
l(this, b, /* @__PURE__ */ new Map());
|
|
289
|
-
l(this,
|
|
290
|
-
l(this,
|
|
291
|
-
l(this,
|
|
690
|
+
l(this, ht, []);
|
|
691
|
+
l(this, ct, /* @__PURE__ */ new Map());
|
|
692
|
+
l(this, ut, "auto");
|
|
292
693
|
d(this, "$locale");
|
|
293
|
-
l(this,
|
|
294
|
-
m(this,
|
|
295
|
-
const [
|
|
296
|
-
this.$locale =
|
|
297
|
-
i(this, b).size > 0 && await this.setLocale(i(this,
|
|
694
|
+
l(this, ft);
|
|
695
|
+
m(this, lt, t), m(this, O, t.createLogger("Dolla.i18n"));
|
|
696
|
+
const [e, s] = Wt();
|
|
697
|
+
this.$locale = e, m(this, ft, s), this.addFormat("number", (n, r, a) => f(this, $, jt).call(this, Number(r), a)), this.addFormat("datetime", (n, r, a) => f(this, $, Vt).call(this, r, a)), this.addFormat("list", (n, r, a) => f(this, $, It).call(this, r, a)), t.beforeMount(async () => {
|
|
698
|
+
i(this, b).size > 0 && await this.setLocale(i(this, ut));
|
|
298
699
|
});
|
|
299
700
|
}
|
|
300
701
|
get locales() {
|
|
301
702
|
return [...i(this, b).keys()];
|
|
302
703
|
}
|
|
303
|
-
setup(
|
|
304
|
-
if (
|
|
305
|
-
i(this, b).set(
|
|
306
|
-
}),
|
|
307
|
-
if (!
|
|
308
|
-
throw new Error(`Initial locale '${
|
|
309
|
-
m(this,
|
|
704
|
+
setup(t) {
|
|
705
|
+
if (t.translations.forEach((e) => {
|
|
706
|
+
i(this, b).set(e.locale, new ze(e, i(this, lt)));
|
|
707
|
+
}), t.locale && t.locale !== "auto") {
|
|
708
|
+
if (!t.translations.some((s) => s.locale === t.locale))
|
|
709
|
+
throw new Error(`Initial locale '${t.locale}' is not registered in the locales array.`);
|
|
710
|
+
m(this, ut, t.locale);
|
|
310
711
|
}
|
|
311
|
-
i(this,
|
|
712
|
+
i(this, O).info(
|
|
312
713
|
`${i(this, b).size} language${i(this, b).size === 1 ? "" : "s"} supported: '${[...i(this, b).keys()].join("', '")}'`
|
|
313
714
|
);
|
|
314
715
|
}
|
|
315
|
-
async setLocale(
|
|
716
|
+
async setLocale(t) {
|
|
316
717
|
var n;
|
|
317
|
-
let
|
|
318
|
-
if (
|
|
718
|
+
let e;
|
|
719
|
+
if (t === "auto") {
|
|
319
720
|
let r = [];
|
|
320
721
|
if (typeof navigator < "u") {
|
|
321
722
|
const a = navigator;
|
|
322
723
|
((n = a.languages) == null ? void 0 : n.length) > 0 ? r.push(...a.languages) : a.language ? r.push(a.language) : a.browserLanguage ? r.push(a.browserLanguage) : a.userLanguage && r.push(a.userLanguage);
|
|
323
724
|
}
|
|
324
725
|
for (const a of r)
|
|
325
|
-
i(this, b).has(a) && (
|
|
726
|
+
i(this, b).has(a) && (e = a);
|
|
326
727
|
} else
|
|
327
|
-
i(this, b).has(
|
|
328
|
-
if (
|
|
728
|
+
i(this, b).has(t) && (e = t);
|
|
729
|
+
if (e == null) {
|
|
329
730
|
const r = i(this, b).keys().next().value;
|
|
330
|
-
r && (
|
|
731
|
+
r && (e = r);
|
|
331
732
|
}
|
|
332
|
-
if (!
|
|
333
|
-
throw new Error(`Locale '${
|
|
334
|
-
const s = i(this, b).get(
|
|
733
|
+
if (!e || !i(this, b).has(e))
|
|
734
|
+
throw new Error(`Locale '${t}' has no translation.`);
|
|
735
|
+
const s = i(this, b).get(e);
|
|
335
736
|
try {
|
|
336
|
-
await s.load(), m(this,
|
|
737
|
+
await s.load(), m(this, ht, []), i(this, ft).call(this, e), i(this, O).info("set language to " + e);
|
|
337
738
|
} catch (r) {
|
|
338
|
-
r instanceof Error && i(this,
|
|
739
|
+
r instanceof Error && i(this, O).crash(r);
|
|
339
740
|
}
|
|
340
741
|
}
|
|
341
742
|
/**
|
|
@@ -347,21 +748,21 @@ class Dt {
|
|
|
347
748
|
* @example
|
|
348
749
|
* const $value = t("your.key.here", { count: 5 });
|
|
349
750
|
*/
|
|
350
|
-
t(
|
|
751
|
+
t(t, e) {
|
|
351
752
|
if (this === void 0)
|
|
352
753
|
throw new Error(
|
|
353
754
|
`The 't' function cannot be destructured. If you need a standalone version you can import it like so: 'import { t } from "@manyducks.co/dolla"'`
|
|
354
755
|
);
|
|
355
756
|
let s = [], n = [];
|
|
356
|
-
for (const r in
|
|
357
|
-
s.push(r), n.push(
|
|
757
|
+
for (const r in e)
|
|
758
|
+
s.push(r), n.push(e[r]);
|
|
358
759
|
return x([this.$locale, ...n], (r, ...a) => {
|
|
359
760
|
if (r == null)
|
|
360
761
|
return "[NO LOCALE SET]";
|
|
361
|
-
const
|
|
762
|
+
const c = {};
|
|
362
763
|
for (let h = 0; h < a.length; h++)
|
|
363
|
-
|
|
364
|
-
return
|
|
764
|
+
c[s[h]] = a[h];
|
|
765
|
+
return f(this, $, he).call(this, r, t, c);
|
|
365
766
|
});
|
|
366
767
|
}
|
|
367
768
|
/**
|
|
@@ -378,8 +779,8 @@ class Dt {
|
|
|
378
779
|
*
|
|
379
780
|
* t("greeting", {name: "world"}); // State<"Hello, WORLD!">
|
|
380
781
|
*/
|
|
381
|
-
addFormat(
|
|
382
|
-
i(this,
|
|
782
|
+
addFormat(t, e) {
|
|
783
|
+
i(this, ct).set(t, e);
|
|
383
784
|
}
|
|
384
785
|
/**
|
|
385
786
|
* Creates an `Intl.Collator` configured for the current locale.
|
|
@@ -387,16 +788,16 @@ class Dt {
|
|
|
387
788
|
*
|
|
388
789
|
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Collator/Collator#options
|
|
389
790
|
*/
|
|
390
|
-
collator(
|
|
391
|
-
return new Intl.Collator(this.$locale.get(),
|
|
791
|
+
collator(t) {
|
|
792
|
+
return new Intl.Collator(this.$locale.get(), t);
|
|
392
793
|
}
|
|
393
794
|
/**
|
|
394
795
|
* Returns a State containing the number formatted for the current locale. Uses `Intl.NumberFormat` under the hood.
|
|
395
796
|
*
|
|
396
797
|
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options
|
|
397
798
|
*/
|
|
398
|
-
number(
|
|
399
|
-
return x([this.$locale,
|
|
799
|
+
number(t, e) {
|
|
800
|
+
return x([this.$locale, t], (s, n) => f(this, $, jt).call(this, n, e));
|
|
400
801
|
}
|
|
401
802
|
/**
|
|
402
803
|
* Returns a State containing the date formatted for the current locale. Uses `Intl.DateTimeFormat` under the hood.
|
|
@@ -407,8 +808,8 @@ class Dt {
|
|
|
407
808
|
* const date = new Date();
|
|
408
809
|
* const $formatted = Dolla.i18n.dateTime(date, { dateFormat: "short" });
|
|
409
810
|
*/
|
|
410
|
-
dateTime(
|
|
411
|
-
return x([this.$locale,
|
|
811
|
+
dateTime(t, e) {
|
|
812
|
+
return x([this.$locale, t], (s, n) => f(this, $, Vt).call(this, n, e));
|
|
412
813
|
}
|
|
413
814
|
/**
|
|
414
815
|
* Returns a State containing the date formatted for the current locale. Uses `Intl.DateTimeFormat` under the hood.
|
|
@@ -419,455 +820,69 @@ class Dt {
|
|
|
419
820
|
* const list = new Date();
|
|
420
821
|
* const $formatted = Dolla.i18n.list(list, { });
|
|
421
822
|
*/
|
|
422
|
-
list(
|
|
423
|
-
return x([this.$locale,
|
|
823
|
+
list(t, e) {
|
|
824
|
+
return x([this.$locale, t], (s, n) => f(this, $, It).call(this, n, e));
|
|
424
825
|
}
|
|
425
826
|
}
|
|
426
|
-
|
|
827
|
+
lt = new WeakMap(), O = new WeakMap(), b = new WeakMap(), ht = new WeakMap(), ct = new WeakMap(), ut = new WeakMap(), ft = new WeakMap(), $ = new WeakSet(), he = function(t, e, s) {
|
|
427
828
|
var h;
|
|
428
|
-
const n =
|
|
829
|
+
const n = f(this, $, ce).call(this, e, s);
|
|
429
830
|
if (n) return n;
|
|
430
|
-
const r = i(this, b).get(
|
|
431
|
-
if (s.context != null && (
|
|
831
|
+
const r = i(this, b).get(t);
|
|
832
|
+
if (s.context != null && (e += "_" + s.context), s.count != null)
|
|
432
833
|
if (s.ordinal) {
|
|
433
|
-
const w = `${
|
|
434
|
-
r.hasTemplate(w) ?
|
|
834
|
+
const w = `${e}_ordinal_(=${s.count})`;
|
|
835
|
+
r.hasTemplate(w) ? e = w : e += "_ordinal_" + new Intl.PluralRules(t, { type: "ordinal" }).select(s.count);
|
|
435
836
|
} else {
|
|
436
|
-
const w = `${
|
|
437
|
-
r.hasTemplate(w) ?
|
|
837
|
+
const w = `${e}_(=${s.count})`;
|
|
838
|
+
r.hasTemplate(w) ? e = w : e += "_" + new Intl.PluralRules(t).select(s.count);
|
|
438
839
|
}
|
|
439
|
-
const a = r.getTemplate(
|
|
440
|
-
let
|
|
840
|
+
const a = r.getTemplate(e);
|
|
841
|
+
let c = "";
|
|
441
842
|
for (const w of a.segments)
|
|
442
843
|
if (w.type === 0)
|
|
443
|
-
|
|
844
|
+
c += w.text;
|
|
444
845
|
else if (w.type === 1) {
|
|
445
|
-
let
|
|
846
|
+
let E = Qe(s, w.name);
|
|
446
847
|
const k = ((h = s.formatOverrides) == null ? void 0 : h[w.name]) ?? [...w.formats];
|
|
447
848
|
w.name === "count" && k.length === 0 && k.push({ name: "number", options: {} });
|
|
448
|
-
for (const
|
|
449
|
-
const F = i(this,
|
|
849
|
+
for (const u of k) {
|
|
850
|
+
const F = i(this, ct).get(u.name);
|
|
450
851
|
if (F == null) {
|
|
451
|
-
const
|
|
452
|
-
`Failed to load format '${
|
|
852
|
+
const R = new Error(
|
|
853
|
+
`Failed to load format '${u.name}' when processing '${e}', template: ${a}`
|
|
453
854
|
);
|
|
454
|
-
throw i(this,
|
|
855
|
+
throw i(this, O).crash(R), R;
|
|
455
856
|
}
|
|
456
|
-
|
|
857
|
+
E = F(t, E, u.options);
|
|
457
858
|
}
|
|
458
|
-
|
|
859
|
+
c += E;
|
|
459
860
|
}
|
|
460
|
-
return
|
|
461
|
-
},
|
|
462
|
-
return new Intl.NumberFormat(this.$locale.get(),
|
|
463
|
-
},
|
|
464
|
-
return new Intl.DateTimeFormat(this.$locale.get(),
|
|
465
|
-
},
|
|
466
|
-
return new Intl.ListFormat(this.$locale.get(),
|
|
861
|
+
return c;
|
|
862
|
+
}, jt = function(t, e) {
|
|
863
|
+
return new Intl.NumberFormat(this.$locale.get(), e).format(t);
|
|
864
|
+
}, Vt = function(t, e) {
|
|
865
|
+
return new Intl.DateTimeFormat(this.$locale.get(), e).format(v(t) ? new Date(t) : t);
|
|
866
|
+
}, It = function(t, e) {
|
|
867
|
+
return new Intl.ListFormat(this.$locale.get(), e).format(t);
|
|
467
868
|
}, // relativeTime(): State<string> {
|
|
468
869
|
// }
|
|
469
|
-
|
|
470
|
-
for (const s of i(this,
|
|
471
|
-
if (s[0] ===
|
|
870
|
+
ce = function(t, e) {
|
|
871
|
+
for (const s of i(this, ht))
|
|
872
|
+
if (s[0] === t && we(s[1], e))
|
|
472
873
|
return s[2];
|
|
473
874
|
};
|
|
474
|
-
function
|
|
475
|
-
const
|
|
875
|
+
function Qe(o, t) {
|
|
876
|
+
const e = String(t).split(/[\.\[\]]/).filter((n) => n.trim() !== "");
|
|
476
877
|
let s = o;
|
|
477
|
-
for (;
|
|
478
|
-
const n =
|
|
878
|
+
for (; e.length > 0; ) {
|
|
879
|
+
const n = e.shift();
|
|
479
880
|
s != null ? s = s[n] : s = void 0;
|
|
480
881
|
}
|
|
481
882
|
return s;
|
|
482
883
|
}
|
|
483
|
-
function
|
|
484
|
-
return
|
|
485
|
-
}
|
|
486
|
-
function K(o) {
|
|
487
|
-
var t;
|
|
488
|
-
lt(
|
|
489
|
-
(s) => re(s == null ? void 0 : s.toString),
|
|
490
|
-
o,
|
|
491
|
-
"Expected `parts` to be an array of objects with a .toString() method. Got type: %t, value: %v"
|
|
492
|
-
), o = o.filter((s) => s).flatMap(String);
|
|
493
|
-
let e = (t = o.shift()) == null ? void 0 : t.toString();
|
|
494
|
-
if (e) {
|
|
495
|
-
for (const s of o.map((n) => n.toString()))
|
|
496
|
-
s.startsWith(".") ? e = Ee(e, s) : e[e.length - 1] !== "/" ? s[0] !== "/" ? e += "/" + s : e += s : s[0] === "/" ? e += s.slice(1) : e += s;
|
|
497
|
-
e && e !== "/" && e.endsWith("/") && (e = e.slice(0, e.length - 1));
|
|
498
|
-
}
|
|
499
|
-
return e ?? "";
|
|
500
|
-
}
|
|
501
|
-
function Ee(o, e) {
|
|
502
|
-
if (Je(o, "Expected `base` to be a string. Got type: %t, value: %v"), e == null && (e = o, o = ""), e.startsWith("/"))
|
|
503
|
-
return e;
|
|
504
|
-
let t = o;
|
|
505
|
-
for (; ; )
|
|
506
|
-
if (e.startsWith("..")) {
|
|
507
|
-
for (let s = t.length; s > 0; --s)
|
|
508
|
-
if (t[s] === "/" || s === 0) {
|
|
509
|
-
t = t.slice(0, s), e = e.replace(/^\.\.\/?/, "");
|
|
510
|
-
break;
|
|
511
|
-
}
|
|
512
|
-
} else if (e.startsWith("."))
|
|
513
|
-
e = e.replace(/^\.\/?/, "");
|
|
514
|
-
else
|
|
515
|
-
break;
|
|
516
|
-
return K([t, e]);
|
|
517
|
-
}
|
|
518
|
-
function Pt(o) {
|
|
519
|
-
if (!o) return {};
|
|
520
|
-
o.startsWith("?") && (o = o.slice(1));
|
|
521
|
-
const e = o.split("&").filter((t) => t.trim() !== "").map((t) => {
|
|
522
|
-
const [s, n] = t.split("=").map((r) => r.trim());
|
|
523
|
-
return n.toLowerCase() === "true" ? [s, !0] : n.toLowerCase() === "false" ? [s, !1] : isNaN(Number(n)) ? [s, n] : [s, Number(n)];
|
|
524
|
-
});
|
|
525
|
-
return Object.fromEntries(e);
|
|
526
|
-
}
|
|
527
|
-
function tt(o, e, t = {}) {
|
|
528
|
-
var a;
|
|
529
|
-
const [s, n] = e.split("?"), r = se(s);
|
|
530
|
-
e: for (const f of o) {
|
|
531
|
-
const { fragments: h } = f;
|
|
532
|
-
if (!(((a = h[h.length - 1]) == null ? void 0 : a.type) === 3) && h.length !== r.length || t.willMatch && !t.willMatch(f))
|
|
533
|
-
continue e;
|
|
534
|
-
const v = [];
|
|
535
|
-
t: for (let c = 0; c < h.length; c++) {
|
|
536
|
-
const F = r[c], S = h[c];
|
|
537
|
-
if (F == null && S.type !== 3)
|
|
538
|
-
continue e;
|
|
539
|
-
switch (S.type) {
|
|
540
|
-
case 1:
|
|
541
|
-
if (S.name.toLowerCase() === F.toLowerCase()) {
|
|
542
|
-
v.push(S);
|
|
543
|
-
break;
|
|
544
|
-
} else
|
|
545
|
-
continue e;
|
|
546
|
-
case 2:
|
|
547
|
-
v.push({ ...S, value: F });
|
|
548
|
-
break;
|
|
549
|
-
case 3:
|
|
550
|
-
v.push({ ...S, value: r.slice(c).join("/") });
|
|
551
|
-
break t;
|
|
552
|
-
case 4:
|
|
553
|
-
if (isNaN(Number(F)))
|
|
554
|
-
continue e;
|
|
555
|
-
v.push({ ...S, value: Number(F) });
|
|
556
|
-
break;
|
|
557
|
-
default:
|
|
558
|
-
throw new Error(`Unknown fragment type: ${S.type}`);
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
const k = {};
|
|
562
|
-
for (const c of v)
|
|
563
|
-
c.type === 2 && (k[c.name] = decodeURIComponent(c.value)), c.type === 4 && (k[c.name] = c.value), c.type === 3 && (k.wildcard = "/" + decodeURIComponent(c.value));
|
|
564
|
-
return {
|
|
565
|
-
path: "/" + v.map((c) => c.value).join("/"),
|
|
566
|
-
pattern: "/" + h.map((c) => c.type === 2 ? `{${c.name}}` : c.type === 4 ? `{#${c.name}}` : c.name).join("/"),
|
|
567
|
-
params: k,
|
|
568
|
-
query: Pt(n),
|
|
569
|
-
meta: f.meta
|
|
570
|
-
};
|
|
571
|
-
}
|
|
572
|
-
}
|
|
573
|
-
function Tt(o) {
|
|
574
|
-
const e = [], t = [], s = [], n = [];
|
|
575
|
-
for (const a of o) {
|
|
576
|
-
const { fragments: f } = a;
|
|
577
|
-
f.some(
|
|
578
|
-
(h) => h.type === 3
|
|
579
|
-
/* Wildcard */
|
|
580
|
-
) ? n.push(a) : f.some(
|
|
581
|
-
(h) => h.type === 4
|
|
582
|
-
/* NumericParam */
|
|
583
|
-
) ? t.push(a) : f.some(
|
|
584
|
-
(h) => h.type === 2
|
|
585
|
-
/* Param */
|
|
586
|
-
) ? s.push(a) : e.push(a);
|
|
587
|
-
}
|
|
588
|
-
const r = (a, f) => a.fragments.length > f.fragments.length ? -1 : 1;
|
|
589
|
-
return e.sort(r), t.sort(r), s.sort(r), n.sort(r), [...e, ...t, ...s, ...n];
|
|
590
|
-
}
|
|
591
|
-
function Ct(o) {
|
|
592
|
-
const e = se(o), t = [];
|
|
593
|
-
for (let s = 0; s < e.length; s++) {
|
|
594
|
-
const n = e[s];
|
|
595
|
-
if (n === "*") {
|
|
596
|
-
if (s !== e.length - 1)
|
|
597
|
-
throw new Error(`Wildcard must be at the end of a pattern. Received: ${o}`);
|
|
598
|
-
t.push({
|
|
599
|
-
type: 3,
|
|
600
|
-
name: "*",
|
|
601
|
-
value: null
|
|
602
|
-
});
|
|
603
|
-
} else n.at(0) === "{" && n.at(-1) === "}" ? t.push({
|
|
604
|
-
type: n[1] === "#" ? 4 : 2,
|
|
605
|
-
name: n[1] === "#" ? n.slice(2, -1) : n.slice(1, -1),
|
|
606
|
-
value: null
|
|
607
|
-
}) : t.push({
|
|
608
|
-
type: 1,
|
|
609
|
-
name: n,
|
|
610
|
-
value: n
|
|
611
|
-
});
|
|
612
|
-
}
|
|
613
|
-
return t;
|
|
614
|
-
}
|
|
615
|
-
var q, L, Le, T, J, W, A, C, ce, p, Oe, st, rt, te, je, nt, Ve;
|
|
616
|
-
class Nt {
|
|
617
|
-
constructor(e) {
|
|
618
|
-
l(this, p);
|
|
619
|
-
l(this, q);
|
|
620
|
-
l(this, L);
|
|
621
|
-
l(this, Le, 0);
|
|
622
|
-
l(this, T, []);
|
|
623
|
-
l(this, J, []);
|
|
624
|
-
/**
|
|
625
|
-
* Use hash routing when true. Configured in router options.
|
|
626
|
-
*/
|
|
627
|
-
l(this, W, !1);
|
|
628
|
-
// Callbacks that need to be called on unmount.
|
|
629
|
-
l(this, A, []);
|
|
630
|
-
/**
|
|
631
|
-
* The current match object.
|
|
632
|
-
*/
|
|
633
|
-
l(this, C);
|
|
634
|
-
l(this, ce);
|
|
635
|
-
/**
|
|
636
|
-
* The currently matched route pattern, if any.
|
|
637
|
-
*/
|
|
638
|
-
d(this, "$pattern");
|
|
639
|
-
/**
|
|
640
|
-
* The current URL path.
|
|
641
|
-
*/
|
|
642
|
-
d(this, "$path");
|
|
643
|
-
/**
|
|
644
|
-
* The current named path params.
|
|
645
|
-
*/
|
|
646
|
-
d(this, "$params");
|
|
647
|
-
/**
|
|
648
|
-
* The current query params. Changes to this object will be reflected in the URL.
|
|
649
|
-
*/
|
|
650
|
-
d(this, "$query");
|
|
651
|
-
m(this, q, e), m(this, L, e.createLogger("Dolla.router")), [ee(this, C)._, ee(this, ce)._] = Ie(), this.$pattern = x([i(this, C)], (t) => t == null ? void 0 : t.pattern), this.$path = x([i(this, C)], (t) => (t == null ? void 0 : t.path) ?? window.location.pathname), this.$params = x([i(this, C)], (t) => (t == null ? void 0 : t.params) ?? {}, { equals: Ae }), this.$query = x([i(this, C)], (t) => (t == null ? void 0 : t.query) ?? {}, { equals: Ae }), e.beforeMount(async () => {
|
|
652
|
-
const t = () => {
|
|
653
|
-
u(this, p, te).call(this);
|
|
654
|
-
};
|
|
655
|
-
window.addEventListener("popstate", t), i(this, A).push(() => window.removeEventListener("popstate", t));
|
|
656
|
-
const s = e.getRootElement();
|
|
657
|
-
i(this, A).push(
|
|
658
|
-
Vt(s, (n) => {
|
|
659
|
-
let r = n.getAttribute("href");
|
|
660
|
-
i(this, L).info("intercepted click on <a> tag", n), /^https?:\/\/|^\//.test(r) || (r = K([window.location.pathname, r])), u(this, p, Oe).call(this, r);
|
|
661
|
-
})
|
|
662
|
-
), i(this, L).info("will intercept clicks on <a> tags within root element", s), await u(this, p, te).call(this);
|
|
663
|
-
}), e.onUnmount(() => {
|
|
664
|
-
for (const t of i(this, A))
|
|
665
|
-
t();
|
|
666
|
-
m(this, A, []);
|
|
667
|
-
});
|
|
668
|
-
}
|
|
669
|
-
async setup(e) {
|
|
670
|
-
Ge(e != null, "Options object must not be null. Got: %t"), Ge(
|
|
671
|
-
!i(this, q).isMounted,
|
|
672
|
-
"Dolla is already mounted. Dolla.router.setup() must be called before Dolla.mount()."
|
|
673
|
-
), e.hash && m(this, W, !0), m(this, J, Tt(
|
|
674
|
-
e.routes.flatMap((t) => u(this, p, Ve).call(this, t)).map((t) => ({
|
|
675
|
-
pattern: t.pattern,
|
|
676
|
-
meta: t.meta,
|
|
677
|
-
fragments: Ct(t.pattern)
|
|
678
|
-
}))
|
|
679
|
-
)), It(i(this, J));
|
|
680
|
-
}
|
|
681
|
-
/**
|
|
682
|
-
* Navigate backward. Pass a number of steps to hit the back button that many times.
|
|
683
|
-
*/
|
|
684
|
-
back(e = 1) {
|
|
685
|
-
window.history.go(-e);
|
|
686
|
-
}
|
|
687
|
-
/**
|
|
688
|
-
* Navigate forward. Pass a number of steps to hit the forward button that many times.
|
|
689
|
-
*/
|
|
690
|
-
forward(e = 1) {
|
|
691
|
-
window.history.go(e);
|
|
692
|
-
}
|
|
693
|
-
/**
|
|
694
|
-
* Navigates to another route.
|
|
695
|
-
*
|
|
696
|
-
* @example
|
|
697
|
-
* Dolla.router.go("/login"); // navigate to `/login`
|
|
698
|
-
* Dolla.router.go["/users", 215], { replace: true }); // replace current history entry with `/users/215`
|
|
699
|
-
*/
|
|
700
|
-
go(e, t = {}) {
|
|
701
|
-
if (i(this, q) == null)
|
|
702
|
-
throw new Error("Routa methods won't work until you register it: Dolla.use(Routa, { /* ...options */ })");
|
|
703
|
-
let s;
|
|
704
|
-
Array.isArray(e) ? s = K(e) : s = e.toString(), s = Ee(window.location.pathname, s), t.preserveQuery && (s += window.location.search), t.replace ? u(this, p, st).call(this, s) : u(this, p, Oe).call(this, s);
|
|
705
|
-
}
|
|
706
|
-
}
|
|
707
|
-
q = new WeakMap(), L = new WeakMap(), Le = new WeakMap(), T = new WeakMap(), J = new WeakMap(), W = new WeakMap(), A = new WeakMap(), C = new WeakMap(), ce = new WeakMap(), p = new WeakSet(), Oe = function(e, t) {
|
|
708
|
-
i(this, L).info("(push)", e), window.history.pushState(t, "", i(this, W) ? "/#" + e : e), u(this, p, te).call(this, e);
|
|
709
|
-
}, st = function(e, t) {
|
|
710
|
-
i(this, L).info("(replace)", e), window.history.replaceState(t, "", i(this, W) ? "/#" + e : e), u(this, p, te).call(this, e);
|
|
711
|
-
}, rt = function() {
|
|
712
|
-
return i(this, W) ? new URL(window.location.hash.slice(1), window.location.origin) : new URL(window.location.pathname, window.location.origin);
|
|
713
|
-
}, te = async function(e) {
|
|
714
|
-
const t = i(this, L), s = e ? new URL(e, window.location.origin) : u(this, p, rt).call(this), { match: n, journey: r } = await u(this, p, je).call(this, s);
|
|
715
|
-
for (const a of r)
|
|
716
|
-
switch (a.kind) {
|
|
717
|
-
case "match":
|
|
718
|
-
t.info(`📍 ${a.message}`);
|
|
719
|
-
break;
|
|
720
|
-
case "redirect":
|
|
721
|
-
t.info(`↩️ ${a.message}`);
|
|
722
|
-
break;
|
|
723
|
-
case "miss":
|
|
724
|
-
t.info(`💀 ${a.message}`);
|
|
725
|
-
break;
|
|
726
|
-
}
|
|
727
|
-
if (n) {
|
|
728
|
-
const a = this.$pattern.get();
|
|
729
|
-
i(this, ce).call(this, n), n.pattern !== a && u(this, p, nt).call(this, n);
|
|
730
|
-
} else
|
|
731
|
-
t.crash(new qt(`Failed to match route '${s.pathname}'`));
|
|
732
|
-
return { match: n, journey: r };
|
|
733
|
-
}, je = async function(e, t = []) {
|
|
734
|
-
const s = tt(i(this, J), e.pathname);
|
|
735
|
-
if (!s)
|
|
736
|
-
return {
|
|
737
|
-
match: null,
|
|
738
|
-
journey: [...t, { kind: "miss", message: `no match for '${e.pathname}'` }]
|
|
739
|
-
};
|
|
740
|
-
let n = s.meta.redirect;
|
|
741
|
-
if (s.meta.beforeMatch && await s.meta.beforeMatch({
|
|
742
|
-
// TODO: Allow setting context variables from here? Would apply to the context of the matched view.
|
|
743
|
-
redirect: (r) => {
|
|
744
|
-
n = r;
|
|
745
|
-
}
|
|
746
|
-
}), n != null) {
|
|
747
|
-
let r;
|
|
748
|
-
if (E(n))
|
|
749
|
-
r = Ut(n, s.params);
|
|
750
|
-
else if (re(n)) {
|
|
751
|
-
const a = {
|
|
752
|
-
path: s.path,
|
|
753
|
-
pattern: s.pattern,
|
|
754
|
-
params: s.params,
|
|
755
|
-
query: s.query
|
|
756
|
-
};
|
|
757
|
-
if (r = await n(a), !E(r))
|
|
758
|
-
throw new Error("Redirect function must return a path to redirect to.");
|
|
759
|
-
r.startsWith("/") || (r = Ee(s.path, r));
|
|
760
|
-
} else
|
|
761
|
-
throw new TypeError("Redirect must either be a path string or a function.");
|
|
762
|
-
return u(this, p, je).call(this, new URL(r, window.location.origin), [
|
|
763
|
-
...t,
|
|
764
|
-
{ kind: "redirect", message: `redirecting '${s.path}' -> '${r}'` }
|
|
765
|
-
]);
|
|
766
|
-
} else
|
|
767
|
-
return { match: s, journey: [...t, { kind: "match", message: `matched route '${s.path}'` }] };
|
|
768
|
-
}, /**
|
|
769
|
-
* Takes a matched route and mounts it.
|
|
770
|
-
*/
|
|
771
|
-
nt = function(e) {
|
|
772
|
-
const t = e.meta.layers;
|
|
773
|
-
for (let s = 0; s < t.length; s++) {
|
|
774
|
-
const n = t[s], r = i(this, T)[s];
|
|
775
|
-
if ((r == null ? void 0 : r.id) !== n.id) {
|
|
776
|
-
m(this, T, i(this, T).slice(0, s)), r == null || r.view.unmount();
|
|
777
|
-
const a = i(this, T).at(-1), h = ((a == null ? void 0 : a.view) ?? i(this, q).getRootView()).setChildView(n.view);
|
|
778
|
-
i(this, T).push({ id: n.id, view: h });
|
|
779
|
-
}
|
|
780
|
-
}
|
|
781
|
-
}, /**
|
|
782
|
-
* Parses a route definition object into a set of matchable routes.
|
|
783
|
-
*
|
|
784
|
-
* @param route - Route config object.
|
|
785
|
-
* @param layers - Array of parent layers. Passed when this function calls itself on nested routes.
|
|
786
|
-
*/
|
|
787
|
-
Ve = function(e, t = [], s = []) {
|
|
788
|
-
if (!Z(e) || !E(e.path))
|
|
789
|
-
throw new TypeError(`Route configs must be objects with a 'path' string property. Got: ${e}`);
|
|
790
|
-
if (e.redirect && e.routes)
|
|
791
|
-
throw new Error("Route cannot have both a 'redirect' and nested 'routes'.");
|
|
792
|
-
if (e.redirect && e.view)
|
|
793
|
-
throw new Error("Route cannot have both a 'redirect' and a 'view'.");
|
|
794
|
-
if (!e.view && !e.routes && !e.redirect)
|
|
795
|
-
throw new Error("Route must have a 'view', a 'redirect', or a set of nested 'routes'.");
|
|
796
|
-
let n = [];
|
|
797
|
-
for (const h of t)
|
|
798
|
-
n.push(...se(h.path));
|
|
799
|
-
n.push(...se(e.path)), n[n.length - 1] === "*" && n.pop();
|
|
800
|
-
const r = [];
|
|
801
|
-
if (e.redirect) {
|
|
802
|
-
let h = e.redirect;
|
|
803
|
-
return E(h) && (h = Ee(K(n), h), h.startsWith("/") || (h = "/" + h)), r.push({
|
|
804
|
-
pattern: "/" + K([...n, ...se(e.path)]),
|
|
805
|
-
meta: {
|
|
806
|
-
redirect: h
|
|
807
|
-
}
|
|
808
|
-
}), r;
|
|
809
|
-
}
|
|
810
|
-
let a = Xe;
|
|
811
|
-
if (re(e.view))
|
|
812
|
-
a = e.view;
|
|
813
|
-
else if (e.view)
|
|
814
|
-
throw new TypeError(`Route '${e.path}' expected a view function or undefined. Got: ${e.view}`);
|
|
815
|
-
const f = { id: ee(this, Le)._++, view: a };
|
|
816
|
-
if (e.routes)
|
|
817
|
-
for (const h of e.routes)
|
|
818
|
-
r.push(...u(this, p, Ve).call(this, h, [...t, e], [...s, f]));
|
|
819
|
-
else
|
|
820
|
-
r.push({
|
|
821
|
-
pattern: parent ? K([...t.map((h) => h.path), e.path]) : e.path,
|
|
822
|
-
meta: {
|
|
823
|
-
pattern: e.path,
|
|
824
|
-
layers: [...s, f],
|
|
825
|
-
beforeMatch: e.beforeMatch
|
|
826
|
-
}
|
|
827
|
-
});
|
|
828
|
-
return r;
|
|
829
|
-
};
|
|
830
|
-
const Ot = /(noopener|noreferrer) (noopener|noreferrer)/, jt = /^[\w-_]+:/;
|
|
831
|
-
function Vt(o, e, t = window) {
|
|
832
|
-
function s(r) {
|
|
833
|
-
return !r || r === o ? null : r.localName !== "a" || r.href === void 0 ? s(r.parentNode) : r;
|
|
834
|
-
}
|
|
835
|
-
function n(r) {
|
|
836
|
-
if (r.button && r.button !== 0 || r.ctrlKey || r.metaKey || r.altKey || r.shiftKey || r.defaultPrevented)
|
|
837
|
-
return;
|
|
838
|
-
const a = s(r.target);
|
|
839
|
-
a && (t.location.protocol !== a.protocol || t.location.hostname !== a.hostname || t.location.port !== a.port || a.hasAttribute("data-router-ignore") || a.hasAttribute("download") || a.getAttribute("target") === "_blank" && Ot.test(a.getAttribute("rel")) || jt.test(a.getAttribute("href")) || (r.preventDefault(), e(a)));
|
|
840
|
-
}
|
|
841
|
-
return o.addEventListener("click", n), function() {
|
|
842
|
-
o.removeEventListener("click", n);
|
|
843
|
-
};
|
|
844
|
-
}
|
|
845
|
-
function Ut(o, e) {
|
|
846
|
-
for (const t in e) {
|
|
847
|
-
const s = e[t].toString();
|
|
848
|
-
o = o.replace(`{${t}}`, s).replace(`{#${t}}`, s);
|
|
849
|
-
}
|
|
850
|
-
return o;
|
|
851
|
-
}
|
|
852
|
-
function It(o) {
|
|
853
|
-
for (const e of o)
|
|
854
|
-
if (e.meta.redirect) {
|
|
855
|
-
let t;
|
|
856
|
-
if (!re(e.meta.redirect)) if (E(e.meta.redirect)) {
|
|
857
|
-
if (t = e.meta.redirect, !tt(o, t, {
|
|
858
|
-
willMatch(n) {
|
|
859
|
-
return n !== e;
|
|
860
|
-
}
|
|
861
|
-
}))
|
|
862
|
-
throw new Error(`Found a redirect to an undefined URL. From '${e.pattern}' to '${e.meta.redirect}'`);
|
|
863
|
-
} else
|
|
864
|
-
throw new TypeError(`Expected a string or redirect function. Got: ${e.meta.redirect}`);
|
|
865
|
-
}
|
|
866
|
-
}
|
|
867
|
-
class qt extends Error {
|
|
868
|
-
}
|
|
869
|
-
function Wt(o) {
|
|
870
|
-
return He`
|
|
884
|
+
function Je(o) {
|
|
885
|
+
return Ht`
|
|
871
886
|
<div
|
|
872
887
|
style=${{
|
|
873
888
|
backgroundColor: "#880000",
|
|
@@ -881,7 +896,7 @@ function Wt(o) {
|
|
|
881
896
|
<h1 style=${{ marginBottom: "0.5rem" }}>The app has crashed</h1>
|
|
882
897
|
<p style=${{ marginBottom: "0.25rem" }}>
|
|
883
898
|
<span style=${{ fontFamily: "monospace" }}>${o.loggerName}</span>
|
|
884
|
-
${
|
|
899
|
+
${pe(o.uid, Ht`<span style=${{ fontFamily: "monospace", opacity: 0.5 }}> [uid: ${o.uid}]</span>`)}
|
|
885
900
|
${" "}says:
|
|
886
901
|
</p>
|
|
887
902
|
<blockquote
|
|
@@ -913,103 +928,103 @@ function Wt(o) {
|
|
|
913
928
|
</div>
|
|
914
929
|
`;
|
|
915
930
|
}
|
|
916
|
-
var
|
|
917
|
-
class
|
|
918
|
-
constructor(
|
|
931
|
+
var dt, X, N, A, G, Y, Dt, M, mt, D, qt, St;
|
|
932
|
+
class Xe {
|
|
933
|
+
constructor(t) {
|
|
919
934
|
l(this, D);
|
|
920
|
-
l(this,
|
|
935
|
+
l(this, dt);
|
|
921
936
|
l(this, X);
|
|
922
937
|
// Keys ensure only the most recent callback queued with a certain key
|
|
923
938
|
// will be called, keeping DOM operations to a minimum.
|
|
924
939
|
l(this, N, /* @__PURE__ */ new Map());
|
|
925
940
|
// All unkeyed writes are run on every batch.
|
|
926
|
-
l(this,
|
|
941
|
+
l(this, A, []);
|
|
927
942
|
// All read callbacks are run before updates on every batch.
|
|
928
|
-
l(this,
|
|
943
|
+
l(this, G, []);
|
|
929
944
|
l(this, Y, !1);
|
|
930
945
|
// When true, batches that would exceed 16ms will be split and deferred to a rAF.
|
|
931
946
|
// This may not be desirable, because while it does prevent hitching it sometimes leaves
|
|
932
947
|
// the state partially rendered for a brief second and certain elements can be seen to update after the fact.
|
|
933
948
|
// But the tradeoff here is snappier navigation with possibly slightly out of date DOM updates on heavy pages.
|
|
934
|
-
l(this,
|
|
949
|
+
l(this, Dt, !0);
|
|
935
950
|
l(this, M, 0);
|
|
936
|
-
l(this,
|
|
951
|
+
l(this, mt, new Intl.NumberFormat("en-US", {
|
|
937
952
|
maximumFractionDigits: 2,
|
|
938
953
|
minimumFractionDigits: 0,
|
|
939
954
|
style: "unit",
|
|
940
955
|
unit: "millisecond",
|
|
941
956
|
unitDisplay: "short"
|
|
942
957
|
}));
|
|
943
|
-
m(this,
|
|
958
|
+
m(this, dt, t), m(this, X, t.createLogger("Dolla.batch"));
|
|
944
959
|
}
|
|
945
960
|
/**
|
|
946
961
|
* Queues a callback that runs before the next batch of writes.
|
|
947
962
|
*/
|
|
948
|
-
read(
|
|
949
|
-
i(this,
|
|
963
|
+
read(t) {
|
|
964
|
+
i(this, G).push(t), f(this, D, qt).call(this);
|
|
950
965
|
}
|
|
951
966
|
/**
|
|
952
967
|
* Queues a callback to run in the next render batch.
|
|
953
968
|
* Always put DOM mutations in a write callback when possible to help Dolla batch them efficiently.
|
|
954
969
|
*/
|
|
955
|
-
write(
|
|
956
|
-
|
|
970
|
+
write(t, e) {
|
|
971
|
+
e ? i(this, N).set(e, t) : i(this, A).push(t), f(this, D, qt).call(this);
|
|
957
972
|
}
|
|
958
973
|
}
|
|
959
|
-
|
|
974
|
+
dt = new WeakMap(), X = new WeakMap(), N = new WeakMap(), A = new WeakMap(), G = new WeakMap(), Y = new WeakMap(), Dt = new WeakMap(), M = new WeakMap(), mt = new WeakMap(), D = new WeakSet(), qt = function() {
|
|
960
975
|
if (!i(this, Y)) {
|
|
961
976
|
m(this, Y, !0);
|
|
962
|
-
const
|
|
977
|
+
const t = i(this, dt).getEnv() === "development";
|
|
963
978
|
queueMicrotask(() => {
|
|
964
|
-
|
|
979
|
+
f(this, D, St).call(this, t);
|
|
965
980
|
});
|
|
966
981
|
}
|
|
967
|
-
},
|
|
968
|
-
const
|
|
982
|
+
}, St = function(t = !1) {
|
|
983
|
+
const e = performance.now();
|
|
969
984
|
let s = 0;
|
|
970
|
-
const n = i(this,
|
|
985
|
+
const n = i(this, G).length + i(this, N).size + i(this, A).length;
|
|
971
986
|
let r = 0;
|
|
972
|
-
const a = () => (r++, s = performance.now() -
|
|
973
|
-
`⚠️ Deferring batch to next frame. Performed ${r} of ${n} batched operation${r === 1 ? "" : "s"} in ${i(this,
|
|
987
|
+
const a = () => (r++, s = performance.now() - e, i(this, Dt) && s > 12 && r < n ? (st(this, M)._++, t && i(this, X).warn(
|
|
988
|
+
`⚠️ Deferring batch to next frame. Performed ${r} of ${n} batched operation${r === 1 ? "" : "s"} in ${i(this, mt).format(s)} (deferral ${i(this, M)}).`
|
|
974
989
|
), requestAnimationFrame(() => {
|
|
975
|
-
|
|
976
|
-
}), !0) : !1),
|
|
990
|
+
f(this, D, St).call(this, t);
|
|
991
|
+
}), !0) : !1), c = [...i(this, N).entries()];
|
|
977
992
|
let h, w;
|
|
978
|
-
for (; w = i(this,
|
|
993
|
+
for (; w = i(this, G).shift(); )
|
|
979
994
|
if (w(), a()) return;
|
|
980
|
-
for ([h, w] of
|
|
995
|
+
for ([h, w] of c)
|
|
981
996
|
if (w(), i(this, N).delete(h), a()) return;
|
|
982
|
-
for (; w = i(this,
|
|
997
|
+
for (; w = i(this, A).shift(); )
|
|
983
998
|
if (w(), a()) return;
|
|
984
|
-
|
|
985
|
-
`${s > 16 ? "⚠️ (>=16ms) " : ""}Executed ${r} operation${r === 1 ? "" : "s"} in ${i(this,
|
|
986
|
-
), m(this, M, 0), i(this,
|
|
987
|
-
|
|
999
|
+
t && i(this, X)[s > 16 ? "warn" : "info"](
|
|
1000
|
+
`${s > 16 ? "⚠️ (>=16ms) " : ""}Executed ${r} operation${r === 1 ? "" : "s"} in ${i(this, mt).format(s)}${i(this, M) > 0 ? ` (after ${i(this, M)} deferral${i(this, M) === 1 ? "" : "s"})` : ""}.`
|
|
1001
|
+
), m(this, M, 0), i(this, G).length || i(this, N).size || i(this, A).length ? queueMicrotask(() => {
|
|
1002
|
+
f(this, D, St).call(this, t);
|
|
988
1003
|
}) : m(this, Y, !1);
|
|
989
1004
|
};
|
|
990
|
-
var
|
|
991
|
-
class
|
|
1005
|
+
var U, wt, C, B, pt, gt, Z, yt, bt, $t, Et, g, y, j, V, Ft;
|
|
1006
|
+
class Ye {
|
|
992
1007
|
constructor() {
|
|
993
1008
|
d(this, "batch");
|
|
994
1009
|
// Remove `private` when there are public methods to call.
|
|
995
1010
|
d(this, "stats");
|
|
996
1011
|
d(this, "http");
|
|
997
1012
|
d(this, "i18n");
|
|
998
|
-
|
|
999
|
-
l(this,
|
|
1000
|
-
l(this,
|
|
1001
|
-
l(this, j);
|
|
1013
|
+
l(this, U, !1);
|
|
1014
|
+
l(this, wt, "production");
|
|
1015
|
+
l(this, C);
|
|
1002
1016
|
l(this, B);
|
|
1003
|
-
l(this,
|
|
1004
|
-
l(this,
|
|
1005
|
-
l(this,
|
|
1006
|
-
l(this,
|
|
1007
|
-
l(this,
|
|
1008
|
-
l(this,
|
|
1017
|
+
l(this, pt, Je);
|
|
1018
|
+
l(this, gt, zt());
|
|
1019
|
+
l(this, Z);
|
|
1020
|
+
l(this, yt, []);
|
|
1021
|
+
l(this, bt, []);
|
|
1022
|
+
l(this, $t, []);
|
|
1023
|
+
l(this, Et, []);
|
|
1009
1024
|
l(this, g, {
|
|
1010
1025
|
root: this,
|
|
1011
1026
|
data: {},
|
|
1012
|
-
emitter: new
|
|
1027
|
+
emitter: new ge(),
|
|
1013
1028
|
stores: /* @__PURE__ */ new Map(),
|
|
1014
1029
|
viewName: "Dolla"
|
|
1015
1030
|
});
|
|
@@ -1019,54 +1034,54 @@ class Gt {
|
|
|
1019
1034
|
warn: "development",
|
|
1020
1035
|
error: !0
|
|
1021
1036
|
});
|
|
1022
|
-
l(this,
|
|
1023
|
-
l(this,
|
|
1037
|
+
l(this, j, Kt("*,-Dolla.*"));
|
|
1038
|
+
l(this, V, /* @__PURE__ */ new Map());
|
|
1024
1039
|
// Registration functions for modules.
|
|
1025
1040
|
// All modules will be registered before mount.
|
|
1026
|
-
l(this,
|
|
1027
|
-
d(this, "watch", i(this,
|
|
1028
|
-
d(this, "createState",
|
|
1029
|
-
d(this, "toState",
|
|
1030
|
-
d(this, "toValue",
|
|
1031
|
-
d(this, "isState",
|
|
1041
|
+
l(this, Ft, []);
|
|
1042
|
+
d(this, "watch", i(this, gt).watch);
|
|
1043
|
+
d(this, "createState", Wt);
|
|
1044
|
+
d(this, "toState", be);
|
|
1045
|
+
d(this, "toValue", $e);
|
|
1046
|
+
d(this, "isState", Ee);
|
|
1032
1047
|
d(this, "derive", x);
|
|
1033
|
-
d(this, "createWatcher",
|
|
1034
|
-
d(this, "createRef",
|
|
1035
|
-
d(this, "isRef",
|
|
1036
|
-
this.batch = new
|
|
1048
|
+
d(this, "createWatcher", zt);
|
|
1049
|
+
d(this, "createRef", ve);
|
|
1050
|
+
d(this, "isRef", ke);
|
|
1051
|
+
this.batch = new Xe(this), this.stats = new ye(this), this.http = new We(this), this.i18n = new Ke(this);
|
|
1037
1052
|
}
|
|
1038
1053
|
/**
|
|
1039
1054
|
* True when the app is connected to a DOM node and displayed to the user.
|
|
1040
1055
|
*/
|
|
1041
1056
|
get isMounted() {
|
|
1042
|
-
return i(this,
|
|
1057
|
+
return i(this, U);
|
|
1043
1058
|
}
|
|
1044
1059
|
/**
|
|
1045
1060
|
* Get the current environment that this app is running in.
|
|
1046
1061
|
* Environment affects which log messages will print and how much debugging info is included in the DOM.
|
|
1047
1062
|
*/
|
|
1048
1063
|
getEnv() {
|
|
1049
|
-
return i(this,
|
|
1064
|
+
return i(this, wt);
|
|
1050
1065
|
}
|
|
1051
1066
|
/**
|
|
1052
1067
|
* Sets the environment that this app is running in.
|
|
1053
1068
|
* Environment affects which log messages will print and how much debugging info is included in the DOM.
|
|
1054
1069
|
*/
|
|
1055
|
-
setEnv(
|
|
1056
|
-
m(this,
|
|
1070
|
+
setEnv(t) {
|
|
1071
|
+
m(this, wt, t);
|
|
1057
1072
|
}
|
|
1058
1073
|
/**
|
|
1059
1074
|
* Sets the view that will be shown when the `crash` method is called on any logger.
|
|
1060
1075
|
* When a crash is reported the app will be unmounted and replaced with this crash page.
|
|
1061
1076
|
*/
|
|
1062
|
-
setCrashView(
|
|
1063
|
-
m(this,
|
|
1077
|
+
setCrashView(t) {
|
|
1078
|
+
m(this, pt, t);
|
|
1064
1079
|
}
|
|
1065
1080
|
/**
|
|
1066
1081
|
* Returns the HTMLElement Dolla is mounted to. This will return undefined until Dolla.mount() is called.
|
|
1067
1082
|
*/
|
|
1068
1083
|
getRootElement() {
|
|
1069
|
-
return i(this,
|
|
1084
|
+
return i(this, C);
|
|
1070
1085
|
}
|
|
1071
1086
|
/**
|
|
1072
1087
|
* Returns the top level view Dolla is rendering inside the root element. This will return undefined until Dolla.mount() is called.
|
|
@@ -1077,14 +1092,14 @@ class Gt {
|
|
|
1077
1092
|
/**
|
|
1078
1093
|
* Sets a context variable and returns its value. Context variables are accessible on the app and in child views.
|
|
1079
1094
|
*/
|
|
1080
|
-
set(
|
|
1081
|
-
return i(this, g).data[
|
|
1095
|
+
set(t, e) {
|
|
1096
|
+
return i(this, g).data[t] = e, e;
|
|
1082
1097
|
}
|
|
1083
1098
|
/**
|
|
1084
1099
|
* Gets the value of a context variable. Returns null if the variable is not set.
|
|
1085
1100
|
*/
|
|
1086
|
-
get(
|
|
1087
|
-
return i(this, g).data[
|
|
1101
|
+
get(t) {
|
|
1102
|
+
return i(this, g).data[t] ?? null;
|
|
1088
1103
|
}
|
|
1089
1104
|
/**
|
|
1090
1105
|
* Returns an object of all context variables stored at the app level.
|
|
@@ -1095,142 +1110,139 @@ class Gt {
|
|
|
1095
1110
|
/**
|
|
1096
1111
|
* Adds a listener to be called when `eventName` is emitted.
|
|
1097
1112
|
*/
|
|
1098
|
-
on(
|
|
1099
|
-
if (
|
|
1113
|
+
on(t, e) {
|
|
1114
|
+
if (t === "*") {
|
|
1100
1115
|
const s = (n, r) => {
|
|
1101
|
-
|
|
1116
|
+
e(r);
|
|
1102
1117
|
};
|
|
1103
|
-
i(this, g).emitter.on(
|
|
1118
|
+
i(this, g).emitter.on(t, s), i(this, V).set(e, s);
|
|
1104
1119
|
} else
|
|
1105
|
-
i(this, g).emitter.on(
|
|
1120
|
+
i(this, g).emitter.on(t, e);
|
|
1106
1121
|
}
|
|
1107
1122
|
/**
|
|
1108
1123
|
* Removes a listener from the list to be called when `eventName` is emitted.
|
|
1109
1124
|
*/
|
|
1110
|
-
off(
|
|
1111
|
-
if (
|
|
1112
|
-
const s = i(this,
|
|
1113
|
-
s && (i(this, g).emitter.off(
|
|
1125
|
+
off(t, e) {
|
|
1126
|
+
if (t === "*") {
|
|
1127
|
+
const s = i(this, V).get(e);
|
|
1128
|
+
s && (i(this, g).emitter.off(t, s), i(this, V).delete(e));
|
|
1114
1129
|
} else
|
|
1115
|
-
i(this, g).emitter.off(
|
|
1130
|
+
i(this, g).emitter.off(t, e);
|
|
1116
1131
|
}
|
|
1117
1132
|
/**
|
|
1118
1133
|
* Adds a listener to be called when `eventName` is emitted. The listener is immediately removed after being called once.
|
|
1119
1134
|
*/
|
|
1120
|
-
once(
|
|
1121
|
-
if (
|
|
1135
|
+
once(t, e) {
|
|
1136
|
+
if (t === "*") {
|
|
1122
1137
|
const s = (n, r) => {
|
|
1123
|
-
i(this,
|
|
1138
|
+
i(this, V).delete(e), e(r);
|
|
1124
1139
|
};
|
|
1125
|
-
i(this, g).emitter.once(
|
|
1140
|
+
i(this, g).emitter.once(t, s), i(this, V).set(e, s);
|
|
1126
1141
|
} else
|
|
1127
|
-
i(this, g).emitter.once(
|
|
1142
|
+
i(this, g).emitter.once(t, e);
|
|
1128
1143
|
}
|
|
1129
1144
|
/**
|
|
1130
1145
|
* Emits a new event to all listeners.
|
|
1131
1146
|
*/
|
|
1132
|
-
emit(
|
|
1133
|
-
return i(this, g).emitter.emit(
|
|
1147
|
+
emit(t, e) {
|
|
1148
|
+
return i(this, g).emitter.emit(t, new Re(t, e));
|
|
1134
1149
|
}
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
if (!e.attach(i(this, g))) {
|
|
1140
|
-
let s = e.name ? `'${e.name}'` : "this store";
|
|
1141
|
-
console.warn(`An instance of ${s} was already attached to this context.`);
|
|
1150
|
+
attachStore(t, e) {
|
|
1151
|
+
if (!new xe(t, e).attach(i(this, g))) {
|
|
1152
|
+
let r = t.name ? `'${t.name}'` : "this store";
|
|
1153
|
+
console.warn(`An instance of ${r} was already attached to this context.`);
|
|
1142
1154
|
}
|
|
1143
1155
|
}
|
|
1144
1156
|
/**
|
|
1145
1157
|
* Gets the nearest instance of a store. Throws an error if the store isn't provided higher in the tree.
|
|
1146
1158
|
*/
|
|
1147
|
-
useStore(
|
|
1148
|
-
if (
|
|
1149
|
-
const
|
|
1150
|
-
if (
|
|
1151
|
-
throw new
|
|
1152
|
-
return
|
|
1153
|
-
} else
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
if (i(this, O))
|
|
1159
|
+
useStore(t) {
|
|
1160
|
+
if (tt(t)) {
|
|
1161
|
+
const e = i(this, g).stores.get(t);
|
|
1162
|
+
if (e == null)
|
|
1163
|
+
throw new Qt("Store not found on this context.");
|
|
1164
|
+
return e.value;
|
|
1165
|
+
} else
|
|
1166
|
+
throw new Qt("Invalid store.");
|
|
1167
|
+
}
|
|
1168
|
+
async mount(t, e) {
|
|
1169
|
+
if (i(this, U))
|
|
1159
1170
|
throw new Error("Dolla is already mounted.");
|
|
1160
|
-
if (
|
|
1161
|
-
const
|
|
1162
|
-
|
|
1171
|
+
if (v(t)) {
|
|
1172
|
+
const r = document.querySelector(t);
|
|
1173
|
+
Jt(HTMLElement, r, `Selector '${t}' did not match any element.`), m(this, C, r);
|
|
1163
1174
|
} else
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1175
|
+
Jt(HTMLElement, t, "Expected an HTML element or a selector string. Got type: %t, value: %v"), m(this, C, t);
|
|
1176
|
+
Tt(e) && m(this, Z, e);
|
|
1177
|
+
const s = Tt(e) ? ee : e, n = Se(s);
|
|
1178
|
+
m(this, B, this.constructView(n.type, n.props)), await Promise.all(i(this, Ft).map((r) => r())), Tt(e) && await Te(e, this), await Promise.all(i(this, yt).map((r) => r())), i(this, B).mount(i(this, C)), m(this, U, !0);
|
|
1179
|
+
for (const r of i(this, g).stores.values())
|
|
1180
|
+
r.handleMount();
|
|
1181
|
+
for (const r of i(this, bt))
|
|
1182
|
+
r();
|
|
1171
1183
|
}
|
|
1172
1184
|
async unmount() {
|
|
1173
|
-
var
|
|
1174
|
-
if (i(this,
|
|
1175
|
-
await Promise.all(i(this,
|
|
1176
|
-
for (const
|
|
1177
|
-
|
|
1185
|
+
var t;
|
|
1186
|
+
if (i(this, U)) {
|
|
1187
|
+
await Promise.all(i(this, $t).map((e) => e())), (t = i(this, B)) == null || t.unmount(!1), i(this, gt).stopAll(), i(this, Z) && await Oe(i(this, Z)), m(this, U, !1);
|
|
1188
|
+
for (const e of i(this, Et))
|
|
1189
|
+
e();
|
|
1178
1190
|
}
|
|
1179
1191
|
}
|
|
1180
1192
|
/**
|
|
1181
1193
|
* Registers a `callback` to run after `Dolla.mount` is called, before the app is mounted. If `callback` returns a Promise,
|
|
1182
1194
|
* it will be awaited before mounting finishes. Use this to perform initial setup before the app is displayed to the user.
|
|
1183
1195
|
*/
|
|
1184
|
-
beforeMount(
|
|
1185
|
-
i(this,
|
|
1196
|
+
beforeMount(t) {
|
|
1197
|
+
i(this, yt).push(t);
|
|
1186
1198
|
}
|
|
1187
1199
|
/**
|
|
1188
1200
|
* Registers a `callback` to run after the app is mounted.
|
|
1189
1201
|
*/
|
|
1190
|
-
onMount(
|
|
1191
|
-
i(this,
|
|
1202
|
+
onMount(t) {
|
|
1203
|
+
i(this, bt).push(t);
|
|
1192
1204
|
}
|
|
1193
1205
|
/**
|
|
1194
1206
|
* Registers a `callback` to run after `Dolla.unmount` is called, before the app is unmounted. If `callback` returns a Promise,
|
|
1195
1207
|
* it will be awaited before unmounting finishes. Use this to perform cleanup.
|
|
1196
1208
|
*/
|
|
1197
|
-
beforeUnmount(
|
|
1198
|
-
i(this,
|
|
1209
|
+
beforeUnmount(t) {
|
|
1210
|
+
i(this, $t).push(t);
|
|
1199
1211
|
}
|
|
1200
1212
|
/**
|
|
1201
1213
|
* Registers a `callback` to run after the app is unmounted.
|
|
1202
1214
|
*/
|
|
1203
|
-
onUnmount(
|
|
1204
|
-
i(this,
|
|
1215
|
+
onUnmount(t) {
|
|
1216
|
+
i(this, Et).push(t);
|
|
1205
1217
|
}
|
|
1206
1218
|
/**
|
|
1207
1219
|
* Update log type toggles. Values that are not passed will remain unchanged.
|
|
1208
1220
|
*/
|
|
1209
|
-
setLoggles(
|
|
1210
|
-
for (const
|
|
1211
|
-
const s = e
|
|
1212
|
-
s && (i(this, y)[
|
|
1221
|
+
setLoggles(t) {
|
|
1222
|
+
for (const e in t) {
|
|
1223
|
+
const s = t[e];
|
|
1224
|
+
s && (i(this, y)[e] = s);
|
|
1213
1225
|
}
|
|
1214
1226
|
}
|
|
1215
|
-
setLogFilter(
|
|
1216
|
-
m(this,
|
|
1227
|
+
setLogFilter(t) {
|
|
1228
|
+
m(this, j, Kt(t));
|
|
1217
1229
|
}
|
|
1218
|
-
createLogger(
|
|
1219
|
-
const s = (
|
|
1230
|
+
createLogger(t, e) {
|
|
1231
|
+
const s = (e == null ? void 0 : e.console) ?? Ze(), n = this;
|
|
1220
1232
|
return {
|
|
1221
1233
|
setName(r) {
|
|
1222
|
-
return
|
|
1234
|
+
return t = r, this;
|
|
1223
1235
|
},
|
|
1224
1236
|
get info() {
|
|
1225
1237
|
var r;
|
|
1226
|
-
if (i(n, y).info === !1 ||
|
|
1227
|
-
return
|
|
1238
|
+
if (i(n, y).info === !1 || v(i(n, y).info) && i(n, y).info !== n.getEnv() || !i(r = n, j).call(r, t))
|
|
1239
|
+
return vt;
|
|
1228
1240
|
{
|
|
1229
|
-
let a = `%c${
|
|
1230
|
-
return
|
|
1241
|
+
let a = `%c${t}`;
|
|
1242
|
+
return e != null && e.uid ? a += ` %c[uid: %c${e.uid}%c]` : a += "%c%c%c", s.info.bind(
|
|
1231
1243
|
s,
|
|
1232
1244
|
a,
|
|
1233
|
-
`color:${
|
|
1245
|
+
`color:${kt(a)};font-weight:bold`,
|
|
1234
1246
|
"color:#777",
|
|
1235
1247
|
"color:#aaa",
|
|
1236
1248
|
"color:#777"
|
|
@@ -1239,14 +1251,14 @@ class Gt {
|
|
|
1239
1251
|
},
|
|
1240
1252
|
get log() {
|
|
1241
1253
|
var r;
|
|
1242
|
-
if (i(n, y).log === !1 ||
|
|
1243
|
-
return
|
|
1254
|
+
if (i(n, y).log === !1 || v(i(n, y).log) && i(n, y).log !== n.getEnv() || !i(r = n, j).call(r, t))
|
|
1255
|
+
return vt;
|
|
1244
1256
|
{
|
|
1245
|
-
let a = `%c${
|
|
1246
|
-
return
|
|
1257
|
+
let a = `%c${t}`;
|
|
1258
|
+
return e != null && e.uid ? a += ` %c[uid: %c${e.uid}%c]` : a += "%c%c%c", s.log.bind(
|
|
1247
1259
|
s,
|
|
1248
1260
|
a,
|
|
1249
|
-
`color:${
|
|
1261
|
+
`color:${kt(a)};font-weight:bold`,
|
|
1250
1262
|
"color:#777",
|
|
1251
1263
|
"color:#aaa",
|
|
1252
1264
|
"color:#777"
|
|
@@ -1255,14 +1267,14 @@ class Gt {
|
|
|
1255
1267
|
},
|
|
1256
1268
|
get warn() {
|
|
1257
1269
|
var r;
|
|
1258
|
-
if (i(n, y).warn === !1 ||
|
|
1259
|
-
return
|
|
1270
|
+
if (i(n, y).warn === !1 || v(i(n, y).warn) && i(n, y).warn !== n.getEnv() || !i(r = n, j).call(r, t))
|
|
1271
|
+
return vt;
|
|
1260
1272
|
{
|
|
1261
|
-
let a = `%c${
|
|
1262
|
-
return
|
|
1273
|
+
let a = `%c${t}`;
|
|
1274
|
+
return e != null && e.uid ? a += ` %c[uid: %c${e.uid}%c]` : a += "%c%c%c", s.warn.bind(
|
|
1263
1275
|
s,
|
|
1264
1276
|
a,
|
|
1265
|
-
`color:${
|
|
1277
|
+
`color:${kt(a)};font-weight:bold`,
|
|
1266
1278
|
"color:#777",
|
|
1267
1279
|
"color:#aaa",
|
|
1268
1280
|
"color:#777"
|
|
@@ -1271,14 +1283,14 @@ class Gt {
|
|
|
1271
1283
|
},
|
|
1272
1284
|
get error() {
|
|
1273
1285
|
var r;
|
|
1274
|
-
if (i(n, y).error === !1 ||
|
|
1275
|
-
return
|
|
1286
|
+
if (i(n, y).error === !1 || v(i(n, y).error) && i(n, y).error !== n.getEnv() || !i(r = n, j).call(r, t))
|
|
1287
|
+
return vt;
|
|
1276
1288
|
{
|
|
1277
|
-
let a = `%c${
|
|
1278
|
-
return
|
|
1289
|
+
let a = `%c${t}`;
|
|
1290
|
+
return e != null && e.uid ? a += ` %c[uid: %c${e.uid}%c]` : a += "%c%c%c", s.error.bind(
|
|
1279
1291
|
s,
|
|
1280
1292
|
a,
|
|
1281
|
-
`color:${
|
|
1293
|
+
`color:${kt(a)};font-weight:bold`,
|
|
1282
1294
|
"color:#777",
|
|
1283
1295
|
"color:#aaa",
|
|
1284
1296
|
"color:#777"
|
|
@@ -1286,62 +1298,61 @@ class Gt {
|
|
|
1286
1298
|
}
|
|
1287
1299
|
},
|
|
1288
1300
|
crash(r) {
|
|
1289
|
-
throw n.isMounted && (n.unmount(), n.constructView(i(n,
|
|
1301
|
+
throw n.isMounted && (n.unmount(), n.constructView(i(n, pt), {
|
|
1290
1302
|
error: r,
|
|
1291
|
-
loggerName:
|
|
1292
|
-
uid:
|
|
1293
|
-
}).mount(i(n,
|
|
1303
|
+
loggerName: t,
|
|
1304
|
+
uid: e == null ? void 0 : e.uid
|
|
1305
|
+
}).mount(i(n, C))), r;
|
|
1294
1306
|
}
|
|
1295
1307
|
};
|
|
1296
1308
|
}
|
|
1297
1309
|
/**
|
|
1298
1310
|
*
|
|
1299
1311
|
*/
|
|
1300
|
-
constructView(
|
|
1301
|
-
return new
|
|
1312
|
+
constructView(t, e, s = []) {
|
|
1313
|
+
return new _e(i(this, g), t, e, s);
|
|
1302
1314
|
}
|
|
1303
1315
|
/**
|
|
1304
1316
|
*
|
|
1305
1317
|
*/
|
|
1306
|
-
constructMarkup(
|
|
1307
|
-
return
|
|
1318
|
+
constructMarkup(t) {
|
|
1319
|
+
return Le(Me(i(this, g), t));
|
|
1308
1320
|
}
|
|
1309
1321
|
}
|
|
1310
|
-
|
|
1311
|
-
function
|
|
1322
|
+
U = new WeakMap(), wt = new WeakMap(), C = new WeakMap(), B = new WeakMap(), pt = new WeakMap(), gt = new WeakMap(), Z = new WeakMap(), yt = new WeakMap(), bt = new WeakMap(), $t = new WeakMap(), Et = new WeakMap(), g = new WeakMap(), y = new WeakMap(), j = new WeakMap(), V = new WeakMap(), Ft = new WeakMap();
|
|
1323
|
+
function Ze() {
|
|
1312
1324
|
if (typeof window < "u" && window.console)
|
|
1313
1325
|
return window.console;
|
|
1314
1326
|
if (typeof global < "u" && global.console)
|
|
1315
1327
|
return global.console;
|
|
1316
1328
|
}
|
|
1317
|
-
const
|
|
1318
|
-
function
|
|
1329
|
+
const Xt = new Ye(), rs = Xt.i18n.t.bind(Xt.i18n);
|
|
1330
|
+
function ns(o) {
|
|
1319
1331
|
typeof window < "u" && (window.DOLLA_DEV_DEBUG = o);
|
|
1320
1332
|
}
|
|
1321
|
-
function
|
|
1333
|
+
function is() {
|
|
1322
1334
|
return typeof window < "u" ? window.DOLLA_DEV_DEBUG === !0 : !1;
|
|
1323
1335
|
}
|
|
1324
1336
|
export {
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
Qe as default,
|
|
1337
|
+
pe as cond,
|
|
1338
|
+
Se as createMarkup,
|
|
1339
|
+
ve as createRef,
|
|
1340
|
+
ss as createRouter,
|
|
1341
|
+
Wt as createState,
|
|
1342
|
+
we as deepEqual,
|
|
1343
|
+
Xt as default,
|
|
1333
1344
|
x as derive,
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1345
|
+
is as getDevDebug,
|
|
1346
|
+
Ht as html,
|
|
1347
|
+
ke as isRef,
|
|
1348
|
+
Ee as isState,
|
|
1349
|
+
ls as portal,
|
|
1350
|
+
hs as repeat,
|
|
1351
|
+
ns as setDevDebug,
|
|
1352
|
+
Gt as shallowEqual,
|
|
1353
|
+
cs as strictEqual,
|
|
1354
|
+
rs as t,
|
|
1355
|
+
be as toState,
|
|
1356
|
+
$e as toValue
|
|
1346
1357
|
};
|
|
1347
1358
|
//# sourceMappingURL=index.js.map
|