use-navigation-api 0.1.0 → 0.3.0

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.
@@ -0,0 +1,6 @@
1
+ export * from './navigationProvider';
2
+ export * from './useNavigate';
3
+ export * from './location/useQueryParam';
4
+ export * from './location/useQueryParams';
5
+ export * from './location/useLocation';
6
+ export * from './location/useLocationWithParam';
@@ -0,0 +1,15 @@
1
+ export type Location = string;
2
+ export declare function resolveLocation(location: string, base: string): string;
3
+ /**
4
+ * Returns the current location for the navigation context.
5
+ */
6
+ export declare function useLocation(): Location;
7
+ /**
8
+ * Resolves a URL string relative to the current location and returns its parts.
9
+ */
10
+ export declare function useLocation(url: string, base?: string): Location;
11
+ /**
12
+ * Returns a location based on the returned url if present, or the modified input argument.
13
+ * For instance, `useLocation(url => url.searchParams.set("parameter", "value"))` returns the current location with only a single parameter updated.
14
+ */
15
+ export declare function useLocation(url: (current: URL) => URL | void, base?: string): Location;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * returns The current location with the specified parameter set to the provided value or removed if the value === null.
3
+ * @param param name of the query parameter to set
4
+ * @param value value to set the parameter to, or `null` to remove any existing value of that parameter
5
+ * @param base If provided, uses this value instead of the current location.
6
+ */
7
+ export declare function useLocationWithParam(param: string, value: string | null, base?: string): string;
8
+ /**
9
+ * returns The current location with the specified parameter set to the provided value or removed if the value === null.
10
+ * @param params map of parameters to update. null or empty entries will be removed.
11
+ * @param base If provided, uses this value instead of the current location.
12
+ */
13
+ export declare function useLocationWithParams(params: Record<string, string | string[] | null>, base?: string): string;
@@ -0,0 +1,9 @@
1
+ export declare function parseSearchParams(location?: string): URLSearchParams;
2
+ /**
3
+ * Returns the first value for a query parameter, or null if it is missing.
4
+ */
5
+ export declare function useQueryParam(param: string, all?: false): string | null;
6
+ /**
7
+ * Returns all values for a query parameter when it appears multiple times.
8
+ */
9
+ export declare function useQueryParam(param: string, all: true): string[];
@@ -0,0 +1,5 @@
1
+ export type ParamsMapper<T> = (params: URLSearchParams) => T;
2
+ export declare function mapQueryParams(params: URLSearchParams, keys?: string[]): Record<string, string | string[]>;
3
+ export declare function useQueryParams(): Record<string, string | string[]>;
4
+ export declare function useQueryParams<K extends string>(keys: K[]): Record<K, string | string[]>;
5
+ export declare function useQueryParams<T>(mapper: ParamsMapper<T>): T;
@@ -0,0 +1,18 @@
1
+ import { Dispatch, FC, ReactNode, SetStateAction } from 'react';
2
+ export type NavigationContextState = {
3
+ url: string;
4
+ store: "url" | "hash" | "memory";
5
+ };
6
+ type NavigationContextValue = NavigationContextState & {
7
+ setState?: Dispatch<SetStateAction<NavigationContextState>>;
8
+ };
9
+ export declare const NavigationContext: import('react').Context<NavigationContextValue>;
10
+ declare function defaultShouldHandle(event: NavigateEvent): boolean;
11
+ type ShouldHandle = typeof defaultShouldHandle;
12
+ export declare const NavigationProvider: FC<{
13
+ children: ReactNode;
14
+ store?: "url" | "hash" | "memory";
15
+ scoped?: boolean;
16
+ shouldHandle?: ShouldHandle;
17
+ }>;
18
+ export {};
@@ -0,0 +1,645 @@
1
+ import { createContext, createElement, useContext, useEffect, useMemo, useState } from "react";
2
+ var __create = Object.create, __defProp = Object.defineProperty, __getOwnPropDesc = Object.getOwnPropertyDescriptor, __getOwnPropNames = Object.getOwnPropertyNames, __getProtoOf = Object.getPrototypeOf, __hasOwnProp = Object.prototype.hasOwnProperty, __commonJSMin = (e, t) => () => (t || e((t = { exports: {} }).exports, t), t.exports), __copyProps = (e, t, n, r) => {
3
+ if (t && typeof t == "object" || typeof t == "function") for (var i = __getOwnPropNames(t), a = 0, o = i.length, u; a < o; a++) u = i[a], !__hasOwnProp.call(e, u) && u !== n && __defProp(e, u, {
4
+ get: ((e) => t[e]).bind(null, u),
5
+ enumerable: !(r = __getOwnPropDesc(t, u)) || r.enumerable
6
+ });
7
+ return e;
8
+ }, __toESM = (e, t, n) => (n = e == null ? {} : __create(__getProtoOf(e)), __copyProps(t || !e || !e.__esModule ? __defProp(n, "default", {
9
+ value: e,
10
+ enumerable: !0
11
+ }) : n, e)), require_uri_all = /* @__PURE__ */ __commonJSMin(((e, t) => {
12
+ /** @license URI.js v4.4.1 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js */
13
+ (function(n, r) {
14
+ typeof e == "object" && t !== void 0 ? r(e) : typeof define == "function" && define.amd ? define(["exports"], r) : r(n.URI = n.URI || {});
15
+ })(e, (function(e) {
16
+ function t() {
17
+ var e = [...arguments];
18
+ if (e.length > 1) {
19
+ e[0] = e[0].slice(0, -1);
20
+ for (var t = e.length - 1, n = 1; n < t; ++n) e[n] = e[n].slice(1, -1);
21
+ return e[t] = e[t].slice(1), e.join("");
22
+ } else return e[0];
23
+ }
24
+ function n(e) {
25
+ return "(?:" + e + ")";
26
+ }
27
+ function r(e) {
28
+ return e === void 0 ? "undefined" : e === null ? "null" : Object.prototype.toString.call(e).split(" ").pop().split("]").shift().toLowerCase();
29
+ }
30
+ function i(e) {
31
+ return e.toUpperCase();
32
+ }
33
+ function a(e) {
34
+ return e == null ? [] : e instanceof Array ? e : typeof e.length != "number" || e.split || e.setInterval || e.call ? [e] : Array.prototype.slice.call(e);
35
+ }
36
+ function o(e, t) {
37
+ var n = e;
38
+ if (t) for (var r in t) n[r] = t[r];
39
+ return n;
40
+ }
41
+ function s(e) {
42
+ var r = "[A-Za-z]", i = "[0-9]", a = t(i, "[A-Fa-f]"), o = n(n("%[EFef]" + a + "%" + a + a + "%" + a + a) + "|" + n("%[89A-Fa-f]" + a + "%" + a + a) + "|" + n("%" + a + a)), s = "[\\:\\/\\?\\#\\[\\]\\@]", c = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]", l = t(s, c), u = e ? "[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]" : "[]", d = e ? "[\\uE000-\\uF8FF]" : "[]", f = t(r, i, "[\\-\\.\\_\\~]", u), p = n(r + t(r, i, "[\\+\\-\\.]") + "*"), m = n(n(o + "|" + t(f, c, "[\\:]")) + "*");
43
+ n(n("25[0-5]") + "|" + n("2[0-4]" + i) + "|" + n("1" + i + i) + "|" + n("[1-9]" + i) + "|" + i);
44
+ var h = n(n("25[0-5]") + "|" + n("2[0-4]" + i) + "|" + n("1" + i + i) + "|" + n("0?[1-9]" + i) + "|0?0?" + i), g = n(h + "\\." + h + "\\." + h + "\\." + h), _ = n(a + "{1,4}"), v = n(n(_ + "\\:" + _) + "|" + g), y = n([
45
+ n(n(_ + "\\:") + "{6}" + v),
46
+ n("\\:\\:" + n(_ + "\\:") + "{5}" + v),
47
+ n(n(_) + "?\\:\\:" + n(_ + "\\:") + "{4}" + v),
48
+ n(n(n(_ + "\\:") + "{0,1}" + _) + "?\\:\\:" + n(_ + "\\:") + "{3}" + v),
49
+ n(n(n(_ + "\\:") + "{0,2}" + _) + "?\\:\\:" + n(_ + "\\:") + "{2}" + v),
50
+ n(n(n(_ + "\\:") + "{0,3}" + _) + "?\\:\\:" + _ + "\\:" + v),
51
+ n(n(n(_ + "\\:") + "{0,4}" + _) + "?\\:\\:" + v),
52
+ n(n(n(_ + "\\:") + "{0,5}" + _) + "?\\:\\:" + _),
53
+ n(n(n(_ + "\\:") + "{0,6}" + _) + "?\\:\\:")
54
+ ].join("|")), b = n(n(f + "|" + o) + "+");
55
+ n(y + "\\%25" + b);
56
+ var x = n(y + n("\\%25|\\%(?!" + a + "{2})") + b), S = n("[vV]" + a + "+\\." + t(f, c, "[\\:]") + "+"), C = n("\\[" + n(x + "|" + y + "|" + S) + "\\]"), w = n(n(o + "|" + t(f, c)) + "*"), T = n(C + "|" + g + "(?!" + w + ")|" + w), E = n(i + "*"), D = n(n(m + "@") + "?" + T + n("\\:" + E) + "?"), O = n(o + "|" + t(f, c, "[\\:\\@]")), k = n(O + "*"), A = n(O + "+"), ee = n(n(o + "|" + t(f, c, "[\\@]")) + "+"), j = n(n("\\/" + k) + "*"), M = n("\\/" + n(A + j) + "?"), N = n(ee + j), P = n(A + j), F = "(?!" + O + ")";
57
+ n(j + "|" + M + "|" + N + "|" + P + "|" + F);
58
+ var I = n(n(O + "|" + t("[\\/\\?]", d)) + "*"), L = n(n(O + "|[\\/\\?]") + "*"), R = n(n("\\/\\/" + D + j) + "|" + M + "|" + P + "|" + F), z = n(p + "\\:" + R + n("\\?" + I) + "?" + n("\\#" + L) + "?"), B = n(n(n("\\/\\/" + D + j) + "|" + M + "|" + N + "|" + F) + n("\\?" + I) + "?" + n("\\#" + L) + "?");
59
+ return n(z + "|" + B), n(p + "\\:" + R + n("\\?" + I) + "?"), "" + p + n(n("\\/\\/(" + n("(" + m + ")@") + "?(" + T + ")" + n("\\:(" + E + ")") + "?)") + "?(" + j + "|" + M + "|" + P + "|" + F + ")") + n("\\?(" + I + ")") + n("\\#(" + L + ")"), "" + n(n("\\/\\/(" + n("(" + m + ")@") + "?(" + T + ")" + n("\\:(" + E + ")") + "?)") + "?(" + j + "|" + M + "|" + N + "|" + F + ")") + n("\\?(" + I + ")") + n("\\#(" + L + ")"), "" + p + n(n("\\/\\/(" + n("(" + m + ")@") + "?(" + T + ")" + n("\\:(" + E + ")") + "?)") + "?(" + j + "|" + M + "|" + P + "|" + F + ")") + n("\\?(" + I + ")"), "" + n("\\#(" + L + ")"), "" + n("(" + m + ")@") + T + n("\\:(" + E + ")"), {
60
+ NOT_SCHEME: new RegExp(t("[^]", r, i, "[\\+\\-\\.]"), "g"),
61
+ NOT_USERINFO: new RegExp(t("[^\\%\\:]", f, c), "g"),
62
+ NOT_HOST: new RegExp(t("[^\\%\\[\\]\\:]", f, c), "g"),
63
+ NOT_PATH: new RegExp(t("[^\\%\\/\\:\\@]", f, c), "g"),
64
+ NOT_PATH_NOSCHEME: new RegExp(t("[^\\%\\/\\@]", f, c), "g"),
65
+ NOT_QUERY: new RegExp(t("[^\\%]", f, c, "[\\:\\@\\/\\?]", d), "g"),
66
+ NOT_FRAGMENT: new RegExp(t("[^\\%]", f, c, "[\\:\\@\\/\\?]"), "g"),
67
+ ESCAPE: new RegExp(t("[^]", f, c), "g"),
68
+ UNRESERVED: new RegExp(f, "g"),
69
+ OTHER_CHARS: new RegExp(t("[^\\%]", f, l), "g"),
70
+ PCT_ENCODED: new RegExp(o, "g"),
71
+ IPV4ADDRESS: /* @__PURE__ */ RegExp("^(" + g + ")$"),
72
+ IPV6ADDRESS: /* @__PURE__ */ RegExp("^\\[?(" + y + ")" + n(n("\\%25|\\%(?!" + a + "{2})") + "(" + b + ")") + "?\\]?$")
73
+ };
74
+ }
75
+ var c = s(!1), l = s(!0), u = function() {
76
+ function e(e, t) {
77
+ var n = [], r = !0, i = !1, a = void 0;
78
+ try {
79
+ for (var o = e[Symbol.iterator](), s; !(r = (s = o.next()).done) && (n.push(s.value), !(t && n.length === t)); r = !0);
80
+ } catch (e) {
81
+ i = !0, a = e;
82
+ } finally {
83
+ try {
84
+ !r && o.return && o.return();
85
+ } finally {
86
+ if (i) throw a;
87
+ }
88
+ }
89
+ return n;
90
+ }
91
+ return function(t, n) {
92
+ if (Array.isArray(t)) return t;
93
+ if (Symbol.iterator in Object(t)) return e(t, n);
94
+ throw TypeError("Invalid attempt to destructure non-iterable instance");
95
+ };
96
+ }(), d = function(e) {
97
+ if (Array.isArray(e)) {
98
+ for (var t = 0, n = Array(e.length); t < e.length; t++) n[t] = e[t];
99
+ return n;
100
+ } else return Array.from(e);
101
+ }, f = 2147483647, p = 36, m = 1, h = 26, g = 38, _ = 700, v = 72, y = 128, b = "-", x = /^xn--/, S = /[^\0-\x7E]/, C = /[\x2E\u3002\uFF0E\uFF61]/g, w = {
102
+ overflow: "Overflow: input needs wider integers to process",
103
+ "not-basic": "Illegal input >= 0x80 (not a basic code point)",
104
+ "invalid-input": "Invalid input"
105
+ }, T = p - m, E = Math.floor, D = String.fromCharCode;
106
+ function O(e) {
107
+ throw RangeError(w[e]);
108
+ }
109
+ function k(e, t) {
110
+ for (var n = [], r = e.length; r--;) n[r] = t(e[r]);
111
+ return n;
112
+ }
113
+ function A(e, t) {
114
+ var n = e.split("@"), r = "";
115
+ n.length > 1 && (r = n[0] + "@", e = n[1]), e = e.replace(C, ".");
116
+ var i = k(e.split("."), t).join(".");
117
+ return r + i;
118
+ }
119
+ function ee(e) {
120
+ for (var t = [], n = 0, r = e.length; n < r;) {
121
+ var i = e.charCodeAt(n++);
122
+ if (i >= 55296 && i <= 56319 && n < r) {
123
+ var a = e.charCodeAt(n++);
124
+ (a & 64512) == 56320 ? t.push(((i & 1023) << 10) + (a & 1023) + 65536) : (t.push(i), n--);
125
+ } else t.push(i);
126
+ }
127
+ return t;
128
+ }
129
+ var j = function(e) {
130
+ return String.fromCodePoint.apply(String, d(e));
131
+ }, M = function(e) {
132
+ return e - 48 < 10 ? e - 22 : e - 65 < 26 ? e - 65 : e - 97 < 26 ? e - 97 : p;
133
+ }, N = function(e, t) {
134
+ return e + 22 + 75 * (e < 26) - ((t != 0) << 5);
135
+ }, P = function(e, t, n) {
136
+ var r = 0;
137
+ for (e = n ? E(e / _) : e >> 1, e += E(e / t); e > T * h >> 1; r += p) e = E(e / T);
138
+ return E(r + (T + 1) * e / (e + g));
139
+ }, F = function(e) {
140
+ var t = [], n = e.length, r = 0, i = y, a = v, o = e.lastIndexOf(b);
141
+ o < 0 && (o = 0);
142
+ for (var s = 0; s < o; ++s) e.charCodeAt(s) >= 128 && O("not-basic"), t.push(e.charCodeAt(s));
143
+ for (var c = o > 0 ? o + 1 : 0; c < n;) {
144
+ for (var l = r, u = 1, d = p;; d += p) {
145
+ c >= n && O("invalid-input");
146
+ var g = M(e.charCodeAt(c++));
147
+ (g >= p || g > E((f - r) / u)) && O("overflow"), r += g * u;
148
+ var _ = d <= a ? m : d >= a + h ? h : d - a;
149
+ if (g < _) break;
150
+ var x = p - _;
151
+ u > E(f / x) && O("overflow"), u *= x;
152
+ }
153
+ var S = t.length + 1;
154
+ a = P(r - l, S, l == 0), E(r / S) > f - i && O("overflow"), i += E(r / S), r %= S, t.splice(r++, 0, i);
155
+ }
156
+ return String.fromCodePoint.apply(String, t);
157
+ }, I = function(e) {
158
+ var t = [];
159
+ e = ee(e);
160
+ var n = e.length, r = y, i = 0, a = v, o = !0, s = !1, c = void 0;
161
+ try {
162
+ for (var l = e[Symbol.iterator](), u; !(o = (u = l.next()).done); o = !0) {
163
+ var d = u.value;
164
+ d < 128 && t.push(D(d));
165
+ }
166
+ } catch (e) {
167
+ s = !0, c = e;
168
+ } finally {
169
+ try {
170
+ !o && l.return && l.return();
171
+ } finally {
172
+ if (s) throw c;
173
+ }
174
+ }
175
+ var g = t.length, _ = g;
176
+ for (g && t.push(b); _ < n;) {
177
+ var x = f, S = !0, C = !1, w = void 0;
178
+ try {
179
+ for (var T = e[Symbol.iterator](), k; !(S = (k = T.next()).done); S = !0) {
180
+ var A = k.value;
181
+ A >= r && A < x && (x = A);
182
+ }
183
+ } catch (e) {
184
+ C = !0, w = e;
185
+ } finally {
186
+ try {
187
+ !S && T.return && T.return();
188
+ } finally {
189
+ if (C) throw w;
190
+ }
191
+ }
192
+ var j = _ + 1;
193
+ x - r > E((f - i) / j) && O("overflow"), i += (x - r) * j, r = x;
194
+ var M = !0, F = !1, I = void 0;
195
+ try {
196
+ for (var L = e[Symbol.iterator](), R; !(M = (R = L.next()).done); M = !0) {
197
+ var z = R.value;
198
+ if (z < r && ++i > f && O("overflow"), z == r) {
199
+ for (var B = i, V = p;; V += p) {
200
+ var H = V <= a ? m : V >= a + h ? h : V - a;
201
+ if (B < H) break;
202
+ var U = B - H, W = p - H;
203
+ t.push(D(N(H + U % W, 0))), B = E(U / W);
204
+ }
205
+ t.push(D(N(B, 0))), a = P(i, j, _ == g), i = 0, ++_;
206
+ }
207
+ }
208
+ } catch (e) {
209
+ F = !0, I = e;
210
+ } finally {
211
+ try {
212
+ !M && L.return && L.return();
213
+ } finally {
214
+ if (F) throw I;
215
+ }
216
+ }
217
+ ++i, ++r;
218
+ }
219
+ return t.join("");
220
+ }, L = {
221
+ version: "2.1.0",
222
+ ucs2: {
223
+ decode: ee,
224
+ encode: j
225
+ },
226
+ decode: F,
227
+ encode: I,
228
+ toASCII: function(e) {
229
+ return A(e, function(e) {
230
+ return S.test(e) ? "xn--" + I(e) : e;
231
+ });
232
+ },
233
+ toUnicode: function(e) {
234
+ return A(e, function(e) {
235
+ return x.test(e) ? F(e.slice(4).toLowerCase()) : e;
236
+ });
237
+ }
238
+ }, R = {};
239
+ function z(e) {
240
+ var t = e.charCodeAt(0), n = void 0;
241
+ return n = t < 16 ? "%0" + t.toString(16).toUpperCase() : t < 128 ? "%" + t.toString(16).toUpperCase() : t < 2048 ? "%" + (t >> 6 | 192).toString(16).toUpperCase() + "%" + (t & 63 | 128).toString(16).toUpperCase() : "%" + (t >> 12 | 224).toString(16).toUpperCase() + "%" + (t >> 6 & 63 | 128).toString(16).toUpperCase() + "%" + (t & 63 | 128).toString(16).toUpperCase(), n;
242
+ }
243
+ function B(e) {
244
+ for (var t = "", n = 0, r = e.length; n < r;) {
245
+ var i = parseInt(e.substr(n + 1, 2), 16);
246
+ if (i < 128) t += String.fromCharCode(i), n += 3;
247
+ else if (i >= 194 && i < 224) {
248
+ if (r - n >= 6) {
249
+ var a = parseInt(e.substr(n + 4, 2), 16);
250
+ t += String.fromCharCode((i & 31) << 6 | a & 63);
251
+ } else t += e.substr(n, 6);
252
+ n += 6;
253
+ } else if (i >= 224) {
254
+ if (r - n >= 9) {
255
+ var o = parseInt(e.substr(n + 4, 2), 16), s = parseInt(e.substr(n + 7, 2), 16);
256
+ t += String.fromCharCode((i & 15) << 12 | (o & 63) << 6 | s & 63);
257
+ } else t += e.substr(n, 9);
258
+ n += 9;
259
+ } else t += e.substr(n, 3), n += 3;
260
+ }
261
+ return t;
262
+ }
263
+ function V(e, t) {
264
+ function n(e) {
265
+ var n = B(e);
266
+ return n.match(t.UNRESERVED) ? n : e;
267
+ }
268
+ return e.scheme &&= String(e.scheme).replace(t.PCT_ENCODED, n).toLowerCase().replace(t.NOT_SCHEME, ""), e.userinfo !== void 0 && (e.userinfo = String(e.userinfo).replace(t.PCT_ENCODED, n).replace(t.NOT_USERINFO, z).replace(t.PCT_ENCODED, i)), e.host !== void 0 && (e.host = String(e.host).replace(t.PCT_ENCODED, n).toLowerCase().replace(t.NOT_HOST, z).replace(t.PCT_ENCODED, i)), e.path !== void 0 && (e.path = String(e.path).replace(t.PCT_ENCODED, n).replace(e.scheme ? t.NOT_PATH : t.NOT_PATH_NOSCHEME, z).replace(t.PCT_ENCODED, i)), e.query !== void 0 && (e.query = String(e.query).replace(t.PCT_ENCODED, n).replace(t.NOT_QUERY, z).replace(t.PCT_ENCODED, i)), e.fragment !== void 0 && (e.fragment = String(e.fragment).replace(t.PCT_ENCODED, n).replace(t.NOT_FRAGMENT, z).replace(t.PCT_ENCODED, i)), e;
269
+ }
270
+ function H(e) {
271
+ return e.replace(/^0*(.*)/, "$1") || "0";
272
+ }
273
+ function U(e, t) {
274
+ var n = u(e.match(t.IPV4ADDRESS) || [], 2)[1];
275
+ return n ? n.split(".").map(H).join(".") : e;
276
+ }
277
+ function W(e, t) {
278
+ var n = u(e.match(t.IPV6ADDRESS) || [], 3), r = n[1], i = n[2];
279
+ if (r) {
280
+ for (var a = u(r.toLowerCase().split("::").reverse(), 2), o = a[0], s = a[1], c = s ? s.split(":").map(H) : [], l = o.split(":").map(H), d = t.IPV4ADDRESS.test(l[l.length - 1]), f = d ? 7 : 8, p = l.length - f, m = Array(f), h = 0; h < f; ++h) m[h] = c[h] || l[p + h] || "";
281
+ d && (m[f - 1] = U(m[f - 1], t));
282
+ var g = m.reduce(function(e, t, n) {
283
+ if (!t || t === "0") {
284
+ var r = e[e.length - 1];
285
+ r && r.index + r.length === n ? r.length++ : e.push({
286
+ index: n,
287
+ length: 1
288
+ });
289
+ }
290
+ return e;
291
+ }, []).sort(function(e, t) {
292
+ return t.length - e.length;
293
+ })[0], _ = void 0;
294
+ if (g && g.length > 1) {
295
+ var v = m.slice(0, g.index), y = m.slice(g.index + g.length);
296
+ _ = v.join(":") + "::" + y.join(":");
297
+ } else _ = m.join(":");
298
+ return i && (_ += "%" + i), _;
299
+ } else return e;
300
+ }
301
+ var te = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i, ne = "".match(/(){0}/)[1] === void 0;
302
+ function G(e) {
303
+ var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, n = {}, r = t.iri === !1 ? c : l;
304
+ t.reference === "suffix" && (e = (t.scheme ? t.scheme + ":" : "") + "//" + e);
305
+ var i = e.match(te);
306
+ if (i) {
307
+ ne ? (n.scheme = i[1], n.userinfo = i[3], n.host = i[4], n.port = parseInt(i[5], 10), n.path = i[6] || "", n.query = i[7], n.fragment = i[8], isNaN(n.port) && (n.port = i[5])) : (n.scheme = i[1] || void 0, n.userinfo = e.indexOf("@") === -1 ? void 0 : i[3], n.host = e.indexOf("//") === -1 ? void 0 : i[4], n.port = parseInt(i[5], 10), n.path = i[6] || "", n.query = e.indexOf("?") === -1 ? void 0 : i[7], n.fragment = e.indexOf("#") === -1 ? void 0 : i[8], isNaN(n.port) && (n.port = e.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/) ? i[4] : void 0)), n.host &&= W(U(n.host, r), r), n.scheme === void 0 && n.userinfo === void 0 && n.host === void 0 && n.port === void 0 && !n.path && n.query === void 0 ? n.reference = "same-document" : n.scheme === void 0 ? n.reference = "relative" : n.fragment === void 0 ? n.reference = "absolute" : n.reference = "uri", t.reference && t.reference !== "suffix" && t.reference !== n.reference && (n.error = n.error || "URI is not a " + t.reference + " reference.");
308
+ var a = R[(t.scheme || n.scheme || "").toLowerCase()];
309
+ if (!t.unicodeSupport && (!a || !a.unicodeSupport)) {
310
+ if (n.host && (t.domainHost || a && a.domainHost)) try {
311
+ n.host = L.toASCII(n.host.replace(r.PCT_ENCODED, B).toLowerCase());
312
+ } catch (e) {
313
+ n.error = n.error || "Host's domain name can not be converted to ASCII via punycode: " + e;
314
+ }
315
+ V(n, c);
316
+ } else V(n, r);
317
+ a && a.parse && a.parse(n, t);
318
+ } else n.error = n.error || "URI can not be parsed.";
319
+ return n;
320
+ }
321
+ function re(e, t) {
322
+ var n = t.iri === !1 ? c : l, r = [];
323
+ return e.userinfo !== void 0 && (r.push(e.userinfo), r.push("@")), e.host !== void 0 && r.push(W(U(String(e.host), n), n).replace(n.IPV6ADDRESS, function(e, t, n) {
324
+ return "[" + t + (n ? "%25" + n : "") + "]";
325
+ })), (typeof e.port == "number" || typeof e.port == "string") && (r.push(":"), r.push(String(e.port))), r.length ? r.join("") : void 0;
326
+ }
327
+ var ie = /^\.\.?\//, ae = /^\/\.(\/|$)/, oe = /^\/\.\.(\/|$)/, se = /^\/?(?:.|\n)*?(?=\/|$)/;
328
+ function K(e) {
329
+ for (var t = []; e.length;) if (e.match(ie)) e = e.replace(ie, "");
330
+ else if (e.match(ae)) e = e.replace(ae, "/");
331
+ else if (e.match(oe)) e = e.replace(oe, "/"), t.pop();
332
+ else if (e === "." || e === "..") e = "";
333
+ else {
334
+ var n = e.match(se);
335
+ if (n) {
336
+ var r = n[0];
337
+ e = e.slice(r.length), t.push(r);
338
+ } else throw Error("Unexpected dot segment condition");
339
+ }
340
+ return t.join("");
341
+ }
342
+ function q(e) {
343
+ var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, n = t.iri ? l : c, r = [], i = R[(t.scheme || e.scheme || "").toLowerCase()];
344
+ if (i && i.serialize && i.serialize(e, t), e.host && !n.IPV6ADDRESS.test(e.host) && (t.domainHost || i && i.domainHost)) try {
345
+ e.host = t.iri ? L.toUnicode(e.host) : L.toASCII(e.host.replace(n.PCT_ENCODED, B).toLowerCase());
346
+ } catch (n) {
347
+ e.error = e.error || "Host's domain name can not be converted to " + (t.iri ? "Unicode" : "ASCII") + " via punycode: " + n;
348
+ }
349
+ V(e, n), t.reference !== "suffix" && e.scheme && (r.push(e.scheme), r.push(":"));
350
+ var a = re(e, t);
351
+ if (a !== void 0 && (t.reference !== "suffix" && r.push("//"), r.push(a), e.path && e.path.charAt(0) !== "/" && r.push("/")), e.path !== void 0) {
352
+ var o = e.path;
353
+ !t.absolutePath && (!i || !i.absolutePath) && (o = K(o)), a === void 0 && (o = o.replace(/^\/\//, "/%2F")), r.push(o);
354
+ }
355
+ return e.query !== void 0 && (r.push("?"), r.push(e.query)), e.fragment !== void 0 && (r.push("#"), r.push(e.fragment)), r.join("");
356
+ }
357
+ function ce(e, t) {
358
+ var n = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}, r = arguments[3], i = {};
359
+ return r || (e = G(q(e, n), n), t = G(q(t, n), n)), n ||= {}, !n.tolerant && t.scheme ? (i.scheme = t.scheme, i.userinfo = t.userinfo, i.host = t.host, i.port = t.port, i.path = K(t.path || ""), i.query = t.query) : (t.userinfo !== void 0 || t.host !== void 0 || t.port !== void 0 ? (i.userinfo = t.userinfo, i.host = t.host, i.port = t.port, i.path = K(t.path || ""), i.query = t.query) : (t.path ? (t.path.charAt(0) === "/" ? i.path = K(t.path) : ((e.userinfo !== void 0 || e.host !== void 0 || e.port !== void 0) && !e.path ? i.path = "/" + t.path : e.path ? i.path = e.path.slice(0, e.path.lastIndexOf("/") + 1) + t.path : i.path = t.path, i.path = K(i.path)), i.query = t.query) : (i.path = e.path, t.query === void 0 ? i.query = e.query : i.query = t.query), i.userinfo = e.userinfo, i.host = e.host, i.port = e.port), i.scheme = e.scheme), i.fragment = t.fragment, i;
360
+ }
361
+ function le(e, t, n) {
362
+ var r = o({ scheme: "null" }, n);
363
+ return q(ce(G(e, r), G(t, r), r, !0), r);
364
+ }
365
+ function ue(e, t) {
366
+ return typeof e == "string" ? e = q(G(e, t), t) : r(e) === "object" && (e = G(q(e, t), t)), e;
367
+ }
368
+ function de(e, t, n) {
369
+ return typeof e == "string" ? e = q(G(e, n), n) : r(e) === "object" && (e = q(e, n)), typeof t == "string" ? t = q(G(t, n), n) : r(t) === "object" && (t = q(t, n)), e === t;
370
+ }
371
+ function fe(e, t) {
372
+ return e && e.toString().replace(!t || !t.iri ? c.ESCAPE : l.ESCAPE, z);
373
+ }
374
+ function J(e, t) {
375
+ return e && e.toString().replace(!t || !t.iri ? c.PCT_ENCODED : l.PCT_ENCODED, B);
376
+ }
377
+ var Y = {
378
+ scheme: "http",
379
+ domainHost: !0,
380
+ parse: function(e, t) {
381
+ return e.host || (e.error = e.error || "HTTP URIs must have a host."), e;
382
+ },
383
+ serialize: function(e, t) {
384
+ var n = String(e.scheme).toLowerCase() === "https";
385
+ return (e.port === (n ? 443 : 80) || e.port === "") && (e.port = void 0), e.path ||= "/", e;
386
+ }
387
+ }, pe = {
388
+ scheme: "https",
389
+ domainHost: Y.domainHost,
390
+ parse: Y.parse,
391
+ serialize: Y.serialize
392
+ };
393
+ function me(e) {
394
+ return typeof e.secure == "boolean" ? e.secure : String(e.scheme).toLowerCase() === "wss";
395
+ }
396
+ var X = {
397
+ scheme: "ws",
398
+ domainHost: !0,
399
+ parse: function(e, t) {
400
+ var n = e;
401
+ return n.secure = me(n), n.resourceName = (n.path || "/") + (n.query ? "?" + n.query : ""), n.path = void 0, n.query = void 0, n;
402
+ },
403
+ serialize: function(e, t) {
404
+ if ((e.port === (me(e) ? 443 : 80) || e.port === "") && (e.port = void 0), typeof e.secure == "boolean" && (e.scheme = e.secure ? "wss" : "ws", e.secure = void 0), e.resourceName) {
405
+ var n = u(e.resourceName.split("?"), 2), r = n[0], i = n[1];
406
+ e.path = r && r !== "/" ? r : void 0, e.query = i, e.resourceName = void 0;
407
+ }
408
+ return e.fragment = void 0, e;
409
+ }
410
+ }, he = {
411
+ scheme: "wss",
412
+ domainHost: X.domainHost,
413
+ parse: X.parse,
414
+ serialize: X.serialize
415
+ }, ge = {}, _e = "[A-Za-z0-9\\-\\.\\_\\~\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]", Z = "[0-9A-Fa-f]", ve = n(n("%[EFef]" + Z + "%" + Z + Z + "%" + Z + Z) + "|" + n("%[89A-Fa-f]" + Z + "%" + Z + Z) + "|" + n("%" + Z + Z)), ye = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]", be = t("[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]", "[\\\"\\\\]"), xe = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]", Se = new RegExp(_e, "g"), Q = new RegExp(ve, "g"), Ce = new RegExp(t("[^]", ye, "[\\.]", "[\\\"]", be), "g"), we = new RegExp(t("[^]", _e, xe), "g"), Te = we;
416
+ function $(e) {
417
+ var t = B(e);
418
+ return t.match(Se) ? t : e;
419
+ }
420
+ var Ee = {
421
+ scheme: "mailto",
422
+ parse: function(e, t) {
423
+ var n = e, r = n.to = n.path ? n.path.split(",") : [];
424
+ if (n.path = void 0, n.query) {
425
+ for (var i = !1, a = {}, o = n.query.split("&"), s = 0, c = o.length; s < c; ++s) {
426
+ var l = o[s].split("=");
427
+ switch (l[0]) {
428
+ case "to":
429
+ for (var u = l[1].split(","), d = 0, f = u.length; d < f; ++d) r.push(u[d]);
430
+ break;
431
+ case "subject":
432
+ n.subject = J(l[1], t);
433
+ break;
434
+ case "body":
435
+ n.body = J(l[1], t);
436
+ break;
437
+ default:
438
+ i = !0, a[J(l[0], t)] = J(l[1], t);
439
+ break;
440
+ }
441
+ }
442
+ i && (n.headers = a);
443
+ }
444
+ n.query = void 0;
445
+ for (var p = 0, m = r.length; p < m; ++p) {
446
+ var h = r[p].split("@");
447
+ if (h[0] = J(h[0]), t.unicodeSupport) h[1] = J(h[1], t).toLowerCase();
448
+ else try {
449
+ h[1] = L.toASCII(J(h[1], t).toLowerCase());
450
+ } catch (e) {
451
+ n.error = n.error || "Email address's domain name can not be converted to ASCII via punycode: " + e;
452
+ }
453
+ r[p] = h.join("@");
454
+ }
455
+ return n;
456
+ },
457
+ serialize: function(e, t) {
458
+ var n = e, r = a(e.to);
459
+ if (r) {
460
+ for (var o = 0, s = r.length; o < s; ++o) {
461
+ var c = String(r[o]), l = c.lastIndexOf("@"), u = c.slice(0, l).replace(Q, $).replace(Q, i).replace(Ce, z), d = c.slice(l + 1);
462
+ try {
463
+ d = t.iri ? L.toUnicode(d) : L.toASCII(J(d, t).toLowerCase());
464
+ } catch (e) {
465
+ n.error = n.error || "Email address's domain name can not be converted to " + (t.iri ? "Unicode" : "ASCII") + " via punycode: " + e;
466
+ }
467
+ r[o] = u + "@" + d;
468
+ }
469
+ n.path = r.join(",");
470
+ }
471
+ var f = e.headers = e.headers || {};
472
+ e.subject && (f.subject = e.subject), e.body && (f.body = e.body);
473
+ var p = [];
474
+ for (var m in f) f[m] !== ge[m] && p.push(m.replace(Q, $).replace(Q, i).replace(we, z) + "=" + f[m].replace(Q, $).replace(Q, i).replace(Te, z));
475
+ return p.length && (n.query = p.join("&")), n;
476
+ }
477
+ }, De = /^([^\:]+)\:(.*)/, Oe = {
478
+ scheme: "urn",
479
+ parse: function(e, t) {
480
+ var n = e.path && e.path.match(De), r = e;
481
+ if (n) {
482
+ var i = t.scheme || r.scheme || "urn", a = n[1].toLowerCase(), o = n[2], s = R[i + ":" + (t.nid || a)];
483
+ r.nid = a, r.nss = o, r.path = void 0, s && (r = s.parse(r, t));
484
+ } else r.error = r.error || "URN can not be parsed.";
485
+ return r;
486
+ },
487
+ serialize: function(e, t) {
488
+ var n = t.scheme || e.scheme || "urn", r = e.nid, i = R[n + ":" + (t.nid || r)];
489
+ i && (e = i.serialize(e, t));
490
+ var a = e, o = e.nss;
491
+ return a.path = (r || t.nid) + ":" + o, a;
492
+ }
493
+ }, ke = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/, Ae = {
494
+ scheme: "urn:uuid",
495
+ parse: function(e, t) {
496
+ var n = e;
497
+ return n.uuid = n.nss, n.nss = void 0, !t.tolerant && (!n.uuid || !n.uuid.match(ke)) && (n.error = n.error || "UUID is not valid."), n;
498
+ },
499
+ serialize: function(e, t) {
500
+ var n = e;
501
+ return n.nss = (e.uuid || "").toLowerCase(), n;
502
+ }
503
+ };
504
+ R[Y.scheme] = Y, R[pe.scheme] = pe, R[X.scheme] = X, R[he.scheme] = he, R[Ee.scheme] = Ee, R[Oe.scheme] = Oe, R[Ae.scheme] = Ae, e.SCHEMES = R, e.pctEncChar = z, e.pctDecChars = B, e.parse = G, e.removeDotSegments = K, e.serialize = q, e.resolveComponents = ce, e.resolve = le, e.normalize = ue, e.equal = de, e.escapeComponent = fe, e.unescapeComponent = J, Object.defineProperty(e, "__esModule", { value: !0 });
505
+ }));
506
+ })), import_uri_all$3 = /* @__PURE__ */ __toESM(require_uri_all(), 1);
507
+ const NavigationContext = createContext({
508
+ url: "/",
509
+ store: "url"
510
+ });
511
+ function defaultShouldHandle(e) {
512
+ return e.canIntercept && !e.downloadRequest;
513
+ }
514
+ const NavigationProvider = ({ children: e, store: n = "url", scoped: o, shouldHandle: s = defaultShouldHandle }) => {
515
+ let [c, l] = useState(null), [u, d] = useState(() => ({
516
+ store: n,
517
+ url: window.location.href
518
+ })), f = useMemo(() => (e) => {
519
+ let t = e.sourceElement;
520
+ return c && t && !c.contains(t) ? !0 : !s(e);
521
+ }, [s, c]);
522
+ useEffect(() => {
523
+ let e = (e) => {
524
+ if (f(e)) return;
525
+ let t = e.destination.url;
526
+ n === "memory" ? (e.preventDefault(), d((r) => {
527
+ if (e.sourceElement instanceof HTMLAnchorElement && e.navigationType === "push") {
528
+ let n = e.sourceElement.getAttribute("href");
529
+ n && !n.startsWith("/") && !/^[a-z]+:\/\//i.test(n) && (t = import_uri_all$3.default.resolve(r.url, n));
530
+ }
531
+ return {
532
+ ...r,
533
+ url: t,
534
+ store: n
535
+ };
536
+ })) : e.intercept({ async handler() {
537
+ d({
538
+ url: t,
539
+ store: n
540
+ });
541
+ } });
542
+ };
543
+ return navigation?.addEventListener("navigate", e), () => navigation?.removeEventListener("navigate", e);
544
+ }, [
545
+ f,
546
+ o,
547
+ n
548
+ ]);
549
+ let p = useMemo(() => ({
550
+ ...u,
551
+ setState: d
552
+ }), [u]);
553
+ return createElement(NavigationContext.Provider, { value: p }, o ? createElement("div", { ref: l }, e) : e);
554
+ };
555
+ function future(e) {
556
+ let t = {}, n = new Promise((e, n) => {
557
+ t.resolve = e, t.reject = n;
558
+ });
559
+ return n.resolve = t.resolve, n.reject = t.reject, e && n.catch(() => {}), n;
560
+ }
561
+ var import_uri_all$2 = /* @__PURE__ */ __toESM(require_uri_all(), 1);
562
+ function useNavigate() {
563
+ let { setState: e } = useContext(NavigationContext);
564
+ return useMemo(() => {
565
+ if (!e || !navigation) return navigation;
566
+ let t = (t, n) => {
567
+ let r = {
568
+ committed: future(!0),
569
+ finished: future(!0)
570
+ }, i = ({ committed: e, finished: t }) => {
571
+ e.then(r.committed.resolve, r.committed.reject), t.then(r.finished.resolve, r.finished.reject);
572
+ };
573
+ return e((e) => (Promise.resolve().then(() => {
574
+ try {
575
+ i(navigation.navigate(import_uri_all$2.default.resolve(e.url, t), n));
576
+ } catch {
577
+ i(navigation.navigate(t, n));
578
+ }
579
+ }), e)), r;
580
+ };
581
+ return new Proxy(navigation, { get(e, n, r) {
582
+ if (n === "navigate") return t;
583
+ let i = Reflect.get(e, n, r);
584
+ return typeof i == "function" ? i.bind(e) : i;
585
+ } });
586
+ }, [e]);
587
+ }
588
+ var import_uri_all$1 = /* @__PURE__ */ __toESM(require_uri_all(), 1), DUMMY_BASE = "fakeprotodonotuse://";
589
+ function resolveLocation(e, t) {
590
+ let n = import_uri_all$1.default.parse(import_uri_all$1.default.resolve(t, e));
591
+ return n.scheme = void 0, n.host = void 0, n.port = void 0, import_uri_all$1.default.serialize(n);
592
+ }
593
+ function useLocation(e, t) {
594
+ let r = useContext(NavigationContext), a = t ?? r.url;
595
+ return useMemo(() => {
596
+ if (typeof e == "string") return resolveLocation(e, a);
597
+ if (typeof e == "function") {
598
+ let t = new URL(a, DUMMY_BASE);
599
+ return resolveLocation((e(t) || t).href, a);
600
+ }
601
+ return resolveLocation("", a);
602
+ }, [e, a]);
603
+ }
604
+ var import_uri_all = /* @__PURE__ */ __toESM(require_uri_all(), 1);
605
+ function parseSearchParams(e) {
606
+ return new URLSearchParams(import_uri_all.default.parse(e || "").query);
607
+ }
608
+ function useQueryParam(e, t = !1) {
609
+ let n = useLocation();
610
+ return useMemo(() => {
611
+ try {
612
+ let r = parseSearchParams(n);
613
+ return t ? r.getAll(e) || [] : r.get(e);
614
+ } catch {
615
+ return null;
616
+ }
617
+ }, [
618
+ n,
619
+ t,
620
+ e
621
+ ]);
622
+ }
623
+ function mapQueryParams(e, t) {
624
+ let n = {};
625
+ return e.forEach((e, r) => {
626
+ t && !t.includes(r) || (n[r] ? Array.isArray(n[r]) ? n[r].push(e) : n[r] = [n[r], e] : n[r] = e);
627
+ }), n;
628
+ }
629
+ function useQueryParams(e) {
630
+ let t = useLocation();
631
+ return useMemo(() => {
632
+ let n = parseSearchParams(t);
633
+ return Array.isArray(e) ? mapQueryParams(n, e) : (e || mapQueryParams)(n);
634
+ }, [t, e]);
635
+ }
636
+ function useLocationWithParam(e, t, n) {
637
+ return useLocation((n) => t === null ? n.searchParams.delete(e) : n.searchParams.set(e, t), n);
638
+ }
639
+ function useLocationWithParams(e, t) {
640
+ return useLocation((t) => {
641
+ for (let [n, r] of Object.entries(e)) r === null ? t.searchParams.delete(n) : Array.isArray(r) ? (t.searchParams.delete(n), r.forEach((e) => t.searchParams.append(n, e))) : t.searchParams.set(n, r);
642
+ return t;
643
+ }, t);
644
+ }
645
+ export { NavigationContext, NavigationProvider, mapQueryParams, parseSearchParams, resolveLocation, useLocation, useLocationWithParam, useLocationWithParams, useNavigate, useQueryParam, useQueryParams };
@@ -0,0 +1 @@
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`react`)):typeof define==`function`&&define.amd?define([`exports`,`react`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.useNavigationAPI={},e.React))})(this,function(e,t){var n=Object.create,r=Object.defineProperty,i=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,o=Object.getPrototypeOf,s=Object.prototype.hasOwnProperty,c=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),l=(e,t,n,o)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var c=a(t),l=0,u=c.length,d;l<u;l++)d=c[l],!s.call(e,d)&&d!==n&&r(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(o=i(t,d))||o.enumerable});return e},u=(e,t,i)=>(i=e==null?{}:n(o(e)),l(t||!e||!e.__esModule?r(i,`default`,{value:e,enumerable:!0}):i,e)),d=c(((e,t)=>{(function(n,r){typeof e==`object`&&t!==void 0?r(e):typeof define==`function`&&define.amd?define([`exports`],r):r(n.URI=n.URI||{})})(e,(function(e){function t(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];if(t.length>1){t[0]=t[0].slice(0,-1);for(var r=t.length-1,i=1;i<r;++i)t[i]=t[i].slice(1,-1);return t[r]=t[r].slice(1),t.join(``)}else return t[0]}function n(e){return`(?:`+e+`)`}function r(e){return e===void 0?`undefined`:e===null?`null`:Object.prototype.toString.call(e).split(` `).pop().split(`]`).shift().toLowerCase()}function i(e){return e.toUpperCase()}function a(e){return e==null?[]:e instanceof Array?e:typeof e.length!=`number`||e.split||e.setInterval||e.call?[e]:Array.prototype.slice.call(e)}function o(e,t){var n=e;if(t)for(var r in t)n[r]=t[r];return n}function s(e){var r=`[A-Za-z]`,i=`[0-9]`,a=t(i,`[A-Fa-f]`),o=n(n(`%[EFef]`+a+`%`+a+a+`%`+a+a)+`|`+n(`%[89A-Fa-f]`+a+`%`+a+a)+`|`+n(`%`+a+a)),s=`[\\:\\/\\?\\#\\[\\]\\@]`,c=`[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]`,l=t(s,c),u=e?`[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]`:`[]`,d=e?`[\\uE000-\\uF8FF]`:`[]`,f=t(r,i,`[\\-\\.\\_\\~]`,u),p=n(r+t(r,i,`[\\+\\-\\.]`)+`*`),m=n(n(o+`|`+t(f,c,`[\\:]`))+`*`);n(n(`25[0-5]`)+`|`+n(`2[0-4]`+i)+`|`+n(`1`+i+i)+`|`+n(`[1-9]`+i)+`|`+i);var h=n(n(`25[0-5]`)+`|`+n(`2[0-4]`+i)+`|`+n(`1`+i+i)+`|`+n(`0?[1-9]`+i)+`|0?0?`+i),g=n(h+`\\.`+h+`\\.`+h+`\\.`+h),_=n(a+`{1,4}`),v=n(n(_+`\\:`+_)+`|`+g),y=n([n(n(_+`\\:`)+`{6}`+v),n(`\\:\\:`+n(_+`\\:`)+`{5}`+v),n(n(_)+`?\\:\\:`+n(_+`\\:`)+`{4}`+v),n(n(n(_+`\\:`)+`{0,1}`+_)+`?\\:\\:`+n(_+`\\:`)+`{3}`+v),n(n(n(_+`\\:`)+`{0,2}`+_)+`?\\:\\:`+n(_+`\\:`)+`{2}`+v),n(n(n(_+`\\:`)+`{0,3}`+_)+`?\\:\\:`+_+`\\:`+v),n(n(n(_+`\\:`)+`{0,4}`+_)+`?\\:\\:`+v),n(n(n(_+`\\:`)+`{0,5}`+_)+`?\\:\\:`+_),n(n(n(_+`\\:`)+`{0,6}`+_)+`?\\:\\:`)].join(`|`)),b=n(n(f+`|`+o)+`+`);n(y+`\\%25`+b);var x=n(y+n(`\\%25|\\%(?!`+a+`{2})`)+b),S=n(`[vV]`+a+`+\\.`+t(f,c,`[\\:]`)+`+`),C=n(`\\[`+n(x+`|`+y+`|`+S)+`\\]`),w=n(n(o+`|`+t(f,c))+`*`),T=n(C+`|`+g+`(?!`+w+`)|`+w),E=n(i+`*`),D=n(n(m+`@`)+`?`+T+n(`\\:`+E)+`?`),O=n(o+`|`+t(f,c,`[\\:\\@]`)),k=n(O+`*`),A=n(O+`+`),j=n(n(o+`|`+t(f,c,`[\\@]`))+`+`),M=n(n(`\\/`+k)+`*`),N=n(`\\/`+n(A+M)+`?`),P=n(j+M),F=n(A+M),I=`(?!`+O+`)`;n(M+`|`+N+`|`+P+`|`+F+`|`+I);var L=n(n(O+`|`+t(`[\\/\\?]`,d))+`*`),R=n(n(O+`|[\\/\\?]`)+`*`),z=n(n(`\\/\\/`+D+M)+`|`+N+`|`+F+`|`+I),B=n(p+`\\:`+z+n(`\\?`+L)+`?`+n(`\\#`+R)+`?`),V=n(n(n(`\\/\\/`+D+M)+`|`+N+`|`+P+`|`+I)+n(`\\?`+L)+`?`+n(`\\#`+R)+`?`);return n(B+`|`+V),n(p+`\\:`+z+n(`\\?`+L)+`?`),``+p+n(n(`\\/\\/(`+n(`(`+m+`)@`)+`?(`+T+`)`+n(`\\:(`+E+`)`)+`?)`)+`?(`+M+`|`+N+`|`+F+`|`+I+`)`)+n(`\\?(`+L+`)`)+n(`\\#(`+R+`)`),``+n(n(`\\/\\/(`+n(`(`+m+`)@`)+`?(`+T+`)`+n(`\\:(`+E+`)`)+`?)`)+`?(`+M+`|`+N+`|`+P+`|`+I+`)`)+n(`\\?(`+L+`)`)+n(`\\#(`+R+`)`),``+p+n(n(`\\/\\/(`+n(`(`+m+`)@`)+`?(`+T+`)`+n(`\\:(`+E+`)`)+`?)`)+`?(`+M+`|`+N+`|`+F+`|`+I+`)`)+n(`\\?(`+L+`)`),``+n(`\\#(`+R+`)`),``+n(`(`+m+`)@`)+T+n(`\\:(`+E+`)`),{NOT_SCHEME:new RegExp(t(`[^]`,r,i,`[\\+\\-\\.]`),`g`),NOT_USERINFO:new RegExp(t(`[^\\%\\:]`,f,c),`g`),NOT_HOST:new RegExp(t(`[^\\%\\[\\]\\:]`,f,c),`g`),NOT_PATH:new RegExp(t(`[^\\%\\/\\:\\@]`,f,c),`g`),NOT_PATH_NOSCHEME:new RegExp(t(`[^\\%\\/\\@]`,f,c),`g`),NOT_QUERY:new RegExp(t(`[^\\%]`,f,c,`[\\:\\@\\/\\?]`,d),`g`),NOT_FRAGMENT:new RegExp(t(`[^\\%]`,f,c,`[\\:\\@\\/\\?]`),`g`),ESCAPE:new RegExp(t(`[^]`,f,c),`g`),UNRESERVED:new RegExp(f,`g`),OTHER_CHARS:new RegExp(t(`[^\\%]`,f,l),`g`),PCT_ENCODED:new RegExp(o,`g`),IPV4ADDRESS:RegExp(`^(`+g+`)$`),IPV6ADDRESS:RegExp(`^\\[?(`+y+`)`+n(n(`\\%25|\\%(?!`+a+`{2})`)+`(`+b+`)`)+`?\\]?$`)}}var c=s(!1),l=s(!0),u=function(){function e(e,t){var n=[],r=!0,i=!1,a=void 0;try{for(var o=e[Symbol.iterator](),s;!(r=(s=o.next()).done)&&(n.push(s.value),!(t&&n.length===t));r=!0);}catch(e){i=!0,a=e}finally{try{!r&&o.return&&o.return()}finally{if(i)throw a}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw TypeError(`Invalid attempt to destructure non-iterable instance`)}}(),d=function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}else return Array.from(e)},f=2147483647,p=36,m=1,h=26,g=38,_=700,v=72,y=128,b=`-`,x=/^xn--/,S=/[^\0-\x7E]/,C=/[\x2E\u3002\uFF0E\uFF61]/g,w={overflow:`Overflow: input needs wider integers to process`,"not-basic":`Illegal input >= 0x80 (not a basic code point)`,"invalid-input":`Invalid input`},T=p-m,E=Math.floor,D=String.fromCharCode;function O(e){throw RangeError(w[e])}function k(e,t){for(var n=[],r=e.length;r--;)n[r]=t(e[r]);return n}function A(e,t){var n=e.split(`@`),r=``;n.length>1&&(r=n[0]+`@`,e=n[1]),e=e.replace(C,`.`);var i=k(e.split(`.`),t).join(`.`);return r+i}function j(e){for(var t=[],n=0,r=e.length;n<r;){var i=e.charCodeAt(n++);if(i>=55296&&i<=56319&&n<r){var a=e.charCodeAt(n++);(a&64512)==56320?t.push(((i&1023)<<10)+(a&1023)+65536):(t.push(i),n--)}else t.push(i)}return t}var M=function(e){return String.fromCodePoint.apply(String,d(e))},N=function(e){return e-48<10?e-22:e-65<26?e-65:e-97<26?e-97:p},P=function(e,t){return e+22+75*(e<26)-((t!=0)<<5)},F=function(e,t,n){var r=0;for(e=n?E(e/_):e>>1,e+=E(e/t);e>T*h>>1;r+=p)e=E(e/T);return E(r+(T+1)*e/(e+g))},I=function(e){var t=[],n=e.length,r=0,i=y,a=v,o=e.lastIndexOf(b);o<0&&(o=0);for(var s=0;s<o;++s)e.charCodeAt(s)>=128&&O(`not-basic`),t.push(e.charCodeAt(s));for(var c=o>0?o+1:0;c<n;){for(var l=r,u=1,d=p;;d+=p){c>=n&&O(`invalid-input`);var g=N(e.charCodeAt(c++));(g>=p||g>E((f-r)/u))&&O(`overflow`),r+=g*u;var _=d<=a?m:d>=a+h?h:d-a;if(g<_)break;var x=p-_;u>E(f/x)&&O(`overflow`),u*=x}var S=t.length+1;a=F(r-l,S,l==0),E(r/S)>f-i&&O(`overflow`),i+=E(r/S),r%=S,t.splice(r++,0,i)}return String.fromCodePoint.apply(String,t)},L=function(e){var t=[];e=j(e);var n=e.length,r=y,i=0,a=v,o=!0,s=!1,c=void 0;try{for(var l=e[Symbol.iterator](),u;!(o=(u=l.next()).done);o=!0){var d=u.value;d<128&&t.push(D(d))}}catch(e){s=!0,c=e}finally{try{!o&&l.return&&l.return()}finally{if(s)throw c}}var g=t.length,_=g;for(g&&t.push(b);_<n;){var x=f,S=!0,C=!1,w=void 0;try{for(var T=e[Symbol.iterator](),k;!(S=(k=T.next()).done);S=!0){var A=k.value;A>=r&&A<x&&(x=A)}}catch(e){C=!0,w=e}finally{try{!S&&T.return&&T.return()}finally{if(C)throw w}}var M=_+1;x-r>E((f-i)/M)&&O(`overflow`),i+=(x-r)*M,r=x;var N=!0,I=!1,L=void 0;try{for(var R=e[Symbol.iterator](),z;!(N=(z=R.next()).done);N=!0){var B=z.value;if(B<r&&++i>f&&O(`overflow`),B==r){for(var V=i,H=p;;H+=p){var U=H<=a?m:H>=a+h?h:H-a;if(V<U)break;var W=V-U,G=p-U;t.push(D(P(U+W%G,0))),V=E(W/G)}t.push(D(P(V,0))),a=F(i,M,_==g),i=0,++_}}}catch(e){I=!0,L=e}finally{try{!N&&R.return&&R.return()}finally{if(I)throw L}}++i,++r}return t.join(``)},R={version:`2.1.0`,ucs2:{decode:j,encode:M},decode:I,encode:L,toASCII:function(e){return A(e,function(e){return S.test(e)?`xn--`+L(e):e})},toUnicode:function(e){return A(e,function(e){return x.test(e)?I(e.slice(4).toLowerCase()):e})}},z={};function B(e){var t=e.charCodeAt(0),n=void 0;return n=t<16?`%0`+t.toString(16).toUpperCase():t<128?`%`+t.toString(16).toUpperCase():t<2048?`%`+(t>>6|192).toString(16).toUpperCase()+`%`+(t&63|128).toString(16).toUpperCase():`%`+(t>>12|224).toString(16).toUpperCase()+`%`+(t>>6&63|128).toString(16).toUpperCase()+`%`+(t&63|128).toString(16).toUpperCase(),n}function V(e){for(var t=``,n=0,r=e.length;n<r;){var i=parseInt(e.substr(n+1,2),16);if(i<128)t+=String.fromCharCode(i),n+=3;else if(i>=194&&i<224){if(r-n>=6){var a=parseInt(e.substr(n+4,2),16);t+=String.fromCharCode((i&31)<<6|a&63)}else t+=e.substr(n,6);n+=6}else if(i>=224){if(r-n>=9){var o=parseInt(e.substr(n+4,2),16),s=parseInt(e.substr(n+7,2),16);t+=String.fromCharCode((i&15)<<12|(o&63)<<6|s&63)}else t+=e.substr(n,9);n+=9}else t+=e.substr(n,3),n+=3}return t}function H(e,t){function n(e){var n=V(e);return n.match(t.UNRESERVED)?n:e}return e.scheme&&=String(e.scheme).replace(t.PCT_ENCODED,n).toLowerCase().replace(t.NOT_SCHEME,``),e.userinfo!==void 0&&(e.userinfo=String(e.userinfo).replace(t.PCT_ENCODED,n).replace(t.NOT_USERINFO,B).replace(t.PCT_ENCODED,i)),e.host!==void 0&&(e.host=String(e.host).replace(t.PCT_ENCODED,n).toLowerCase().replace(t.NOT_HOST,B).replace(t.PCT_ENCODED,i)),e.path!==void 0&&(e.path=String(e.path).replace(t.PCT_ENCODED,n).replace(e.scheme?t.NOT_PATH:t.NOT_PATH_NOSCHEME,B).replace(t.PCT_ENCODED,i)),e.query!==void 0&&(e.query=String(e.query).replace(t.PCT_ENCODED,n).replace(t.NOT_QUERY,B).replace(t.PCT_ENCODED,i)),e.fragment!==void 0&&(e.fragment=String(e.fragment).replace(t.PCT_ENCODED,n).replace(t.NOT_FRAGMENT,B).replace(t.PCT_ENCODED,i)),e}function U(e){return e.replace(/^0*(.*)/,`$1`)||`0`}function W(e,t){var n=u(e.match(t.IPV4ADDRESS)||[],2)[1];return n?n.split(`.`).map(U).join(`.`):e}function G(e,t){var n=u(e.match(t.IPV6ADDRESS)||[],3),r=n[1],i=n[2];if(r){for(var a=u(r.toLowerCase().split(`::`).reverse(),2),o=a[0],s=a[1],c=s?s.split(`:`).map(U):[],l=o.split(`:`).map(U),d=t.IPV4ADDRESS.test(l[l.length-1]),f=d?7:8,p=l.length-f,m=Array(f),h=0;h<f;++h)m[h]=c[h]||l[p+h]||``;d&&(m[f-1]=W(m[f-1],t));var g=m.reduce(function(e,t,n){if(!t||t===`0`){var r=e[e.length-1];r&&r.index+r.length===n?r.length++:e.push({index:n,length:1})}return e},[]).sort(function(e,t){return t.length-e.length})[0],_=void 0;if(g&&g.length>1){var v=m.slice(0,g.index),y=m.slice(g.index+g.length);_=v.join(`:`)+`::`+y.join(`:`)}else _=m.join(`:`);return i&&(_+=`%`+i),_}else return e}var ee=/^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i,te=``.match(/(){0}/)[1]===void 0;function K(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n={},r=t.iri===!1?c:l;t.reference===`suffix`&&(e=(t.scheme?t.scheme+`:`:``)+`//`+e);var i=e.match(ee);if(i){te?(n.scheme=i[1],n.userinfo=i[3],n.host=i[4],n.port=parseInt(i[5],10),n.path=i[6]||``,n.query=i[7],n.fragment=i[8],isNaN(n.port)&&(n.port=i[5])):(n.scheme=i[1]||void 0,n.userinfo=e.indexOf(`@`)===-1?void 0:i[3],n.host=e.indexOf(`//`)===-1?void 0:i[4],n.port=parseInt(i[5],10),n.path=i[6]||``,n.query=e.indexOf(`?`)===-1?void 0:i[7],n.fragment=e.indexOf(`#`)===-1?void 0:i[8],isNaN(n.port)&&(n.port=e.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/)?i[4]:void 0)),n.host&&=G(W(n.host,r),r),n.scheme===void 0&&n.userinfo===void 0&&n.host===void 0&&n.port===void 0&&!n.path&&n.query===void 0?n.reference=`same-document`:n.scheme===void 0?n.reference=`relative`:n.fragment===void 0?n.reference=`absolute`:n.reference=`uri`,t.reference&&t.reference!==`suffix`&&t.reference!==n.reference&&(n.error=n.error||`URI is not a `+t.reference+` reference.`);var a=z[(t.scheme||n.scheme||``).toLowerCase()];if(!t.unicodeSupport&&(!a||!a.unicodeSupport)){if(n.host&&(t.domainHost||a&&a.domainHost))try{n.host=R.toASCII(n.host.replace(r.PCT_ENCODED,V).toLowerCase())}catch(e){n.error=n.error||`Host's domain name can not be converted to ASCII via punycode: `+e}H(n,c)}else H(n,r);a&&a.parse&&a.parse(n,t)}else n.error=n.error||`URI can not be parsed.`;return n}function ne(e,t){var n=t.iri===!1?c:l,r=[];return e.userinfo!==void 0&&(r.push(e.userinfo),r.push(`@`)),e.host!==void 0&&r.push(G(W(String(e.host),n),n).replace(n.IPV6ADDRESS,function(e,t,n){return`[`+t+(n?`%25`+n:``)+`]`})),(typeof e.port==`number`||typeof e.port==`string`)&&(r.push(`:`),r.push(String(e.port))),r.length?r.join(``):void 0}var re=/^\.\.?\//,ie=/^\/\.(\/|$)/,ae=/^\/\.\.(\/|$)/,oe=/^\/?(?:.|\n)*?(?=\/|$)/;function q(e){for(var t=[];e.length;)if(e.match(re))e=e.replace(re,``);else if(e.match(ie))e=e.replace(ie,`/`);else if(e.match(ae))e=e.replace(ae,`/`),t.pop();else if(e===`.`||e===`..`)e=``;else{var n=e.match(oe);if(n){var r=n[0];e=e.slice(r.length),t.push(r)}else throw Error(`Unexpected dot segment condition`)}return t.join(``)}function J(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=t.iri?l:c,r=[],i=z[(t.scheme||e.scheme||``).toLowerCase()];if(i&&i.serialize&&i.serialize(e,t),e.host&&!n.IPV6ADDRESS.test(e.host)&&(t.domainHost||i&&i.domainHost))try{e.host=t.iri?R.toUnicode(e.host):R.toASCII(e.host.replace(n.PCT_ENCODED,V).toLowerCase())}catch(n){e.error=e.error||`Host's domain name can not be converted to `+(t.iri?`Unicode`:`ASCII`)+` via punycode: `+n}H(e,n),t.reference!==`suffix`&&e.scheme&&(r.push(e.scheme),r.push(`:`));var a=ne(e,t);if(a!==void 0&&(t.reference!==`suffix`&&r.push(`//`),r.push(a),e.path&&e.path.charAt(0)!==`/`&&r.push(`/`)),e.path!==void 0){var o=e.path;!t.absolutePath&&(!i||!i.absolutePath)&&(o=q(o)),a===void 0&&(o=o.replace(/^\/\//,`/%2F`)),r.push(o)}return e.query!==void 0&&(r.push(`?`),r.push(e.query)),e.fragment!==void 0&&(r.push(`#`),r.push(e.fragment)),r.join(``)}function se(e,t){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},r=arguments[3],i={};return r||(e=K(J(e,n),n),t=K(J(t,n),n)),n||={},!n.tolerant&&t.scheme?(i.scheme=t.scheme,i.userinfo=t.userinfo,i.host=t.host,i.port=t.port,i.path=q(t.path||``),i.query=t.query):(t.userinfo!==void 0||t.host!==void 0||t.port!==void 0?(i.userinfo=t.userinfo,i.host=t.host,i.port=t.port,i.path=q(t.path||``),i.query=t.query):(t.path?(t.path.charAt(0)===`/`?i.path=q(t.path):((e.userinfo!==void 0||e.host!==void 0||e.port!==void 0)&&!e.path?i.path=`/`+t.path:e.path?i.path=e.path.slice(0,e.path.lastIndexOf(`/`)+1)+t.path:i.path=t.path,i.path=q(i.path)),i.query=t.query):(i.path=e.path,t.query===void 0?i.query=e.query:i.query=t.query),i.userinfo=e.userinfo,i.host=e.host,i.port=e.port),i.scheme=e.scheme),i.fragment=t.fragment,i}function ce(e,t,n){var r=o({scheme:`null`},n);return J(se(K(e,r),K(t,r),r,!0),r)}function le(e,t){return typeof e==`string`?e=J(K(e,t),t):r(e)===`object`&&(e=K(J(e,t),t)),e}function ue(e,t,n){return typeof e==`string`?e=J(K(e,n),n):r(e)===`object`&&(e=J(e,n)),typeof t==`string`?t=J(K(t,n),n):r(t)===`object`&&(t=J(t,n)),e===t}function de(e,t){return e&&e.toString().replace(!t||!t.iri?c.ESCAPE:l.ESCAPE,B)}function Y(e,t){return e&&e.toString().replace(!t||!t.iri?c.PCT_ENCODED:l.PCT_ENCODED,V)}var X={scheme:`http`,domainHost:!0,parse:function(e,t){return e.host||(e.error=e.error||`HTTP URIs must have a host.`),e},serialize:function(e,t){var n=String(e.scheme).toLowerCase()===`https`;return(e.port===(n?443:80)||e.port===``)&&(e.port=void 0),e.path||=`/`,e}},fe={scheme:`https`,domainHost:X.domainHost,parse:X.parse,serialize:X.serialize};function pe(e){return typeof e.secure==`boolean`?e.secure:String(e.scheme).toLowerCase()===`wss`}var Z={scheme:`ws`,domainHost:!0,parse:function(e,t){var n=e;return n.secure=pe(n),n.resourceName=(n.path||`/`)+(n.query?`?`+n.query:``),n.path=void 0,n.query=void 0,n},serialize:function(e,t){if((e.port===(pe(e)?443:80)||e.port===``)&&(e.port=void 0),typeof e.secure==`boolean`&&(e.scheme=e.secure?`wss`:`ws`,e.secure=void 0),e.resourceName){var n=u(e.resourceName.split(`?`),2),r=n[0],i=n[1];e.path=r&&r!==`/`?r:void 0,e.query=i,e.resourceName=void 0}return e.fragment=void 0,e}},me={scheme:`wss`,domainHost:Z.domainHost,parse:Z.parse,serialize:Z.serialize},he={},ge=`[A-Za-z0-9\\-\\.\\_\\~\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]`,Q=`[0-9A-Fa-f]`,_e=n(n(`%[EFef]`+Q+`%`+Q+Q+`%`+Q+Q)+`|`+n(`%[89A-Fa-f]`+Q+`%`+Q+Q)+`|`+n(`%`+Q+Q)),ve="[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]",ye=t(`[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]`,`[\\"\\\\]`),be=`[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]`,xe=new RegExp(ge,`g`),$=new RegExp(_e,`g`),Se=new RegExp(t(`[^]`,ve,`[\\.]`,`[\\"]`,ye),`g`),Ce=new RegExp(t(`[^]`,ge,be),`g`),we=Ce;function Te(e){var t=V(e);return t.match(xe)?t:e}var Ee={scheme:`mailto`,parse:function(e,t){var n=e,r=n.to=n.path?n.path.split(`,`):[];if(n.path=void 0,n.query){for(var i=!1,a={},o=n.query.split(`&`),s=0,c=o.length;s<c;++s){var l=o[s].split(`=`);switch(l[0]){case`to`:for(var u=l[1].split(`,`),d=0,f=u.length;d<f;++d)r.push(u[d]);break;case`subject`:n.subject=Y(l[1],t);break;case`body`:n.body=Y(l[1],t);break;default:i=!0,a[Y(l[0],t)]=Y(l[1],t);break}}i&&(n.headers=a)}n.query=void 0;for(var p=0,m=r.length;p<m;++p){var h=r[p].split(`@`);if(h[0]=Y(h[0]),t.unicodeSupport)h[1]=Y(h[1],t).toLowerCase();else try{h[1]=R.toASCII(Y(h[1],t).toLowerCase())}catch(e){n.error=n.error||`Email address's domain name can not be converted to ASCII via punycode: `+e}r[p]=h.join(`@`)}return n},serialize:function(e,t){var n=e,r=a(e.to);if(r){for(var o=0,s=r.length;o<s;++o){var c=String(r[o]),l=c.lastIndexOf(`@`),u=c.slice(0,l).replace($,Te).replace($,i).replace(Se,B),d=c.slice(l+1);try{d=t.iri?R.toUnicode(d):R.toASCII(Y(d,t).toLowerCase())}catch(e){n.error=n.error||`Email address's domain name can not be converted to `+(t.iri?`Unicode`:`ASCII`)+` via punycode: `+e}r[o]=u+`@`+d}n.path=r.join(`,`)}var f=e.headers=e.headers||{};e.subject&&(f.subject=e.subject),e.body&&(f.body=e.body);var p=[];for(var m in f)f[m]!==he[m]&&p.push(m.replace($,Te).replace($,i).replace(Ce,B)+`=`+f[m].replace($,Te).replace($,i).replace(we,B));return p.length&&(n.query=p.join(`&`)),n}},De=/^([^\:]+)\:(.*)/,Oe={scheme:`urn`,parse:function(e,t){var n=e.path&&e.path.match(De),r=e;if(n){var i=t.scheme||r.scheme||`urn`,a=n[1].toLowerCase(),o=n[2],s=z[i+`:`+(t.nid||a)];r.nid=a,r.nss=o,r.path=void 0,s&&(r=s.parse(r,t))}else r.error=r.error||`URN can not be parsed.`;return r},serialize:function(e,t){var n=t.scheme||e.scheme||`urn`,r=e.nid,i=z[n+`:`+(t.nid||r)];i&&(e=i.serialize(e,t));var a=e,o=e.nss;return a.path=(r||t.nid)+`:`+o,a}},ke=/^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/,Ae={scheme:`urn:uuid`,parse:function(e,t){var n=e;return n.uuid=n.nss,n.nss=void 0,!t.tolerant&&(!n.uuid||!n.uuid.match(ke))&&(n.error=n.error||`UUID is not valid.`),n},serialize:function(e,t){var n=e;return n.nss=(e.uuid||``).toLowerCase(),n}};z[X.scheme]=X,z[fe.scheme]=fe,z[Z.scheme]=Z,z[me.scheme]=me,z[Ee.scheme]=Ee,z[Oe.scheme]=Oe,z[Ae.scheme]=Ae,e.SCHEMES=z,e.pctEncChar=B,e.pctDecChars=V,e.parse=K,e.removeDotSegments=q,e.serialize=J,e.resolveComponents=se,e.resolve=ce,e.normalize=le,e.equal=ue,e.escapeComponent=de,e.unescapeComponent=Y,Object.defineProperty(e,`__esModule`,{value:!0})}))})),f=u(d(),1);let p=(0,t.createContext)({url:`/`,store:`url`});function m(e){return e.canIntercept&&!e.downloadRequest}let h=({children:e,store:n=`url`,scoped:r,shouldHandle:i=m})=>{let[a,o]=(0,t.useState)(null),[s,c]=(0,t.useState)(()=>({store:n,url:window.location.href})),l=(0,t.useMemo)(()=>e=>{let t=e.sourceElement;return a&&t&&!a.contains(t)?!0:!i(e)},[i,a]);(0,t.useEffect)(()=>{let e=e=>{if(l(e))return;let t=e.destination.url;n===`memory`?(e.preventDefault(),c(r=>{if(e.sourceElement instanceof HTMLAnchorElement&&e.navigationType===`push`){let n=e.sourceElement.getAttribute(`href`);n&&!n.startsWith(`/`)&&!/^[a-z]+:\/\//i.test(n)&&(t=f.default.resolve(r.url,n))}return{...r,url:t,store:n}})):e.intercept({async handler(){c({url:t,store:n})}})};return navigation?.addEventListener(`navigate`,e),()=>navigation?.removeEventListener(`navigate`,e)},[l,r,n]);let u=(0,t.useMemo)(()=>({...s,setState:c}),[s]);return(0,t.createElement)(p.Provider,{value:u},r?(0,t.createElement)(`div`,{ref:o},e):e)};function g(e){let t={},n=new Promise((e,n)=>{t.resolve=e,t.reject=n});return n.resolve=t.resolve,n.reject=t.reject,e&&n.catch(()=>{}),n}var _=u(d(),1);function v(){let{setState:e}=(0,t.useContext)(p);return(0,t.useMemo)(()=>{if(!e||!navigation)return navigation;let t=(t,n)=>{let r={committed:g(!0),finished:g(!0)},i=({committed:e,finished:t})=>{e.then(r.committed.resolve,r.committed.reject),t.then(r.finished.resolve,r.finished.reject)};return e(e=>(Promise.resolve().then(()=>{try{i(navigation.navigate(_.default.resolve(e.url,t),n))}catch{i(navigation.navigate(t,n))}}),e)),r};return new Proxy(navigation,{get(e,n,r){if(n===`navigate`)return t;let i=Reflect.get(e,n,r);return typeof i==`function`?i.bind(e):i}})},[e])}var y=u(d(),1),b=`fakeprotodonotuse://`;function x(e,t){let n=y.default.parse(y.default.resolve(t,e));return n.scheme=void 0,n.host=void 0,n.port=void 0,y.default.serialize(n)}function S(e,n){let r=(0,t.useContext)(p),i=n??r.url;return(0,t.useMemo)(()=>{if(typeof e==`string`)return x(e,i);if(typeof e==`function`){let t=new URL(i,b);return x((e(t)||t).href,i)}return x(``,i)},[e,i])}var C=u(d(),1);function w(e){return new URLSearchParams(C.default.parse(e||``).query)}function T(e,n=!1){let r=S();return(0,t.useMemo)(()=>{try{let t=w(r);return n?t.getAll(e)||[]:t.get(e)}catch{return null}},[r,n,e])}function E(e,t){let n={};return e.forEach((e,r)=>{t&&!t.includes(r)||(n[r]?Array.isArray(n[r])?n[r].push(e):n[r]=[n[r],e]:n[r]=e)}),n}function D(e){let n=S();return(0,t.useMemo)(()=>{let t=w(n);return Array.isArray(e)?E(t,e):(e||E)(t)},[n,e])}function O(e,t,n){return S(n=>t===null?n.searchParams.delete(e):n.searchParams.set(e,t),n)}function k(e,t){return S(t=>{for(let[n,r]of Object.entries(e))r===null?t.searchParams.delete(n):Array.isArray(r)?(t.searchParams.delete(n),r.forEach(e=>t.searchParams.append(n,e))):t.searchParams.set(n,r);return t},t)}e.NavigationContext=p,e.NavigationProvider=h,e.mapQueryParams=E,e.parseSearchParams=w,e.resolveLocation=x,e.useLocation=S,e.useLocationWithParam=O,e.useLocationWithParams=k,e.useNavigate=v,e.useQueryParam=T,e.useQueryParams=D});
@@ -0,0 +1 @@
1
+ export declare function useNavigate(): Navigation | undefined;
@@ -0,0 +1,11 @@
1
+ type Resolution<T> = {
2
+ resolve: (value: T) => void;
3
+ reject: (reason?: unknown) => void;
4
+ };
5
+ type Future<T> = Promise<T> & Resolution<T>;
6
+ /**
7
+ * Returns a Promise that can be resolved or rejected from outside.
8
+ * @param suppressUncaught If true, adds a dummy catch handler to bypass browsers' uncaught error logging.
9
+ */
10
+ export declare function future<T>(suppressUncaught?: boolean): Future<T>;
11
+ export {};
package/package.json CHANGED
@@ -19,14 +19,24 @@
19
19
  "types": "./dist/index.d.ts",
20
20
  "import": "./dist/use-navigation-api.es.js",
21
21
  "require": "./dist/use-navigation-api.umd.js"
22
- }
22
+ },
23
+ "./src": "./src/index.ts",
24
+ "./src/*": "./src/*"
23
25
  },
