one 1.2.41 → 1.2.42

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 (332) hide show
  1. package/dist/cjs/Root.cjs +1 -1
  2. package/dist/cjs/Root.js +1 -1
  3. package/dist/cjs/Root.js.map +1 -1
  4. package/dist/cjs/Root.native.js +1 -1
  5. package/dist/cjs/Root.native.js.map +1 -1
  6. package/dist/cjs/cli/build.cjs +157 -2
  7. package/dist/cjs/cli/build.js +159 -2
  8. package/dist/cjs/cli/build.js.map +1 -1
  9. package/dist/cjs/cli/build.native.js +222 -18
  10. package/dist/cjs/cli/build.native.js.map +1 -1
  11. package/dist/cjs/createHandleRequest.cjs +21 -20
  12. package/dist/cjs/createHandleRequest.js +25 -24
  13. package/dist/cjs/createHandleRequest.js.map +1 -1
  14. package/dist/cjs/createHandleRequest.native.js +23 -22
  15. package/dist/cjs/createHandleRequest.native.js.map +1 -1
  16. package/dist/cjs/serve-worker.cjs +28 -12
  17. package/dist/cjs/serve-worker.js +17 -7
  18. package/dist/cjs/serve-worker.js.map +1 -1
  19. package/dist/cjs/serve-worker.native.js +28 -12
  20. package/dist/cjs/serve-worker.native.js.map +1 -1
  21. package/dist/cjs/serve.cjs +5 -2
  22. package/dist/cjs/serve.js +2 -2
  23. package/dist/cjs/serve.js.map +1 -1
  24. package/dist/cjs/serve.native.js +5 -2
  25. package/dist/cjs/serve.native.js.map +1 -1
  26. package/dist/cjs/server/oneServe.cjs +79 -70
  27. package/dist/cjs/server/oneServe.js +33 -12
  28. package/dist/cjs/server/oneServe.js.map +2 -2
  29. package/dist/cjs/server/oneServe.native.js +105 -81
  30. package/dist/cjs/server/oneServe.native.js.map +1 -1
  31. package/dist/cjs/{__mocks__/@react-navigation/native-stack.cjs → server/staticHtmlFetcher.cjs} +12 -8
  32. package/dist/cjs/{utils/style.js → server/staticHtmlFetcher.js} +12 -8
  33. package/dist/cjs/server/staticHtmlFetcher.js.map +6 -0
  34. package/dist/cjs/{utils/style.native.js → server/staticHtmlFetcher.native.js} +12 -7
  35. package/dist/cjs/server/staticHtmlFetcher.native.js.map +1 -0
  36. package/dist/cjs/vercel/build/buildVercelOutputDirectory.cjs +19 -2
  37. package/dist/cjs/vercel/build/buildVercelOutputDirectory.js +13 -1
  38. package/dist/cjs/vercel/build/buildVercelOutputDirectory.js.map +1 -1
  39. package/dist/cjs/vercel/build/buildVercelOutputDirectory.native.js +38 -2
  40. package/dist/cjs/vercel/build/buildVercelOutputDirectory.native.js.map +1 -1
  41. package/dist/cjs/vercel/build/generate/createSsrServerlessFunction.cjs +63 -3
  42. package/dist/cjs/vercel/build/generate/createSsrServerlessFunction.js +63 -3
  43. package/dist/cjs/vercel/build/generate/createSsrServerlessFunction.js.map +1 -1
  44. package/dist/cjs/vercel/build/generate/createSsrServerlessFunction.native.js +63 -3
  45. package/dist/cjs/vercel/build/generate/createSsrServerlessFunction.native.js.map +1 -1
  46. package/dist/cjs/vite/one-server-only.cjs +8 -4
  47. package/dist/cjs/vite/one-server-only.js +6 -3
  48. package/dist/cjs/vite/one-server-only.js.map +1 -1
  49. package/dist/esm/Root.js +1 -1
  50. package/dist/esm/Root.js.map +1 -1
  51. package/dist/esm/Root.mjs +1 -1
  52. package/dist/esm/Root.mjs.map +1 -1
  53. package/dist/esm/Root.native.js +1 -1
  54. package/dist/esm/Root.native.js.map +1 -1
  55. package/dist/esm/cli/build.js +159 -1
  56. package/dist/esm/cli/build.js.map +1 -1
  57. package/dist/esm/cli/build.mjs +156 -1
  58. package/dist/esm/cli/build.mjs.map +1 -1
  59. package/dist/esm/cli/build.native.js +221 -17
  60. package/dist/esm/cli/build.native.js.map +1 -1
  61. package/dist/esm/createHandleRequest.js +25 -24
  62. package/dist/esm/createHandleRequest.js.map +1 -1
  63. package/dist/esm/createHandleRequest.mjs +21 -20
  64. package/dist/esm/createHandleRequest.mjs.map +1 -1
  65. package/dist/esm/createHandleRequest.native.js +23 -22
  66. package/dist/esm/createHandleRequest.native.js.map +1 -1
  67. package/dist/esm/serve-worker.js +7 -6
  68. package/dist/esm/serve-worker.js.map +1 -1
  69. package/dist/esm/serve-worker.mjs +10 -7
  70. package/dist/esm/serve-worker.mjs.map +1 -1
  71. package/dist/esm/serve-worker.native.js +10 -7
  72. package/dist/esm/serve-worker.native.js.map +1 -1
  73. package/dist/esm/serve.js +2 -2
  74. package/dist/esm/serve.js.map +1 -1
  75. package/dist/esm/serve.mjs +5 -2
  76. package/dist/esm/serve.mjs.map +1 -1
  77. package/dist/esm/serve.native.js +5 -2
  78. package/dist/esm/serve.native.js.map +1 -1
  79. package/dist/esm/server/oneServe.js +35 -16
  80. package/dist/esm/server/oneServe.js.map +1 -1
  81. package/dist/esm/server/oneServe.mjs +79 -70
  82. package/dist/esm/server/oneServe.mjs.map +1 -1
  83. package/dist/esm/server/oneServe.native.js +105 -81
  84. package/dist/esm/server/oneServe.native.js.map +1 -1
  85. package/dist/esm/server/staticHtmlFetcher.js +12 -0
  86. package/dist/esm/server/staticHtmlFetcher.js.map +6 -0
  87. package/dist/esm/server/staticHtmlFetcher.mjs +9 -0
  88. package/dist/esm/server/staticHtmlFetcher.mjs.map +1 -0
  89. package/dist/esm/server/staticHtmlFetcher.native.js +9 -0
  90. package/dist/esm/server/staticHtmlFetcher.native.js.map +1 -0
  91. package/dist/esm/vercel/build/buildVercelOutputDirectory.js +13 -1
  92. package/dist/esm/vercel/build/buildVercelOutputDirectory.js.map +1 -1
  93. package/dist/esm/vercel/build/buildVercelOutputDirectory.mjs +19 -2
  94. package/dist/esm/vercel/build/buildVercelOutputDirectory.mjs.map +1 -1
  95. package/dist/esm/vercel/build/buildVercelOutputDirectory.native.js +38 -2
  96. package/dist/esm/vercel/build/buildVercelOutputDirectory.native.js.map +1 -1
  97. package/dist/esm/vercel/build/generate/createSsrServerlessFunction.js +63 -3
  98. package/dist/esm/vercel/build/generate/createSsrServerlessFunction.js.map +1 -1
  99. package/dist/esm/vercel/build/generate/createSsrServerlessFunction.mjs +63 -3
  100. package/dist/esm/vercel/build/generate/createSsrServerlessFunction.mjs.map +1 -1
  101. package/dist/esm/vercel/build/generate/createSsrServerlessFunction.native.js +63 -3
  102. package/dist/esm/vercel/build/generate/createSsrServerlessFunction.native.js.map +1 -1
  103. package/dist/esm/vite/one-server-only.js +6 -3
  104. package/dist/esm/vite/one-server-only.js.map +1 -1
  105. package/dist/esm/vite/one-server-only.mjs +8 -4
  106. package/dist/esm/vite/one-server-only.mjs.map +1 -1
  107. package/package.json +9 -9
  108. package/src/Root.tsx +4 -1
  109. package/src/cli/build.ts +187 -18
  110. package/src/createHandleRequest.ts +31 -29
  111. package/src/serve-worker.ts +25 -8
  112. package/src/serve.ts +2 -2
  113. package/src/server/oneServe.ts +100 -29
  114. package/src/server/staticHtmlFetcher.ts +10 -0
  115. package/src/useLoader.ts +1 -1
  116. package/src/vercel/build/buildVercelOutputDirectory.ts +36 -0
  117. package/src/vercel/build/generate/createSsrServerlessFunction.ts +63 -3
  118. package/src/vite/one-server-only.tsx +13 -2
  119. package/src/vite/types.ts +7 -3
  120. package/types/Root.d.ts.map +1 -1
  121. package/types/cli/build.d.ts.map +1 -1
  122. package/types/createHandleRequest.d.ts.map +1 -1
  123. package/types/serve-worker.d.ts +24 -1
  124. package/types/serve-worker.d.ts.map +1 -1
  125. package/types/server/oneServe.d.ts +21 -1
  126. package/types/server/oneServe.d.ts.map +1 -1
  127. package/types/server/staticHtmlFetcher.d.ts +3 -0
  128. package/types/server/staticHtmlFetcher.d.ts.map +1 -0
  129. package/types/vercel/build/buildVercelOutputDirectory.d.ts.map +1 -1
  130. package/types/vercel/build/generate/createSsrServerlessFunction.d.ts.map +1 -1
  131. package/types/vite/one-server-only.d.ts.map +1 -1
  132. package/types/vite/types.d.ts +6 -3
  133. package/types/vite/types.d.ts.map +1 -1
  134. package/dist/cjs/__mocks__/@react-navigation/native-stack.js +0 -24
  135. package/dist/cjs/__mocks__/@react-navigation/native-stack.js.map +0 -6
  136. package/dist/cjs/__mocks__/@react-navigation/native-stack.native.js +0 -38
  137. package/dist/cjs/__mocks__/@react-navigation/native-stack.native.js.map +0 -1
  138. package/dist/cjs/__mocks__/@react-navigation/native.js +0 -45
  139. package/dist/cjs/__mocks__/@react-navigation/native.js.map +0 -1
  140. package/dist/cjs/__mocks__/expo-linking.cjs +0 -36
  141. package/dist/cjs/__mocks__/expo-linking.js +0 -25
  142. package/dist/cjs/__mocks__/expo-linking.js.map +0 -6
  143. package/dist/cjs/__mocks__/expo-linking.native.js +0 -47
  144. package/dist/cjs/__mocks__/expo-linking.native.js.map +0 -1
  145. package/dist/cjs/__mocks__/expo-modules-core.cjs +0 -36
  146. package/dist/cjs/__mocks__/expo-modules-core.js +0 -31
  147. package/dist/cjs/__mocks__/expo-modules-core.js.map +0 -6
  148. package/dist/cjs/__mocks__/expo-modules-core.native.js +0 -67
  149. package/dist/cjs/__mocks__/expo-modules-core.native.js.map +0 -1
  150. package/dist/cjs/__mocks__/react-native-screens.cjs +0 -28
  151. package/dist/cjs/__mocks__/react-native-screens.js +0 -22
  152. package/dist/cjs/__mocks__/react-native-screens.js.map +0 -6
  153. package/dist/cjs/__mocks__/react-native-screens.native.js +0 -31
  154. package/dist/cjs/__mocks__/react-native-screens.native.js.map +0 -1
  155. package/dist/cjs/__mocks__/react-native.js +0 -49
  156. package/dist/cjs/__mocks__/react-native.js.map +0 -1
  157. package/dist/cjs/experimental-useLoaderState.cjs +0 -64
  158. package/dist/cjs/experimental-useLoaderState.js +0 -44
  159. package/dist/cjs/experimental-useLoaderState.js.map +0 -6
  160. package/dist/cjs/experimental-useLoaderState.native.js +0 -69
  161. package/dist/cjs/experimental-useLoaderState.native.js.map +0 -1
  162. package/dist/cjs/layouts/stack-utils/StackHeaderBackButton.cjs +0 -40
  163. package/dist/cjs/layouts/stack-utils/StackHeaderBackButton.js +0 -35
  164. package/dist/cjs/layouts/stack-utils/StackHeaderBackButton.js.map +0 -6
  165. package/dist/cjs/layouts/stack-utils/StackHeaderBackButton.native.js +0 -43
  166. package/dist/cjs/layouts/stack-utils/StackHeaderBackButton.native.js.map +0 -1
  167. package/dist/cjs/layouts/stack-utils/StackHeaderComponent.cjs +0 -69
  168. package/dist/cjs/layouts/stack-utils/StackHeaderComponent.js +0 -54
  169. package/dist/cjs/layouts/stack-utils/StackHeaderComponent.js.map +0 -6
  170. package/dist/cjs/layouts/stack-utils/StackHeaderComponent.native.js +0 -78
  171. package/dist/cjs/layouts/stack-utils/StackHeaderComponent.native.js.map +0 -1
  172. package/dist/cjs/layouts/stack-utils/StackHeaderLeft.cjs +0 -35
  173. package/dist/cjs/layouts/stack-utils/StackHeaderLeft.js +0 -30
  174. package/dist/cjs/layouts/stack-utils/StackHeaderLeft.js.map +0 -6
  175. package/dist/cjs/layouts/stack-utils/StackHeaderLeft.native.js +0 -40
  176. package/dist/cjs/layouts/stack-utils/StackHeaderLeft.native.js.map +0 -1
  177. package/dist/cjs/layouts/stack-utils/StackHeaderRight.cjs +0 -35
  178. package/dist/cjs/layouts/stack-utils/StackHeaderRight.js +0 -30
  179. package/dist/cjs/layouts/stack-utils/StackHeaderRight.js.map +0 -6
  180. package/dist/cjs/layouts/stack-utils/StackHeaderRight.native.js +0 -40
  181. package/dist/cjs/layouts/stack-utils/StackHeaderRight.native.js.map +0 -1
  182. package/dist/cjs/layouts/stack-utils/StackHeaderSearchBar.cjs +0 -35
  183. package/dist/cjs/layouts/stack-utils/StackHeaderSearchBar.js +0 -30
  184. package/dist/cjs/layouts/stack-utils/StackHeaderSearchBar.js.map +0 -6
  185. package/dist/cjs/layouts/stack-utils/StackHeaderSearchBar.native.js +0 -38
  186. package/dist/cjs/layouts/stack-utils/StackHeaderSearchBar.native.js.map +0 -1
  187. package/dist/cjs/layouts/stack-utils/StackHeaderTitle.cjs +0 -53
  188. package/dist/cjs/layouts/stack-utils/StackHeaderTitle.js +0 -46
  189. package/dist/cjs/layouts/stack-utils/StackHeaderTitle.js.map +0 -6
  190. package/dist/cjs/layouts/stack-utils/StackHeaderTitle.native.js +0 -56
  191. package/dist/cjs/layouts/stack-utils/StackHeaderTitle.native.js.map +0 -1
  192. package/dist/cjs/layouts/stack-utils/StackScreen.cjs +0 -57
  193. package/dist/cjs/layouts/stack-utils/StackScreen.js +0 -43
  194. package/dist/cjs/layouts/stack-utils/StackScreen.js.map +0 -6
  195. package/dist/cjs/layouts/stack-utils/StackScreen.native.js +0 -64
  196. package/dist/cjs/layouts/stack-utils/StackScreen.native.js.map +0 -1
  197. package/dist/cjs/layouts/stack-utils/index.cjs +0 -47
  198. package/dist/cjs/layouts/stack-utils/index.js +0 -36
  199. package/dist/cjs/layouts/stack-utils/index.js.map +0 -6
  200. package/dist/cjs/layouts/stack-utils/index.native.js +0 -50
  201. package/dist/cjs/layouts/stack-utils/index.native.js.map +0 -1
  202. package/dist/cjs/utils/children.cjs +0 -38
  203. package/dist/cjs/utils/children.js +0 -37
  204. package/dist/cjs/utils/children.js.map +0 -6
  205. package/dist/cjs/utils/children.native.js +0 -60
  206. package/dist/cjs/utils/children.native.js.map +0 -1
  207. package/dist/cjs/utils/safeWrite.cjs +0 -56
  208. package/dist/cjs/utils/safeWrite.js +0 -51
  209. package/dist/cjs/utils/safeWrite.js.map +0 -6
  210. package/dist/cjs/utils/safeWrite.native.js +0 -63
  211. package/dist/cjs/utils/safeWrite.native.js.map +0 -1
  212. package/dist/cjs/utils/style.cjs +0 -28
  213. package/dist/cjs/utils/style.js.map +0 -6
  214. package/dist/cjs/utils/style.native.js.map +0 -1
  215. package/dist/esm/__mocks__/@react-navigation/native-stack.js +0 -8
  216. package/dist/esm/__mocks__/@react-navigation/native-stack.js.map +0 -6
  217. package/dist/esm/__mocks__/@react-navigation/native-stack.mjs +0 -6
  218. package/dist/esm/__mocks__/@react-navigation/native-stack.mjs.map +0 -1
  219. package/dist/esm/__mocks__/@react-navigation/native-stack.native.js +0 -12
  220. package/dist/esm/__mocks__/@react-navigation/native-stack.native.js.map +0 -1
  221. package/dist/esm/__mocks__/@react-navigation/native.js +0 -18
  222. package/dist/esm/__mocks__/@react-navigation/native.js.map +0 -1
  223. package/dist/esm/__mocks__/expo-linking.js +0 -9
  224. package/dist/esm/__mocks__/expo-linking.js.map +0 -6
  225. package/dist/esm/__mocks__/expo-linking.mjs +0 -10
  226. package/dist/esm/__mocks__/expo-linking.mjs.map +0 -1
  227. package/dist/esm/__mocks__/expo-linking.native.js +0 -18
  228. package/dist/esm/__mocks__/expo-linking.native.js.map +0 -1
  229. package/dist/esm/__mocks__/expo-modules-core.js +0 -15
  230. package/dist/esm/__mocks__/expo-modules-core.js.map +0 -6
  231. package/dist/esm/__mocks__/expo-modules-core.mjs +0 -10
  232. package/dist/esm/__mocks__/expo-modules-core.mjs.map +0 -1
  233. package/dist/esm/__mocks__/expo-modules-core.native.js +0 -38
  234. package/dist/esm/__mocks__/expo-modules-core.native.js.map +0 -1
  235. package/dist/esm/__mocks__/react-native-screens.js +0 -6
  236. package/dist/esm/__mocks__/react-native-screens.js.map +0 -6
  237. package/dist/esm/__mocks__/react-native-screens.mjs +0 -4
  238. package/dist/esm/__mocks__/react-native-screens.mjs.map +0 -1
  239. package/dist/esm/__mocks__/react-native-screens.native.js +0 -4
  240. package/dist/esm/__mocks__/react-native-screens.native.js.map +0 -1
  241. package/dist/esm/__mocks__/react-native.js +0 -19
  242. package/dist/esm/__mocks__/react-native.js.map +0 -1
  243. package/dist/esm/experimental-useLoaderState.js +0 -32
  244. package/dist/esm/experimental-useLoaderState.js.map +0 -6
  245. package/dist/esm/experimental-useLoaderState.mjs +0 -41
  246. package/dist/esm/experimental-useLoaderState.mjs.map +0 -1
  247. package/dist/esm/experimental-useLoaderState.native.js +0 -43
  248. package/dist/esm/experimental-useLoaderState.native.js.map +0 -1
  249. package/dist/esm/layouts/stack-utils/StackHeaderBackButton.js +0 -19
  250. package/dist/esm/layouts/stack-utils/StackHeaderBackButton.js.map +0 -6
  251. package/dist/esm/layouts/stack-utils/StackHeaderBackButton.mjs +0 -16
  252. package/dist/esm/layouts/stack-utils/StackHeaderBackButton.mjs.map +0 -1
  253. package/dist/esm/layouts/stack-utils/StackHeaderBackButton.native.js +0 -16
  254. package/dist/esm/layouts/stack-utils/StackHeaderBackButton.native.js.map +0 -1
  255. package/dist/esm/layouts/stack-utils/StackHeaderComponent.js +0 -51
  256. package/dist/esm/layouts/stack-utils/StackHeaderComponent.js.map +0 -6
  257. package/dist/esm/layouts/stack-utils/StackHeaderComponent.mjs +0 -45
  258. package/dist/esm/layouts/stack-utils/StackHeaderComponent.mjs.map +0 -1
  259. package/dist/esm/layouts/stack-utils/StackHeaderComponent.native.js +0 -51
  260. package/dist/esm/layouts/stack-utils/StackHeaderComponent.native.js.map +0 -1
  261. package/dist/esm/layouts/stack-utils/StackHeaderLeft.js +0 -14
  262. package/dist/esm/layouts/stack-utils/StackHeaderLeft.js.map +0 -6
  263. package/dist/esm/layouts/stack-utils/StackHeaderLeft.mjs +0 -11
  264. package/dist/esm/layouts/stack-utils/StackHeaderLeft.mjs.map +0 -1
  265. package/dist/esm/layouts/stack-utils/StackHeaderLeft.native.js +0 -13
  266. package/dist/esm/layouts/stack-utils/StackHeaderLeft.native.js.map +0 -1
  267. package/dist/esm/layouts/stack-utils/StackHeaderRight.js +0 -14
  268. package/dist/esm/layouts/stack-utils/StackHeaderRight.js.map +0 -6
  269. package/dist/esm/layouts/stack-utils/StackHeaderRight.mjs +0 -11
  270. package/dist/esm/layouts/stack-utils/StackHeaderRight.mjs.map +0 -1
  271. package/dist/esm/layouts/stack-utils/StackHeaderRight.native.js +0 -13
  272. package/dist/esm/layouts/stack-utils/StackHeaderRight.native.js.map +0 -1
  273. package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.js +0 -14
  274. package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.js.map +0 -6
  275. package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.mjs +0 -11
  276. package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.mjs.map +0 -1
  277. package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.native.js +0 -11
  278. package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.native.js.map +0 -1
  279. package/dist/esm/layouts/stack-utils/StackHeaderTitle.js +0 -31
  280. package/dist/esm/layouts/stack-utils/StackHeaderTitle.js.map +0 -6
  281. package/dist/esm/layouts/stack-utils/StackHeaderTitle.mjs +0 -29
  282. package/dist/esm/layouts/stack-utils/StackHeaderTitle.mjs.map +0 -1
  283. package/dist/esm/layouts/stack-utils/StackHeaderTitle.native.js +0 -29
  284. package/dist/esm/layouts/stack-utils/StackHeaderTitle.native.js.map +0 -1
  285. package/dist/esm/layouts/stack-utils/StackScreen.js +0 -33
  286. package/dist/esm/layouts/stack-utils/StackScreen.js.map +0 -6
  287. package/dist/esm/layouts/stack-utils/StackScreen.mjs +0 -33
  288. package/dist/esm/layouts/stack-utils/StackScreen.mjs.map +0 -1
  289. package/dist/esm/layouts/stack-utils/StackScreen.native.js +0 -38
  290. package/dist/esm/layouts/stack-utils/StackScreen.native.js.map +0 -1
  291. package/dist/esm/layouts/stack-utils/index.js +0 -26
  292. package/dist/esm/layouts/stack-utils/index.js.map +0 -6
  293. package/dist/esm/layouts/stack-utils/index.mjs +0 -16
  294. package/dist/esm/layouts/stack-utils/index.mjs.map +0 -1
  295. package/dist/esm/layouts/stack-utils/index.native.js +0 -16
  296. package/dist/esm/layouts/stack-utils/index.native.js.map +0 -1
  297. package/dist/esm/utils/children.js +0 -23
  298. package/dist/esm/utils/children.js.map +0 -6
  299. package/dist/esm/utils/children.mjs +0 -13
  300. package/dist/esm/utils/children.mjs.map +0 -1
  301. package/dist/esm/utils/children.native.js +0 -32
  302. package/dist/esm/utils/children.native.js.map +0 -1
  303. package/dist/esm/utils/safeWrite.js +0 -29
  304. package/dist/esm/utils/safeWrite.js.map +0 -6
  305. package/dist/esm/utils/safeWrite.mjs +0 -21
  306. package/dist/esm/utils/safeWrite.mjs.map +0 -1
  307. package/dist/esm/utils/safeWrite.native.js +0 -25
  308. package/dist/esm/utils/safeWrite.native.js.map +0 -1
  309. package/dist/esm/utils/style.js +0 -8
  310. package/dist/esm/utils/style.js.map +0 -6
  311. package/dist/esm/utils/style.mjs +0 -5
  312. package/dist/esm/utils/style.mjs.map +0 -1
  313. package/dist/esm/utils/style.native.js +0 -5
  314. package/dist/esm/utils/style.native.js.map +0 -1
  315. package/types/__mocks__/@react-navigation/native-stack.d.ts.map +0 -1
  316. package/types/__mocks__/@react-navigation/native.d.ts.map +0 -1
  317. package/types/__mocks__/expo-linking.d.ts.map +0 -1
  318. package/types/__mocks__/expo-modules-core.d.ts.map +0 -1
  319. package/types/__mocks__/react-native-screens.d.ts.map +0 -1
  320. package/types/__mocks__/react-native.d.ts.map +0 -1
  321. package/types/experimental-useLoaderState.d.ts.map +0 -1
  322. package/types/layouts/stack-utils/StackHeaderBackButton.d.ts.map +0 -1
  323. package/types/layouts/stack-utils/StackHeaderComponent.d.ts.map +0 -1
  324. package/types/layouts/stack-utils/StackHeaderLeft.d.ts.map +0 -1
  325. package/types/layouts/stack-utils/StackHeaderRight.d.ts.map +0 -1
  326. package/types/layouts/stack-utils/StackHeaderSearchBar.d.ts.map +0 -1
  327. package/types/layouts/stack-utils/StackHeaderTitle.d.ts.map +0 -1
  328. package/types/layouts/stack-utils/StackScreen.d.ts.map +0 -1
  329. package/types/layouts/stack-utils/index.d.ts.map +0 -1
  330. package/types/utils/children.d.ts.map +0 -1
  331. package/types/utils/safeWrite.d.ts.map +0 -1
  332. package/types/utils/style.d.ts.map +0 -1
