one 1.1.381 → 1.1.382

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 (329) hide show
  1. package/dist/cjs/Route.js.map +1 -1
  2. package/dist/cjs/Route.native.js.map +1 -1
  3. package/dist/cjs/cli/build.cjs +104 -71
  4. package/dist/cjs/cli/build.js +83 -43
  5. package/dist/cjs/cli/build.js.map +2 -2
  6. package/dist/cjs/cli/build.native.js +164 -69
  7. package/dist/cjs/cli/build.native.js.map +2 -2
  8. package/dist/cjs/cli/{run.cjs → dev.cjs} +7 -8
  9. package/dist/cjs/cli/{run.js → dev.js} +7 -8
  10. package/dist/cjs/cli/dev.js.map +6 -0
  11. package/dist/cjs/cli/{run.native.js → dev.native.js} +8 -9
  12. package/dist/cjs/cli/dev.native.js.map +6 -0
  13. package/dist/cjs/cli/main.cjs +2 -2
  14. package/dist/cjs/cli/main.js +2 -2
  15. package/dist/cjs/cli/main.native.js +2 -2
  16. package/dist/cjs/cli/main.native.js.map +1 -1
  17. package/dist/cjs/cli.cjs +3 -7
  18. package/dist/cjs/cli.js +2 -6
  19. package/dist/cjs/cli.js.map +2 -2
  20. package/dist/cjs/cli.native.js +2 -6
  21. package/dist/cjs/cli.native.js.map +2 -2
  22. package/dist/cjs/constants.cjs +3 -1
  23. package/dist/cjs/constants.js +2 -1
  24. package/dist/cjs/constants.js.map +1 -1
  25. package/dist/cjs/constants.native.js +3 -1
  26. package/dist/cjs/constants.native.js.map +2 -2
  27. package/dist/cjs/createHandleRequest.cjs +124 -87
  28. package/dist/cjs/createHandleRequest.js +129 -81
  29. package/dist/cjs/createHandleRequest.js.map +1 -1
  30. package/dist/cjs/createHandleRequest.native.js +153 -96
  31. package/dist/cjs/createHandleRequest.native.js.map +2 -2
  32. package/dist/cjs/createMiddleware.cjs +28 -0
  33. package/dist/cjs/createMiddleware.js +23 -0
  34. package/dist/cjs/createMiddleware.js.map +6 -0
  35. package/dist/cjs/createMiddleware.native.js +28 -0
  36. package/dist/cjs/createMiddleware.native.js.map +6 -0
  37. package/dist/cjs/getRoutes.cjs +11 -18
  38. package/dist/cjs/getRoutes.js +13 -19
  39. package/dist/cjs/getRoutes.js.map +1 -1
  40. package/dist/cjs/getRoutes.native.js +20 -26
  41. package/dist/cjs/getRoutes.native.js.map +2 -2
  42. package/dist/cjs/index.cjs +2 -0
  43. package/dist/cjs/index.js +2 -1
  44. package/dist/cjs/index.js.map +1 -1
  45. package/dist/cjs/index.native.js +3 -1
  46. package/dist/cjs/index.native.js.map +1 -1
  47. package/dist/cjs/router/router.js.map +1 -1
  48. package/dist/cjs/router/router.native.js.map +1 -1
  49. package/dist/cjs/serve-worker.cjs +5 -3
  50. package/dist/cjs/serve-worker.js +3 -3
  51. package/dist/cjs/serve-worker.js.map +1 -1
  52. package/dist/cjs/serve-worker.native.js +3 -3
  53. package/dist/cjs/serve-worker.native.js.map +2 -2
  54. package/dist/cjs/serve.cjs +12 -14
  55. package/dist/cjs/serve.js +12 -13
  56. package/dist/cjs/serve.js.map +1 -1
  57. package/dist/cjs/serve.native.js +12 -13
  58. package/dist/cjs/serve.native.js.map +2 -2
  59. package/dist/cjs/server/createRoutesManifest.js.map +1 -1
  60. package/dist/cjs/server/createRoutesManifest.native.js.map +1 -1
  61. package/dist/cjs/server/getServerManifest.cjs +7 -2
  62. package/dist/cjs/server/getServerManifest.js +7 -2
  63. package/dist/cjs/server/getServerManifest.js.map +1 -1
  64. package/dist/cjs/server/getServerManifest.native.js +23 -3
  65. package/dist/cjs/server/getServerManifest.native.js.map +2 -2
  66. package/dist/cjs/server/oneServe.cjs +82 -83
  67. package/dist/cjs/server/oneServe.js +95 -110
  68. package/dist/cjs/server/oneServe.js.map +2 -2
  69. package/dist/cjs/server/oneServe.native.js +101 -87
  70. package/dist/cjs/server/oneServe.native.js.map +2 -2
  71. package/dist/cjs/utils/getHonoPath.cjs +28 -0
  72. package/dist/cjs/utils/getHonoPath.js +23 -0
  73. package/dist/cjs/utils/getHonoPath.js.map +6 -0
  74. package/dist/cjs/utils/getHonoPath.native.js +28 -0
  75. package/dist/cjs/utils/getHonoPath.native.js.map +6 -0
  76. package/dist/cjs/utils/toAbsolute.cjs +27 -0
  77. package/dist/cjs/utils/toAbsolute.js +22 -0
  78. package/dist/cjs/utils/toAbsolute.js.map +6 -0
  79. package/dist/cjs/utils/toAbsolute.native.js +28 -0
  80. package/dist/cjs/utils/toAbsolute.native.js.map +6 -0
  81. package/dist/cjs/vite/one.cjs +4 -3
  82. package/dist/cjs/vite/one.js +4 -2
  83. package/dist/cjs/vite/one.js.map +1 -1
  84. package/dist/cjs/vite/one.native.js +4 -2
  85. package/dist/cjs/vite/one.native.js.map +2 -2
  86. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.cjs +7 -8
  87. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.js +8 -9
  88. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.js.map +1 -1
  89. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.native.js +8 -7
  90. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.native.js.map +2 -2
  91. package/dist/cjs/vite/resolveResponse.cjs +100 -0
  92. package/dist/cjs/vite/resolveResponse.js +79 -0
  93. package/dist/cjs/vite/resolveResponse.js.map +6 -0
  94. package/dist/cjs/vite/resolveResponse.native.js +94 -0
  95. package/dist/cjs/vite/resolveResponse.native.js.map +6 -0
  96. package/dist/cjs/vite/{headers.cjs → server.cjs} +5 -5
  97. package/dist/cjs/vite/{headers.js → server.js} +6 -6
  98. package/dist/cjs/vite/{headers.js.map → server.js.map} +2 -2
  99. package/dist/cjs/vite/{headers.native.js → server.native.js} +7 -7
  100. package/dist/cjs/vite/{headers.native.js.map → server.native.js.map} +3 -3
  101. package/dist/cjs/vite/types.native.js.map +1 -1
  102. package/dist/cjs/vite.cjs +2 -2
  103. package/dist/cjs/vite.js +2 -2
  104. package/dist/cjs/vite.js.map +1 -1
  105. package/dist/cjs/vite.native.js +3 -3
  106. package/dist/cjs/vite.native.js.map +1 -1
  107. package/dist/esm/Route.js.map +1 -1
  108. package/dist/esm/Route.mjs.map +1 -1
  109. package/dist/esm/Route.native.js.map +1 -1
  110. package/dist/esm/cli/build.js +81 -40
  111. package/dist/esm/cli/build.js.map +1 -1
  112. package/dist/esm/cli/build.mjs +101 -68
  113. package/dist/esm/cli/build.mjs.map +1 -1
  114. package/dist/esm/cli/build.native.js +163 -67
  115. package/dist/esm/cli/build.native.js.map +2 -2
  116. package/dist/esm/cli/{run.js → dev.js} +4 -5
  117. package/dist/esm/cli/dev.js.map +6 -0
  118. package/dist/esm/cli/{run.mjs → dev.mjs} +5 -6
  119. package/dist/esm/cli/dev.mjs.map +1 -0
  120. package/dist/esm/cli/{run.native.js → dev.native.js} +4 -5
  121. package/dist/esm/cli/dev.native.js.map +6 -0
  122. package/dist/esm/cli/main.js +2 -2
  123. package/dist/esm/cli/main.mjs +2 -2
  124. package/dist/esm/cli/main.mjs.map +1 -1
  125. package/dist/esm/cli/main.native.js +2 -2
  126. package/dist/esm/cli/main.native.js.map +1 -1
  127. package/dist/esm/cli.js +2 -6
  128. package/dist/esm/cli.js.map +2 -2
  129. package/dist/esm/cli.mjs +3 -7
  130. package/dist/esm/cli.mjs.map +1 -1
  131. package/dist/esm/cli.native.js +2 -6
  132. package/dist/esm/cli.native.js.map +2 -2
  133. package/dist/esm/constants.js +2 -1
  134. package/dist/esm/constants.js.map +1 -1
  135. package/dist/esm/constants.mjs +3 -2
  136. package/dist/esm/constants.mjs.map +1 -1
  137. package/dist/esm/constants.native.js +2 -1
  138. package/dist/esm/constants.native.js.map +2 -2
  139. package/dist/esm/createHandleRequest.js +130 -81
  140. package/dist/esm/createHandleRequest.js.map +1 -1
  141. package/dist/esm/createHandleRequest.mjs +118 -86
  142. package/dist/esm/createHandleRequest.mjs.map +1 -1
  143. package/dist/esm/createHandleRequest.native.js +148 -95
  144. package/dist/esm/createHandleRequest.native.js.map +2 -2
  145. package/dist/esm/createMiddleware.js +7 -0
  146. package/dist/esm/createMiddleware.js.map +6 -0
  147. package/dist/esm/createMiddleware.mjs +5 -0
  148. package/dist/esm/createMiddleware.mjs.map +1 -0
  149. package/dist/esm/createMiddleware.native.js +7 -0
  150. package/dist/esm/createMiddleware.native.js.map +6 -0
  151. package/dist/esm/getRoutes.js +13 -19
  152. package/dist/esm/getRoutes.js.map +1 -1
  153. package/dist/esm/getRoutes.mjs +12 -18
  154. package/dist/esm/getRoutes.mjs.map +1 -1
  155. package/dist/esm/getRoutes.native.js +20 -25
  156. package/dist/esm/getRoutes.native.js.map +2 -2
  157. package/dist/esm/index.js +2 -0
  158. package/dist/esm/index.js.map +1 -1
  159. package/dist/esm/index.mjs +2 -1
  160. package/dist/esm/index.mjs.map +1 -1
  161. package/dist/esm/index.native.js +2 -0
  162. package/dist/esm/index.native.js.map +2 -2
  163. package/dist/esm/router/router.js.map +1 -1
  164. package/dist/esm/router/router.mjs.map +1 -1
  165. package/dist/esm/router/router.native.js.map +1 -1
  166. package/dist/esm/serve-worker.js +3 -2
  167. package/dist/esm/serve-worker.js.map +1 -1
  168. package/dist/esm/serve-worker.mjs +4 -2
  169. package/dist/esm/serve-worker.mjs.map +1 -1
  170. package/dist/esm/serve-worker.native.js +3 -2
  171. package/dist/esm/serve-worker.native.js.map +2 -2
  172. package/dist/esm/serve.js +12 -13
  173. package/dist/esm/serve.js.map +1 -1
  174. package/dist/esm/serve.mjs +12 -14
  175. package/dist/esm/serve.mjs.map +1 -1
  176. package/dist/esm/serve.native.js +12 -13
  177. package/dist/esm/serve.native.js.map +2 -2
  178. package/dist/esm/server/createRoutesManifest.js.map +1 -1
  179. package/dist/esm/server/createRoutesManifest.mjs.map +1 -1
  180. package/dist/esm/server/createRoutesManifest.native.js.map +1 -1
  181. package/dist/esm/server/getServerManifest.js +7 -2
  182. package/dist/esm/server/getServerManifest.js.map +1 -1
  183. package/dist/esm/server/getServerManifest.mjs +7 -2
  184. package/dist/esm/server/getServerManifest.mjs.map +1 -1
  185. package/dist/esm/server/getServerManifest.native.js +23 -3
  186. package/dist/esm/server/getServerManifest.native.js.map +2 -2
  187. package/dist/esm/server/oneServe.js +100 -110
  188. package/dist/esm/server/oneServe.js.map +1 -1
  189. package/dist/esm/server/oneServe.mjs +82 -83
  190. package/dist/esm/server/oneServe.mjs.map +1 -1
  191. package/dist/esm/server/oneServe.native.js +106 -87
  192. package/dist/esm/server/oneServe.native.js.map +2 -2
  193. package/dist/esm/utils/getHonoPath.js +7 -0
  194. package/dist/esm/utils/getHonoPath.js.map +6 -0
  195. package/dist/esm/utils/getHonoPath.mjs +5 -0
  196. package/dist/esm/utils/getHonoPath.mjs.map +1 -0
  197. package/dist/esm/utils/getHonoPath.native.js +7 -0
  198. package/dist/esm/utils/getHonoPath.native.js.map +6 -0
  199. package/dist/esm/utils/toAbsolute.js +6 -0
  200. package/dist/esm/utils/toAbsolute.js.map +6 -0
  201. package/dist/esm/utils/toAbsolute.mjs +4 -0
  202. package/dist/esm/utils/toAbsolute.mjs.map +1 -0
  203. package/dist/esm/utils/toAbsolute.native.js +8 -0
  204. package/dist/esm/utils/toAbsolute.native.js.map +6 -0
  205. package/dist/esm/vite/one.js +5 -3
  206. package/dist/esm/vite/one.js.map +1 -1
  207. package/dist/esm/vite/one.mjs +4 -3
  208. package/dist/esm/vite/one.mjs.map +1 -1
  209. package/dist/esm/vite/one.native.js +5 -3
  210. package/dist/esm/vite/one.native.js.map +2 -2
  211. package/dist/esm/vite/plugins/fileSystemRouterPlugin.js +7 -9
  212. package/dist/esm/vite/plugins/fileSystemRouterPlugin.js.map +1 -1
  213. package/dist/esm/vite/plugins/fileSystemRouterPlugin.mjs +7 -8
  214. package/dist/esm/vite/plugins/fileSystemRouterPlugin.mjs.map +1 -1
  215. package/dist/esm/vite/plugins/fileSystemRouterPlugin.native.js +7 -7
  216. package/dist/esm/vite/plugins/fileSystemRouterPlugin.native.js.map +2 -2
  217. package/dist/esm/vite/resolveResponse.js +64 -0
  218. package/dist/esm/vite/resolveResponse.js.map +6 -0
  219. package/dist/esm/vite/resolveResponse.mjs +76 -0
  220. package/dist/esm/vite/resolveResponse.mjs.map +1 -0
  221. package/dist/esm/vite/resolveResponse.native.js +73 -0
  222. package/dist/esm/vite/resolveResponse.native.js.map +6 -0
  223. package/dist/esm/vite/{headers.js → server.js} +3 -3
  224. package/dist/esm/vite/{headers.js.map → server.js.map} +2 -2
  225. package/dist/esm/vite/{headers.mjs → server.mjs} +3 -3
  226. package/dist/esm/vite/server.mjs.map +1 -0
  227. package/dist/esm/vite/{headers.native.js → server.native.js} +3 -3
  228. package/dist/esm/vite/{headers.native.js.map → server.native.js.map} +3 -3
  229. package/dist/esm/vite.js +2 -2
  230. package/dist/esm/vite.js.map +1 -1
  231. package/dist/esm/vite.mjs +2 -2
  232. package/dist/esm/vite.mjs.map +1 -1
  233. package/dist/esm/vite.native.js +2 -2
  234. package/dist/esm/vite.native.js.map +2 -2
  235. package/package.json +14 -13
  236. package/src/Route.tsx +2 -0
  237. package/src/cli/build.ts +113 -54
  238. package/src/cli/{run.ts → dev.ts} +1 -2
  239. package/src/cli/main.ts +2 -2
  240. package/src/cli.ts +2 -6
  241. package/src/constants.ts +2 -1
  242. package/src/createHandleRequest.ts +210 -126
  243. package/src/createMiddleware.ts +14 -0
  244. package/src/getRoutes.ts +27 -41
  245. package/src/index.ts +3 -0
  246. package/src/router/router.ts +1 -0
  247. package/src/serve-worker.ts +7 -2
  248. package/src/serve.ts +13 -14
  249. package/src/server/createRoutesManifest.ts +7 -0
  250. package/src/server/getServerManifest.ts +16 -0
  251. package/src/server/oneServe.ts +144 -150
  252. package/src/types.ts +0 -4
  253. package/src/utils/getHonoPath.ts +17 -0
  254. package/src/utils/toAbsolute.ts +3 -0
  255. package/src/vite/one.ts +13 -5
  256. package/src/vite/plugins/fileSystemRouterPlugin.tsx +8 -15
  257. package/src/vite/resolveResponse.ts +93 -0
  258. package/src/vite/{headers.native.ts → server.native.ts} +1 -1
  259. package/src/vite/{headers.ts → server.ts} +1 -1
  260. package/src/vite/types.ts +12 -6
  261. package/src/vite.ts +1 -1
  262. package/types/Route.d.ts +2 -0
  263. package/types/Route.d.ts.map +1 -1
  264. package/types/cli/build.d.ts.map +1 -1
  265. package/types/cli/{run.d.ts → dev.d.ts} +2 -2
  266. package/types/cli/{run.d.ts.map → dev.d.ts.map} +1 -1
  267. package/types/constants.d.ts +1 -0
  268. package/types/constants.d.ts.map +1 -1
  269. package/types/createHandleRequest.d.ts +19 -6
  270. package/types/createHandleRequest.d.ts.map +1 -1
  271. package/types/createMiddleware.d.ts +12 -0
  272. package/types/createMiddleware.d.ts.map +1 -0
  273. package/types/getRoutes.d.ts +0 -3
  274. package/types/getRoutes.d.ts.map +1 -1
  275. package/types/index.d.ts +1 -0
  276. package/types/index.d.ts.map +1 -1
  277. package/types/layouts/Drawer.d.ts +2 -2
  278. package/types/layouts/Stack.d.ts +2 -2
  279. package/types/layouts/Tabs.d.ts +2 -2
  280. package/types/router/router.d.ts.map +1 -1
  281. package/types/serve-worker.d.ts +2 -1
  282. package/types/serve-worker.d.ts.map +1 -1
  283. package/types/serve.d.ts.map +1 -1
  284. package/types/server/createRoutesManifest.d.ts +6 -0
  285. package/types/server/createRoutesManifest.d.ts.map +1 -1
  286. package/types/server/getServerManifest.d.ts +2 -0
  287. package/types/server/getServerManifest.d.ts.map +1 -1
  288. package/types/server/oneServe.d.ts +1 -2
  289. package/types/server/oneServe.d.ts.map +1 -1
  290. package/types/types.d.ts +0 -2
  291. package/types/types.d.ts.map +1 -1
  292. package/types/utils/getHonoPath.d.ts +2 -0
  293. package/types/utils/getHonoPath.d.ts.map +1 -0
  294. package/types/utils/toAbsolute.d.ts +2 -0
  295. package/types/utils/toAbsolute.d.ts.map +1 -0
  296. package/types/vite/one.d.ts.map +1 -1
  297. package/types/vite/plugins/fileSystemRouterPlugin.d.ts.map +1 -1
  298. package/types/vite/resolveResponse.d.ts +3 -0
  299. package/types/vite/resolveResponse.d.ts.map +1 -0
  300. package/types/vite/{headers.d.ts → server.d.ts} +2 -2
  301. package/types/vite/server.d.ts.map +1 -0
  302. package/types/vite/{headers.native.d.ts → server.native.d.ts} +2 -2
  303. package/types/vite/server.native.d.ts.map +1 -0
  304. package/types/vite/types.d.ts +11 -5
  305. package/types/vite/types.d.ts.map +1 -1
  306. package/types/vite.d.ts +1 -1
  307. package/types/vite.d.ts.map +1 -1
  308. package/dist/cjs/cli/run.js.map +0 -6
  309. package/dist/cjs/cli/run.native.js.map +0 -6
  310. package/dist/cjs/vite/resolveAPIRequest.cjs +0 -90
  311. package/dist/cjs/vite/resolveAPIRequest.js +0 -71
  312. package/dist/cjs/vite/resolveAPIRequest.js.map +0 -6
  313. package/dist/cjs/vite/resolveAPIRequest.native.js +0 -84
  314. package/dist/cjs/vite/resolveAPIRequest.native.js.map +0 -6
  315. package/dist/esm/cli/run.js.map +0 -6
  316. package/dist/esm/cli/run.mjs.map +0 -1
  317. package/dist/esm/cli/run.native.js.map +0 -6
  318. package/dist/esm/vite/headers.mjs.map +0 -1
  319. package/dist/esm/vite/resolveAPIRequest.js +0 -56
  320. package/dist/esm/vite/resolveAPIRequest.js.map +0 -6
  321. package/dist/esm/vite/resolveAPIRequest.mjs +0 -67
  322. package/dist/esm/vite/resolveAPIRequest.mjs.map +0 -1
  323. package/dist/esm/vite/resolveAPIRequest.native.js +0 -64
  324. package/dist/esm/vite/resolveAPIRequest.native.js.map +0 -6
  325. package/src/vite/resolveAPIRequest.ts +0 -86
  326. package/types/vite/headers.d.ts.map +0 -1
  327. package/types/vite/headers.native.d.ts.map +0 -1
  328. package/types/vite/resolveAPIRequest.d.ts +0 -2
  329. package/types/vite/resolveAPIRequest.d.ts.map +0 -1
