@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,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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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/types.test.ts"],"names":[],"mappings":""}
@@ -1,22 +0,0 @@
1
- import { describe, expect, it } from 'bun:test';
2
- describe('ParamsForPath type', () => {
3
- it('extracts no params from static paths', () => {
4
- // Type-level test: this should compile without error
5
- const _test = {};
6
- expect(true).toBe(true);
7
- });
8
- it('extracts a single param', () => {
9
- const _test = { userId: 'abc' };
10
- expect(_test.userId).toBe('abc');
11
- });
12
- it('extracts multiple params', () => {
13
- const _test = { userId: '1', postId: '2' };
14
- expect(_test.userId).toBe('1');
15
- expect(_test.postId).toBe('2');
16
- });
17
- it('handles root path', () => {
18
- const _test = {};
19
- expect(true).toBe(true);
20
- });
21
- });
22
- //# sourceMappingURL=types.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../src/__tests__/types.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,UAAU,CAAA;AAG/C,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC/C,qDAAqD;QACrD,MAAM,KAAK,GAA4B,EAAwB,CAAA;QAC/D,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QAClC,MAAM,KAAK,GAAoC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;QAChE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACnC,MAAM,KAAK,GAAkD,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;QACzF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC9B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC/B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC5B,MAAM,KAAK,GAAuB,EAAwB,CAAA;QAC1D,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -1,34 +0,0 @@
1
- import type { RouteComponent, RouteConfig, RouteGuard, RouteNode, StandardSchema } from '../engine/types';
2
- export interface DefineRouteOptions {
3
- /** Schema for validating search params. */
4
- searchSchema?: StandardSchema;
5
- /** Guard function called before entering this route. */
6
- beforeEnter?: RouteGuard;
7
- }
8
- /**
9
- * Define route-level configuration for a route file.
10
- * Used in file-based routing: `export const route = defineRoute({ ... })`.
11
- */
12
- export declare function defineRoute(options: DefineRouteOptions): DefineRouteOptions;
13
- export interface RouteDefinitionOptions {
14
- component?: RouteComponent;
15
- searchSchema?: StandardSchema;
16
- beforeEnter?: RouteGuard;
17
- }
18
- export type RouteBuilderFn = (route: (path: string, options: RouteDefinitionOptions | RouteComponent, children?: RouteConfig[]) => RouteConfig) => RouteConfig[];
19
- /**
20
- * Declarative route definition builder.
21
- *
22
- * @example
23
- * ```ts
24
- * const routeTree = defineRoutes(route => [
25
- * route('/', { component: Home }),
26
- * route('/users', { component: UsersLayout }, [
27
- * route('/', { component: UsersList }),
28
- * route('/:userId', { component: UserDetail }),
29
- * ]),
30
- * ]);
31
- * ```
32
- */
33
- export declare function defineRoutes(builder: RouteBuilderFn): RouteNode[];
34
- //# sourceMappingURL=define-routes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"define-routes.d.ts","sourceRoot":"","sources":["../../src/define/define-routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAIzG,MAAM,WAAW,kBAAkB;IAClC,2CAA2C;IAC3C,YAAY,CAAC,EAAE,cAAc,CAAA;IAC7B,wDAAwD;IACxD,WAAW,CAAC,EAAE,UAAU,CAAA;CACxB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,kBAAkB,CAE3E;AAaD,MAAM,WAAW,sBAAsB;IACtC,SAAS,CAAC,EAAE,cAAc,CAAA;IAC1B,YAAY,CAAC,EAAE,cAAc,CAAA;IAC7B,WAAW,CAAC,EAAE,UAAU,CAAA;CACxB;AAED,MAAM,MAAM,cAAc,GAAG,CAC5B,KAAK,EAAE,CACN,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,sBAAsB,GAAG,cAAc,EAChD,QAAQ,CAAC,EAAE,WAAW,EAAE,KACpB,WAAW,KACZ,WAAW,EAAE,CAAA;AAElB;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS,EAAE,CA2BjE"}
@@ -1,53 +0,0 @@
1
- import { buildRouteTree } from '../engine/route-tree';
2
- /**
3
- * Define route-level configuration for a route file.
4
- * Used in file-based routing: `export const route = defineRoute({ ... })`.
5
- */
6
- export function defineRoute(options) {
7
- return options;
8
- }
9
- function isRouteComponent(value) {
10
- if (typeof value === 'function')
11
- return true;
12
- // Check for known option keys to distinguish from component objects (e.g. React.lazy)
13
- if (typeof value === 'object' && value !== null) {
14
- return !('component' in value || 'searchSchema' in value || 'beforeEnter' in value);
15
- }
16
- return false;
17
- }
18
- /**
19
- * Declarative route definition builder.
20
- *
21
- * @example
22
- * ```ts
23
- * const routeTree = defineRoutes(route => [
24
- * route('/', { component: Home }),
25
- * route('/users', { component: UsersLayout }, [
26
- * route('/', { component: UsersList }),
27
- * route('/:userId', { component: UserDetail }),
28
- * ]),
29
- * ]);
30
- * ```
31
- */
32
- export function defineRoutes(builder) {
33
- function route(path, options, children) {
34
- // If options is a component directly (function or lazy), wrap it
35
- const opts = isRouteComponent(options)
36
- ? { component: options }
37
- : options;
38
- const isIndex = path === '/' || path === '';
39
- const hasChildren = children != null && children.length > 0;
40
- return {
41
- path,
42
- component: opts.component,
43
- searchSchema: opts.searchSchema,
44
- beforeEnter: opts.beforeEnter,
45
- children,
46
- isIndex: isIndex && !hasChildren,
47
- isLayout: hasChildren,
48
- };
49
- }
50
- const configs = builder(route);
51
- return buildRouteTree(configs);
52
- }
53
- //# sourceMappingURL=define-routes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"define-routes.js","sourceRoot":"","sources":["../../src/define/define-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAYrD;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,OAA2B;IACtD,OAAO,OAAO,CAAA;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,KAA8C;IACvE,IAAI,OAAO,KAAK,KAAK,UAAU;QAAE,OAAO,IAAI,CAAA;IAC5C,sFAAsF;IACtF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjD,OAAO,CAAC,CAAC,WAAW,IAAI,KAAK,IAAI,cAAc,IAAI,KAAK,IAAI,aAAa,IAAI,KAAK,CAAC,CAAA;IACpF,CAAC;IACD,OAAO,KAAK,CAAA;AACb,CAAC;AAkBD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,YAAY,CAAC,OAAuB;IACnD,SAAS,KAAK,CACb,IAAY,EACZ,OAAgD,EAChD,QAAwB;QAExB,iEAAiE;QACjE,MAAM,IAAI,GAA2B,gBAAgB,CAAC,OAAO,CAAC;YAC7D,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE;YACxB,CAAC,CAAC,OAAO,CAAA;QAEV,MAAM,OAAO,GAAG,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,EAAE,CAAA;QAC3C,MAAM,WAAW,GAAG,QAAQ,IAAI,IAAI,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;QAE3D,OAAO;YACN,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,QAAQ;YACR,OAAO,EAAE,OAAO,IAAI,CAAC,WAAW;YAChC,QAAQ,EAAE,WAAW;SACrB,CAAA;IACF,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;IAC9B,OAAO,cAAc,CAAC,OAAO,CAAC,CAAA;AAC/B,CAAC"}