package/src/cli/build.ts CHANGED
@@ -27,6 +27,7 @@ import { buildPage } from './buildPage'
27
27
  import { checkNodeVersion } from './checkNodeVersion'
28
28
  import { generateSitemap, type RouteSitemapData } from './generateSitemap'
29
29
  import { labelProcess } from './label-process'
30
+ import { isRolldown } from '../utils/isRolldown'
30
31
 
31
32
  const { ensureDir, writeJSON } = FSExtra
32
33
 
@@ -625,6 +626,7 @@ export async function build(args: {
625
626
  preloads,
626
627
  cssPreloads,
627
628
  loaders,
629
+ useRolldown: await isRolldown(),
628
630
  }
629
631
 
630
632
  await writeJSON(toAbsolute(`dist/buildInfo.json`), buildInfoForWriting)
@@ -662,29 +664,196 @@ export async function build(args: {
662
664
  break
663
665
  }
664
666
 
665
- // case 'cloudflare': {
666
- // await FSExtra.writeFile(
667
- // join(options.root, 'dist', 'worker.js'),
668
- // `import { serve } from 'one/serve-worker'
667
+ case 'cloudflare': {
668
+ // Generate lazy import functions - modules load on-demand, not all upfront
669
+ // Uses find_additional_modules in wrangler config to keep modules separate
670
+ const pageRouteMap: string[] = []
671
+ const apiRouteMap: string[] = []
672
+ const middlewareRouteMap: string[] = []
673
+
674
+ // Generate lazy imports for SSR/SSG page server bundles
675
+ for (const [routeFile, info] of Object.entries(buildInfoForWriting.routeToBuildInfo)) {
676
+ if (info.serverJsPath) {
677
+ const importPath = './' + info.serverJsPath.replace(/^dist\//, '')
678
+ pageRouteMap.push(` '${routeFile}': () => import('${importPath}')`)
679
+ }
680
+ }
669
681
 
670
- // const buildInfo = ${JSON.stringify(buildInfoForWriting)}
682
+ // Generate lazy imports for API routes
683
+ for (const route of buildInfoForWriting.manifest.apiRoutes) {
684
+ if (route.file) {
685
+ // API files are built to dist/api/
686
+ // route.page is like "/api/hello", files are at "dist/api/api/hello.js"
687
+ // rolldown preserves brackets, esbuild replaces them with underscores
688
+ const apiFileName = buildInfoForWriting.useRolldown
689
+ ? route.page.slice(1)
690
+ : route.page.slice(1).replace(/\[/g, '_').replace(/\]/g, '_')
691
+ const importPath = `./api/${apiFileName}.js`
692
+ apiRouteMap.push(` '${route.page}': () => import('${importPath}')`)
693
+ }
694
+ }
671
695
 
672
- // const handler = await serve(buildInfo)
696
+ // Generate lazy imports for middlewares
697
+ // The key must match the contextKey used to look up the middleware (e.g., "dist/middlewares/_middleware.js")
698
+ for (const [middlewareFile, builtPath] of Object.entries(builtMiddlewares)) {
699
+ const importPath = './' + builtPath.replace(/^dist\//, '')
700
+ middlewareRouteMap.push(` '${builtPath}': () => import('${importPath}')`)
701
+ }
673
702
 
674
- // export default {
675
- // fetch: handler.fetch,
676
- // }`
677
- // )
703
+ const workerSrcPath = join(options.root, 'dist', '_worker-src.js')
704
+ const workerCode = `// Polyfill MessageChannel for React SSR (not available in Cloudflare Workers by default)
705
+ if (typeof MessageChannel === 'undefined') {
706
+ globalThis.MessageChannel = class MessageChannel {
707
+ constructor() {
708
+ this.port1 = { postMessage: () => {}, onmessage: null, close: () => {} }
709
+ this.port2 = { postMessage: () => {}, onmessage: null, close: () => {} }
710
+ }
711
+ }
712
+ }
713
+
714
+ import { serve, setFetchStaticHtml } from 'one/serve-worker'
715
+
716
+ // Lazy import map - modules load on-demand when route is matched
717
+ const lazyRoutes = {
718
+ serverEntry: () => import('./server/_virtual_one-entry.js'),
719
+ pages: {
720
+ ${pageRouteMap.join(',\n')}
721
+ },
722
+ api: {
723
+ ${apiRouteMap.join(',\n')}
724
+ },
725
+ middlewares: {
726
+ ${middlewareRouteMap.join(',\n')}
727
+ }
728
+ }
678
729
 
679
- // await FSExtra.writeFile(
680
- // join(options.root, 'dist', 'wrangler.toml'),
681
- // `assets = { directory = "client" }
682
- // compatibility_date = "2024-12-05"
683
- // `
684
- // )
730
+ const buildInfo = ${JSON.stringify(buildInfoForWriting)}
731
+
732
+ let app
733
+
734
+ export default {
735
+ async fetch(request, env, ctx) {
736
+ if (!app) {
737
+ app = await serve(buildInfo, lazyRoutes)
738
+ }
739
+
740
+ // Set up static HTML fetcher for this request (uses ASSETS binding)
741
+ if (env.ASSETS) {
742
+ setFetchStaticHtml(async (path) => {
743
+ try {
744
+ const url = new URL(request.url)
745
+ url.pathname = path
746
+ const assetResponse = await env.ASSETS.fetch(new Request(url))
747
+ if (assetResponse && assetResponse.ok) {
748
+ return await assetResponse.text()
749
+ }
750
+ } catch (e) {
751
+ // Asset not found
752
+ }
753
+ return null
754
+ })
755
+ }
756
+
757
+ try {
758
+ // Try the app first
759
+ const response = await app.fetch(request, env, ctx)
685
760
 
686
- // break
687
- // }
761
+ // If no route matched (404) or no response, try serving static assets
762
+ if (!response || response.status === 404) {
763
+ if (env.ASSETS) {
764
+ try {
765
+ const assetResponse = await env.ASSETS.fetch(request)
766
+ // If asset exists, return it
767
+ if (assetResponse && assetResponse.status !== 404) {
768
+ return assetResponse
769
+ }
770
+ } catch (e) {
771
+ // Asset not found, continue with original response
772
+ }
773
+ }
774
+ }
775
+
776
+ return response
777
+ } finally {
778
+ // Clean up per-request state
779
+ setFetchStaticHtml(null)
780
+ }
781
+ }
782
+ }
783
+ `
784
+ await FSExtra.writeFile(workerSrcPath, workerCode)
785
+
786
+ // Bundle the worker using Vite/esbuild
787
+ // Cloudflare Workers with nodejs_compat supports Node.js built-ins
788
+ console.info('\n [cloudflare] Bundling worker...')
789
+ await viteBuild({
790
+ root: options.root,
791
+ logLevel: 'warn',
792
+ build: {
793
+ outDir: 'dist',
794
+ emptyOutDir: false,
795
+ // Use SSR mode with node target for proper Node.js module resolution
796
+ ssr: workerSrcPath,
797
+ rollupOptions: {
798
+ external: [
799
+ // React Native dev tools - not needed in production
800
+ '@react-native/dev-middleware',
801
+ '@react-native/debugger-shell',
802
+ 'metro',
803
+ 'metro-core',
804
+ 'metro-runtime',
805
+ // Native modules that can't run in workers
806
+ /\.node$/,
807
+ ],
808
+ output: {
809
+ entryFileNames: 'worker.js',
810
+ format: 'es',
811
+ // Keep dynamic imports separate for lazy loading
812
+ inlineDynamicImports: false,
813
+ },
814
+ },
815
+ minify: true,
816
+ target: 'esnext',
817
+ },
818
+ define: {
819
+ 'process.env.NODE_ENV': JSON.stringify('production'),
820
+ 'process.env.VITE_ENVIRONMENT': JSON.stringify('ssr'),
821
+ },
822
+ resolve: {
823
+ conditions: ['workerd', 'worker', 'node', 'module', 'default'],
824
+ },
825
+ ssr: {
826
+ target: 'node',
827
+ noExternal: true,
828
+ },
829
+ })
830
+
831
+ // Clean up temp file
832
+ await FSExtra.remove(workerSrcPath)
833
+
834
+ // Use jsonc for wrangler config (recommended for new projects)
835
+ // Use assets with run_worker_first so all requests go through worker (enables middleware on SSG pages)
836
+ const wranglerConfig = `{
837
+ "name": "one-app",
838
+ "main": "worker.js",
839
+ "compatibility_date": "2024-12-05",
840
+ "compatibility_flags": ["nodejs_compat"],
841
+ "find_additional_modules": true,
842
+ "rules": [
843
+ { "type": "ESModule", "globs": ["./server/**/*.js"], "fallthrough": true },
844
+ { "type": "ESModule", "globs": ["./api/**/*.js"], "fallthrough": true },
845
+ { "type": "ESModule", "globs": ["./middlewares/**/*.js"], "fallthrough": true }
846
+ ],
847
+ "assets": { "directory": "client", "binding": "ASSETS", "run_worker_first": true }
848
+ }
849
+ `
850
+ await FSExtra.writeFile(join(options.root, 'dist', 'wrangler.jsonc'), wranglerConfig)
851
+
852
+ postBuildLogs.push(`Cloudflare worker bundled at dist/worker.js`)
853
+ postBuildLogs.push(`To deploy: cd dist && wrangler deploy`)
854
+
855
+ break
856
+ }
688
857
  }
689
858
 
690
859
  if (process.env.VXRN_ANALYZE_BUNDLE) {
@@ -107,39 +107,41 @@ export async function resolveAPIRoute(
107
107
  console.info(`[one] 📡 API ${request.method} ${pathname} → ${route.file}`, params)
108
108
  }
109
109
 
110
- try {
111
- return resolveAPIEndpoint(
112
- () =>
113
- handlers.handleAPI!({
114
- request,
115
- route,
116
- url,
117
- loaderProps: {
118
- path: pathname,
119
- search: url.search,
120
- params,
121
- },
122
- }),
123
- request,
124
- params || {}
125
- )
126
- } catch (err) {
127
- if (isResponse(err)) {
128
- return err
129
- }
110
+ return await runMiddlewares(handlers, request, route, async () => {
111
+ try {
112
+ return resolveAPIEndpoint(
113
+ () =>
114
+ handlers.handleAPI!({
115
+ request,
116
+ route,
117
+ url,
118
+ loaderProps: {
119
+ path: pathname,
120
+ search: url.search,
121
+ params,
122
+ },
123
+ }),
124
+ request,
125
+ params || {}
126
+ )
127
+ } catch (err) {
128
+ if (isResponse(err)) {
129
+ return err
130
+ }
130
131
 
131
- if (process.env.NODE_ENV === 'development') {
132
- console.error(`\n [one] Error importing API route at ${pathname}:
132
+ if (process.env.NODE_ENV === 'development') {
133
+ console.error(`\n [one] Error importing API route at ${pathname}:
133
134
 
134
- ${err}
135
+ ${err}
135
136
 
136
- If this is an import error, you can likely fix this by adding this dependency to
137
- the "optimizeDeps.include" array in your vite.config.ts.
138
- `)
139
- }
137
+ If this is an import error, you can likely fix this by adding this dependency to
138
+ the "optimizeDeps.include" array in your vite.config.ts.
139
+ `)
140
+ }
140
141
 
141
- throw err
142
- }
142
+ throw err
143
+ }
144
+ })
143
145
  }
144
146
 
145
147
  export async function resolveLoaderRoute(
@@ -1,23 +1,40 @@
1
1
  import { Hono } from 'hono'
2
- import { createProdServer } from 'vxrn/serve'
3
- import { oneServe } from './server/oneServe'
4
2
  import { setServerGlobals } from './server/setServerGlobals'
5
3
  import { setupBuildInfo } from './server/setupBuildOptions'
6
4
  import { ensureExists } from './utils/ensureExists'
7
5
  import type { One } from './vite/types'
8
6
 
9
- export async function serve(buildInfo: One.BuildInfo) {
7
+ // Re-export static HTML fetcher utilities for worker use
8
+ export { setFetchStaticHtml, getFetchStaticHtml } from './server/staticHtmlFetcher'
9
+
10
+ /**
11
+ * Lazy import functions for route modules.
12
+ * Modules are loaded on-demand when a route is matched, not all upfront.
13
+ */
14
+ export type LazyRoutes = {
15
+ serverEntry: () => Promise<{ default: { render: (props: any) => any } }>
16
+ pages: Record<string, () => Promise<any>>
17
+ api: Record<string, () => Promise<any>>
18
+ middlewares: Record<string, () => Promise<any>>
19
+ }
20
+
21
+ /**
22
+ * Creates a Hono app for edge/worker environments (Cloudflare Workers, etc.)
23
+ * Static assets should be handled by the platform (e.g., wrangler's [assets] config)
24
+ * This only sets up the dynamic routes (SSR, API, loaders)
25
+ *
26
+ * @param buildInfo - Build configuration and route metadata
27
+ * @param lazyRoutes - Lazy import functions for route modules (loaded on-demand)
28
+ */
29
+ export async function serve(buildInfo: One.BuildInfo, lazyRoutes?: LazyRoutes) {
10
30
  setupBuildInfo(buildInfo)
11
31
  ensureExists(buildInfo.oneOptions)
12
32
  setServerGlobals()
13
33
 
14
- const serverOptions = buildInfo.oneOptions.server || {}
15
-
16
34
  const app = new Hono()
17
35
 
18
- await createProdServer(app, serverOptions)
19
-
20
- await oneServe(buildInfo.oneOptions, buildInfo, app)
36
+ const { oneServe } = await import('./server/oneServe')
37
+ await oneServe(buildInfo.oneOptions, buildInfo, app, { lazyRoutes })
21
38
 
22
39
  return app
23
40
  }
package/src/serve.ts CHANGED
@@ -23,7 +23,7 @@ export async function serve(args: VXRNOptions['server'] & { app?: Hono } = {}) {
23
23
  // to avoid loading the CACHE_KEY before we set it use async imports:
24
24
  const { labelProcess } = await import('./cli/label-process')
25
25
  const { removeUndefined } = await import('./utils/removeUndefined')
26
- const { loadEnv, serve: vxrnServe } = await import('vxrn/serve')
26
+ const { loadEnv, serve: vxrnServe, serveStaticAssets } = await import('vxrn/serve')
27
27
  const { oneServe } = await import('./server/oneServe')
28
28
 
29
29
  labelProcess('serve')
@@ -44,7 +44,7 @@ export async function serve(args: VXRNOptions['server'] & { app?: Hono } = {}) {
44
44
  }),
45
45
 
46
46
  async beforeRegisterRoutes(options, app) {
47
- await oneServe(oneOptions, buildInfo, app)
47
+ await oneServe(oneOptions, buildInfo, app, { serveStaticAssets })
48
48
  },
49
49
 
50
50
  async afterRegisterRoutes(options, app) {},
@@ -1,9 +1,7 @@
1
- import { default as FSExtra } from 'fs-extra'
2
1
  import type { Hono, MiddlewareHandler } from 'hono'
3
2
  import type { BlankEnv } from 'hono/types'
4
- import { extname, join } from 'node:path'
5
- import { serveStaticAssets } from 'vxrn'
6
- import { getServerEntry } from 'vxrn/serve'
3
+ import { readFile } from 'node:fs/promises'
4
+ import { extname, join, resolve } from 'node:path'
7
5
  import {
8
6
  CSS_PRELOAD_JS_POSTFIX,
9
7
  LOADER_JS_POSTFIX_UNCACHED,
@@ -17,14 +15,33 @@ import {
17
15
  } from '../createHandleRequest'
18
16
  import type { RenderAppProps } from '../types'
19
17
  import { getPathFromLoaderPath } from '../utils/cleanUrl'
20
- import { isRolldown } from '../utils/isRolldown'
21
18
  import { toAbsolute } from '../utils/toAbsolute'
22
19
  import type { One } from '../vite/types'
23
20
  import type { RouteInfoCompiled } from './createRoutesManifest'
21
+ import { getFetchStaticHtml } from './staticHtmlFetcher'
24
22
 
25
23
  const debugRouter = process.env.ONE_DEBUG_ROUTER
26
24
 
27
- export async function oneServe(oneOptions: One.PluginOptions, buildInfo: One.BuildInfo, app: Hono) {
25
+ /**
26
+ * Lazy import functions for route modules.
27
+ * Modules are loaded on-demand when a route is matched, not all upfront.
28
+ */
29
+ type LazyRoutes = {
30
+ serverEntry: () => Promise<{ default: { render: (props: any) => any } }>
31
+ pages: Record<string, () => Promise<any>>
32
+ api: Record<string, () => Promise<any>>
33
+ middlewares: Record<string, () => Promise<any>>
34
+ }
35
+
36
+ export async function oneServe(
37
+ oneOptions: One.PluginOptions,
38
+ buildInfo: One.BuildInfo,
39
+ app: Hono,
40
+ options?: {
41
+ serveStaticAssets?: (ctx: { context: any }) => Promise<Response | undefined>
42
+ lazyRoutes?: LazyRoutes
43
+ }
44
+ ) {
28
45
  const { resolveAPIRoute, resolveLoaderRoute, resolvePageRoute } = await import(
29
46
  '../createHandleRequest'
30
47
  )
@@ -61,29 +78,58 @@ export async function oneServe(oneOptions: One.PluginOptions, buildInfo: One.Bui
61
78
  root: '.',
62
79
  }
63
80
 
64
- const entryServer = getServerEntry(serverOptions)
65
- const entry = await import(entryServer)
66
-
67
- const render = entry.default.render as (props: RenderAppProps) => any
68
81
  const apiCJS = oneOptions.build?.api?.outputFormat === 'cjs'
69
82
 
70
- const useRolldown = await isRolldown()
83
+ // useRolldown is determined at build time and stored in buildInfo
84
+ const useRolldown = buildInfo.useRolldown ?? false
85
+
86
+ // Lazy load server entry only when needed for SSR
87
+ let render: ((props: RenderAppProps) => any) | null = null
88
+ async function getRender() {
89
+ if (!render) {
90
+ // Use lazy import if available (workers), otherwise dynamic import (Node.js)
91
+ const entry = options?.lazyRoutes?.serverEntry
92
+ ? await options.lazyRoutes.serverEntry()
93
+ : await import(
94
+ resolve(
95
+ process.cwd(),
96
+ `${serverOptions.root}/dist/server/_virtual_one-entry.${typeof oneOptions.build?.server === 'object' && oneOptions.build.server.outputFormat === 'cjs' ? 'c' : ''}js`
97
+ )
98
+ )
99
+ render = entry.default.render as (props: RenderAppProps) => any
100
+ }
101
+ return render
102
+ }
71
103
 
72
104
  const requestHandlers: RequestHandlers = {
73
105
  async handleAPI({ route }) {
106
+ // Use lazy import if available (workers), otherwise dynamic import (Node.js)
107
+ if (options?.lazyRoutes?.api?.[route.page]) {
108
+ return await options.lazyRoutes.api[route.page]()
109
+ }
74
110
  const fileName = useRolldown
75
- ? route.page.slice(1) // rolldown doesn't replace brackets
76
- : route.page.slice(1).replace(/\[/g, '_').replace(/\]/g, '_') // esbuild replaces brackets with underscores
111
+ ? route.page.slice(1)
112
+ : route.page.slice(1).replace(/\[/g, '_').replace(/\]/g, '_')
77
113
  const apiFile = join(process.cwd(), 'dist', 'api', fileName + (apiCJS ? '.cjs' : '.js'))
78
114
  return await import(apiFile)
79
115
  },
80
116
 
81
117
  async loadMiddleware(route) {
118
+ // Use lazy import if available (workers), otherwise dynamic import (Node.js)
119
+ if (options?.lazyRoutes?.middlewares?.[route.contextKey]) {
120
+ return await options.lazyRoutes.middlewares[route.contextKey]()
121
+ }
82
122
  return await import(toAbsolute(route.contextKey))
83
123
  },
84
124
 
85
- async handleLoader({ request, route, url, loaderProps }) {
86
- const exports = await import(toAbsolute(join('./', 'dist/server', route.file)))
125
+ async handleLoader({ route, loaderProps }) {
126
+ // Use lazy import if available (workers), otherwise dynamic import (Node.js)
127
+ // For workers, look up by routeFile (original file path like "./dynamic/[id]+ssr.tsx")
128
+ // For Node.js, use route.file which may be loaderServerPath
129
+ const routeFile = (route as any).routeFile || route.file
130
+ const exports = options?.lazyRoutes?.pages?.[routeFile]
131
+ ? await options.lazyRoutes.pages[routeFile]()
132
+ : await import(toAbsolute(join('./', 'dist/server', route.file)))
87
133
 
88
134
  const { loader } = exports
89
135
 
@@ -109,13 +155,16 @@ export async function oneServe(oneOptions: One.PluginOptions, buildInfo: One.Bui
109
155
  }
110
156
 
111
157
  try {
112
- const exported = await import(toAbsolute(buildInfo.serverJsPath))
158
+ // Use lazy import if available (workers), otherwise dynamic import (Node.js)
159
+ const exported = options?.lazyRoutes?.pages?.[route.file]
160
+ ? await options.lazyRoutes.pages[route.file]()
161
+ : await import(toAbsolute(buildInfo.serverJsPath))
113
162
  const loaderData = await exported.loader?.(loaderProps)
114
163
 
115
164
  const headers = new Headers()
116
165
  headers.set('content-type', 'text/html')
117
166
 
118
- const rendered = await render({
167
+ const rendered = await (await getRender())({
119
168
  mode: route.type,
120
169
  loaderData,
121
170
  loaderProps,
@@ -142,10 +191,28 @@ url: ${url}`)
142
191
  const htmlPath = routeMap[url.pathname] || routeMap[buildInfo?.cleanPath]
143
192
 
144
193
  if (htmlPath) {
145
- const html = await FSExtra.readFile(join('dist/client', htmlPath), 'utf-8')
146
- const headers = new Headers()
147
- headers.set('content-type', 'text/html')
148
- return new Response(html, { headers, status: route.isNotFound ? 404 : 200 })
194
+ // Try Worker ASSETS binding first (for Cloudflare Workers), fall back to filesystem
195
+ const fetchStaticHtml = getFetchStaticHtml()
196
+ let html: string | null = null
197
+
198
+ if (fetchStaticHtml) {
199
+ html = await fetchStaticHtml(htmlPath)
200
+ }
201
+
202
+ if (!html) {
203
+ // Fall back to filesystem (Node.js)
204
+ try {
205
+ html = await readFile(join('dist/client', htmlPath), 'utf-8')
206
+ } catch {
207
+ // File not found
208
+ }
209
+ }
210
+
211
+ if (html) {
212
+ const headers = new Headers()
213
+ headers.set('content-type', 'text/html')
214
+ return new Response(html, { headers, status: route.isNotFound ? 404 : 200 })
215
+ }
149
216
  }
150
217
  }
151
218
  },
@@ -161,14 +228,17 @@ url: ${url}`)
161
228
  // But if we handle every matching static asset here, it seems to break some of the static routes.
162
229
  // So we only handle it if there's a matching not-found or dynamic route, to prevent One from taking over the static asset.
163
230
  // If there's no matching not-found or dynamic route, it's very likely that One won't handle it and will fallback to VxRN serving the static asset so it will also work.
164
- const staticAssetResponse = await serveStaticAssets({ context })
165
- if (staticAssetResponse) {
166
- return await runMiddlewares(
167
- requestHandlers,
168
- request,
169
- route,
170
- async () => staticAssetResponse
171
- )
231
+ // Note: serveStaticAssets is optional - workers handle static assets via platform config
232
+ if (options?.serveStaticAssets) {
233
+ const staticAssetResponse = await options.serveStaticAssets({ context })
234
+ if (staticAssetResponse) {
235
+ return await runMiddlewares(
236
+ requestHandlers,
237
+ request,
238
+ route,
239
+ async () => staticAssetResponse
240
+ )
241
+ }
172
242
  }
173
243
  }
174
244
 
@@ -321,6 +391,7 @@ url: ${url}`)
321
391
  // for now just change this
322
392
  const loaderRoute = {
323
393
  ...route,
394
+ routeFile: route.file, // preserve original for lazy route lookup
324
395
  file: route.loaderServerPath || c.req.path,
325
396
  }
326
397
 
@@ -0,0 +1,10 @@
1
+ // Global function for fetching static HTML in Workers (set per-request)
2
+ let _fetchStaticHtml: ((path: string) => Promise<string | null>) | null = null
3
+
4
+ export function setFetchStaticHtml(fn: ((path: string) => Promise<string | null>) | null) {
5
+ _fetchStaticHtml = fn
6
+ }
7
+
8
+ export function getFetchStaticHtml() {
9
+ return _fetchStaticHtml
10
+ }
package/src/useLoader.ts CHANGED
@@ -92,7 +92,7 @@ export function useLoaderState<
92
92
  // (the pathname is already resolved like /docs/getting-started, not /docs/[slug])
93
93
  const currentPath = pathname.replace(/\/index$/, '').replace(/\/$/, '') || '/'
94
94
 
95
- // server-side
95
+ // server-side only - typeof window check ensures this never runs on client
96
96
  if (typeof window === 'undefined' && loader) {
97
97
  const serverData = useAsyncFn(
98
98
  loader,
@@ -195,6 +195,40 @@ export { wrappedMiddlewareFunction as default }
195
195
 
196
196
  // Documentation - Vercel Build Output v3 config.json
197
197
  // https://vercel.com/docs/build-output-api/v3/configuration#config.json-supported-properties
198
+ // Generate loader routes for SSR pages
199
+ // These intercept /assets/*_vxrn_loader.js requests and route to the SSR function
200
+ const ssrLoaderRoutes = buildInfoForWriting.manifest.pageRoutes
201
+ .filter((r) => r.type === 'ssr')
202
+ .map((r) => {
203
+ const pagePath = getPathFromRoute(r) || '/'
204
+ // Convert page path to loader asset pattern
205
+ // /ssr-page -> ssr-page
206
+ // /dynamic/:id -> dynamic_:id (getPathFromRoute converts [id] to :id)
207
+ const cleanPath = pagePath.slice(1).replace(/\//g, '_')
208
+
209
+ // Build regex pattern for the loader asset
210
+ // Replace :param with capture groups for dynamic segments
211
+ // The loader URL pattern uses the actual param value, not :param
212
+ // e.g., /dynamic/123 -> /assets/dynamic_123_12345_vxrn_loader.js
213
+ let loaderPattern = cleanPath.replace(/:([^_]+)/g, '(?<$1>[^_]+)')
214
+
215
+ // Match the loader file pattern: {path}_{cacheKey}_vxrn_loader.js
216
+ // Also handle _refetch_ pattern for cache busting
217
+ const src = `^/assets/${loaderPattern}(?:_refetch_\\d+)?_\\d+_vxrn_loader\\.js$`
218
+
219
+ // Build destination with captured params
220
+ let dest = `${pagePath}?__loader=1`
221
+ const paramMatches = cleanPath.match(/:([^_]+)/g)
222
+ if (paramMatches) {
223
+ for (const match of paramMatches) {
224
+ const paramName = match.slice(1) // remove leading :
225
+ dest += `&${paramName}=$${paramName}`
226
+ }
227
+ }
228
+
229
+ return { src, dest }
230
+ })
231
+
198
232
  const vercelConfigFilePath = resolve(join(oneOptionsRoot, '.vercel/output', 'config.json'))
199
233
  await writeJSON(vercelConfigFilePath, {
200
234
  ...vercelBuildOutputConfigBase,
@@ -212,6 +246,8 @@ export { wrappedMiddlewareFunction as default }
212
246
  {
213
247
  handle: 'rewrite',
214
248
  },
249
+ // SSR loader routes must come before dynamic page routes
250
+ ...ssrLoaderRoutes,
215
251
  ...buildInfoForWriting.manifest.allRoutes
216
252
  .filter((r) => r.routeKeys && Object.keys(r.routeKeys).length > 0)
217
253
  .map((r) => ({