one 1.1.381 → 1.1.383

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 +100 -69
  4. package/dist/cjs/cli/build.js +83 -41
  5. package/dist/cjs/cli/build.js.map +2 -2
  6. package/dist/cjs/cli/build.native.js +161 -68
  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 +86 -84
  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 +102 -89
  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 -38
  111. package/dist/esm/cli/build.js.map +1 -1
  112. package/dist/esm/cli/build.mjs +98 -67
  113. package/dist/esm/cli/build.mjs.map +1 -1
  114. package/dist/esm/cli/build.native.js +160 -66
  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 +86 -84
  190. package/dist/esm/server/oneServe.mjs.map +1 -1
  191. package/dist/esm/server/oneServe.native.js +107 -89
  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 +110 -53
  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 +141 -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
@@ -1,11 +1,20 @@
1
1
  import { getPathFromLoaderPath } from './cleanUrl'
2
2
  import { LOADER_JS_POSTFIX_UNCACHED } from './constants'
3
- import type { RouteInfo } from './server/createRoutesManifest'
3
+ import type { Middleware, MiddlewareContext } from './createMiddleware'
4
+ import type { RouteNode } from './Route'
5
+ import type { RouteInfo, RouteInfoCompiled } from './server/createRoutesManifest'
4
6
  import type { LoaderProps } from './types'
7
+ import { getHonoPath } from './utils/getHonoPath'
5
8
  import { isResponse } from './utils/isResponse'
6
- import { promiseWithResolvers } from './utils/promiseWithResolvers'
7
9
  import { getManifest } from './vite/getManifest'
8
- import type { One } from './vite/types'
10
+ import { resolveAPIEndpoint, resolveResponse } from './vite/resolveResponse'
11
+
12
+ export type RequestHandlers = {
13
+ handlePage?: (props: RequestHandlerProps) => Promise<any>
14
+ handleLoader?: (props: RequestHandlerProps) => Promise<any>
15
+ handleAPI?: (props: RequestHandlerProps) => Promise<any>
16
+ loadMiddleware?: (route: RouteNode) => Promise<any>
17
+ }
9
18
 