24
- "version": "0.1.0",
26
+ "files": [
27
+ "dist",
28
+ "src",
29
+ "README.md"
30
+ ],
31
+ "version": "0.3.0",
25
32
  "type": "module",
26
33
  "scripts": {
27
34
  "build": "tsc -b && vite build",
28
35
  "lint": "eslint ."
29
36
  },
37
+ "dependencies": {
38
+ "uri-js": "^4.4.1"
39
+ },
30
40
  "peerDependencies": {
31
41
  "react": "^18.0.0 || ^19.0.0",
32
42
  "react-dom": "^18.0.0 || ^19.0.0"
package/src/index.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from "./navigationProvider";
2
2
  export * from "./useNavigate";
3
- export * from "./location/useLocation";
4
3
  export * from "./location/useQueryParam";
4
+ export * from "./location/useQueryParams";
5
+ export * from "./location/useLocation";
5
6
  export * from "./location/useLocationWithParam";
@@ -1,37 +1,17 @@
1
1
  import { useContext, useMemo } from "react";
2
- import {
3
- NavigationContext,
4
- type NavigationContextState,
5
- } from "src/navigationProvider.ts";
2
+ import { NavigationContext } from "src/navigationProvider.ts";
3
+ import URI from "uri-js";
6
4
 
7
- type Location = { pathname: string; search: string; hash: string; url?: URL };
5
+ const DUMMY_BASE = "fakeprotodonotuse://";
8
6
 
9
- export function parseLocation(
10
- location: string,
11
- {
12
- url = window?.location?.href || "https://example.com/",
13
- }: NavigationContextState,
14
- ): Location {
15
- try {
16
- const parsed = new URL(location, url);
17
- return {
18
- url: parsed,
19
- pathname: parsed.pathname,
20
- search: parsed.search,
21
- hash: parsed.hash,
22
- };
23
- } catch {
24
- /* fall back to string parsing */
25
- }
26
- if (!location) return { pathname: "/", search: "", hash: "" };
27
- const pathname = location.split("?")[0];
28
- const search = location.substring(pathname.length).split("#")[0];
29
- const hash = location.substring(pathname.length + search.length);
30
- try {
31
- return { url: undefined, pathname, search, hash };
32
- } catch {
33
- return { url: undefined, pathname, search, hash };
34
- }
7
+ export type Location = string;
8
+
9
+ export function resolveLocation(location: string, base: string): string {
10
+ const parsed = URI.parse(URI.resolve(base, location));
11
+ parsed.scheme = undefined;
12
+ parsed.host = undefined;
13
+ parsed.port = undefined;
14
+ return URI.serialize(parsed);
35
15
  }
36
16
 
37
17
  /**
@@ -41,31 +21,29 @@ export function useLocation(): Location;
41
21
  /**
42
22
  * Resolves a URL string relative to the current location and returns its parts.
43
23
  */
44
- export function useLocation(url: string): Location;
45
- /**
46
- * Resolves a URL string relative to the current location after applying the supplied function.
47
- */
48
- export function useLocation<R>(
49
- url: string,
50
- parse: (location: string, value: NavigationContextState) => R,
51
- ): R;
24
+ export function useLocation(url: string, base?: string): Location;
52
25
  /**
53
26
  * Returns a location based on the returned url if present, or the modified input argument.
54
27
  * For instance, `useLocation(url => url.searchParams.set("parameter", "value"))` returns the current location with only a single parameter updated.
55
28
  */
56
- export function useLocation(url: (current: URL) => URL | void): Location;
29
+ export function useLocation(
30
+ url: (current: URL) => URL | void,
31
+ base?: string,
32
+ ): Location;
33
+
57
34
  export function useLocation(
58
35
  url?: string | ((current: URL) => URL | void),
59
- parse = parseLocation,
36
+ baseIn?: string,
60
37
  ) {
61
38
  const location = useContext(NavigationContext);
39
+ const base = baseIn ?? location.url;
62
40
  return useMemo(() => {
63
- if (typeof url === "string") return parse(url, location);
41
+ if (typeof url === "string") return resolveLocation(url, base);
64
42
  if (typeof url === "function") {
65
- const modified = new URL(location.url);
43
+ const modified = new URL(base, DUMMY_BASE);
66
44
  const returned = url(modified);
67
- return parse((returned || modified).href, location);
45
+ return resolveLocation((returned || modified).href, base);
68
46
  }
69
- return parse("", location);
70
- }, [parse, url, location]);
47
+ return resolveLocation("", base);
48
+ }, [url, base]);
71
49
  }
