@bleedingdev/modern-js-renderer-solid 0.0.0-stage → 3.9.3-ultramodern.10

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 (301) hide show
  1. package/dist/esm/actions.js +282 -0
  2. package/dist/esm/application-router.js +30 -0
  3. package/dist/esm/client.js +49 -0
  4. package/dist/esm/entry-application.js +60 -0
  5. package/dist/esm/entry-client.js +24 -0
  6. package/dist/esm/federation-context.js +25 -0
  7. package/dist/esm/federation-ssr.js +92 -0
  8. package/dist/esm/federation.js +87 -0
  9. package/dist/esm/i18n/I18nProvider.js +33 -0
  10. package/dist/esm/i18n/LocalizedLink.js +52 -0
  11. package/dist/esm/i18n/context.js +3 -0
  12. package/dist/esm/i18n/index.js +8 -0
  13. package/dist/esm/i18n/languageSync.js +50 -0
  14. package/dist/esm/i18n/types.js +0 -0
  15. package/dist/esm/i18n/useI18n.js +74 -0
  16. package/dist/esm/index.js +58 -0
  17. package/dist/esm/manifest.js +150 -0
  18. package/dist/esm/route-completion.js +151 -0
  19. package/dist/esm/route-data-error.js +108 -0
  20. package/dist/esm/router-binding/Asset.js +202 -0
  21. package/dist/esm/router-binding/CatchBoundary.js +94 -0
  22. package/dist/esm/router-binding/ClientOnly.js +26 -0
  23. package/dist/esm/router-binding/HeadContent.js +8 -0
  24. package/dist/esm/router-binding/LICENSE +21 -0
  25. package/dist/esm/router-binding/Match.js +319 -0
  26. package/dist/esm/router-binding/Matches.js +124 -0
  27. package/dist/esm/router-binding/PROVENANCE.json +94 -0
  28. package/dist/esm/router-binding/RouterProvider.js +52 -0
  29. package/dist/esm/router-binding/SafeFragment.js +5 -0
  30. package/dist/esm/router-binding/ScriptOnce.js +15 -0
  31. package/dist/esm/router-binding/Scripts.js +30 -0
  32. package/dist/esm/router-binding/ScrollRestoration.js +16 -0
  33. package/dist/esm/router-binding/Transitioner.js +109 -0
  34. package/dist/esm/router-binding/awaited.js +48 -0
  35. package/dist/esm/router-binding/fileRoute.js +83 -0
  36. package/dist/esm/router-binding/flightData.js +23 -0
  37. package/dist/esm/router-binding/headContentUtils.js +168 -0
  38. package/dist/esm/router-binding/history.js +0 -0
  39. package/dist/esm/router-binding/index.js +35 -0
  40. package/dist/esm/router-binding/lazyRouteComponent.js +30 -0
  41. package/dist/esm/router-binding/link.js +387 -0
  42. package/dist/esm/router-binding/matchContext.js +7 -0
  43. package/dist/esm/router-binding/nonRouteComponentContext.js +13 -0
  44. package/dist/esm/router-binding/not-found.js +35 -0
  45. package/dist/esm/router-binding/publicMatchData.js +447 -0
  46. package/dist/esm/router-binding/registryTransfer.js +223 -0
  47. package/dist/esm/router-binding/renderRouteNotFound.js +23 -0
  48. package/dist/esm/router-binding/route.js +143 -0
  49. package/dist/esm/router-binding/router.js +14 -0
  50. package/dist/esm/router-binding/routerContext.js +3 -0
  51. package/dist/esm/router-binding/routerOptions.js +0 -0
  52. package/dist/esm/router-binding/routerStores.js +50 -0
  53. package/dist/esm/router-binding/scroll-restoration.js +13 -0
  54. package/dist/esm/router-binding/typePrimitives.js +0 -0
  55. package/dist/esm/router-binding/useBlocker.js +152 -0
  56. package/dist/esm/router-binding/useCanGoBack.js +7 -0
  57. package/dist/esm/router-binding/useLoaderData.js +8 -0
  58. package/dist/esm/router-binding/useLoaderDeps.js +8 -0
  59. package/dist/esm/router-binding/useLocation.js +14 -0
  60. package/dist/esm/router-binding/useMatch.js +28 -0
  61. package/dist/esm/router-binding/useNavigate.js +25 -0
  62. package/dist/esm/router-binding/useParams.js +11 -0
  63. package/dist/esm/router-binding/useRouteContext.js +8 -0
  64. package/dist/esm/router-binding/useRouter.js +10 -0
  65. package/dist/esm/router-binding/useRouterState.js +19 -0
  66. package/dist/esm/router-binding/useSearch.js +11 -0
  67. package/dist/esm/router-binding/utils.js +23 -0
  68. package/dist/esm/router.js +187 -0
  69. package/dist/esm-node/actions.js +263 -0
  70. package/dist/esm-node/application-router.js +30 -0
  71. package/dist/esm-node/client.js +49 -0
  72. package/dist/esm-node/entry-application.js +110 -0
  73. package/dist/esm-node/entry-client.js +24 -0
  74. package/dist/esm-node/entry-server.js +47 -0
  75. package/dist/esm-node/federation-context.js +25 -0
  76. package/dist/esm-node/federation-ssr.js +92 -0
  77. package/dist/esm-node/federation.js +87 -0
  78. package/dist/esm-node/i18n/I18nProvider.js +42 -0
  79. package/dist/esm-node/i18n/LocalizedLink.js +88 -0
  80. package/dist/esm-node/i18n/context.js +3 -0
  81. package/dist/esm-node/i18n/index.js +8 -0
  82. package/dist/esm-node/i18n/languageSync.js +50 -0
  83. package/dist/esm-node/i18n/types.js +1 -0
  84. package/dist/esm-node/i18n/useI18n.js +74 -0
  85. package/dist/esm-node/index.js +58 -0
  86. package/dist/esm-node/manifest.js +150 -0
  87. package/dist/esm-node/native-promise-serialization.js +113 -0
  88. package/dist/esm-node/plugin/compiler.js +209 -0
  89. package/dist/esm-node/plugin/create.js +236 -0
  90. package/dist/esm-node/plugin/index.js +70 -0
  91. package/dist/esm-node/plugin/profile.js +51 -0
  92. package/dist/esm-node/route-completion.js +161 -0
  93. package/dist/esm-node/route-data-error.js +108 -0
  94. package/dist/esm-node/router-binding/Asset.js +172 -0
  95. package/dist/esm-node/router-binding/CatchBoundary.js +136 -0
  96. package/dist/esm-node/router-binding/ClientOnly.js +46 -0
  97. package/dist/esm-node/router-binding/HeadContent.js +8 -0
  98. package/dist/esm-node/router-binding/LICENSE +21 -0
  99. package/dist/esm-node/router-binding/Match.js +660 -0
  100. package/dist/esm-node/router-binding/Matches.js +161 -0
  101. package/dist/esm-node/router-binding/PROVENANCE.json +94 -0
  102. package/dist/esm-node/router-binding/RouterProvider.js +88 -0
  103. package/dist/esm-node/router-binding/SafeFragment.js +5 -0
  104. package/dist/esm-node/router-binding/ScriptOnce.js +16 -0
  105. package/dist/esm-node/router-binding/Scripts.js +49 -0
  106. package/dist/esm-node/router-binding/ScrollRestoration.js +16 -0
  107. package/dist/esm-node/router-binding/Transitioner.js +109 -0
  108. package/dist/esm-node/router-binding/awaited.js +75 -0
  109. package/dist/esm-node/router-binding/fileRoute.js +83 -0
  110. package/dist/esm-node/router-binding/flightData.js +23 -0
  111. package/dist/esm-node/router-binding/headContentUtils.js +168 -0
  112. package/dist/esm-node/router-binding/history.js +1 -0
  113. package/dist/esm-node/router-binding/index.js +35 -0
  114. package/dist/esm-node/router-binding/lazyRouteComponent.js +30 -0
  115. package/dist/esm-node/router-binding/link.js +399 -0
  116. package/dist/esm-node/router-binding/matchContext.js +7 -0
  117. package/dist/esm-node/router-binding/nonRouteComponentContext.js +22 -0
  118. package/dist/esm-node/router-binding/not-found.js +49 -0
  119. package/dist/esm-node/router-binding/publicMatchData.js +447 -0
  120. package/dist/esm-node/router-binding/registryTransfer.js +223 -0
  121. package/dist/esm-node/router-binding/renderRouteNotFound.js +22 -0
  122. package/dist/esm-node/router-binding/route.js +162 -0
  123. package/dist/esm-node/router-binding/router.js +14 -0
  124. package/dist/esm-node/router-binding/routerContext.js +3 -0
  125. package/dist/esm-node/router-binding/routerOptions.js +1 -0
  126. package/dist/esm-node/router-binding/routerStores.js +50 -0
  127. package/dist/esm-node/router-binding/scroll-restoration.js +12 -0
  128. package/dist/esm-node/router-binding/typePrimitives.js +1 -0
  129. package/dist/esm-node/router-binding/useBlocker.js +152 -0
  130. package/dist/esm-node/router-binding/useCanGoBack.js +7 -0
  131. package/dist/esm-node/router-binding/useLoaderData.js +8 -0
  132. package/dist/esm-node/router-binding/useLoaderDeps.js +8 -0
  133. package/dist/esm-node/router-binding/useLocation.js +14 -0
  134. package/dist/esm-node/router-binding/useMatch.js +28 -0
  135. package/dist/esm-node/router-binding/useNavigate.js +25 -0
  136. package/dist/esm-node/router-binding/useParams.js +11 -0
  137. package/dist/esm-node/router-binding/useRouteContext.js +8 -0
  138. package/dist/esm-node/router-binding/useRouter.js +10 -0
  139. package/dist/esm-node/router-binding/useRouterState.js +19 -0
  140. package/dist/esm-node/router-binding/useSearch.js +11 -0
  141. package/dist/esm-node/router-binding/utils.js +23 -0
  142. package/dist/esm-node/router.js +187 -0
  143. package/dist/esm-node/server.js +396 -0
  144. package/dist/types/actions.d.ts +45 -0
  145. package/dist/types/application-router.d.ts +5 -0
  146. package/dist/types/client.d.ts +23 -0
  147. package/dist/types/entry-application.d.ts +10 -0
  148. package/dist/types/entry-client.d.ts +5 -0
  149. package/dist/types/entry-server.d.ts +5 -0
  150. package/dist/types/federation-context.d.ts +16 -0
  151. package/dist/types/federation-ssr.d.ts +19 -0
  152. package/dist/types/federation.d.ts +30 -0
  153. package/dist/types/i18n/I18nProvider.d.ts +21 -0
  154. package/dist/types/i18n/LocalizedLink.d.ts +15 -0
  155. package/dist/types/i18n/context.d.ts +11 -0
  156. package/dist/types/i18n/index.d.ts +9 -0
  157. package/dist/types/i18n/languageSync.d.ts +31 -0
  158. package/dist/types/i18n/types.d.ts +33 -0
  159. package/dist/types/i18n/useI18n.d.ts +24 -0
  160. package/dist/types/index.d.ts +41 -0
  161. package/dist/types/manifest.d.ts +55 -0
  162. package/dist/types/native-promise-serialization.d.ts +9 -0
  163. package/dist/types/plugin/compiler.d.ts +6 -0
  164. package/dist/types/plugin/create.d.ts +21 -0
  165. package/dist/types/plugin/index.d.ts +3 -0
  166. package/dist/types/plugin/lazy-modules.d.cts +15 -0
  167. package/dist/types/plugin/preserve-import-loader.d.cts +3 -0
  168. package/dist/types/plugin/profile.d.ts +2 -0
  169. package/dist/types/plugin/solid-loader.d.cts +2 -0
  170. package/dist/types/plugin/svg-component-template.d.cts +6 -0
  171. package/dist/types/route-completion.d.ts +21 -0
  172. package/dist/types/route-data-error.d.ts +17 -0
  173. package/dist/types/router-binding/Asset.d.ts +3 -0
  174. package/dist/types/router-binding/CatchBoundary.d.ts +13 -0
  175. package/dist/types/router-binding/ClientOnly.d.ts +31 -0
  176. package/dist/types/router-binding/HeadContent.d.ts +13 -0
  177. package/dist/types/router-binding/Match.d.ts +6 -0
  178. package/dist/types/router-binding/Matches.d.ts +26 -0
  179. package/dist/types/router-binding/RouterProvider.d.ts +11 -0
  180. package/dist/types/router-binding/SafeFragment.d.ts +2 -0
  181. package/dist/types/router-binding/ScriptOnce.d.ts +6 -0
  182. package/dist/types/router-binding/Scripts.d.ts +2 -0
  183. package/dist/types/router-binding/ScrollRestoration.d.ts +14 -0
  184. package/dist/types/router-binding/Transitioner.d.ts +2 -0
  185. package/dist/types/router-binding/awaited.d.ts +11 -0
  186. package/dist/types/router-binding/fileRoute.d.ts +54 -0
  187. package/dist/types/router-binding/flightData.d.ts +38 -0
  188. package/dist/types/router-binding/headContentUtils.d.ts +15 -0
  189. package/dist/types/router-binding/history.d.ts +8 -0
  190. package/dist/types/router-binding/index.d.ts +46 -0
  191. package/dist/types/router-binding/lazyRouteComponent.d.ts +2 -0
  192. package/dist/types/router-binding/link.d.ts +43 -0
  193. package/dist/types/router-binding/matchContext.d.ts +7 -0
  194. package/dist/types/router-binding/nonRouteComponentContext.d.ts +5 -0
  195. package/dist/types/router-binding/not-found.d.ts +11 -0
  196. package/dist/types/router-binding/publicMatchData.d.ts +19 -0
  197. package/dist/types/router-binding/registryTransfer.d.ts +49 -0
  198. package/dist/types/router-binding/renderRouteNotFound.d.ts +11 -0
  199. package/dist/types/router-binding/route.d.ts +105 -0
  200. package/dist/types/router-binding/router.d.ts +70 -0
  201. package/dist/types/router-binding/routerContext.d.ts +3 -0
  202. package/dist/types/router-binding/routerOptions.d.ts +6 -0
  203. package/dist/types/router-binding/routerStores.d.ts +2 -0
  204. package/dist/types/router-binding/scroll-restoration.d.ts +2 -0
  205. package/dist/types/router-binding/typePrimitives.d.ts +10 -0
  206. package/dist/types/router-binding/useBlocker.d.ts +70 -0
  207. package/dist/types/router-binding/useCanGoBack.d.ts +2 -0
  208. package/dist/types/router-binding/useLoaderData.d.ts +8 -0
  209. package/dist/types/router-binding/useLoaderDeps.d.ts +8 -0
  210. package/dist/types/router-binding/useLocation.d.ts +7 -0
  211. package/dist/types/router-binding/useMatch.d.ts +10 -0
  212. package/dist/types/router-binding/useNavigate.d.ts +5 -0
  213. package/dist/types/router-binding/useParams.d.ts +9 -0
  214. package/dist/types/router-binding/useRouteContext.d.ts +4 -0
  215. package/dist/types/router-binding/useRouter.d.ts +4 -0
  216. package/dist/types/router-binding/useRouterState.d.ts +8 -0
  217. package/dist/types/router-binding/useSearch.d.ts +9 -0
  218. package/dist/types/router-binding/utils.d.ts +25 -0
  219. package/dist/types/router.d.ts +31 -0
  220. package/dist/types/server.d.ts +47 -0
  221. package/package.json +130 -4
  222. package/src/actions.tsx +441 -0
  223. package/src/application-router.tsx +47 -0
  224. package/src/client.ts +106 -0
  225. package/src/entry-application.tsx +73 -0
  226. package/src/entry-client.tsx +49 -0
  227. package/src/entry-server.tsx +85 -0
  228. package/src/federation-context.ts +47 -0
  229. package/src/federation-ssr.ts +136 -0
  230. package/src/federation.tsx +197 -0
  231. package/src/i18n/I18nProvider.tsx +54 -0
  232. package/src/i18n/LocalizedLink.tsx +83 -0
  233. package/src/i18n/context.ts +13 -0
  234. package/src/i18n/index.ts +31 -0
  235. package/src/i18n/languageSync.ts +113 -0
  236. package/src/i18n/types.ts +35 -0
  237. package/src/i18n/useI18n.ts +121 -0
  238. package/src/index.ts +41 -0
  239. package/src/manifest.ts +337 -0
  240. package/src/native-promise-serialization.ts +167 -0
  241. package/src/plugin/compiler.ts +320 -0
  242. package/src/plugin/create.ts +271 -0
  243. package/src/plugin/index.ts +69 -0
  244. package/src/plugin/lazy-modules.cjs +146 -0
  245. package/src/plugin/preserve-import-loader.cjs +46 -0
  246. package/src/plugin/profile.ts +42 -0
  247. package/src/plugin/solid-loader.cjs +83 -0
  248. package/src/plugin/svg-component-template.cjs +19 -0
  249. package/src/route-completion.tsx +226 -0
  250. package/src/route-data-error.ts +175 -0
  251. package/src/router-binding/Asset.tsx +284 -0
  252. package/src/router-binding/CatchBoundary.tsx +130 -0
  253. package/src/router-binding/ClientOnly.tsx +76 -0
  254. package/src/router-binding/HeadContent.tsx +23 -0
  255. package/src/router-binding/LICENSE +21 -0
  256. package/src/router-binding/Match.tsx +397 -0
  257. package/src/router-binding/Matches.tsx +242 -0
  258. package/src/router-binding/PROVENANCE.json +94 -0
  259. package/src/router-binding/RouterProvider.tsx +128 -0
  260. package/src/router-binding/SafeFragment.tsx +5 -0
  261. package/src/router-binding/ScriptOnce.tsx +23 -0
  262. package/src/router-binding/Scripts.tsx +44 -0
  263. package/src/router-binding/ScrollRestoration.tsx +49 -0
  264. package/src/router-binding/Transitioner.tsx +177 -0
  265. package/src/router-binding/awaited.tsx +71 -0
  266. package/src/router-binding/fileRoute.ts +268 -0
  267. package/src/router-binding/flightData.ts +90 -0
  268. package/src/router-binding/headContentUtils.tsx +292 -0
  269. package/src/router-binding/history.ts +9 -0
  270. package/src/router-binding/index.tsx +315 -0
  271. package/src/router-binding/lazyRouteComponent.tsx +70 -0
  272. package/src/router-binding/link.tsx +865 -0
  273. package/src/router-binding/matchContext.tsx +15 -0
  274. package/src/router-binding/nonRouteComponentContext.tsx +23 -0
  275. package/src/router-binding/not-found.tsx +65 -0
  276. package/src/router-binding/publicMatchData.ts +674 -0
  277. package/src/router-binding/registryTransfer.ts +400 -0
  278. package/src/router-binding/renderRouteNotFound.tsx +53 -0
  279. package/src/router-binding/route.tsx +665 -0
  280. package/src/router-binding/router.ts +123 -0
  281. package/src/router-binding/routerContext.tsx +6 -0
  282. package/src/router-binding/routerOptions.ts +26 -0
  283. package/src/router-binding/routerStores.ts +85 -0
  284. package/src/router-binding/scroll-restoration.tsx +15 -0
  285. package/src/router-binding/typePrimitives.ts +74 -0
  286. package/src/router-binding/useBlocker.tsx +359 -0
  287. package/src/router-binding/useCanGoBack.ts +9 -0
  288. package/src/router-binding/useLoaderData.tsx +51 -0
  289. package/src/router-binding/useLoaderDeps.tsx +46 -0
  290. package/src/router-binding/useLocation.tsx +43 -0
  291. package/src/router-binding/useMatch.tsx +111 -0
  292. package/src/router-binding/useNavigate.tsx +45 -0
  293. package/src/router-binding/useParams.tsx +70 -0
  294. package/src/router-binding/useRouteContext.ts +30 -0
  295. package/src/router-binding/useRouter.tsx +17 -0
  296. package/src/router-binding/useRouterState.tsx +50 -0
  297. package/src/router-binding/useSearch.tsx +70 -0
  298. package/src/router-binding/utils.ts +59 -0
  299. package/src/router.ts +376 -0
  300. package/src/server.ts +645 -0
  301. package/README.md +0 -3
