@buzola/router 0.0.3 → 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.
- package/dist/define/create-page.d.ts +17 -5
- package/dist/define/create-page.d.ts.map +1 -1
- package/dist/define/create-page.js +78 -38
- package/dist/define/create-page.js.map +1 -1
- package/dist/engine/loader-cache.d.ts +18 -0
- package/dist/engine/loader-cache.d.ts.map +1 -0
- package/dist/engine/loader-cache.js +48 -0
- package/dist/engine/loader-cache.js.map +1 -0
- package/dist/engine/matcher.d.ts +1 -1
- package/dist/engine/matcher.d.ts.map +1 -1
- package/dist/engine/navigation-adapter.d.ts +1 -1
- package/dist/engine/navigation-adapter.d.ts.map +1 -1
- package/dist/engine/route-tree.d.ts +1 -2
- package/dist/engine/route-tree.d.ts.map +1 -1
- package/dist/engine/route-tree.js +5 -4
- package/dist/engine/route-tree.js.map +1 -1
- package/dist/engine/router.d.ts +7 -10
- package/dist/engine/router.d.ts.map +1 -1
- package/dist/engine/router.js +23 -67
- package/dist/engine/router.js.map +1 -1
- package/dist/engine/schema.d.ts +5 -1
- package/dist/engine/schema.d.ts.map +1 -1
- package/dist/engine/schema.js +11 -1
- package/dist/engine/schema.js.map +1 -1
- package/dist/engine/types.d.ts +2 -15
- package/dist/engine/types.d.ts.map +1 -1
- package/dist/engine/utils.d.ts +8 -0
- package/dist/engine/utils.d.ts.map +1 -1
- package/dist/engine/utils.js +10 -3
- package/dist/engine/utils.js.map +1 -1
- package/dist/index.d.ts +14 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -7
- package/dist/index.js.map +1 -1
- package/dist/react/context.d.ts +2 -2
- package/dist/react/context.d.ts.map +1 -1
- package/dist/react/hooks.d.ts +3 -3
- package/dist/react/hooks.d.ts.map +1 -1
- package/dist/react/hooks.js +11 -9
- package/dist/react/hooks.js.map +1 -1
- package/dist/react/index.d.ts +11 -11
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +6 -6
- package/dist/react/index.js.map +1 -1
- package/dist/react/link.d.ts +5 -0
- package/dist/react/link.d.ts.map +1 -1
- package/dist/react/link.js +10 -1
- package/dist/react/link.js.map +1 -1
- package/dist/react/outlet.d.ts +3 -1
- package/dist/react/outlet.d.ts.map +1 -1
- package/dist/react/outlet.js +25 -1
- package/dist/react/outlet.js.map +1 -1
- package/dist/react/provider.d.ts +15 -2
- package/dist/react/provider.d.ts.map +1 -1
- package/dist/react/provider.js +15 -4
- package/dist/react/provider.js.map +1 -1
- package/package.json +6 -3
- package/src/__tests__/create-page.test.ts +42 -6
- package/src/__tests__/loader-cache.test.ts +115 -0
- package/src/__tests__/matcher.test.ts +3 -3
- package/src/__tests__/react.test.tsx +1020 -0
- package/src/__tests__/router.test.ts +4 -214
- package/src/__tests__/setup-dom.ts +21 -0
- package/src/define/create-page.tsx +94 -46
- package/src/engine/loader-cache.ts +55 -0
- package/src/engine/matcher.ts +1 -1
- package/src/engine/navigation-adapter.ts +1 -1
- package/src/engine/route-tree.ts +4 -6
- package/src/engine/router.ts +27 -73
- package/src/engine/schema.ts +13 -2
- package/src/engine/types.ts +2 -18
- package/src/engine/utils.ts +11 -3
- package/src/index.ts +15 -17
- package/src/react/context.ts +2 -2
- package/src/react/hooks.ts +14 -13
- package/src/react/index.ts +21 -11
- package/src/react/link.tsx +16 -0
- package/src/react/outlet.tsx +32 -1
- package/src/react/provider.tsx +33 -5
- package/dist/__tests__/create-page.test.d.ts +0 -2
- package/dist/__tests__/create-page.test.d.ts.map +0 -1
- package/dist/__tests__/create-page.test.js +0 -457
- package/dist/__tests__/create-page.test.js.map +0 -1
- package/dist/__tests__/matcher.test.d.ts +0 -2
- package/dist/__tests__/matcher.test.d.ts.map +0 -1
- package/dist/__tests__/matcher.test.js +0 -108
- package/dist/__tests__/matcher.test.js.map +0 -1
- package/dist/__tests__/router.test.d.ts +0 -2
- package/dist/__tests__/router.test.d.ts.map +0 -1
- package/dist/__tests__/router.test.js +0 -327
- package/dist/__tests__/router.test.js.map +0 -1
- package/dist/__tests__/type-safety.test.d.ts +0 -15
- package/dist/__tests__/type-safety.test.d.ts.map +0 -1
- package/dist/__tests__/type-safety.test.js +0 -163
- package/dist/__tests__/type-safety.test.js.map +0 -1
|
@@ -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"}
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { describe, expect, it } from 'bun:test';
|
|
3
|
-
import React from 'react';
|
|
4
|
-
import { createPage } from '../define/create-page.js';
|
|
5
|
-
// ─── Helper ─────────────────────────────────────────────────────────────────
|
|
6
|
-
function mockSchema() {
|
|
7
|
-
return { '~standard': { version: 1, vendor: 'test', validate: (v) => ({ value: v }) } };
|
|
8
|
-
}
|
|
9
|
-
// ─── createPage().route() type safety ───────────────────────────────────────
|
|
10
|
-
describe('createPage route type safety', () => {
|
|
11
|
-
it('allows static route without params', () => {
|
|
12
|
-
const _page = createPage().route('/about').render(() => null);
|
|
13
|
-
expect(true).toBe(true);
|
|
14
|
-
});
|
|
15
|
-
it('rejects dynamic route without params', () => {
|
|
16
|
-
// @ts-expect-error — :id in route but no .params() defined
|
|
17
|
-
const _page = createPage().route('/users/:id').render(() => null);
|
|
18
|
-
expect(true).toBe(true);
|
|
19
|
-
});
|
|
20
|
-
it('allows dynamic route when param is in schema', () => {
|
|
21
|
-
const _page = createPage()
|
|
22
|
-
.params(mockSchema())
|
|
23
|
-
.route('/users/:id')
|
|
24
|
-
.render(({ params }) => null);
|
|
25
|
-
expect(true).toBe(true);
|
|
26
|
-
});
|
|
27
|
-
it('rejects dynamic route when param is not in schema', () => {
|
|
28
|
-
const _page = createPage()
|
|
29
|
-
.params(mockSchema())
|
|
30
|
-
// @ts-expect-error — :id is not a key of { userId: string }
|
|
31
|
-
.route('/users/:id')
|
|
32
|
-
.render(({ params }) => null);
|
|
33
|
-
expect(true).toBe(true);
|
|
34
|
-
});
|
|
35
|
-
it('allows multiple route params when all are in schema', () => {
|
|
36
|
-
const _page = createPage()
|
|
37
|
-
.params(mockSchema())
|
|
38
|
-
.route('/users/:userId/posts/:postId')
|
|
39
|
-
.render(({ params }) => null);
|
|
40
|
-
expect(true).toBe(true);
|
|
41
|
-
});
|
|
42
|
-
it('rejects when one route param is missing from schema', () => {
|
|
43
|
-
const _page = createPage()
|
|
44
|
-
.params(mockSchema())
|
|
45
|
-
// @ts-expect-error — :postId is not in { userId: string }
|
|
46
|
-
.route('/users/:userId/posts/:postId')
|
|
47
|
-
.render(({ params }) => null);
|
|
48
|
-
expect(true).toBe(true);
|
|
49
|
-
});
|
|
50
|
-
it('allows schema params that are not in route (they become query params)', () => {
|
|
51
|
-
const _page = createPage()
|
|
52
|
-
.params(mockSchema())
|
|
53
|
-
.route('/users/:userId')
|
|
54
|
-
.render(({ params }) => null);
|
|
55
|
-
expect(true).toBe(true);
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
// ─── createPage().catch() type safety ────────────────────────────────────────
|
|
59
|
-
describe('createPage catch type safety', () => {
|
|
60
|
-
it('.catch() is available before .render()', () => {
|
|
61
|
-
const _page = createPage()
|
|
62
|
-
.catch(({ error }) => _jsx("div", { children: error.message }))
|
|
63
|
-
.render(() => null);
|
|
64
|
-
expect(true).toBe(true);
|
|
65
|
-
});
|
|
66
|
-
it('.catch() is available after .route()', () => {
|
|
67
|
-
const _page = createPage()
|
|
68
|
-
.route('/about')
|
|
69
|
-
.catch(({ error }) => _jsx("div", { children: error.message }))
|
|
70
|
-
.render(() => null);
|
|
71
|
-
expect(true).toBe(true);
|
|
72
|
-
});
|
|
73
|
-
it('no .catch() after .catch()', () => {
|
|
74
|
-
const withCatch = createPage().catch(({ error }) => _jsx("div", { children: error.message }));
|
|
75
|
-
// @ts-expect-error — .catch() should not be available after .catch()
|
|
76
|
-
withCatch.catch;
|
|
77
|
-
expect(true).toBe(true);
|
|
78
|
-
});
|
|
79
|
-
it('no .loader() after .catch()', () => {
|
|
80
|
-
const withCatch = createPage().catch(({ error }) => _jsx("div", { children: error.message }));
|
|
81
|
-
// @ts-expect-error — .loader() should not be available after .catch()
|
|
82
|
-
withCatch.loader;
|
|
83
|
-
expect(true).toBe(true);
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
// ─── LinkProps ──────────────────────────────────────────────────────────────
|
|
87
|
-
describe('LinkProps type safety', () => {
|
|
88
|
-
it('static page does not require params', () => {
|
|
89
|
-
const _a = { to: 'home' };
|
|
90
|
-
const _b = { to: 'about' };
|
|
91
|
-
expect(true).toBe(true);
|
|
92
|
-
});
|
|
93
|
-
it('static page rejects params', () => {
|
|
94
|
-
// @ts-expect-error — static page should not accept params
|
|
95
|
-
const _a = { to: 'about', params: { foo: 'bar' } };
|
|
96
|
-
expect(true).toBe(true);
|
|
97
|
-
});
|
|
98
|
-
it('dynamic page requires params', () => {
|
|
99
|
-
const _a = { to: 'users/detail', params: { userId: '1' } };
|
|
100
|
-
// @ts-expect-error — missing required params
|
|
101
|
-
const _b = { to: 'users/detail' };
|
|
102
|
-
expect(true).toBe(true);
|
|
103
|
-
});
|
|
104
|
-
it('dynamic page requires correct param names', () => {
|
|
105
|
-
// @ts-expect-error — wrong param name
|
|
106
|
-
const _a = { to: 'users/detail', params: { id: '1' } };
|
|
107
|
-
expect(true).toBe(true);
|
|
108
|
-
});
|
|
109
|
-
it('multi-param page requires all params', () => {
|
|
110
|
-
const _a = {
|
|
111
|
-
to: 'users/posts',
|
|
112
|
-
params: { userId: '1', postId: '2' },
|
|
113
|
-
};
|
|
114
|
-
const _b = {
|
|
115
|
-
to: 'users/posts',
|
|
116
|
-
// @ts-expect-error — missing postId
|
|
117
|
-
params: { userId: '1' },
|
|
118
|
-
};
|
|
119
|
-
expect(true).toBe(true);
|
|
120
|
-
});
|
|
121
|
-
it('rejects unregistered pages', () => {
|
|
122
|
-
// @ts-expect-error — page not in BuzolaPageMap
|
|
123
|
-
const _a = { to: 'unknown' };
|
|
124
|
-
expect(true).toBe(true);
|
|
125
|
-
});
|
|
126
|
-
});
|
|
127
|
-
// ─── Link JSX usage (generic inference) ─────────────────────────────────────
|
|
128
|
-
import { Link } from '../react/link.js';
|
|
129
|
-
describe('Link JSX generic inference', () => {
|
|
130
|
-
it('accepts static page without params', () => {
|
|
131
|
-
const _el = _jsx(Link, { to: "home", children: "Home" });
|
|
132
|
-
const _el2 = _jsx(Link, { to: "about", children: "About" });
|
|
133
|
-
expect(true).toBe(true);
|
|
134
|
-
});
|
|
135
|
-
it('rejects params on static page', () => {
|
|
136
|
-
// @ts-expect-error — static page should not accept params
|
|
137
|
-
const _el = _jsx(Link, { to: "about", params: { foo: 'bar' }, children: "About" });
|
|
138
|
-
expect(true).toBe(true);
|
|
139
|
-
});
|
|
140
|
-
it('requires params on dynamic page', () => {
|
|
141
|
-
const _el = _jsx(Link, { to: "users/detail", params: { userId: '1' }, children: "User" });
|
|
142
|
-
// @ts-expect-error — missing required params
|
|
143
|
-
const _el2 = _jsx(Link, { to: "users/detail", children: "User" });
|
|
144
|
-
expect(true).toBe(true);
|
|
145
|
-
});
|
|
146
|
-
it('rejects wrong param names', () => {
|
|
147
|
-
// @ts-expect-error — wrong param name
|
|
148
|
-
const _el = _jsx(Link, { to: "users/detail", params: { id: '1' }, children: "User" });
|
|
149
|
-
expect(true).toBe(true);
|
|
150
|
-
});
|
|
151
|
-
it('requires all params for multi-param page', () => {
|
|
152
|
-
const _ok = _jsx(Link, { to: "users/posts", params: { userId: '1', postId: '2' }, children: "Post" });
|
|
153
|
-
// @ts-expect-error — missing postId
|
|
154
|
-
const _bad = _jsx(Link, { to: "users/posts", params: { userId: '1' }, children: "Post" });
|
|
155
|
-
expect(true).toBe(true);
|
|
156
|
-
});
|
|
157
|
-
it('rejects unregistered pages', () => {
|
|
158
|
-
// @ts-expect-error — page not in BuzolaPageMap
|
|
159
|
-
const _el = _jsx(Link, { to: "nope", children: "Nope" });
|
|
160
|
-
expect(true).toBe(true);
|
|
161
|
-
});
|
|
162
|
-
});
|
|
163
|
-
//# sourceMappingURL=type-safety.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"type-safety.test.js","sourceRoot":"","sources":["../../src/__tests__/type-safety.test.tsx"],"names":[],"mappings":"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"}
|