nitro 3.0.0 → 3.0.1-alpha.1

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 (293) hide show
  1. package/dist/_build/common.mjs +68 -0
  2. package/dist/_build/common2.mjs +772 -0
  3. package/dist/_build/rolldown.mjs +206 -0
  4. package/dist/_build/rollup.mjs +289 -0
  5. package/dist/_build/vite.build.mjs +56 -0
  6. package/dist/_build/vite.plugin.mjs +768 -0
  7. package/dist/_chunks/ANM1K1bE.mjs +304 -0
  8. package/dist/_chunks/B-D1JOIz.mjs +1355 -0
  9. package/dist/_chunks/BX9-zVkM.mjs +59 -0
  10. package/dist/_chunks/Bqks5huO.mjs +31 -0
  11. package/dist/_chunks/C7CbzoI1.mjs +39 -0
  12. package/dist/_dev.d.mts +12 -0
  13. package/dist/_dev.mjs +705 -0
  14. package/dist/_libs/acorn.mjs +5034 -0
  15. package/dist/_libs/c12.mjs +2858 -0
  16. package/dist/_libs/chokidar.mjs +1561 -0
  17. package/dist/_libs/citty.mjs +333 -0
  18. package/dist/_libs/commondir.mjs +22 -0
  19. package/dist/_libs/compatx.mjs +46 -0
  20. package/dist/_libs/confbox.mjs +2920 -0
  21. package/dist/_libs/deepmerge.mjs +86 -0
  22. package/dist/_libs/dot-prop.mjs +138 -0
  23. package/dist/_libs/duplexer.mjs +71 -0
  24. package/dist/_libs/escape-string-regexp.mjs +8 -0
  25. package/dist/_libs/estree-walker.mjs +330 -0
  26. package/dist/_libs/etag.mjs +80 -0
  27. package/dist/_libs/fdir.mjs +514 -0
  28. package/dist/_libs/function-bind.mjs +63 -0
  29. package/dist/_libs/gen-mapping.mjs +612 -0
  30. package/dist/_libs/giget.mjs +19289 -0
  31. package/dist/_libs/gzip-size.mjs +21 -0
  32. package/dist/_libs/hasown.mjs +14 -0
  33. package/dist/_libs/httpxy.mjs +410 -0
  34. package/dist/_libs/is-core-module.mjs +220 -0
  35. package/dist/_libs/is-module.mjs +13 -0
  36. package/dist/_libs/is-reference.mjs +32 -0
  37. package/dist/_libs/js-tokens.mjs +382 -0
  38. package/dist/_libs/klona.mjs +38 -0
  39. package/dist/_libs/knitwork.mjs +124 -0
  40. package/dist/_libs/local-pkg.mjs +1686 -0
  41. package/dist/_libs/magic-string.mjs +939 -0
  42. package/dist/_libs/mime.mjs +1391 -0
  43. package/dist/_libs/node-fetch-native.mjs +173 -0
  44. package/dist/_libs/path-parse.mjs +47 -0
  45. package/dist/_libs/pathe.mjs +41 -0
  46. package/dist/_libs/picomatch.mjs +1673 -0
  47. package/dist/_libs/plugin-alias.mjs +64 -0
  48. package/dist/_libs/plugin-commonjs.mjs +1491 -0
  49. package/dist/_libs/plugin-inject.mjs +135 -0
  50. package/dist/_libs/plugin-json.mjs +36 -0
  51. package/dist/_libs/plugin-node-resolve.mjs +1553 -0
  52. package/dist/_libs/plugin-replace.mjs +104 -0
  53. package/dist/_libs/pretty-bytes.mjs +116 -0
  54. package/dist/_libs/remapping.mjs +117 -0
  55. package/dist/_libs/rou3.mjs +319 -0
  56. package/dist/_libs/std-env.mjs +158 -0
  57. package/dist/_libs/strip-literal.mjs +51 -0
  58. package/dist/_libs/tinyglobby.mjs +292 -0
  59. package/dist/_libs/tsconfck.mjs +832 -0
  60. package/dist/_libs/ultrahtml.mjs +138 -0
  61. package/dist/_libs/unimport.mjs +3520 -0
  62. package/dist/_libs/untyped.mjs +271 -0
  63. package/dist/_libs/unwasm.mjs +5836 -0
  64. package/dist/_libs/vite-plugin-fullstack.mjs +561 -0
  65. package/dist/_presets.mjs +1752 -0
  66. package/dist/builder.d.mts +63 -0
  67. package/dist/builder.mjs +33 -0
  68. package/dist/cli/_chunks/build.mjs +48 -0
  69. package/dist/cli/_chunks/common.mjs +15 -0
  70. package/dist/cli/_chunks/detect-acorn.mjs +12 -0
  71. package/dist/cli/_chunks/dev.mjs +68 -0
  72. package/dist/cli/_chunks/dist.mjs +3 -0
  73. package/dist/cli/_chunks/dist2.mjs +3 -0
  74. package/dist/cli/_chunks/dist3.mjs +3 -0
  75. package/dist/cli/_chunks/dist4.mjs +4 -0
  76. package/dist/cli/_chunks/dist5.mjs +4 -0
  77. package/dist/cli/_chunks/esm.mjs +3 -0
  78. package/dist/cli/_chunks/json5.mjs +4 -0
  79. package/dist/cli/_chunks/jsonc.mjs +4 -0
  80. package/dist/cli/_chunks/list.mjs +27 -0
  81. package/dist/cli/_chunks/multipart-parser.mjs +6 -0
  82. package/dist/cli/_chunks/prepare.mjs +19 -0
  83. package/dist/cli/_chunks/run.mjs +55 -0
  84. package/dist/cli/_chunks/task.mjs +16 -0
  85. package/dist/cli/_chunks/toml.mjs +4 -0
  86. package/dist/cli/_chunks/yaml.mjs +4 -0
  87. package/dist/cli/index.d.mts +1 -1
  88. package/dist/cli/index.mjs +20 -476
  89. package/dist/node_modules/@poppinss/dumper/build/formatters/html/main.js +1 -1
  90. package/dist/node_modules/@poppinss/dumper/package.json +1 -1
  91. package/dist/node_modules/@sindresorhus/is/distribution/index.js +1 -1
  92. package/dist/node_modules/@sindresorhus/is/package.json +1 -1
  93. package/dist/node_modules/@speed-highlight/core/dist/index.js +2 -2
  94. package/dist/node_modules/@speed-highlight/core/dist/terminal.js +2 -2
  95. package/dist/node_modules/@speed-highlight/core/package.json +7 -3
  96. package/dist/node_modules/cookie-es/dist/index.mjs +262 -0
  97. package/dist/node_modules/cookie-es/package.json +37 -0
  98. package/dist/node_modules/hookable/dist/index.mjs +243 -266
  99. package/dist/node_modules/hookable/package.json +29 -26
  100. package/dist/node_modules/rendu/dist/index.mjs +380 -0
  101. package/dist/node_modules/rendu/package.json +47 -0
  102. package/dist/node_modules/youch/build/{chunk-VE4LENUR.js → chunk-F4I6KX4R.js} +2 -1
  103. package/dist/node_modules/youch/build/{chunk-JAN2TFI2.js → chunk-YYEJ3AGB.js} +4 -1
  104. package/dist/node_modules/youch/build/index.js +16 -8
  105. package/dist/node_modules/youch/build/public/error_stack/script.js +20 -22
  106. package/dist/node_modules/youch/build/public/header/script.js +0 -2
  107. package/dist/node_modules/youch/build/public/layout/script.js +0 -8
  108. package/dist/node_modules/youch/build/public/layout/style.css +4 -0
  109. package/dist/node_modules/youch/package.json +16 -17
  110. package/dist/presets/_nitro/runtime/nitro-dev.d.mts +1 -0
  111. package/dist/presets/_nitro/runtime/nitro-dev.mjs +48 -42
  112. package/dist/presets/_nitro/runtime/nitro-prerenderer.d.mts +2 -2
  113. package/dist/presets/_nitro/runtime/nitro-prerenderer.mjs +10 -14
  114. package/dist/presets/_nitro/runtime/service-worker.d.mts +1 -0
  115. package/dist/presets/_nitro/runtime/service-worker.mjs +15 -12
  116. package/dist/presets/aws-amplify/runtime/aws-amplify.d.mts +1 -0
  117. package/dist/presets/aws-amplify/runtime/aws-amplify.mjs +7 -6
  118. package/dist/presets/aws-lambda/runtime/_utils.d.mts +8 -13
  119. package/dist/presets/aws-lambda/runtime/_utils.mjs +95 -81
  120. package/dist/presets/aws-lambda/runtime/aws-lambda-streaming.d.mts +1 -2
  121. package/dist/presets/aws-lambda/runtime/aws-lambda-streaming.mjs +26 -28
  122. package/dist/presets/aws-lambda/runtime/aws-lambda.mjs +8 -8
  123. package/dist/presets/azure/runtime/_utils.mjs +43 -43
  124. package/dist/presets/azure/runtime/azure-swa.d.mts +2 -2
  125. package/dist/presets/azure/runtime/azure-swa.mjs +24 -22
  126. package/dist/presets/bun/runtime/bun.d.mts +2 -0
  127. package/dist/presets/bun/runtime/bun.mjs +34 -21
  128. package/dist/presets/cloudflare/runtime/_module-handler.d.mts +10 -7
  129. package/dist/presets/cloudflare/runtime/_module-handler.mjs +80 -88
  130. package/dist/presets/cloudflare/runtime/cloudflare-durable.d.mts +6 -14
  131. package/dist/presets/cloudflare/runtime/cloudflare-durable.mjs +60 -63
  132. package/dist/presets/cloudflare/runtime/cloudflare-module.d.mts +1 -7
  133. package/dist/presets/cloudflare/runtime/cloudflare-module.mjs +14 -16
  134. package/dist/presets/cloudflare/runtime/cloudflare-pages.d.mts +12 -12
  135. package/dist/presets/cloudflare/runtime/cloudflare-pages.mjs +40 -42
  136. package/dist/presets/cloudflare/runtime/plugin.dev.d.mts +2 -2
  137. package/dist/presets/cloudflare/runtime/plugin.dev.mjs +89 -82
  138. package/dist/presets/cloudflare/runtime/shims/workers.dev.mjs +27 -0
  139. package/dist/presets/deno/runtime/deno-deploy.d.mts +4 -0
  140. package/dist/presets/deno/runtime/deno-deploy.mjs +15 -12
  141. package/dist/presets/deno/runtime/deno-server.d.mts +0 -3
  142. package/dist/presets/deno/runtime/deno-server.mjs +32 -52
  143. package/dist/presets/netlify/runtime/netlify-edge.d.mts +2 -1
  144. package/dist/presets/netlify/runtime/netlify-edge.mjs +15 -12
  145. package/dist/presets/netlify/runtime/netlify.mjs +12 -18
  146. package/dist/presets/node/runtime/node-cluster.d.mts +3 -1
  147. package/dist/presets/node/runtime/node-cluster.mjs +50 -54
  148. package/dist/presets/node/runtime/node-middleware.d.mts +2 -3
  149. package/dist/presets/node/runtime/node-middleware.mjs +9 -8
  150. package/dist/presets/node/runtime/node-server.mjs +37 -34
  151. package/dist/presets/standard/runtime/server.d.mts +1 -3
  152. package/dist/presets/standard/runtime/server.mjs +2 -4
  153. package/dist/presets/stormkit/runtime/stormkit.d.mts +13 -13
  154. package/dist/presets/stormkit/runtime/stormkit.mjs +21 -21
  155. package/dist/presets/vercel/runtime/vercel.node.d.mts +3 -0
  156. package/dist/presets/vercel/runtime/vercel.node.mjs +15 -0
  157. package/dist/presets/vercel/runtime/{vercel.d.mts → vercel.web.d.mts} +3 -3
  158. package/dist/presets/vercel/runtime/vercel.web.mjs +20 -0
  159. package/dist/presets/winterjs/runtime/winterjs.d.mts +2 -0
  160. package/dist/presets/winterjs/runtime/winterjs.mjs +73 -69
  161. package/dist/presets/zeabur/runtime/zeabur.d.mts +1 -1
  162. package/dist/presets/zeabur/runtime/zeabur.mjs +1 -1
  163. package/dist/runtime/app.d.mts +1 -0
  164. package/dist/runtime/app.mjs +1 -0
  165. package/dist/runtime/cache.d.mts +1 -0
  166. package/dist/runtime/cache.mjs +1 -0
  167. package/dist/runtime/config.d.mts +3 -0
  168. package/dist/runtime/config.mjs +4 -0
  169. package/dist/runtime/context.d.mts +1 -0
  170. package/dist/runtime/context.mjs +1 -0
  171. package/dist/runtime/database.d.mts +1 -0
  172. package/dist/runtime/database.mjs +1 -0
  173. package/dist/runtime/internal/app.d.mts +11 -1
  174. package/dist/runtime/internal/app.mjs +188 -140
  175. package/dist/runtime/internal/cache.d.mts +9 -5
  176. package/dist/runtime/internal/cache.mjs +248 -219
  177. package/dist/runtime/internal/context.d.mts +9 -9
  178. package/dist/runtime/internal/context.mjs +17 -10
  179. package/dist/runtime/internal/database.mjs +8 -10
  180. package/dist/runtime/internal/error/dev.d.mts +5 -4
  181. package/dist/runtime/internal/error/dev.mjs +106 -105
  182. package/dist/runtime/internal/error/hooks.d.mts +1 -0
  183. package/dist/runtime/internal/error/hooks.mjs +9 -0
  184. package/dist/runtime/internal/error/prod.d.mts +5 -4
  185. package/dist/runtime/internal/error/prod.mjs +51 -59
  186. package/dist/runtime/internal/error/utils.d.mts +4 -4
  187. package/dist/runtime/internal/error/utils.mjs +1 -1
  188. package/dist/runtime/internal/meta.d.mts +1 -1
  189. package/dist/runtime/internal/meta.mjs +1 -1
  190. package/dist/runtime/internal/plugin.d.mts +2 -2
  191. package/dist/runtime/internal/plugin.mjs +1 -1
  192. package/dist/runtime/internal/route-rules.d.mts +8 -8
  193. package/dist/runtime/internal/route-rules.mjs +54 -52
  194. package/dist/runtime/internal/routes/dev-tasks.d.mts +1 -2
  195. package/dist/runtime/internal/routes/dev-tasks.mjs +16 -18
  196. package/dist/runtime/internal/routes/openapi.d.mts +1 -0
  197. package/dist/runtime/internal/routes/openapi.mjs +81 -87
  198. package/dist/runtime/internal/routes/renderer-template.d.mts +1 -1
  199. package/dist/runtime/internal/routes/renderer-template.dev.d.mts +1 -2
  200. package/dist/runtime/internal/routes/renderer-template.dev.mjs +15 -17
  201. package/dist/runtime/internal/routes/renderer-template.mjs +1 -1
  202. package/dist/runtime/internal/routes/scalar.d.mts +1 -0
  203. package/dist/runtime/internal/routes/scalar.mjs +22 -23
  204. package/dist/runtime/internal/routes/swagger.d.mts +1 -0
  205. package/dist/runtime/internal/routes/swagger.mjs +9 -11
  206. package/dist/runtime/internal/runtime-config.d.mts +4 -4
  207. package/dist/runtime/internal/runtime-config.mjs +40 -35
  208. package/dist/runtime/internal/static.mjs +63 -74
  209. package/dist/runtime/internal/storage.mjs +2 -2
  210. package/dist/runtime/internal/task.d.mts +6 -6
  211. package/dist/runtime/internal/task.mjs +56 -60
  212. package/dist/runtime/internal/vite/dev-entry.mjs +11 -1
  213. package/dist/runtime/internal/vite/dev-worker.mjs +9 -57
  214. package/dist/runtime/internal/vite/ssr-renderer.mjs +3 -1
  215. package/{lib/runtime-meta.d.mts → dist/runtime/meta.d.mts} +1 -1
  216. package/dist/runtime/meta.mjs +26 -0
  217. package/dist/runtime/nitro.d.mts +12 -0
  218. package/dist/runtime/nitro.mjs +32 -0
  219. package/dist/runtime/runtime-config.d.mts +1 -0
  220. package/dist/runtime/runtime-config.mjs +1 -0
  221. package/dist/runtime/storage.d.mts +1 -0
  222. package/dist/runtime/storage.mjs +1 -0
  223. package/dist/runtime/task.d.mts +1 -0
  224. package/dist/runtime/task.mjs +1 -0
  225. package/dist/runtime/vite-runtime.d.mts +8 -0
  226. package/dist/runtime/vite-runtime.mjs +9 -0
  227. package/dist/types/index.d.mts +2625 -2297
  228. package/dist/types/index.mjs +1 -1
  229. package/dist/vite.d.mts +49 -51
  230. package/dist/vite.mjs +44 -68
  231. package/lib/tsconfig.json +27 -0
  232. package/package.json +86 -76
  233. package/dist/_chunks/app.mjs +0 -19797
  234. package/dist/_chunks/build.mjs +0 -84
  235. package/dist/_chunks/build2.mjs +0 -318
  236. package/dist/_chunks/build3.mjs +0 -6452
  237. package/dist/_chunks/detect-acorn.mjs +0 -503
  238. package/dist/_chunks/index.mjs +0 -22242
  239. package/dist/_chunks/index2.mjs +0 -297
  240. package/dist/_chunks/index3.mjs +0 -1058
  241. package/dist/_chunks/index4.mjs +0 -1206
  242. package/dist/_chunks/info.mjs +0 -11157
  243. package/dist/_chunks/json5.mjs +0 -68
  244. package/dist/_chunks/jsonc.mjs +0 -51
  245. package/dist/_chunks/pathe.M-eThtNZ.mjs +0 -204
  246. package/dist/_chunks/plugin.mjs +0 -960
  247. package/dist/_chunks/server.mjs +0 -254
  248. package/dist/_chunks/snapshot.mjs +0 -284
  249. package/dist/_chunks/toml.mjs +0 -259
  250. package/dist/_chunks/yaml.mjs +0 -86
  251. package/dist/cli/build.mjs +0 -54
  252. package/dist/cli/common.mjs +0 -13
  253. package/dist/cli/dev.mjs +0 -95
  254. package/dist/cli/index2.mjs +0 -17
  255. package/dist/cli/list.mjs +0 -34
  256. package/dist/cli/prepare.mjs +0 -24
  257. package/dist/cli/run.mjs +0 -60
  258. package/dist/index.d.mts +0 -52
  259. package/dist/index.mjs +0 -55
  260. package/dist/node_modules/cookie/dist/index.js +0 -239
  261. package/dist/node_modules/cookie/package.json +0 -42
  262. package/dist/node_modules/klona/dist/index.mjs +0 -81
  263. package/dist/node_modules/klona/full/index.mjs +0 -53
  264. package/dist/node_modules/klona/package.json +0 -74
  265. package/dist/node_modules/std-env/dist/index.mjs +0 -1
  266. package/dist/node_modules/std-env/package.json +0 -46
  267. package/dist/presets/vercel/runtime/vercel.mjs +0 -17
  268. package/dist/presets.mjs +0 -2460
  269. package/dist/runtime/index.d.mts +0 -11
  270. package/dist/runtime/index.mjs +0 -17
  271. package/dist/runtime/internal/debug.d.mts +0 -2
  272. package/dist/runtime/internal/debug.mjs +0 -5
  273. package/dist/runtime/internal/empty.d.mts +0 -0
  274. package/dist/runtime/internal/index.d.mts +0 -3
  275. package/dist/runtime/internal/index.mjs +0 -3
  276. package/dist/runtime/internal/lib/http-graceful-shutdown.d.mts +0 -16
  277. package/dist/runtime/internal/lib/http-graceful-shutdown.mjs +0 -213
  278. package/dist/runtime/internal/renderer.d.mts +0 -3
  279. package/dist/runtime/internal/renderer.mjs +0 -36
  280. package/dist/runtime/internal/shutdown.d.mts +0 -9
  281. package/dist/runtime/internal/shutdown.mjs +0 -34
  282. package/dist/runtime/internal/utils.d.mts +0 -1
  283. package/dist/runtime/internal/utils.mjs +0 -15
  284. package/dist/runtime/internal/vite/dev-entry.d.mts +0 -1
  285. package/dist/runtime/internal/vite/dev-worker.d.mts +0 -1
  286. package/dist/runtime/internal/vite/prod-setup.d.mts +0 -4
  287. package/dist/runtime/internal/vite/prod-setup.mjs +0 -55
  288. package/dist/runtime/internal/vite/ssr-renderer.d.mts +0 -4
  289. package/lib/config.d.mts +0 -9
  290. package/lib/config.mjs +0 -5
  291. package/lib/meta.d.mts +0 -5
  292. package/lib/meta.mjs +0 -21
  293. package/lib/runtime-meta.mjs +0 -38