package/src/router.ts ADDED
@@ -0,0 +1,376 @@
1
+ import type {
2
+ DataOutcome,
3
+ FileSystemRouteIR,
4
+ PublicDataOutcome,
5
+ } from '@modern-js/renderer-core/data';
6
+ import { DataProtocolError } from '@modern-js/renderer-core/data';
7
+ import type { FileSystemRouteOptions } from '@modern-js/renderer-core/router';
8
+ import {
9
+ loadFileSystemRoute,
10
+ type NativeLoaderMatch,
11
+ nativeRoutePath,
12
+ resolveRouteData as resolveNativeRouteData,
13
+ splitFileSystemRoutes,
14
+ untilAborted,
15
+ } from '@modern-js/renderer-core/router';
16
+ import {
17
+ createRouteCompletionScope,
18
+ registerRouteCompletionScope,
19
+ } from './route-completion';
20
+ import { restoreRouteDataError } from './route-data-error';
21
+ import type {
22
+ AnyRoute,
23
+ AnyRouter,
24
+ ErrorRouteComponent,
25
+ NotFoundRouteComponent,
26
+ RouteComponent,
27
+ } from './router-binding/index';
28
+ import {
29
+ createRootRoute,
30
+ createRoute,
31
+ isNotFound,
32
+ isRedirect,
33
+ notFound,
34
+ Outlet,
35
+ preparePublicContextData,
36
+ preparePublicLoaderData,
37
+ preparePublicMatchError,
38
+ redirect,
39
+ } from './router-binding/index';
40
+
41
+ export type {
42
+ DataHandler,
43
+ DataHandlerInput,
44
+ DataOutcome,
45
+ DecodedDataOutcome,
46
+ PublicDataOutcome,
47
+ } from '@modern-js/renderer-core/data';
48
+ export type {
49
+ FileSystemDataModule,
50
+ FileSystemRouteOptions,
51
+ } from '@modern-js/renderer-core/router';
52
+ export {
53
+ matchApplicationRouteIds,
54
+ matchApplicationRoutes,
55
+ RouteDataError,
56
+ selectApplicationDataRoute,
57
+ } from '@modern-js/renderer-core/router';
58
+ export type {
59
+ ActionFormProps,
60
+ RouteAction,
61
+ RouteActionOptions,
62
+ } from './actions';
63
+ export {
64
+ ActionForm,
65
+ createRouteAction,
66
+ RouteActionError,
67
+ useRouteAction,
68
+ } from './actions';
69
+ export { ApplicationRouter } from './application-router';
70
+ // Native TanStack owns matching, transitions, cancellation and route context.
71
+ // Keep this entry separate from other renderer adapters and their type programs.
72
+ export { createApplicationRouter } from './route-completion';
73
+ export * from './router-binding/index';
74
+
75
+ export interface FileSystemRouteModule {
76
+ component?: RouteComponent;
77
+ pendingComponent?: RouteComponent;
78
+ errorComponent?: ErrorRouteComponent;
79
+ notFoundComponent?: NotFoundRouteComponent;
80
+ head?: NonNullable<AnyRoute['options']['head']>;
81
+ /** Explicit returned context becomes immutable public native route context. */
82
+ beforeLoad?: NonNullable<AnyRoute['options']['beforeLoad']>;
83
+ /** Native synchronous context contributions are checked before composition. */
84
+ context?: NonNullable<AnyRoute['options']['context']>;
85
+ validateSearch?: (search: Record<string, unknown>) => Record<string, unknown>;
86
+ }
87
+
88
+ function isPublicRecord(value: unknown): value is Record<string, unknown> {
89
+ if (!value || typeof value !== 'object') return false;
90
+ const prototype = Object.getPrototypeOf(value);
91
+ return prototype === Object.prototype || prototype === null;
92
+ }
93
+
94
+ /** Resolve location through the native router before committing HTTP headers. */
95
+ export function resolveApplicationRedirect(
96
+ router: AnyRouter,
97
+ ): Response | undefined {
98
+ const result = router._serverResult;
99
+ const value = result?.type === 'redirect' ? result.redirect : undefined;
100
+ return isRedirect(value) ? router.resolveRedirect(value) : undefined;
101
+ }
102
+
103
+ /** The native server load resolves status independently from rendered UI. */
104
+ export function getApplicationStatus(router: AnyRouter): number {
105
+ const result = router._serverResult;
106
+ if (!result)
107
+ throw new Error(
108
+ 'Load the native Solid router before resolving HTTP status',
109
+ );
110
+ return result.type === 'render' ? result.status : result.redirect.status;
111
+ }
112
+
113
+ /** Throw outcomes into the native Solid redirect, not-found and error boundaries. */
114
+ export function resolveRouteData(
115
+ routeId: string,
116
+ outcome: DataOutcome | PublicDataOutcome,
117
+ project?: (value: unknown) => unknown,
118
+ ): unknown {
119
+ return resolveNativeRouteData(
120
+ { redirect, notFound },
121
+ routeId,
122
+ outcome,
123
+ project,
124
+ );
125
+ }
126
+
127
+ /** Project route structure into native factories without matching any URL. */
128
+ export function createFileSystemRouteTree<Context = unknown>(
129
+ routes: readonly FileSystemRouteIR[],
130
+ modules: Readonly<Record<string, FileSystemRouteModule>>,
131
+ options: FileSystemRouteOptions<Context> = {},
132
+ ): AnyRoute {
133
+ const { root: rootDescriptor, children } = splitFileSystemRoutes(routes);
134
+ const privateRoots =
135
+ options.context &&
136
+ (typeof options.context === 'object' ||
137
+ typeof options.context === 'function')
138
+ ? [options.context]
139
+ : [];
140
+ const completionScope = createRouteCompletionScope(
141
+ privateRoots,
142
+ options.session,
143
+ );
144
+ const moduleFields = new Set([
145
+ 'component',
146
+ 'pendingComponent',
147
+ 'errorComponent',
148
+ 'notFoundComponent',
149
+ 'head',
150
+ 'beforeLoad',
151
+ 'context',
152
+ 'validateSearch',
153
+ ]);
154
+
155
+ function projectModuleContext(
156
+ authored: unknown,
157
+ source: 'search',
158
+ ): Record<string, unknown>;
159
+ function projectModuleContext(
160
+ authored: unknown,
161
+ source: 'context' | 'beforeLoad',
162
+ ): unknown;
163
+ function projectModuleContext(
164
+ authored: unknown,
165
+ source: 'context' | 'search' | 'beforeLoad',
166
+ ): unknown {
167
+ try {
168
+ const value = preparePublicContextData(
169
+ authored,
170
+ options.session ?? completionScope.hydrationOwner,
171
+ [options.context],
172
+ );
173
+ if (source === 'context' && value !== undefined && !isPublicRecord(value))
174
+ throw new DataProtocolError(
175
+ 'Native Solid route context must return a synchronous public record',
176
+ );
177
+ if (source === 'search' && !isPublicRecord(value))
178
+ throw new DataProtocolError(
179
+ 'Native Solid search validation must return a public record',
180
+ );
181
+ return value;
182
+ } catch (error) {
183
+ options.session?.fail(error);
184
+ throw error;
185
+ }
186
+ }
187
+
188
+ function routeModuleOptions(id: string): FileSystemRouteModule {
189
+ const module = modules[id] ?? {};
190
+ const prototype = Object.getPrototypeOf(module);
191
+ if (prototype !== Object.prototype && prototype !== null)
192
+ throw new DataProtocolError(
193
+ 'Native Solid filesystem route modules require plain option records',
194
+ );
195
+ for (const key of Reflect.ownKeys(module)) {
196
+ const descriptor = Object.getOwnPropertyDescriptor(module, key)!;
197
+ if (
198
+ typeof key !== 'string' ||
199
+ !moduleFields.has(key) ||
200
+ descriptor.get ||
201
+ descriptor.set
202
+ )
203
+ throw new DataProtocolError(
204
+ 'Unsupported native Solid filesystem route option; use the declared public route module contract',
205
+ );
206
+ }
207
+ const beforeLoad = module.beforeLoad;
208
+ const validateSearch = module.validateSearch;
209
+ const context = module.context;
210
+ const contextOptions = context
211
+ ? {
212
+ context(...args: Parameters<typeof context>) {
213
+ return projectModuleContext(context(...args), 'context');
214
+ },
215
+ }
216
+ : {};
217
+ const searchOptions = validateSearch
218
+ ? {
219
+ validateSearch(search: Record<string, unknown>) {
220
+ return projectModuleContext(validateSearch(search), 'search');
221
+ },
222
+ }
223
+ : {};
224
+ if (!beforeLoad) return { ...module, ...searchOptions, ...contextOptions };
225
+ return {
226
+ ...module,
227
+ ...searchOptions,
228
+ ...contextOptions,
229
+ beforeLoad: async (...args: Parameters<typeof beforeLoad>) => {
230
+ // An authored hook that ignores the match abort must not hold a
231
+ // superseded navigation or a disconnected server request.
232
+ const signal = (
233
+ args[0] as { abortController?: AbortController } | undefined
234
+ )?.abortController?.signal;
235
+ let value: unknown;
236
+ try {
237
+ value = await (signal
238
+ ? untilAborted(beforeLoad(...args), signal)
239
+ : beforeLoad(...args));
240
+ } catch (error) {
241
+ if (signal?.aborted) throw error;
242
+ if (isRedirect(error)) throw error;
243
+ let projected: unknown;
244
+ try {
245
+ projected = isNotFound(error)
246
+ ? preparePublicContextData(error, options.session, [
247
+ options.context,
248
+ ])
249
+ : preparePublicMatchError(error, options.session, [
250
+ options.context,
251
+ ]);
252
+ } catch (invalid) {
253
+ options.session?.fail(invalid);
254
+ throw invalid;
255
+ }
256
+ if (isNotFound(projected)) throw projected;
257
+ if (
258
+ projected &&
259
+ typeof projected === 'object' &&
260
+ Object.getOwnPropertyDescriptor(projected, 'kind')?.value ===
261
+ 'ultramodern-route-data-error'
262
+ )
263
+ throw Object.freeze(restoreRouteDataError(projected));
264
+ const message =
265
+ projected && typeof projected === 'object'
266
+ ? Object.getOwnPropertyDescriptor(projected, 'message')?.value
267
+ : undefined;
268
+ const name =
269
+ projected && typeof projected === 'object'
270
+ ? Object.getOwnPropertyDescriptor(projected, 'name')?.value
271
+ : undefined;
272
+ const diagnostic = new Error(
273
+ typeof message === 'string' ? message : 'Unexpected Server Error',
274
+ );
275
+ diagnostic.name = typeof name === 'string' ? name : 'Error';
276
+ if (projected && typeof projected === 'object') {
277
+ for (const key of ['cause', 'stack']) {
278
+ const descriptor = Object.getOwnPropertyDescriptor(
279
+ projected,
280
+ key,
281
+ );
282
+ if (descriptor && !descriptor.get && !descriptor.set)
283
+ Object.defineProperty(diagnostic, key, {
284
+ value: descriptor.value,
285
+ configurable: true,
286
+ writable: true,
287
+ });
288
+ }
289
+ }
290
+ throw Object.freeze(diagnostic);
291
+ }
292
+ return projectModuleContext(value, 'beforeLoad');
293
+ },
294
+ };
295
+ }
296
+
297
+ function loaderOptions(route: FileSystemRouteIR) {
298
+ const loadRoute = options.loadRoute;
299
+ if (!(route.modules?.data || route.modules?.clientData) || !loadRoute) {
300
+ return {};
301
+ }
302
+ return {
303
+ loader: async (match: NativeLoaderMatch) => {
304
+ // The router's href omits its basepath; data URLs use the public path.
305
+ const { outcome, request, signal } = await loadFileSystemRoute(
306
+ route,
307
+ loadRoute,
308
+ options,
309
+ match,
310
+ );
311
+ options.onOutcome?.(route.id, outcome);
312
+ const generation = completionScope.begin(signal, () =>
313
+ match.abortController.abort(),
314
+ );
315
+ const owner = options.session ?? generation.owner;
316
+ const project = (value: unknown): unknown => {
317
+ try {
318
+ return preparePublicLoaderData(value, owner, [
319
+ options.context,
320
+ request,
321
+ ]);
322
+ } catch (error) {
323
+ owner.fail(error);
324
+ throw error;
325
+ }
326
+ };
327
+ const value = resolveRouteData(route.id, outcome, project);
328
+ generation.publish(
329
+ value,
330
+ 'completion' in outcome ? outcome.completion : undefined,
331
+ );
332
+ return value;
333
+ },
334
+ };
335
+ }
336
+
337
+ const root = createRootRoute({
338
+ ...routeModuleOptions(rootDescriptor?.id ?? ''),
339
+ component: completionScope.component(
340
+ modules[rootDescriptor?.id ?? '']?.component ?? Outlet,
341
+ ),
342
+ staticData: { ultramodernRouteId: rootDescriptor?.id },
343
+ ...(rootDescriptor ? loaderOptions(rootDescriptor) : {}),
344
+ });
345
+
346
+ // Like a React Router error element, error.tsx covers its whole subtree.
347
+ function bind(
348
+ route: FileSystemRouteIR,
349
+ parent: AnyRoute,
350
+ inheritedErrorComponent?: ErrorRouteComponent,
351
+ ): AnyRoute {
352
+ const errorComponent =
353
+ modules[route.id]?.errorComponent ?? inheritedErrorComponent;
354
+ const native = createRoute({
355
+ getParentRoute: () => parent,
356
+ ...nativeRoutePath(route),
357
+ ...routeModuleOptions(route.id),
358
+ ...(errorComponent ? { errorComponent } : {}),
359
+ component: completionScope.component(
360
+ modules[route.id]?.component ?? Outlet,
361
+ ),
362
+ staticData: { ultramodernRouteId: route.id },
363
+ ...loaderOptions(route),
364
+ });
365
+ return native.addChildren(
366
+ route.children.map(child => bind(child, native, errorComponent)),
367
+ );
368
+ }
369
+
370
+ const rootErrorComponent = modules[rootDescriptor?.id ?? '']?.errorComponent;
371
+ const tree = root.addChildren(
372
+ children.map(route => bind(route, root, rootErrorComponent)),
373
+ );
374
+ registerRouteCompletionScope(tree, completionScope);
375
+ return tree;
376
+ }