nitro 3.0.1-alpha.2 → 3.0.260415-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/LICENSE +6 -0
  2. package/README.md +2 -2
  3. package/dist/THIRD-PARTY-LICENSES.md +1646 -0
  4. package/dist/_build/common.mjs +7261 -3812
  5. package/dist/_build/rolldown.mjs +32 -42
  6. package/dist/_build/rollup.mjs +28 -48
  7. package/dist/_build/vite.build.mjs +10 -10
  8. package/dist/_chunks/nitro.mjs +102 -327
  9. package/dist/_chunks/nitro2.mjs +8 -9
  10. package/dist/_chunks/nitro3.mjs +136 -0
  11. package/dist/_chunks/nitro4.mjs +127 -0
  12. package/dist/_chunks/utils.mjs +40 -29
  13. package/dist/_common.mjs +13 -25
  14. package/dist/_dev.d.mts +0 -3
  15. package/dist/{_chunks/dev.mjs → _dev.mjs} +132 -330
  16. package/dist/_libs/_.mjs +2 -0
  17. package/dist/_libs/_2.mjs +2 -0
  18. package/dist/_libs/_3.mjs +2 -0
  19. package/dist/_libs/_4.mjs +2 -0
  20. package/dist/_libs/_5.mjs +2 -0
  21. package/dist/_libs/_6.mjs +2 -0
  22. package/dist/_libs/_7.mjs +2 -0
  23. package/dist/_libs/c12+rc9.mjs +814 -0
  24. package/dist/_libs/{c12+giget+readdirp+chokidar.d.mts → c12+readdirp+chokidar.d.mts} +49 -40
  25. package/dist/_libs/citty.mjs +142 -41
  26. package/dist/_libs/commondir+is-reference.mjs +60 -56
  27. package/dist/_libs/compatx.d.mts +0 -2
  28. package/dist/_libs/compatx.mjs +1 -4
  29. package/dist/_libs/esbuild.d.mts +0 -1
  30. package/dist/_libs/escape-string-regexp.mjs +1 -4
  31. package/dist/_libs/{pluginutils+plugin-commonjs.d.mts → estree+pluginutils.d.mts} +0 -5
  32. package/dist/_libs/estree-walker.mjs +4 -92
  33. package/dist/_libs/exsolve.d.mts +1 -0
  34. package/dist/_libs/hasown+resolve+deepmerge.mjs +160 -246
  35. package/dist/_libs/httpxy.d.mts +20 -13
  36. package/dist/_libs/httpxy.mjs +519 -95
  37. package/dist/_libs/js-tokens.d.mts +1 -0
  38. package/dist/_libs/klona.mjs +1 -4
  39. package/dist/_libs/magic-string.d.mts +0 -2
  40. package/dist/_libs/mlly.d.mts +0 -2
  41. package/dist/_libs/nypm+tinyexec.mjs +822 -0
  42. package/dist/_libs/perfect-debounce.mjs +68 -0
  43. package/dist/_libs/pkg-types.d.mts +0 -3
  44. package/dist/_libs/plugin-alias.mjs +1 -5
  45. package/dist/_libs/plugin-inject.mjs +1 -7
  46. package/dist/_libs/plugin-json.mjs +1 -5
  47. package/dist/_libs/pluginutils.mjs +3 -35
  48. package/dist/_libs/readdirp+chokidar.mjs +187 -365
  49. package/dist/_libs/remapping.mjs +1 -5
  50. package/dist/_libs/resolve-uri+gen-mapping.mjs +15 -53
  51. package/dist/_libs/rou3.d.mts +1 -4
  52. package/dist/_libs/rou3.mjs +223 -78
  53. package/dist/_libs/std-env.d.mts +8 -2
  54. package/dist/_libs/strip-literal.d.mts +1 -0
  55. package/dist/_libs/tsconfck.mjs +21 -334
  56. package/dist/_libs/ultrahtml.mjs +3 -16
  57. package/dist/_libs/unimport+unplugin.mjs +244 -388
  58. package/dist/_libs/unplugin+unimport.d.mts +5 -15
  59. package/dist/_libs/unwasm.d.mts +0 -3
  60. package/dist/_presets.mjs +576 -488
  61. package/dist/builder.d.mts +5 -25
  62. package/dist/builder.mjs +3 -8
  63. package/dist/cli/_chunks/build.mjs +22 -25
  64. package/dist/cli/_chunks/common.mjs +1 -4
  65. package/dist/cli/_chunks/deploy.mjs +37 -0
  66. package/dist/cli/_chunks/dev.mjs +6 -11
  67. package/dist/cli/_chunks/docs.mjs +28 -0
  68. package/dist/cli/_chunks/list.mjs +4 -8
  69. package/dist/cli/_chunks/prepare.mjs +2 -6
  70. package/dist/cli/_chunks/preview.mjs +48 -0
  71. package/dist/cli/_chunks/run.mjs +7 -11
  72. package/dist/cli/_chunks/task.mjs +1 -5
  73. package/dist/cli/index.mjs +5 -6
  74. package/dist/docs/0.docs/0.index/index.md +56 -0
  75. package/dist/docs/0.docs/1.quick-start.md +110 -0
  76. package/dist/docs/0.docs/10.lifecycle.md +204 -0
  77. package/dist/docs/0.docs/11.openapi.md +291 -0
  78. package/dist/docs/0.docs/12.plugins.md +164 -0
  79. package/dist/docs/0.docs/13.tasks.md +277 -0
  80. package/dist/docs/0.docs/14.websocket.md +386 -0
  81. package/dist/docs/0.docs/15.migration.md +213 -0
  82. package/dist/docs/0.docs/16.nightly.md +31 -0
  83. package/dist/docs/0.docs/2.renderer.md +322 -0
  84. package/dist/docs/0.docs/3.routing.md +711 -0
  85. package/dist/docs/0.docs/4.server-entry.md +239 -0
  86. package/dist/docs/0.docs/5.cache.md +408 -0
  87. package/dist/docs/0.docs/6.storage.md +261 -0
  88. package/dist/docs/0.docs/7.assets.md +166 -0
  89. package/dist/docs/0.docs/8.configuration.md +256 -0
  90. package/dist/docs/0.docs/9.database.md +185 -0
  91. package/dist/docs/1.deploy/0.index/index.md +64 -0
  92. package/dist/docs/1.deploy/1.runtimes/0.node.md +63 -0
  93. package/dist/docs/1.deploy/1.runtimes/1.bun.md +15 -0
  94. package/dist/docs/1.deploy/1.runtimes/2.deno.md +19 -0
  95. package/dist/docs/1.deploy/2.providers/0.alwaysdata.md +50 -0
  96. package/dist/docs/1.deploy/2.providers/1.aws.md +47 -0
  97. package/dist/docs/1.deploy/2.providers/10.flightcontrol.md +67 -0
  98. package/dist/docs/1.deploy/2.providers/11.genezio.md +67 -0
  99. package/dist/docs/1.deploy/2.providers/12.github-pages.md +68 -0
  100. package/dist/docs/1.deploy/2.providers/13.gitlab-pages.md +37 -0
  101. package/dist/docs/1.deploy/2.providers/14.heroku.md +84 -0
  102. package/dist/docs/1.deploy/2.providers/15.iis.md +38 -0
  103. package/dist/docs/1.deploy/2.providers/16.koyeb.md +109 -0
  104. package/dist/docs/1.deploy/2.providers/17.netlify.md +47 -0
  105. package/dist/docs/1.deploy/2.providers/18.platform-sh.md +37 -0
  106. package/dist/docs/1.deploy/2.providers/19.render.md +37 -0
  107. package/dist/docs/1.deploy/2.providers/2.aws-amplify.md +81 -0
  108. package/dist/docs/1.deploy/2.providers/20.stormkit.md +24 -0
  109. package/dist/docs/1.deploy/2.providers/21.vercel.md +270 -0
  110. package/dist/docs/1.deploy/2.providers/22.zeabur.md +19 -0
  111. package/dist/docs/1.deploy/2.providers/23.zephyr.md +99 -0
  112. package/dist/docs/1.deploy/2.providers/24.zerops.md +102 -0
  113. package/dist/docs/1.deploy/2.providers/3.azure.md +72 -0
  114. package/dist/docs/1.deploy/2.providers/4.cleavr.md +33 -0
  115. package/dist/docs/1.deploy/2.providers/5.cloudflare.md +369 -0
  116. package/dist/docs/1.deploy/2.providers/6.deno-deploy.md +66 -0
  117. package/dist/docs/1.deploy/2.providers/7.digitalocean.md +46 -0
  118. package/dist/docs/1.deploy/2.providers/8.edgeone.md +20 -0
  119. package/dist/docs/1.deploy/2.providers/9.firebase.md +32 -0
  120. package/dist/docs/2.config/0.index/index.md +1221 -0
  121. package/dist/docs/3.examples/0.index/index.md +3 -0
  122. package/dist/docs/3.examples/1.api-routes.md +145 -0
  123. package/dist/docs/3.examples/10.hono.md +74 -0
  124. package/dist/docs/3.examples/11.import-alias.md +97 -0
  125. package/dist/docs/3.examples/12.middleware.md +91 -0
  126. package/dist/docs/3.examples/13.mono-jsx.md +68 -0
  127. package/dist/docs/3.examples/14.nano-jsx.md +70 -0
  128. package/dist/docs/3.examples/15.plugins.md +91 -0
  129. package/dist/docs/3.examples/16.renderer.md +113 -0
  130. package/dist/docs/3.examples/17.runtime-config.md +97 -0
  131. package/dist/docs/3.examples/18.server-fetch.md +87 -0
  132. package/dist/docs/3.examples/19.shiki.md +198 -0
  133. package/dist/docs/3.examples/2.auto-imports.md +92 -0
  134. package/dist/docs/3.examples/20.virtual-routes.md +74 -0
  135. package/dist/docs/3.examples/21.vite-nitro-plugin.md +79 -0
  136. package/dist/docs/3.examples/22.vite-rsc.md +1041 -0
  137. package/dist/docs/3.examples/23.vite-ssr-html.md +217 -0
  138. package/dist/docs/3.examples/24.vite-ssr-preact.md +247 -0
  139. package/dist/docs/3.examples/25.vite-ssr-react.md +226 -0
  140. package/dist/docs/3.examples/26.vite-ssr-solid.md +256 -0
  141. package/dist/docs/3.examples/27.vite-ssr-tsr-react.md +442 -0
  142. package/dist/docs/3.examples/28.vite-ssr-tss-react.md +444 -0
  143. package/dist/docs/3.examples/29.vite-ssr-vue-router.md +617 -0
  144. package/dist/docs/3.examples/3.cached-handler.md +81 -0
  145. package/dist/docs/3.examples/30.vite-trpc.md +335 -0
  146. package/dist/docs/3.examples/31.websocket.md +282 -0
  147. package/dist/docs/3.examples/4.custom-error-handler.md +98 -0
  148. package/dist/docs/3.examples/5.database.md +157 -0
  149. package/dist/docs/3.examples/6.elysia.md +70 -0
  150. package/dist/docs/3.examples/7.express.md +78 -0
  151. package/dist/docs/3.examples/8.fastify.md +79 -0
  152. package/dist/docs/3.examples/9.hello-world.md +68 -0
  153. package/dist/docs/README.md +86 -0
  154. package/dist/docs/index.md +121 -0
  155. package/dist/node_modules/@poppinss/dumper/build/formatters/html/main.js +8 -0
  156. package/dist/node_modules/@poppinss/dumper/package.json +1 -1
  157. package/dist/node_modules/@speed-highlight/core/dist/index.js +4 -4
  158. package/dist/node_modules/@speed-highlight/core/dist/terminal.js +2 -2
  159. package/dist/node_modules/@speed-highlight/core/package.json +1 -1
  160. package/dist/node_modules/cookie-es/dist/index.mjs +299 -250
  161. package/dist/node_modules/cookie-es/package.json +26 -23
  162. package/dist/node_modules/croner/dist/croner.js +1 -1
  163. package/dist/node_modules/croner/package.json +11 -1
  164. package/dist/node_modules/defu/dist/defu.mjs +2 -2
  165. package/dist/node_modules/defu/package.json +33 -28
  166. package/dist/node_modules/rendu/dist/_chunks/libs/cookie-es.mjs +151 -0
  167. package/dist/node_modules/rendu/dist/index.mjs +5 -112
  168. package/dist/node_modules/rendu/package.json +25 -24
  169. package/dist/node_modules/youch/build/helpers-B9BQYaS6.js +23 -0
  170. package/dist/node_modules/youch/build/index.js +204 -351
  171. package/dist/node_modules/youch/build/public/error_info/script.js +1 -1
  172. package/dist/node_modules/youch/build/public_dir-C5bujZKB.js +25 -0
  173. package/dist/node_modules/youch/build/src/templates/error_cause/main.js +44 -0
  174. package/dist/node_modules/youch/build/src/templates/error_info/main.js +72 -0
  175. package/dist/node_modules/youch/build/src/templates/error_metadata/main.js +65 -0
  176. package/dist/node_modules/youch/build/src/templates/error_stack/main.js +152 -0
  177. package/dist/node_modules/youch/build/src/templates/error_stack_source/main.js +46 -0
  178. package/dist/node_modules/youch/build/src/templates/header/main.js +24 -0
  179. package/dist/node_modules/youch/build/src/templates/layout/main.js +27 -0
  180. package/dist/node_modules/youch/package.json +35 -32
  181. package/dist/presets/_nitro/runtime/nitro-dev.mjs +12 -57
  182. package/dist/presets/_nitro/runtime/nitro-prerenderer.mjs +1 -0
  183. package/dist/presets/_nitro/runtime/service-worker.mjs +1 -2
  184. package/dist/presets/aws-lambda/runtime/_utils.mjs +6 -6
  185. package/dist/presets/aws-lambda/runtime/aws-lambda-streaming.mjs +3 -1
  186. package/dist/presets/azure/runtime/_utils.mjs +5 -5
  187. package/dist/presets/azure/runtime/azure-swa.mjs +5 -5
  188. package/dist/presets/bun/runtime/bun.mjs +9 -6
  189. package/dist/presets/cloudflare/runtime/_module-handler.mjs +1 -1
  190. package/dist/presets/cloudflare/runtime/cloudflare-durable.mjs +4 -4
  191. package/dist/presets/cloudflare/runtime/cloudflare-module.mjs +3 -3
  192. package/dist/presets/cloudflare/runtime/cloudflare-pages.mjs +2 -2
  193. package/dist/presets/cloudflare/runtime/plugin.dev.mjs +10 -21
  194. package/dist/presets/deno/runtime/deno-deploy.mjs +4 -4
  195. package/dist/presets/deno/runtime/deno-server.mjs +9 -6
  196. package/dist/presets/edgeone/runtime/edgeone.mjs +10 -0
  197. package/dist/presets/netlify/runtime/netlify-edge.mjs +2 -3
  198. package/dist/presets/netlify/runtime/netlify.mjs +1 -1
  199. package/dist/presets/node/runtime/node-cluster.mjs +5 -4
  200. package/dist/presets/node/runtime/node-middleware.mjs +1 -1
  201. package/dist/presets/node/runtime/node-server.mjs +8 -5
  202. package/dist/presets/stormkit/runtime/stormkit.mjs +1 -2
  203. package/dist/presets/vercel/runtime/cron-handler.mjs +25 -0
  204. package/dist/presets/vercel/runtime/queue-handler.mjs +21 -0
  205. package/dist/presets/vercel/runtime/vercel.node.mjs +3 -3
  206. package/dist/presets/vercel/runtime/vercel.web.mjs +3 -5
  207. package/dist/presets/winterjs/runtime/winterjs.mjs +10 -10
  208. package/dist/presets/zephyr/runtime/server.mjs +3 -0
  209. package/dist/runtime/internal/app.mjs +12 -11
  210. package/dist/runtime/internal/cache.d.mts +0 -4
  211. package/dist/runtime/internal/cache.mjs +32 -256
  212. package/dist/runtime/internal/context.d.mts +3 -1
  213. package/dist/runtime/internal/context.mjs +1 -9
  214. package/dist/runtime/internal/error/dev.d.mts +5 -4
  215. package/dist/runtime/internal/error/dev.mjs +47 -49
  216. package/dist/runtime/internal/error/hooks.d.mts +1 -1
  217. package/dist/runtime/internal/error/prod.d.mts +2 -5
  218. package/dist/runtime/internal/error/prod.mjs +19 -33
  219. package/dist/runtime/internal/error/utils.d.mts +4 -4
  220. package/dist/runtime/internal/meta.d.mts +1 -1
  221. package/dist/runtime/internal/plugin.d.mts +2 -2
  222. package/dist/runtime/internal/route-rules.d.mts +11 -4
  223. package/dist/runtime/internal/route-rules.mjs +15 -5
  224. package/dist/runtime/internal/routes/dev-tasks.d.mts +3 -2
  225. package/dist/runtime/internal/routes/dev-tasks.mjs +15 -10
  226. package/dist/runtime/internal/routes/openapi.mjs +2 -2
  227. package/dist/runtime/internal/routes/renderer-template.d.mts +1 -1
  228. package/dist/runtime/internal/routes/renderer-template.dev.d.mts +2 -1
  229. package/dist/runtime/internal/routes/scalar.mjs +3 -3
  230. package/dist/runtime/internal/routes/swagger.mjs +7 -4
  231. package/dist/runtime/internal/runtime-config.d.mts +1 -1
  232. package/dist/runtime/internal/runtime-config.mjs +2 -2
  233. package/dist/runtime/internal/static.mjs +5 -4
  234. package/dist/runtime/internal/task.d.mts +3 -1
  235. package/dist/runtime/internal/task.mjs +7 -7
  236. package/dist/runtime/internal/vite/dev-entry.mjs +6 -3
  237. package/dist/runtime/internal/vite/dev-worker.mjs +264 -0
  238. package/dist/runtime/meta.d.mts +1 -0
  239. package/dist/runtime/meta.mjs +2 -0
  240. package/dist/runtime/nitro.d.mts +2 -0
  241. package/dist/runtime/nitro.mjs +4 -2
  242. package/dist/runtime/virtual/error-handler.mjs +1 -1
  243. package/dist/runtime/virtual/renderer-template.mjs +1 -1
  244. package/dist/runtime/virtual/server-assets.d.mts +2 -1
  245. package/dist/runtime/virtual/tracing.d.mts +5 -0
  246. package/dist/runtime/virtual/tracing.mjs +1 -0
  247. package/dist/runtime/vite.d.mts +1 -1
  248. package/dist/types/index.d.mts +215 -195
  249. package/dist/types/index.mjs +1 -11
  250. package/dist/vite.d.mts +3 -8
  251. package/dist/vite.mjs +285 -253
  252. package/lib/tsconfig.json +3 -5
  253. package/package.json +97 -80
  254. package/dist/_libs/confbox.mjs +0 -2509
  255. package/dist/_libs/nypm+giget+tinyexec.mjs +0 -3603
  256. package/dist/_libs/rc9+c12+dotenv.mjs +0 -972
  257. package/dist/node_modules/hookable/dist/index.mjs +0 -266
  258. package/dist/node_modules/hookable/package.json +0 -52
  259. package/dist/node_modules/youch/build/chunk-4L7RY2JA.js +0 -42
  260. package/dist/node_modules/youch/build/chunk-7QV3D5YX.js +0 -83
  261. package/dist/node_modules/youch/build/chunk-AUGPHE32.js +0 -39
  262. package/dist/node_modules/youch/build/chunk-CM7DWJNZ.js +0 -44
  263. package/dist/node_modules/youch/build/chunk-EJH674NB.js +0 -223
  264. package/dist/node_modules/youch/build/chunk-OIJ3WD7L.js +0 -81
  265. package/dist/node_modules/youch/build/chunk-P36L72PL.js +0 -87
  266. package/dist/node_modules/youch/build/chunk-PE3GG3TN.js +0 -65
  267. package/dist/node_modules/youch/build/chunk-X53OIOJH.js +0 -70
  268. package/dist/presets/_nitro/runtime/nitro-dev.d.mts +0 -2
  269. package/dist/presets/_nitro/runtime/nitro-prerenderer.d.mts +0 -3
  270. package/dist/presets/_nitro/runtime/service-worker.d.mts +0 -2
  271. package/dist/presets/aws-amplify/runtime/aws-amplify.d.mts +0 -2
  272. package/dist/presets/aws-lambda/runtime/_utils.d.mts +0 -8
  273. package/dist/presets/aws-lambda/runtime/aws-lambda-streaming.d.mts +0 -2
  274. package/dist/presets/aws-lambda/runtime/aws-lambda.d.mts +0 -3
  275. package/dist/presets/azure/runtime/_utils.d.mts +0 -2
  276. package/dist/presets/azure/runtime/azure-swa.d.mts +0 -5
  277. package/dist/presets/bun/runtime/bun.d.mts +0 -3
  278. package/dist/presets/cloudflare/runtime/_module-handler.d.mts +0 -16
  279. package/dist/presets/cloudflare/runtime/cloudflare-durable.d.mts +0 -11
  280. package/dist/presets/cloudflare/runtime/cloudflare-module.d.mts +0 -3
  281. package/dist/presets/cloudflare/runtime/cloudflare-pages.d.mts +0 -20
  282. package/dist/presets/cloudflare/runtime/plugin.dev.d.mts +0 -3
  283. package/dist/presets/deno/runtime/deno-deploy.d.mts +0 -5
  284. package/dist/presets/deno/runtime/deno-server.d.mts +0 -3
  285. package/dist/presets/netlify/runtime/netlify-edge.d.mts +0 -3
  286. package/dist/presets/netlify/runtime/netlify.d.mts +0 -4
  287. package/dist/presets/node/runtime/node-cluster.d.mts +0 -3
  288. package/dist/presets/node/runtime/node-middleware.d.mts +0 -3
  289. package/dist/presets/node/runtime/node-server.d.mts +0 -3
  290. package/dist/presets/standard/runtime/server.d.mts +0 -3
  291. package/dist/presets/stormkit/runtime/stormkit.d.mts +0 -21
  292. package/dist/presets/vercel/runtime/isr.d.mts +0 -2
  293. package/dist/presets/vercel/runtime/vercel.node.d.mts +0 -3
  294. package/dist/presets/vercel/runtime/vercel.web.d.mts +0 -8
  295. package/dist/presets/winterjs/runtime/winterjs.d.mts +0 -2
  296. package/dist/presets/zeabur/runtime/zeabur.d.mts +0 -3
  297. package/dist/runtime/internal/vite/node-runner.mjs +0 -359