@@ -21,12 +21,14 @@ export type OneRouterServerManifestV1Route<TRegex = string> = {
21
21
  namedRegex: TRegex
22
22
  generated?: boolean
23
23
  layouts?: RouteNode[]
24
+ middlewares?: RouteNode[]
24
25
  type: One.RouteType
25
26
  isNotFound?: boolean
26
27
  }
27
28
 
28
29
  export type OneRouterServerManifestV1<TRegex = string> = {
29
30
  apiRoutes: OneRouterServerManifestV1Route<TRegex>[]
31
+ middlewareRoutes: OneRouterServerManifestV1Route<TRegex>[]
30
32
  pageRoutes: OneRouterServerManifestV1Route<TRegex>[]
31
33
  }
32
34
 
@@ -96,19 +98,32 @@ export function getServerManifest(route: RouteNode): OneRouterServerManifestV1 {
96
98
  }
97
99
 
98
100
  const apiRoutes: OneRouterServerManifestV1Route[] = []
101
+ const middlewareRoutes: OneRouterServerManifestV1Route[] = []
99
102
  const pageRoutes: OneRouterServerManifestV1Route[] = []
100
103
 
104
+ const addedMiddlewares: Record<string, boolean> = {}
105
+
101
106
  for (const [path, node] of flat) {
102
107
  if (node.type === 'api') {
103
108
  apiRoutes.push(getGeneratedNamedRouteRegex(path, node))
104
109
  continue
105
110
  }
106
111
 
112
+ if (node.middlewares?.length) {
113
+ for (const middleware of node.middlewares) {
114
+ if (!addedMiddlewares[middleware.contextKey]) {
115
+ addedMiddlewares[middleware.contextKey] = true
116
+ middlewareRoutes.push(getGeneratedNamedRouteRegex(path, middleware))
117
+ }
118
+ }
119
+ }
120
+
107
121
  pageRoutes.push(getGeneratedNamedRouteRegex(path, node))
108
122
  }
