@buzola/router 0.0.1 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/dist/define/create-page.d.ts +17 -5
  2. package/dist/define/create-page.d.ts.map +1 -1
  3. package/dist/define/create-page.js +78 -38
  4. package/dist/define/create-page.js.map +1 -1
  5. package/dist/engine/loader-cache.d.ts +18 -0
  6. package/dist/engine/loader-cache.d.ts.map +1 -0
  7. package/dist/engine/loader-cache.js +48 -0
  8. package/dist/engine/loader-cache.js.map +1 -0
  9. package/dist/engine/matcher.d.ts +1 -1
  10. package/dist/engine/matcher.d.ts.map +1 -1
  11. package/dist/engine/navigation-adapter.d.ts +1 -1
  12. package/dist/engine/navigation-adapter.d.ts.map +1 -1
  13. package/dist/engine/route-tree.d.ts +1 -2
  14. package/dist/engine/route-tree.d.ts.map +1 -1
  15. package/dist/engine/route-tree.js +5 -4
  16. package/dist/engine/route-tree.js.map +1 -1
  17. package/dist/engine/router.d.ts +7 -10
  18. package/dist/engine/router.d.ts.map +1 -1
  19. package/dist/engine/router.js +23 -67
  20. package/dist/engine/router.js.map +1 -1
  21. package/dist/engine/schema.d.ts +5 -1
  22. package/dist/engine/schema.d.ts.map +1 -1
  23. package/dist/engine/schema.js +11 -1
  24. package/dist/engine/schema.js.map +1 -1
  25. package/dist/engine/types.d.ts +2 -15
  26. package/dist/engine/types.d.ts.map +1 -1
  27. package/dist/engine/utils.d.ts +8 -0
  28. package/dist/engine/utils.d.ts.map +1 -1
  29. package/dist/engine/utils.js +10 -3
  30. package/dist/engine/utils.js.map +1 -1
  31. package/dist/index.d.ts +14 -13
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +8 -7
  34. package/dist/index.js.map +1 -1
  35. package/dist/react/context.d.ts +2 -2
  36. package/dist/react/context.d.ts.map +1 -1
  37. package/dist/react/hooks.d.ts +3 -3
  38. package/dist/react/hooks.d.ts.map +1 -1
  39. package/dist/react/hooks.js +11 -9
  40. package/dist/react/hooks.js.map +1 -1
  41. package/dist/react/index.d.ts +11 -11
  42. package/dist/react/index.d.ts.map +1 -1
  43. package/dist/react/index.js +6 -6
  44. package/dist/react/index.js.map +1 -1
  45. package/dist/react/link.d.ts +5 -0
  46. package/dist/react/link.d.ts.map +1 -1
  47. package/dist/react/link.js +10 -1
  48. package/dist/react/link.js.map +1 -1
  49. package/dist/react/outlet.d.ts +3 -1
  50. package/dist/react/outlet.d.ts.map +1 -1
  51. package/dist/react/outlet.js +25 -1
  52. package/dist/react/outlet.js.map +1 -1
  53. package/dist/react/provider.d.ts +15 -2
  54. package/dist/react/provider.d.ts.map +1 -1
  55. package/dist/react/provider.js +15 -4
  56. package/dist/react/provider.js.map +1 -1
  57. package/package.json +15 -4
  58. package/src/__tests__/create-page.test.ts +42 -6
  59. package/src/__tests__/loader-cache.test.ts +115 -0
  60. package/src/__tests__/matcher.test.ts +3 -3
  61. package/src/__tests__/react.test.tsx +1020 -0
  62. package/src/__tests__/router.test.ts +4 -214
  63. package/src/__tests__/setup-dom.ts +21 -0
  64. package/src/define/create-page.tsx +94 -46
  65. package/src/engine/loader-cache.ts +55 -0
  66. package/src/engine/matcher.ts +1 -1
  67. package/src/engine/navigation-adapter.ts +1 -1
  68. package/src/engine/route-tree.ts +4 -6
  69. package/src/engine/router.ts +27 -73
  70. package/src/engine/schema.ts +13 -2
  71. package/src/engine/types.ts +2 -18
  72. package/src/engine/utils.ts +11 -3
  73. package/src/index.ts +15 -17
  74. package/src/react/context.ts +2 -2
  75. package/src/react/hooks.ts +14 -13
  76. package/src/react/index.ts +21 -11
  77. package/src/react/link.tsx +16 -0
  78. package/src/react/outlet.tsx +32 -1
  79. package/src/react/provider.tsx +33 -5
  80. package/dist/__tests__/create-page.test.d.ts +0 -2
  81. package/dist/__tests__/create-page.test.d.ts.map +0 -1
  82. package/dist/__tests__/create-page.test.js +0 -457
  83. package/dist/__tests__/create-page.test.js.map +0 -1
  84. package/dist/__tests__/define-routes.test.d.ts +0 -2
  85. package/dist/__tests__/define-routes.test.d.ts.map +0 -1
  86. package/dist/__tests__/define-routes.test.js +0 -42
  87. package/dist/__tests__/define-routes.test.js.map +0 -1
  88. package/dist/__tests__/matcher.test.d.ts +0 -2
  89. package/dist/__tests__/matcher.test.d.ts.map +0 -1
  90. package/dist/__tests__/matcher.test.js +0 -108
  91. package/dist/__tests__/matcher.test.js.map +0 -1
  92. package/dist/__tests__/router.test.d.ts +0 -2
  93. package/dist/__tests__/router.test.d.ts.map +0 -1
  94. package/dist/__tests__/router.test.js +0 -327
  95. package/dist/__tests__/router.test.js.map +0 -1
  96. package/dist/__tests__/type-safety.test.d.ts +0 -15
  97. package/dist/__tests__/type-safety.test.d.ts.map +0 -1
  98. package/dist/__tests__/type-safety.test.js +0 -163
  99. package/dist/__tests__/type-safety.test.js.map +0 -1
  100. package/dist/__tests__/types.test.d.ts +0 -2
  101. package/dist/__tests__/types.test.d.ts.map +0 -1
  102. package/dist/__tests__/types.test.js +0 -22
  103. package/dist/__tests__/types.test.js.map +0 -1
  104. package/dist/define/define-routes.d.ts +0 -34
  105. package/dist/define/define-routes.d.ts.map +0 -1
  106. package/dist/define/define-routes.js +0 -53
  107. package/dist/define/define-routes.js.map +0 -1