@@ -4,11 +4,42 @@ import { useLocation } from "src/location/useLocation.ts";
4
4
  * returns The current location with the specified parameter set to the provided value or removed if the value === null.
5
5
  * @param param name of the query parameter to set
6
6
  * @param value value to set the parameter to, or `null` to remove any existing value of that parameter
7
+ * @param base If provided, uses this value instead of the current location.
7
8
  */
8
- export function useLocationWithParam(param: string, value: string | null) {
9
- return useLocation((url) =>
10
- value === null
11
- ? url.searchParams.delete(param)
12
- : url.searchParams.set(param, value),
9
+ export function useLocationWithParam(
10
+ param: string,
11
+ value: string | null,
12
+ base?: string,
13
+ ) {
14
+ return useLocation(
15
+ (url) =>
16
+ value === null
17
+ ? url.searchParams.delete(param)
18
+ : url.searchParams.set(param, value),
19
+ base,
13
20
  );
14
21
  }
22
+
23
+ /**
24
+ * returns The current location with the specified parameter set to the provided value or removed if the value === null.
25
+ * @param params map of parameters to update. null or empty entries will be removed.
26
+ * @param base If provided, uses this value instead of the current location.
27
+ */
28
+ export function useLocationWithParams(
29
+ params: Record<string, string | string[] | null>,
30
+ base?: string,
31
+ ) {
32
+ return useLocation((url) => {
33
+ for (const [param, value] of Object.entries(params)) {
34
+ if (value === null) {
35
+ url.searchParams.delete(param);
36
+ } else if (Array.isArray(value)) {
37
+ url.searchParams.delete(param);
38
+ value.forEach((v) => url.searchParams.append(param, v));
39
+ } else {
40
+ url.searchParams.set(param, value);
41
+ }
42
+ }
43
+ return url;
44
+ }, base);
45
+ }
@@ -1,5 +1,10 @@
1
1
  import { useLocation } from "src/location/useLocation.ts";
2
2
  import { useMemo } from "react";
3
+ import URI from "uri-js";
4
+
5
+ export function parseSearchParams(location?: string) {
6
+ return new URLSearchParams(URI.parse(location || "").query);
7
+ }
3
8
 
4
9
  /**
5
10
  * Returns the first value for a query parameter, or null if it is missing.
@@ -9,12 +14,12 @@ export function useQueryParam(param: string, all?: false): string | null;
9
14
  * Returns all values for a query parameter when it appears multiple times.
10
15
  */
11
16
  export function useQueryParam(param: string, all: true): string[];
17
+
12
18
  export function useQueryParam(param: string, all: boolean = false) {
13
19
  const location = useLocation();
14
20
  return useMemo(() => {
15
21
  try {
16
- const searchParams =
17
- location.url?.searchParams || new URLSearchParams(location.search);
22
+ const searchParams = parseSearchParams(location);
18
23
  return all ? searchParams.getAll(param) || [] : searchParams.get(param);
19
24
  } catch {
20
25
  return null;
@@ -0,0 +1,31 @@
1
+ import { useLocation } from "src/location/useLocation.ts";
2
+ import { useMemo } from "react";
3
+ import { parseSearchParams } from "src/location/useQueryParam.ts";
4
+
5
+ export type ParamsMapper<T> = (params: URLSearchParams) => T;
6
+
7
+ export function mapQueryParams(params: URLSearchParams, keys?: string[]) {
8
+ const result: Record<string, string | string[]> = {};
9
+ params.forEach((value, key) => {
10
+ if (keys && !keys.includes(key)) return;
11
+ if (!result[key]) result[key] = value;
12
+ else if (Array.isArray(result[key])) result[key].push(value);
13
+ else result[key] = [result[key] as string, value];
14
+ });
15
+ return result;
16
+ }
17
+
18
+ export function useQueryParams(): Record<string, string | string[]>;
19
+ export function useQueryParams<K extends string>(
20
+ keys: K[],
21
+ ): Record<K, string | string[]>;
22
+ export function useQueryParams<T>(mapper: ParamsMapper<T>): T;
23
+ export function useQueryParams(mapping?: string[] | ParamsMapper<unknown>) {
24
+ const location = useLocation();
25
+ return useMemo(() => {
26
+ const params = parseSearchParams(location);
27
+ return Array.isArray(mapping)
28
+ ? mapQueryParams(params, mapping)
29
+ : (mapping || mapQueryParams)(params);
30
+ }, [location, mapping]);
31
+ }
@@ -9,9 +9,9 @@ import {
9
9
  useMemo,
10
10
  useState,
11
11
  } from "react";
12
+ import URI from "uri-js";
12
13
 
13
14
  export type NavigationContextState = {
14
- navigation: Navigation;
15
15
  url: string;
16
16
  store: "url" | "hash" | "memory";
17
17
  };
@@ -19,8 +19,7 @@ type NavigationContextValue = NavigationContextState & {
19
19
  setState?: Dispatch<SetStateAction<NavigationContextState>>;
20
20
  };
21
21
  const defaultValue: NavigationContextValue = {
22
- navigation: window.navigation!,
23
- url: window?.location?.href || "/",
22
+ url: "/",
24
23
  store: "url" as "url" | "hash" | "memory",
25
24
  };
26
25
  export const NavigationContext = createContext(defaultValue);
@@ -41,9 +40,11 @@ export const NavigationProvider: FC<{
41
40
  scoped,
42
41
  shouldHandle = defaultShouldHandle,
43
42
  }) => {
44
- const navigation = defaultValue.navigation;
45
43
  const [scope, setScope] = useState<HTMLDivElement | null>(null);
46
- const [state, setState] = useState(() => ({ ...defaultValue, store }));
44
+ const [state, setState] = useState(() => ({
45
+ store,
46
+ url: window.location.href,
47
+ }));
47
48
  const skip = useMemo(
48
49
  () => (event: NavigateEvent) => {
49
50
  const target = event.sourceElement;
@@ -70,7 +71,7 @@ export const NavigationProvider: FC<{
70
71
  ) {
71
72
  const href = event.sourceElement.getAttribute("href");
72
73
  if (href && !href.startsWith("/") && !/^[a-z]+:\/\//i.test(href)) {
73
- url = new URL(href, prev.url).href;
74
+ url = URI.resolve(prev.url, href);
74
75
  }
75
76
  }
76
77
  return { ...prev, url, store };
@@ -78,7 +79,7 @@ export const NavigationProvider: FC<{
78
79
  } else {
79
80
  event.intercept({
80
81
  async handler() {
81
- setState({ navigation, url, store });
82
+ setState({ url, store });
82
83
  },
83
84
  });
84
85
  }
@@ -86,7 +87,7 @@ export const NavigationProvider: FC<{
86
87
 
87
88
  navigation?.addEventListener("navigate", handler);
88
89
  return () => navigation?.removeEventListener("navigate", handler);
89
- }, [skip, navigation, scoped, store]);
90
+ }, [skip, scoped, store]);
90
91
 
91
92
  const value = useMemo(() => ({ ...state, setState }), [state]);
92
93
 
@@ -1,11 +1,12 @@
1
1
  import { useContext, useMemo } from "react";
2
2
  import { NavigationContext } from "src/navigationProvider";
3
3
  import { future } from "src/util/future";
4
+ import URI from "uri-js";
4
5
 
5
6
  export function useNavigate() {
6
- const { navigation, setState } = useContext(NavigationContext);
7
+ const { setState } = useContext(NavigationContext);
7
8
  return useMemo(() => {
8
- if (!setState) return navigation;
9
+ if (!setState || !navigation) return navigation;
9
10
  const navigate: Navigation["navigate"] = (destination, options) => {
10
11
  const result = {
11
12
  committed: future(true),
@@ -20,10 +21,7 @@ export function useNavigate() {
20
21
  Promise.resolve().then(() => {
21
22
  try {
22
23
  handle(
23
- navigation.navigate(
24
- new URL(destination, state.url).href,
25
- options,
26
- ),
24
+ navigation.navigate(URI.resolve(state.url, destination), options),
27
25
  );
28
26
  } catch {
29
27
  handle(navigation.navigate(destination, options));
@@ -40,5 +38,5 @@ export function useNavigate() {
40
38
  return typeof value === "function" ? value.bind(target) : value;
41
39
  },
42
40
  });
43
- }, [navigation, setState]);
41
+ }, [setState]);
44
42
  }
package/eslint.config.js DELETED
@@ -1,22 +0,0 @@
1
- import js from "@eslint/js";
2
- import globals from "globals";
3
- import reactHooks from "eslint-plugin-react-hooks";
4
- import reactRefresh from "eslint-plugin-react-refresh";
5
- import tseslint from "typescript-eslint";
6
- import { defineConfig, globalIgnores } from "eslint/config";
7
-
8
- export default defineConfig([
9
- globalIgnores(["dist"]),
10
- {
11
- files: ["**/*.{ts,tsx}"],
12
- extends: [
13
- js.configs.recommended,
14
- tseslint.configs.recommended,
15
- reactHooks.configs.flat.recommended,
16
- ],
17
- languageOptions: {
18
- ecmaVersion: 2020,
19
- globals: globals.browser,
20
- },
21
- },
22
- ]);
package/tsconfig.app.json DELETED
@@ -1,30 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
4
- "target": "ES2022",
5
- "useDefineForClassFields": true,
6
- "lib": ["ES2022", "DOM", "DOM.Iterable"],
7
- "module": "ESNext",
8
- "types": ["vite/client"],
9
- "skipLibCheck": true,
10
-
11
- /* Bundler mode */
12
- "moduleResolution": "bundler",
13
- "allowImportingTsExtensions": true,
14
- "verbatimModuleSyntax": true,
15
- "moduleDetection": "force",
16
- "noEmit": true,
17
- "jsx": "react-jsx",
18
-
19
- /* Linting */
20
- "strict": true,
21
- "noUnusedLocals": true,
22
- "noUnusedParameters": true,
23
- "erasableSyntaxOnly": true,
24
- "noFallthroughCasesInSwitch": true,
25
- "noUncheckedSideEffectImports": true,
26
-
27
- "baseUrl": "."
28
- },
29
- "include": ["src"]
30
- }
package/tsconfig.json DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "files": [],
3
- "references": [
4
- { "path": "./tsconfig.app.json" },
5
- { "path": "./tsconfig.node.json" }
6
- ]
7
- }
@@ -1,26 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
4
- "target": "ES2023",
5
- "lib": ["ES2023"],
6
- "module": "ESNext",
7
- "types": ["node"],
8
- "skipLibCheck": true,
9
-
10
- /* Bundler mode */
11
- "moduleResolution": "bundler",
12
- "allowImportingTsExtensions": true,
13
- "verbatimModuleSyntax": true,
14
- "moduleDetection": "force",
15
- "noEmit": true,
16
-
17
- /* Linting */
18
- "strict": true,
19
- "noUnusedLocals": true,
20
- "noUnusedParameters": true,
21
- "erasableSyntaxOnly": true,
22
- "noFallthroughCasesInSwitch": true,
23
- "noUncheckedSideEffectImports": true
24
- },
25
- "include": ["vite.config.ts"]
26
- }
package/vite.config.ts DELETED
@@ -1,28 +0,0 @@
1
- import { defineConfig } from "vite";
2
- import { resolve } from "path";
3
- import dts from "unplugin-dts/vite";
4
- import react from "@vitejs/plugin-react";
5
- import tsconfigPaths from "vite-tsconfig-paths";
6
-
7
- export default defineConfig({
8
- build: {
9
- lib: {
10
- entry: resolve(__dirname, "src/index.ts"),
11
- name: "useNavigationAPI",
12
- fileName: (format) => `use-navigation-api.${format}.js`,
13
- },
14
- rollupOptions: {
15
- external: ["react", "react-dom", "react/jsx-runtime"],
16
- output: {
17
- globals: {
18
- react: "React",
19
- },
20
- },
21
- },
22
- },
23
- plugins: [
24
- react(),
25
- dts({ tsconfigPath: "./tsconfig.app.json" }),
26
- tsconfigPaths(),
27
- ],
28
- });