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