@@ -0,0 +1,213 @@
1
+ # Migration Guide
2
+
3
+ > [!NOTE]
4
+ > This is a living document for migrating from Nitro 2 to 3. Please check it regularly while using the beta version.
5
+
6
+ Nitro v3 introduces intentional backward-incompatible changes. This guide helps you migrate from Nitro v2.
7
+
8
+ ## `nitropack` is renamed to `nitro`
9
+
10
+ The NPM package [nitropack](https://www.npmjs.com/package/nitropack) (v2) has been renamed to [nitro](https://www.npmjs.com/package/nitro) (v3).
11
+
12
+ **Migration:** Update the `nitropack` dependency to `nitro` in `package.json`:
13
+
14
+ ```diff [release channel]
15
+ {
16
+ "dependencies": {
17
+ -- "nitropack": "latest"
18
+ ++ "nitro": "latest"
19
+ }
20
+ }
21
+ ```
22
+
23
+ ```diff [nightly channel]
24
+ {
25
+ "dependencies": {
26
+ -- "nitropack": "latest"
27
+ ++ "nitro": "npm:nitro-nightly"
28
+ }
29
+ }
30
+ ```
31
+
32
+ **Migration:** Search your codebase and rename all instances of nitropack to nitro:
33
+
34
+ ```diff
35
+ -- import { defineNitroConfig } from "nitropack/config"
36
+ ++ import { defineConfig } from "nitro"
37
+ ```
38
+
39
+ ## nitro/runtime
40
+
41
+ Runtime utils had been moved to individual `nitro/*` subpath exports. Refer to docs for usage.
42
+
43
+ ```diff
44
+ -- import { useStorage } from "nitropack/runtime/storage"
45
+ ++ import { useStorage } from "nitro/storage"
46
+ ```
47
+
48
+ ## Minimum Supported Node.js Version: 20
49
+
50
+ Nitro now requires a minimum Node.js version of 20, as Node.js 18 reaches end-of-life in [April 2025](https://nodejs.org/en/about/previous-releases).
51
+
52
+ Please upgrade to the [latest LTS](https://nodejs.org/en/download) version (>= 20).
53
+
54
+ **Migration:**
55
+
56
+ - Check your local Node.js version using `node --version` and update if necessary.
57
+ - If you use a CI/CD system for deployment, ensure that your pipeline is running Node.js 20 or higher.
58
+ - If your hosting provider manages the Node.js runtime, make sure it's set to version 20, 22, or later.
59
+
60
+ ## Type Imports
61
+ Nitro types are now only exported from `nitro/types`.
62
+
63
+ **Migration:** Import types from nitro/types instead of nitro:
64
+
65
+ ```diff
66
+ -- import { NitroRuntimeConfig } from "nitropack"
67
+ ++ import { NitroRuntimeConfig } from "nitro/types"
68
+ ```
69
+
70
+ ## App Config Support Removed
71
+
72
+ Nitro v2 supported a bundled app config that allowed defining configurations in `app.config.ts` and accessing them at runtime via `useAppConfig()`.
73
+
74
+ This feature had been removed.
75
+
76
+ **Migration:**
77
+
78
+ Use a regular `.ts` file in your server directory and import it directly.
79
+
80
+ ## Preset updates
81
+
82
+ Nitro presets have been updated for the latest compatibility.
83
+
84
+ Some (legacy) presets have been removed or renamed.
85
+
86
+ | Old Preset | New Preset |
87
+ | --- | --- |
88
+ | `node` | `node_middleware` (export changed to `middleware`) |
89
+ | `cloudflare`, `cloudflare_worker`, `cloudflare_module_legacy` | `cloudflare_module` |
90
+ | `deno-server-legacy` | `deno_server` with Deno v2 |
91
+ | `netlify-builder` | `netlify` or `netlify_edge` |
92
+ | `vercel-edge` | `vercel` with Fluid compute enabled |
93
+ | `azure`, `azure_functions` | `azure_swa` |
94
+ | `firebase` | `firebase_app_hosting` |
95
+ | `iis` | `iis_handler` |
96
+ | `deno` | `deno_deploy` |
97
+ | `edgio` | Discontinued |
98
+ | `cli` | Removed due to lack of use |
99
+ | `service_worker` | Removed due to instability |
100
+
101
+ ## Cloudflare Bindings Access
102
+
103
+ In Nitro v2, Cloudflare environment variables and bindings were accessible via `event.context.cloudflare.env`.
104
+
105
+ In Nitro v3, the Cloudflare runtime context is attached to the request's runtime object instead.
106
+
107
+ **Migration:**
108
+
109
+ ```diff
110
+ -- const { cloudflare } = event.context
111
+ -- const binding = cloudflare.env.MY_BINDING
112
+ ++ const { env } = event.req.runtime.cloudflare
113
+ ++ const binding = env.MY_BINDING
114
+ ```
115
+
116
+ ## Changed nitro subpath imports
117
+
118
+ Nitro v2 introduced multiple subpath exports, some of which have been removed or updated:
119
+
120
+ - `nitro/rollup`, `nitropack/core` (use `nitro/builder`)
121
+ - `nitropack/runtime/*` (use `nitro/*`)
122
+ - `nitropack/kit` (removed)
123
+ - `nitropack/presets` (removed)
124
+ An experimental `nitropack/kit` was introduced but has now been removed. A standalone Nitro Kit package may be introduced in the future with clearer objectives.
125
+
126
+ **Migration:**
127
+
128
+ - Use `NitroModule` from `nitro/types` instead of `defineNitroModule` from the kit.
129
+ - Prefer built-in Nitro presets (external presets are only for evaluation purposes).
130
+
131
+ ## H3 v2
132
+ Nitro v3 upgrades to [H3 v2](https://h3.dev), which includes API changes. All H3 utilities are imported from `nitro/h3`.
133
+
134
+ ### Web Standards
135
+
136
+ H3 v2 is rewritten based on web standard primitives ([`URL`](https://developer.mozilla.org/en-US/docs/Web/API/URL), [`Headers`](https://developer.mozilla.org/en-US/docs/Web/API/Headers), [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request), and [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)).
137
+
138
+ Access to `event.node.{req,res}` is only available in Node.js runtime. `event.web` is renamed to `event.req` (instance of web [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request)).
139
+
140
+ ### Response Handling
141
+
142
+ You should always explicitly **return** the response body or **throw** an error:
143
+
144
+ ```diff
145
+ -- import { send, sendRedirect, sendStream } from "nitro/h3"
146
+ -- send(event, value)
147
+ -- sendStream(event, stream)
148
+ -- sendRedirect(event, location, code)
149
+ ++ import { redirect } from "nitro/h3"
150
+ ++ return value
151
+ ++ return stream
152
+ ++ return redirect(event, location, code)
153
+ ```
154
+
155
+ Other changes:
156
+
157
+ - `sendError(event, error)` → `throw createError(error)`
158
+ - `sendNoContent(event)` → `return noContent(event)`
159
+ - `sendProxy(event, target)` → `return proxy(event, target)`
160
+
161
+ ### Request Body
162
+ Most body utilities can be replaced with native `event.req` methods:
163
+
164
+ ```diff
165
+ -- import { readBody, readRawBody, readFormData } from "nitro/h3"
166
+ ++ // Use native Request methods
167
+ ++ const json = await event.req.json()
168
+ ++ const text = await event.req.text()
169
+ ++ const formData = await event.req.formData()
170
+ ++ const stream = event.req.body
171
+ ```
172
+
173
+ ### Headers
174
+
175
+ H3 now uses standard web [`Headers`](https://developer.mozilla.org/en-US/docs/Web/API/Headers). Header values are always plain `string` (no `null`, `undefined`, or `string[]`).
176
+
177
+ ```diff
178
+ -- import { getHeader, setHeader, getResponseStatus } from "nitro/h3"
179
+ -- getHeader(event, "x-foo")
180
+ -- setHeader(event, "x-foo", "bar")
181
+ ++ event.req.headers.get("x-foo")
182
+ ++ event.res.headers.set("x-foo", "bar")
183
+ ++ event.res.status // instead of getResponseStatus(event)
184
+ ```
185
+
186
+ ### Handler Utils
187
+
188
+ ```diff
189
+ -- import { eventHandler, defineEventHandler } from "nitro/h3"
190
+ ++ import { defineHandler } from "nitro"
191
+ ```
192
+
193
+ - `lazyEventHandler` → `defineLazyEventHandler`
194
+ - `useBase` → `withBase`
195
+
196
+ ### Error Utils
197
+
198
+ ```diff
199
+ -- import { createError, isError } from "nitro/h3"
200
+ ++ import { HTTPError } from "nitro"
201
+ ++ throw new HTTPError({ status: 404, message: "Not found" })
202
+ ++ HTTPError.isError(error)
203
+ ```
204
+
205
+ ### Node.js Utils
206
+
207
+ ```diff
208
+ -- import { defineNodeListener, fromNodeMiddleware, toNodeListener } from "nitro/h3"
209
+ ++ import { defineNodeHandler, fromNodeHandler, toNodeHandler } from "nitro/h3"
210
+ ```
211
+
212
+ ## Optional Hooks
213
+ If you were using `useNitroApp().hooks` outside of Nitro plugins before, it might be undefined. Use new `useNitroHooks()` to guarantee having an instance.
@@ -0,0 +1,31 @@
1
+ # Nightly Channel
2
+
3
+ > Nitro has a nightly release channel that automatically releases for every commit to `main` branch to try latest changes.
4
+
5
+ You can opt-in to the nightly release channel by updating your `package.json`:
6
+
7
+ ```json
8
+ {
9
+ "devDependencies": {
10
+ "nitro": "npm:nitro-nightly@latest"
11
+ }
12
+ }
13
+ ```
14
+
15
+ Remove the lockfile (`package-lock.json`, `yarn.lock`, `pnpm-lock.yaml`, `bun.lock`, or `bun.lockb`) and reinstall the dependencies.
16
+
17
+ <important>
18
+
19
+ When using **Bun as package manager** in a mono-repo, you need to make sure nitro package is properly hoisted.
20
+
21
+ ```toml [bunfig.toml]
22
+ [install]
23
+ publicHoistPattern = ["nitro*"]
24
+ ```
25
+ </important>
26
+
27
+ <important>
28
+
29
+ Avoid using `<npm|pnpm|yarn|bun|deno> install nitro-nightly`; it does not install correctly.
30
+ If you encounter issues, delete your `node_modules` and lock files, then follow the steps above.
31
+ </important>
@@ -0,0 +1,322 @@
1
+ # Nitro Renderer
2
+
3
+ > Use a renderer to handle all unmatched routes with custom HTML or a templating system.
4
+
5
+ The renderer is a special handler in Nitro that catches all routes that don't match any specific API or route handler. It's commonly used for server-side rendering (SSR), serving single-page applications (SPAs), or creating custom HTML responses.
6
+
7
+ ## Configuration
8
+
9
+ The renderer is configured using the `renderer` option in your Nitro config:
10
+
11
+ ```ts [nitro.config.ts]
12
+ import { defineConfig } from "nitro";
13
+
14
+ export default defineConfig({
15
+ renderer: {
16
+ template: './index.html', // Path to HTML template file
17
+ handler: './renderer.ts', // Path to custom renderer handler
18
+ static: false, // Treat template as static HTML (no rendu processing)
19
+ }
20
+ })
21
+ ```
22
+
23
+ | Option | Type | Description |
24
+ | --- | --- | --- |
25
+ | `template` | `string` | Path to an HTML file used as the renderer template. |
26
+ | `handler` | `string` | Path to a custom renderer handler module. |
27
+ | `static` | `boolean` | When `true`, skips rendu template processing and serves the HTML as-is. Auto-detected based on template syntax when not set. |
28
+
29
+ Set `renderer: false` in the config to explicitly disable the renderer entirely (including auto-detection of `index.html`).
30
+
31
+ ## HTML template
32
+
33
+ ### Auto-detected `index.html`
34
+
35
+ By default, Nitro automatically looks for an `index.html` file in your project src dir.
36
+
37
+ If found, Nitro will use it as the renderer template and serve it for all unmatched routes.
38
+
39
+ <code-group>
40
+
41
+ ```html [index.html]
42
+ <!DOCTYPE html>
43
+ <html lang="en">
44
+ <head>
45
+ <meta charset="UTF-8" />
46
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
47
+ <title>My Vite + Nitro App</title>
48
+ </head>
49
+ <body>
50
+ <div id="app"></div>
51
+ <script type="module" src="/src/main.ts"></script>
52
+ </body>
53
+ </html>
54
+ ```
55
+
56
+ ```ts [routes/api/hello.ts]
57
+ import { defineHandler } from "nitro";
58
+
59
+ export default defineHandler((event) => {
60
+ return { hello: "API" };
61
+ });
62
+ ```
63
+ </code-group>
64
+
65
+ <tip>
66
+
67
+ When `index.html` is detected, Nitro will automatically log in the terminal: `Using index.html as renderer template.`
68
+ </tip>
69
+
70
+ With this setup:
71
+
72
+ - `/api/hello` → Handled by your API routes
73
+ - `/about`, `/contact`, etc. → Served with `index.html`
74
+
75
+ ### Custom HTML file
76
+ You can specify a custom HTML template file using the `renderer.template` option in your Nitro configuration.
77
+
78
+ <code-group>
79
+
80
+ ```ts [nitro.config.ts]
81
+ import { defineConfig } from "nitro";
82
+
83
+ export default defineConfig({
84
+ renderer: {
85
+ template: './app.html'
86
+ }
87
+ })
88
+ ```
89
+
90
+ ```html [app.html]
91
+ <!DOCTYPE html>
92
+ <html lang="en">
93
+ <head>
94
+ <meta charset="UTF-8" />
95
+ <title>Custom Template</title>
96
+ </head>
97
+ <body>
98
+ <div id="root">Loading...</div>
99
+ <script type="module" src="/src/main.js"></script>
100
+ </body>
101
+ </html>
102
+ ```
103
+ </code-group>
104
+
105
+ ### Static templates
106
+
107
+ By default, Nitro auto-detects whether your HTML template contains [rendu](#hypertext-preprocessor-experimental) syntax. If it does, the template is processed dynamically on each request. If it doesn't, it's served as static HTML.
108
+
109
+ You can override this behavior with the `static` option:
110
+
111
+ ```ts [nitro.config.ts]
112
+ import { defineConfig } from "nitro";
113
+
114
+ export default defineConfig({
115
+ renderer: {
116
+ template: './index.html',
117
+ static: true // Force static serving, skip template processing
118
+ }
119
+ })
120
+ ```
121
+
122
+ In production, static templates are inlined into the server bundle and served directly for optimal performance.
123
+
124
+ ### Hypertext Preprocessor (experimental)
125
+
126
+ Nitro uses [rendu](https://github.com/h3js/rendu) Hypertext Preprocessor, which provides a simple and powerful way to create dynamic HTML templates with JavaScript expressions.
127
+
128
+ #### Output expressions
129
+
130
+ - `{{ expression }}` — HTML-escaped output
131
+ - `{{{ expression }}}` or `<?= expression ?>` — raw (unescaped) output
132
+
133
+ ```html
134
+ <h1>Hello {{ $URL.pathname }}</h1>
135
+ <div>{{{ '<strong>raw html</strong>' }}}</div>
136
+ ```
137
+
138
+ #### Control flow
139
+ Use `<? ... ?>` for JavaScript control flow:
140
+
141
+ ```html
142
+ <? if ($METHOD === 'POST') { ?>
143
+ <p>Form submitted!</p>
144
+ <? } else { ?>
145
+ <form method="POST">
146
+ <button type="submit">Submit</button>
147
+ </form>
148
+ <? } ?>
149
+
150
+ <ul>
151
+ <? for (const item of ['a', 'b', 'c']) { ?>
152
+ <li>{{ item }}</li>
153
+ <? } ?>
154
+ </ul>
155
+ ```
156
+
157
+ #### Server scripts
158
+
159
+ Use `<script server>` to execute JavaScript on the server:
160
+
161
+ ```html
162
+ <script server>
163
+ const data = await fetch('https://api.example.com/data').then(r => r.json());
164
+ </script>
165
+ <pre>{{ JSON.stringify(data) }}</pre>
166
+ ```
167
+
168
+ #### Streaming content
169
+
170
+ Use the `echo()` function for streaming content. It accepts strings, functions, Promises, Response objects, or ReadableStreams:
171
+
172
+ ```html
173
+ <script server>
174
+ echo("Loading...");
175
+ echo(async () => fetch("https://api.example.com/data"));
176
+ </script>
177
+ ```
178
+
179
+ #### Global variables
180
+
181
+ Access request context within templates:
182
+
183
+ | Variable | Description |
184
+ | --- | --- |
185
+ | `$REQUEST` | The incoming `Request` object |
186
+ | `$METHOD` | HTTP method (`GET`, `POST`, etc.) |
187
+ | `$URL` | Request `URL` object |
188
+ | `$HEADERS` | Request headers |
189
+ | `$RESPONSE` | Response configuration object |
190
+ | `$COOKIES` | Read-only object containing request cookies |
191
+
192
+ #### Built-in functions
193
+
194
+ | Function | Description |
195
+ | --- | --- |
196
+ | `htmlspecialchars(str)` | Escape HTML characters (automatically applied in `{{ }}` syntax) |
197
+ | `setCookie(name, value, options?)` | Set a cookie in the response |
198
+ | `redirect(url)` | Redirect the user to another URL |
199
+ | `echo(content)` | Stream content to the response |
200
+
201
+ ```html [index.html]
202
+ <!DOCTYPE html>
203
+ <html lang="en">
204
+ <head>
205
+ <meta charset="UTF-8" />
206
+ <title>Dynamic template</title>
207
+ </head>
208
+ <body>
209
+ <h1>Hello {{ $REQUEST.url }}</h1>
210
+ <p>Welcome, <?= $COOKIES["user"] || "Guest" ?>!</p>
211
+ <script server>
212
+ setCookie("visited", "true", { maxAge: 3600 });
213
+ </script>
214
+ </body>
215
+ </html>
216
+ ```
217
+
218
+ <read-more></read-more>
219
+
220
+ ## Custom renderer handler
221
+
222
+ For more complex scenarios, you can create a custom renderer handler that programmatically generates responses.
223
+
224
+ The handler is a default export function that receives an H3 event object. You can access the incoming `Request` via `event.req`:
225
+
226
+ ```ts [renderer.ts]
227
+ export default function renderer({ req }: { req: Request }) {
228
+ const url = new URL(req.url);
229
+ return new Response(
230
+ /* html */ `<!DOCTYPE html>
231
+ <html>
232
+ <head>
233
+ <title>Custom Renderer</title>
234
+ </head>
235
+ <body>
236
+ <h1>Hello from custom renderer!</h1>
237
+ <p>Current path: ${url.pathname}</p>
238
+ </body>
239
+ </html>`,
240
+ { headers: { "content-type": "text/html; charset=utf-8" } }
241
+ );
242
+ }
243
+ ```
244
+
245
+ Then, specify the renderer entry in the Nitro config:
246
+
247
+ ```ts [nitro.config.ts]
248
+ import { defineConfig } from "nitro";
249
+
250
+ export default defineConfig({
251
+ renderer: {
252
+ handler: './renderer.ts'
253
+ }
254
+ })
255
+ ```
256
+
257
+ <note>
258
+
259
+ When `renderer.handler` is set, it takes full control of rendering. The `renderer.template` option is ignored.
260
+ </note>
261
+
262
+ ## Renderer priority
263
+
264
+ The renderer always acts as a catch-all route (`/**`) and has the **lowest priority**. This means:
265
+
266
+ 1. Specific API routes are matched first (e.g., `/api/users`)
267
+ 2. Specific server routes are matched next (e.g., `/about`)
268
+ 3. The renderer catches everything else
269
+
270
+ ```md
271
+ api/
272
+ users.ts → /api/users (matched first)
273
+ routes/
274
+ about.ts → /about (matched second)
275
+ renderer.ts → /** (catches all other routes)
276
+ ```
277
+
278
+ <warning>
279
+
280
+ If you define a catch-all route (`[...].ts`) in your routes, Nitro will warn you that the renderer will override it. Use more specific routes or different HTTP methods to avoid conflicts.
281
+ </warning>
282
+
283
+ <read-more></read-more>
284
+
285
+ ## Vite integration
286
+
287
+ When using Nitro with Vite, the renderer integrates with Vite's build pipeline and dev server.
288
+
289
+ ### Development mode
290
+
291
+ In development, the renderer template is read from disk on each request, so changes to `index.html` are reflected immediately without restarting the server. Vite's `transformIndexHtml` hook is applied to inject HMR client scripts and other dev-time transforms.
292
+
293
+ ### SSR with `<!--ssr-outlet-->`
294
+
295
+ When using Vite environments with an `ssr` service, you can add an `<!--ssr-outlet-->` comment to your `index.html`. Nitro will replace it with the output from your SSR entry during rendering:
296
+
297
+ ```html [index.html]
298
+ <!DOCTYPE html>
299
+ <html lang="en">
300
+ <head>
301
+ <meta charset="UTF-8" />
302
+ <title>SSR App</title>
303
+ </head>
304
+ <body>
305
+ <div id="app"><!--ssr-outlet--></div>
306
+ <script type="module" src="/src/main.ts"></script>
307
+ </body>
308
+ </html>
309
+ ```
310
+
311
+ ### Production build
312
+
313
+ During production builds, Vite processes the `index.html` through its build pipeline (resolving scripts, CSS, and other assets), then Nitro inlines the transformed HTML into the server bundle.
314
+
315
+ ## Use Cases
316
+
317
+ ### Single-Page Application (SPA)
318
+
319
+ Serve your SPA's `index.html` for all routes to enable client-side routing:
320
+
321
+ > [!TIP]
322
+ > This is the default behavior of Nitro when used with Vite.