@@ -7,116 +7,117 @@ import { Youch } from "youch";
7
7
  import { SourceMapConsumer } from "source-map";
8
8
  import { defineNitroErrorHandler } from "./utils.mjs";
9
9
  import { FastResponse } from "srvx";
10
- export default defineNitroErrorHandler(
11
- async function defaultNitroErrorHandler(error, event) {
12
- const res = await defaultHandler(error, event);
13
- return new FastResponse(
14
- typeof res.body === "string" ? res.body : JSON.stringify(res.body, null, 2),
15
- res
16
- );
17
- }
18
- );
10
+ export default defineNitroErrorHandler(async function defaultNitroErrorHandler(error, event) {
11
+ const res = await defaultHandler(error, event);
12
+ return new FastResponse(typeof res.body === "string" ? res.body : JSON.stringify(res.body, null, 2), res);
13
+ });
19
14
  export async function defaultHandler(error, event, opts) {
20
- const isSensitive = error.unhandled;
21
- const status = error.status || 500;
22
- const url = getRequestURL(event, { xForwardedHost: true, xForwardedProto: true });
23
- if (status === 404) {
24
- const baseURL = import.meta.baseURL || "/";
25
- if (/^\/[^/]/.test(baseURL) && !url.pathname.startsWith(baseURL)) {
26
- const redirectTo = `${baseURL}${url.pathname.slice(1)}${url.search}`;
27
- return {
28
- status: 302,
29
- statusText: "Found",
30
- headers: { location: redirectTo },
31
- body: `Redirecting...`
32
- };
33
- }
34
- }
35
- await loadStackTrace(error).catch(consola.error);
36
- const youch = new Youch();
37
- if (isSensitive && !opts?.silent) {
38
- const tags = [error.unhandled && "[unhandled]"].filter(Boolean).join(" ");
39
- const ansiError = await (await youch.toANSI(error)).replaceAll(process.cwd(), ".");
40
- consola.error(
41
- `[request error] ${tags} [${event.req.method}] ${url}
42
-
43
- `,
44
- ansiError
45
- );
46
- }
47
- const useJSON = opts?.json || !event.req.headers.get("accept")?.includes("text/html");
48
- const headers = {
49
- "content-type": useJSON ? "application/json" : "text/html",
50
- // Prevent browser from guessing the MIME types of resources.
51
- "x-content-type-options": "nosniff",
52
- // Prevent error page from being embedded in an iframe
53
- "x-frame-options": "DENY",
54
- // Prevent browsers from sending the Referer header
55
- "referrer-policy": "no-referrer",
56
- // Disable the execution of any js
57
- "content-security-policy": "script-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self';"
58
- };
59
- if (status === 404 || !event.res.headers.has("cache-control")) {
60
- headers["cache-control"] = "no-cache";
61
- }
62
- const body = useJSON ? {
63
- error: true,
64
- url,
65
- status,
66
- statusText: error.statusText,
67
- message: error.message,
68
- data: error.data,
69
- stack: error.stack?.split("\n").map((line) => line.trim())
70
- } : await youch.toHTML(error, {
71
- request: {
72
- url: url.href,
73
- method: event.req.method,
74
- headers: Object.fromEntries(event.req.headers.entries())
75
- }
76
- });
77
- return {
78
- status,
79
- statusText: error.statusText,
80
- headers,
81
- body
82
- };
15
+ const isSensitive = error.unhandled;
16
+ const status = error.status || 500;
17
+ // prettier-ignore
18
+ const url = getRequestURL(event, {
19
+ xForwardedHost: true,
20
+ xForwardedProto: true
21
+ });
22
+ // Redirects with base URL
23
+ if (status === 404) {
24
+ const baseURL = import.meta.baseURL || "/";
25
+ if (/^\/[^/]/.test(baseURL) && !url.pathname.startsWith(baseURL)) {
26
+ const redirectTo = `${baseURL}${url.pathname.slice(1)}${url.search}`;
27
+ return {
28
+ status: 302,
29
+ statusText: "Found",
30
+ headers: { location: redirectTo },
31
+ body: `Redirecting...`
32
+ };
33
+ }
34
+ }
35
+ // Load stack trace with source maps
36
+ await loadStackTrace(error).catch(consola.error);
37
+ // https://github.com/poppinss/youch
38
+ const youch = new Youch();
39
+ // Console output
40
+ if (isSensitive && !opts?.silent) {
41
+ // prettier-ignore
42
+ const tags = [error.unhandled && "[unhandled]"].filter(Boolean).join(" ");
43
+ const ansiError = await (await youch.toANSI(error)).replaceAll(process.cwd(), ".");
44
+ consola.error(`[request error] ${tags} [${event.req.method}] ${url}\n\n`, ansiError);
45
+ }
46
+ // Use HTML response only when user-agent expects it (browsers)
47
+ const useJSON = opts?.json || !event.req.headers.get("accept")?.includes("text/html");
48
+ // Prepare headers
49
+ const headers = {
50
+ "content-type": useJSON ? "application/json" : "text/html",
51
+ "x-content-type-options": "nosniff",
52
+ "x-frame-options": "DENY",
53
+ "referrer-policy": "no-referrer",
54
+ "content-security-policy": "script-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self';"
55
+ };
56
+ if (status === 404 || !event.res.headers.has("cache-control")) {
57
+ headers["cache-control"] = "no-cache";
58
+ }
59
+ // Prepare body
60
+ const body = useJSON ? {
61
+ error: true,
62
+ url,
63
+ status,
64
+ statusText: error.statusText,
65
+ message: error.message,
66
+ data: error.data,
67
+ stack: error.stack?.split("\n").map((line) => line.trim())
68
+ } : await youch.toHTML(error, { request: {
69
+ url: url.href,
70
+ method: event.req.method,
71
+ headers: Object.fromEntries(event.req.headers.entries())
72
+ } });
73
+ return {
74
+ status,
75
+ statusText: error.statusText,
76
+ headers,
77
+ body
78
+ };
83
79
  }
