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

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 (297) hide show
  1. package/dist/esm/actions.js +283 -0
  2. package/dist/esm/application-router.js +25 -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 +23 -0
  6. package/dist/esm/federation-context.js +25 -0
  7. package/dist/esm/federation-ssr.js +84 -0
  8. package/dist/esm/federation.js +83 -0
  9. package/dist/esm/i18n/I18nProvider.js +33 -0
  10. package/dist/esm/i18n/LocalizedLink.js +74 -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 +150 -0
  19. package/dist/esm/route-data-error.js +108 -0
  20. package/dist/esm/router-binding/Asset.js +201 -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 +117 -0
  27. package/dist/esm/router-binding/PROVENANCE.json +94 -0
  28. package/dist/esm/router-binding/RouterProvider.js +51 -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 +103 -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 +162 -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 +389 -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 +210 -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 +13 -0
  50. package/dist/esm/router-binding/routerContext.js +3 -0
  51. package/dist/esm/router-binding/routerStores.js +50 -0
  52. package/dist/esm/router-binding/scroll-restoration.js +13 -0
  53. package/dist/esm/router-binding/typePrimitives.js +0 -0
  54. package/dist/esm/router-binding/useBlocker.js +152 -0
  55. package/dist/esm/router-binding/useCanGoBack.js +7 -0
  56. package/dist/esm/router-binding/useLoaderData.js +9 -0
  57. package/dist/esm/router-binding/useLoaderDeps.js +8 -0
  58. package/dist/esm/router-binding/useLocation.js +14 -0
  59. package/dist/esm/router-binding/useMatch.js +28 -0
  60. package/dist/esm/router-binding/useNavigate.js +19 -0
  61. package/dist/esm/router-binding/useParams.js +13 -0
  62. package/dist/esm/router-binding/useRouteContext.js +8 -0
  63. package/dist/esm/router-binding/useRouter.js +10 -0
  64. package/dist/esm/router-binding/useRouterState.js +19 -0
  65. package/dist/esm/router-binding/useSearch.js +13 -0
  66. package/dist/esm/router-binding/utils.js +23 -0
  67. package/dist/esm/router.js +187 -0
  68. package/dist/esm-node/actions.js +263 -0
  69. package/dist/esm-node/application-router.js +25 -0
  70. package/dist/esm-node/client.js +49 -0
  71. package/dist/esm-node/entry-application.js +110 -0
  72. package/dist/esm-node/entry-client.js +23 -0
  73. package/dist/esm-node/entry-server.js +47 -0
  74. package/dist/esm-node/federation-context.js +25 -0
  75. package/dist/esm-node/federation-ssr.js +84 -0
  76. package/dist/esm-node/federation.js +83 -0
  77. package/dist/esm-node/i18n/I18nProvider.js +42 -0
  78. package/dist/esm-node/i18n/LocalizedLink.js +142 -0
  79. package/dist/esm-node/i18n/context.js +3 -0
  80. package/dist/esm-node/i18n/index.js +8 -0
  81. package/dist/esm-node/i18n/languageSync.js +50 -0
  82. package/dist/esm-node/i18n/types.js +1 -0
  83. package/dist/esm-node/i18n/useI18n.js +74 -0
  84. package/dist/esm-node/index.js +58 -0
  85. package/dist/esm-node/manifest.js +150 -0
  86. package/dist/esm-node/native-promise-serialization.js +113 -0
  87. package/dist/esm-node/plugin/compiler.js +209 -0
  88. package/dist/esm-node/plugin/create.js +235 -0
  89. package/dist/esm-node/plugin/index.js +73 -0
  90. package/dist/esm-node/plugin/profile.js +52 -0
  91. package/dist/esm-node/route-completion.js +160 -0
  92. package/dist/esm-node/route-data-error.js +108 -0
  93. package/dist/esm-node/router-binding/Asset.js +171 -0
  94. package/dist/esm-node/router-binding/CatchBoundary.js +136 -0
  95. package/dist/esm-node/router-binding/ClientOnly.js +46 -0
  96. package/dist/esm-node/router-binding/HeadContent.js +8 -0
  97. package/dist/esm-node/router-binding/LICENSE +21 -0
  98. package/dist/esm-node/router-binding/Match.js +660 -0
  99. package/dist/esm-node/router-binding/Matches.js +161 -0
  100. package/dist/esm-node/router-binding/PROVENANCE.json +94 -0
  101. package/dist/esm-node/router-binding/RouterProvider.js +87 -0
  102. package/dist/esm-node/router-binding/SafeFragment.js +5 -0
  103. package/dist/esm-node/router-binding/ScriptOnce.js +16 -0
  104. package/dist/esm-node/router-binding/Scripts.js +49 -0
  105. package/dist/esm-node/router-binding/ScrollRestoration.js +16 -0
  106. package/dist/esm-node/router-binding/Transitioner.js +103 -0
  107. package/dist/esm-node/router-binding/awaited.js +75 -0
  108. package/dist/esm-node/router-binding/fileRoute.js +83 -0
  109. package/dist/esm-node/router-binding/flightData.js +23 -0
  110. package/dist/esm-node/router-binding/headContentUtils.js +162 -0
  111. package/dist/esm-node/router-binding/history.js +1 -0
  112. package/dist/esm-node/router-binding/index.js +35 -0
  113. package/dist/esm-node/router-binding/lazyRouteComponent.js +30 -0
  114. package/dist/esm-node/router-binding/link.js +399 -0
  115. package/dist/esm-node/router-binding/matchContext.js +7 -0
  116. package/dist/esm-node/router-binding/nonRouteComponentContext.js +22 -0
  117. package/dist/esm-node/router-binding/not-found.js +49 -0
  118. package/dist/esm-node/router-binding/publicMatchData.js +447 -0
  119. package/dist/esm-node/router-binding/registryTransfer.js +210 -0
  120. package/dist/esm-node/router-binding/renderRouteNotFound.js +22 -0
  121. package/dist/esm-node/router-binding/route.js +162 -0
  122. package/dist/esm-node/router-binding/router.js +13 -0
  123. package/dist/esm-node/router-binding/routerContext.js +3 -0
  124. package/dist/esm-node/router-binding/routerStores.js +50 -0
  125. package/dist/esm-node/router-binding/scroll-restoration.js +12 -0
  126. package/dist/esm-node/router-binding/typePrimitives.js +1 -0
  127. package/dist/esm-node/router-binding/useBlocker.js +152 -0
  128. package/dist/esm-node/router-binding/useCanGoBack.js +7 -0
  129. package/dist/esm-node/router-binding/useLoaderData.js +9 -0
  130. package/dist/esm-node/router-binding/useLoaderDeps.js +8 -0
  131. package/dist/esm-node/router-binding/useLocation.js +14 -0
  132. package/dist/esm-node/router-binding/useMatch.js +28 -0
  133. package/dist/esm-node/router-binding/useNavigate.js +19 -0
  134. package/dist/esm-node/router-binding/useParams.js +13 -0
  135. package/dist/esm-node/router-binding/useRouteContext.js +8 -0
  136. package/dist/esm-node/router-binding/useRouter.js +10 -0
  137. package/dist/esm-node/router-binding/useRouterState.js +19 -0
  138. package/dist/esm-node/router-binding/useSearch.js +13 -0
  139. package/dist/esm-node/router-binding/utils.js +23 -0
  140. package/dist/esm-node/router.js +187 -0
  141. package/dist/esm-node/server.js +396 -0
  142. package/dist/types/actions.d.ts +45 -0
  143. package/dist/types/application-router.d.ts +5 -0
  144. package/dist/types/client.d.ts +23 -0
  145. package/dist/types/entry-application.d.ts +10 -0
  146. package/dist/types/entry-client.d.ts +5 -0
  147. package/dist/types/entry-server.d.ts +5 -0
  148. package/dist/types/federation-context.d.ts +16 -0
  149. package/dist/types/federation-ssr.d.ts +21 -0
  150. package/dist/types/federation.d.ts +30 -0
  151. package/dist/types/i18n/I18nProvider.d.ts +21 -0
  152. package/dist/types/i18n/LocalizedLink.d.ts +43 -0
  153. package/dist/types/i18n/context.d.ts +11 -0
  154. package/dist/types/i18n/index.d.ts +9 -0
  155. package/dist/types/i18n/languageSync.d.ts +31 -0
  156. package/dist/types/i18n/types.d.ts +33 -0
  157. package/dist/types/i18n/useI18n.d.ts +24 -0
  158. package/dist/types/index.d.ts +41 -0
  159. package/dist/types/manifest.d.ts +55 -0
  160. package/dist/types/native-promise-serialization.d.ts +9 -0
  161. package/dist/types/plugin/compiler.d.ts +6 -0
  162. package/dist/types/plugin/create.d.ts +21 -0
  163. package/dist/types/plugin/index.d.ts +3 -0
  164. package/dist/types/plugin/lazy-modules.d.cts +15 -0
  165. package/dist/types/plugin/preserve-import-loader.d.cts +3 -0
  166. package/dist/types/plugin/profile.d.ts +2 -0
  167. package/dist/types/plugin/solid-loader.d.cts +2 -0
  168. package/dist/types/plugin/svg-component-template.d.cts +6 -0
  169. package/dist/types/route-completion.d.ts +21 -0
  170. package/dist/types/route-data-error.d.ts +17 -0
  171. package/dist/types/router-binding/Asset.d.ts +3 -0
  172. package/dist/types/router-binding/CatchBoundary.d.ts +13 -0
  173. package/dist/types/router-binding/ClientOnly.d.ts +31 -0
  174. package/dist/types/router-binding/HeadContent.d.ts +13 -0
  175. package/dist/types/router-binding/Match.d.ts +6 -0
  176. package/dist/types/router-binding/Matches.d.ts +26 -0
  177. package/dist/types/router-binding/RouterProvider.d.ts +10 -0
  178. package/dist/types/router-binding/SafeFragment.d.ts +2 -0
  179. package/dist/types/router-binding/ScriptOnce.d.ts +6 -0
  180. package/dist/types/router-binding/Scripts.d.ts +2 -0
  181. package/dist/types/router-binding/ScrollRestoration.d.ts +14 -0
  182. package/dist/types/router-binding/Transitioner.d.ts +2 -0
  183. package/dist/types/router-binding/awaited.d.ts +11 -0
  184. package/dist/types/router-binding/fileRoute.d.ts +54 -0
  185. package/dist/types/router-binding/flightData.d.ts +38 -0
  186. package/dist/types/router-binding/headContentUtils.d.ts +15 -0
  187. package/dist/types/router-binding/history.d.ts +8 -0
  188. package/dist/types/router-binding/index.d.ts +45 -0
  189. package/dist/types/router-binding/lazyRouteComponent.d.ts +2 -0
  190. package/dist/types/router-binding/link.d.ts +43 -0
  191. package/dist/types/router-binding/matchContext.d.ts +7 -0
  192. package/dist/types/router-binding/nonRouteComponentContext.d.ts +5 -0
  193. package/dist/types/router-binding/not-found.d.ts +11 -0
  194. package/dist/types/router-binding/publicMatchData.d.ts +19 -0
  195. package/dist/types/router-binding/registryTransfer.d.ts +47 -0
  196. package/dist/types/router-binding/renderRouteNotFound.d.ts +11 -0
  197. package/dist/types/router-binding/route.d.ts +105 -0
  198. package/dist/types/router-binding/router.d.ts +70 -0
  199. package/dist/types/router-binding/routerContext.d.ts +3 -0
  200. package/dist/types/router-binding/routerStores.d.ts +2 -0
  201. package/dist/types/router-binding/scroll-restoration.d.ts +2 -0
  202. package/dist/types/router-binding/typePrimitives.d.ts +10 -0
  203. package/dist/types/router-binding/useBlocker.d.ts +70 -0
  204. package/dist/types/router-binding/useCanGoBack.d.ts +2 -0
  205. package/dist/types/router-binding/useLoaderData.d.ts +8 -0
  206. package/dist/types/router-binding/useLoaderDeps.d.ts +8 -0
  207. package/dist/types/router-binding/useLocation.d.ts +7 -0
  208. package/dist/types/router-binding/useMatch.d.ts +10 -0
  209. package/dist/types/router-binding/useNavigate.d.ts +5 -0
  210. package/dist/types/router-binding/useParams.d.ts +9 -0
  211. package/dist/types/router-binding/useRouteContext.d.ts +4 -0
  212. package/dist/types/router-binding/useRouter.d.ts +4 -0
  213. package/dist/types/router-binding/useRouterState.d.ts +8 -0
  214. package/dist/types/router-binding/useSearch.d.ts +9 -0
  215. package/dist/types/router-binding/utils.d.ts +25 -0
  216. package/dist/types/router.d.ts +31 -0
  217. package/dist/types/server.d.ts +47 -0
  218. package/package.json +123 -4
  219. package/src/actions.tsx +437 -0
  220. package/src/application-router.tsx +41 -0
  221. package/src/client.ts +106 -0
  222. package/src/entry-application.tsx +73 -0
  223. package/src/entry-client.tsx +48 -0
  224. package/src/entry-server.tsx +85 -0
  225. package/src/federation-context.ts +47 -0
  226. package/src/federation-ssr.ts +117 -0
  227. package/src/federation.tsx +193 -0
  228. package/src/i18n/I18nProvider.tsx +54 -0
  229. package/src/i18n/LocalizedLink.tsx +122 -0
  230. package/src/i18n/context.ts +13 -0
  231. package/src/i18n/index.ts +35 -0
  232. package/src/i18n/languageSync.ts +113 -0
  233. package/src/i18n/types.ts +35 -0
  234. package/src/i18n/useI18n.ts +121 -0
  235. package/src/index.ts +41 -0
  236. package/src/manifest.ts +337 -0
  237. package/src/native-promise-serialization.ts +167 -0
  238. package/src/plugin/compiler.ts +320 -0
  239. package/src/plugin/create.ts +270 -0
  240. package/src/plugin/index.ts +72 -0
  241. package/src/plugin/lazy-modules.cjs +146 -0
  242. package/src/plugin/preserve-import-loader.cjs +46 -0
  243. package/src/plugin/profile.ts +42 -0
  244. package/src/plugin/solid-loader.cjs +83 -0
  245. package/src/plugin/svg-component-template.cjs +19 -0
  246. package/src/route-completion.tsx +222 -0
  247. package/src/route-data-error.ts +175 -0
  248. package/src/router-binding/Asset.tsx +283 -0
  249. package/src/router-binding/CatchBoundary.tsx +130 -0
  250. package/src/router-binding/ClientOnly.tsx +76 -0
  251. package/src/router-binding/HeadContent.tsx +23 -0
  252. package/src/router-binding/LICENSE +21 -0
  253. package/src/router-binding/Match.tsx +397 -0
  254. package/src/router-binding/Matches.tsx +242 -0
  255. package/src/router-binding/PROVENANCE.json +94 -0
  256. package/src/router-binding/RouterProvider.tsx +129 -0
  257. package/src/router-binding/SafeFragment.tsx +5 -0
  258. package/src/router-binding/ScriptOnce.tsx +23 -0
  259. package/src/router-binding/Scripts.tsx +44 -0
  260. package/src/router-binding/ScrollRestoration.tsx +49 -0
  261. package/src/router-binding/Transitioner.tsx +172 -0
  262. package/src/router-binding/awaited.tsx +71 -0
  263. package/src/router-binding/fileRoute.ts +268 -0
  264. package/src/router-binding/flightData.ts +90 -0
  265. package/src/router-binding/headContentUtils.tsx +290 -0
  266. package/src/router-binding/history.ts +9 -0
  267. package/src/router-binding/index.tsx +318 -0
  268. package/src/router-binding/lazyRouteComponent.tsx +70 -0
  269. package/src/router-binding/link.tsx +865 -0
  270. package/src/router-binding/matchContext.tsx +15 -0
  271. package/src/router-binding/nonRouteComponentContext.tsx +23 -0
  272. package/src/router-binding/not-found.tsx +65 -0
  273. package/src/router-binding/publicMatchData.ts +674 -0
  274. package/src/router-binding/registryTransfer.ts +383 -0
  275. package/src/router-binding/renderRouteNotFound.tsx +53 -0
  276. package/src/router-binding/route.tsx +665 -0
  277. package/src/router-binding/router.ts +121 -0
  278. package/src/router-binding/routerContext.tsx +6 -0
  279. package/src/router-binding/routerStores.ts +85 -0
  280. package/src/router-binding/scroll-restoration.tsx +15 -0
  281. package/src/router-binding/typePrimitives.ts +74 -0
  282. package/src/router-binding/useBlocker.tsx +359 -0
  283. package/src/router-binding/useCanGoBack.ts +9 -0
  284. package/src/router-binding/useLoaderData.tsx +50 -0
  285. package/src/router-binding/useLoaderDeps.tsx +46 -0
  286. package/src/router-binding/useLocation.tsx +43 -0
  287. package/src/router-binding/useMatch.tsx +111 -0
  288. package/src/router-binding/useNavigate.tsx +43 -0
  289. package/src/router-binding/useParams.tsx +72 -0
  290. package/src/router-binding/useRouteContext.ts +30 -0
  291. package/src/router-binding/useRouter.tsx +17 -0
  292. package/src/router-binding/useRouterState.tsx +50 -0
  293. package/src/router-binding/useSearch.tsx +72 -0
  294. package/src/router-binding/utils.ts +59 -0
  295. package/src/router.ts +376 -0
  296. package/src/server.ts +645 -0
  297. package/README.md +0 -3