@@ -1,108 +0,0 @@
1
- import { describe, expect, it } from 'bun:test';
2
- import { matchRoutes } from '../engine/matcher';
3
- import { buildRouteTree } from '../engine/route-tree';
4
- function dummyComponent() {
5
- return null;
6
- }
7
- function createTestTree(configs) {
8
- return buildRouteTree(configs);
9
- }
10
- describe('matchRoutes', () => {
11
- it('matches a simple root route', () => {
12
- const tree = createTestTree([
13
- { path: '/', component: dummyComponent, isIndex: true },
14
- ]);
15
- const matches = matchRoutes(tree, new URL('http://localhost/'));
16
- expect(matches).not.toBeNull();
17
- expect(matches).toHaveLength(1);
18
- expect(matches[0].node.fullPath).toBe('/');
19
- });
20
- it('matches a static route', () => {
21
- const tree = createTestTree([
22
- { path: '/about', component: dummyComponent },
23
- ]);
24
- const matches = matchRoutes(tree, new URL('http://localhost/about'));
25
- expect(matches).not.toBeNull();
26
- expect(matches).toHaveLength(1);
27
- expect(matches[0].node.fullPath).toBe('/about');
28
- });
29
- it('matches a dynamic route and extracts params', () => {
30
- const tree = createTestTree([
31
- { path: '/users/:userId', component: dummyComponent },
32
- ]);
33
- const matches = matchRoutes(tree, new URL('http://localhost/users/42'));
34
- expect(matches).not.toBeNull();
35
- expect(matches).toHaveLength(1);
36
- expect(matches[0].params).toEqual({ userId: '42' });
37
- });
38
- it('matches nested routes through layouts', () => {
39
- const tree = createTestTree([
40
- {
41
- path: '/',
42
- component: dummyComponent,
43
- isLayout: true,
44
- children: [
45
- { path: '/', component: dummyComponent, isIndex: true },
46
- { path: '/about', component: dummyComponent },
47
- ],
48
- },
49
- ]);
50
- const indexMatches = matchRoutes(tree, new URL('http://localhost/'));
51
- expect(indexMatches).not.toBeNull();
52
- expect(indexMatches).toHaveLength(2); // layout + index
53
- const aboutMatches = matchRoutes(tree, new URL('http://localhost/about'));
54
- expect(aboutMatches).not.toBeNull();
55
- expect(aboutMatches).toHaveLength(2); // layout + about
56
- });
57
- it('matches deeply nested dynamic routes', () => {
58
- const tree = createTestTree([
59
- {
60
- path: '/users',
61
- component: dummyComponent,
62
- isLayout: true,
63
- children: [
64
- { path: '/', component: dummyComponent, isIndex: true },
65
- { path: '/:userId', component: dummyComponent },
66
- ],
67
- },
68
- ]);
69
- const matches = matchRoutes(tree, new URL('http://localhost/users/99'));
70
- expect(matches).not.toBeNull();
71
- expect(matches).toHaveLength(2); // users layout + :userId
72
- expect(matches[1].params).toEqual({ userId: '99' });
73
- });
74
- it('extracts params from layout routes via prefixPattern', () => {
75
- const tree = createTestTree([
76
- {
77
- path: '/users/:userId',
78
- component: dummyComponent,
79
- isLayout: true,
80
- children: [
81
- { path: '/', component: dummyComponent, isIndex: true },
82
- { path: '/settings', component: dummyComponent },
83
- ],
84
- },
85
- ]);
86
- const matches = matchRoutes(tree, new URL('http://localhost/users/42/settings'));
87
- expect(matches).not.toBeNull();
88
- expect(matches).toHaveLength(2);
89
- // Layout should extract userId param via prefixPattern
90
- expect(matches[0].params).toEqual({ userId: '42' });
91
- expect(matches[0].node.isLayout).toBe(true);
92
- });
93
- it('returns null for unmatched routes', () => {
94
- const tree = createTestTree([
95
- { path: '/about', component: dummyComponent },
96
- ]);
97
- const matches = matchRoutes(tree, new URL('http://localhost/nonexistent'));
98
- expect(matches).toBeNull();
99
- });
100
- it('does not match partial paths', () => {
101
- const tree = createTestTree([
102
- { path: '/about', component: dummyComponent },
103
- ]);
104
- const matches = matchRoutes(tree, new URL('http://localhost/about/extra'));
105
- expect(matches).toBeNull();
106
- });
107
- });
108
- //# sourceMappingURL=matcher.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"matcher.test.js","sourceRoot":"","sources":["../../src/__tests__/matcher.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=router.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"router.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/router.test.ts"],"names":[],"mappings":""}
@@ -1,327 +0,0 @@
1
- import { describe, expect, it, mock } from 'bun:test';
2
- import { createMemoryNavigationAdapter } from '../engine/navigation-adapter';
3
- import { buildRouteTree } from '../engine/route-tree';
4
- import { Router } from '../engine/router';
5
- function dummyComponent() {
6
- return null;
7
- }
8
- function createRouter(configs, initialURL = 'http://localhost/', options) {
9
- const routes = buildRouteTree(configs);
10
- const adapter = createMemoryNavigationAdapter({ initialURL });
11
- const router = new Router({ routes, adapter, ...options });
12
- router.start();
13
- return { router, adapter };
14
- }
15
- describe('Router', () => {
16
- it('initializes with the current URL state', () => {
17
- const { router } = createRouter([
18
- { path: '/', component: dummyComponent, isIndex: true },
19
- ]);
20
- const state = router.getState();
21
- expect(state.location.pathname).toBe('/');
22
- expect(state.matches).toHaveLength(1);
23
- expect(state.isPending).toBe(false);
24
- });
25
- it('navigates to a new route', () => {
26
- const { router } = createRouter([
27
- { path: '/', component: dummyComponent, isIndex: true },
28
- { path: '/about', component: dummyComponent },
29
- ]);
30
- router.navigate('/about');
31
- const state = router.getState();
32
- expect(state.location.pathname).toBe('/about');
33
- expect(state.matches).toHaveLength(1);
34
- });
35
- it('notifies subscribers on navigation', () => {
36
- const { router } = createRouter([
37
- { path: '/', component: dummyComponent, isIndex: true },
38
- { path: '/about', component: dummyComponent },
39
- ]);
40
- let lastPathname = '';
41
- const subscriber = mock((state) => {
42
- lastPathname = state.location.pathname;
43
- });
44
- router.subscribe(subscriber);
45
- router.navigate('/about');
46
- expect(subscriber).toHaveBeenCalled();
47
- expect(lastPathname).toBe('/about');
48
- });
49
- it('unsubscribes correctly', () => {
50
- const { router } = createRouter([
51
- { path: '/', component: dummyComponent, isIndex: true },
52
- { path: '/about', component: dummyComponent },
53
- ]);
54
- const subscriber = mock(() => { });
55
- const unsub = router.subscribe(subscriber);
56
- unsub();
57
- router.navigate('/about');
58
- expect(subscriber).not.toHaveBeenCalled();
59
- });
60
- it('extracts params from dynamic routes', () => {
61
- const { router } = createRouter([
62
- { path: '/users/:userId', component: dummyComponent },
63
- ]);
64
- router.navigate('/users/42');
65
- const state = router.getState();
66
- expect(state.matches[0].params).toEqual({ userId: '42' });
67
- });
68
- it('builds paths from patterns and params', () => {
69
- const { router } = createRouter([]);
70
- const path = router.buildPath('/users/:userId/posts/:postId', {
71
- userId: '42',
72
- postId: '7',
73
- });
74
- expect(path).toBe('/users/42/posts/7');
75
- });
76
- it('buildPath throws on missing params', () => {
77
- const { router } = createRouter([]);
78
- expect(() => router.buildPath('/users/:userId')).toThrow('Missing params');
79
- expect(() => router.buildPath('/users/:userId', {})).toThrow('Missing param "userId"');
80
- expect(() => router.buildPath('/users/:userId/posts/:postId', { userId: '1' })).toThrow('Missing param "postId"');
81
- });
82
- it('buildPath works for static paths without params', () => {
83
- const { router } = createRouter([]);
84
- expect(router.buildPath('/about')).toBe('/about');
85
- expect(router.buildPath('/')).toBe('/');
86
- });
87
- it('handles route guards', async () => {
88
- const guard = mock(() => false); // Block navigation
89
- const { router } = createRouter([
90
- { path: '/', component: dummyComponent, isIndex: true },
91
- { path: '/protected', component: dummyComponent, beforeEnter: guard },
92
- ]);
93
- router.navigate('/protected');
94
- // Guard blocked it, should stay at /
95
- expect(router.getState().location.pathname).toBe('/');
96
- expect(guard).toHaveBeenCalled();
97
- });
98
- it('handles async route guards that allow navigation', async () => {
99
- const guard = mock(() => Promise.resolve(true));
100
- const { router } = createRouter([
101
- { path: '/', component: dummyComponent, isIndex: true },
102
- { path: '/protected', component: dummyComponent, beforeEnter: guard },
103
- ]);
104
- router.navigate('/protected');
105
- // Async guard — need to wait for microtask
106
- await new Promise(resolve => setTimeout(resolve, 10));
107
- expect(router.getState().location.pathname).toBe('/protected');
108
- expect(guard).toHaveBeenCalled();
109
- });
110
- it('handles async route guards that block navigation', async () => {
111
- const guard = mock(() => Promise.resolve(false));
112
- const { router } = createRouter([
113
- { path: '/', component: dummyComponent, isIndex: true },
114
- { path: '/protected', component: dummyComponent, beforeEnter: guard },
115
- ]);
116
- router.navigate('/protected');
117
- await new Promise(resolve => setTimeout(resolve, 10));
118
- expect(router.getState().location.pathname).toBe('/');
119
- expect(guard).toHaveBeenCalled();
120
- });
121
- it('handles route guards that redirect', async () => {
122
- const guard = mock(() => ({ redirect: '/login' }));
123
- const { router } = createRouter([
124
- { path: '/', component: dummyComponent, isIndex: true },
125
- { path: '/login', component: dummyComponent },
126
- { path: '/protected', component: dummyComponent, beforeEnter: guard },
127
- ]);
128
- router.navigate('/protected');
129
- await new Promise(resolve => setTimeout(resolve, 10));
130
- expect(router.getState().location.pathname).toBe('/login');
131
- expect(guard).toHaveBeenCalled();
132
- });
133
- it('handles async route guards that redirect', async () => {
134
- const guard = mock(() => Promise.resolve({ redirect: '/login' }));
135
- const { router } = createRouter([
136
- { path: '/', component: dummyComponent, isIndex: true },
137
- { path: '/login', component: dummyComponent },
138
- { path: '/protected', component: dummyComponent, beforeEnter: guard },
139
- ]);
140
- router.navigate('/protected');
141
- await new Promise(resolve => setTimeout(resolve, 10));
142
- expect(router.getState().location.pathname).toBe('/login');
143
- expect(guard).toHaveBeenCalled();
144
- });
145
- it('dispose stops intercepting navigations', () => {
146
- const { router } = createRouter([
147
- { path: '/', component: dummyComponent, isIndex: true },
148
- { path: '/about', component: dummyComponent },
149
- ]);
150
- const subscriber = mock(() => { });
151
- router.subscribe(subscriber);
152
- router.dispose();
153
- router.navigate('/about');
154
- expect(subscriber).not.toHaveBeenCalled();
155
- });
156
- it('updates routes for HMR', () => {
157
- const { router } = createRouter([
158
- { path: '/', component: dummyComponent, isIndex: true },
159
- ]);
160
- const newRoutes = buildRouteTree([
161
- { path: '/', component: dummyComponent, isIndex: true },
162
- { path: '/new-route', component: dummyComponent },
163
- ]);
164
- router.updateRoutes(newRoutes);
165
- router.navigate('/new-route');
166
- expect(router.getState().location.pathname).toBe('/new-route');
167
- });
168
- it('dispose clears all subscribers', () => {
169
- const { router } = createRouter([
170
- { path: '/', component: dummyComponent, isIndex: true },
171
- { path: '/about', component: dummyComponent },
172
- ]);
173
- const subscriber = mock(() => { });
174
- router.subscribe(subscriber);
175
- router.dispose();
176
- router.navigate('/about');
177
- expect(subscriber).not.toHaveBeenCalled();
178
- });
179
- it('passes GuardContext with AbortSignal to guards', async () => {
180
- let receivedContext;
181
- const guard = mock((_match, context) => {
182
- receivedContext = context;
183
- return true;
184
- });
185
- const { router } = createRouter([
186
- { path: '/', component: dummyComponent, isIndex: true },
187
- { path: '/protected', component: dummyComponent, beforeEnter: guard },
188
- ]);
189
- router.navigate('/protected');
190
- await new Promise(resolve => setTimeout(resolve, 10));
191
- expect(guard).toHaveBeenCalled();
192
- expect(receivedContext).toBeDefined();
193
- expect(receivedContext.signal).toBeInstanceOf(AbortSignal);
194
- expect(receivedContext.signal.aborted).toBe(false);
195
- });
196
- it('aborts previous guard signal on new navigation', async () => {
197
- let firstSignal;
198
- let resolveFirst;
199
- const slowGuard = mock((_match, context) => {
200
- firstSignal = context.signal;
201
- return new Promise(resolve => {
202
- resolveFirst = () => resolve(true);
203
- });
204
- });
205
- const { router } = createRouter([
206
- { path: '/', component: dummyComponent, isIndex: true },
207
- { path: '/slow', component: dummyComponent, beforeEnter: slowGuard },
208
- { path: '/fast', component: dummyComponent },
209
- ]);
210
- // Start navigation to /slow (guard will hang)
211
- router.navigate('/slow');
212
- await new Promise(resolve => setTimeout(resolve, 10));
213
- expect(firstSignal).toBeDefined();
214
- expect(firstSignal.aborted).toBe(false);
215
- // Start a new navigation — should abort the previous signal
216
- router.navigate('/fast');
217
- await new Promise(resolve => setTimeout(resolve, 10));
218
- expect(firstSignal.aborted).toBe(true);
219
- // Clean up
220
- resolveFirst?.();
221
- });
222
- it('throws on guard redirect to non-existent route', async () => {
223
- const guard = mock(() => ({ redirect: '/nowhere' }));
224
- const routes = buildRouteTree([
225
- { path: '/', component: dummyComponent, isIndex: true },
226
- { path: '/protected', component: dummyComponent, beforeEnter: guard },
227
- ]);
228
- const adapter = createMemoryNavigationAdapter({ initialURL: 'http://localhost/' });
229
- // Intercept the navigate event to capture the handler promise for assertions
230
- // while converting the error to NavigationAbortedError so the adapter swallows it.
231
- let handlerPromise;
232
- const origAddEventListener = adapter.addEventListener;
233
- adapter.addEventListener = (_type, listener) => {
234
- origAddEventListener.call(adapter, _type, (event) => {
235
- const origEventIntercept = event.intercept.bind(event);
236
- event.intercept = (opts) => {
237
- handlerPromise = opts.handler();
238
- origEventIntercept({
239
- ...opts,
240
- handler: () => handlerPromise.catch(() => {
241
- // Convert to NavigationAbortedError so the adapter swallows it
242
- const err = new Error();
243
- err.name = 'NavigationAbortedError';
244
- throw err;
245
- }),
246
- });
247
- };
248
- listener(event);
249
- });
250
- };
251
- const router = new Router({ routes, adapter });
252
- router.start();
253
- router.navigate('/protected');
254
- expect(handlerPromise).toBeDefined();
255
- await expect(handlerPromise).rejects.toThrow('does not match any route');
256
- expect(router.getState().location.pathname).toBe('/');
257
- });
258
- it('generates deterministic path-based IDs', () => {
259
- const routes = buildRouteTree([
260
- {
261
- path: '/',
262
- component: dummyComponent,
263
- isLayout: true,
264
- children: [
265
- { path: '/', component: dummyComponent, isIndex: true },
266
- { path: '/about', component: dummyComponent },
267
- ],
268
- },
269
- ]);
270
- expect(routes[0].id).toBe('route:/:layout');
271
- expect(routes[0].children[0].id).toBe('route:/');
272
- expect(routes[0].children[1].id).toBe('route:/about');
273
- });
274
- });
275
- describe('Router.resolveParams', () => {
276
- it('returns explicit params only when no persistent params configured', () => {
277
- const { router } = createRouter([
278
- { path: '/users/:userId', component: dummyComponent },
279
- ]);
280
- const result = router.resolveParams('/users/:userId', { userId: '42' });
281
- expect(result).toEqual({ userId: '42' });
282
- });
283
- it('resolves params from current URL match', () => {
284
- const { router } = createRouter([
285
- { path: '/:lang/users', component: dummyComponent },
286
- ], 'http://localhost/en/users');
287
- const result = router.resolveParams('/:lang/users');
288
- expect(result).toEqual({ lang: 'en' });
289
- });
290
- it('explicit params override current match', () => {
291
- const { router } = createRouter([
292
- { path: '/:lang/users', component: dummyComponent },
293
- ], 'http://localhost/en/users');
294
- const result = router.resolveParams('/:lang/users', { lang: 'cs' });
295
- expect(result).toEqual({ lang: 'cs' });
296
- });
297
- it('falls back to persistentParams callback', () => {
298
- const { router } = createRouter([
299
- { path: '/admin', component: dummyComponent },
300
- { path: '/:lang/users', component: dummyComponent },
301
- ], 'http://localhost/admin', { persistentParams: () => ({ lang: 'en' }) });
302
- const result = router.resolveParams('/:lang/users');
303
- expect(result).toEqual({ lang: 'en' });
304
- });
305
- it('current match overrides callback', () => {
306
- const { router } = createRouter([{ path: '/:lang/users', component: dummyComponent }], 'http://localhost/cs/users', { persistentParams: () => ({ lang: 'en' }) });
307
- const result = router.resolveParams('/:lang/users');
308
- expect(result).toEqual({ lang: 'cs' });
309
- });
310
- it('only fills params present in target pattern', () => {
311
- const { router } = createRouter([{ path: '/:lang/users/:userId', component: dummyComponent }], 'http://localhost/en/users/42', { persistentParams: () => ({ lang: 'en' }) });
312
- // Target pattern only has :lang, not :userId
313
- const result = router.resolveParams('/:lang/about');
314
- expect(result).toEqual({ lang: 'en' });
315
- });
316
- it('handles mixed persistent and non-persistent params', () => {
317
- const { router } = createRouter([{ path: '/:lang/users', component: dummyComponent }], 'http://localhost/en/users', { persistentParams: () => ({ lang: 'en' }) });
318
- const result = router.resolveParams('/:lang/users/:userId', { userId: '42' });
319
- expect(result).toEqual({ lang: 'en', userId: '42' });
320
- });
321
- it('returns empty object when pattern has no params', () => {
322
- const { router } = createRouter([{ path: '/about', component: dummyComponent }], 'http://localhost/about');
323
- const result = router.resolveParams('/about');
324
- expect(result).toEqual({});
325
- });
326
- });
327
- //# sourceMappingURL=router.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"router.test.js","sourceRoot":"","sources":["../../src/__tests__/router.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AACrD,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAA;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAGzC,SAAS,cAAc;IACtB,OAAO,IAAI,CAAA;AACZ,CAAC;AAED,SAAS,YAAY,CACpB,OAAsB,EACtB,UAAU,GAAG,mBAAmB,EAChC,OAA6D;IAE7D,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;IACtC,MAAM,OAAO,GAAG,6BAA6B,CAAC,EAAE,UAAU,EAAE,CAAC,CAAA;IAC7D,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;IAC1D,MAAM,CAAC,KAAK,EAAE,CAAA;IACd,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;AAC3B,CAAC;AAED,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACvB,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACjD,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;YAC/B,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;SACvD,CAAC,CAAA;QAEF,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAA;QAC/B,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACzC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACrC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACnC,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;YAC/B,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;YACvD,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE;SAC7C,CAAC,CAAA;QAEF,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACzB,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAA;QAC/B,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC9C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC7C,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;YAC/B,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;YACvD,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE;SAC7C,CAAC,CAAA;QAEF,IAAI,YAAY,GAAG,EAAE,CAAA;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,KAAwB,EAAE,EAAE;YACpD,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAA;QACvC,CAAC,CAAC,CAAA;QACF,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QAE5B,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACzB,MAAM,CAAC,UAAU,CAAC,CAAC,gBAAgB,EAAE,CAAA;QACrC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACjC,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;YAC/B,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;YACvD,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE;SAC7C,CAAC,CAAA;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACjC,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QAC1C,KAAK,EAAE,CAAA;QAEP,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACzB,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC9C,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;YAC/B,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,cAAc,EAAE;SACrD,CAAC,CAAA;QAEF,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAA;QAC/B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAChD,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,EAAE,CAAC,CAAA;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,8BAA8B,EAAE;YAC7D,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,GAAG;SACX,CAAC,CAAA;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC7C,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,EAAE,CAAC,CAAA;QACnC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;QAC1E,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAA;QACtF,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,8BAA8B,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAA;IAClH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC1D,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,EAAE,CAAC,CAAA;QACnC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACjD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA,CAAC,mBAAmB;QAEnD,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;YAC/B,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;YACvD,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE;SACrE,CAAC,CAAA;QAEF,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QAC7B,qCAAqC;QACrC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACrD,MAAM,CAAC,KAAK,CAAC,CAAC,gBAAgB,EAAE,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;QAE/C,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;YAC/B,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;YACvD,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE;SACrE,CAAC,CAAA;QAEF,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QAC7B,2CAA2C;QAC3C,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;QACrD,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC9D,MAAM,CAAC,KAAK,CAAC,CAAC,gBAAgB,EAAE,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAEhD,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;YAC/B,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;YACvD,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE;SACrE,CAAC,CAAA;QAEF,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QAC7B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;QACrD,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACrD,MAAM,CAAC,KAAK,CAAC,CAAC,gBAAgB,EAAE,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;QAElD,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;YAC/B,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;YACvD,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE;YAC7C,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE;SACrE,CAAC,CAAA;QAEF,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QAC7B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;QACrD,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC1D,MAAM,CAAC,KAAK,CAAC,CAAC,gBAAgB,EAAE,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;QAEjE,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;YAC/B,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;YACvD,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE;YAC7C,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE;SACrE,CAAC,CAAA;QAEF,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QAC7B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;QACrD,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC1D,MAAM,CAAC,KAAK,CAAC,CAAC,gBAAgB,EAAE,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACjD,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;YAC/B,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;YACvD,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE;SAC7C,CAAC,CAAA;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACjC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QAC5B,MAAM,CAAC,OAAO,EAAE,CAAA;QAEhB,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACzB,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACjC,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;YAC/B,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;SACvD,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,cAAc,CAAC;YAChC,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;YACvD,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE;SACjD,CAAC,CAAA;QAEF,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;QAC9B,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QAC7B,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACzC,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;YAC/B,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;YACvD,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE;SAC7C,CAAC,CAAA;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACjC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QAC5B,MAAM,CAAC,OAAO,EAAE,CAAA;QAEhB,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACzB,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC/D,IAAI,eAAyC,CAAA;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,MAAe,EAAE,OAAqB,EAAE,EAAE;YAC7D,eAAe,GAAG,OAAO,CAAA;YACzB,OAAO,IAAI,CAAA;QACZ,CAAC,CAAC,CAAA;QAEF,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;YAC/B,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;YACvD,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE;SACrE,CAAC,CAAA;QAEF,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QAC7B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;QACrD,MAAM,CAAC,KAAK,CAAC,CAAC,gBAAgB,EAAE,CAAA;QAChC,MAAM,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAA;QACrC,MAAM,CAAC,eAAgB,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAA;QAC3D,MAAM,CAAC,eAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC/D,IAAI,WAAoC,CAAA;QACxC,IAAI,YAAsC,CAAA;QAE1C,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,MAAe,EAAE,OAAqB,EAAE,EAAE;YACjE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAA;YAC5B,OAAO,IAAI,OAAO,CAAU,OAAO,CAAC,EAAE;gBACrC,YAAY,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACnC,CAAC,CAAC,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;YAC/B,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;YACvD,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE;YACpE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE;SAC5C,CAAC,CAAA;QAEF,8CAA8C;QAC9C,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QACxB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;QACrD,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAA;QACjC,MAAM,CAAC,WAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAExC,4DAA4D;QAC5D,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QACxB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;QACrD,MAAM,CAAC,WAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEvC,WAAW;QACX,YAAY,EAAE,EAAE,CAAA;IACjB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;QAEpD,MAAM,MAAM,GAAG,cAAc,CAAC;YAC7B,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;YACvD,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE;SACrE,CAAC,CAAA;QACF,MAAM,OAAO,GAAG,6BAA6B,CAAC,EAAE,UAAU,EAAE,mBAAmB,EAAE,CAAC,CAAA;QAElF,6EAA6E;QAC7E,mFAAmF;QACnF,IAAI,cAAyC,CAAA;QAC7C,MAAM,oBAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAA;QACrD,OAAO,CAAC,gBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YAC9C,oBAAoB,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;gBACnD,MAAM,kBAAkB,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBACtD,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,EAAE,EAAE;oBAC1B,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;oBAC/B,kBAAkB,CAAC;wBAClB,GAAG,IAAI;wBACP,OAAO,EAAE,GAAG,EAAE,CACb,cAAe,CAAC,KAAK,CAAC,GAAG,EAAE;4BAC1B,+DAA+D;4BAC/D,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAA;4BACvB,GAAG,CAAC,IAAI,GAAG,wBAAwB,CAAA;4BACnC,MAAM,GAAG,CAAA;wBACV,CAAC,CAAC;qBACH,CAAC,CAAA;gBACH,CAAC,CAAA;gBACD,QAAQ,CAAC,KAAK,CAAC,CAAA;YAChB,CAAC,CAAC,CAAA;QACH,CAAC,CAAA;QAED,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;QAC9C,MAAM,CAAC,KAAK,EAAE,CAAA;QAEd,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QAC7B,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAA;QACpC,MAAM,MAAM,CAAC,cAAe,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAA;QACzE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,cAAc,CAAC;YAC7B;gBACC,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,cAAc;gBACzB,QAAQ,EAAE,IAAI;gBACd,QAAQ,EAAE;oBACT,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;oBACvD,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE;iBAC7C;aACD;SACD,CAAC,CAAA;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAChD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC5E,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;YAC/B,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,cAAc,EAAE;SACrD,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QACvE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACjD,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;YAC/B,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE;SACnD,EAAE,2BAA2B,CAAC,CAAA;QAE/B,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,CAAA;QACnD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACjD,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;YAC/B,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE;SACnD,EAAE,2BAA2B,CAAC,CAAA;QAE/B,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QACnE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QAClD,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAC9B;YACC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE;YAC7C,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE;SACnD,EACD,wBAAwB,EACxB,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAC5C,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,CAAA;QACnD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAC9B,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,EACrD,2BAA2B,EAC3B,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAC5C,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,CAAA;QACnD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACtD,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAC9B,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,EAC7D,8BAA8B,EAC9B,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAC5C,CAAA;QAED,6CAA6C;QAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,CAAA;QACnD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAC9B,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,EACrD,2BAA2B,EAC3B,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAC5C,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QAC7E,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC1D,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAC9B,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,EAC/C,wBAAwB,CACxB,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -1,15 +0,0 @@
1
- declare module '../engine/types.js' {
2
- interface BuzolaPageMap {
3
- 'home': {};
4
- 'about': {};
5
- 'users/detail': {
6
- userId: string;
7
- };
8
- 'users/posts': {
9
- userId: string;
10
- postId: string;
11
- };
12
- }
13
- }
14
- export {};
15
- //# sourceMappingURL=type-safety.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"type-safety.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/type-safety.test.tsx"],"names":[],"mappings":"AAOA,OAAO,QAAQ,oBAAoB,CAAC;IACnC,UAAU,aAAa;QACtB,MAAM,EAAE,EAAE,CAAA;QACV,OAAO,EAAE,EAAE,CAAA;QACX,cAAc,EAAE;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,CAAA;QAClC,aAAa,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAA;KACjD;CACD"}