10
19
  type RequestHandlerProps<RouteExtraProps extends Object = {}> = {
11
20
  request: Request
@@ -16,83 +25,213 @@ type RequestHandlerProps<RouteExtraProps extends Object = {}> = {
16
25
 
17
26
  type RequestHandlerResponse = null | string | Response
18
27
 
19
- export function createHandleRequest(
20
- options: One.PluginOptions,
21
- handlers: {
22
- handleSSR?: (props: RequestHandlerProps) => Promise<any>
23
- handleLoader?: (props: RequestHandlerProps) => Promise<any>
24
- handleAPI?: (props: RequestHandlerProps) => Promise<any>
28
+ async function runMiddlewares(
29
+ handlers: RequestHandlers,
30
+ request: Request,
31
+ route: RouteInfo,
32
+ getResponse: () => Promise<Response>
33
+ ): Promise<Response> {
34
+ const middlewares = route.middlewares
35
+
36
+ if (!middlewares?.length) {
37
+ return await getResponse()
25
38
  }
39
+ if (!handlers.loadMiddleware) {
40
+ throw new Error(`No middleware handler configured`)
41
+ }
42
+
43
+ const context: MiddlewareContext = {}
44
+ async function dispatch(index: number): Promise<Response> {
45
+ const middlewareModule = middlewares![index]
46
+
47
+ // no more middlewares, finish
48
+ if (!middlewareModule) {
49
+ return await getResponse()
50
+ }
51
+
52
+ const exported = (await handlers.loadMiddleware!(middlewareModule))?.default as
53
+ | Middleware
54
+ | undefined
55
+ if (!exported) {
56
+ throw new Error(`No valid export found in middleware: ${middlewareModule.contextKey}`)
57
+ }
58
+
59
+ // go to next middlware
60
+ const next = async () => {
61
+ return dispatch(index + 1)
62
+ }
63
+
64
+ // run middlewares, if response returned, exit early
65
+ const response = await exported({ request, next, context })
66
+ if (response) {
67
+ return response
68
+ }
69
+
70
+ // If the middleware returns null/void, keep going
71
+ return dispatch(index + 1)
72
+ }
73
+
74
+ // Start with the first middleware (index 0).
75
+ return dispatch(0)
76
+ }
77
+
78
+ export async function resolveAPIRoute(
79
+ handlers: RequestHandlers,
80
+ request: Request,
81
+ url: URL,
82
+ route: RouteInfoCompiled
26
83
  ) {
27
- const manifest = getManifest()
28
- if (!manifest) {
29
- throw new Error(`No routes manifest`)
84
+ const { pathname } = url
85
+ const params = getRouteParams(pathname, route)
86
+
87
+ try {
88
+ return resolveAPIEndpoint(
89
+ () =>
90
+ handlers.handleAPI!({
91
+ request,
92
+ route,
93
+ url,
94
+ loaderProps: {
95
+ path: pathname,
96
+ params,
97
+ },
98
+ }),
99
+ request,
100
+ params || {}
101
+ )
102
+ } catch (err) {
103
+ if (isResponse(err)) {
104
+ return err
105
+ }
106
+
107
+ if (process.env.NODE_ENV === 'development') {
108
+ console.error(`\n [one] Error importing API route at ${pathname}:
109
+
110
+ ${err}
111
+
112
+ If this is an import error, you can likely fix this by adding this dependency to
113
+ the "optimizeDeps.include" array in your vite.config.ts.
114
+ `)
115
+ }
116
+
117
+ throw err
30
118
  }
119
+ }
31
120
 
32
- const apiRoutesMap: Record<string, RouteInfo & { compiledRegex: RegExp }> =
33
- manifest.apiRoutes.reduce((acc, cur) => {
34
- acc[cur.page] = { ...cur, compiledRegex: new RegExp(cur.namedRegex) }
35
- return acc
36
- }, {})
121
+ export async function resolveLoaderRoute(
122
+ handlers: RequestHandlers,
123
+ request: Request,
124
+ url: URL,
125
+ route: RouteInfoCompiled
126
+ ) {
127
+ return await runMiddlewares(handlers, request, route, async () => {
128
+ return await resolveResponse(async () => {
129
+ const headers = new Headers()
130
+ headers.set('Content-Type', 'text/javascript')
131
+
132
+ try {
133
+ const loaderResponse = await handlers.handleLoader!({
134
+ request,
135
+ route,
136
+ url,
137
+ loaderProps: {
138
+ path: url.pathname,
139
+ request: route.type === 'ssr' ? request : undefined,
140
+ params: getLoaderParams(url, route),
141
+ },
142
+ })
143
+
144
+ return new Response(loaderResponse, {
145
+ headers,
146
+ })
147
+ } catch (err) {
148
+ // allow throwing a response in a loader
149
+ if (isResponse(err)) {
150
+ return err
151
+ }
152
+
153
+ console.error(`Error running loader: ${err}`)
154
+
155
+ throw err
156
+ }
157
+ })
158
+ })
159
+ }
37
160
 
38
- const apiRoutesList = Object.values(apiRoutesMap)
161
+ export async function resolvePageRoute(
162
+ handlers: RequestHandlers,
163
+ request: Request,
164
+ url: URL,
165
+ route: RouteInfoCompiled
166
+ ) {
167
+ const { pathname, search } = url
168
+
169
+ return resolveResponse(async () => {
170
+ const resolved = await runMiddlewares(handlers, request, route, async () => {
171
+ return await handlers.handlePage!({
172
+ request,
173
+ route,
174
+ url,
175
+ loaderProps: {
176
+ path: pathname + search,
177
+ params: getLoaderParams(url, route),
178
+ },
179
+ })
180
+ })
181
+ return resolved
182
+ })
183
+ }
39
184
 
40
- // its really common for people to hit refresh a couple times even on accident
41
- // sending two ssr requests at once and causing slowdown.
42
- // use this to avoid
43
- const activeRequests = {}
185
+ export function getURLfromRequestURL(request: Request) {
186
+ const urlString = request.url || ''
187
+ return new URL(
188
+ urlString || '',
189
+ request.headers.get('host') ? `http://${request.headers.get('host')}` : ''
190
+ )
191
+ }
44
192
 
45
- // shouldn't be mapping back and forth...
46
- const pageRoutes = manifest.pageRoutes.map((route) => ({
193
+ function compileRouteRegex(route: RouteInfo): RouteInfoCompiled {
194
+ return {
47
195
  ...route,
48
- workingRegex: new RegExp(route.namedRegex),
49
- }))
196
+ compiledRegex: new RegExp(route.namedRegex),
197
+ honoPath: getHonoPath(route.page),
198
+ }
199
+ }
200
+
201
+ export function compileManifest(manifest: { pageRoutes: RouteInfo[]; apiRoutes: RouteInfo[] }): {
202
+ pageRoutes: RouteInfoCompiled[]
203
+ apiRoutes: RouteInfoCompiled[]
204
+ } {
205
+ return {
206
+ pageRoutes: manifest.pageRoutes.map(compileRouteRegex),
207
+ apiRoutes: manifest.apiRoutes.map(compileRouteRegex),
208
+ }
209
+ }
210
+
211
+ // in dev mode we do it more simply:
212
+ export function createHandleRequest(handlers: RequestHandlers) {
213
+ const manifest = getManifest()
214
+ if (!manifest) {
215
+ throw new Error(`No routes manifest`)
216
+ }
217
+ const compiledManifest = compileManifest(manifest)
50
218
 
51
219
  return {
52
220
  manifest,
53
221
  handler: async function handleRequest(request: Request): Promise<RequestHandlerResponse> {
54
- const urlString = request.url || ''
55
- const url = new URL(
56
- urlString || '',
57
- request.headers.get('host') ? `http://${request.headers.get('host')}` : ''
58
- )
222
+ const url = getURLfromRequestURL(request)
59
223
  const { pathname, search } = url
60
224
 
61
- if (process.env.NODE_ENV !== 'production') {
62
- if (activeRequests[pathname]) {
63
- return await activeRequests[pathname]
64
- }
65
- }
66
-
67
225
  if (pathname === '/__vxrnhmr' || pathname.startsWith('/@')) {
68
226
  return null
69
227
  }
70
228
 
71
229
  if (handlers.handleAPI) {
72
- const apiRoute = apiRoutesList.find((route) => {
73
- const regex = route.compiledRegex
74
- return regex.test(pathname)
230
+ const apiRoute = compiledManifest.apiRoutes.find((route) => {
231
+ return route.compiledRegex.test(pathname)
75
232
  })
76
-
77
233
  if (apiRoute) {
78
- const params = getRouteParams(pathname, apiRoute)
79
-
80
- try {
81
- return await handlers.handleAPI({
82
- request,
83
- route: apiRoute,
84
- url,
85
- loaderProps: {
86
- path: pathname,
87
- params,
88
- },
89
- })
90
- } catch (err) {
91
- if (isResponse(err)) {
92
- return err
93
- }
94
- throw err
95
- }
234
+ return await resolveAPIRoute(handlers, request, url, apiRoute)
96
235
  }
97
236
  }
98
237
 
@@ -106,51 +245,20 @@ export function createHandleRequest(
106
245
  if (isClientRequestingNewRoute) {
107
246
  const originalUrl = getPathFromLoaderPath(pathname)
108
247
 
109
- const finalUrl = new URL(originalUrl, url.origin)
110
-
111
- for (const route of pageRoutes) {
248
+ for (const route of compiledManifest.pageRoutes) {
112
249
  if (route.file === '') {
113
250
  // ignore not found route
114
251
  // TODO improve/remove when not found is fixed
115
252
  continue
116
253
  }
117
254
 
118
- if (!route.workingRegex.test(finalUrl.pathname)) {
119
- continue
120
- }
255
+ const finalUrl = new URL(originalUrl, url.origin)
121
256
 
122
- if (process.env.NODE_ENV === 'development') {
123
- console.info(` ❶ Running loader for route: ${finalUrl.pathname}`)
257
+ if (!route.compiledRegex.test(finalUrl.pathname)) {
258
+ continue
124
259
  }
125
260
 
126
- const headers = new Headers()
127
- headers.set('Content-Type', 'text/javascript')
128
-
129
- try {
130
- const loaderResponse = await handlers.handleLoader({
131
- request,
132
- route,
133
- url,
134
- loaderProps: {
135
- path: finalUrl.pathname,
136
- request: route.type === 'ssr' ? request : undefined,
137
- params: getLoaderParams(finalUrl, route),
138
- },
139
- })
140
-
141
- return new Response(loaderResponse, {
142
- headers,
143
- })
144
- } catch (err) {
145
- // allow throwing a response in a loader
146
- if (isResponse(err)) {
147
- return err
148
- }
149
-
150
- console.error(`Error running loader: ${err}`)
151
-
152
- throw err
153
- }
261
+ return resolveLoaderRoute(handlers, request, finalUrl, route)
154
262
  }
155
263
 
156
264
  if (process.env.NODE_ENV === 'development') {
@@ -166,36 +274,12 @@ export function createHandleRequest(
166
274
  }
167
275
  }
168
276
 
169
- if (handlers.handleSSR) {
170
- const { promise, reject, resolve } = promiseWithResolvers()
171
-
172
- // TODO timeout handler to clear activeRequests and log error
173
- activeRequests[pathname] = promise
174
-
175
- try {
176
- for (const route of pageRoutes) {
177
- if (!route.workingRegex.test(pathname)) {
178
- continue
179
- }
180
-
181
- const ssrResponse = await handlers.handleSSR({
182
- request,
183
- route,
184
- url,
185
- loaderProps: {
186
- path: pathname + search,
187
- params: getLoaderParams(url, route),
188
- },
189
- })
190
-
191
- resolve(ssrResponse)
192
- return ssrResponse
277
+ if (handlers.handlePage) {
278
+ for (const route of compiledManifest.pageRoutes) {
279
+ if (!route.compiledRegex.test(pathname)) {
280
+ continue
193
281
  }
194
- } catch (err) {
195
- reject(err)
196
- throw err
197
- } finally {
198
- delete activeRequests[pathname]
282
+ return resolvePageRoute(handlers, request, url, route)
199
283
  }
200
284
  }
201
285
 
@@ -206,10 +290,10 @@ export function createHandleRequest(
206
290
 
207
291
  function getLoaderParams(
208
292
  url: URL,
209
- config: { workingRegex: RegExp; routeKeys: Record<string, string> }
293
+ config: { compiledRegex: RegExp; routeKeys: Record<string, string> }
210
294
  ) {
211
295
  const params: Record<string, string> = {}
212
- const match = new RegExp(config.workingRegex).exec(url.pathname)
296
+ const match = new RegExp(config.compiledRegex).exec(url.pathname)
213
297
  if (match?.groups) {
214
298
  for (const [key, value] of Object.entries(match.groups)) {
215
299
  const namedKey = config.routeKeys[key]
@@ -0,0 +1,14 @@
1
+ type MaybeResponse = Response | void | null
2
+ type RequestResponse = MaybeResponse | Promise<MaybeResponse>
3
+
4
+ export interface MiddlewareContext {}
5
+
6
+ export type Middleware = (props: {
7
+ request: Request
8
+ next: () => Promise<MaybeResponse>
9
+ context: MiddlewareContext
10
+ }) => RequestResponse
11
+
12
+ export function createMiddleware(middleware: Middleware) {
13
+ return middleware
14
+ }
package/src/getRoutes.ts CHANGED
@@ -16,10 +16,6 @@ export type Options = {
16
16
  preserveApiRoutes?: boolean
17
17
  ignoreRequireErrors?: boolean
18
18
  ignoreEntryPoints?: boolean
19
- /* Used to simplify testing for toEqual() comparison */
20
- internal_stripLoadRoute?: boolean
21
- /* Used to simplify by skipping the generated routes */
22
- skipGenerated?: boolean
23
19
  importMode?: 'sync'
24
20
  platformRoutes?: boolean
25
21
  platform?: string
@@ -27,6 +23,7 @@ export type Options = {
27
23
 
28
24
  type DirectoryNode = {
29
25
  layout?: RouteNode[]
26
+ middleware?: RouteNode
30
27
  files: Map<string, RouteNode[]>
31
28
  subdirectories: Map<string, DirectoryNode>
32
29
  }
@@ -65,16 +62,6 @@ export function getRoutes(
65
62
  return rootNode
66
63
  }
67
64
 
68
- export function getExactRoutes(
69
- contextModule: One.RouteContext,
70
- options: Options = {}
71
- ): RouteNode | null {
72
- return getRoutes(contextModule, {
73
- ...options,
74
- skipGenerated: true,
75
- })
76
- }
77
-
78
65
  /**
79
66
  * Converts the One.RouteContext keys (file paths) into a directory tree.
80
67
  */
@@ -128,6 +115,7 @@ function getDirectoryTree(contextModule: One.RouteContext, options: Options) {
128
115
  return contextModule(filePath)
129
116
  }
130
117
  },
118
+
131
119
  contextKey: filePath,
132
120
  route: '', // This is overwritten during hoisting based upon the _layout
133
121
  dynamic: null,
@@ -187,6 +175,8 @@ function getDirectoryTree(contextModule: One.RouteContext, options: Options) {
187
175
  node = getLayoutNode(node, options)
188
176
  directory.layout[meta.specificity] = node
189
177
  }
178
+ } else if (meta.isMiddleware) {
179
+ directory.middleware = node
190
180
  } else if (type === 'api') {
191
181
  const fileKey = `${route}+api`
192
182
  let nodes = directory.files.get(fileKey)
@@ -246,7 +236,6 @@ function getDirectoryTree(contextModule: One.RouteContext, options: Options) {
246
236
 
247
237
  /**
248
238
  * If there are no top-level _layout, add a default _layout
249
- * While this is a generated route, it will still be generated even if skipGenerated is true.
250
239
  */
251
240
  if (!rootDirectory.layout) {
252
241
  rootDirectory.layout = [
@@ -267,12 +256,11 @@ function getDirectoryTree(contextModule: One.RouteContext, options: Options) {
267
256
  }
268
257
 
269
258
  // Only include the sitemap if there are routes.
270
- if (!options.skipGenerated) {
271
- if (hasRoutes) {
272
- appendSitemapRoute(rootDirectory)
273
- }
274
- appendNotFoundRoute(rootDirectory)
259
+ if (hasRoutes) {
260
+ appendSitemapRoute(rootDirectory)
275
261
  }
262
+ appendNotFoundRoute(rootDirectory)
263
+
276
264
  return rootDirectory
277
265
  }
278
266
 
@@ -285,7 +273,8 @@ function flattenDirectoryTreeToRoutes(
285
273
  /* The nearest _layout file in the directory tree */
286
274
  layout?: RouteNode,
287
275
  /* Route names are relative to their layout */
288
- pathToRemove = ''
276
+ pathToRemove = '',
277
+ parentMiddlewares?: RouteNode[]
289
278
  ) {
290
279
  /**
291
280
  * This directory has a _layout file so it becomes the new target for hoisting routes.
@@ -299,10 +288,6 @@ function flattenDirectoryTreeToRoutes(
299
288
  previousLayout.children.push(layout)
300
289
  }
301
290
 
302
- if (options.internal_stripLoadRoute) {
303
- delete (layout as any).loadRoute
304
- }
305
-
306
291
  // `route` is the absolute pathname. We need to make this relative to the last _layout
307
292
  const newRoute = layout.route.replace(pathToRemove, '')
308
293
  pathToRemove = layout.route ? `${layout.route}/` : ''
@@ -315,6 +300,10 @@ function flattenDirectoryTreeToRoutes(
315
300
  // This should never occur as there will always be a root layout, but it makes the type system happy
316
301
  if (!layout) throw new Error('One Internal Error: No nearest layout')
317
302
 
303
+ const middlewares = directory.middleware
304
+ ? [...(parentMiddlewares || []), directory.middleware]
305
+ : parentMiddlewares
306
+
318
307
  for (const routes of directory.files.values()) {
319
308
  // TODO(Platform Routes): We need to pick the most specific layout and ensure that all routes have a non-platform route.
320
309
  const routeNode = getMostSpecific(routes)
@@ -322,17 +311,14 @@ function flattenDirectoryTreeToRoutes(
322
311
  // `route` is the absolute pathname. We need to make this relative to the nearest layout
323
312
  routeNode.route = routeNode.route.replace(pathToRemove, '')
324
313
  routeNode.dynamic = generateDynamic(routeNode.route)
325
-
326
- if (options.internal_stripLoadRoute) {
327
- delete (routeNode as any).loadRoute
328
- }
314
+ routeNode.middlewares = middlewares
329
315
 
330
316
  layout.children.push(routeNode)
331
317
  }
332
318
 
333
319
  // Recursively flatten the subdirectories
334
320
  for (const child of directory.subdirectories.values()) {
335
- flattenDirectoryTreeToRoutes(child, options, layout, pathToRemove)
321
+ flattenDirectoryTreeToRoutes(child, options, layout, pathToRemove, middlewares)
336
322
  }
337
323
 
338
324
  return layout
@@ -348,6 +334,7 @@ function getFileMeta(key: string, options: Options) {
348
334
  const filenameWithoutExtensions = removeSupportedExtensions(filename)
349
335
 
350
336
  const isLayout = filenameWithoutExtensions.startsWith('_layout')
337
+ const isMiddleware = filenameWithoutExtensions.startsWith('_middleware')
351
338
 
352
339
  const [_fullname, renderModeFound] = filename.match(/\+(api|ssg|ssr|spa)\.(\w+\.)?[jt]sx?$/) || []
353
340
  const renderMode = renderModeFound as 'api' | One.RouteRenderMode | undefined
@@ -407,6 +394,7 @@ function getFileMeta(key: string, options: Options) {
407
394
  route,
408
395
  specificity,
409
396
  isLayout,
397
+ isMiddleware,
410
398
  renderMode,
411
399
  }
412
400
  }
@@ -591,19 +579,17 @@ function crawlAndAppendInitialRoutesAndEntryFiles(
591
579
  })
592
580
  let initialRouteName = childMatchingGroup?.route
593
581
  // We may strip loadRoute during testing
594
- if (!options.internal_stripLoadRoute) {
595
- const loaded = node.loadRoute()
596
- if (loaded?.unstable_settings) {
597
- // Allow unstable_settings={ initialRouteName: '...' } to override the default initial route name.
598
- initialRouteName = loaded.unstable_settings.initialRouteName ?? initialRouteName
582
+ const loaded = node.loadRoute()
583
+ if (loaded?.unstable_settings) {
584
+ // Allow unstable_settings={ initialRouteName: '...' } to override the default initial route name.
585
+ initialRouteName = loaded.unstable_settings.initialRouteName ?? initialRouteName
599
586
 
600
- if (groupName) {
601
- // Allow unstable_settings={ 'custom': { initialRouteName: '...' } } to override the less specific initial route name.
602
- const groupSpecificInitialRouteName =
603
- loaded.unstable_settings?.[groupName]?.initialRouteName
587
+ if (groupName) {
588
+ // Allow unstable_settings={ 'custom': { initialRouteName: '...' } } to override the less specific initial route name.
589
+ const groupSpecificInitialRouteName =
590
+ loaded.unstable_settings?.[groupName]?.initialRouteName
604
591
 
605
- initialRouteName = groupSpecificInitialRouteName ?? initialRouteName
606
- }
592
+ initialRouteName = groupSpecificInitialRouteName ?? initialRouteName
607
593
  }
608
594
  }
609
595
 
package/src/index.ts CHANGED
@@ -13,6 +13,9 @@ export { router } from './imperative-api'
13
13
  export { createRoute, route } from './createRoute'
14
14
  export { onClientLoaderResolve } from './clientLoaderResolver'
15
15
 
16
+ // middleware
17
+ export { createMiddleware, type Middleware } from './createMiddleware'
18
+
16
19
  // internals
17
20
  export { render } from './render'
18
21
  export { Root } from './Root'
@@ -62,6 +62,7 @@ export function initialize(
62
62
  ignoreEntryPoints: true,
63
63
  platform: Platform.OS,
64
64
  })
65
+
65
66
  rootComponent = routeNode ? getQualifiedRouteComponent(routeNode) : Fragment
66
67
 
67
68
  if (!routeNode && process.env.NODE_ENV === 'production') {
@@ -3,6 +3,7 @@ import { oneServe } from './server/oneServe'
3
3
  import type { One } from './vite/types'
4
4
  import { setupBuildInfo } from './server/setupBuildOptions'
5
5
  import { ensureExists } from './utils/ensureExists'
6
+ import { Hono } from 'hono'
6
7
 
7
8
  export async function serve(buildInfo: One.BuildInfo) {
8
9
  setupBuildInfo(buildInfo)
@@ -11,9 +12,13 @@ export async function serve(buildInfo: One.BuildInfo) {
11
12
  // TODO make this better, this ensures we get react 19
12
13
  process.env.VXRN_REACT_19 = '1'
13
14
 
14
- const app = await createProdServer(buildInfo.oneOptions)
15
+ const serverOptions = buildInfo.oneOptions.server || {}
15
16
 
16
- await oneServe(buildInfo.oneOptions, buildInfo.oneOptions, buildInfo, app, false)
17
+ const app = new Hono()
18
+
19
+ await createProdServer(app, serverOptions)
20
+
21
+ await oneServe(buildInfo.oneOptions, buildInfo, app, false)
17
22
 
18
23
  return app
19
24
  }
package/src/serve.ts CHANGED
@@ -33,21 +33,20 @@ export async function serve(args: VXRNOptions['server'] = {}) {
33
33
  process.env.VXRN_REACT_19 = '1'
34
34
 
35
35
  return await vxrnServe({
36
- server: {
37
- // fallback to one plugin
38
- ...oneOptions.server,
39
- // override with any flags given to cli
40
- ...removeUndefined({
41
- port: args.port ? +args.port : undefined,
42
- host: args.host,
43
- compress: args.compress,
44
- platform: args.platform,
45
- cacheHeaders: args.cacheHeaders,
46
- }),
36
+ // fallback to one plugin
37
+ ...oneOptions.server,
38
+ // override with any flags given to cli
39
+ ...removeUndefined({
40
+ port: args.port ? +args.port : undefined,
41
+ host: args.host,
42
+ compress: args.compress,
43
+ platform: args.platform,
44
+ }),
45
+
46
+ async beforeRegisterRoutes(options, app) {
47
+ await oneServe(oneOptions, buildInfo, app)
47
48
  },
48
49
 
49
- async beforeStart(options, app) {
50
- await oneServe(oneOptions, options, buildInfo, app)
51
- },
50
+ async afterRegisterRoutes(options, app) {},
52
51
  })
53
52
  }
@@ -11,12 +11,19 @@ export type RouteInfo<TRegex = string> = {
11
11
  namedRegex: TRegex
12
12
  routeKeys: Record<string, string>
13
13
  layouts?: RouteNode[]
14
+ middlewares?: RouteNode[]
14
15
  type: One.RouteType
15
16
  isNotFound?: boolean
16
17
  }
17
18
 
19
+ export type RouteInfoCompiled = RouteInfo & {
20
+ compiledRegex: RegExp
21
+ honoPath: string
22
+ }
23
+
18
24
  export type RoutesManifest<TRegex = string> = {
19
25
  apiRoutes: RouteInfo<TRegex>[]
26
+ middlewareRoutes: RouteInfo<TRegex>[]
20
27
  pageRoutes: RouteInfo<TRegex>[]
21
28
  }
22
29