109
123
 
110
124
  return {
111
125
  apiRoutes,
126
+ middlewareRoutes,
112
127
  pageRoutes,
113
128
  }
114
129
  }
@@ -136,6 +151,7 @@ function getNamedRouteRegex(
136
151
  namedRegex: result.namedRegex,
137
152
  routeKeys: result.routeKeys,
138
153
  layouts: node.layouts,
154
+ middlewares: node.middlewares,
139
155
  }
140
156
  }
141
157
 
@@ -1,24 +1,29 @@
1
- import type { Hono } from 'hono'
2
- import { join } from 'node:path'
3
- import type { VXRNOptions } from 'vxrn'
1
+ import type { Hono, MiddlewareHandler } from 'hono'
2
+ import type { BlankEnv } from 'hono/types'
3
+ import { extname, join } from 'node:path'
4
4
  import { getServerEntry } from 'vxrn/serve'
5
+ import { getPathFromLoaderPath } from '../cleanUrl'
6
+ import { LOADER_JS_POSTFIX_UNCACHED } from '../constants'
7
+ import { compileManifest, getURLfromRequestURL, type RequestHandlers } from '../createHandleRequest'
5
8
  import type { RenderAppProps } from '../types'
9
+ import { toAbsolute } from '../utils/toAbsolute'
6
10
  import type { One } from '../vite/types'