80
+ // ---- Source Map support ----
84
81
  export async function loadStackTrace(error) {
85
- if (!(error instanceof Error)) {
86
- return;
87
- }
88
- const parsed = await new ErrorParser().defineSourceLoader(sourceLoader).parse(error);
89
- const stack = error.message + "\n" + parsed.frames.map((frame) => fmtFrame(frame)).join("\n");
90
- Object.defineProperty(error, "stack", { value: stack });
91
- if (error.cause) {
92
- await loadStackTrace(error.cause).catch(consola.error);
93
- }
82
+ if (!(error instanceof Error)) {
83
+ return;
84
+ }
85
+ const parsed = await new ErrorParser().defineSourceLoader(sourceLoader).parse(error);
86
+ const stack = error.message + "\n" + parsed.frames.map((frame) => fmtFrame(frame)).join("\n");
87
+ Object.defineProperty(error, "stack", { value: stack });
88
+ if (error.cause) {
89
+ await loadStackTrace(error.cause).catch(consola.error);
90
+ }
94
91
  }
95
92
  async function sourceLoader(frame) {
96
- if (!frame.fileName || frame.fileType !== "fs" || frame.type === "native") {
97
- return;
98
- }
99
- if (frame.type === "app") {
100
- const rawSourceMap = await readFile(`${frame.fileName}.map`, "utf8").catch(() => {
101
- });
102
- if (rawSourceMap) {
103
- const consumer = await new SourceMapConsumer(rawSourceMap);
104
- const originalPosition = consumer.originalPositionFor({ line: frame.lineNumber, column: frame.columnNumber });
105
- if (originalPosition.source && originalPosition.line) {
106
- frame.fileName = resolve(dirname(frame.fileName), originalPosition.source);
107
- frame.lineNumber = originalPosition.line;
108
- frame.columnNumber = originalPosition.column || 0;
109
- }
110
- }
111
- }
112
- const contents = await readFile(frame.fileName, "utf8").catch(() => {
113
- });
114
- return contents ? { contents } : void 0;
93
+ if (!frame.fileName || frame.fileType !== "fs" || frame.type === "native") {
94
+ return;
95
+ }
96
+ if (frame.type === "app") {
97
+ // prettier-ignore
98
+ const rawSourceMap = await readFile(`${frame.fileName}.map`, "utf8").catch(() => {});
99
+ if (rawSourceMap) {
100
+ const consumer = await new SourceMapConsumer(rawSourceMap);
101
+ // prettier-ignore
102
+ const originalPosition = consumer.originalPositionFor({
103
+ line: frame.lineNumber,
104
+ column: frame.columnNumber
105
+ });
106
+ if (originalPosition.source && originalPosition.line) {
107
+ // prettier-ignore
108
+ frame.fileName = resolve(dirname(frame.fileName), originalPosition.source);
109
+ frame.lineNumber = originalPosition.line;
110
+ frame.columnNumber = originalPosition.column || 0;
111
+ }
112
+ }
113
+ }
114
+ const contents = await readFile(frame.fileName, "utf8").catch(() => {});
115
+ return contents ? { contents } : undefined;
115
116
  }
