one 1.2.75 → 1.2.76

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 (143) hide show
  1. package/dist/cjs/cli/build.cjs +22 -6
  2. package/dist/cjs/cli/build.js +20 -3
  3. package/dist/cjs/cli/build.js.map +1 -1
  4. package/dist/cjs/cli/build.native.js +144 -93
  5. package/dist/cjs/cli/build.native.js.map +1 -1
  6. package/dist/cjs/cli/buildPage.cjs +43 -11
  7. package/dist/cjs/cli/buildPage.js +37 -5
  8. package/dist/cjs/cli/buildPage.js.map +1 -1
  9. package/dist/cjs/cli/buildPage.native.js +64 -14
  10. package/dist/cjs/cli/buildPage.native.js.map +1 -1
  11. package/dist/cjs/createApp.cjs +8 -4
  12. package/dist/cjs/createApp.js +8 -4
  13. package/dist/cjs/createApp.js.map +1 -1
  14. package/dist/cjs/index.cjs +6 -0
  15. package/dist/cjs/index.js +6 -1
  16. package/dist/cjs/index.js.map +1 -1
  17. package/dist/cjs/index.native.js +6 -0
  18. package/dist/cjs/index.native.js.map +1 -1
  19. package/dist/cjs/router/Route.js.map +1 -1
  20. package/dist/cjs/router/Route.native.js.map +1 -1
  21. package/dist/cjs/router/router.cjs +29 -4
  22. package/dist/cjs/router/router.js +19 -2
  23. package/dist/cjs/router/router.js.map +1 -1
  24. package/dist/cjs/router/router.native.js +8 -1
  25. package/dist/cjs/router/router.native.js.map +1 -1
  26. package/dist/cjs/server/oneServe.cjs +47 -8
  27. package/dist/cjs/server/oneServe.js +46 -9
  28. package/dist/cjs/server/oneServe.js.map +1 -1
  29. package/dist/cjs/server/oneServe.native.js +57 -10
  30. package/dist/cjs/server/oneServe.native.js.map +1 -1
  31. package/dist/cjs/useMatches.cjs +55 -0
  32. package/dist/cjs/useMatches.js +53 -0
  33. package/dist/cjs/useMatches.js.map +6 -0
  34. package/dist/cjs/useMatches.native.js +87 -0
  35. package/dist/cjs/useMatches.native.js.map +1 -0
  36. package/dist/cjs/useMatches.test.cjs +287 -0
  37. package/dist/cjs/useMatches.test.js +208 -0
  38. package/dist/cjs/useMatches.test.js.map +6 -0
  39. package/dist/cjs/useMatches.test.native.js +313 -0
  40. package/dist/cjs/useMatches.test.native.js.map +1 -0
  41. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.cjs +51 -10
  42. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.js +39 -12
  43. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.js.map +1 -1
  44. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.native.js +95 -52
  45. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.native.js.map +1 -1
  46. package/dist/esm/cli/build.js +20 -3
  47. package/dist/esm/cli/build.js.map +1 -1
  48. package/dist/esm/cli/build.mjs +22 -6
  49. package/dist/esm/cli/build.mjs.map +1 -1
  50. package/dist/esm/cli/build.native.js +144 -93
  51. package/dist/esm/cli/build.native.js.map +1 -1
  52. package/dist/esm/cli/buildPage.js +37 -5
  53. package/dist/esm/cli/buildPage.js.map +1 -1
  54. package/dist/esm/cli/buildPage.mjs +43 -11
  55. package/dist/esm/cli/buildPage.mjs.map +1 -1
  56. package/dist/esm/cli/buildPage.native.js +64 -14
  57. package/dist/esm/cli/buildPage.native.js.map +1 -1
  58. package/dist/esm/createApp.js +8 -3
  59. package/dist/esm/createApp.js.map +1 -1
  60. package/dist/esm/createApp.mjs +8 -4
  61. package/dist/esm/createApp.mjs.map +1 -1
  62. package/dist/esm/index.js +12 -1
  63. package/dist/esm/index.js.map +1 -1
  64. package/dist/esm/index.mjs +3 -2
  65. package/dist/esm/index.mjs.map +1 -1
  66. package/dist/esm/index.native.js +3 -2
  67. package/dist/esm/index.native.js.map +1 -1
  68. package/dist/esm/router/Route.js.map +1 -1
  69. package/dist/esm/router/Route.mjs.map +1 -1
  70. package/dist/esm/router/Route.native.js.map +1 -1
  71. package/dist/esm/router/router.js +19 -1
  72. package/dist/esm/router/router.js.map +1 -1
  73. package/dist/esm/router/router.mjs +28 -4
  74. package/dist/esm/router/router.mjs.map +1 -1
  75. package/dist/esm/router/router.native.js +7 -1
  76. package/dist/esm/router/router.native.js.map +1 -1
  77. package/dist/esm/server/oneServe.js +46 -9
  78. package/dist/esm/server/oneServe.js.map +1 -1
  79. package/dist/esm/server/oneServe.mjs +47 -8
  80. package/dist/esm/server/oneServe.mjs.map +1 -1
  81. package/dist/esm/server/oneServe.native.js +57 -10
  82. package/dist/esm/server/oneServe.native.js.map +1 -1
  83. package/dist/esm/useMatches.js +38 -0
  84. package/dist/esm/useMatches.js.map +6 -0
  85. package/dist/esm/useMatches.mjs +29 -0
  86. package/dist/esm/useMatches.mjs.map +1 -0
  87. package/dist/esm/useMatches.native.js +58 -0
  88. package/dist/esm/useMatches.native.js.map +1 -0
  89. package/dist/esm/useMatches.test.js +209 -0
  90. package/dist/esm/useMatches.test.js.map +6 -0
  91. package/dist/esm/useMatches.test.mjs +288 -0
  92. package/dist/esm/useMatches.test.mjs.map +1 -0
  93. package/dist/esm/useMatches.test.native.js +311 -0
  94. package/dist/esm/useMatches.test.native.js.map +1 -0
  95. package/dist/esm/vite/plugins/fileSystemRouterPlugin.js +39 -12
  96. package/dist/esm/vite/plugins/fileSystemRouterPlugin.js.map +1 -1
  97. package/dist/esm/vite/plugins/fileSystemRouterPlugin.mjs +51 -10
  98. package/dist/esm/vite/plugins/fileSystemRouterPlugin.mjs.map +1 -1
  99. package/dist/esm/vite/plugins/fileSystemRouterPlugin.native.js +95 -52
  100. package/dist/esm/vite/plugins/fileSystemRouterPlugin.native.js.map +1 -1
  101. package/package.json +9 -9
  102. package/src/cli/build.ts +36 -2
  103. package/src/cli/buildPage.ts +52 -2
  104. package/src/createApp.tsx +8 -0
  105. package/src/index.ts +8 -1
  106. package/src/router/Route.tsx +2 -0
  107. package/src/router/router.ts +57 -0
  108. package/src/server/oneServe.ts +89 -9
  109. package/src/types.ts +5 -0
  110. package/src/useMatches.test.ts +317 -0
  111. package/src/useMatches.ts +125 -0
  112. package/src/vite/plugins/fileSystemRouterPlugin.tsx +75 -19
  113. package/src/vite/types.ts +20 -0
  114. package/types/cli/build.d.ts.map +1 -1
  115. package/types/cli/buildPage.d.ts.map +1 -1
  116. package/types/createApp.d.ts.map +1 -1
  117. package/types/index.d.ts +2 -1
  118. package/types/index.d.ts.map +1 -1
  119. package/types/router/Route.d.ts +2 -0
  120. package/types/router/Route.d.ts.map +1 -1
  121. package/types/router/router.d.ts +6 -0
  122. package/types/router/router.d.ts.map +1 -1
  123. package/types/server/oneServe.d.ts.map +1 -1
  124. package/types/types.d.ts +5 -0
  125. package/types/types.d.ts.map +1 -1
  126. package/types/useMatches.d.ts +75 -0
  127. package/types/useMatches.d.ts.map +1 -0
  128. package/types/useMatches.test.d.ts +2 -0
  129. package/types/useMatches.test.d.ts.map +1 -0
  130. package/types/vite/plugins/fileSystemRouterPlugin.d.ts.map +1 -1
  131. package/types/vite/types.d.ts +19 -0
  132. package/types/vite/types.d.ts.map +1 -1
  133. package/dist/cjs/createRouteConfig.cjs +0 -28
  134. package/dist/cjs/createRouteConfig.js +0 -23
  135. package/dist/cjs/createRouteConfig.js.map +0 -6
  136. package/dist/cjs/createRouteConfig.native.js +0 -31
  137. package/dist/cjs/createRouteConfig.native.js.map +0 -1
  138. package/dist/esm/createRouteConfig.js +0 -7
  139. package/dist/esm/createRouteConfig.js.map +0 -6
  140. package/dist/esm/createRouteConfig.mjs +0 -5
  141. package/dist/esm/createRouteConfig.mjs.map +0 -1
  142. package/dist/esm/createRouteConfig.native.js +0 -5
  143. package/dist/esm/createRouteConfig.native.js.map +0 -1