@@ -0,0 +1,235 @@
1
+ function generateSolidAppSources(options) {
2
+ const entryName = options.entryName ?? 'main';
3
+ if ('main' !== entryName) throw new Error('The Solid app template supports the main entry only. The create-time workspace writer places src/modern-app-env.d.ts, src/routes/index.css and the package manifest at the app root regardless of entryName, so it cannot yet route a second entry into src/<entryName>/. Add that entry by hand after generation (mirror src/routes under src/<entryName>/routes) until an admitted native multi-entry create template exists; the native entry generator itself already supports arbitrary entry names.');
4
+ if (!options.appId.trim() || !options.title.trim()) throw new Error('The Solid app template requires an appId and title.');
5
+ if ('boolean' != typeof options.capabilities.ssr || 'boolean' != typeof options.capabilities.federation) throw new Error('The Solid app template requires admitted capabilities.');
6
+ const title = JSON.stringify(options.title);
7
+ const aboutTitle = JSON.stringify(`${options.title} - About`);
8
+ const appId = JSON.stringify(options.appId);
9
+ return {
10
+ sourceExtension: '.tsx',
11
+ jsxImportSource: '@solidjs/web',
12
+ artifacts: [
13
+ {
14
+ path: 'src/routes/layout.tsx',
15
+ content: `import type { JSX } from '@solidjs/web';
16
+ import { Link, Outlet } from '@modern-js/renderer-solid/router';
17
+ import Stable from '../components/Stable';
18
+ import './index.css';
19
+
20
+ const appTitle = ${title};
21
+
22
+ export default function Layout(): JSX.Element {
23
+ return (
24
+ <main data-testid="native-layout">
25
+ <header>
26
+ <p>{appTitle}</p>
27
+ <nav aria-label="Application">
28
+ <Link to="/">Home</Link>
29
+ <Link to="/about">About</Link>
30
+ ${options.capabilities.federation ? ' <Link to="/remotes">Federated applications</Link>\n' : ''}
31
+ </nav>
32
+ </header>
33
+ <Stable />
34
+ <Outlet />
35
+ </main>
36
+ );
37
+ }
38
+ `
39
+ },
40
+ {
41
+ path: 'src/routes/page.tsx',
42
+ content: `import type { JSX } from '@solidjs/web';
43
+ import {
44
+ ActionForm,
45
+ Link,
46
+ useLoaderData,
47
+ useRouteAction,
48
+ } from '@modern-js/renderer-solid/router';
49
+ import Counter from '../components/Counter';
50
+
51
+ const appId = ${appId};
52
+ const appTitle = ${title};
53
+
54
+ export default function HomePage(): JSX.Element {
55
+ const data = useLoaderData({ strict: false });
56
+ const action = useRouteAction();
57
+ return (
58
+ <section data-app-id={appId} data-testid="native-route" data-renderer="solid">
59
+ <h1>{appTitle}</h1>
60
+ <Counter />
61
+ <pre data-testid="native-loader-value">{JSON.stringify(data())}</pre>
62
+ <ActionForm action={action}>
63
+ <label>
64
+ Name <input name="name" />
65
+ </label>
66
+ <button type="submit" disabled={action.pending()}>
67
+ Save
68
+ </button>
69
+ <button type="submit" name="intent" value="redirect">
70
+ Save and redirect
71
+ </button>
72
+ </ActionForm>
73
+ <pre data-testid="native-action-value">
74
+ {JSON.stringify(action.outcome())}
75
+ </pre>
76
+ <output data-testid="native-action-error">
77
+ {action.error()?.message}
78
+ </output>
79
+ <Link to="/about">Open native about route</Link>
80
+ </section>
81
+ );
82
+ }
83
+ `
84
+ },
85
+ {
86
+ path: 'src/routes/page.head.ts',
87
+ content: `import type { FileSystemRouteModule } from '@modern-js/renderer-solid/router';
88
+
89
+ export const head: NonNullable<FileSystemRouteModule['head']> = () => ({
90
+ meta: [
91
+ { title: ${title} },
92
+ { name: 'description', content: 'Built with the native Solid renderer' },
93
+ ],
94
+ });
95
+ `
96
+ },
97
+ {
98
+ path: 'src/routes/about/page.tsx',
99
+ content: `import type { JSX } from '@solidjs/web';
100
+ import { Link } from '@modern-js/renderer-solid/router';
101
+
102
+ export default function AboutPage(): JSX.Element {
103
+ return (
104
+ <section data-testid="native-about">
105
+ <h1>Native Solid navigation</h1>
106
+ <Link to="/">Home</Link>
107
+ </section>
108
+ );
109
+ }
110
+ `
111
+ },
112
+ {
113
+ path: 'src/routes/about/page.head.ts',
114
+ content: `import type { FileSystemRouteModule } from '@modern-js/renderer-solid/router';
115
+
116
+ export const head: NonNullable<FileSystemRouteModule['head']> = () => ({
117
+ meta: [
118
+ { title: ${aboutTitle} },
119
+ { name: 'description', content: 'Built with the native Solid renderer' },
120
+ ],
121
+ });
122
+ `
123
+ },
124
+ {
125
+ path: 'src/routes/page.data.ts',
126
+ content: `import type { DataHandlerInput } from '@modern-js/renderer-core/data';
127
+
128
+ export function loader({ request }: DataHandlerInput) {
129
+ const url = new URL(request.url);
130
+ if (url.searchParams.get('case') === 'not-found')
131
+ throw new Response('Native route not found', { status: 404 });
132
+ if (url.searchParams.get('case') === 'error')
133
+ throw new Error('Native loader failure');
134
+ if (url.searchParams.get('case') === 'redirect')
135
+ return new Response(null, { status: 302, headers: { location: '/about' } });
136
+ return {
137
+ message: 'Native loader value',
138
+ privateValue: request.headers.get('x-conformance-private'),
139
+ };
140
+ }
141
+
142
+ export async function action({ request }: DataHandlerInput) {
143
+ const form = await request.formData();
144
+ const name = form.get('name');
145
+ if (typeof name !== 'string' || !name.trim())
146
+ return Response.json(
147
+ { fieldErrors: { name: 'Name required' } },
148
+ { status: 422 },
149
+ );
150
+ if (form.get('intent') === 'redirect')
151
+ return new Response(null, {
152
+ status: 303,
153
+ headers: {
154
+ location: '/about',
155
+ 'set-cookie': 'conformance-saved=1; Path=/; SameSite=Lax',
156
+ },
157
+ });
158
+ if (form.get('intent') === 'throw') throw new Error('Native action failure');
159
+ return {
160
+ saved: name,
161
+ privateValue: request.headers.get('x-conformance-private'),
162
+ };
163
+ }
164
+ `
165
+ },
166
+ {
167
+ path: 'src/routes/error.tsx',
168
+ content: `import type { ErrorRouteComponent } from '@modern-js/renderer-solid/router';
169
+
170
+ const ErrorBoundary: ErrorRouteComponent = props => (
171
+ <section data-testid="native-error">
172
+ <h1>Something went wrong</h1>
173
+ <output>
174
+ {props.error instanceof Error ? props.error.message : String(props.error)}
175
+ </output>
176
+ </section>
177
+ );
178
+
179
+ export default ErrorBoundary;
180
+ `
181
+ },
182
+ {
183
+ path: 'src/routes/not-found.tsx',
184
+ content: `import type { NotFoundRouteComponent } from '@modern-js/renderer-solid/router';
185
+
186
+ const NotFound: NotFoundRouteComponent = () => (
187
+ <section data-testid="native-not-found">
188
+ <h1>Page not found</h1>
189
+ </section>
190
+ );
191
+
192
+ export default NotFound;
193
+ `
194
+ },
195
+ {
196
+ path: 'src/components/Counter.tsx',
197
+ content: `import type { JSX } from '@solidjs/web';
198
+ import { createSignal } from 'solid-js';
199
+
200
+ export default function Counter(): JSX.Element {
201
+ const [count, setCount] = createSignal(0);
202
+ return (
203
+ <section data-testid="native-edited-component">
204
+ <span data-testid="native-hmr-marker">Counter before native edit</span>
205
+ <button type="button" onClick={() => setCount(count() + 1)}>
206
+ Increment
207
+ </button>
208
+ <output data-testid="native-count">{count()}</output>
209
+ </section>
210
+ );
211
+ }
212
+ `
213
+ },
214
+ {
215
+ path: 'src/components/Stable.tsx',
216
+ content: `import type { JSX } from '@solidjs/web';
217
+ import { createSignal } from 'solid-js';
218
+
219
+ export default function Stable(): JSX.Element {
220
+ const [count, setCount] = createSignal(0);
221
+ return (
222
+ <section data-testid="native-unaffected-component">
223
+ <button type="button" onClick={() => setCount(count() + 1)}>
224
+ Increment stable state
225
+ </button>
226
+ <output data-testid="native-unaffected-count">{count()}</output>
227
+ </section>
228
+ );
229
+ }
230
+ `
231
+ }
232
+ ]
233
+ };
234
+ }
235
+ export { generateSolidAppSources };
@@ -0,0 +1,73 @@
1
+ import node_path from "node:path";
2
+ import { defineRendererAdapter, nativeRendererDependencies } from "@modern-js/renderer-core/adapter";
3
+ import { compilerArtifacts } from "../manifest.js";
4
+ import { pluginSolidRenderer, pluginSourceDirectory } from "./compiler.js";
5
+ import { generateSolidAppSources } from "./create.js";
6
+ import { solidProfile } from "./profile.js";
7
+ const rendererAdapter = defineRendererAdapter({
8
+ name: 'solid',
9
+ kind: 'native',
10
+ profile: solidProfile,
11
+ routerFrameworks: [
12
+ 'solid'
13
+ ],
14
+ runtime: {
15
+ package: 'solid-js',
16
+ bootstrap: '@modern-js/renderer-solid',
17
+ entryClient: '@modern-js/renderer-solid/entry-client',
18
+ entryServer: '@modern-js/renderer-solid/entry-server',
19
+ router: '@modern-js/renderer-solid/router',
20
+ i18n: '@modern-js/renderer-solid/i18n',
21
+ manifest: '@modern-js/renderer-solid/manifest'
22
+ },
23
+ federation: {
24
+ library: 'module',
25
+ ssr: true,
26
+ shared: [
27
+ 'solid-js',
28
+ '@solidjs/web',
29
+ '@solidjs/signals',
30
+ 'seroval',
31
+ 'seroval-plugins',
32
+ '@modern-js/renderer-solid',
33
+ '@modern-js/renderer-solid/client',
34
+ '@modern-js/renderer-solid/router',
35
+ '@modern-js/renderer-solid/federation',
36
+ '@modern-js/renderer-core',
37
+ '@modern-js/renderer-core/',
38
+ '@tanstack/router-core',
39
+ '@tanstack/history'
40
+ ]
41
+ },
42
+ worker: {
43
+ nativeDocuments: true,
44
+ rsc: false
45
+ },
46
+ lazyStyles: 'renderer',
47
+ svgComponentTemplate: ()=>node_path.join(pluginSourceDirectory(), 'svg-component-template.cjs'),
48
+ compiler: pluginSolidRenderer,
49
+ artifacts: compilerArtifacts,
50
+ create: {
51
+ templates: {
52
+ federation: true,
53
+ workers: false
54
+ },
55
+ dependencies: (profile)=>({
56
+ frameworkDependencies: [
57
+ '@modern-js/renderer-core',
58
+ '@modern-js/renderer-solid'
59
+ ],
60
+ dependencies: {
61
+ ...nativeRendererDependencies(profile),
62
+ 'solid-js': profile.hydration.version,
63
+ '@solidjs/signals': profile.hydration.version
64
+ },
65
+ devDependencies: {
66
+ [profile.compiler.name]: profile.compiler.version,
67
+ '@solidjs/babel-plugin': profile.compiler.version
68
+ }
69
+ }),
70
+ generateAppSources: generateSolidAppSources
71
+ }
72
+ });
73
+ export { rendererAdapter };
@@ -0,0 +1,52 @@
1
+ const solidProfile = {
2
+ renderer: 'solid',
3
+ status: 'preview',
4
+ protocolVersion: 1,
5
+ minimumNode: '26.10.0',
6
+ hmr: {
7
+ editedBoundary: 'may-reset',
8
+ unaffectedComponents: 'preserved',
9
+ document: 'preserved',
10
+ roots: 'single',
11
+ cleanup: 'exactly-once'
12
+ },
13
+ compiler: {
14
+ name: '@solidjs/compiler',
15
+ version: '2.0.0-rc.13'
16
+ },
17
+ hydration: {
18
+ name: '@solidjs/web',
19
+ version: '2.0.0-rc.13'
20
+ },
21
+ router: {
22
+ name: '@modern-js/renderer-solid',
23
+ version: '3.8.3',
24
+ coreName: '@tanstack/router-core',
25
+ coreVersion: '1.171.34'
26
+ },
27
+ sourceExtensions: [
28
+ '.tsx',
29
+ '.ts',
30
+ '.jsx',
31
+ '.js'
32
+ ],
33
+ jsxImportSource: '@solidjs/web',
34
+ dependencies: {
35
+ 'solid-js': '2.0.0-rc.13',
36
+ '@solidjs/web': '2.0.0-rc.13',
37
+ '@solidjs/signals': '2.0.0-rc.13',
38
+ '@solidjs/compiler': '2.0.0-rc.13',
39
+ '@modern-js/renderer-solid': '3.8.3',
40
+ seroval: '1.6.8',
41
+ 'seroval-plugins': '1.6.8'
42
+ },
43
+ capabilities: {
44
+ worker: true,
45
+ moduleFederation: true,
46
+ rsc: false,
47
+ ssg: true,
48
+ i18n: true,
49
+ svgComponent: true
50
+ }
51
+ };
52
+ export { solidProfile };
@@ -0,0 +1,160 @@
1
+ import { DataProtocolError } from "@modern-js/renderer-core/data";
2
+ import { Dynamic } from "@solidjs/web";
3
+ import { createEffect, createMemo, createSignal, onCleanup } from "solid-js";
4
+ import { createRouter, preparePublicContextData, useMatch } from "./router-binding/index.js";
5
+ import { registerPublicRouteDataOwner } from "./router-binding/registryTransfer.js";
6
+ var _m$ = Symbol();
7
+ var _d$ = {
8
+ get () {
9
+ const ready = this[_m$];
10
+ return ready();
11
+ },
12
+ enumerable: true,
13
+ configurable: true
14
+ };
15
+ function _P$(_p) {
16
+ this[_m$] = _p;
17
+ Object.defineProperty(this, "component", _d$);
18
+ }
19
+ _P$.prototype = Object.prototype;
20
+ const routeScopes = new WeakMap();
21
+ const routerScopes = new WeakMap();
22
+ function assertManagedRouteData(route) {
23
+ if (!route) return;
24
+ if (route.options.loader || route.options.beforeLoad || route.options.context) throw new DataProtocolError("Custom native Solid loader/beforeLoad/context routes are unsupported by the immutable public-data profile; use createFileSystemRouteTree");
25
+ for (const child of route.children ?? [])assertManagedRouteData(child);
26
+ }
27
+ function registerRouteCompletionScope(route, scope) {
28
+ routeScopes.set(route, scope);
29
+ }
30
+ const createApplicationRouter = (options)=>{
31
+ const scope = options.routeTree ? routeScopes.get(options.routeTree) : void 0;
32
+ if (!scope) assertManagedRouteData(options.routeTree);
33
+ if (scope && options.routeTree) registerPublicRouteDataOwner(options.routeTree, scope.hydrationOwner, scope.privateRoots);
34
+ const context = preparePublicContextData(options.context, scope?.hydrationOwner);
35
+ if (void 0 !== context && (!context || "object" != typeof context || Array.isArray(context))) throw new DataProtocolError("The native Solid router context must be a public record");
36
+ const router = createRouter({
37
+ ...options,
38
+ context
39
+ });
40
+ if (scope) {
41
+ scope.attach(router);
42
+ routerScopes.set(router, scope);
43
+ }
44
+ return router;
45
+ };
46
+ function ownApplicationRouteData(router) {
47
+ const scope = routerScopes.get(router);
48
+ if (scope) onCleanup(()=>scope.dispose());
49
+ else assertManagedRouteData(router.options.routeTree);
50
+ }
51
+ function createRouteCompletionScope(privateRoots = [], session) {
52
+ const records = new WeakMap();
53
+ const pending = new Set();
54
+ const hydration = new AbortController();
55
+ let router;
56
+ function begin(signal, cancel) {
57
+ if (!router) throw new Error("Use createApplicationRouter to own progressive Solid route data");
58
+ const [failure, setFailure] = createSignal();
59
+ const native = router;
60
+ let value;
61
+ let leases = 0;
62
+ let settled = false;
63
+ let failed = false;
64
+ const stop = ()=>{
65
+ if (!settled) {
66
+ pending.delete(stop);
67
+ if (value && "object" == typeof value) native.clearCache({
68
+ filter: (match)=>match.loaderData === value
69
+ });
70
+ cancel();
71
+ }
72
+ };
73
+ const fail = (reason)=>{
74
+ if (failed) return;
75
+ failed = true;
76
+ settled = true;
77
+ pending.delete(stop);
78
+ if (value && "object" == typeof value) native.clearCache({
79
+ filter: (match)=>match.loaderData === value
80
+ });
81
+ setFailure({
82
+ reason
83
+ });
84
+ cancel();
85
+ };
86
+ const record = {
87
+ failure,
88
+ acquire () {
89
+ leases++;
90
+ let released = false;
91
+ return ()=>{
92
+ if (released) return;
93
+ released = true;
94
+ if (0 === --leases && !native.state.matches.some((match)=>match.loaderData === value)) stop();
95
+ };
96
+ }
97
+ };
98
+ return {
99
+ owner: {
100
+ signal,
101
+ fail
102
+ },
103
+ publish (publicValue, completion) {
104
+ value = publicValue;
105
+ const deferred = value && "object" == typeof value ? Reflect.ownKeys(value).flatMap((key)=>{
106
+ const entry = Object.getOwnPropertyDescriptor(value, key);
107
+ return entry && !entry.get && entry.value instanceof Promise ? [
108
+ entry.value
109
+ ] : [];
110
+ }) : [];
111
+ if (!completion && 0 === deferred.length) return;
112
+ if (value && "object" == typeof value) {
113
+ records.set(value, record);
114
+ pending.add(stop);
115
+ } else if (completion) throw new DataProtocolError("Progressive route data requires its native value object");
116
+ if (completion) completion.then(()=>{
117
+ settled = true;
118
+ pending.delete(stop);
119
+ }, fail);
120
+ else Promise.allSettled(deferred).then(()=>{
121
+ settled = true;
122
+ pending.delete(stop);
123
+ });
124
+ }
125
+ };
126
+ }
127
+ return {
128
+ privateRoots,
129
+ hydrationOwner: session ?? {
130
+ signal: hydration.signal,
131
+ fail: (error)=>hydration.abort(error)
132
+ },
133
+ attach (native) {
134
+ if (router && router !== native) throw new Error("A Solid data scope already owns its native router");
135
+ router = native;
136
+ },
137
+ begin,
138
+ component (component) {
139
+ return function() {
140
+ const record = useMatch({
141
+ strict: false,
142
+ select: (match)=>match.loaderData && "object" == typeof match.loaderData ? records.get(match.loaderData) : void 0
143
+ });
144
+ createEffect(record, (current)=>current?.acquire());
145
+ const ready = createMemo(()=>{
146
+ const failure = record()?.failure();
147
+ if (failure) throw failure.reason;
148
+ return component;
149
+ });
150
+ return Dynamic(new _P$(ready));
151
+ };
152
+ },
153
+ dispose () {
154
+ hydration.abort();
155
+ for (const stop of pending)stop();
156
+ pending.clear();
157
+ }
158
+ };
159
+ }
160
+ export { createApplicationRouter, createRouteCompletionScope, ownApplicationRouteData, registerRouteCompletionScope };
@@ -0,0 +1,108 @@
1
+ import { DataProtocolError, assertPublicData } from "@modern-js/renderer-core/data";
2
+ import { RouteDataError } from "@modern-js/renderer-core/router";
3
+ function invalid(message) {
4
+ throw new DataProtocolError(message);
5
+ }
6
+ function publicFields(value, required, optional = [], allowStackAccessor = false) {
7
+ const descriptors = Object.getOwnPropertyDescriptors(value);
8
+ for (const key of Reflect.ownKeys(descriptors)){
9
+ if ("string" != typeof key || !required.includes(key) && !optional.includes(key)) invalid("Route data errors must not contain undeclared fields");
10
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
11
+ if (descriptor.get || descriptor.set) {
12
+ if (allowStackAccessor && "stack" === key) continue;
13
+ invalid("Route data errors must not contain accessors");
14
+ }
15
+ }
16
+ for (const key of required)if (!Object.hasOwn(descriptors, key)) invalid("Route data errors are missing a declared field");
17
+ return descriptors;
18
+ }
19
+ function validateFields(routeId, status, name, message) {
20
+ if ("string" != typeof routeId || 0 === routeId.length) invalid("Route data errors require a nonempty route identifier");
21
+ if ("number" != typeof status || !Number.isInteger(status) || status < 200 || status > 599) invalid("Route data errors require a valid public HTTP status");
22
+ if ("string" != typeof name || "string" != typeof message) invalid("Route data errors require public name and message strings");
23
+ return {
24
+ routeId,
25
+ status,
26
+ name,
27
+ message
28
+ };
29
+ }
30
+ function projectRouteDataError(error, production = true) {
31
+ if (!error || "object" != typeof error || Object.getPrototypeOf(error) !== RouteDataError.prototype) invalid("Only the exact RouteDataError class has a route error projection");
32
+ const descriptors = publicFields(error, [
33
+ "routeId",
34
+ "status",
35
+ "data",
36
+ "name",
37
+ "message"
38
+ ], [
39
+ "stack"
40
+ ], true);
41
+ const routeId = descriptors.routeId.value;
42
+ const status = descriptors.status.value;
43
+ const name = descriptors.name.value;
44
+ const message = descriptors.message.value;
45
+ const fields = validateFields(routeId, status, name, message);
46
+ const snapshot = {
47
+ kind: "ultramodern-route-data-error",
48
+ version: 1,
49
+ routeId: fields.routeId,
50
+ status: fields.status,
51
+ data: descriptors.data.value,
52
+ error: {
53
+ name: fields.name,
54
+ message: fields.message
55
+ }
56
+ };
57
+ const stack = descriptors.stack;
58
+ if (stack && !stack.get && !stack.set) {
59
+ if ("string" != typeof stack.value) invalid("Route data error stacks must be strings");
60
+ if (!production) snapshot.error.stack = stack.value;
61
+ }
62
+ assertPublicData(snapshot);
63
+ return snapshot;
64
+ }
65
+ function plainRecord(value) {
66
+ if (!value || "object" != typeof value) invalid("Malformed route data error snapshot");
67
+ const prototype = Object.getPrototypeOf(value);
68
+ if (prototype !== Object.prototype && null !== prototype) invalid("Route data error snapshots require plain records");
69
+ return value;
70
+ }
71
+ function restoreRouteDataError(snapshot) {
72
+ const descriptors = publicFields(plainRecord(snapshot), [
73
+ "kind",
74
+ "version",
75
+ "routeId",
76
+ "status",
77
+ "data",
78
+ "error"
79
+ ]);
80
+ if ("ultramodern-route-data-error" !== descriptors.kind.value || 1 !== descriptors.version.value) invalid("Unsupported route data error snapshot");
81
+ const error = publicFields(plainRecord(descriptors.error.value), [
82
+ "name",
83
+ "message"
84
+ ], [
85
+ "stack"
86
+ ]);
87
+ const routeId = descriptors.routeId.value;
88
+ const fields = validateFields(routeId, descriptors.status.value, error.name.value, error.message.value);
89
+ if (error.stack && "string" != typeof error.stack.value) invalid("Route data error stacks must be strings");
90
+ assertPublicData(snapshot);
91
+ const restored = new RouteDataError(fields.routeId, {
92
+ kind: "error",
93
+ status: fields.status,
94
+ data: descriptors.data.value,
95
+ error: {
96
+ name: fields.name,
97
+ message: fields.message
98
+ },
99
+ thrown: true
100
+ });
101
+ if (error.stack) Object.defineProperty(restored, "stack", {
102
+ value: error.stack.value,
103
+ configurable: true,
104
+ writable: true
105
+ });
106
+ return restored;
107
+ }
108
+ export { projectRouteDataError, restoreRouteDataError };