116
117
  function fmtFrame(frame) {
117
- if (frame.type === "native") {
118
- return frame.raw;
119
- }
120
- const src = `${frame.fileName || ""}:${frame.lineNumber}:${frame.columnNumber})`;
121
- return frame.functionName ? `at ${frame.functionName} (${src}` : `at ${src}`;
118
+ if (frame.type === "native") {
119
+ return frame.raw;
120
+ }
121
+ const src = `${frame.fileName || ""}:${frame.lineNumber}:${frame.columnNumber})`;
122
+ return frame.functionName ? `at ${frame.functionName} (${src}` : `at ${src}`;
122
123
  }
@@ -0,0 +1 @@
1
+ export declare function trapUnhandledErrors();
@@ -0,0 +1,9 @@
1
+ import { useNitroApp } from "../app.mjs";
2
+ function _captureError(error, type) {
3
+ console.error(`[${type}]`, error);
4
+ useNitroApp().captureError?.(error, { tags: [type] });
5
+ }
6
+ export function trapUnhandledErrors() {
7
+ process.on("unhandledRejection", (error) => _captureError(error, "unhandledRejection"));
8
+ process.on("uncaughtException", (error) => _captureError(error, "uncaughtException"));
9
+ }
@@ -1,8 +1,9 @@
1
1
  import type { HTTPError, HTTPEvent } from "h3";
