@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.
Files changed (95) 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 +6 -3
  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__/matcher.test.d.ts +0 -2
  85. package/dist/__tests__/matcher.test.d.ts.map +0 -1
  86. package/dist/__tests__/matcher.test.js +0 -108
  87. package/dist/__tests__/matcher.test.js.map +0 -1
  88. package/dist/__tests__/router.test.d.ts +0 -2
  89. package/dist/__tests__/router.test.d.ts.map +0 -1
  90. package/dist/__tests__/router.test.js +0 -327
  91. package/dist/__tests__/router.test.js.map +0 -1
  92. package/dist/__tests__/type-safety.test.d.ts +0 -15
  93. package/dist/__tests__/type-safety.test.d.ts.map +0 -1
  94. package/dist/__tests__/type-safety.test.js +0 -163
  95. 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":"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"}
@@ -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":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,UAAU,CAAA;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAcrD,+EAA+E;AAE/E,SAAS,UAAU;IAClB,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAM,EAAE,CAAC,EAAE,EAAE,CAAA;AAC7F,CAAC;AAED,+EAA+E;AAE/E,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC7C,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QAC7D,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC/C,2DAA2D;QAC3D,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QACjE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACvD,MAAM,KAAK,GAAG,UAAU,EAAE;aACxB,MAAM,CAAC,UAAU,EAAkB,CAAC;aACpC,KAAK,CAAC,YAAY,CAAC;aACnB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;QAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC5D,MAAM,KAAK,GAAG,UAAU,EAAE;aACxB,MAAM,CAAC,UAAU,EAAsB,CAAC;YACzC,4DAA4D;aAC3D,KAAK,CAAC,YAAY,CAAC;aACnB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;QAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC9D,MAAM,KAAK,GAAG,UAAU,EAAE;aACxB,MAAM,CAAC,UAAU,EAAsC,CAAC;aACxD,KAAK,CAAC,8BAA8B,CAAC;aACrC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;QAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC9D,MAAM,KAAK,GAAG,UAAU,EAAE;aACxB,MAAM,CAAC,UAAU,EAAsB,CAAC;YACzC,0DAA0D;aACzD,KAAK,CAAC,8BAA8B,CAAC;aACrC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;QAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAChF,MAAM,KAAK,GAAG,UAAU,EAAE;aACxB,MAAM,CAAC,UAAU,EAAmC,CAAC;aACrD,KAAK,CAAC,gBAAgB,CAAC;aACvB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;QAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,gFAAgF;AAEhF,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACjD,MAAM,KAAK,GAAG,UAAU,EAAE;aACxB,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,wBAAM,KAAK,CAAC,OAAO,GAAO,CAAC;aAChD,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QACpB,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC/C,MAAM,KAAK,GAAG,UAAU,EAAE;aACxB,KAAK,CAAC,QAAQ,CAAC;aACf,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,wBAAM,KAAK,CAAC,OAAO,GAAO,CAAC;aAChD,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QACpB,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACrC,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,wBAAM,KAAK,CAAC,OAAO,GAAO,CAAC,CAAA;QAC/E,qEAAqE;QACrE,SAAS,CAAC,KAAK,CAAA;QACf,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACtC,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,wBAAM,KAAK,CAAC,OAAO,GAAO,CAAC,CAAA;QAC/E,sEAAsE;QACtE,SAAS,CAAC,MAAM,CAAA;QAChB,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,+EAA+E;AAE/E,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC9C,MAAM,EAAE,GAAsB,EAAE,EAAE,EAAE,MAAM,EAAE,CAAA;QAC5C,MAAM,EAAE,GAAuB,EAAE,EAAE,EAAE,OAAO,EAAE,CAAA;QAC9C,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACrC,0DAA0D;QAC1D,MAAM,EAAE,GAAuB,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAA;QACtE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACvC,MAAM,EAAE,GAA8B,EAAE,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAA;QAErF,6CAA6C;QAC7C,MAAM,EAAE,GAA8B,EAAE,EAAE,EAAE,cAAc,EAAE,CAAA;QAC5D,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACpD,sCAAsC;QACtC,MAAM,EAAE,GAA8B,EAAE,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAA;QACjF,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC/C,MAAM,EAAE,GAA6B;YACpC,EAAE,EAAE,aAAa;YACjB,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;SACpC,CAAA;QAED,MAAM,EAAE,GAA6B;YACpC,EAAE,EAAE,aAAa;YACjB,oCAAoC;YACpC,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE;SACvB,CAAA;QACD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACrC,+CAA+C;QAC/C,MAAM,EAAE,GAAyB,EAAE,EAAE,EAAE,SAAS,EAAE,CAAA;QAClD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,+EAA+E;AAE/E,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAEvC,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC7C,MAAM,GAAG,GAAG,KAAC,IAAI,IAAC,EAAE,EAAC,MAAM,qBAAY,CAAA;QACvC,MAAM,IAAI,GAAG,KAAC,IAAI,IAAC,EAAE,EAAC,OAAO,sBAAa,CAAA;QAC1C,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACxC,0DAA0D;QAC1D,MAAM,GAAG,GAAG,KAAC,IAAI,IAAC,EAAE,EAAC,OAAO,EAAC,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,sBAAc,CAAA;QACjE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC1C,MAAM,GAAG,GAAG,KAAC,IAAI,IAAC,EAAE,EAAC,cAAc,EAAC,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAa,CAAA;QAExE,6CAA6C;QAC7C,MAAM,IAAI,GAAG,KAAC,IAAI,IAAC,EAAE,EAAC,cAAc,qBAAY,CAAA;QAChD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACpC,sCAAsC;QACtC,MAAM,GAAG,GAAG,KAAC,IAAI,IAAC,EAAE,EAAC,cAAc,EAAC,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,qBAAa,CAAA;QACpE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACnD,MAAM,GAAG,GAAG,KAAC,IAAI,IAAC,EAAE,EAAC,aAAa,EAAC,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAa,CAAA;QAEpF,oCAAoC;QACpC,MAAM,IAAI,GAAG,KAAC,IAAI,IAAC,EAAE,EAAC,aAAa,EAAC,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAa,CAAA;QACxE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACrC,+CAA+C;QAC/C,MAAM,GAAG,GAAG,KAAC,IAAI,IAAC,EAAE,EAAC,MAAM,qBAAY,CAAA;QACvC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}