@argon-router/core 0.8.3 → 0.9.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.
package/dist/index.js CHANGED
@@ -1,1186 +1,917 @@
1
- import { createEffect as S, createStore as k, createEvent as g, sample as h, split as V, attach as K, scopeBind as N } from "effector";
2
- function C(e, t) {
3
- var r = Object.keys(e);
4
- if (Object.getOwnPropertySymbols) {
5
- var n = Object.getOwnPropertySymbols(e);
6
- t && (n = n.filter(function(a) {
7
- return Object.getOwnPropertyDescriptor(e, a).enumerable;
8
- })), r.push.apply(r, n);
9
- }
10
- return r;
11
- }
12
- function P(e) {
13
- for (var t = 1; t < arguments.length; t++) {
14
- var r = arguments[t] != null ? arguments[t] : {};
15
- t % 2 ? C(Object(r), !0).forEach(function(n) {
16
- ne(e, n, r[n]);
17
- }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : C(Object(r)).forEach(function(n) {
18
- Object.defineProperty(e, n, Object.getOwnPropertyDescriptor(r, n));
19
- });
20
- }
21
- return e;
22
- }
23
- function ne(e, t, r) {
24
- return (t = ae(t)) in e ? Object.defineProperty(e, t, { value: r, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = r, e;
25
- }
26
- function ae(e) {
27
- var t = oe(e, "string");
28
- return typeof t == "symbol" ? t : t + "";
29
- }
30
- function oe(e, t) {
31
- if (typeof e != "object" || !e) return e;
32
- var r = e[Symbol.toPrimitive];
33
- if (r !== void 0) {
34
- var n = r.call(e, t);
35
- if (typeof n != "object") return n;
36
- throw new TypeError("@@toPrimitive must return a primitive value.");
37
- }
38
- return (t === "string" ? String : Number)(e);
39
- }
40
- function ze(e) {
41
- let t;
42
- const r = S(() => {
43
- var m;
44
- return (m = t) === null || m === void 0 ? void 0 : m();
45
- }, {
1
+ import { createEffect, createStore, createEvent, sample, split, attach, scopeBind } from "effector";
2
+ import queryString from "query-string";
3
+ function createRoute(config) {
4
+ let asyncImport;
5
+ const waitForAsyncBundleFx = createEffect(() => asyncImport == null ? void 0 : asyncImport(), {
46
6
  name: "waitForAsyncBundleFx",
47
- sid: "-au0m0h"
48
- }), n = S(async () => {
49
- for (const j of (m = e.beforeOpen) !== null && m !== void 0 ? m : []) {
50
- var m;
51
- await j();
7
+ sid: "1y76ms"
8
+ });
9
+ const beforeOpenFx = createEffect(async () => {
10
+ for (const fx of config.beforeOpen ?? []) {
11
+ await fx();
52
12
  }
53
13
  }, {
54
14
  name: "beforeOpenFx",
55
- sid: "-iy13uf"
56
- }), a = S(async (m) => {
57
- await r(), await n();
58
- const j = e.parent;
59
- return j && await j.internal.openFx(P(P({}, m ?? {
60
- params: {}
61
- }), {}, {
62
- navigate: !1
63
- })), m;
15
+ sid: "-65tb76"
16
+ });
17
+ const openFx = createEffect(async (payload) => {
18
+ await waitForAsyncBundleFx();
19
+ await beforeOpenFx();
20
+ const parent = config.parent;
21
+ if (parent) {
22
+ await parent.internal.openFx({
23
+ ...payload ?? {
24
+ params: {}
25
+ },
26
+ navigate: false
27
+ });
28
+ }
29
+ return payload;
64
30
  }, {
65
31
  name: "openFx",
66
- sid: "cbmc2y"
67
- }), o = k({}, {
32
+ sid: "p3u4q7"
33
+ });
34
+ const $params = createStore({}, {
68
35
  name: "$params",
69
- sid: "-cxehz9"
70
- }), i = k(!1, {
36
+ sid: "-a34rm3"
37
+ });
38
+ const $isOpened = createStore(false, {
71
39
  name: "$isOpened",
72
- sid: "-561dht"
73
- }), s = a.pending, c = g({
40
+ sid: "7m6f5g"
41
+ });
42
+ const $isPending = openFx.pending;
43
+ const open = createEvent({
74
44
  name: "open",
75
- sid: "hyxmmx"
76
- }), d = g({
45
+ sid: "ur5fa6"
46
+ });
47
+ const close = createEvent({
77
48
  name: "close",
78
- sid: "-wvbr5n"
79
- }), y = g({
49
+ sid: "-k33yie"
50
+ });
51
+ const opened = createEvent({
80
52
  name: "opened",
81
- sid: "-qni80y"
82
- }), u = g({
53
+ sid: "-nt8hns"
54
+ });
55
+ const openedOnServer = createEvent({
83
56
  name: "openedOnServer",
84
- sid: "eh9oki"
85
- }), b = g({
57
+ sid: "hbjexo"
58
+ });
59
+ const openedOnClient = createEvent({
86
60
  name: "openedOnClient",
87
- sid: "eet6mh"
88
- }), l = g({
61
+ sid: "h92wzn"
62
+ });
63
+ const navigated = createEvent({
89
64
  name: "navigated",
90
- sid: "-rnvpuc"
91
- }), f = g({
65
+ sid: "-8amrhe"
66
+ });
67
+ const closed = createEvent({
92
68
  name: "closed",
93
- sid: "w9iziz"
69
+ sid: "-pql6th"
94
70
  });
95
- h({
71
+ sample({
96
72
  and: [{
97
- clock: c,
98
- target: a
73
+ clock: open,
74
+ target: openFx
99
75
  }],
100
76
  or: {
101
- sid: "u86cfp"
77
+ sid: "ymah4t"
102
78
  }
103
79
  });
104
- const p = {};
105
- return h({
80
+ const defaultParams = {};
81
+ sample({
106
82
  and: [{
107
- clock: l,
108
- fn: (m) => m && "params" in m ? P({}, m.params) : p,
109
- target: o
83
+ clock: navigated,
84
+ fn: (payload) => {
85
+ if (!payload) {
86
+ return defaultParams;
87
+ }
88
+ return "params" in payload ? {
89
+ ...payload.params
90
+ } : defaultParams;
91
+ },
92
+ target: $params
110
93
  }],
111
94
  or: {
112
- sid: "ymu9q6"
95
+ sid: "z1opqx"
113
96
  }
114
- }), V({
97
+ });
98
+ split({
115
99
  and: [{
116
- source: l,
117
- match: () => typeof window > "u" ? "server" : "client",
100
+ source: navigated,
101
+ match: () => typeof window === "undefined" ? "server" : "client",
118
102
  cases: {
119
- server: u,
120
- client: b
103
+ server: openedOnServer,
104
+ client: openedOnClient
121
105
  }
122
106
  }],
123
107
  or: {
124
- sid: "z4zhb3"
108
+ sid: "-zha4na"
125
109
  }
126
- }), h({
110
+ });
111
+ sample({
127
112
  and: [{
128
- clock: [b, u],
129
- target: y
113
+ clock: [openedOnClient, openedOnServer],
114
+ target: opened
130
115
  }],
131
116
  or: {
132
- sid: "-zf2y9u"
117
+ sid: "-z08i93"
133
118
  }
134
- }), h({
119
+ });
120
+ sample({
135
121
  and: [{
136
- clock: d,
137
- target: f
122
+ clock: close,
123
+ target: closed
138
124
  }],
139
125
  or: {
140
- sid: "-z0saug"
126
+ sid: "-yxhjaa"
141
127
  }
142
- }), h({
128
+ });
129
+ sample({
143
130
  and: [{
144
- clock: [y.map(() => !0), f.map(() => !1)],
145
- target: i
131
+ clock: [opened.map(() => true), closed.map(() => false)],
132
+ target: $isOpened
146
133
  }],
147
134
  or: {
148
- sid: "-yy1bvn"
135
+ sid: "-yj6vuw"
149
136
  }
150
- }), P(P({
151
- $params: o,
152
- $isOpened: i,
153
- $isPending: s,
154
- open: c,
155
- closed: f,
156
- opened: y,
157
- openedOnClient: b,
158
- openedOnServer: u
159
- }, e), {}, {
137
+ });
138
+ return {
139
+ $params,
140
+ $isOpened,
141
+ $isPending,
142
+ open,
143
+ closed,
144
+ opened,
145
+ openedOnClient,
146
+ openedOnServer,
147
+ ...config,
160
148
  internal: {
161
- navigated: l,
162
- close: d,
163
- openFx: a,
164
- setAsyncImport: (m) => t = m
149
+ navigated,
150
+ close,
151
+ openFx,
152
+ setAsyncImport: (value) => asyncImport = value
165
153
  },
166
154
  "@@unitShape": () => ({
167
- params: o,
168
- isPending: s,
169
- isOpened: i,
170
- onOpen: c
155
+ params: $params,
156
+ isPending: $isPending,
157
+ isOpened: $isOpened,
158
+ onOpen: open
171
159
  })
172
- });
160
+ };
173
161
  }
174
- const ie = Symbol("any"), se = Symbol("number"), ce = Symbol("string"), ue = Symbol("array"), fe = Symbol("boolean"), w = {
175
- any: ie,
176
- number: se,
177
- string: ce,
178
- array: ue,
179
- boolean: fe
162
+ const anySymbol = Symbol("any");
163
+ const numberSymbol = Symbol("number");
164
+ const stringSymbol = Symbol("string");
165
+ const arraySymbol = Symbol("array");
166
+ const booleanSymbol = Symbol("boolean");
167
+ const parameters = {
168
+ any: anySymbol,
169
+ number: numberSymbol,
170
+ string: stringSymbol,
171
+ array: arraySymbol,
172
+ boolean: booleanSymbol
180
173
  };
181
- function D(e, t) {
182
- for (const r of e)
183
- if (t.includes(r))
184
- return !0;
185
- return !1;
174
+ function isForRouteActive(forRoutes, activeRoutes) {
175
+ for (const route of forRoutes) {
176
+ if (activeRoutes.includes(route)) {
177
+ return true;
178
+ }
179
+ }
180
+ return false;
186
181
  }
187
- function z(e, t) {
188
- for (const r in t) {
189
- const n = t[r];
190
- if (Array.isArray(n) && (!e[r] || JSON.stringify(n) !== e[r]))
191
- return !1;
192
- switch (typeof n) {
182
+ function isHaveValidParams(query, neededParameters) {
183
+ for (const key in neededParameters) {
184
+ const parameterType = neededParameters[key];
185
+ if (Array.isArray(parameterType) && (!query[key] || JSON.stringify(parameterType) !== query[key])) {
186
+ return false;
187
+ }
188
+ switch (typeof parameterType) {
193
189
  case "number": {
194
- if (!e[r] || n.toString() !== e[r])
195
- return !1;
190
+ if (!query[key] || parameterType.toString() !== query[key]) {
191
+ return false;
192
+ }
196
193
  break;
197
194
  }
198
195
  case "object": {
199
- if (!e[r] || JSON.stringify(n) !== e[r])
200
- return !1;
196
+ if (!query[key] || JSON.stringify(parameterType) !== query[key]) {
197
+ return false;
198
+ }
201
199
  break;
202
200
  }
203
201
  case "string": {
204
- if (!e[r] || n !== e[r])
205
- return !1;
202
+ if (!query[key] || parameterType !== query[key]) {
203
+ return false;
204
+ }
206
205
  break;
207
206
  }
208
207
  case "boolean": {
209
- if (!e[r] || !["0", "1", "false", "true"].includes(e[r]))
210
- return !1;
208
+ if (!query[key] || !["0", "1", "false", "true"].includes(query[key])) {
209
+ return false;
210
+ }
211
211
  break;
212
212
  }
213
213
  }
214
- switch (n) {
215
- case w.any: {
216
- if (!e[r])
217
- return !1;
214
+ switch (parameterType) {
215
+ case parameters.any: {
216
+ if (!query[key]) {
217
+ return false;
218
+ }
218
219
  break;
219
220
  }
220
- case w.string: {
221
- if (!e[r] || Array.isArray(e[r]))
222
- return !1;
221
+ case parameters.string: {
222
+ if (!query[key] || Array.isArray(query[key])) {
223
+ return false;
224
+ }
223
225
  break;
224
226
  }
225
- case w.array: {
226
- if (!e[r] || !Array.isArray(e[r]))
227
- return !1;
227
+ case parameters.array: {
228
+ if (!query[key] || !Array.isArray(query[key])) {
229
+ return false;
230
+ }
228
231
  break;
229
232
  }
230
- case w.number: {
231
- if (!e[r] || Array.isArray(e[r]) || isNaN(parseInt(e[r])) && isNaN(parseFloat(e[r])))
232
- return !1;
233
+ case parameters.number: {
234
+ if (!query[key] || Array.isArray(query[key]) || isNaN(parseInt(query[key])) && isNaN(parseFloat(query[key]))) {
235
+ return false;
236
+ }
233
237
  break;
234
238
  }
235
- case w.boolean: {
236
- if (!e[r] || Array.isArray(e[r]) || !["0", "1", "false", "true"].includes(e[r]))
237
- return !1;
239
+ case parameters.boolean: {
240
+ if (!query[key] || Array.isArray(query[key]) || !["0", "1", "false", "true"].includes(query[key])) {
241
+ return false;
242
+ }
238
243
  break;
239
244
  }
240
245
  }
241
246
  }
242
- return !0;
247
+ return true;
243
248
  }
244
- function le(e, t) {
245
- const r = {};
246
- for (const n in t) {
247
- const a = t[n], o = e[n];
248
- if (Array.isArray(a)) {
249
- const i = e[n];
250
- r[n] = i;
249
+ function transformParams(query, neededParameters) {
250
+ const result = {};
251
+ for (const key in neededParameters) {
252
+ const parameterType = neededParameters[key];
253
+ const data = query[key];
254
+ if (Array.isArray(parameterType)) {
255
+ const arrayData = query[key];
256
+ result[key] = arrayData;
251
257
  continue;
252
258
  }
253
- switch (typeof a) {
259
+ switch (typeof parameterType) {
254
260
  case "number": {
255
- r[n] = isNaN(parseInt(o)) ? parseFloat(o) : parseInt(o);
261
+ result[key] = isNaN(parseInt(data)) ? parseFloat(data) : parseInt(data);
256
262
  break;
257
263
  }
258
264
  case "object": {
259
- r[n] = JSON.parse(o);
265
+ result[key] = JSON.parse(data);
260
266
  break;
261
267
  }
262
- case "string":
263
- r[n] = o;
268
+ case "string": {
269
+ result[key] = data;
270
+ }
264
271
  case "boolean": {
265
- r[n] = o === "1" || o === "true";
272
+ result[key] = data === "1" || data === "true";
266
273
  break;
267
274
  }
268
275
  }
269
- switch (a) {
270
- case w.any:
271
- case w.string:
272
- case w.array: {
273
- r[n] = e[n];
276
+ switch (parameterType) {
277
+ case parameters.any:
278
+ case parameters.string:
279
+ case parameters.array: {
280
+ result[key] = query[key];
274
281
  break;
275
282
  }
276
- case w.number: {
277
- const i = e[n];
278
- r[n] = isNaN(parseInt(i)) ? parseFloat(i) : parseInt(i);
283
+ case parameters.number: {
284
+ const data2 = query[key];
285
+ result[key] = isNaN(parseInt(data2)) ? parseFloat(data2) : parseInt(data2);
279
286
  break;
280
287
  }
281
- case w.boolean: {
282
- const i = e[n];
283
- r[n] = i === "1" || i === "true";
288
+ case parameters.boolean: {
289
+ const data2 = query[key];
290
+ result[key] = data2 === "1" || data2 === "true";
284
291
  break;
285
292
  }
286
293
  }
287
294
  }
288
- return r;
295
+ return result;
289
296
  }
290
- function de(e) {
297
+ function trackQueryControlsFactory(_ref) {
291
298
  let {
292
- $query: t,
293
- navigate: r
294
- } = e;
295
- return L({
296
- $activeRoutes: k([], {
299
+ $query,
300
+ navigate
301
+ } = _ref;
302
+ return trackQueryFactory({
303
+ $activeRoutes: createStore([], {
297
304
  name: "$activeRoutes",
298
305
  sid: "7ol7tr"
299
306
  }),
300
- $query: t,
301
- navigate: r
307
+ $query,
308
+ navigate
302
309
  });
303
310
  }
304
- function L(e) {
311
+ function trackQueryFactory(_ref2) {
305
312
  let {
306
- $activeRoutes: t,
307
- $query: r,
308
- navigate: n
309
- } = e;
310
- return (a) => {
313
+ $activeRoutes,
314
+ $query,
315
+ navigate
316
+ } = _ref2;
317
+ return (config) => {
311
318
  const {
312
- parameters: o,
313
- forRoutes: i
314
- } = a, s = k(!1, {
319
+ parameters: parameters2,
320
+ forRoutes
321
+ } = config;
322
+ const $entered = createStore(false, {
315
323
  name: "$entered",
316
324
  sid: "-okbvx4"
317
- }), c = g({
325
+ });
326
+ const entered = createEvent({
318
327
  name: "entered",
319
328
  sid: "-1bbi51"
320
- }), d = g({
329
+ });
330
+ const exited = createEvent({
321
331
  name: "exited",
322
332
  sid: "-lw34uy"
323
- }), y = g({
333
+ });
334
+ const exit = createEvent({
324
335
  name: "exit",
325
336
  sid: "5l9ghz"
326
- }), u = g({
337
+ });
338
+ const changeEntered = createEvent({
327
339
  name: "changeEntered",
328
340
  sid: "en4cc0"
329
341
  });
330
- return h({
342
+ sample({
331
343
  and: [{
332
- clock: u,
333
- target: s
344
+ clock: changeEntered,
345
+ target: $entered
334
346
  }],
335
347
  or: {
336
348
  sid: "-gssa85"
337
349
  }
338
- }), h({
350
+ });
351
+ sample({
339
352
  and: [{
340
353
  source: {
341
- activeRoutes: t,
342
- query: r
354
+ activeRoutes: $activeRoutes,
355
+ query: $query
343
356
  },
344
- filter: (b) => {
357
+ filter: (_ref3) => {
345
358
  let {
346
- activeRoutes: l,
347
- query: f
348
- } = b;
349
- return (!i || D(i, l)) && z(f, o);
359
+ activeRoutes,
360
+ query
361
+ } = _ref3;
362
+ return (!forRoutes || isForRouteActive(forRoutes, activeRoutes)) && isHaveValidParams(query, parameters2);
350
363
  },
351
- fn: (b) => {
364
+ fn: (_ref4) => {
352
365
  let {
353
- query: l
354
- } = b;
355
- return le(l, o);
366
+ query
367
+ } = _ref4;
368
+ return transformParams(query, parameters2);
356
369
  },
357
- target: [c, u.prepend(() => !0)]
370
+ target: [entered, changeEntered.prepend(() => true)]
358
371
  }],
359
372
  or: {
360
373
  sid: "-gehmsr"
361
374
  }
362
- }), h({
375
+ });
376
+ sample({
363
377
  and: [{
364
378
  source: {
365
- activeRoutes: t,
366
- query: r,
367
- entered: s
379
+ activeRoutes: $activeRoutes,
380
+ query: $query,
381
+ entered: $entered
368
382
  },
369
- filter: (b) => {
383
+ filter: (_ref5) => {
370
384
  let {
371
- activeRoutes: l,
372
- query: f,
373
- entered: p
374
- } = b;
375
- return p && !((!i || D(i, l)) && z(f, o));
385
+ activeRoutes,
386
+ query,
387
+ entered: entered2
388
+ } = _ref5;
389
+ return entered2 && !((!forRoutes || isForRouteActive(forRoutes, activeRoutes)) && isHaveValidParams(query, parameters2));
376
390
  },
377
- target: [d.prepend(() => {
378
- }), u.prepend(() => !1)]
391
+ target: [exited.prepend(() => void 0), changeEntered.prepend(() => false)]
379
392
  }],
380
393
  or: {
381
394
  sid: "-fxzszx"
382
395
  }
383
- }), h({
396
+ });
397
+ sample({
384
398
  and: [{
385
- clock: y,
386
- source: r,
387
- fn: (b, l) => {
388
- if (l && l.ignoreParams) {
389
- const f = {};
390
- for (const p of l.ignoreParams)
391
- b[p] && (f[p] = b[p]);
399
+ clock: exit,
400
+ source: $query,
401
+ fn: (query, payload) => {
402
+ if (payload && payload.ignoreParams) {
403
+ const copy = {};
404
+ for (const key of payload.ignoreParams) {
405
+ if (query[key]) {
406
+ copy[key] = query[key];
407
+ }
408
+ }
392
409
  return {
393
- query: f
410
+ query: copy
394
411
  };
395
412
  }
396
413
  return {
397
414
  query: {}
398
415
  };
399
416
  },
400
- target: n
417
+ target: navigate
401
418
  }],
402
419
  or: {
403
420
  sid: "-fer08a"
404
421
  }
405
- }), {
406
- entered: c,
407
- exited: d,
408
- exit: y
422
+ });
423
+ return {
424
+ entered,
425
+ exited,
426
+ exit
409
427
  };
410
428
  };
411
429
  }
412
- function pe(e) {
413
- return (t) => {
414
- const r = t.split("/").map((s) => s.trim()).filter((s) => s !== "");
415
- let n = null;
416
- function a(s, c) {
417
- n || (n = {}), n[s] = c;
430
+ function prepareParser(tokens) {
431
+ return (input) => {
432
+ const rawTokens = input.split("/").map((part) => part.trim()).filter((part) => part !== "");
433
+ let params = null;
434
+ function setKey(key, value) {
435
+ if (!params) {
436
+ params = {};
437
+ }
438
+ params[key] = value;
439
+ }
440
+ if (tokens.length === 0) {
441
+ return rawTokens.length === 0 ? {
442
+ path: input,
443
+ params: null
444
+ } : null;
418
445
  }
419
- if (e.length === 0) return r.length === 0 ? {
420
- path: t,
421
- params: null
422
- } : null;
423
- for (let s = 0; s < e.length; s++) {
424
- const c = e[s];
425
- switch (c.type) {
446
+ for (let i = 0; i < tokens.length; i++) {
447
+ const token = tokens[i];
448
+ switch (token.type) {
426
449
  case "const": {
427
- if (c.name !== r.shift()) return null;
450
+ if (token.name !== rawTokens.shift()) {
451
+ return null;
452
+ }
428
453
  continue;
429
454
  }
430
455
  case "parameter": {
431
456
  const {
432
- arrayProps: d,
433
- genericProps: y,
434
- required: u
435
- } = c.payload;
436
- if (d) {
437
- var o;
438
- const l = [];
439
- let f;
440
- for (; ; ) {
441
- var i;
442
- if (f = r.shift(), !f) break;
443
- switch (y == null ? void 0 : y.type) {
457
+ arrayProps,
458
+ genericProps,
459
+ required
460
+ } = token.payload;
461
+ if (arrayProps) {
462
+ const array = [];
463
+ let rawToken2;
464
+ while (true) {
465
+ rawToken2 = rawTokens.shift();
466
+ if (!rawToken2) {
467
+ break;
468
+ }
469
+ switch (genericProps == null ? void 0 : genericProps.type) {
444
470
  case "number": {
445
- if (isNaN(+f)) return null;
446
- l.push(+f);
471
+ if (isNaN(+rawToken2)) {
472
+ return null;
473
+ }
474
+ array.push(+rawToken2);
447
475
  break;
448
476
  }
449
477
  case "union": {
450
- if (!y.items.includes(f)) return null;
451
- l.push(f);
478
+ if (!genericProps.items.includes(rawToken2)) {
479
+ return null;
480
+ }
481
+ array.push(rawToken2);
452
482
  break;
453
483
  }
454
484
  default: {
455
- l.push(f);
485
+ array.push(rawToken2);
456
486
  break;
457
487
  }
458
488
  }
459
- if (l.length >= ((i = d.max) !== null && i !== void 0 ? i : 1 / 0)) break;
489
+ if (array.length >= (arrayProps.max ?? Infinity)) {
490
+ break;
491
+ }
492
+ }
493
+ if (array.length < (arrayProps.min ?? 0)) {
494
+ return null;
460
495
  }
461
- if (l.length < ((o = d.min) !== null && o !== void 0 ? o : 0) || r.length > 0 && !e[s + 1]) return null;
462
- a(c.name, l);
496
+ if (rawTokens.length > 0 && !tokens[i + 1]) {
497
+ return null;
498
+ }
499
+ setKey(token.name, array);
463
500
  break;
464
501
  }
465
- const b = r.shift();
466
- if (u && !b) return null;
467
- if (!b) {
468
- a(c.name, void 0);
502
+ const rawToken = rawTokens.shift();
503
+ if (required && !rawToken) {
504
+ return null;
505
+ }
506
+ if (!rawToken) {
507
+ setKey(token.name, void 0);
469
508
  continue;
470
509
  }
471
- switch (y == null ? void 0 : y.type) {
510
+ switch (genericProps == null ? void 0 : genericProps.type) {
472
511
  case "number": {
473
- if (isNaN(+b)) return null;
474
- a(c.name, +b);
512
+ if (isNaN(+rawToken)) {
513
+ return null;
514
+ }
515
+ setKey(token.name, +rawToken);
475
516
  break;
476
517
  }
477
518
  case "union": {
478
- if (!y.items.includes(b)) return null;
479
- a(c.name, b);
519
+ if (!genericProps.items.includes(rawToken)) {
520
+ return null;
521
+ }
522
+ setKey(token.name, rawToken);
480
523
  break;
481
524
  }
482
525
  default: {
483
- a(c.name, b);
526
+ setKey(token.name, rawToken);
484
527
  break;
485
528
  }
486
529
  }
487
530
  }
488
531
  }
489
532
  }
490
- return r.length > 0 ? null : {
491
- path: t,
492
- params: n
533
+ if (rawTokens.length > 0) {
534
+ return null;
535
+ }
536
+ return {
537
+ path: input,
538
+ params
493
539
  };
494
540
  };
495
541
  }
496
- function me(e) {
497
- if (!e) return null;
498
- const t = e[1];
499
- let r, n, a;
500
- for (const o of e.slice(2)) if (o) {
501
- if (o.includes("<")) {
502
- r = o.replace("<", "").replace(">", "");
542
+ function getTokenParameters(params) {
543
+ if (!params) {
544
+ return null;
545
+ }
546
+ const name = params[1];
547
+ let genericProps;
548
+ let arrayProps;
549
+ let modificator;
550
+ for (const parameter of params.slice(2)) {
551
+ if (!parameter) {
503
552
  continue;
504
553
  }
505
- if (o.includes("{") && (n = o.replace("{", "").replace("}", "").split(",").map((i) => parseInt(i))), ["*", "?", "+"].includes(o)) {
506
- a = o;
554
+ if (parameter.includes("<")) {
555
+ genericProps = parameter.replaceAll(/\s/g, "").replace("<", "").replace(">", "");
556
+ continue;
557
+ }
558
+ if (parameter.includes("{")) {
559
+ arrayProps = parameter.replace("{", "").replace("}", "").split(",").map((item) => parseInt(item));
560
+ }
561
+ if (["*", "?", "+"].includes(parameter)) {
562
+ modificator = parameter;
507
563
  continue;
508
564
  }
509
565
  }
510
566
  return {
511
- name: t,
512
- genericProps: r,
513
- arrayProps: n,
514
- modificator: a
567
+ name,
568
+ genericProps,
569
+ arrayProps,
570
+ modificator
515
571
  };
516
572
  }
517
- function ye(e) {
518
- return (t) => {
519
- const r = [];
520
- if (e.length === 0) return "/";
521
- for (const n of e) switch (n.type) {
522
- case "const": {
523
- r.push(n.name);
524
- break;
525
- }
526
- case "parameter": {
527
- if (!t[n.name]) continue;
528
- if (Array.isArray(t[n.name])) for (const a of t[n.name]) r.push(a.toString());
529
- else r.push(t[n.name].toString());
530
- break;
573
+ function prepareBuilder(tokens) {
574
+ return (params) => {
575
+ const result = [];
576
+ if (tokens.length === 0) {
577
+ return "/";
578
+ }
579
+ for (const token of tokens) {
580
+ switch (token.type) {
581
+ case "const": {
582
+ result.push(token.name);
583
+ break;
584
+ }
585
+ case "parameter": {
586
+ if (!params[token.name]) {
587
+ continue;
588
+ }
589
+ if (Array.isArray(params[token.name])) {
590
+ for (const param of params[token.name]) {
591
+ result.push(param.toString());
592
+ }
593
+ } else {
594
+ result.push(params[token.name].toString());
595
+ }
596
+ break;
597
+ }
531
598
  }
532
599
  }
533
- return "/".concat(r.join("/"));
600
+ return `/${result.join("/")}`;
534
601
  };
535
602
  }
536
- function q(e, t) {
537
- var r = Object.keys(e);
538
- if (Object.getOwnPropertySymbols) {
539
- var n = Object.getOwnPropertySymbols(e);
540
- t && (n = n.filter(function(a) {
541
- return Object.getOwnPropertyDescriptor(e, a).enumerable;
542
- })), r.push.apply(r, n);
543
- }
544
- return r;
545
- }
546
- function U(e) {
547
- for (var t = 1; t < arguments.length; t++) {
548
- var r = arguments[t] != null ? arguments[t] : {};
549
- t % 2 ? q(Object(r), !0).forEach(function(n) {
550
- be(e, n, r[n]);
551
- }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : q(Object(r)).forEach(function(n) {
552
- Object.defineProperty(e, n, Object.getOwnPropertyDescriptor(r, n));
553
- });
554
- }
555
- return e;
556
- }
557
- function be(e, t, r) {
558
- return (t = ge(t)) in e ? Object.defineProperty(e, t, {
559
- value: r,
560
- enumerable: !0,
561
- configurable: !0,
562
- writable: !0
563
- }) : e[t] = r, e;
564
- }
565
- function ge(e) {
566
- var t = he(e, "string");
567
- return typeof t == "symbol" ? t : t + "";
568
- }
569
- function he(e, t) {
570
- if (typeof e != "object" || !e) return e;
571
- var r = e[Symbol.toPrimitive];
572
- if (r !== void 0) {
573
- var n = r.call(e, t);
574
- if (typeof n != "object") return n;
575
- throw new TypeError("@@toPrimitive must return a primitive value.");
576
- }
577
- return (t === "string" ? String : Number)(e);
578
- }
579
- function Oe(e) {
580
- const t = [], r = /:(\w+)(<[\w|]+>)?({\d+\,\d+})?([+*?])?/, n = e.split("/").filter(Boolean);
581
- for (let a = 0; a < n.length; a++) {
582
- const o = n[a];
583
- if (!o) continue;
584
- const i = me(o.match(r));
585
- if (!i) {
586
- t.push({
603
+ function compile(path) {
604
+ const tokens = [];
605
+ const regexp = /:(\w+)(<[\s?\w|]+>)?({\d+\,\d+})?([+*?])?/;
606
+ const parsedTokens = path.split("/").filter(Boolean);
607
+ for (let i = 0; i < parsedTokens.length; i++) {
608
+ const parsedToken = parsedTokens[i];
609
+ if (!parsedToken) {
610
+ continue;
611
+ }
612
+ const parameters2 = getTokenParameters(parsedToken.match(regexp));
613
+ if (!parameters2) {
614
+ tokens.push({
587
615
  type: "const",
588
- name: o,
616
+ name: parsedToken,
589
617
  payload: void 0
590
618
  });
591
619
  continue;
592
620
  }
593
621
  const {
594
- arrayProps: s,
595
- genericProps: c,
596
- modificator: d,
597
- name: y
598
- } = i;
599
- if (!y) throw new Error('Invalid path: "'.concat(e, '". Name for argument must be provided'));
600
- const u = {
622
+ arrayProps,
623
+ genericProps,
624
+ modificator,
625
+ name
626
+ } = parameters2;
627
+ if (!name) {
628
+ throw new Error(`Invalid path: "${path}". Name for argument must be provided`);
629
+ }
630
+ const token = {
601
631
  type: "parameter",
602
- name: y,
632
+ name,
603
633
  payload: {
604
- required: !0
634
+ required: true
605
635
  }
606
636
  };
607
- switch (c && c === "number" && (u.payload.genericProps = {
608
- type: "number"
609
- }), c && c.includes("|") && (u.payload.genericProps = {
610
- type: "union",
611
- items: c.split("|")
612
- }), d) {
637
+ if (genericProps && genericProps === "number") {
638
+ token.payload.genericProps = {
639
+ type: "number"
640
+ };
641
+ }
642
+ if (genericProps && genericProps.includes("|")) {
643
+ token.payload.genericProps = {
644
+ type: "union",
645
+ items: genericProps.split("|")
646
+ };
647
+ }
648
+ switch (modificator) {
613
649
  case "*": {
614
- u.payload.arrayProps = {};
650
+ token.payload.arrayProps = {};
615
651
  break;
616
652
  }
617
653
  case "+": {
618
- u.payload.arrayProps = {
654
+ token.payload.arrayProps = {
619
655
  min: 1
620
656
  };
621
657
  break;
622
658
  }
623
659
  case "?": {
624
- u.payload.required = !1;
660
+ token.payload.required = false;
625
661
  break;
626
662
  }
627
663
  }
628
- s && (u.payload.arrayProps = U(U({}, u.payload.arrayProps), {}, {
629
- min: s[0],
630
- max: s[1]
631
- })), t.push(u);
664
+ if (arrayProps) {
665
+ token.payload.arrayProps = {
666
+ ...token.payload.arrayProps,
667
+ min: arrayProps[0],
668
+ max: arrayProps[1]
669
+ };
670
+ }
671
+ tokens.push(token);
632
672
  }
633
673
  return {
634
674
  /**
635
675
  * @param input Input path
636
676
  * @returns `{ path: string; params: Params }` | `null`
637
677
  */
638
- parse: pe(t),
678
+ parse: prepareParser(tokens),
639
679
  /**
640
680
  * @param params Route parameters
641
681
  * @returns string
642
682
  */
643
- build: ye(t)
644
- };
645
- }
646
- const M = "%[a-f0-9]{2}", B = new RegExp("(" + M + ")|([^%]+?)", "gi"), _ = new RegExp("(" + M + ")+", "gi");
647
- function A(e, t) {
648
- try {
649
- return [decodeURIComponent(e.join(""))];
650
- } catch {
651
- }
652
- if (e.length === 1)
653
- return e;
654
- t = t || 1;
655
- const r = e.slice(0, t), n = e.slice(t);
656
- return Array.prototype.concat.call([], A(r), A(n));
657
- }
658
- function we(e) {
659
- try {
660
- return decodeURIComponent(e);
661
- } catch {
662
- let t = e.match(B) || [];
663
- for (let r = 1; r < t.length; r++)
664
- e = A(t, r).join(""), t = e.match(B) || [];
665
- return e;
666
- }
667
- }
668
- function Fe(e) {
669
- const t = {
670
- "%FE%FF": "��",
671
- "%FF%FE": "��"
672
- };
673
- let r = _.exec(e);
674
- for (; r; ) {
675
- try {
676
- t[r[0]] = decodeURIComponent(r[0]);
677
- } catch {
678
- const a = we(r[0]);
679
- a !== r[0] && (t[r[0]] = a);
680
- }
681
- r = _.exec(e);
682
- }
683
- t["%C2"] = "�";
684
- const n = Object.keys(t);
685
- for (const a of n)
686
- e = e.replace(new RegExp(a, "g"), t[a]);
687
- return e;
688
- }
689
- function je(e) {
690
- if (typeof e != "string")
691
- throw new TypeError("Expected `encodedURI` to be of type `string`, got `" + typeof e + "`");
692
- try {
693
- return decodeURIComponent(e);
694
- } catch {
695
- return Fe(e);
696
- }
697
- }
698
- function ke(e, t) {
699
- const r = {};
700
- if (Array.isArray(t))
701
- for (const n of t) {
702
- const a = Object.getOwnPropertyDescriptor(e, n);
703
- a != null && a.enumerable && Object.defineProperty(r, n, a);
704
- }
705
- else
706
- for (const n of Reflect.ownKeys(e)) {
707
- const a = Object.getOwnPropertyDescriptor(e, n);
708
- if (a.enumerable) {
709
- const o = e[n];
710
- t(n, o, e) && Object.defineProperty(r, n, a);
711
- }
712
- }
713
- return r;
714
- }
715
- function Q(e, t) {
716
- if (!(typeof e == "string" && typeof t == "string"))
717
- throw new TypeError("Expected the arguments to be of type `string`");
718
- if (e === "" || t === "")
719
- return [];
720
- const r = e.indexOf(t);
721
- return r === -1 ? [] : [e.slice(0, r), e.slice(r + t.length)];
722
- }
723
- const Se = (e) => e == null, Pe = (e) => encodeURIComponent(e).replaceAll(/[!'()*]/g, (t) => `%${t.charCodeAt(0).toString(16).toUpperCase()}`), E = Symbol("encodeFragmentIdentifier");
724
- function ve(e) {
725
- switch (e.arrayFormat) {
726
- case "index":
727
- return (t) => (r, n) => {
728
- const a = r.length;
729
- return n === void 0 || e.skipNull && n === null || e.skipEmptyString && n === "" ? r : n === null ? [...r, [O(t, e), "[", a, "]"].join("")] : [...r, [O(t, e), "[", O(a, e), "]=", O(n, e)].join("")];
730
- };
731
- case "bracket":
732
- return (t) => (r, n) => n === void 0 || e.skipNull && n === null || e.skipEmptyString && n === "" ? r : n === null ? [...r, [O(t, e), "[]"].join("")] : [...r, [O(t, e), "[]=", O(n, e)].join("")];
733
- case "colon-list-separator":
734
- return (t) => (r, n) => n === void 0 || e.skipNull && n === null || e.skipEmptyString && n === "" ? r : n === null ? [...r, [O(t, e), ":list="].join("")] : [...r, [O(t, e), ":list=", O(n, e)].join("")];
735
- case "comma":
736
- case "separator":
737
- case "bracket-separator": {
738
- const t = e.arrayFormat === "bracket-separator" ? "[]=" : "=";
739
- return (r) => (n, a) => a === void 0 || e.skipNull && a === null || e.skipEmptyString && a === "" ? n : (a = a === null ? "" : a, n.length === 0 ? [[O(r, e), t, O(a, e)].join("")] : [[n, O(a, e)].join(e.arrayFormatSeparator)]);
740
- }
741
- default:
742
- return (t) => (r, n) => n === void 0 || e.skipNull && n === null || e.skipEmptyString && n === "" ? r : n === null ? [...r, O(t, e)] : [...r, [O(t, e), "=", O(n, e)].join("")];
743
- }
744
- }
745
- function xe(e) {
746
- let t;
747
- switch (e.arrayFormat) {
748
- case "index":
749
- return (r, n, a) => {
750
- if (t = /\[(\d*)]$/.exec(r), r = r.replace(/\[\d*]$/, ""), !t) {
751
- a[r] = n;
752
- return;
753
- }
754
- a[r] === void 0 && (a[r] = {}), a[r][t[1]] = n;
755
- };
756
- case "bracket":
757
- return (r, n, a) => {
758
- if (t = /(\[])$/.exec(r), r = r.replace(/\[]$/, ""), !t) {
759
- a[r] = n;
760
- return;
761
- }
762
- if (a[r] === void 0) {
763
- a[r] = [n];
764
- return;
765
- }
766
- a[r] = [...a[r], n];
767
- };
768
- case "colon-list-separator":
769
- return (r, n, a) => {
770
- if (t = /(:list)$/.exec(r), r = r.replace(/:list$/, ""), !t) {
771
- a[r] = n;
772
- return;
773
- }
774
- if (a[r] === void 0) {
775
- a[r] = [n];
776
- return;
777
- }
778
- a[r] = [...a[r], n];
779
- };
780
- case "comma":
781
- case "separator":
782
- return (r, n, a) => {
783
- const o = typeof n == "string" && n.includes(e.arrayFormatSeparator), i = typeof n == "string" && !o && F(n, e).includes(e.arrayFormatSeparator);
784
- n = i ? F(n, e) : n;
785
- const s = o || i ? n.split(e.arrayFormatSeparator).map((c) => F(c, e)) : n === null ? n : F(n, e);
786
- a[r] = s;
787
- };
788
- case "bracket-separator":
789
- return (r, n, a) => {
790
- const o = /(\[])$/.test(r);
791
- if (r = r.replace(/\[]$/, ""), !o) {
792
- a[r] = n && F(n, e);
793
- return;
794
- }
795
- const i = n === null ? [] : F(n, e).split(e.arrayFormatSeparator);
796
- if (a[r] === void 0) {
797
- a[r] = i;
798
- return;
799
- }
800
- a[r] = [...a[r], ...i];
801
- };
802
- default:
803
- return (r, n, a) => {
804
- if (a[r] === void 0) {
805
- a[r] = n;
806
- return;
807
- }
808
- a[r] = [...[a[r]].flat(), n];
809
- };
810
- }
811
- }
812
- function J(e) {
813
- if (typeof e != "string" || e.length !== 1)
814
- throw new TypeError("arrayFormatSeparator must be single character string");
815
- }
816
- function O(e, t) {
817
- return t.encode ? t.strict ? Pe(e) : encodeURIComponent(e) : e;
818
- }
819
- function F(e, t) {
820
- return t.decode ? je(e) : e;
821
- }
822
- function G(e) {
823
- return Array.isArray(e) ? e.sort() : typeof e == "object" ? G(Object.keys(e)).sort((t, r) => Number(t) - Number(r)).map((t) => e[t]) : e;
824
- }
825
- function W(e) {
826
- const t = e.indexOf("#");
827
- return t !== -1 && (e = e.slice(0, t)), e;
828
- }
829
- function $e(e) {
830
- let t = "";
831
- const r = e.indexOf("#");
832
- return r !== -1 && (t = e.slice(r)), t;
833
- }
834
- function T(e, t, r) {
835
- return r === "string" && typeof e == "string" ? e : typeof r == "function" && typeof e == "string" ? r(e) : t.parseBooleans && e !== null && (e.toLowerCase() === "true" || e.toLowerCase() === "false") ? e.toLowerCase() === "true" : r === "number" && !Number.isNaN(Number(e)) && typeof e == "string" && e.trim() !== "" || t.parseNumbers && !Number.isNaN(Number(e)) && typeof e == "string" && e.trim() !== "" ? Number(e) : e;
836
- }
837
- function R(e) {
838
- e = W(e);
839
- const t = e.indexOf("?");
840
- return t === -1 ? "" : e.slice(t + 1);
841
- }
842
- function I(e, t) {
843
- t = {
844
- decode: !0,
845
- sort: !0,
846
- arrayFormat: "none",
847
- arrayFormatSeparator: ",",
848
- parseNumbers: !1,
849
- parseBooleans: !1,
850
- types: /* @__PURE__ */ Object.create(null),
851
- ...t
852
- }, J(t.arrayFormatSeparator);
853
- const r = xe(t), n = /* @__PURE__ */ Object.create(null);
854
- if (typeof e != "string" || (e = e.trim().replace(/^[?#&]/, ""), !e))
855
- return n;
856
- for (const a of e.split("&")) {
857
- if (a === "")
858
- continue;
859
- const o = t.decode ? a.replaceAll("+", " ") : a;
860
- let [i, s] = Q(o, "=");
861
- i === void 0 && (i = o), s = s === void 0 ? null : ["comma", "separator", "bracket-separator"].includes(t.arrayFormat) ? s : F(s, t), r(F(i, t), s, n);
862
- }
863
- for (const [a, o] of Object.entries(n))
864
- if (typeof o == "object" && o !== null && t.types[a] !== "string")
865
- for (const [i, s] of Object.entries(o)) {
866
- const c = t.types[a] ? t.types[a].replace("[]", "") : void 0;
867
- o[i] = T(s, t, c);
868
- }
869
- else typeof o == "object" && o !== null && t.types[a] === "string" ? n[a] = Object.values(o).join(t.arrayFormatSeparator) : n[a] = T(o, t, t.types[a]);
870
- return t.sort === !1 ? n : (t.sort === !0 ? Object.keys(n).sort() : Object.keys(n).sort(t.sort)).reduce((a, o) => {
871
- const i = n[o];
872
- return a[o] = i && typeof i == "object" && !Array.isArray(i) ? G(i) : i, a;
873
- }, /* @__PURE__ */ Object.create(null));
874
- }
875
- function X(e, t) {
876
- if (!e)
877
- return "";
878
- t = {
879
- encode: !0,
880
- strict: !0,
881
- arrayFormat: "none",
882
- arrayFormatSeparator: ",",
883
- ...t
884
- }, J(t.arrayFormatSeparator);
885
- const r = (i) => t.skipNull && Se(e[i]) || t.skipEmptyString && e[i] === "", n = ve(t), a = {};
886
- for (const [i, s] of Object.entries(e))
887
- r(i) || (a[i] = s);
888
- const o = Object.keys(a);
889
- return t.sort !== !1 && o.sort(t.sort), o.map((i) => {
890
- const s = e[i];
891
- return s === void 0 ? "" : s === null ? O(i, t) : Array.isArray(s) ? s.length === 0 && t.arrayFormat === "bracket-separator" ? O(i, t) + "[]" : s.reduce(n(i), []).join("&") : O(i, t) + "=" + O(s, t);
892
- }).filter((i) => i.length > 0).join("&");
893
- }
894
- function Y(e, t) {
895
- var a;
896
- t = {
897
- decode: !0,
898
- ...t
683
+ build: prepareBuilder(tokens)
899
684
  };
900
- let [r, n] = Q(e, "#");
901
- return r === void 0 && (r = e), {
902
- url: ((a = r == null ? void 0 : r.split("?")) == null ? void 0 : a[0]) ?? "",
903
- query: I(R(e), t),
904
- ...t && t.parseFragmentIdentifier && n ? {
905
- fragmentIdentifier: F(n, t)
906
- } : {}
907
- };
908
- }
909
- function Z(e, t) {
910
- t = {
911
- encode: !0,
912
- strict: !0,
913
- [E]: !0,
914
- ...t
915
- };
916
- const r = W(e.url).split("?")[0] || "", n = R(e.url), a = {
917
- ...I(n, {
918
- sort: !1
919
- }),
920
- ...e.query
921
- };
922
- let o = X(a, t);
923
- o && (o = `?${o}`);
924
- let i = $e(e.url);
925
- if (typeof e.fragmentIdentifier == "string") {
926
- const s = new URL(r);
927
- s.hash = e.fragmentIdentifier, i = t[E] ? s.hash : `#${e.fragmentIdentifier}`;
928
- }
929
- return `${r}${o}${i}`;
930
- }
931
- function ee(e, t, r) {
932
- r = {
933
- parseFragmentIdentifier: !0,
934
- [E]: !1,
935
- ...r
936
- };
937
- const {
938
- url: n,
939
- query: a,
940
- fragmentIdentifier: o
941
- } = Y(e, r);
942
- return Z({
943
- url: n,
944
- query: ke(a, t),
945
- fragmentIdentifier: o
946
- }, r);
947
- }
948
- function Ne(e, t, r) {
949
- const n = Array.isArray(t) ? (a) => !t.includes(a) : (a, o) => !t(a, o);
950
- return ee(e, n, r);
951
- }
952
- const x = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
953
- __proto__: null,
954
- exclude: Ne,
955
- extract: R,
956
- parse: I,
957
- parseUrl: Y,
958
- pick: ee,
959
- stringify: X,
960
- stringifyUrl: Z
961
- }, Symbol.toStringTag, { value: "Module" }));
962
- function H(e, t) {
963
- var r = Object.keys(e);
964
- if (Object.getOwnPropertySymbols) {
965
- var n = Object.getOwnPropertySymbols(e);
966
- t && (n = n.filter(function(a) {
967
- return Object.getOwnPropertyDescriptor(e, a).enumerable;
968
- })), r.push.apply(r, n);
969
- }
970
- return r;
971
685
  }
972
- function $(e) {
973
- for (var t = 1; t < arguments.length; t++) {
974
- var r = arguments[t] != null ? arguments[t] : {};
975
- t % 2 ? H(Object(r), !0).forEach(function(n) {
976
- Ae(e, n, r[n]);
977
- }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : H(Object(r)).forEach(function(n) {
978
- Object.defineProperty(e, n, Object.getOwnPropertyDescriptor(r, n));
979
- });
980
- }
981
- return e;
982
- }
983
- function Ae(e, t, r) {
984
- return (t = Ee(t)) in e ? Object.defineProperty(e, t, { value: r, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = r, e;
985
- }
986
- function Ee(e) {
987
- var t = Re(e, "string");
988
- return typeof t == "symbol" ? t : t + "";
989
- }
990
- function Re(e, t) {
991
- if (typeof e != "object" || !e) return e;
992
- var r = e[Symbol.toPrimitive];
993
- if (r !== void 0) {
994
- var n = r.call(e, t);
995
- if (typeof n != "object") return n;
996
- throw new TypeError("@@toPrimitive must return a primitive value.");
997
- }
998
- return (t === "string" ? String : Number)(e);
999
- }
1000
- function Ie() {
1001
- const e = k(null, {
686
+ function createRouterControls() {
687
+ const $history = createStore(null, {
1002
688
  and: {
1003
689
  serialize: "ignore"
1004
690
  },
1005
691
  name: "$history",
1006
692
  sid: "-ld7lzl"
1007
- }), t = k({
693
+ });
694
+ const $locationState = createStore({
1008
695
  query: {},
1009
696
  path: null
1010
697
  }, {
1011
698
  name: "$locationState",
1012
699
  sid: "-4u3w85"
1013
- }), r = t.map((u) => u.query), n = t.map((u) => u.path), a = g({
700
+ });
701
+ const $query = $locationState.map((state) => state.query);
702
+ const $path = $locationState.map((state) => state.path);
703
+ const setHistory = createEvent({
1014
704
  name: "setHistory",
1015
705
  sid: "-ormmkk"
1016
- }), o = g({
706
+ });
707
+ const navigate = createEvent({
1017
708
  name: "navigate",
1018
709
  sid: "tawqep"
1019
- }), i = g({
710
+ });
711
+ const back = createEvent({
1020
712
  name: "back",
1021
713
  sid: "bxy8rt"
1022
- }), s = g({
714
+ });
715
+ const forward = createEvent({
1023
716
  name: "forward",
1024
717
  sid: "-bpmzb1"
1025
- }), c = g({
718
+ });
719
+ const locationUpdated = createEvent({
1026
720
  name: "locationUpdated",
1027
721
  sid: "lkzldx"
1028
- }), d = K({
722
+ });
723
+ const navigateFx = attach({
1029
724
  and: {
1030
- source: e,
1031
- effect: (u, b) => {
725
+ source: $history,
726
+ effect: (history, _ref) => {
1032
727
  let {
1033
- path: l,
1034
- query: f,
1035
- replace: p
1036
- } = b;
1037
- if (!u)
728
+ path,
729
+ query,
730
+ replace
731
+ } = _ref;
732
+ if (!history) {
1038
733
  throw new Error("history not found");
1039
- const m = {
1040
- pathname: l,
1041
- search: "?".concat(x.stringify(f))
734
+ }
735
+ const payload = {
736
+ pathname: path,
737
+ search: `?${queryString.stringify(query)}`
1042
738
  };
1043
- p ? u.replace(m) : u.push(m);
739
+ if (replace) {
740
+ history.replace(payload);
741
+ } else {
742
+ history.push(payload);
743
+ }
1044
744
  }
1045
745
  },
1046
746
  or: {
1047
747
  name: "navigateFx",
1048
748
  sid: "-ov1xn7"
1049
749
  }
1050
- }), y = S((u) => {
1051
- const b = N(c);
1052
- if (b({
1053
- pathname: u.location.pathname,
1054
- query: $({}, x.parse(u.location.search))
1055
- }), !u)
750
+ });
751
+ const subscribeHistoryFx = createEffect((history) => {
752
+ const historyLocationUpdated = scopeBind(locationUpdated);
753
+ historyLocationUpdated({
754
+ pathname: history.location.pathname,
755
+ query: {
756
+ ...queryString.parse(history.location.search)
757
+ }
758
+ });
759
+ if (!history) {
1056
760
  throw new Error();
1057
- u.listen((l) => {
761
+ }
762
+ history.listen((_ref2) => {
1058
763
  let {
1059
- location: f
1060
- } = l;
1061
- b({
1062
- pathname: f.pathname,
1063
- query: $({}, x.parse(f.search))
764
+ location
765
+ } = _ref2;
766
+ historyLocationUpdated({
767
+ pathname: location.pathname,
768
+ query: {
769
+ ...queryString.parse(location.search)
770
+ }
1064
771
  });
1065
772
  });
1066
773
  }, {
1067
774
  name: "subscribeHistoryFx",
1068
775
  sid: "-m60vds"
1069
776
  });
1070
- return h({
777
+ sample({
1071
778
  and: [{
1072
- clock: a,
1073
- target: e
779
+ clock: setHistory,
780
+ target: $history
1074
781
  }],
1075
782
  or: {
1076
783
  sid: "ii4q"
1077
784
  }
1078
- }), h({
785
+ });
786
+ sample({
1079
787
  and: [{
1080
- clock: e,
788
+ clock: $history,
1081
789
  filter: Boolean,
1082
- target: y
790
+ target: subscribeHistoryFx
1083
791
  }],
1084
792
  or: {
1085
793
  sid: "39h3j"
1086
794
  }
1087
- }), h({
795
+ });
796
+ sample({
1088
797
  and: [{
1089
- clock: c,
1090
- fn: (u) => ({
1091
- path: u.pathname,
1092
- query: u.query
798
+ clock: locationUpdated,
799
+ fn: (location) => ({
800
+ path: location.pathname,
801
+ query: location.query
1093
802
  }),
1094
- target: t
803
+ target: $locationState
1095
804
  }],
1096
805
  or: {
1097
806
  sid: "i3x4a"
1098
807
  }
1099
- }), h({
808
+ });
809
+ sample({
1100
810
  and: [{
1101
- clock: o,
1102
- source: n,
1103
- fn: (u, b) => $({
1104
- path: u
1105
- }, b),
1106
- target: d
811
+ clock: navigate,
812
+ source: $path,
813
+ fn: (path, payload) => ({
814
+ path,
815
+ ...payload
816
+ }),
817
+ target: navigateFx
1107
818
  }],
1108
819
  or: {
1109
820
  sid: "ylqx4"
1110
821
  }
1111
- }), {
1112
- $history: e,
1113
- $locationState: t,
1114
- $query: r,
1115
- $path: n,
1116
- setHistory: a,
1117
- navigate: o,
1118
- back: i,
1119
- forward: s,
1120
- locationUpdated: c,
1121
- trackQuery: de({
1122
- $query: r,
1123
- navigate: o
822
+ });
823
+ return {
824
+ $history,
825
+ $locationState,
826
+ $query,
827
+ $path,
828
+ setHistory,
829
+ navigate,
830
+ back,
831
+ forward,
832
+ locationUpdated,
833
+ trackQuery: trackQueryControlsFactory({
834
+ $query,
835
+ navigate
1124
836
  })
1125
837
  };
1126
838
  }
1127
- function qe(e) {
839
+ function createRouter(config) {
1128
840
  const {
1129
- base: t = "/",
1130
- routes: r
1131
- } = e, {
1132
- $path: n,
1133
- $query: a,
1134
- back: o,
1135
- forward: i,
1136
- navigate: s,
1137
- setHistory: c,
1138
- locationUpdated: d
1139
- } = Ie(), y = r.map((l) => {
1140
- let f = l;
1141
- const p = [];
1142
- for (p.unshift(f.path); f.parent; )
1143
- f = f.parent, f.path !== "/" && p.unshift(f.path);
1144
- const m = t === "/" ? p.join("") : [t, ...p].join(""), {
1145
- build: j,
1146
- parse: v
1147
- } = Oe(m);
841
+ base = "/",
842
+ routes
843
+ } = config;
844
+ const {
845
+ $path,
846
+ $query,
847
+ back,
848
+ forward,
849
+ navigate,
850
+ setHistory,
851
+ locationUpdated
852
+ } = createRouterControls();
853
+ const mappedRoutes = routes.map((route) => {
854
+ let internalRoute = route;
855
+ const path = [];
856
+ path.unshift(internalRoute.path);
857
+ while (internalRoute.parent) {
858
+ internalRoute = internalRoute.parent;
859
+ if (internalRoute.path !== "/") {
860
+ path.unshift(internalRoute.path);
861
+ }
862
+ }
863
+ const joinedPath = base === "/" ? path.join("") : [base, ...path].join("");
864
+ const {
865
+ build,
866
+ parse
867
+ } = compile(joinedPath);
1148
868
  return {
1149
- route: l,
1150
- path: m,
1151
- build: j,
1152
- parse: v
869
+ route,
870
+ path: joinedPath,
871
+ build,
872
+ parse
1153
873
  };
1154
- }), u = n.map((l) => {
1155
- const f = [];
1156
- if (!l)
1157
- return f;
874
+ });
875
+ const $activeRoutes = $path.map((path) => {
876
+ const result = [];
877
+ if (!path) {
878
+ return result;
879
+ }
1158
880
  for (const {
1159
- route: p,
1160
- parse: m
1161
- } of y)
1162
- m(l) && f.push(p);
1163
- return f;
1164
- }), b = K({
881
+ route,
882
+ parse
883
+ } of mappedRoutes) {
884
+ if (parse(path)) {
885
+ result.push(route);
886
+ }
887
+ }
888
+ return result;
889
+ });
890
+ const openRoutesByPathFx = attach({
1165
891
  and: {
1166
892
  source: {
1167
- query: a,
1168
- path: n
893
+ query: $query,
894
+ path: $path
1169
895
  },
1170
- effect: async (l) => {
896
+ effect: async (_ref) => {
1171
897
  let {
1172
- query: f,
1173
- path: p
1174
- } = l;
898
+ query,
899
+ path
900
+ } = _ref;
1175
901
  for (const {
1176
- route: m,
1177
- parse: j
1178
- } of y) {
1179
- const v = j(p), [re, te] = [N(m.internal.close), N(m.internal.navigated)];
1180
- v ? te({
1181
- query: f,
1182
- params: v.params
1183
- }) : re();
902
+ route,
903
+ parse
904
+ } of mappedRoutes) {
905
+ const matchResult = parse(path);
906
+ const [routeClosed, routeNavigated] = [scopeBind(route.internal.close), scopeBind(route.internal.navigated)];
907
+ if (!matchResult) {
908
+ routeClosed();
909
+ } else {
910
+ routeNavigated({
911
+ query,
912
+ params: matchResult.params
913
+ });
914
+ }
1184
915
  }
1185
916
  }
1186
917
  },
@@ -1190,234 +921,257 @@ function qe(e) {
1190
921
  }
1191
922
  });
1192
923
  for (const {
1193
- route: l,
1194
- build: f
1195
- } of y)
1196
- h({
924
+ route,
925
+ build
926
+ } of mappedRoutes) {
927
+ sample({
1197
928
  and: [{
1198
- clock: l.internal.openFx.doneData,
1199
- filter: (p) => (p == null ? void 0 : p.navigate) !== !1,
1200
- fn: (p) => {
1201
- var m;
929
+ clock: route.internal.openFx.doneData,
930
+ filter: (payload) => (payload == null ? void 0 : payload.navigate) !== false,
931
+ fn: (payload) => {
1202
932
  return {
1203
- path: f(p && "params" in p ? p.params : void 0),
1204
- query: (m = p == null ? void 0 : p.query) !== null && m !== void 0 ? m : {},
1205
- replace: p == null ? void 0 : p.replace
933
+ path: build(payload && "params" in payload ? payload.params : void 0),
934
+ query: (payload == null ? void 0 : payload.query) ?? {},
935
+ replace: payload == null ? void 0 : payload.replace
1206
936
  };
1207
937
  },
1208
- target: s
938
+ target: navigate
1209
939
  }],
1210
940
  or: {
1211
941
  sid: "exzzqg"
1212
942
  }
1213
943
  });
1214
- return h({
944
+ }
945
+ sample({
1215
946
  and: [{
1216
- clock: d,
1217
- fn: (l) => ({
1218
- path: l.pathname,
1219
- query: l.query
947
+ clock: locationUpdated,
948
+ fn: (location) => ({
949
+ path: location.pathname,
950
+ query: location.query
1220
951
  }),
1221
- target: b
952
+ target: openRoutesByPathFx
1222
953
  }],
1223
954
  or: {
1224
955
  sid: "ficdn3"
1225
956
  }
1226
- }), {
1227
- $query: a,
1228
- $path: n,
1229
- $activeRoutes: u,
1230
- back: o,
1231
- forward: i,
1232
- navigate: s,
1233
- routes: r,
1234
- setHistory: c,
1235
- mappedRoutes: y,
1236
- trackQuery: L({
1237
- $activeRoutes: u,
1238
- $query: a,
1239
- navigate: s
957
+ });
958
+ return {
959
+ $query,
960
+ $path,
961
+ $activeRoutes,
962
+ back,
963
+ forward,
964
+ navigate,
965
+ routes,
966
+ setHistory,
967
+ mappedRoutes,
968
+ trackQuery: trackQueryFactory({
969
+ $activeRoutes,
970
+ $query,
971
+ navigate
1240
972
  }),
1241
973
  "@@unitShape": () => ({
1242
- query: a,
1243
- path: n,
1244
- activeRoutes: u,
1245
- onBack: o,
1246
- onForward: i,
1247
- onNavigate: s
974
+ query: $query,
975
+ path: $path,
976
+ activeRoutes: $activeRoutes,
977
+ onBack: back,
978
+ onForward: forward,
979
+ onNavigate: navigate
1248
980
  })
1249
981
  };
1250
982
  }
1251
- function Ce(e) {
1252
- const t = k(null, {
983
+ function createVirtualRoute(pending) {
984
+ const $params = createStore(null, {
1253
985
  name: "$params",
1254
986
  sid: "-grvyb1"
1255
- }), r = k(!1, {
987
+ });
988
+ const $isOpened = createStore(false, {
1256
989
  name: "$isOpened",
1257
990
  sid: "-w4cbyq"
1258
- }), n = e, a = g({
991
+ });
992
+ const $isPending = pending;
993
+ const open = createEvent({
1259
994
  name: "open",
1260
995
  sid: "8yat5e"
1261
- }), o = g({
996
+ });
997
+ const opened = createEvent({
1262
998
  name: "opened",
1263
999
  sid: "-rsfhnq"
1264
- }), i = g({
1000
+ });
1001
+ const openedOnServer = createEvent({
1265
1002
  name: "openedOnServer",
1266
1003
  sid: "m42ioq"
1267
- }), s = g({
1004
+ });
1005
+ const openedOnClient = createEvent({
1268
1006
  name: "openedOnClient",
1269
1007
  sid: "-bstrdb"
1270
- }), c = g({
1008
+ });
1009
+ const close = createEvent({
1271
1010
  name: "close",
1272
1011
  sid: "41ihvs"
1273
- }), d = g({
1012
+ });
1013
+ const closed = createEvent({
1274
1014
  name: "closed",
1275
1015
  sid: "vdm6z6"
1276
- }), y = g({
1016
+ });
1017
+ const cancelled = createEvent({
1277
1018
  name: "cancelled",
1278
1019
  sid: "-r20ekt"
1279
1020
  });
1280
- return h({
1021
+ sample({
1281
1022
  and: [{
1282
- clock: a,
1283
- target: o
1023
+ clock: open,
1024
+ target: opened
1284
1025
  }],
1285
1026
  or: {
1286
1027
  sid: "-ukycs8"
1287
1028
  }
1288
- }), V({
1029
+ });
1030
+ split({
1289
1031
  and: [{
1290
- source: o,
1291
- match: () => typeof window > "u" ? "server" : "client",
1032
+ source: opened,
1033
+ match: () => typeof window === "undefined" ? "server" : "client",
1292
1034
  cases: {
1293
- server: i,
1294
- client: s
1035
+ server: openedOnServer,
1036
+ client: openedOnClient
1295
1037
  }
1296
1038
  }],
1297
1039
  or: {
1298
1040
  sid: "-u6npcu"
1299
1041
  }
1300
- }), h({
1042
+ });
1043
+ sample({
1301
1044
  and: [{
1302
- clock: c,
1303
- target: d
1045
+ clock: close,
1046
+ target: closed
1304
1047
  }],
1305
1048
  or: {
1306
1049
  sid: "-tq5vk0"
1307
1050
  }
1308
- }), h({
1051
+ });
1052
+ sample({
1309
1053
  and: [{
1310
- clock: [o.map(() => !0), d.map(() => !1)],
1311
- target: r
1054
+ clock: [opened.map(() => true), closed.map(() => false)],
1055
+ target: $isOpened
1312
1056
  }],
1313
1057
  or: {
1314
1058
  sid: "-tnewl7"
1315
1059
  }
1316
- }), {
1317
- $params: t,
1318
- $isOpened: r,
1319
- $isPending: n,
1320
- open: a,
1321
- opened: o,
1322
- openedOnClient: s,
1323
- openedOnServer: i,
1324
- close: c,
1325
- closed: d,
1326
- cancelled: y,
1060
+ });
1061
+ return {
1062
+ $params,
1063
+ $isOpened,
1064
+ $isPending,
1065
+ open,
1066
+ opened,
1067
+ openedOnClient,
1068
+ openedOnServer,
1069
+ close,
1070
+ closed,
1071
+ cancelled,
1327
1072
  // @ts-expect-error emulated path for virtual route
1328
1073
  path: null,
1329
1074
  "@@unitShape": () => ({
1330
- params: t,
1331
- isOpened: r,
1332
- isPending: n,
1333
- onOpen: a
1075
+ params: $params,
1076
+ isOpened: $isOpened,
1077
+ isPending: $isPending,
1078
+ onOpen: open
1334
1079
  })
1335
1080
  };
1336
1081
  }
1337
- function Ue(e) {
1082
+ function chainRoute(props) {
1338
1083
  const {
1339
- route: t,
1340
- beforeOpen: r,
1341
- openOn: n,
1342
- cancelOn: a
1343
- } = e;
1344
- let o;
1345
- const i = S(() => {
1346
- var d;
1347
- return (d = o) === null || d === void 0 ? void 0 : d();
1348
- }, {
1084
+ route,
1085
+ beforeOpen,
1086
+ openOn,
1087
+ cancelOn
1088
+ } = props;
1089
+ let asyncImport;
1090
+ const waitForAsyncBundleFx = createEffect(() => asyncImport == null ? void 0 : asyncImport(), {
1349
1091
  name: "waitForAsyncBundleFx",
1350
1092
  sid: "-utsi21"
1351
- }), s = S(async (d) => {
1352
- await i();
1353
- for (const y of [].concat(r))
1354
- await y(d);
1093
+ });
1094
+ const openFx = createEffect(async (payload) => {
1095
+ await waitForAsyncBundleFx();
1096
+ for (const trigger of [].concat(beforeOpen)) {
1097
+ await trigger(payload);
1098
+ }
1355
1099
  }, {
1356
1100
  name: "openFx",
1357
1101
  sid: "-kgdclv"
1358
- }), c = Ce(s.pending);
1359
- return h({
1102
+ });
1103
+ const virtualRoute = createVirtualRoute(openFx.pending);
1104
+ sample({
1360
1105
  and: [{
1361
- clock: t.opened,
1362
- target: s
1106
+ clock: route.opened,
1107
+ target: openFx
1363
1108
  }],
1364
1109
  or: {
1365
1110
  sid: "102heu"
1366
1111
  }
1367
- }), h({
1112
+ });
1113
+ sample({
1368
1114
  and: [{
1369
- clock: t.opened,
1370
- fn: (d) => d && "params" in d ? d.params : null,
1371
- target: c.$params
1115
+ clock: route.opened,
1116
+ fn: (payload) => payload && "params" in payload ? payload.params : null,
1117
+ target: virtualRoute.$params
1372
1118
  }],
1373
1119
  or: {
1374
1120
  sid: "12tgdn"
1375
1121
  }
1376
- }), n && h({
1377
- and: [{
1378
- clock: n,
1379
- source: {
1380
- params: c.$params
1381
- },
1382
- fn: (d) => {
1383
- let {
1384
- params: y
1385
- } = d;
1386
- return {
1387
- params: y
1388
- };
1389
- },
1390
- target: c.open
1391
- }],
1392
- or: {
1393
- sid: "1jba87"
1394
- }
1395
- }), a && (h({
1396
- and: [{
1397
- clock: [t.closed].concat(a),
1398
- target: c.close
1399
- }],
1400
- or: {
1401
- sid: "1zt411"
1402
- }
1403
- }), h({
1404
- and: [{
1405
- clock: [].concat(a),
1406
- target: c.cancelled
1407
- }],
1408
- or: {
1409
- sid: "22k2zu"
1410
- }
1411
- })), Object.assign(c, {
1122
+ });
1123
+ if (openOn) {
1124
+ sample({
1125
+ and: [{
1126
+ clock: openOn,
1127
+ source: {
1128
+ params: virtualRoute.$params
1129
+ },
1130
+ fn: (_ref) => {
1131
+ let {
1132
+ params
1133
+ } = _ref;
1134
+ return {
1135
+ params
1136
+ };
1137
+ },
1138
+ target: virtualRoute.open
1139
+ }],
1140
+ or: {
1141
+ sid: "1jba87"
1142
+ }
1143
+ });
1144
+ }
1145
+ if (cancelOn) {
1146
+ sample({
1147
+ and: [{
1148
+ clock: [route.closed].concat(cancelOn),
1149
+ target: virtualRoute.close
1150
+ }],
1151
+ or: {
1152
+ sid: "1zt411"
1153
+ }
1154
+ });
1155
+ sample({
1156
+ and: [{
1157
+ clock: [].concat(cancelOn),
1158
+ target: virtualRoute.cancelled
1159
+ }],
1160
+ or: {
1161
+ sid: "22k2zu"
1162
+ }
1163
+ });
1164
+ }
1165
+ return Object.assign(virtualRoute, {
1412
1166
  internal: {
1413
- setAsyncImport: (d) => o = d
1167
+ setAsyncImport: (value) => asyncImport = value
1414
1168
  }
1415
1169
  });
1416
1170
  }
1417
1171
  export {
1418
- Ue as chainRoute,
1419
- ze as createRoute,
1420
- qe as createRouter,
1421
- Ie as createRouterControls,
1422
- w as parameters
1172
+ chainRoute,
1173
+ createRoute,
1174
+ createRouter,
1175
+ createRouterControls,
1176
+ parameters
1423
1177
  };