2
2
  import type { InternalHandlerResponse } from "./utils.mjs";
3
- declare const _default: NitroErrorHandler;
4
- export default _default;
3
+ import type { NitroErrorHandler } from "nitro/types";
4
+ declare const errorHandler: NitroErrorHandler;
5
+ export default errorHandler;
5
6
  export declare function defaultHandler(error: HTTPError, event: HTTPEvent, opts?: {
6
- silent?: boolean;
7
- json?: boolean;
7
+ silent?: boolean;
8
+ json?: boolean;
8
9
  }): InternalHandlerResponse;
@@ -1,62 +1,54 @@
1
- import { getRequestURL } from "h3";
2
- import { defineNitroErrorHandler } from "./utils.mjs";
3
1
  import { FastResponse } from "srvx";
4
- export default defineNitroErrorHandler(
5
- function defaultNitroErrorHandler(error, event) {
6
- const res = defaultHandler(error, event);
7
- return new FastResponse(JSON.stringify(res.body, null, 2), res);
8
- }
9
- );
2
+ const errorHandler = (error, event) => {
3
+ const res = defaultHandler(error, event);
4
+ return new FastResponse(typeof res.body === "string" ? res.body : JSON.stringify(res.body, null, 2), res);
5
+ };
6
+ export default errorHandler;
10
7
  export function defaultHandler(error, event, opts) {
11
- const isSensitive = error.unhandled;
12
- const status = error.status || 500;
13
- const url = getRequestURL(event, { xForwardedHost: true, xForwardedProto: true });
14
- if (status === 404) {
15
- const baseURL = import.meta.baseURL || "/";
16
- if (/^\/[^/]/.test(baseURL) && !url.pathname.startsWith(baseURL)) {
17
- const redirectTo = `${baseURL}${url.pathname.slice(1)}${url.search}`;
18
- return {
19
- status: 302,
20
- statusText: "Found",
21
- headers: { location: redirectTo },
22
- body: `Redirecting...`
23
- };
24
- }
25
- }
26
- if (isSensitive && !opts?.silent) {
27
- const tags = [error.unhandled && "[unhandled]"].filter(Boolean).join(" ");
28
- console.error(
29
- `[request error] ${tags} [${event.req.method}] ${url}
30
- `,
31
- error
32
- );
33
- }
34
- const headers = {
35
- "content-type": "application/json",
36
- // Prevent browser from guessing the MIME types of resources.
37
- "x-content-type-options": "nosniff",
38
- // Prevent error page from being embedded in an iframe
39
- "x-frame-options": "DENY",
40
- // Prevent browsers from sending the Referer header
41
- "referrer-policy": "no-referrer",
42
- // Disable the execution of any js
43
- "content-security-policy": "script-src 'none'; frame-ancestors 'none';"
44
- };
45
- if (status === 404 || !event.res.headers.has("cache-control")) {
46
- headers["cache-control"] = "no-cache";
47
- }
48
- const body = {
49
- error: true,
50
- url: url.href,
51
- status,
52
- statusText: error.statusText,
53
- message: isSensitive ? "Server Error" : error.message,
54
- data: isSensitive ? void 0 : error.data
55
- };
56
- return {
57
- status,
58
- statusText: error.statusText,
59
- headers,
60
- body
61
- };
8
+ const isSensitive = error.unhandled;
9
+ const status = error.status || 500;
10
+ const url = event.url || new URL(event.req.url);
11
+ if (status === 404) {
12
+ const baseURL = import.meta.baseURL || "/";
13
+ if (/^\/[^/]/.test(baseURL) && !url.pathname.startsWith(baseURL)) {
14
+ const redirectTo = `${baseURL}${url.pathname.slice(1)}${url.search}`;
15
+ return {
16
+ status: 302,
17
+ statusText: "Found",
18
+ headers: { location: redirectTo },
19
+ body: `Redirecting...`
20
+ };
21
+ }
22
+ }
23
+ // Console output
24
+ if (isSensitive && !opts?.silent) {
25
+ // prettier-ignore
26
+ const tags = [error.unhandled && "[unhandled]"].filter(Boolean).join(" ");
27
+ console.error(`[request error] ${tags} [${event.req.method}] ${url}\n`, error);
28
+ }
29
+ // Send response
30
+ const headers = {
31
+ "content-type": "application/json",
32
+ "x-content-type-options": "nosniff",
33
+ "x-frame-options": "DENY",
34
+ "referrer-policy": "no-referrer",
35
+ "content-security-policy": "script-src 'none'; frame-ancestors 'none';"
36
+ };
37
+ if (status === 404 || !event.res.headers.has("cache-control")) {
38
+ headers["cache-control"] = "no-cache";
39
+ }
40
+ const body = {
41
+ error: true,
42
+ url: url.href,
43
+ status,
44
+ statusText: error.statusText,
45
+ message: isSensitive ? "Server Error" : error.message,
46
+ data: isSensitive ? undefined : error.data
47
+ };
48
+ return {
49
+ status,
50
+ statusText: error.statusText,
51
+ headers,
52
+ body
53
+ };
62
54
  }
