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,113 @@
1
+ # Custom Renderer
2
+
3
+ > Build a custom HTML renderer in Nitro with server-side data fetching.
4
+
5
+ <code-tree>
6
+
7
+ ```ts [nitro.config.ts]
8
+ import { defineConfig } from "nitro";
9
+
10
+ export default defineConfig({
11
+ serverDir: "./",
12
+ renderer: { handler: "./renderer" },
13
+ });
14
+ ```
15
+
16
+ ```json [package.json]
17
+ {
18
+ "type": "module",
19
+ "scripts": {
20
+ "dev": "nitro dev",
21
+ "build": "nitro build"
22
+ },
23
+ "devDependencies": {
24
+ "nitro": "latest"
25
+ }
26
+ }
27
+ ```
28
+
29
+ ```ts [renderer.ts]
30
+ import { fetch } from "nitro";
31
+
32
+ export default async function renderer({ url }: { req: Request; url: URL }) {
33
+ const apiRes = await fetch("/api/hello").then((res) => res.text());
34
+ return new Response(
35
+ /* html */ `<!DOCTYPE html>
36
+ <html>
37
+ <head>
38
+ <title>Custom Renderer</title>
39
+ </head>
40
+ <body>
41
+ <h1>Hello from custom renderer!</h1>
42
+ <p>Current path: ${url.pathname}</p>
43
+ <p>API says: ${apiRes}</p>
44
+ </body>
45
+ </html>`,
46
+ { headers: { "content-type": "text/html; charset=utf-8" } }
47
+ );
48
+ }
49
+ ```
50
+
51
+ ```json [tsconfig.json]
52
+ {
53
+ "extends": "nitro/tsconfig"
54
+ }
55
+ ```
56
+
57
+ ```ts [vite.config.ts]
58
+ import { defineConfig } from "vite";
59
+ import { nitro } from "nitro/vite";
60
+
61
+ export default defineConfig({ plugins: [nitro()] });
62
+ ```
63
+
64
+ ```ts [api/hello.ts]
65
+ import { defineHandler } from "nitro";
66
+
67
+ export default defineHandler(() => "Nitro is amazing!");
68
+ ```
69
+ </code-tree>
70
+
71
+ Create a custom renderer that generates HTML responses with data from API routes. Use Nitro's internal `fetch` to call routes without network overhead.
72
+
73
+ ## Renderer
74
+
75
+ ```ts [renderer.ts]
76
+ import { fetch } from "nitro";
77
+
78
+ export default async function renderer({ url }: { req: Request; url: URL }) {
79
+ const apiRes = await fetch("/api/hello").then((res) => res.text());
80
+ return new Response(
81
+ /* html */ `<!DOCTYPE html>
82
+ <html>
83
+ <head>
84
+ <title>Custom Renderer</title>
85
+ </head>
86
+ <body>
87
+ <h1>Hello from custom renderer!</h1>
88
+ <p>Current path: ${url.pathname}</p>
89
+ <p>API says: ${apiRes}</p>
90
+ </body>
91
+ </html>`,
92
+ { headers: { "content-type": "text/html; charset=utf-8" } }
93
+ );
94
+ }
95
+ ```
96
+
97
+ Nitro auto-detects `renderer.ts` in your project root and uses it for all non-API routes. The renderer function receives the request URL and returns a `Response`.
98
+
99
+ Use `fetch` from `nitro` to call API routes without network overhead—these requests stay in-process.
100
+
101
+ ## API Route
102
+
103
+ ```ts [api/hello.ts]
104
+ import { defineHandler } from "nitro";
105
+
106
+ export default defineHandler(() => "Nitro is amazing!");
107
+ ```
108
+
109
+ Define API routes in the `api/` directory. When the renderer calls `fetch("/api/hello")`, this handler runs and returns its response.
110
+
111
+ ## Learn More
112
+
113
+ - [Renderer](/docs/renderer)
@@ -0,0 +1,97 @@
1
+ # Runtime Config
2
+
3
+ > Environment-aware configuration with runtime access.
4
+
5
+ <code-tree>
6
+
7
+ ```ts [nitro.config.ts]
8
+ import { defineConfig } from "nitro";
9
+
10
+ export default defineConfig({
11
+ serverDir: "./",
12
+ runtimeConfig: {
13
+ apiKey: "",
14
+ },
15
+ });
16
+ ```
17
+
18
+ ```json [package.json]
19
+ {
20
+ "type": "module",
21
+ "scripts": {
22
+ "dev": "nitro dev",
23
+ "build": "nitro build"
24
+ },
25
+ "devDependencies": {
26
+ "nitro": "latest"
27
+ }
28
+ }
29
+ ```
30
+
31
+ ```ts [server.ts]
32
+ import { defineHandler } from "nitro";
33
+ import { useRuntimeConfig } from "nitro/runtime-config";
34
+
35
+ export default defineHandler((event) => {
36
+ const runtimeConfig = useRuntimeConfig();
37
+ return { runtimeConfig };
38
+ });
39
+ ```
40
+
41
+ ```json [tsconfig.json]
42
+ {
43
+ "extends": "nitro/tsconfig"
44
+ }
45
+ ```
46
+
47
+ ```ts [vite.config.ts]
48
+ import { defineConfig } from "vite";
49
+ import { nitro } from "nitro/vite";
50
+
51
+ export default defineConfig({ plugins: [nitro()] });
52
+ ```
53
+ </code-tree>
54
+
55
+ Runtime config lets you define configuration values that can be overridden by environment variables at runtime.
56
+
57
+ ## Define Config Schema
58
+
59
+ Declare your runtime config with default values in `nitro.config.ts`:
60
+
61
+ ```ts [nitro.config.ts]
62
+ import { defineConfig } from "nitro";
63
+
64
+ export default defineConfig({
65
+ serverDir: "./",
66
+ runtimeConfig: {
67
+ apiKey: "",
68
+ },
69
+ });
70
+ ```
71
+
72
+ ## Access at Runtime
73
+
74
+ Use `useRuntimeConfig` to access configuration values in your handlers:
75
+
76
+ ```ts [server.ts]
77
+ import { defineHandler } from "nitro";
78
+ import { useRuntimeConfig } from "nitro/runtime-config";
79
+
80
+ export default defineHandler((event) => {
81
+ const runtimeConfig = useRuntimeConfig();
82
+ return { runtimeConfig };
83
+ });
84
+ ```
85
+
86
+ ## Environment Variables
87
+
88
+ Override config values via environment variables prefixed with `NITRO_`:
89
+
90
+ ```sh [.env]
91
+ # NEVER COMMIT SENSITIVE DATA. THIS IS ONLY FOR DEMO PURPOSES.
92
+ NITRO_API_KEY=secret-api-key
93
+ ```
94
+
95
+ ## Learn More
96
+
97
+ - [Configuration](/docs/configuration)
@@ -0,0 +1,87 @@
1
+ # Server Fetch
2
+
3
+ > Internal server-to-server requests without network overhead.
4
+
5
+ <code-tree>
6
+
7
+ ```ts [nitro.config.ts]
8
+ import { defineConfig, serverFetch } from "nitro";
9
+
10
+ export default defineConfig({
11
+ serverDir: "./",
12
+ hooks: {
13
+ "dev:start": async () => {
14
+ const res = await serverFetch("/hello");
15
+ const text = await res.text();
16
+ console.log("Fetched /hello in nitro module:", res.status, text);
17
+ },
18
+ },
19
+ });
20
+ ```
21
+
22
+ ```json [package.json]
23
+ {
24
+ "type": "module",
25
+ "scripts": {
26
+ "dev": "nitro dev",
27
+ "build": "nitro build"
28
+ },
29
+ "devDependencies": {
30
+ "nitro": "latest"
31
+ }
32
+ }
33
+ ```
34
+
35
+ ```json [tsconfig.json]
36
+ {
37
+ "extends": "nitro/tsconfig"
38
+ }
39
+ ```
40
+
41
+ ```ts [vite.config.ts]
42
+ import { defineConfig } from "vite";
43
+ import { nitro } from "nitro/vite";
44
+
45
+ export default defineConfig({ plugins: [nitro()] });
46
+ ```
47
+
48
+ ```ts [routes/hello.ts]
49
+ import { defineHandler } from "nitro";
50
+
51
+ export default defineHandler(() => "Hello!");
52
+ ```
53
+
54
+ ```ts [routes/index.ts]
55
+ import { defineHandler } from "nitro";
56
+ import { fetch } from "nitro";
57
+
58
+ export default defineHandler(() => fetch("/hello"));
59
+ ```
60
+ </code-tree>
61
+
62
+ When you need one route to call another, use Nitro's `fetch` function instead of the global fetch. It makes internal requests that stay in-process, avoiding network round-trips. The request never leaves the server.
63
+
64
+ ## Main Route
65
+
66
+ ```ts [routes/index.ts]
67
+ import { defineHandler } from "nitro";
68
+ import { fetch } from "nitro";
69
+
70
+ export default defineHandler(() => fetch("/hello"));
71
+ ```
72
+
73
+ The index route imports `fetch` from `nitro` (not the global fetch) and calls the `/hello` route. This request is handled internally without going through the network stack.
74
+
75
+ ## Internal API Route
76
+
77
+ ```ts [routes/hello.ts]
78
+ import { defineHandler } from "nitro";
79
+
80
+ export default defineHandler(() => "Hello!");
81
+ ```
82
+
83
+ A simple route that returns "Hello!". When the index route calls `fetch("/hello")`, this handler runs and its response is returned directly.
84
+
85
+ ## Learn More
86
+
87
+ - [Routing](/docs/routing)
@@ -0,0 +1,198 @@
1
+ # Shiki
2
+
3
+ > Server-side syntax highlighting in Nitro with Shiki.
4
+
5
+ <code-tree>
6
+
7
+ ```html [index.html]
8
+ <!doctype html>
9
+ <html lang="en">
10
+ <head>
11
+ <meta charset="utf-8" />
12
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
13
+ <title>Hello World Snippet</title>
14
+ <link rel="stylesheet" href="styles.css" />
15
+ </head>
16
+ <body>
17
+ <div class="card" role="region" aria-label="Code snippet">
18
+ <div class="label">JavaScript</div>
19
+ <script server>
20
+ const hl = (code) =>
21
+ serverFetch("/api/highlight", {
22
+ method: "POST",
23
+ body: code,
24
+ });
25
+ </script>
26
+ <pre><code>{{{ hl(`console.log("💚 Simple is beautiful!");`) }}}</code></pre>
27
+ </div>
28
+ </body>
29
+ </html>
30
+ ```
31
+
32
+ ```ts [nitro.config.ts]
33
+ import { defineConfig } from "nitro";
34
+
35
+ export default defineConfig({
36
+ serverDir: "./",
37
+ });
38
+ ```
39
+
40
+ ```json [package.json]
41
+ {
42
+ "type": "module",
43
+ "scripts": {
44
+ "dev": "vite dev",
45
+ "build": "vite build"
46
+ },
47
+ "devDependencies": {
48
+ "nitro": "latest",
49
+ "shiki": "latest"
50
+ }
51
+ }
52
+ ```
53
+
54
+ ```css [styles.css]
55
+ html,
56
+ body {
57
+ height: 100%;
58
+ margin: 0;
59
+ }
60
+ body {
61
+ display: flex;
62
+ align-items: center;
63
+ justify-content: center;
64
+ background: #f6f8fa;
65
+ font-family:
66
+ system-ui,
67
+ -apple-system,
68
+ "Segoe UI",
69
+ Roboto,
70
+ "Helvetica Neue",
71
+ Arial,
72
+ "Noto Sans",
73
+ "Liberation Sans",
74
+ sans-serif;
75
+ }
76
+ .card {
77
+ text-align: left;
78
+ background: #0b1220;
79
+ color: #e6edf3;
80
+ padding: 1rem;
81
+ border-radius: 8px;
82
+ box-shadow: 0 8px 24px rgba(2, 6, 23, 0.2);
83
+ max-width: 90%;
84
+ width: 520px;
85
+ }
86
+ .label {
87
+ font-size: 12px;
88
+ color: #9aa7b2;
89
+ margin-bottom: 8px;
90
+ }
91
+ pre {
92
+ margin: 0;
93
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, "Courier New", monospace;
94
+ font-size: 14px;
95
+ background: transparent;
96
+ white-space: pre;
97
+ overflow: auto;
98
+ }
99
+ ```
100
+
101
+ ```json [tsconfig.json]
102
+ {
103
+ "extends": "nitro/tsconfig"
104
+ }
105
+ ```
106
+
107
+ ```ts [vite.config.ts]
108
+ import { defineConfig } from "vite";
109
+ import { nitro } from "nitro/vite";
110
+
111
+ export default defineConfig({
112
+ plugins: [nitro()],
113
+ });
114
+ ```
115
+
116
+ ```ts [api/highlight.ts]
117
+ import { createHighlighterCore } from "shiki/core";
118
+ import { createOnigurumaEngine } from "shiki/engine/oniguruma";
119
+
120
+ const highlighter = await createHighlighterCore({
121
+ engine: createOnigurumaEngine(import("shiki/wasm")),
122
+ themes: [await import("shiki/themes/vitesse-dark.mjs")],
123
+ langs: [await import("shiki/langs/ts.mjs")],
124
+ });
125
+
126
+ export default async ({ req }: { req: Request }) => {
127
+ const code = await req.text();
128
+ const html = await highlighter.codeToHtml(code, {
129
+ lang: "ts",
130
+ theme: "vitesse-dark",
131
+ });
132
+ return new Response(html, {
133
+ headers: { "Content-Type": "text/html; charset=utf-8" },
134
+ });
135
+ };
136
+ ```
137
+ </code-tree>
138
+
139
+ Use Shiki for syntax highlighting with TextMate grammars. This example highlights code on the server using Nitro's server scripts feature, which runs JavaScript inside HTML files before sending the response.
140
+
141
+ ## API Route
142
+
143
+ ```ts [api/highlight.ts]
144
+ import { createHighlighterCore } from "shiki/core";
145
+ import { createOnigurumaEngine } from "shiki/engine/oniguruma";
146
+
147
+ const highlighter = await createHighlighterCore({
148
+ engine: createOnigurumaEngine(import("shiki/wasm")),
149
+ themes: [await import("shiki/themes/vitesse-dark.mjs")],
150
+ langs: [await import("shiki/langs/ts.mjs")],
151
+ });
152
+
153
+ export default async ({ req }: { req: Request }) => {
154
+ const code = await req.text();
155
+ const html = await highlighter.codeToHtml(code, {
156
+ lang: "ts",
157
+ theme: "vitesse-dark",
158
+ });
159
+ return new Response(html, {
160
+ headers: { "Content-Type": "text/html; charset=utf-8" },
161
+ });
162
+ };
163
+ ```
164
+
165
+ Create a Shiki highlighter with the Vitesse Dark theme and TypeScript language support. When the API receives a POST request, it reads the code from the request body and returns highlighted HTML.
166
+
167
+ ## Server-Side Rendering
168
+
169
+ ```html [index.html]
170
+ <!doctype html>
171
+ <html lang="en">
172
+ <head>
173
+ <meta charset="utf-8" />
174
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
175
+ <title>Hello World Snippet</title>
176
+ <link rel="stylesheet" href="styles.css" />
177
+ </head>
178
+ <body>
179
+ <div class="card" role="region" aria-label="Code snippet">
180
+ <div class="label">JavaScript</div>
181
+ <script server>
182
+ const hl = (code) =>
183
+ serverFetch("/api/highlight", {
184
+ method: "POST",
185
+ body: code,
186
+ });
187
+ </script>
188
+ <pre><code>{{{ hl(`console.log("💚 Simple is beautiful!");`) }}}</code></pre>
189
+ </div>
190
+ </body>
191
+ </html>
192
+ ```
193
+
194
+ The `<script server>` tag runs on the server before the HTML is sent. It defines a helper function that calls the highlight API using `serverFetch`. The triple-brace syntax `{{{ }}}` outputs the result without escaping, so the highlighted HTML renders correctly.
195
+
196
+ ## Learn More
197
+
198
+ - [Shiki](https://shiki.style/)
@@ -0,0 +1,92 @@
1
+ # Auto Imports
2
+
3
+ > Automatic imports for utilities and composables.
4
+
5
+ <code-tree>
6
+
7
+ ```ts [nitro.config.ts]
8
+ import { defineConfig } from "nitro";
9
+
10
+ export default defineConfig({
11
+ serverDir: true,
12
+ imports: {},
13
+ });
14
+ ```
15
+
16
+ ```json [package.json]
17
+ {
18
+ "type": "module",
19
+ "scripts": {
20
+ "dev": "nitro dev",
21
+ "build": "nitro build"
22
+ },
23
+ "devDependencies": {
24
+ "nitro": "latest"
25
+ }
26
+ }
27
+ ```
28
+
29
+ ```ts [server.ts]
30
+ import { defineHandler } from "nitro";
31
+ import { makeGreeting } from "./server/utils/hello.ts";
32
+
33
+ export default defineHandler(() => `<h1>${makeGreeting("Nitro")}</h1>`);
34
+ ```
35
+
36
+ ```json [tsconfig.json]
37
+ {
38
+ "include": [".nitro/types/nitro-imports.d.ts", "src"]
39
+ }
40
+ ```
41
+
42
+ ```ts [vite.config.ts]
43
+ import { defineConfig } from "vite";
44
+ import { nitro } from "nitro/vite";
45
+
46
+ export default defineConfig({ plugins: [nitro()] });
47
+ ```
48
+
49
+ ```ts [server/utils/hello.ts]
50
+ export function makeGreeting(name: string) {
51
+ return `Hello, ${name}!`;
52
+ }
53
+ ```
54
+ </code-tree>
55
+
56
+ Functions exported from `server/utils/` are automatically available without explicit imports when auto-imports are enabled. Define a utility once and use it anywhere in your server code.
57
+
58
+ ## Configuration
59
+
60
+ Enable auto-imports by setting `imports` in your config:
61
+
62
+ ```ts [nitro.config.ts]
63
+ import { defineConfig } from "nitro";
64
+
65
+ export default defineConfig({
66
+ serverDir: true,
67
+ imports: {},
68
+ });
69
+ ```
70
+
71
+ ## Using Auto Imports
72
+
73
+ 1. Create a utility file in `server/utils/`:
74
+
75
+ ```ts [server/utils/hello.ts]
76
+ export function makeGreeting(name: string) {
77
+ return `Hello, ${name}!`;
78
+ }
79
+ ```
80
+
81
+ 2. The function is available without importing it:
82
+
83
+ ```ts [server.ts]
84
+ import { defineHandler } from "nitro";
85
+
86
+ export default defineHandler(() => `<h1>${makeGreeting("Nitro")}</h1>`);
87
+ ```
88
+ With this setup, any function exported from `server/utils/` becomes globally available. Nitro scans the directory and generates the necessary imports automatically.
89
+
90
+ ## Learn More
91
+
92
+ - [Configuration](/docs/configuration)
@@ -0,0 +1,74 @@
1
+ # Virtual Routes
2
+
3
+ > Define routes programmatically using Nitro's virtual module system.
4
+
5
+ <code-tree>
6
+
7
+ ```ts [nitro.config.ts]
8
+ import { defineConfig } from "nitro";
9
+
10
+ export default defineConfig({
11
+ routes: {
12
+ "/": "#virtual-route",
13
+ },
14
+ virtual: {
15
+ "#virtual-route": () =>
16
+ /* js */ `export default () => new Response("Hello from virtual entry!")`,
17
+ },
18
+ });
19
+ ```
20
+
21
+ ```json [package.json]
22
+ {
23
+ "type": "module",
24
+ "scripts": {
25
+ "build": "nitro build",
26
+ "dev": "nitro dev",
27
+ "preview": "node .output/server/index.mjs"
28
+ },
29
+ "devDependencies": {
30
+ "nitro": "latest"
31
+ }
32
+ }
33
+ ```
34
+
35
+ ```json [tsconfig.json]
36
+ {
37
+ "extends": "nitro/tsconfig"
38
+ }
39
+ ```
40
+
41
+ ```ts [vite.config.ts]
42
+ import { defineConfig } from "vite";
43
+ import { nitro } from "nitro/vite";
44
+
45
+ export default defineConfig({ plugins: [nitro()] });
46
+ ```
47
+ </code-tree>
48
+
49
+ Virtual routes let you define handlers as strings in your config instead of creating separate files. This is useful when generating routes dynamically, building plugins, or keeping simple routes inline.
50
+
51
+ ## Configuration
52
+
53
+ ```ts [nitro.config.ts]
54
+ import { defineConfig } from "nitro";
55
+
56
+ export default defineConfig({
57
+ routes: {
58
+ "/": "#virtual-route",
59
+ },
60
+ virtual: {
61
+ "#virtual-route": () =>
62
+ /* js */ `export default () => new Response("Hello from virtual entry!")`,
63
+ },
64
+ });
65
+ ```
66
+
67
+ The `routes` option maps URL paths to virtual module identifiers (prefixed with `#`). The `virtual` option defines the module content as a string or function returning a string. At build time, Nitro resolves these virtual modules to actual handlers.
68
+
69
+ There are no route files in this project. The entire handler is defined inline in the config, and Nitro generates the route at build time.
70
+
71
+ ## Learn More
72
+
73
+ - [Routing](/docs/routing)
74
+ - [Configuration](/docs/configuration)