11
+ import type { RouteInfoCompiled } from './createRoutesManifest'
12
+ import { default as FSExtra } from 'fs-extra'
7
13
 
8
14
  export async function oneServe(
9
15
  oneOptions: One.PluginOptions,
10
- vxrnOptions: VXRNOptions,
11
16
  buildInfo: One.BuildInfo,
12
17
  app: Hono,
13
18
  serveStatic = true
14
19
  ) {
15
- const { createHandleRequest } = await import('../createHandleRequest')
20
+ const { resolveAPIRoute, resolveLoaderRoute, resolvePageRoute } = await import(
21
+ '../createHandleRequest'
22
+ )
16
23
  const { isResponse } = await import('../utils/isResponse')
17
24
  const { isStatusRedirect } = await import('../utils/isStatus')
18
- const { resolveAPIRequest } = await import('../vite/resolveAPIRequest')
19
25
 
20
26
  const isAPIRequest = new WeakMap<any, boolean>()
21
- const root = vxrnOptions.root || '.'
22
27
 
23
28
  // add redirects
24
29
  const redirects = oneOptions.web?.redirects
@@ -38,25 +43,11 @@ export async function oneServe(
38
43
  throw new Error(`No build info found, have you run build?`)
39
44
  }
40
45
 
41
- const { routeMap, builtRoutes } = buildInfo as One.BuildInfo
42
-
43
- const routeToBuildInfo: Record<string, One.RouteBuildInfo> = {}
44
- for (const route of builtRoutes) {
45
- routeToBuildInfo[route.cleanPath] = route
46
-
47
- // temp - make it back into brackets style
48
- const bracketRoutePath = route.cleanPath
49
- .split('/')
50
- .map((part) => {
51
- return part[0] === ':' ? `[${part.slice(1)}]` : part
52
- })
53
- .join('/')
54
- routeToBuildInfo[bracketRoutePath] = route
55
- }
46
+ const { routeToBuildInfo, routeMap } = buildInfo as One.BuildInfo
56
47
 
57
48
  const serverOptions = {
58
49
  ...oneOptions,
59
- root,
50
+ root: '.',
60
51
  }
61
52
 
62
53
  const entryServer = getServerEntry(serverOptions)
@@ -65,152 +56,155 @@ export async function oneServe(
65
56
  const render = entry.default.render as (props: RenderAppProps) => any
66
57
  const apiCJS = oneOptions.build?.api?.outputFormat === 'cjs'
67
58
 
68
- const handleRequest = createHandleRequest(
69
- {},
70
- {
71
- async handleAPI({ route, request, loaderProps }) {
72
- const apiFile = join(
73
- process.cwd(),
74
- 'dist',
75
- 'api',
76
- route.page.replace('[', '_').replace(']', '_') + (apiCJS ? '.cjs' : '.js')
77
- )
59
+ const requestHandlers: RequestHandlers = {
60
+ async handleAPI({ route }) {
61
+ const apiFile = join(
62
+ process.cwd(),
63
+ 'dist',
64
+ 'api',
65
+ route.page.replace('[', '_').replace(']', '_') + (apiCJS ? '.cjs' : '.js')
66
+ )
67
+ return await import(apiFile)
68
+ },
69
+
70
+ async loadMiddleware(route) {
71
+ return await import(toAbsolute(route.contextKey))
72
+ },
73
+
74
+ async handlePage({ route, url, loaderProps }) {
75
+ if (route.type === 'ssr') {
76
+ const buildInfo = routeToBuildInfo[route.page]
77
+
78
+ if (!buildInfo) {
79
+ throw new Error(
80
+ `No buildinfo found for ${url}, route: ${route.page}, in keys: ${Object.keys(routeToBuildInfo)}`
81
+ )
82
+ }
78
83
 
79
- isAPIRequest.set(request, true)
84
+ try {
85
+ const exported = await import(toAbsolute(buildInfo.serverJsPath))
86
+ const loaderData = await exported.loader?.(loaderProps)
87
+ const preloads = buildInfo.preloads
80
88
 
81
- return resolveAPIRequest(
82
- async () => {
83
- try {
84
- return await import(apiFile)
85
- } catch (err) {
86
- console.error(`\n [one] Error importing API route at ${apiFile}:
89
+ const headers = new Headers()
90
+ headers.set('content-type', 'text/html')
87
91
 
88
- ${err}
92
+ const rendered = await render({
93
+ loaderData,
94
+ loaderProps,
95
+ path: loaderProps?.path || '/',
96
+ preloads,
97
+ })
89
98
 
90
- If this is an import error, you can likely fix this by adding this dependency to
91
- the "optimizeDeps.include" array in your vite.config.ts.
99
+ return new Response(rendered, {
100
+ headers,
101
+ status: route.isNotFound ? 404 : 200,
102
+ })
103
+ } catch (err) {
104
+ console.error(`[one] Error rendering SSR route ${route.page}
92
105
 
93
- 🐞 For a better error message run "node" and enter:
106
+ ${err?.['stack'] ?? err}
94
107
 
95
- import('${apiFile}')\n\n`)
96
- return {}
97
- }
98
- },
99
- request,
100
- loaderProps?.params || {}
101
- )
102
- },
103
-
104
- async handleSSR({ route, url, loaderProps }) {
105
- if (route.type === 'ssr') {
106
- const buildInfo = routeToBuildInfo[route.page]
107
- if (!buildInfo) {
108
- throw new Error(
109
- `No buildinfo found for ${url}, route: ${route.page}, in keys: ${Object.keys(routeToBuildInfo)}`
110
- )
111
- }
112
-
113
- try {
114
- const exported = await import(buildInfo.serverJsPath)
115
- const loaderData = await exported.loader?.(loaderProps)
116
- const preloads = buildInfo.preloads
117
-
118
- const headers = new Headers()
119
- headers.set('content-type', 'text/html')
120
-
121
- return new Response(
122
- await render({
123
- loaderData,
124
- loaderProps,
125
- path: loaderProps?.path || '/',
126
- preloads,
127
- }),
128
- {
129
- headers,
130
- }
131
- )
132
- } catch (err) {
133
- console.error(`[one] Error rendering SSR route ${route.page}
134
-
135
- ${err?.['stack'] ?? err}
136
-
137
- url: ${url}`)
138
- }
108
+ url: ${url}`)
139
109
  }
140
- },
141
- }
142
- )
143
-
144
- // preload reading in all the files, for prod performance:
145
- const htmlFiles: Record<string, string> = {}
146
-
147
- if (serveStatic) {
148
- const { readFile } = await import('node:fs/promises')
149
-
150
- for (const key in routeMap) {
151
- const info = routeToBuildInfo[key]
110
+ } else {
111
+ const htmlPath = routeMap[route['honoPath']]
112
+ if (htmlPath) {
113
+ const html = await FSExtra.readFile(
114
+ join('dist/client', routeMap[route['honoPath']]),
115
+ 'utf-8'
116
+ )
117
+ const headers = new Headers()
118
+ headers.set('content-type', 'text/html')
119
+ return new Response(html, { headers, status: route.isNotFound ? 404 : 200 })
120
+ }
121
+ }
122
+ },
123
+ }
152
124
 
153
- if (info?.type === 'ssr') {
154
- // we handle this on each request
155
- continue
125
+ function createHonoHandler(route: RouteInfoCompiled): MiddlewareHandler<BlankEnv, never, {}> {
126
+ return async (context, next) => {
127
+ // assets we ignore
128
+ if (extname(context.req.path)) {
129
+ return await next()
156
130
  }
157
131
 
158
- htmlFiles[key] = await readFile(join('dist/client', routeMap[key]), 'utf-8')
159
- }
160
- }
132
+ try {
133
+ const request = context.req.raw
134
+ const url = getURLfromRequestURL(request)
161
135
 
162
- app.use(async (context, next) => {
163
- // serve our generated html files
164
- const html = htmlFiles[context.req.path]
165
- if (html) {
166
- return context.html(html)
167
- }
136
+ const response = await (() => {
137
+ // where to put this best? can likely be after some of the switch?
138
+ if (url.pathname.endsWith(LOADER_JS_POSTFIX_UNCACHED)) {
139
+ const originalUrl = getPathFromLoaderPath(url.pathname)
140
+ const finalUrl = new URL(originalUrl, url.origin)
141
+ return resolveLoaderRoute(requestHandlers, request, finalUrl, route)
142
+ }
168
143
 
169
- try {
170
- const request = context.req.raw
171
- const response = await handleRequest.handler(request)
172
-
173
- if (response) {
174
- if (isResponse(response)) {
175
- if (isStatusRedirect(response.status)) {
176
- const location = `${response.headers.get('location') || ''}`
177
- response.headers.forEach((value, key) => {
178
- context.header(key, value)
179
- })
180
- return context.redirect(location, response.status)
144
+ switch (route.type) {
145
+ case 'api': {
146
+ return resolveAPIRoute(requestHandlers, request, url, route)
147
+ }
148
+ case 'ssg':
149
+ case 'spa':
150
+ case 'ssr': {
151
+ return resolvePageRoute(requestHandlers, request, url, route)
152
+ }
181
153
  }
154
+ })()
155
+
156
+ if (response) {
157
+ if (isResponse(response)) {
158
+ // const cloned = response.clone()
159
+
160
+ if (isStatusRedirect(response.status)) {
161
+ const location = `${response.headers.get('location') || ''}`
162
+ response.headers.forEach((value, key) => {
163
+ context.header(key, value)
164
+ })
165
+ return context.redirect(location, response.status)
166
+ }
182
167
 
183
- if (isAPIRequest.get(request)) {
184
- try {
185
- // don't cache api requests by default
186
- response.headers.set('Cache-Control', 'no-store')
187
- } catch (err) {
188
- console.info(
189
- `Error udpating cache header on api route "${
190
- context.req.path
191
- }" to no-store, it is ${response.headers.get('cache-control')}, continue`,
192
- err
193
- )
168
+ if (isAPIRequest.get(request)) {
169
+ try {
170
+ // don't cache api requests by default
171
+ response.headers.set('Cache-Control', 'no-store')
172
+ return response
173
+ } catch (err) {
174
+ console.info(
175
+ `Error udpating cache header on api route "${
176
+ context.req.path
177
+ }" to no-store, it is ${response.headers.get('cache-control')}, continue`,
178
+ err
179
+ )
180
+ }
194
181
  }
182
+
183
+ return response as Response
195
184
  }
196
185
 
197
- return response as Response
186
+ return await next()
198
187
  }
199
-
200
- return context.json(
201
- response,
202
- 200,
203
- isAPIRequest.get(request)
204
- ? {
205
- 'Cache-Control': 'no-store',
206
- }
207
- : undefined
208
- )
188
+ } catch (err) {
189
+ console.error(` [one] Error handling request: ${(err as any)['stack']}`)
209
190
  }
210
- } catch (err) {
211
- console.error(` [one] Error handling request: ${(err as any)['stack']}`)
191
+
192
+ return await next()
212
193
  }
194
+ }
213
195
 
214
- await next()
215
- })
196
+ const compiledManifest = compileManifest(buildInfo.manifest)
197
+
198
+ for (const route of compiledManifest.apiRoutes) {
199
+ app.get(route.honoPath, createHonoHandler(route))
200
+ app.put(route.honoPath, createHonoHandler(route))
201
+ app.post(route.honoPath, createHonoHandler(route))
202
+ app.delete(route.honoPath, createHonoHandler(route))
203
+ app.patch(route.honoPath, createHonoHandler(route))
204
+ }
205
+
206
+ for (const route of compiledManifest.pageRoutes) {
207
+ console.log('add', route.honoPath)
208
+ app.get(route.honoPath, createHonoHandler(route))
209
+ }
216
210
  }
package/src/types.ts CHANGED
@@ -12,10 +12,6 @@ export type Options = {
12
12
  preserveApiRoutes?: boolean
13
13
  ignoreRequireErrors?: boolean
14
14
  ignoreEntryPoints?: boolean
15
- /* Used to simplify testing for toEqual() comparison */
16
- internal_stripLoadRoute?: boolean
17
- /* Used to simplify by skipping the generated routes */
18
- skipGenerated?: boolean
19
15
  importMode?: string
20
16
  platformRoutes?: boolean
21
17
  platform?: string
@@ -0,0 +1,17 @@
1
+ export function getHonoPath(page: string) {
2
+ return (
3
+ page
4
+ // /(param) => (empty)
5
+ .replaceAll(/\/\(([^\)]+)\)/gi, '')
6
+ // [...params] => *
7
+ .replace(/\[...([^\]]+)\]/gi, '*')
8
+ // [param] => :param
9
+ .replaceAll(/\[([^\]]+)\]/gi, ':$1')
10
+ // +not-found => *
11
+ .replace('+not-found', '*')
12
+ // /index => /
13
+ .replace(/\/index$/, '/')
14
+ // remove trailing / for non / paths
15
+ .replace(/.+\/$/, '')
16
+ )
17
+ }
@@ -0,0 +1,3 @@
1
+ import { resolve } from 'node:path'
2
+
3
+ export const toAbsolute = (p: string) => resolve(process.cwd(), p)
package/src/vite/one.ts CHANGED
@@ -2,6 +2,7 @@ import { resolvePath } from '@vxrn/resolve'
2
2
  import events from 'node:events'
3
3
  import path, { dirname, resolve } from 'node:path'
4
4
  import type { Plugin, PluginOption, UserConfig } from 'vite'
5
+ import { barrel } from 'vite-plugin-barrel'
5
6
  import tsconfigPaths from 'vite-tsconfig-paths'
6
7
  import {
7
8
  autoPreBundleDepsForSsrPlugin,
@@ -21,10 +22,9 @@ import { fixDependenciesPlugin } from './plugins/fixDependenciesPlugin'
21
22
  import { generateFileSystemRouteTypesPlugin } from './plugins/generateFileSystemRouteTypesPlugin'
22
23
  import { createReactCompilerPlugin } from './plugins/reactCompilerPlugin'
23
24
  import { SSRCSSPlugin } from './plugins/SSRCSSPlugin'
24
- import { createVirtualEntry } from './plugins/virtualEntryPlugin'
25
25
  import { virtualEntryId } from './plugins/virtualEntryConstants'
26
+ import { createVirtualEntry } from './plugins/virtualEntryPlugin'
26
27
  import type { One } from './types'
27
- import { barrel } from 'vite-plugin-barrel'
28
28
 
29
29
  /**
30
30
  * This needs a big refactor!
@@ -38,16 +38,24 @@ events.setMaxListeners(1_000)
38
38
  // temporary for tamagui plugin compat
39
39
  globalThis.__vxrnEnableNativeEnv = true
40
40
 
41
+ // temporary until we fix double-load issue, which means we'd have to somehow
42
+ // not control the port/host from our config, but still pass it into ENV
43
+ // until then we want to avoid double loading everything on first start
44
+
41
45
  export function one(options: One.PluginOptions = {}): PluginOption {
42
- setOneOptions(options)
46
+ if (!globalThis.__oneOptions) {
47
+ // first load we are just loading it ourselves to get the user options
48
+ // so we can just set here and return nothing
49
+ setOneOptions(options)
50
+ globalThis['__vxrnPluginConfig__'] = options
51
+ return []
52
+ }
43
53
 
44
54
  // ensure tsconfig
45
55
  if (options.config?.ensureTSConfig !== false) {
46
56
  void ensureTSConfig()
47
57
  }
48
58
 
49
- globalThis['__vxrnPluginConfig__'] = options
50
-
51
59
  // build is superset for now
52
60
  const { optimizeDeps } = getOptimizeDeps('build')
53
61
  const optimizeIds = optimizeDeps.include
@@ -10,7 +10,6 @@ import { isStatusRedirect } from '../../utils/isStatus'
10
10
  import { promiseWithResolvers } from '../../utils/promiseWithResolvers'
11
11
  import { LoaderDataCache } from '../../vite/constants'
12
12
  import { replaceLoader } from '../../vite/replaceLoader'
13
- import { resolveAPIRequest } from '../../vite/resolveAPIRequest'
14
13
  import type { One } from '../../vite/types'
15
14
  import { virtalEntryIdClient, virtualEntryId } from './virtualEntryConstants'
16
15
 
@@ -28,8 +27,8 @@ export function createFileSystemRouterPlugin(options: One.PluginOptions): Plugin
28
27
  let renderPromise: Promise<void> | null = null
29
28
 
30
29
  function createRequestHandler() {
31
- return createHandleRequest(options, {
32
- async handleSSR({ route, url, loaderProps }) {
30
+ return createHandleRequest({
31
+ async handlePage({ route, url, loaderProps }) {
33
32
  console.info(` ⓵ [${route.type}] ${url} resolved to ${route.file}`)
34
33
 
35
34
  if (route.type === 'spa') {
@@ -142,12 +141,7 @@ export function createFileSystemRouterPlugin(options: One.PluginOptions): Plugin
142
141
  throw new Error(`No transformed js returned`)
143
142
  }
144
143
 
145
- // if (!transformedJS.includes('loader')) {
146
- // return `console.log("hi")`
147
- // }
148
-
149
144
  const exported = await runner.import(routeFile)
150
-
151
145
  const loaderData = await exported.loader?.(loaderProps)
152
146
 
153
147
  if (loaderData) {
@@ -177,13 +171,12 @@ export function createFileSystemRouterPlugin(options: One.PluginOptions): Plugin
177
171
  return transformedJS
178
172
  },
179
173
 
180
- async handleAPI({ request, route, url, loaderProps }) {
181
- const result = await resolveAPIRequest(
182
- () => runner.import(join('app', route.file)),
183
- request,
184
- loaderProps?.params || {}
185
- )
186
- return result
174
+ async handleAPI({ route }) {
175
+ return await runner.import(join('app', route.file))
176
+ },
177
+
178
+ async loadMiddleware(route) {
179
+ return await runner.import(join('app', route.contextKey))
187
180
  },
188
181
  })
189
182
  }
@@ -0,0 +1,93 @@
1
+ import { isResponse } from '../utils/isResponse'
2
+ import { asyncHeadersCache, mergeHeaders, requestAsyncLocalStore } from './server'
3
+
4
+ export function resolveResponse(getResponse: () => Promise<Response>) {
5
+ return new Promise<Response>((res, rej) => {
6
+ const id = { _id: Math.random() }
7
+ requestAsyncLocalStore.run(id, async () => {
8
+ try {
9
+ const response = await getResponse()
10
+ const modifiedResponse = await getResponseWithAddedHeaders(response, id)
11
+ res(modifiedResponse)
12
+ } catch (err) {
13
+ // allow throwing a response
14
+ if (isResponse(err)) {
15
+ res(err)
16
+ } else {
17
+ rej(err) // reject the promise on any other error
18
+ }
19
+ }
20
+ })
21
+ })
22
+ }
23
+
24
+ export function resolveAPIEndpoint(
25
+ // this is the result of importing the file:
26
+ runEndpoint: () => Promise<any>,
27
+ request: Request,
28
+ params: Record<string, string>
29
+ ) {
30
+ return resolveResponse(async () => {
31
+ const imported = await runEndpoint()
32
+ const requestType = request.method || 'GET'
33
+ const handler = imported[requestType] || imported.default
34
+ if (!handler) {
35
+ console.warn(`No handler found for request ${requestType}`)
36
+ return
37
+ }
38
+ return await handler(request, { params })
39
+ })
40
+ }
41
+
42
+ async function getResponseWithAddedHeaders(response: any, id: Object) {
43
+ const asyncHeaders = asyncHeadersCache.get(id)
44
+
45
+ if (asyncHeaders) {
46
+ try {
47
+ if (response instanceof Response) {
48
+ mergeHeaders(response.headers, asyncHeaders)
49
+ } else {
50
+ if (response && typeof response === 'object') {
51
+ response = Response.json(response, { headers: asyncHeaders })
52
+ } else {
53
+ response = new Response(response as any, { headers: asyncHeaders })
54
+ }
55
+ }
56
+ } catch (err) {
57
+ if (`${err}`.includes('immutable')) {
58
+ // we have to create a new response
59
+ const body = response.body ? await streamToString(response.body) : ''
60
+ response = new Response(body, {
61
+ headers: response.headers,
62
+ status: response.status,
63
+ statusText: response.statusText,
64
+ })
65
+ mergeHeaders(response.headers, asyncHeaders)
66
+ } else {
67
+ console.error(` [one] error adding headers: ${err}`)
68
+ }
69
+ }
70
+ }
71
+
72
+ return response
73
+ }
74
+
75
+ async function streamToString(stream: ReadableStream) {
76
+ const reader = stream.getReader()
77
+ const decoder = new TextDecoder()
78
+ let result = ''
79
+
80
+ try {
81
+ while (true) {
82
+ const { done, value } = await reader.read()
83
+ if (done) break
84
+ result += decoder.decode(value, { stream: true })
85
+ }
86
+ } catch (error) {
87
+ console.error('Error reading the stream:', error)
88
+ } finally {
89
+ reader.releaseLock()
90
+ }
91
+
92
+ return result
93
+ }
@@ -4,6 +4,6 @@ export const asyncHeadersCache = new WeakMap<any, Headers>()
4
4
 
5
5
  // TODO move this to `RequestContext.setHeaders()`
6
6
 
7
- export async function setCurrentRequestHeaders(cb: (headers: Headers) => void) {}
7
+ export async function setResponseHeaders(cb: (headers: Headers) => void) {}
8
8
 
9
9
  export function mergeHeaders(onto: Headers, from: Headers) {}
@@ -16,7 +16,7 @@ globalThis['__vxrnasyncHeadersCache'] ||= asyncHeadersCache
16
16
 
17
17
  // TODO move this to `RequestContext.setHeaders()`
18
18
 
19
- export async function setCurrentRequestHeaders(cb: (headers: Headers) => void) {
19
+ export async function setResponseHeaders(cb: (headers: Headers) => void) {
20
20
  const id = requestAsyncLocalStore.getStore()
21
21
 
22
22
  if (!id) {