@@ -1,8 +1,8 @@
1
1
  import type { NitroErrorHandler } from "nitro/types";
2
2
  export declare function defineNitroErrorHandler(handler: NitroErrorHandler): NitroErrorHandler;
3
3
  export type InternalHandlerResponse = {
4
- status: number;
5
- statusText: string | undefined;
6
- headers: Record<string, string>;
7
- body: string | Record<string, any>;
4
+ status: number;
5
+ statusText: string | undefined;
6
+ headers: Record<string, string>;
7
+ body: string | Record<string, any>;
8
8
  };
@@ -1,3 +1,3 @@
1
1
  export function defineNitroErrorHandler(handler) {
2
- return handler;
2
+ return handler;
3
3
  }
@@ -1,2 +1,2 @@
1
1
  import type { NitroRouteMeta } from "nitro/types";
2
- export declare function defineRouteMeta(meta: NitroRouteMeta): NitroRouteMeta;
2
+ export declare function defineRouteMeta(meta: NitroRouteMeta);
@@ -1,3 +1,3 @@
1
1
  export function defineRouteMeta(meta) {
2
- return meta;
2
+ return meta;
3
3
  }
@@ -1,3 +1,3 @@
1
1
  import type { NitroAppPlugin } from "nitro/types";
2
- export declare function defineNitroPlugin(def: NitroAppPlugin): NitroAppPlugin;
3
- export declare const nitroPlugin: typeof defineNitroPlugin;
2
+ export declare function defineNitroPlugin(def: NitroAppPlugin);
3
+ export declare const nitroPlugin: unknown;
@@ -1,4 +1,4 @@
1
1
  export function defineNitroPlugin(def) {
2
- return def;
2
+ return def;
3
3
  }
