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.
- package/LICENSE +6 -0
- package/README.md +2 -2
- package/dist/THIRD-PARTY-LICENSES.md +1646 -0
- package/dist/_build/common.mjs +7261 -3812
- package/dist/_build/rolldown.mjs +32 -42
- package/dist/_build/rollup.mjs +28 -48
- package/dist/_build/vite.build.mjs +10 -10
- package/dist/_chunks/nitro.mjs +102 -327
- package/dist/_chunks/nitro2.mjs +8 -9
- package/dist/_chunks/nitro3.mjs +136 -0
- package/dist/_chunks/nitro4.mjs +127 -0
- package/dist/_chunks/utils.mjs +40 -29
- package/dist/_common.mjs +13 -25
- package/dist/_dev.d.mts +0 -3
- package/dist/{_chunks/dev.mjs → _dev.mjs} +132 -330
- package/dist/_libs/_.mjs +2 -0
- package/dist/_libs/_2.mjs +2 -0
- package/dist/_libs/_3.mjs +2 -0
- package/dist/_libs/_4.mjs +2 -0
- package/dist/_libs/_5.mjs +2 -0
- package/dist/_libs/_6.mjs +2 -0
- package/dist/_libs/_7.mjs +2 -0
- package/dist/_libs/c12+rc9.mjs +814 -0
- package/dist/_libs/{c12+giget+readdirp+chokidar.d.mts → c12+readdirp+chokidar.d.mts} +49 -40
- package/dist/_libs/citty.mjs +142 -41
- package/dist/_libs/commondir+is-reference.mjs +60 -56
- package/dist/_libs/compatx.d.mts +0 -2
- package/dist/_libs/compatx.mjs +1 -4
- package/dist/_libs/esbuild.d.mts +0 -1
- package/dist/_libs/escape-string-regexp.mjs +1 -4
- package/dist/_libs/{pluginutils+plugin-commonjs.d.mts → estree+pluginutils.d.mts} +0 -5
- package/dist/_libs/estree-walker.mjs +4 -92
- package/dist/_libs/exsolve.d.mts +1 -0
- package/dist/_libs/hasown+resolve+deepmerge.mjs +160 -246
- package/dist/_libs/httpxy.d.mts +20 -13
- package/dist/_libs/httpxy.mjs +519 -95
- package/dist/_libs/js-tokens.d.mts +1 -0
- package/dist/_libs/klona.mjs +1 -4
- package/dist/_libs/magic-string.d.mts +0 -2
- package/dist/_libs/mlly.d.mts +0 -2
- package/dist/_libs/nypm+tinyexec.mjs +822 -0
- package/dist/_libs/perfect-debounce.mjs +68 -0
- package/dist/_libs/pkg-types.d.mts +0 -3
- package/dist/_libs/plugin-alias.mjs +1 -5
- package/dist/_libs/plugin-inject.mjs +1 -7
- package/dist/_libs/plugin-json.mjs +1 -5
- package/dist/_libs/pluginutils.mjs +3 -35
- package/dist/_libs/readdirp+chokidar.mjs +187 -365
- package/dist/_libs/remapping.mjs +1 -5
- package/dist/_libs/resolve-uri+gen-mapping.mjs +15 -53
- package/dist/_libs/rou3.d.mts +1 -4
- package/dist/_libs/rou3.mjs +223 -78
- package/dist/_libs/std-env.d.mts +8 -2
- package/dist/_libs/strip-literal.d.mts +1 -0
- package/dist/_libs/tsconfck.mjs +21 -334
- package/dist/_libs/ultrahtml.mjs +3 -16
- package/dist/_libs/unimport+unplugin.mjs +244 -388
- package/dist/_libs/unplugin+unimport.d.mts +5 -15
- package/dist/_libs/unwasm.d.mts +0 -3
- package/dist/_presets.mjs +576 -488
- package/dist/builder.d.mts +5 -25
- package/dist/builder.mjs +3 -8
- package/dist/cli/_chunks/build.mjs +22 -25
- package/dist/cli/_chunks/common.mjs +1 -4
- package/dist/cli/_chunks/deploy.mjs +37 -0
- package/dist/cli/_chunks/dev.mjs +6 -11
- package/dist/cli/_chunks/docs.mjs +28 -0
- package/dist/cli/_chunks/list.mjs +4 -8
- package/dist/cli/_chunks/prepare.mjs +2 -6
- package/dist/cli/_chunks/preview.mjs +48 -0
- package/dist/cli/_chunks/run.mjs +7 -11
- package/dist/cli/_chunks/task.mjs +1 -5
- package/dist/cli/index.mjs +5 -6
- package/dist/docs/0.docs/0.index/index.md +56 -0
- package/dist/docs/0.docs/1.quick-start.md +110 -0
- package/dist/docs/0.docs/10.lifecycle.md +204 -0
- package/dist/docs/0.docs/11.openapi.md +291 -0
- package/dist/docs/0.docs/12.plugins.md +164 -0
- package/dist/docs/0.docs/13.tasks.md +277 -0
- package/dist/docs/0.docs/14.websocket.md +386 -0
- package/dist/docs/0.docs/15.migration.md +213 -0
- package/dist/docs/0.docs/16.nightly.md +31 -0
- package/dist/docs/0.docs/2.renderer.md +322 -0
- package/dist/docs/0.docs/3.routing.md +711 -0
- package/dist/docs/0.docs/4.server-entry.md +239 -0
- package/dist/docs/0.docs/5.cache.md +408 -0
- package/dist/docs/0.docs/6.storage.md +261 -0
- package/dist/docs/0.docs/7.assets.md +166 -0
- package/dist/docs/0.docs/8.configuration.md +256 -0
- package/dist/docs/0.docs/9.database.md +185 -0
- package/dist/docs/1.deploy/0.index/index.md +64 -0
- package/dist/docs/1.deploy/1.runtimes/0.node.md +63 -0
- package/dist/docs/1.deploy/1.runtimes/1.bun.md +15 -0
- package/dist/docs/1.deploy/1.runtimes/2.deno.md +19 -0
- package/dist/docs/1.deploy/2.providers/0.alwaysdata.md +50 -0
- package/dist/docs/1.deploy/2.providers/1.aws.md +47 -0
- package/dist/docs/1.deploy/2.providers/10.flightcontrol.md +67 -0
- package/dist/docs/1.deploy/2.providers/11.genezio.md +67 -0
- package/dist/docs/1.deploy/2.providers/12.github-pages.md +68 -0
- package/dist/docs/1.deploy/2.providers/13.gitlab-pages.md +37 -0
- package/dist/docs/1.deploy/2.providers/14.heroku.md +84 -0
- package/dist/docs/1.deploy/2.providers/15.iis.md +38 -0
- package/dist/docs/1.deploy/2.providers/16.koyeb.md +109 -0
- package/dist/docs/1.deploy/2.providers/17.netlify.md +47 -0
- package/dist/docs/1.deploy/2.providers/18.platform-sh.md +37 -0
- package/dist/docs/1.deploy/2.providers/19.render.md +37 -0
- package/dist/docs/1.deploy/2.providers/2.aws-amplify.md +81 -0
- package/dist/docs/1.deploy/2.providers/20.stormkit.md +24 -0
- package/dist/docs/1.deploy/2.providers/21.vercel.md +270 -0
- package/dist/docs/1.deploy/2.providers/22.zeabur.md +19 -0
- package/dist/docs/1.deploy/2.providers/23.zephyr.md +99 -0
- package/dist/docs/1.deploy/2.providers/24.zerops.md +102 -0
- package/dist/docs/1.deploy/2.providers/3.azure.md +72 -0
- package/dist/docs/1.deploy/2.providers/4.cleavr.md +33 -0
- package/dist/docs/1.deploy/2.providers/5.cloudflare.md +369 -0
- package/dist/docs/1.deploy/2.providers/6.deno-deploy.md +66 -0
- package/dist/docs/1.deploy/2.providers/7.digitalocean.md +46 -0
- package/dist/docs/1.deploy/2.providers/8.edgeone.md +20 -0
- package/dist/docs/1.deploy/2.providers/9.firebase.md +32 -0
- package/dist/docs/2.config/0.index/index.md +1221 -0
- package/dist/docs/3.examples/0.index/index.md +3 -0
- package/dist/docs/3.examples/1.api-routes.md +145 -0
- package/dist/docs/3.examples/10.hono.md +74 -0
- package/dist/docs/3.examples/11.import-alias.md +97 -0
- package/dist/docs/3.examples/12.middleware.md +91 -0
- package/dist/docs/3.examples/13.mono-jsx.md +68 -0
- package/dist/docs/3.examples/14.nano-jsx.md +70 -0
- package/dist/docs/3.examples/15.plugins.md +91 -0
- package/dist/docs/3.examples/16.renderer.md +113 -0
- package/dist/docs/3.examples/17.runtime-config.md +97 -0
- package/dist/docs/3.examples/18.server-fetch.md +87 -0
- package/dist/docs/3.examples/19.shiki.md +198 -0
- package/dist/docs/3.examples/2.auto-imports.md +92 -0
- package/dist/docs/3.examples/20.virtual-routes.md +74 -0
- package/dist/docs/3.examples/21.vite-nitro-plugin.md +79 -0
- package/dist/docs/3.examples/22.vite-rsc.md +1041 -0
- package/dist/docs/3.examples/23.vite-ssr-html.md +217 -0
- package/dist/docs/3.examples/24.vite-ssr-preact.md +247 -0
- package/dist/docs/3.examples/25.vite-ssr-react.md +226 -0
- package/dist/docs/3.examples/26.vite-ssr-solid.md +256 -0
- package/dist/docs/3.examples/27.vite-ssr-tsr-react.md +442 -0
- package/dist/docs/3.examples/28.vite-ssr-tss-react.md +444 -0
- package/dist/docs/3.examples/29.vite-ssr-vue-router.md +617 -0
- package/dist/docs/3.examples/3.cached-handler.md +81 -0
- package/dist/docs/3.examples/30.vite-trpc.md +335 -0
- package/dist/docs/3.examples/31.websocket.md +282 -0
- package/dist/docs/3.examples/4.custom-error-handler.md +98 -0
- package/dist/docs/3.examples/5.database.md +157 -0
- package/dist/docs/3.examples/6.elysia.md +70 -0
- package/dist/docs/3.examples/7.express.md +78 -0
- package/dist/docs/3.examples/8.fastify.md +79 -0
- package/dist/docs/3.examples/9.hello-world.md +68 -0
- package/dist/docs/README.md +86 -0
- package/dist/docs/index.md +121 -0
- package/dist/node_modules/@poppinss/dumper/build/formatters/html/main.js +8 -0
- package/dist/node_modules/@poppinss/dumper/package.json +1 -1
- package/dist/node_modules/@speed-highlight/core/dist/index.js +4 -4
- package/dist/node_modules/@speed-highlight/core/dist/terminal.js +2 -2
- package/dist/node_modules/@speed-highlight/core/package.json +1 -1
- package/dist/node_modules/cookie-es/dist/index.mjs +299 -250
- package/dist/node_modules/cookie-es/package.json +26 -23
- package/dist/node_modules/croner/dist/croner.js +1 -1
- package/dist/node_modules/croner/package.json +11 -1
- package/dist/node_modules/defu/dist/defu.mjs +2 -2
- package/dist/node_modules/defu/package.json +33 -28
- package/dist/node_modules/rendu/dist/_chunks/libs/cookie-es.mjs +151 -0
- package/dist/node_modules/rendu/dist/index.mjs +5 -112
- package/dist/node_modules/rendu/package.json +25 -24
- package/dist/node_modules/youch/build/helpers-B9BQYaS6.js +23 -0
- package/dist/node_modules/youch/build/index.js +204 -351
- package/dist/node_modules/youch/build/public/error_info/script.js +1 -1
- package/dist/node_modules/youch/build/public_dir-C5bujZKB.js +25 -0
- package/dist/node_modules/youch/build/src/templates/error_cause/main.js +44 -0
- package/dist/node_modules/youch/build/src/templates/error_info/main.js +72 -0
- package/dist/node_modules/youch/build/src/templates/error_metadata/main.js +65 -0
- package/dist/node_modules/youch/build/src/templates/error_stack/main.js +152 -0
- package/dist/node_modules/youch/build/src/templates/error_stack_source/main.js +46 -0
- package/dist/node_modules/youch/build/src/templates/header/main.js +24 -0
- package/dist/node_modules/youch/build/src/templates/layout/main.js +27 -0
- package/dist/node_modules/youch/package.json +35 -32
- package/dist/presets/_nitro/runtime/nitro-dev.mjs +12 -57
- package/dist/presets/_nitro/runtime/nitro-prerenderer.mjs +1 -0
- package/dist/presets/_nitro/runtime/service-worker.mjs +1 -2
- package/dist/presets/aws-lambda/runtime/_utils.mjs +6 -6
- package/dist/presets/aws-lambda/runtime/aws-lambda-streaming.mjs +3 -1
- package/dist/presets/azure/runtime/_utils.mjs +5 -5
- package/dist/presets/azure/runtime/azure-swa.mjs +5 -5
- package/dist/presets/bun/runtime/bun.mjs +9 -6
- package/dist/presets/cloudflare/runtime/_module-handler.mjs +1 -1
- package/dist/presets/cloudflare/runtime/cloudflare-durable.mjs +4 -4
- package/dist/presets/cloudflare/runtime/cloudflare-module.mjs +3 -3
- package/dist/presets/cloudflare/runtime/cloudflare-pages.mjs +2 -2
- package/dist/presets/cloudflare/runtime/plugin.dev.mjs +10 -21
- package/dist/presets/deno/runtime/deno-deploy.mjs +4 -4
- package/dist/presets/deno/runtime/deno-server.mjs +9 -6
- package/dist/presets/edgeone/runtime/edgeone.mjs +10 -0
- package/dist/presets/netlify/runtime/netlify-edge.mjs +2 -3
- package/dist/presets/netlify/runtime/netlify.mjs +1 -1
- package/dist/presets/node/runtime/node-cluster.mjs +5 -4
- package/dist/presets/node/runtime/node-middleware.mjs +1 -1
- package/dist/presets/node/runtime/node-server.mjs +8 -5
- package/dist/presets/stormkit/runtime/stormkit.mjs +1 -2
- package/dist/presets/vercel/runtime/cron-handler.mjs +25 -0
- package/dist/presets/vercel/runtime/queue-handler.mjs +21 -0
- package/dist/presets/vercel/runtime/vercel.node.mjs +3 -3
- package/dist/presets/vercel/runtime/vercel.web.mjs +3 -5
- package/dist/presets/winterjs/runtime/winterjs.mjs +10 -10
- package/dist/presets/zephyr/runtime/server.mjs +3 -0
- package/dist/runtime/internal/app.mjs +12 -11
- package/dist/runtime/internal/cache.d.mts +0 -4
- package/dist/runtime/internal/cache.mjs +32 -256
- package/dist/runtime/internal/context.d.mts +3 -1
- package/dist/runtime/internal/context.mjs +1 -9
- package/dist/runtime/internal/error/dev.d.mts +5 -4
- package/dist/runtime/internal/error/dev.mjs +47 -49
- package/dist/runtime/internal/error/hooks.d.mts +1 -1
- package/dist/runtime/internal/error/prod.d.mts +2 -5
- package/dist/runtime/internal/error/prod.mjs +19 -33
- package/dist/runtime/internal/error/utils.d.mts +4 -4
- package/dist/runtime/internal/meta.d.mts +1 -1
- package/dist/runtime/internal/plugin.d.mts +2 -2
- package/dist/runtime/internal/route-rules.d.mts +11 -4
- package/dist/runtime/internal/route-rules.mjs +15 -5
- package/dist/runtime/internal/routes/dev-tasks.d.mts +3 -2
- package/dist/runtime/internal/routes/dev-tasks.mjs +15 -10
- package/dist/runtime/internal/routes/openapi.mjs +2 -2
- package/dist/runtime/internal/routes/renderer-template.d.mts +1 -1
- package/dist/runtime/internal/routes/renderer-template.dev.d.mts +2 -1
- package/dist/runtime/internal/routes/scalar.mjs +3 -3
- package/dist/runtime/internal/routes/swagger.mjs +7 -4
- package/dist/runtime/internal/runtime-config.d.mts +1 -1
- package/dist/runtime/internal/runtime-config.mjs +2 -2
- package/dist/runtime/internal/static.mjs +5 -4
- package/dist/runtime/internal/task.d.mts +3 -1
- package/dist/runtime/internal/task.mjs +7 -7
- package/dist/runtime/internal/vite/dev-entry.mjs +6 -3
- package/dist/runtime/internal/vite/dev-worker.mjs +264 -0
- package/dist/runtime/meta.d.mts +1 -0
- package/dist/runtime/meta.mjs +2 -0
- package/dist/runtime/nitro.d.mts +2 -0
- package/dist/runtime/nitro.mjs +4 -2
- package/dist/runtime/virtual/error-handler.mjs +1 -1
- package/dist/runtime/virtual/renderer-template.mjs +1 -1
- package/dist/runtime/virtual/server-assets.d.mts +2 -1
- package/dist/runtime/virtual/tracing.d.mts +5 -0
- package/dist/runtime/virtual/tracing.mjs +1 -0
- package/dist/runtime/vite.d.mts +1 -1
- package/dist/types/index.d.mts +215 -195
- package/dist/types/index.mjs +1 -11
- package/dist/vite.d.mts +3 -8
- package/dist/vite.mjs +285 -253
- package/lib/tsconfig.json +3 -5
- package/package.json +97 -80
- package/dist/_libs/confbox.mjs +0 -2509
- package/dist/_libs/nypm+giget+tinyexec.mjs +0 -3603
- package/dist/_libs/rc9+c12+dotenv.mjs +0 -972
- package/dist/node_modules/hookable/dist/index.mjs +0 -266
- package/dist/node_modules/hookable/package.json +0 -52
- package/dist/node_modules/youch/build/chunk-4L7RY2JA.js +0 -42
- package/dist/node_modules/youch/build/chunk-7QV3D5YX.js +0 -83
- package/dist/node_modules/youch/build/chunk-AUGPHE32.js +0 -39
- package/dist/node_modules/youch/build/chunk-CM7DWJNZ.js +0 -44
- package/dist/node_modules/youch/build/chunk-EJH674NB.js +0 -223
- package/dist/node_modules/youch/build/chunk-OIJ3WD7L.js +0 -81
- package/dist/node_modules/youch/build/chunk-P36L72PL.js +0 -87
- package/dist/node_modules/youch/build/chunk-PE3GG3TN.js +0 -65
- package/dist/node_modules/youch/build/chunk-X53OIOJH.js +0 -70
- package/dist/presets/_nitro/runtime/nitro-dev.d.mts +0 -2
- package/dist/presets/_nitro/runtime/nitro-prerenderer.d.mts +0 -3
- package/dist/presets/_nitro/runtime/service-worker.d.mts +0 -2
- package/dist/presets/aws-amplify/runtime/aws-amplify.d.mts +0 -2
- package/dist/presets/aws-lambda/runtime/_utils.d.mts +0 -8
- package/dist/presets/aws-lambda/runtime/aws-lambda-streaming.d.mts +0 -2
- package/dist/presets/aws-lambda/runtime/aws-lambda.d.mts +0 -3
- package/dist/presets/azure/runtime/_utils.d.mts +0 -2
- package/dist/presets/azure/runtime/azure-swa.d.mts +0 -5
- package/dist/presets/bun/runtime/bun.d.mts +0 -3
- package/dist/presets/cloudflare/runtime/_module-handler.d.mts +0 -16
- package/dist/presets/cloudflare/runtime/cloudflare-durable.d.mts +0 -11
- package/dist/presets/cloudflare/runtime/cloudflare-module.d.mts +0 -3
- package/dist/presets/cloudflare/runtime/cloudflare-pages.d.mts +0 -20
- package/dist/presets/cloudflare/runtime/plugin.dev.d.mts +0 -3
- package/dist/presets/deno/runtime/deno-deploy.d.mts +0 -5
- package/dist/presets/deno/runtime/deno-server.d.mts +0 -3
- package/dist/presets/netlify/runtime/netlify-edge.d.mts +0 -3
- package/dist/presets/netlify/runtime/netlify.d.mts +0 -4
- package/dist/presets/node/runtime/node-cluster.d.mts +0 -3
- package/dist/presets/node/runtime/node-middleware.d.mts +0 -3
- package/dist/presets/node/runtime/node-server.d.mts +0 -3
- package/dist/presets/standard/runtime/server.d.mts +0 -3
- package/dist/presets/stormkit/runtime/stormkit.d.mts +0 -21
- package/dist/presets/vercel/runtime/isr.d.mts +0 -2
- package/dist/presets/vercel/runtime/vercel.node.d.mts +0 -3
- package/dist/presets/vercel/runtime/vercel.web.d.mts +0 -8
- package/dist/presets/winterjs/runtime/winterjs.d.mts +0 -2
- package/dist/presets/zeabur/runtime/zeabur.d.mts +0 -3
- package/dist/runtime/internal/vite/node-runner.mjs +0 -359
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# API Routes
|
|
2
|
+
|
|
3
|
+
> File-based API routing with HTTP method support and dynamic parameters.
|
|
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>API Routes</title>
|
|
14
|
+
</head>
|
|
15
|
+
<body>
|
|
16
|
+
<h2>API Routes:</h2>
|
|
17
|
+
<ul>
|
|
18
|
+
<li><a href="/api/hello">/api/hello</a></li>
|
|
19
|
+
<li><a href="/api/hello/world">/api/hello/world</a></li>
|
|
20
|
+
<li><a href="/api/test">/api/test</a></li>
|
|
21
|
+
</ul>
|
|
22
|
+
</body>
|
|
23
|
+
</html>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
```ts [nitro.config.ts]
|
|
27
|
+
import { defineConfig } from "nitro";
|
|
28
|
+
|
|
29
|
+
export default defineConfig({
|
|
30
|
+
serverDir: "./",
|
|
31
|
+
});
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
```json [package.json]
|
|
35
|
+
{
|
|
36
|
+
"type": "module",
|
|
37
|
+
"scripts": {
|
|
38
|
+
"dev": "nitro dev",
|
|
39
|
+
"build": "nitro build"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"nitro": "latest"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
```json [tsconfig.json]
|
|
48
|
+
{
|
|
49
|
+
"extends": "nitro/tsconfig"
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
```ts [vite.config.ts]
|
|
54
|
+
import { defineConfig } from "vite";
|
|
55
|
+
import { nitro } from "nitro/vite";
|
|
56
|
+
|
|
57
|
+
export default defineConfig({ plugins: [nitro()] });
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
```ts [api/hello.ts]
|
|
61
|
+
import { defineHandler } from "nitro";
|
|
62
|
+
|
|
63
|
+
export default defineHandler(() => "Nitro is amazing!");
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
```ts [api/test.get.ts]
|
|
67
|
+
import { defineHandler } from "nitro";
|
|
68
|
+
|
|
69
|
+
export default defineHandler(() => "Test get handler");
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
```ts [api/test.post.ts]
|
|
73
|
+
import { defineHandler } from "nitro";
|
|
74
|
+
|
|
75
|
+
export default defineHandler(async (event) => {
|
|
76
|
+
const body = await event.req.json();
|
|
77
|
+
return {
|
|
78
|
+
message: "Test post handler",
|
|
79
|
+
body,
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
```ts [api/hello/[name].ts]
|
|
85
|
+
import { defineHandler } from "nitro";
|
|
86
|
+
|
|
87
|
+
export default defineHandler((event) => `Hello (param: ${event.context.params!.name})!`);
|
|
88
|
+
```
|
|
89
|
+
</code-tree>
|
|
90
|
+
|
|
91
|
+
Nitro supports file-based routing in the `api/` or `routes/` directory. Each file becomes an API endpoint based on its path.
|
|
92
|
+
|
|
93
|
+
## Basic Route
|
|
94
|
+
|
|
95
|
+
Create a file in the `api/` directory to define a route. The file path becomes the URL path:
|
|
96
|
+
|
|
97
|
+
```ts [api/hello.ts]
|
|
98
|
+
import { defineHandler } from "nitro";
|
|
99
|
+
|
|
100
|
+
export default defineHandler(() => "Nitro is amazing!");
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
This creates a `GET /api/hello` endpoint.
|
|
104
|
+
|
|
105
|
+
## Dynamic Routes
|
|
106
|
+
|
|
107
|
+
Use square brackets `[param]` for dynamic URL segments. Access params via `event.context.params`:
|
|
108
|
+
|
|
109
|
+
```ts [api/hello/[name].ts]
|
|
110
|
+
import { defineHandler } from "nitro";
|
|
111
|
+
|
|
112
|
+
export default defineHandler((event) => `Hello (param: ${event.context.params!.name})!`);
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
This creates a `GET /api/hello/:name` endpoint (e.g., `/api/hello/world`).
|
|
116
|
+
|
|
117
|
+
## HTTP Methods
|
|
118
|
+
|
|
119
|
+
Suffix your file with the HTTP method (`.get.ts`, `.post.ts`, `.put.ts`, `.delete.ts`, etc.):
|
|
120
|
+
|
|
121
|
+
### GET Handler
|
|
122
|
+
|
|
123
|
+
```ts [api/test.get.ts]
|
|
124
|
+
import { defineHandler } from "nitro";
|
|
125
|
+
|
|
126
|
+
export default defineHandler(() => "Test get handler");
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### POST Handler
|
|
130
|
+
|
|
131
|
+
```ts [api/test.post.ts]
|
|
132
|
+
import { defineHandler } from "nitro";
|
|
133
|
+
|
|
134
|
+
export default defineHandler(async (event) => {
|
|
135
|
+
const body = await event.req.json();
|
|
136
|
+
return {
|
|
137
|
+
message: "Test post handler",
|
|
138
|
+
body,
|
|
139
|
+
};
|
|
140
|
+
});
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Learn More
|
|
144
|
+
|
|
145
|
+
- [Routing](/docs/routing)
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Hono
|
|
2
|
+
|
|
3
|
+
> Integrate Hono with Nitro using the server entry.
|
|
4
|
+
|
|
5
|
+
<code-tree>
|
|
6
|
+
|
|
7
|
+
```ts [nitro.config.ts]
|
|
8
|
+
import { defineConfig } from "nitro";
|
|
9
|
+
|
|
10
|
+
export default defineConfig({});
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
```json [package.json]
|
|
14
|
+
{
|
|
15
|
+
"type": "module",
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "nitro build",
|
|
18
|
+
"dev": "nitro dev"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"hono": "^4.12.9",
|
|
22
|
+
"nitro": "latest"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
```ts [server.ts]
|
|
28
|
+
import { Hono } from "hono";
|
|
29
|
+
|
|
30
|
+
const app = new Hono();
|
|
31
|
+
|
|
32
|
+
app.get("/", (c) => {
|
|
33
|
+
return c.text("Hello, Hono with Nitro!");
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
export default app;
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
```json [tsconfig.json]
|
|
40
|
+
{
|
|
41
|
+
"extends": "nitro/tsconfig"
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
```ts [vite.config.ts]
|
|
46
|
+
import { defineConfig } from "vite";
|
|
47
|
+
import { nitro } from "nitro/vite";
|
|
48
|
+
|
|
49
|
+
export default defineConfig({ plugins: [nitro()] });
|
|
50
|
+
```
|
|
51
|
+
</code-tree>
|
|
52
|
+
|
|
53
|
+
## Server Entry
|
|
54
|
+
|
|
55
|
+
```ts [server.ts]
|
|
56
|
+
import { Hono } from "hono";
|
|
57
|
+
|
|
58
|
+
const app = new Hono();
|
|
59
|
+
|
|
60
|
+
app.get("/", (c) => {
|
|
61
|
+
return c.text("Hello, Hono with Nitro!");
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
export default app;
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Nitro auto-detects `server.ts` in your project root and uses it as the server entry. The Hono app handles all incoming requests, giving you full control over routing and middleware.
|
|
68
|
+
|
|
69
|
+
Hono is cross-runtime compatible, so this server entry works across all Nitro deployment targets including Node.js, Deno, Bun, and Cloudflare Workers.
|
|
70
|
+
|
|
71
|
+
## Learn More
|
|
72
|
+
|
|
73
|
+
- [Server Entry](/docs/server-entry)
|
|
74
|
+
- [Hono Documentation](https://hono.dev/)
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Import Alias
|
|
2
|
+
|
|
3
|
+
> Custom import aliases for cleaner module paths.
|
|
4
|
+
|
|
5
|
+
<code-tree>
|
|
6
|
+
|
|
7
|
+
```ts [nitro.config.ts]
|
|
8
|
+
import { defineConfig } from "nitro";
|
|
9
|
+
|
|
10
|
+
export default defineConfig({
|
|
11
|
+
serverDir: true,
|
|
12
|
+
});
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
```json [package.json]
|
|
16
|
+
{
|
|
17
|
+
"type": "module",
|
|
18
|
+
"imports": {
|
|
19
|
+
"#server/*": "./server/*"
|
|
20
|
+
},
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "nitro build",
|
|
23
|
+
"dev": "nitro dev",
|
|
24
|
+
"preview": "node .output/server/index.mjs"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"nitro": "latest"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
```json [tsconfig.json]
|
|
33
|
+
{
|
|
34
|
+
"extends": "nitro/tsconfig",
|
|
35
|
+
"compilerOptions": {
|
|
36
|
+
"paths": {
|
|
37
|
+
"~server/*": ["./server/*"]
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
```ts [vite.config.ts]
|
|
44
|
+
import { defineConfig } from "vite";
|
|
45
|
+
import { nitro } from "nitro/vite";
|
|
46
|
+
|
|
47
|
+
export default defineConfig({ plugins: [nitro()], resolve: { tsconfigPaths: true } });
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
```ts [server/routes/index.ts]
|
|
51
|
+
import { sum } from "~server/utils/math.ts";
|
|
52
|
+
|
|
53
|
+
import { rand } from "#server/utils/math.ts";
|
|
54
|
+
|
|
55
|
+
export default () => {
|
|
56
|
+
const [a, b] = [rand(1, 10), rand(1, 10)];
|
|
57
|
+
const result = sum(a, b);
|
|
58
|
+
return `The sum of ${a} + ${b} = ${result}`;
|
|
59
|
+
};
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
```ts [server/utils/math.ts]
|
|
63
|
+
export function rand(min: number, max: number): number {
|
|
64
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function sum(a: number, b: number): number {
|
|
68
|
+
return a + b;
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
</code-tree>
|
|
72
|
+
|
|
73
|
+
Import aliases like `~` and `#` let you reference modules with shorter paths instead of relative imports.
|
|
74
|
+
|
|
75
|
+
## Importing Using Aliases
|
|
76
|
+
|
|
77
|
+
```ts [server/routes/index.ts]
|
|
78
|
+
import { sum } from "~server/utils/math.ts";
|
|
79
|
+
|
|
80
|
+
import { rand } from "#server/utils/math.ts";
|
|
81
|
+
|
|
82
|
+
export default () => {
|
|
83
|
+
const [a, b] = [rand(1, 10), rand(1, 10)];
|
|
84
|
+
const result = sum(a, b);
|
|
85
|
+
return `The sum of ${a} + ${b} = ${result}`;
|
|
86
|
+
};
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
The route imports the `sum` function using `~server/` and `rand` using `#server/`. Both resolve to the same `server/utils/math.ts` file. The handler generates two random numbers and returns their sum.
|
|
90
|
+
|
|
91
|
+
## Configuration
|
|
92
|
+
|
|
93
|
+
Aliases can be configured in `package.json` imports field or `nitro.config.ts`.
|
|
94
|
+
|
|
95
|
+
## Learn More
|
|
96
|
+
|
|
97
|
+
- [Configuration](/docs/configuration)
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Middleware
|
|
2
|
+
|
|
3
|
+
> Request middleware for authentication, logging, and request modification.
|
|
4
|
+
|
|
5
|
+
<code-tree>
|
|
6
|
+
|
|
7
|
+
```ts [nitro.config.ts]
|
|
8
|
+
import { defineConfig } from "nitro";
|
|
9
|
+
|
|
10
|
+
export default defineConfig({
|
|
11
|
+
serverDir: true,
|
|
12
|
+
});
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
```json [package.json]
|
|
16
|
+
{
|
|
17
|
+
"type": "module",
|
|
18
|
+
"scripts": {
|
|
19
|
+
"dev": "nitro dev",
|
|
20
|
+
"build": "nitro build"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"nitro": "latest"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
```ts [server.ts]
|
|
29
|
+
import { defineHandler } from "nitro";
|
|
30
|
+
|
|
31
|
+
export default defineHandler((event) => ({
|
|
32
|
+
auth: event.context.auth,
|
|
33
|
+
}));
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
```json [tsconfig.json]
|
|
37
|
+
{
|
|
38
|
+
"extends": "nitro/tsconfig"
|
|
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/middleware/auth.ts]
|
|
50
|
+
import { defineMiddleware } from "nitro";
|
|
51
|
+
|
|
52
|
+
export default defineMiddleware((event) => {
|
|
53
|
+
event.context.auth = { name: "User " + Math.round(Math.random() * 100) };
|
|
54
|
+
});
|
|
55
|
+
```
|
|
56
|
+
</code-tree>
|
|
57
|
+
|
|
58
|
+
Middleware functions run before route handlers on every request. They can modify the request, add context, or return early responses.
|
|
59
|
+
|
|
60
|
+
## Defining Middleware
|
|
61
|
+
|
|
62
|
+
Create files in `server/middleware/`. They run in alphabetical order:
|
|
63
|
+
|
|
64
|
+
```ts [server/middleware/auth.ts]
|
|
65
|
+
import { defineMiddleware } from "nitro";
|
|
66
|
+
|
|
67
|
+
export default defineMiddleware((event) => {
|
|
68
|
+
event.context.auth = { name: "User " + Math.round(Math.random() * 100) };
|
|
69
|
+
});
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Middleware can:
|
|
73
|
+
|
|
74
|
+
- Add data to `event.context` for use in handlers
|
|
75
|
+
- Return a response early to short-circuit the request
|
|
76
|
+
- Modify request headers or other properties
|
|
77
|
+
|
|
78
|
+
## Accessing Context in Handlers
|
|
79
|
+
Data added to `event.context` in middleware is available in all subsequent handlers:
|
|
80
|
+
|
|
81
|
+
```ts [server.ts]
|
|
82
|
+
import { defineHandler } from "nitro";
|
|
83
|
+
|
|
84
|
+
export default defineHandler((event) => ({
|
|
85
|
+
auth: event.context.auth,
|
|
86
|
+
}));
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Learn More
|
|
90
|
+
|
|
91
|
+
- [Routing](/docs/routing)
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Mono JSX
|
|
2
|
+
|
|
3
|
+
> Server-side JSX rendering in Nitro with mono-jsx.
|
|
4
|
+
|
|
5
|
+
<code-tree>
|
|
6
|
+
|
|
7
|
+
```ts [nitro.config.ts]
|
|
8
|
+
import { defineConfig } from "nitro";
|
|
9
|
+
|
|
10
|
+
export default defineConfig({});
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
```json [package.json]
|
|
14
|
+
{
|
|
15
|
+
"type": "module",
|
|
16
|
+
"scripts": {
|
|
17
|
+
"dev": "nitro dev",
|
|
18
|
+
"build": "nitro build"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"mono-jsx": "latest",
|
|
22
|
+
"nitro": "latest"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
```tsx [server.tsx]
|
|
28
|
+
export default () => (
|
|
29
|
+
<html>
|
|
30
|
+
<h1>Nitro + mono-jsx works!</h1>
|
|
31
|
+
</html>
|
|
32
|
+
);
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```json [tsconfig.json]
|
|
36
|
+
{
|
|
37
|
+
"extends": "nitro/tsconfig",
|
|
38
|
+
"compilerOptions": {
|
|
39
|
+
"jsx": "react-jsx",
|
|
40
|
+
"jsxImportSource": "mono-jsx"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
```ts [vite.config.ts]
|
|
46
|
+
import { defineConfig } from "vite";
|
|
47
|
+
import { nitro } from "nitro/vite";
|
|
48
|
+
|
|
49
|
+
export default defineConfig({ plugins: [nitro()] });
|
|
50
|
+
```
|
|
51
|
+
</code-tree>
|
|
52
|
+
|
|
53
|
+
## Server Entry
|
|
54
|
+
|
|
55
|
+
```tsx [server.tsx]
|
|
56
|
+
export default () => (
|
|
57
|
+
<html>
|
|
58
|
+
<h1>Nitro + mono-jsx works!</h1>
|
|
59
|
+
</html>
|
|
60
|
+
);
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Nitro auto-detects `server.tsx` and uses mono-jsx to transform JSX into HTML. Export a function that returns JSX, and Nitro sends the rendered HTML as the response.
|
|
64
|
+
|
|
65
|
+
## Learn More
|
|
66
|
+
|
|
67
|
+
- [Renderer](/docs/renderer)
|
|
68
|
+
- [mono-jsx](https://github.com/aspect-dev/mono-jsx)
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Nano JSX
|
|
2
|
+
|
|
3
|
+
> Server-side JSX rendering in Nitro with nano-jsx.
|
|
4
|
+
|
|
5
|
+
<code-tree>
|
|
6
|
+
|
|
7
|
+
```ts [nitro.config.ts]
|
|
8
|
+
import { defineConfig } from "nitro";
|
|
9
|
+
|
|
10
|
+
export default defineConfig({});
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
```json [package.json]
|
|
14
|
+
{
|
|
15
|
+
"type": "module",
|
|
16
|
+
"scripts": {
|
|
17
|
+
"dev": "nitro dev",
|
|
18
|
+
"build": "nitro build"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"nano-jsx": "^0.2.1",
|
|
22
|
+
"nitro": "latest"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
```tsx [server.tsx]
|
|
28
|
+
import { defineHandler, html } from "nitro";
|
|
29
|
+
import { renderSSR } from "nano-jsx";
|
|
30
|
+
|
|
31
|
+
export default defineHandler(() => {
|
|
32
|
+
return html(renderSSR(() => <h1>Nitro + nano-jsx works!</h1>));
|
|
33
|
+
});
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
```json [tsconfig.json]
|
|
37
|
+
{
|
|
38
|
+
"extends": "nitro/tsconfig",
|
|
39
|
+
"compilerOptions": {
|
|
40
|
+
"jsx": "react-jsx",
|
|
41
|
+
"jsxImportSource": "nano-jsx/esm"
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
```ts [vite.config.ts]
|
|
47
|
+
import { defineConfig } from "vite";
|
|
48
|
+
import { nitro } from "nitro/vite";
|
|
49
|
+
|
|
50
|
+
export default defineConfig({ plugins: [nitro()] });
|
|
51
|
+
```
|
|
52
|
+
</code-tree>
|
|
53
|
+
|
|
54
|
+
## Server Entry
|
|
55
|
+
|
|
56
|
+
```tsx [server.tsx]
|
|
57
|
+
import { defineHandler, html } from "nitro";
|
|
58
|
+
import { renderSSR } from "nano-jsx";
|
|
59
|
+
|
|
60
|
+
export default defineHandler(() => {
|
|
61
|
+
return html(renderSSR(() => <h1>Nitro + nano-jsx works!</h1>));
|
|
62
|
+
});
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Nitro auto-detects `server.tsx` and uses it as the server entry. Use `renderSSR` from nano-jsx to convert JSX into an HTML string. The `html` helper from H3 sets the correct content type header.
|
|
66
|
+
|
|
67
|
+
## Learn More
|
|
68
|
+
|
|
69
|
+
- [Renderer](/docs/renderer)
|
|
70
|
+
- [nano-jsx](https://nanojsx.io/)
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Plugins
|
|
2
|
+
|
|
3
|
+
> Extend Nitro with custom plugins for hooks and lifecycle events.
|
|
4
|
+
|
|
5
|
+
<code-tree>
|
|
6
|
+
|
|
7
|
+
```ts [nitro.config.ts]
|
|
8
|
+
import { defineConfig } from "nitro";
|
|
9
|
+
|
|
10
|
+
export default defineConfig({
|
|
11
|
+
serverDir: true,
|
|
12
|
+
});
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
```json [package.json]
|
|
16
|
+
{
|
|
17
|
+
"type": "module",
|
|
18
|
+
"scripts": {
|
|
19
|
+
"dev": "nitro dev",
|
|
20
|
+
"build": "nitro build"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"nitro": "latest"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
```ts [server.ts]
|
|
29
|
+
import { defineHandler } from "nitro";
|
|
30
|
+
|
|
31
|
+
export default defineHandler(() => "<h1>Hello Nitro!</h1>");
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
```json [tsconfig.json]
|
|
35
|
+
{
|
|
36
|
+
"extends": "nitro/tsconfig"
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
```ts [vite.config.ts]
|
|
41
|
+
import { defineConfig } from "vite";
|
|
42
|
+
import { nitro } from "nitro/vite";
|
|
43
|
+
|
|
44
|
+
export default defineConfig({ plugins: [nitro()] });
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
```ts [server/plugins/test.ts]
|
|
48
|
+
import { definePlugin } from "nitro";
|
|
49
|
+
import { useNitroHooks } from "nitro/app";
|
|
50
|
+
|
|
51
|
+
export default definePlugin((nitroApp) => {
|
|
52
|
+
const hooks = useNitroHooks();
|
|
53
|
+
hooks.hook("response", (event) => {
|
|
54
|
+
event.headers.set("content-type", "html; charset=utf-8");
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
```
|
|
58
|
+
</code-tree>
|
|
59
|
+
|
|
60
|
+
Plugins let you hook into Nitro's runtime lifecycle. This example shows a plugin that modifies the `Content-Type` header on every response. Create files in `server/plugins/` and they're automatically loaded at startup.
|
|
61
|
+
|
|
62
|
+
## Defining a Plugin
|
|
63
|
+
|
|
64
|
+
```ts [server/plugins/test.ts]
|
|
65
|
+
import { definePlugin } from "nitro";
|
|
66
|
+
import { useNitroHooks } from "nitro/app";
|
|
67
|
+
|
|
68
|
+
export default definePlugin((nitroApp) => {
|
|
69
|
+
const hooks = useNitroHooks();
|
|
70
|
+
hooks.hook("response", (event) => {
|
|
71
|
+
event.headers.set("content-type", "html; charset=utf-8");
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
The plugin uses `useNitroHooks()` to access the hooks system, then registers a `response` hook that runs after every request. Here it sets the content type to HTML, but you could log requests, add security headers, or modify responses in any way.
|
|
77
|
+
|
|
78
|
+
## Main Handler
|
|
79
|
+
|
|
80
|
+
```ts [server.ts]
|
|
81
|
+
import { defineHandler } from "nitro";
|
|
82
|
+
|
|
83
|
+
export default defineHandler(() => "<h1>Hello Nitro!</h1>");
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
The handler returns HTML without setting a content type. The plugin automatically adds the correct `Content-Type: html; charset=utf-8` header to the response.
|
|
87
|
+
|
|
88
|
+
## Learn More
|
|
89
|
+
|
|
90
|
+
- [Plugins](/docs/plugins)
|
|
91
|
+
- [Lifecycle](/docs/lifecycle)
|