@@ -0,0 +1,287 @@
1
+ var import_vitest = require("vitest"),
2
+ import_useMatches = require("./useMatches.cjs");
3
+ (0, import_vitest.describe)("useMatches", () => {
4
+ (0, import_vitest.describe)("setClientMatches", () => {
5
+ (0, import_vitest.it)("should update client matches without errors", () => {
6
+ const matches = [{
7
+ routeId: "/_layout",
8
+ pathname: "/",
9
+ params: {},
10
+ loaderData: {
11
+ title: "Root"
12
+ }
13
+ }, {
14
+ routeId: "/page",
15
+ pathname: "/page",
16
+ params: {},
17
+ loaderData: {
18
+ content: "Page content"
19
+ }
20
+ }];
21
+ (0, import_vitest.expect)(() => (0, import_useMatches.setClientMatches)(matches)).not.toThrow();
22
+ }), (0, import_vitest.it)("should accept empty matches array", () => {
23
+ (0, import_vitest.expect)(() => (0, import_useMatches.setClientMatches)([])).not.toThrow();
24
+ });
25
+ }), (0, import_vitest.describe)("type safety", () => {
26
+ (0, import_vitest.it)("should have correct RouteMatch type", () => {
27
+ const match = {
28
+ routeId: "test",
29
+ pathname: "/test",
30
+ params: {
31
+ id: "123"
32
+ },
33
+ loaderData: {
34
+ foo: "bar"
35
+ }
36
+ };
37
+ (0, import_vitest.expect)(match.routeId).toBe("test"), (0, import_vitest.expect)(match.pathname).toBe("/test"), (0, import_vitest.expect)(match.params.id).toBe("123"), (0, import_vitest.expect)(match.loaderData).toEqual({
38
+ foo: "bar"
39
+ });
40
+ }), (0, import_vitest.it)("should allow string[] params", () => {
41
+ (0, import_vitest.expect)({
42
+ routeId: "test",
43
+ pathname: "/test",
44
+ params: {
45
+ slugs: ["a", "b", "c"]
46
+ },
47
+ loaderData: null
48
+ }.params.slugs).toEqual(["a", "b", "c"]);
49
+ }), (0, import_vitest.it)("should allow undefined loaderData", () => {
50
+ (0, import_vitest.expect)({
51
+ routeId: "test",
52
+ pathname: "/test",
53
+ params: {},
54
+ loaderData: void 0
55
+ }.loaderData).toBeUndefined();
56
+ });
57
+ });
58
+ });
59
+ (0, import_vitest.describe)("RouteMatch ordering", () => {
60
+ (0, import_vitest.it)("matches should be ordered parent to child (root layout first)", () => {
61
+ const matches = [{
62
+ routeId: "/_layout",
63
+ pathname: "/",
64
+ params: {},
65
+ loaderData: {
66
+ level: "root"
67
+ }
68
+ }, {
69
+ routeId: "/docs/_layout",
70
+ pathname: "/docs",
71
+ params: {},
72
+ loaderData: {
73
+ level: "docs"
74
+ }
75
+ }, {
76
+ routeId: "/docs/intro",
77
+ pathname: "/docs/intro",
78
+ params: {},
79
+ loaderData: {
80
+ level: "page"
81
+ }
82
+ }];
83
+ (0, import_vitest.expect)(matches[0].routeId).toBe("/_layout"), (0, import_vitest.expect)(matches[0].loaderData.level).toBe("root"), (0, import_vitest.expect)(matches[1].routeId).toBe("/docs/_layout"), (0, import_vitest.expect)(matches[1].loaderData.level).toBe("docs"), (0, import_vitest.expect)(matches[2].routeId).toBe("/docs/intro"), (0, import_vitest.expect)(matches[2].loaderData.level).toBe("page");
84
+ }), (0, import_vitest.it)("last match should be the current page", () => {
85
+ const matches = [{
86
+ routeId: "/_layout",
87
+ pathname: "/",
88
+ params: {},
89
+ loaderData: {}
90
+ }, {
91
+ routeId: "/page",
92
+ pathname: "/page",
93
+ params: {
94
+ id: "123"
95
+ },
96
+ loaderData: {
97
+ title: "Page"
98
+ }
99
+ }],
100
+ pageMatch = matches[matches.length - 1];
101
+ (0, import_vitest.expect)(pageMatch.routeId).toBe("/page"), (0, import_vitest.expect)(pageMatch.loaderData.title).toBe("Page");
102
+ });
103
+ });
104
+ (0, import_vitest.describe)("setClientMatches reactivity", () => {
105
+ (0, import_vitest.it)("should notify listeners when matches change", () => {
106
+ let notifyCount = 0;
107
+ const listener = () => {
108
+ notifyCount++;
109
+ },
110
+ matches1 = [{
111
+ routeId: "/page1",
112
+ pathname: "/page1",
113
+ params: {},
114
+ loaderData: {}
115
+ }],
116
+ matches2 = [{
117
+ routeId: "/page2",
118
+ pathname: "/page2",
119
+ params: {},
120
+ loaderData: {}
121
+ }];
122
+ (0, import_useMatches.setClientMatches)(matches1), (0, import_useMatches.setClientMatches)(matches2), (0, import_vitest.expect)(notifyCount).toBe(0);
123
+ }), (0, import_vitest.it)("should handle multiple sequential updates", () => {
124
+ const matches1 = [{
125
+ routeId: "/a",
126
+ pathname: "/a",
127
+ params: {},
128
+ loaderData: {
129
+ n: 1
130
+ }
131
+ }],
132
+ matches2 = [{
133
+ routeId: "/b",
134
+ pathname: "/b",
135
+ params: {},
136
+ loaderData: {
137
+ n: 2
138
+ }
139
+ }],
140
+ matches3 = [{
141
+ routeId: "/c",
142
+ pathname: "/c",
143
+ params: {},
144
+ loaderData: {
145
+ n: 3
146
+ }
147
+ }];
148
+ (0, import_vitest.expect)(() => {
149
+ (0, import_useMatches.setClientMatches)(matches1), (0, import_useMatches.setClientMatches)(matches2), (0, import_useMatches.setClientMatches)(matches3);
150
+ }).not.toThrow();
151
+ });
152
+ });
153
+ (0, import_vitest.describe)("RouteMatch with dynamic params", () => {
154
+ (0, import_vitest.it)("should handle single dynamic param", () => {
155
+ (0, import_vitest.expect)({
156
+ routeId: "/users/[id]",
157
+ pathname: "/users/123",
158
+ params: {
159
+ id: "123"
160
+ },
161
+ loaderData: {
162
+ user: {
163
+ name: "John"
164
+ }
165
+ }
166
+ }.params.id).toBe("123");
167
+ }), (0, import_vitest.it)("should handle multiple dynamic params", () => {
168
+ const match = {
169
+ routeId: "/users/[userId]/posts/[postId]",
170
+ pathname: "/users/123/posts/456",
171
+ params: {
172
+ userId: "123",
173
+ postId: "456"
174
+ },
175
+ loaderData: {
176
+ post: {
177
+ title: "Hello"
178
+ }
179
+ }
180
+ };
181
+ (0, import_vitest.expect)(match.params.userId).toBe("123"), (0, import_vitest.expect)(match.params.postId).toBe("456");
182
+ }), (0, import_vitest.it)("should handle catch-all params", () => {
183
+ (0, import_vitest.expect)({
184
+ routeId: "/docs/[...slug]",
185
+ pathname: "/docs/getting-started/intro",
186
+ params: {
187
+ slug: ["getting-started", "intro"]
188
+ },
189
+ loaderData: {
190
+ doc: {
191
+ content: "Hello"
192
+ }
193
+ }
194
+ }.params.slug).toEqual(["getting-started", "intro"]);
195
+ });
196
+ });
197
+ (0, import_vitest.describe)("RouteMatch loaderData scenarios", () => {
198
+ (0, import_vitest.it)("should handle complex nested loaderData", () => {
199
+ const data = {
200
+ routeId: "/dashboard",
201
+ pathname: "/dashboard",
202
+ params: {},
203
+ loaderData: {
204
+ user: {
205
+ id: 1,
206
+ profile: {
207
+ name: "John",
208
+ settings: {
209
+ theme: "dark",
210
+ notifications: !0
211
+ }
212
+ }
213
+ },
214
+ posts: [{
215
+ id: 1,
216
+ title: "Post 1"
217
+ }, {
218
+ id: 2,
219
+ title: "Post 2"
220
+ }]
221
+ }
222
+ }.loaderData;
223
+ (0, import_vitest.expect)(data.user.profile.settings.theme).toBe("dark"), (0, import_vitest.expect)(data.posts).toHaveLength(2);
224
+ }), (0, import_vitest.it)("should handle null loaderData", () => {
225
+ (0, import_vitest.expect)({
226
+ routeId: "/empty",
227
+ pathname: "/empty",
228
+ params: {},
229
+ loaderData: null
230
+ }.loaderData).toBeNull();
231
+ }), (0, import_vitest.it)("should handle array loaderData", () => {
232
+ (0, import_vitest.expect)({
233
+ routeId: "/list",
234
+ pathname: "/list",
235
+ params: {},
236
+ loaderData: [1, 2, 3, 4, 5]
237
+ }.loaderData).toEqual([1, 2, 3, 4, 5]);
238
+ }), (0, import_vitest.it)("should handle primitive loaderData", () => {
239
+ (0, import_vitest.expect)({
240
+ routeId: "/count",
241
+ pathname: "/count",
242
+ params: {},
243
+ loaderData: 42
244
+ }.loaderData).toBe(42);
245
+ });
246
+ });
247
+ (0, import_vitest.describe)("finding matches", () => {
248
+ const createMatches = () => [{
249
+ routeId: "/_layout",
250
+ pathname: "/",
251
+ params: {},
252
+ loaderData: {
253
+ root: !0
254
+ }
255
+ }, {
256
+ routeId: "/docs/_layout",
257
+ pathname: "/docs",
258
+ params: {},
259
+ loaderData: {
260
+ navItems: ["intro", "guide"]
261
+ }
262
+ }, {
263
+ routeId: "/docs/[slug]",
264
+ pathname: "/docs/intro",
265
+ params: {
266
+ slug: "intro"
267
+ },
268
+ loaderData: {
269
+ title: "Introduction",
270
+ headings: ["h1", "h2"]
271
+ }
272
+ }];
273
+ (0, import_vitest.it)("should find match by exact routeId", () => {
274
+ const found = createMatches().find(m => m.routeId === "/docs/_layout");
275
+ (0, import_vitest.expect)(found).toBeDefined(), (0, import_vitest.expect)(found.loaderData.navItems).toEqual(["intro", "guide"]);
276
+ }), (0, import_vitest.it)("should find match by routeId pattern", () => {
277
+ const found = createMatches().find(m => m.routeId.includes("_layout"));
278
+ (0, import_vitest.expect)(found).toBeDefined(), (0, import_vitest.expect)(found.routeId).toBe("/_layout");
279
+ }), (0, import_vitest.it)("should get page match (last in array)", () => {
280
+ const matches = createMatches(),
281
+ pageMatch = matches[matches.length - 1];
282
+ (0, import_vitest.expect)(pageMatch.routeId).toBe("/docs/[slug]"), (0, import_vitest.expect)(pageMatch.loaderData.title).toBe("Introduction");
283
+ }), (0, import_vitest.it)("should get layout match for a page", () => {
284
+ const layoutMatch = createMatches().find(m => m.routeId.includes("/docs/") && m.routeId.includes("_layout"));
285
+ (0, import_vitest.expect)(layoutMatch).toBeDefined(), (0, import_vitest.expect)(layoutMatch.loaderData.navItems).toBeDefined();
286
+ });
287
+ });
@@ -0,0 +1,208 @@
1
+ var import_vitest = require("vitest"), import_useMatches = require("./useMatches");
2
+ (0, import_vitest.describe)("useMatches", () => {
3
+ (0, import_vitest.describe)("setClientMatches", () => {
4
+ (0, import_vitest.it)("should update client matches without errors", () => {
5
+ const matches = [
6
+ {
7
+ routeId: "/_layout",
8
+ pathname: "/",
9
+ params: {},
10
+ loaderData: { title: "Root" }
11
+ },
12
+ {
13
+ routeId: "/page",
14
+ pathname: "/page",
15
+ params: {},
16
+ loaderData: { content: "Page content" }
17
+ }
18
+ ];
19
+ (0, import_vitest.expect)(() => (0, import_useMatches.setClientMatches)(matches)).not.toThrow();
20
+ }), (0, import_vitest.it)("should accept empty matches array", () => {
21
+ (0, import_vitest.expect)(() => (0, import_useMatches.setClientMatches)([])).not.toThrow();
22
+ });
23
+ }), (0, import_vitest.describe)("type safety", () => {
24
+ (0, import_vitest.it)("should have correct RouteMatch type", () => {
25
+ const match = {
26
+ routeId: "test",
27
+ pathname: "/test",
28
+ params: { id: "123" },
29
+ loaderData: { foo: "bar" }
30
+ };
31
+ (0, import_vitest.expect)(match.routeId).toBe("test"), (0, import_vitest.expect)(match.pathname).toBe("/test"), (0, import_vitest.expect)(match.params.id).toBe("123"), (0, import_vitest.expect)(match.loaderData).toEqual({ foo: "bar" });
32
+ }), (0, import_vitest.it)("should allow string[] params", () => {
33
+ (0, import_vitest.expect)({
34
+ routeId: "test",
35
+ pathname: "/test",
36
+ params: { slugs: ["a", "b", "c"] },
37
+ loaderData: null
38
+ }.params.slugs).toEqual(["a", "b", "c"]);
39
+ }), (0, import_vitest.it)("should allow undefined loaderData", () => {
40
+ (0, import_vitest.expect)({
41
+ routeId: "test",
42
+ pathname: "/test",
43
+ params: {},
44
+ loaderData: void 0
45
+ }.loaderData).toBeUndefined();
46
+ });
47
+ });
48
+ });
49
+ (0, import_vitest.describe)("RouteMatch ordering", () => {
50
+ (0, import_vitest.it)("matches should be ordered parent to child (root layout first)", () => {
51
+ const matches = [
52
+ { routeId: "/_layout", pathname: "/", params: {}, loaderData: { level: "root" } },
53
+ {
54
+ routeId: "/docs/_layout",
55
+ pathname: "/docs",
56
+ params: {},
57
+ loaderData: { level: "docs" }
58
+ },
59
+ {
60
+ routeId: "/docs/intro",
61
+ pathname: "/docs/intro",
62
+ params: {},
63
+ loaderData: { level: "page" }
64
+ }
65
+ ];
66
+ (0, import_vitest.expect)(matches[0].routeId).toBe("/_layout"), (0, import_vitest.expect)(matches[0].loaderData.level).toBe("root"), (0, import_vitest.expect)(matches[1].routeId).toBe("/docs/_layout"), (0, import_vitest.expect)(matches[1].loaderData.level).toBe("docs"), (0, import_vitest.expect)(matches[2].routeId).toBe("/docs/intro"), (0, import_vitest.expect)(matches[2].loaderData.level).toBe("page");
67
+ }), (0, import_vitest.it)("last match should be the current page", () => {
68
+ const matches = [
69
+ { routeId: "/_layout", pathname: "/", params: {}, loaderData: {} },
70
+ {
71
+ routeId: "/page",
72
+ pathname: "/page",
73
+ params: { id: "123" },
74
+ loaderData: { title: "Page" }
75
+ }
76
+ ], pageMatch = matches[matches.length - 1];
77
+ (0, import_vitest.expect)(pageMatch.routeId).toBe("/page"), (0, import_vitest.expect)(pageMatch.loaderData.title).toBe("Page");
78
+ });
79
+ });
80
+ (0, import_vitest.describe)("setClientMatches reactivity", () => {
81
+ (0, import_vitest.it)("should notify listeners when matches change", () => {
82
+ let notifyCount = 0;
83
+ const listener = () => {
84
+ notifyCount++;
85
+ }, matches1 = [
86
+ { routeId: "/page1", pathname: "/page1", params: {}, loaderData: {} }
87
+ ], matches2 = [
88
+ { routeId: "/page2", pathname: "/page2", params: {}, loaderData: {} }
89
+ ];
90
+ (0, import_useMatches.setClientMatches)(matches1), (0, import_useMatches.setClientMatches)(matches2), (0, import_vitest.expect)(notifyCount).toBe(0);
91
+ }), (0, import_vitest.it)("should handle multiple sequential updates", () => {
92
+ const matches1 = [
93
+ { routeId: "/a", pathname: "/a", params: {}, loaderData: { n: 1 } }
94
+ ], matches2 = [
95
+ { routeId: "/b", pathname: "/b", params: {}, loaderData: { n: 2 } }
96
+ ], matches3 = [
97
+ { routeId: "/c", pathname: "/c", params: {}, loaderData: { n: 3 } }
98
+ ];
99
+ (0, import_vitest.expect)(() => {
100
+ (0, import_useMatches.setClientMatches)(matches1), (0, import_useMatches.setClientMatches)(matches2), (0, import_useMatches.setClientMatches)(matches3);
101
+ }).not.toThrow();
102
+ });
103
+ });
104
+ (0, import_vitest.describe)("RouteMatch with dynamic params", () => {
105
+ (0, import_vitest.it)("should handle single dynamic param", () => {
106
+ (0, import_vitest.expect)({
107
+ routeId: "/users/[id]",
108
+ pathname: "/users/123",
109
+ params: { id: "123" },
110
+ loaderData: { user: { name: "John" } }
111
+ }.params.id).toBe("123");
112
+ }), (0, import_vitest.it)("should handle multiple dynamic params", () => {
113
+ const match = {
114
+ routeId: "/users/[userId]/posts/[postId]",
115
+ pathname: "/users/123/posts/456",
116
+ params: { userId: "123", postId: "456" },
117
+ loaderData: { post: { title: "Hello" } }
118
+ };
119
+ (0, import_vitest.expect)(match.params.userId).toBe("123"), (0, import_vitest.expect)(match.params.postId).toBe("456");
120
+ }), (0, import_vitest.it)("should handle catch-all params", () => {
121
+ (0, import_vitest.expect)({
122
+ routeId: "/docs/[...slug]",
123
+ pathname: "/docs/getting-started/intro",
124
+ params: { slug: ["getting-started", "intro"] },
125
+ loaderData: { doc: { content: "Hello" } }
126
+ }.params.slug).toEqual(["getting-started", "intro"]);
127
+ });
128
+ });
129
+ (0, import_vitest.describe)("RouteMatch loaderData scenarios", () => {
130
+ (0, import_vitest.it)("should handle complex nested loaderData", () => {
131
+ const data = {
132
+ routeId: "/dashboard",
133
+ pathname: "/dashboard",
134
+ params: {},
135
+ loaderData: {
136
+ user: {
137
+ id: 1,
138
+ profile: {
139
+ name: "John",
140
+ settings: {
141
+ theme: "dark",
142
+ notifications: !0
143
+ }
144
+ }
145
+ },
146
+ posts: [
147
+ { id: 1, title: "Post 1" },
148
+ { id: 2, title: "Post 2" }
149
+ ]
150
+ }
151
+ }.loaderData;
152
+ (0, import_vitest.expect)(data.user.profile.settings.theme).toBe("dark"), (0, import_vitest.expect)(data.posts).toHaveLength(2);
153
+ }), (0, import_vitest.it)("should handle null loaderData", () => {
154
+ (0, import_vitest.expect)({
155
+ routeId: "/empty",
156
+ pathname: "/empty",
157
+ params: {},
158
+ loaderData: null
159
+ }.loaderData).toBeNull();
160
+ }), (0, import_vitest.it)("should handle array loaderData", () => {
161
+ (0, import_vitest.expect)({
162
+ routeId: "/list",
163
+ pathname: "/list",
164
+ params: {},
165
+ loaderData: [1, 2, 3, 4, 5]
166
+ }.loaderData).toEqual([1, 2, 3, 4, 5]);
167
+ }), (0, import_vitest.it)("should handle primitive loaderData", () => {
168
+ (0, import_vitest.expect)({
169
+ routeId: "/count",
170
+ pathname: "/count",
171
+ params: {},
172
+ loaderData: 42
173
+ }.loaderData).toBe(42);
174
+ });
175
+ });
176
+ (0, import_vitest.describe)("finding matches", () => {
177
+ const createMatches = () => [
178
+ { routeId: "/_layout", pathname: "/", params: {}, loaderData: { root: !0 } },
179
+ {
180
+ routeId: "/docs/_layout",
181
+ pathname: "/docs",
182
+ params: {},
183
+ loaderData: { navItems: ["intro", "guide"] }
184
+ },
185
+ {
186
+ routeId: "/docs/[slug]",
187
+ pathname: "/docs/intro",
188
+ params: { slug: "intro" },
189
+ loaderData: { title: "Introduction", headings: ["h1", "h2"] }
190
+ }
191
+ ];
192
+ (0, import_vitest.it)("should find match by exact routeId", () => {
193
+ const found = createMatches().find((m) => m.routeId === "/docs/_layout");
194
+ (0, import_vitest.expect)(found).toBeDefined(), (0, import_vitest.expect)(found.loaderData.navItems).toEqual(["intro", "guide"]);
195
+ }), (0, import_vitest.it)("should find match by routeId pattern", () => {
196
+ const found = createMatches().find((m) => m.routeId.includes("_layout"));
197
+ (0, import_vitest.expect)(found).toBeDefined(), (0, import_vitest.expect)(found.routeId).toBe("/_layout");
198
+ }), (0, import_vitest.it)("should get page match (last in array)", () => {
199
+ const matches = createMatches(), pageMatch = matches[matches.length - 1];
200
+ (0, import_vitest.expect)(pageMatch.routeId).toBe("/docs/[slug]"), (0, import_vitest.expect)(pageMatch.loaderData.title).toBe("Introduction");
201
+ }), (0, import_vitest.it)("should get layout match for a page", () => {
202
+ const layoutMatch = createMatches().find(
203
+ (m) => m.routeId.includes("/docs/") && m.routeId.includes("_layout")
204
+ );
205
+ (0, import_vitest.expect)(layoutMatch).toBeDefined(), (0, import_vitest.expect)(layoutMatch.loaderData.navItems).toBeDefined();
206
+ });
207
+ });
208
+ //# sourceMappingURL=useMatches.test.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/useMatches.test.ts"],
4
+ "mappings": "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",
5
+ "names": []
6
+ }