4
4
  export const nitroPlugin = defineNitroPlugin;
@@ -1,8 +1,8 @@
1
- import type { Middleware } from "h3";
2
- import type { MatchedRouteRule, NitroRouteRules } from "nitro/types";
3
- type RouteRuleCtor<T extends keyof NitroRouteRules> = (m: MatchedRouteRule<T>) => Middleware;
4
- export declare const headers: RouteRuleCtor<"headers">;
5
- export declare const redirect: RouteRuleCtor<"redirect">;
6
- export declare const proxy: RouteRuleCtor<"proxy">;
7
- export declare const cache: RouteRuleCtor<"cache">;
8
- export {};
1
+ // Headers route rule
2
+ export declare const headers: unknown;
3
+ // Redirect route rule
4
+ export declare const redirect: unknown;
5
+ // Proxy route rule
6
+ export declare const proxy: unknown;
7
+ // Cache route rule
8
+ export declare const cache: unknown;
@@ -1,62 +1,64 @@
1
1
  import { proxyRequest, redirect as sendRedirect } from "h3";
2
2
  import { joinURL, withQuery, withoutBase } from "ufo";
3
- import { defineCachedEventHandler } from "./cache.mjs";
3
+ import { defineCachedHandler } from "./cache.mjs";
4
+ // Headers route rule
4
5
  export const headers = ((m) => function headersRouteRule(event) {
5
- for (const [key, value] of Object.entries(m.options || {})) {
6
- event.res.headers.set(key, value);
7
- }
6
+ for (const [key, value] of Object.entries(m.options || {})) {
7
+ event.res.headers.set(key, value);
8
+ }
8
9
  });
10
+ // Redirect route rule
9
11
  export const redirect = ((m) => function redirectRouteRule(event) {
10
- let target = m.options?.to;
11
- if (!target) {
12
- return;
13
- }
14
- if (target.endsWith("/**")) {
15
- let targetPath = event.url.pathname + event.url.search;
16
- const strpBase = m.options._redirectStripBase;
17
- if (strpBase) {
18
- targetPath = withoutBase(targetPath, strpBase);
19
- }
20
- target = joinURL(target.slice(0, -3), targetPath);
21
- } else if (event.url.search) {
22
- target = withQuery(target, Object.fromEntries(event.url.searchParams));
23
- }
24
- return sendRedirect(target, m.options?.status);
12
+ let target = m.options?.to;
13
+ if (!target) {
14
+ return;
15
+ }
16
+ if (target.endsWith("/**")) {
17
+ let targetPath = event.url.pathname + event.url.search;
18
+ const strpBase = m.options._redirectStripBase;
19
+ if (strpBase) {
20
+ targetPath = withoutBase(targetPath, strpBase);
21
+ }
22
+ target = joinURL(target.slice(0, -3), targetPath);
23
+ } else if (event.url.search) {
24
+ target = withQuery(target, Object.fromEntries(event.url.searchParams));
25
+ }
26
+ return sendRedirect(target, m.options?.status);
25
27
  });
28
+ // Proxy route rule
26
29
  export const proxy = ((m) => function proxyRouteRule(event) {
27
- let target = m.options?.to;
28
- if (!target) {
29
- return;
30
- }
31
- if (target.endsWith("/**")) {
32
- let targetPath = event.url.pathname + event.url.search;
33
- const strpBase = m.options._proxyStripBase;
34
- if (strpBase) {
35
- targetPath = withoutBase(targetPath, strpBase);
36
- }
37
- target = joinURL(target.slice(0, -3), targetPath);
38
- } else if (event.url.search) {
39
- target = withQuery(target, Object.fromEntries(event.url.searchParams));
40
- }
41
- return proxyRequest(event, target, {
42
- ...m.options
43
- });
30
+ let target = m.options?.to;
31
+ if (!target) {
32
+ return;
33
+ }
34
+ if (target.endsWith("/**")) {
35
+ let targetPath = event.url.pathname + event.url.search;
36
+ const strpBase = m.options._proxyStripBase;
37
+ if (strpBase) {
38
+ targetPath = withoutBase(targetPath, strpBase);
39
+ }
40
+ target = joinURL(target.slice(0, -3), targetPath);
41
+ } else if (event.url.search) {
42
+ target = withQuery(target, Object.fromEntries(event.url.searchParams));
43
+ }
44
+ return proxyRequest(event, target, { ...m.options });
44
45
  });
46
+ // Cache route rule
45
47
  export const cache = ((m) => function cacheRouteRule(event, next) {
46
- if (!event.context.matchedRoute) {
47
- return next();
48
- }
49
- const cachedHandlers = globalThis.__nitroCachedHandlers ??= /* @__PURE__ */ new Map();
50
- const { handler, route } = event.context.matchedRoute;
51
- const key = `${m.route}:${route}`;
52
- let cachedHandler = cachedHandlers.get(key);
53
- if (!cachedHandler) {
54
- cachedHandler = defineCachedEventHandler(handler, {
55
- group: "nitro/route-rules",
56
- name: key,
57
- ...m.options
58
- });
59
- cachedHandlers.set(key, cachedHandler);
60
- }
61
- return cachedHandler(event);
48
+ if (!event.context.matchedRoute) {
49
+ return next();
50
+ }
51
+ const cachedHandlers = globalThis.__nitroCachedHandlers ??= new Map();
52
+ const { handler, route } = event.context.matchedRoute;
53
+ const key = `${m.route}:${route}`;
54
+ let cachedHandler = cachedHandlers.get(key);
55
+ if (!cachedHandler) {
56
+ cachedHandler = defineCachedHandler(handler, {
57
+ group: "nitro/route-rules",
58
+ name: key,
59
+ ...m.options
60
+ });
61
+ cachedHandlers.set(key, cachedHandler);
62
+ }
63
+ return cachedHandler(event);
62
64
  });
@@ -1,3 +1,2 @@
1
- import { H3 } from "h3";
2
- declare const _default: H3;
1
+ declare const _default;
3
2
  export default _default;
@@ -1,23 +1,21 @@
1
1
  import { H3 } from "h3";
2
- import { runTask } from "nitro/runtime";
2
+ import { runTask } from "../task.mjs";
3
3
  import { scheduledTasks, tasks } from "#nitro-internal-virtual/tasks";
4
4
  export default new H3().get("/_nitro/tasks", async () => {
5
- const _tasks = await Promise.all(
6
- Object.entries(tasks).map(async ([name, task]) => {
7
- const _task = await task.resolve?.();
8
- return [name, { description: _task?.meta?.description }];
9
- })
10
- );
11
- return {
12
- tasks: Object.fromEntries(_tasks),
13
- scheduledTasks
14
- };
5
+ const _tasks = await Promise.all(Object.entries(tasks).map(async ([name, task]) => {
6
+ const _task = await task.resolve?.();
7
+ return [name, { description: _task?.meta?.description }];
8
+ }));
9
+ return {
10
+ tasks: Object.fromEntries(_tasks),
11
+ scheduledTasks
12
+ };
15
13
  }).get("/_nitro/tasks/:name", async (event) => {
16
- const name = event.context.params?.name;
17
- const body = await event.req.json().catch(() => ({}));
18
- const payload = {
19
- ...Object.fromEntries(event.url.searchParams.entries()),
20
- ...body
21
- };
22
- return await runTask(name, { payload });
14
+ const name = event.context.params?.name;
15
+ const body = await event.req.json().catch(() => ({}));
16
+ const payload = {
17
+ ...Object.fromEntries(event.url.searchParams.entries()),
18
+ ...body
19
+ };
20
+ return await runTask(name, { payload });
23
21
  });
@@ -1,3 +1,4 @@
1
1
  import type { EventHandler } from "h3";
2
+ // Served as /_openapi.json
2
3
  declare const _default: EventHandler;
3
4
  export default _default;