nitro 2.2.27 → 3.0.0-alpha.0

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 (306) hide show
  1. package/LICENSE +2 -2
  2. package/README.md +11 -259
  3. package/dist/_chunks/app.mjs +19797 -0
  4. package/dist/_chunks/build.mjs +84 -0
  5. package/dist/_chunks/build2.mjs +318 -0
  6. package/dist/_chunks/build3.mjs +6452 -0
  7. package/dist/_chunks/detect-acorn.mjs +503 -0
  8. package/dist/_chunks/index.mjs +22242 -0
  9. package/dist/_chunks/index2.mjs +297 -0
  10. package/dist/_chunks/index3.mjs +1058 -0
  11. package/dist/_chunks/index4.mjs +1206 -0
  12. package/dist/_chunks/info.mjs +11157 -0
  13. package/dist/_chunks/json5.mjs +68 -0
  14. package/dist/_chunks/jsonc.mjs +51 -0
  15. package/dist/_chunks/pathe.M-eThtNZ.mjs +204 -0
  16. package/dist/_chunks/plugin.mjs +960 -0
  17. package/dist/_chunks/server.mjs +254 -0
  18. package/dist/_chunks/snapshot.mjs +284 -0
  19. package/dist/_chunks/toml.mjs +259 -0
  20. package/dist/_chunks/yaml.mjs +86 -0
  21. package/dist/cli/build.mjs +54 -0
  22. package/dist/cli/common.mjs +13 -0
  23. package/dist/cli/dev.mjs +95 -0
  24. package/dist/cli/index.d.mts +1 -0
  25. package/dist/cli/index.mjs +477 -0
  26. package/dist/cli/index2.mjs +17 -0
  27. package/dist/cli/list.mjs +34 -0
  28. package/dist/cli/prepare.mjs +24 -0
  29. package/dist/cli/run.mjs +60 -0
  30. package/dist/index.d.mts +52 -0
  31. package/dist/index.mjs +55 -0
  32. package/dist/node_modules/@poppinss/colors/build/index.js +169 -0
  33. package/dist/node_modules/@poppinss/colors/package.json +116 -0
  34. package/dist/node_modules/@poppinss/dumper/build/chunk-26HALFTP.js +602 -0
  35. package/dist/node_modules/@poppinss/dumper/build/formatters/console/main.js +441 -0
  36. package/dist/node_modules/@poppinss/dumper/build/formatters/html/main.js +717 -0
  37. package/dist/node_modules/@poppinss/dumper/package.json +122 -0
  38. package/dist/node_modules/@poppinss/exception/build/index.js +63 -0
  39. package/dist/node_modules/@poppinss/exception/package.json +106 -0
  40. package/dist/node_modules/@sindresorhus/is/distribution/index.js +1313 -0
  41. package/dist/node_modules/@sindresorhus/is/distribution/utilities.js +3 -0
  42. package/dist/node_modules/@sindresorhus/is/package.json +81 -0
  43. package/dist/node_modules/@speed-highlight/core/dist/index.js +4 -0
  44. package/dist/node_modules/@speed-highlight/core/dist/terminal.js +2 -0
  45. package/dist/node_modules/@speed-highlight/core/package.json +90 -0
  46. package/dist/node_modules/cookie/dist/index.js +239 -0
  47. package/dist/node_modules/cookie/package.json +42 -0
  48. package/dist/node_modules/croner/dist/croner.js +1 -0
  49. package/dist/node_modules/croner/package.json +63 -0
  50. package/dist/node_modules/defu/dist/defu.mjs +69 -0
  51. package/dist/node_modules/defu/package.json +43 -0
  52. package/dist/node_modules/destr/dist/index.mjs +72 -0
  53. package/dist/node_modules/destr/package.json +47 -0
  54. package/dist/node_modules/error-stack-parser-es/dist/index.mjs +38 -0
  55. package/dist/node_modules/error-stack-parser-es/dist/lite.mjs +167 -0
  56. package/dist/node_modules/error-stack-parser-es/package.json +83 -0
  57. package/dist/node_modules/get-port-please/dist/index.mjs +430 -0
  58. package/dist/node_modules/get-port-please/package.json +39 -0
  59. package/dist/node_modules/hookable/dist/index.mjs +290 -0
  60. package/dist/node_modules/hookable/package.json +49 -0
  61. package/dist/node_modules/kleur/index.js +110 -0
  62. package/dist/node_modules/kleur/index.mjs +110 -0
  63. package/dist/node_modules/kleur/package.json +51 -0
  64. package/dist/node_modules/klona/dist/index.mjs +81 -0
  65. package/dist/node_modules/klona/full/index.mjs +53 -0
  66. package/dist/node_modules/klona/package.json +74 -0
  67. package/dist/node_modules/scule/dist/index.mjs +80 -0
  68. package/dist/node_modules/scule/package.json +43 -0
  69. package/dist/node_modules/source-map/lib/array-set.js +100 -0
  70. package/dist/node_modules/source-map/lib/base64-vlq.js +94 -0
  71. package/dist/node_modules/source-map/lib/base64.js +19 -0
  72. package/dist/node_modules/source-map/lib/binary-search.js +113 -0
  73. package/dist/node_modules/source-map/lib/mapping-list.js +83 -0
  74. package/dist/node_modules/source-map/lib/mappings.wasm +0 -0
  75. package/dist/node_modules/source-map/lib/read-wasm.js +27 -0
  76. package/dist/node_modules/source-map/lib/source-map-consumer.js +1081 -0
  77. package/dist/node_modules/source-map/lib/source-map-generator.js +439 -0
  78. package/dist/node_modules/source-map/lib/source-node.js +430 -0
  79. package/dist/node_modules/source-map/lib/url.js +13 -0
  80. package/dist/node_modules/source-map/lib/util.js +444 -0
  81. package/dist/node_modules/source-map/lib/wasm.js +138 -0
  82. package/dist/node_modules/source-map/package.json +79 -0
  83. package/dist/node_modules/source-map/source-map.js +10 -0
  84. package/dist/node_modules/std-env/dist/index.mjs +1 -0
  85. package/dist/node_modules/std-env/package.json +46 -0
  86. package/dist/node_modules/supports-color/index.js +202 -0
  87. package/dist/node_modules/supports-color/package.json +64 -0
  88. package/dist/node_modules/ufo/dist/index.mjs +638 -0
  89. package/dist/node_modules/ufo/package.json +47 -0
  90. package/dist/node_modules/unctx/dist/index.mjs +131 -0
  91. package/dist/node_modules/unctx/package.json +67 -0
  92. package/dist/node_modules/youch/build/chunk-4L7RY2JA.js +42 -0
  93. package/dist/node_modules/youch/build/chunk-4XB2BYKC.js +85 -0
  94. package/dist/node_modules/youch/build/chunk-4YEN7HVQ.js +61 -0
  95. package/dist/node_modules/youch/build/chunk-EUJBVOYB.js +83 -0
  96. package/dist/node_modules/youch/build/chunk-HFSXRSKS.js +85 -0
  97. package/dist/node_modules/youch/build/chunk-JAN2TFI2.js +222 -0
  98. package/dist/node_modules/youch/build/chunk-OSUFJZHZ.js +6 -0
  99. package/dist/node_modules/youch/build/chunk-PINJDICN.js +72 -0
  100. package/dist/node_modules/youch/build/chunk-PUHGL6HA.js +41 -0
  101. package/dist/node_modules/youch/build/chunk-VE4LENUR.js +45 -0
  102. package/dist/node_modules/youch/build/index.js +352 -0
  103. package/dist/node_modules/youch/build/public/error_cause/style.css +5 -0
  104. package/dist/node_modules/youch/build/public/error_info/script.js +13 -0
  105. package/dist/node_modules/youch/build/public/error_info/style.css +144 -0
  106. package/dist/node_modules/youch/build/public/error_stack/script.js +74 -0
  107. package/dist/node_modules/youch/build/public/error_stack/style.css +220 -0
  108. package/dist/node_modules/youch/build/public/error_stack_source/style.css +123 -0
  109. package/dist/node_modules/youch/build/public/header/script.js +16 -0
  110. package/dist/node_modules/youch/build/public/header/style.css +56 -0
  111. package/dist/node_modules/youch/build/public/layout/script.js +20 -0
  112. package/dist/node_modules/youch/build/public/layout/style.css +431 -0
  113. package/dist/node_modules/youch/package.json +133 -0
  114. package/dist/node_modules/youch-core/build/index.js +316 -0
  115. package/dist/node_modules/youch-core/package.json +124 -0
  116. package/dist/presets/_nitro/runtime/nitro-dev.d.mts +1 -0
  117. package/dist/presets/_nitro/runtime/nitro-dev.mjs +62 -0
  118. package/dist/presets/_nitro/runtime/nitro-prerenderer.d.mts +3 -0
  119. package/dist/presets/_nitro/runtime/nitro-prerenderer.mjs +18 -0
  120. package/dist/presets/_nitro/runtime/service-worker.d.mts +1 -0
  121. package/dist/presets/_nitro/runtime/service-worker.mjs +21 -0
  122. package/dist/presets/aws-amplify/runtime/aws-amplify.d.mts +1 -0
  123. package/dist/presets/aws-amplify/runtime/aws-amplify.mjs +13 -0
  124. package/dist/presets/aws-lambda/runtime/_utils.d.mts +18 -0
  125. package/dist/presets/aws-lambda/runtime/_utils.mjs +102 -0
  126. package/dist/presets/aws-lambda/runtime/aws-lambda-streaming.d.mts +3 -0
  127. package/dist/presets/aws-lambda/runtime/aws-lambda-streaming.mjs +33 -0
  128. package/dist/presets/aws-lambda/runtime/aws-lambda.d.mts +3 -0
  129. package/dist/presets/aws-lambda/runtime/aws-lambda.mjs +13 -0
  130. package/dist/presets/azure/runtime/_utils.d.mts +2 -0
  131. package/dist/presets/azure/runtime/_utils.mjs +50 -0
  132. package/dist/presets/azure/runtime/azure-swa.d.mts +5 -0
  133. package/dist/presets/azure/runtime/azure-swa.mjs +28 -0
  134. package/dist/presets/bun/runtime/bun.d.mts +1 -0
  135. package/dist/presets/bun/runtime/bun.mjs +27 -0
  136. package/dist/presets/cloudflare/runtime/_module-handler.d.mts +13 -0
  137. package/dist/presets/cloudflare/runtime/_module-handler.mjs +93 -0
  138. package/dist/presets/cloudflare/runtime/cloudflare-durable.d.mts +19 -0
  139. package/dist/presets/cloudflare/runtime/cloudflare-durable.mjs +74 -0
  140. package/dist/presets/cloudflare/runtime/cloudflare-module.d.mts +9 -0
  141. package/dist/presets/cloudflare/runtime/cloudflare-module.mjs +20 -0
  142. package/dist/presets/cloudflare/runtime/cloudflare-pages.d.mts +20 -0
  143. package/dist/presets/cloudflare/runtime/cloudflare-pages.mjs +47 -0
  144. package/dist/presets/cloudflare/runtime/plugin.dev.d.mts +3 -0
  145. package/dist/presets/cloudflare/runtime/plugin.dev.mjs +89 -0
  146. package/dist/presets/deno/runtime/deno-deploy.d.mts +1 -0
  147. package/dist/presets/deno/runtime/deno-deploy.mjs +17 -0
  148. package/dist/presets/deno/runtime/deno-server.d.mts +6 -0
  149. package/dist/presets/deno/runtime/deno-server.mjs +59 -0
  150. package/dist/presets/netlify/runtime/netlify-edge.d.mts +3 -0
  151. package/dist/presets/netlify/runtime/netlify-edge.mjs +17 -0
  152. package/dist/presets/netlify/runtime/netlify.d.mts +3 -0
  153. package/dist/presets/netlify/runtime/netlify.mjs +24 -0
  154. package/dist/presets/node/runtime/node-cluster.d.mts +1 -0
  155. package/dist/presets/node/runtime/node-cluster.mjs +58 -0
  156. package/dist/presets/node/runtime/node-middleware.d.mts +4 -0
  157. package/dist/presets/node/runtime/node-middleware.mjs +14 -0
  158. package/dist/presets/node/runtime/node-server.d.mts +3 -0
  159. package/dist/presets/node/runtime/node-server.mjs +44 -0
  160. package/dist/presets/standard/runtime/server.d.mts +5 -0
  161. package/dist/presets/standard/runtime/server.mjs +6 -0
  162. package/dist/presets/stormkit/runtime/stormkit.d.mts +21 -0
  163. package/dist/presets/stormkit/runtime/stormkit.mjs +28 -0
  164. package/dist/presets/vercel/runtime/vercel.d.mts +8 -0
  165. package/dist/presets/vercel/runtime/vercel.mjs +17 -0
  166. package/dist/presets/winterjs/runtime/winterjs.d.mts +1 -0
  167. package/dist/presets/winterjs/runtime/winterjs.mjs +87 -0
  168. package/dist/presets/zeabur/runtime/zeabur.d.mts +3 -0
  169. package/dist/presets/zeabur/runtime/zeabur.mjs +4 -0
  170. package/dist/presets.mjs +2460 -0
  171. package/dist/runtime/index.d.mts +11 -0
  172. package/dist/runtime/index.mjs +17 -0
  173. package/dist/runtime/internal/app.d.mts +2 -0
  174. package/dist/runtime/internal/app.mjs +153 -0
  175. package/dist/runtime/internal/cache.d.mts +7 -0
  176. package/dist/runtime/internal/cache.mjs +236 -0
  177. package/dist/runtime/internal/context.d.mts +12 -0
  178. package/dist/runtime/internal/context.mjs +17 -0
  179. package/dist/runtime/internal/database.d.mts +2 -0
  180. package/dist/runtime/internal/database.mjs +14 -0
  181. package/dist/runtime/internal/debug.d.mts +2 -0
  182. package/dist/runtime/internal/debug.mjs +5 -0
  183. package/dist/runtime/internal/empty.d.mts +0 -0
  184. package/dist/runtime/internal/empty.mjs +0 -0
  185. package/dist/runtime/internal/error/dev.d.mts +9 -0
  186. package/dist/runtime/internal/error/dev.mjs +122 -0
  187. package/dist/runtime/internal/error/prod.d.mts +8 -0
  188. package/dist/runtime/internal/error/prod.mjs +62 -0
  189. package/dist/runtime/internal/error/utils.d.mts +8 -0
  190. package/dist/runtime/internal/error/utils.mjs +3 -0
  191. package/dist/runtime/internal/index.d.mts +3 -0
  192. package/dist/runtime/internal/index.mjs +3 -0
  193. package/dist/runtime/internal/lib/http-graceful-shutdown.d.mts +16 -0
  194. package/dist/runtime/internal/lib/http-graceful-shutdown.mjs +213 -0
  195. package/dist/runtime/internal/meta.d.mts +2 -0
  196. package/dist/runtime/internal/meta.mjs +3 -0
  197. package/dist/runtime/internal/plugin.d.mts +3 -0
  198. package/dist/runtime/internal/plugin.mjs +4 -0
  199. package/dist/runtime/internal/renderer.d.mts +3 -0
  200. package/dist/runtime/internal/renderer.mjs +36 -0
  201. package/dist/runtime/internal/route-rules.d.mts +8 -0
  202. package/dist/runtime/internal/route-rules.mjs +62 -0
  203. package/dist/runtime/internal/routes/dev-tasks.d.mts +3 -0
  204. package/dist/runtime/internal/routes/dev-tasks.mjs +23 -0
  205. package/dist/runtime/internal/routes/openapi.d.mts +3 -0
  206. package/dist/runtime/internal/routes/openapi.mjs +100 -0
  207. package/dist/runtime/internal/routes/renderer-template.d.mts +2 -0
  208. package/dist/runtime/internal/routes/renderer-template.dev.d.mts +3 -0
  209. package/dist/runtime/internal/routes/renderer-template.dev.mjs +21 -0
  210. package/dist/runtime/internal/routes/renderer-template.mjs +4 -0
  211. package/dist/runtime/internal/routes/scalar.d.mts +3 -0
  212. package/dist/runtime/internal/routes/scalar.mjs +194 -0
  213. package/dist/runtime/internal/routes/swagger.d.mts +3 -0
  214. package/dist/runtime/internal/routes/swagger.mjs +44 -0
  215. package/dist/runtime/internal/runtime-config.d.mts +9 -0
  216. package/dist/runtime/internal/runtime-config.mjs +49 -0
  217. package/dist/runtime/internal/shutdown.d.mts +9 -0
  218. package/dist/runtime/internal/shutdown.mjs +34 -0
  219. package/dist/runtime/internal/static.d.mts +3 -0
  220. package/dist/runtime/internal/static.mjs +77 -0
  221. package/dist/runtime/internal/storage.d.mts +2 -0
  222. package/dist/runtime/internal/storage.mjs +6 -0
  223. package/dist/runtime/internal/task.d.mts +17 -0
  224. package/dist/runtime/internal/task.mjs +73 -0
  225. package/dist/runtime/internal/utils.d.mts +1 -0
  226. package/dist/runtime/internal/utils.mjs +15 -0
  227. package/dist/runtime/internal/vite/dev-entry.d.mts +1 -0
  228. package/dist/runtime/internal/vite/dev-entry.mjs +6 -0
  229. package/dist/runtime/internal/vite/dev-worker.d.mts +1 -0
  230. package/dist/runtime/internal/vite/dev-worker.mjs +362 -0
  231. package/dist/runtime/internal/vite/prod-setup.d.mts +4 -0
  232. package/dist/runtime/internal/vite/prod-setup.mjs +55 -0
  233. package/dist/runtime/internal/vite/ssr-renderer.d.mts +4 -0
  234. package/dist/runtime/internal/vite/ssr-renderer.mjs +4 -0
  235. package/dist/types/index.d.mts +2810 -0
  236. package/dist/types/index.mjs +1 -0
  237. package/dist/vite.d.mts +59 -0
  238. package/dist/vite.mjs +68 -0
  239. package/lib/config.d.mts +9 -0
  240. package/lib/config.mjs +5 -0
  241. package/lib/deps/h3.d.mts +1 -0
  242. package/lib/deps/h3.mjs +1 -0
  243. package/lib/deps/ofetch.mjs +1 -0
  244. package/lib/deps/ofetch.mts +1 -0
  245. package/lib/meta.d.mts +5 -0
  246. package/lib/meta.mjs +21 -0
  247. package/lib/runtime-meta.d.mts +5 -0
  248. package/lib/runtime-meta.mjs +38 -0
  249. package/package.json +190 -36
  250. package/.editorconfig +0 -12
  251. package/.eslintrc.js +0 -34
  252. package/.travis.yml +0 -7
  253. package/Dockerfile +0 -12
  254. package/Makefile +0 -37
  255. package/bin/nitro +0 -55
  256. package/lib/auto-require.js +0 -44
  257. package/lib/class-file.js +0 -105
  258. package/lib/class-files.js +0 -212
  259. package/lib/color.js +0 -89
  260. package/lib/cwd.js +0 -27
  261. package/lib/dir-expand.js +0 -80
  262. package/lib/dir.js +0 -130
  263. package/lib/file.js +0 -80
  264. package/lib/join-paths.js +0 -60
  265. package/lib/livereload/livereload.js +0 -55
  266. package/lib/livereload.js +0 -86
  267. package/lib/nitro.js +0 -161
  268. package/lib/package.js +0 -211
  269. package/lib/presets/autoprefixer.js +0 -11
  270. package/lib/presets/babel.js +0 -33
  271. package/lib/presets/browserify.js +0 -106
  272. package/lib/presets/coffee-script.js +0 -29
  273. package/lib/presets/cssnano.js +0 -11
  274. package/lib/presets/eslint.js +0 -67
  275. package/lib/presets/jshint.js +0 -51
  276. package/lib/presets/less.js +0 -45
  277. package/lib/presets/log.js +0 -11
  278. package/lib/presets/ng-annotate.js +0 -34
  279. package/lib/presets/noop.js +0 -7
  280. package/lib/presets/postcss/auto-postcss.js +0 -46
  281. package/lib/presets/postcss/autoprefixer-options.js +0 -9
  282. package/lib/presets/postcss.js +0 -40
  283. package/lib/presets/rollup.js +0 -56
  284. package/lib/presets/sass.js +0 -64
  285. package/lib/presets/sitemap.js +0 -101
  286. package/lib/presets/sitemap.xml +0 -12
  287. package/lib/presets/svg-symbols.js +0 -22
  288. package/lib/presets/svgo.js +0 -21
  289. package/lib/presets/uglify.js +0 -72
  290. package/lib/presets/webpack.js +0 -66
  291. package/lib/processors.js +0 -84
  292. package/lib/promisify.js +0 -16
  293. package/lib/server.js +0 -224
  294. package/lib/tasks.js +0 -114
  295. package/lib/watch.js +0 -81
  296. package/test.js +0 -59
  297. package/tests/cwd-tests.js +0 -25
  298. package/tests/dir-tests.js +0 -80
  299. package/tests/dummy/dummy.coffee +0 -7
  300. package/tests/dummy/dummy.js +0 -8
  301. package/tests/dummy/dummy.less +0 -6
  302. package/tests/dummy/dummy.sass +0 -5
  303. package/tests/file-tests.js +0 -17
  304. package/tests/join-paths-tests.js +0 -86
  305. package/tests/tasks-tests.js +0 -65
  306. package/wercker.yml +0 -25
@@ -0,0 +1,62 @@
1
+ import { getRequestURL } from "h3";
2
+ import { defineNitroErrorHandler } from "./utils.mjs";
3
+ 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
+ );
10
+ 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
+ };
62
+ }
@@ -0,0 +1,8 @@
1
+ import type { NitroErrorHandler } from "nitro/types";
2
+ export declare function defineNitroErrorHandler(handler: NitroErrorHandler): NitroErrorHandler;
3
+ export type InternalHandlerResponse = {
4
+ status: number;
5
+ statusText: string | undefined;
6
+ headers: Record<string, string>;
7
+ body: string | Record<string, any>;
8
+ };
@@ -0,0 +1,3 @@
1
+ export function defineNitroErrorHandler(handler) {
2
+ return handler;
3
+ }
@@ -0,0 +1,3 @@
1
+ export { trapUnhandledNodeErrors } from "./utils.mjs";
2
+ export { startScheduleRunner, runCronTasks } from "./task.mjs";
3
+ export { getGracefulShutdownConfig, setupGracefulShutdown } from "./shutdown.mjs";
@@ -0,0 +1,3 @@
1
+ export { trapUnhandledNodeErrors } from "./utils.mjs";
2
+ export { startScheduleRunner, runCronTasks } from "./task.mjs";
3
+ export { getGracefulShutdownConfig, setupGracefulShutdown } from "./shutdown.mjs";
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Gracefully shuts down `server` when the process receives
3
+ * the passed signals
4
+ *
5
+ * @param {http.Server} server
6
+ * @param {object} opts
7
+ * signals: string (each signal separated by SPACE)
8
+ * timeout: timeout value for forceful shutdown in ms
9
+ * forceExit: force process.exit() - otherwise just let event loop clear
10
+ * development: boolean value (if true, no graceful shutdown to speed up development
11
+ * preShutdown: optional function. Needs to return a promise. - HTTP sockets are still available and untouched
12
+ * onShutdown: optional function. Needs to return a promise.
13
+ * finally: optional function, handled at the end of the shutdown.
14
+ */
15
+ declare function GracefulShutdown(server: any, opts: any): () => any;
16
+ export default GracefulShutdown;
@@ -0,0 +1,213 @@
1
+ import http from "node:http";
2
+ const debug = (...args) => {
3
+ };
4
+ function GracefulShutdown(server, opts) {
5
+ opts = opts || {};
6
+ const options = Object.assign(
7
+ {
8
+ signals: "SIGINT SIGTERM",
9
+ timeout: 3e4,
10
+ development: false,
11
+ forceExit: true,
12
+ onShutdown: (signal) => Promise.resolve(signal),
13
+ preShutdown: (signal) => Promise.resolve(signal)
14
+ },
15
+ opts
16
+ );
17
+ let isShuttingDown = false;
18
+ const connections = {};
19
+ let connectionCounter = 0;
20
+ const secureConnections = {};
21
+ let secureConnectionCounter = 0;
22
+ let failed = false;
23
+ let finalRun = false;
24
+ function onceFactory() {
25
+ let called = false;
26
+ return (emitter, events, callback) => {
27
+ function call() {
28
+ if (!called) {
29
+ called = true;
30
+ return Reflect.apply(callback, this, arguments);
31
+ }
32
+ }
33
+ for (const e of events) {
34
+ emitter.on(e, call);
35
+ }
36
+ };
37
+ }
38
+ const signals = options.signals.split(" ").map((s) => s.trim()).filter((s) => s.length > 0);
39
+ const once = onceFactory();
40
+ once(process, signals, (signal) => {
41
+ debug("received shut down signal", signal);
42
+ shutdown(signal).then(() => {
43
+ if (options.forceExit) {
44
+ process.exit(failed ? 1 : 0);
45
+ }
46
+ }).catch((error) => {
47
+ debug("server shut down error occurred", error);
48
+ process.exit(1);
49
+ });
50
+ });
51
+ function isFunction(functionToCheck) {
52
+ const getType = Object.prototype.toString.call(functionToCheck);
53
+ return /^\[object\s([A-Za-z]+)?Function]$/.test(getType);
54
+ }
55
+ function destroy(socket, force = false) {
56
+ if (socket._isIdle && isShuttingDown || force) {
57
+ socket.destroy();
58
+ if (socket.server instanceof http.Server) {
59
+ delete connections[socket._connectionId];
60
+ } else {
61
+ delete secureConnections[socket._connectionId];
62
+ }
63
+ }
64
+ }
65
+ function destroyAllConnections(force = false) {
66
+ debug("Destroy Connections : " + (force ? "forced close" : "close"));
67
+ let counter = 0;
68
+ let secureCounter = 0;
69
+ for (const key of Object.keys(connections)) {
70
+ const socket = connections[key];
71
+ const serverResponse = socket._httpMessage;
72
+ if (serverResponse && !force) {
73
+ if (!serverResponse.headersSent) {
74
+ serverResponse.setHeader("connection", "close");
75
+ }
76
+ } else {
77
+ counter++;
78
+ destroy(socket);
79
+ }
80
+ }
81
+ debug("Connections destroyed : " + counter);
82
+ debug("Connection Counter : " + connectionCounter);
83
+ for (const key of Object.keys(secureConnections)) {
84
+ const socket = secureConnections[key];
85
+ const serverResponse = socket._httpMessage;
86
+ if (serverResponse && !force) {
87
+ if (!serverResponse.headersSent) {
88
+ serverResponse.setHeader("connection", "close");
89
+ }
90
+ } else {
91
+ secureCounter++;
92
+ destroy(socket);
93
+ }
94
+ }
95
+ debug("Secure Connections destroyed : " + secureCounter);
96
+ debug("Secure Connection Counter : " + secureConnectionCounter);
97
+ }
98
+ server.on("request", (req, res) => {
99
+ req.socket._isIdle = false;
100
+ if (isShuttingDown && !res.headersSent) {
101
+ res.setHeader("connection", "close");
102
+ }
103
+ res.on("finish", () => {
104
+ req.socket._isIdle = true;
105
+ destroy(req.socket);
106
+ });
107
+ });
108
+ server.on("connection", (socket) => {
109
+ if (isShuttingDown) {
110
+ socket.destroy();
111
+ } else {
112
+ const id = connectionCounter++;
113
+ socket._isIdle = true;
114
+ socket._connectionId = id;
115
+ connections[id] = socket;
116
+ socket.once("close", () => {
117
+ delete connections[socket._connectionId];
118
+ });
119
+ }
120
+ });
121
+ server.on("secureConnection", (socket) => {
122
+ if (isShuttingDown) {
123
+ socket.destroy();
124
+ } else {
125
+ const id = secureConnectionCounter++;
126
+ socket._isIdle = true;
127
+ socket._connectionId = id;
128
+ secureConnections[id] = socket;
129
+ socket.once("close", () => {
130
+ delete secureConnections[socket._connectionId];
131
+ });
132
+ }
133
+ });
134
+ process.on("close", () => {
135
+ debug("closed");
136
+ });
137
+ function shutdown(sig) {
138
+ function cleanupHttp() {
139
+ destroyAllConnections();
140
+ debug("Close http server");
141
+ return new Promise((resolve, reject) => {
142
+ server.close((err) => {
143
+ if (err) {
144
+ return reject(err);
145
+ }
146
+ return resolve(true);
147
+ });
148
+ });
149
+ }
150
+ debug("shutdown signal - " + sig);
151
+ if (options.development) {
152
+ debug("DEV-Mode - immediate forceful shutdown");
153
+ return process.exit(0);
154
+ }
155
+ function finalHandler() {
156
+ if (!finalRun) {
157
+ finalRun = true;
158
+ if (options.finally && isFunction(options.finally)) {
159
+ debug("executing finally()");
160
+ options.finally();
161
+ }
162
+ }
163
+ return Promise.resolve();
164
+ }
165
+ function waitForReadyToShutDown(totalNumInterval) {
166
+ debug(`waitForReadyToShutDown... ${totalNumInterval}`);
167
+ if (totalNumInterval === 0) {
168
+ debug(
169
+ `Could not close connections in time (${options.timeout}ms), will forcefully shut down`
170
+ );
171
+ return Promise.resolve(true);
172
+ }
173
+ const allConnectionsClosed = Object.keys(connections).length === 0 && Object.keys(secureConnections).length === 0;
174
+ if (allConnectionsClosed) {
175
+ debug("All connections closed. Continue to shutting down");
176
+ return Promise.resolve(false);
177
+ }
178
+ debug("Schedule the next waitForReadyToShutdown");
179
+ return new Promise((resolve) => {
180
+ setTimeout(() => {
181
+ resolve(waitForReadyToShutDown(totalNumInterval - 1));
182
+ }, 250);
183
+ });
184
+ }
185
+ if (isShuttingDown) {
186
+ return Promise.resolve();
187
+ }
188
+ debug("shutting down");
189
+ return options.preShutdown(sig).then(() => {
190
+ isShuttingDown = true;
191
+ cleanupHttp();
192
+ }).then(() => {
193
+ const pollIterations = options.timeout ? Math.round(options.timeout / 250) : 0;
194
+ return waitForReadyToShutDown(pollIterations);
195
+ }).then((force) => {
196
+ debug("Do onShutdown now");
197
+ if (force) {
198
+ destroyAllConnections(force);
199
+ }
200
+ return options.onShutdown(sig);
201
+ }).then(finalHandler).catch((error) => {
202
+ const errString = typeof error === "string" ? error : JSON.stringify(error);
203
+ debug(errString);
204
+ failed = true;
205
+ throw errString;
206
+ });
207
+ }
208
+ function shutdownManual() {
209
+ return shutdown("manual");
210
+ }
211
+ return shutdownManual;
212
+ }
213
+ export default GracefulShutdown;
@@ -0,0 +1,2 @@
1
+ import type { NitroRouteMeta } from "nitro/types";
2
+ export declare function defineRouteMeta(meta: NitroRouteMeta): NitroRouteMeta;
@@ -0,0 +1,3 @@
1
+ export function defineRouteMeta(meta) {
2
+ return meta;
3
+ }
@@ -0,0 +1,3 @@
1
+ import type { NitroAppPlugin } from "nitro/types";
2
+ export declare function defineNitroPlugin(def: NitroAppPlugin): NitroAppPlugin;
3
+ export declare const nitroPlugin: typeof defineNitroPlugin;
@@ -0,0 +1,4 @@
1
+ export function defineNitroPlugin(def) {
2
+ return def;
3
+ }
4
+ export const nitroPlugin = defineNitroPlugin;
@@ -0,0 +1,3 @@
1
+ import { type EventHandler } from "h3";
2
+ import type { RenderHandler } from "nitro/types";
3
+ export declare function defineRenderHandler(render: RenderHandler): EventHandler;
@@ -0,0 +1,36 @@
1
+ import { defineHandler } from "h3";
2
+ import { useNitroApp } from "./app.mjs";
3
+ import { useRuntimeConfig } from "./runtime-config.mjs";
4
+ export function defineRenderHandler(render) {
5
+ const runtimeConfig = useRuntimeConfig();
6
+ return defineHandler(async (event) => {
7
+ const nitroApp = useNitroApp();
8
+ const ctx = { event, render, response: void 0 };
9
+ await nitroApp.hooks.callHook("render:before", ctx);
10
+ if (!ctx.response) {
11
+ if (event.url.pathname === `${runtimeConfig.app.baseURL}favicon.ico`) {
12
+ event.res.headers.set("Content-Type", "image/x-icon");
13
+ return "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
14
+ }
15
+ ctx.response = await ctx.render(event);
16
+ if (!ctx.response) {
17
+ const _currentStatus = event.res.status;
18
+ event.res.statusText = String(
19
+ _currentStatus === 200 ? 500 : _currentStatus
20
+ );
21
+ return "No response returned from render handler: " + event.url.pathname;
22
+ }
23
+ }
24
+ await nitroApp.hooks.callHook("render:response", ctx.response, ctx);
25
+ if (ctx.response.headers) {
26
+ for (const [key, value] of Object.entries(ctx.response.headers)) {
27
+ event.res.headers.set(key, value);
28
+ }
29
+ }
30
+ if (ctx.response.status || ctx.response.statusText) {
31
+ event.res.status = ctx.response.status;
32
+ event.res.statusText = ctx.response.statusText;
33
+ }
34
+ return ctx.response.body;
35
+ });
36
+ }
@@ -0,0 +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 {};
@@ -0,0 +1,62 @@
1
+ import { proxyRequest, redirect as sendRedirect } from "h3";
2
+ import { joinURL, withQuery, withoutBase } from "ufo";
3
+ import { defineCachedEventHandler } from "./cache.mjs";
4
+ 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
+ }
8
+ });
9
+ 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);
25
+ });
26
+ 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
+ });
44
+ });
45
+ 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);
62
+ });
@@ -0,0 +1,3 @@
1
+ import { H3 } from "h3";
2
+ declare const _default: H3;
3
+ export default _default;
@@ -0,0 +1,23 @@
1
+ import { H3 } from "h3";
2
+ import { runTask } from "nitro/runtime";
3
+ import { scheduledTasks, tasks } from "#nitro-internal-virtual/tasks";
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
+ };
15
+ }).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 });
23
+ });
@@ -0,0 +1,3 @@
1
+ import type { EventHandler } from "h3";
2
+ declare const _default: EventHandler;
3
+ export default _default;
@@ -0,0 +1,100 @@
1
+ import { defineHandler, getRequestURL } from "h3";
2
+ import { joinURL } from "ufo";
3
+ import { defu } from "defu";
4
+ import { handlersMeta } from "#nitro-internal-virtual/routing-meta";
5
+ import { useRuntimeConfig } from "../runtime-config.mjs";
6
+ export default defineHandler((event) => {
7
+ const runtimeConfig = useRuntimeConfig();
8
+ const base = runtimeConfig.app?.baseURL;
9
+ const url = joinURL(getRequestURL(event).origin, base);
10
+ const meta = {
11
+ title: "Nitro Server Routes",
12
+ ...runtimeConfig.nitro?.openAPI?.meta
13
+ };
14
+ const {
15
+ paths,
16
+ globals: { components, ...globalsRest }
17
+ } = getHandlersMeta();
18
+ const extensible = Object.fromEntries(
19
+ Object.entries(globalsRest).filter(([key]) => key.startsWith("x-"))
20
+ );
21
+ return {
22
+ openapi: "3.1.0",
23
+ info: {
24
+ title: meta?.title,
25
+ version: meta?.version,
26
+ description: meta?.description
27
+ },
28
+ servers: [
29
+ {
30
+ url,
31
+ description: "Local Development Server",
32
+ variables: {}
33
+ }
34
+ ],
35
+ paths,
36
+ components,
37
+ ...extensible
38
+ };
39
+ });
40
+ function getHandlersMeta() {
41
+ const paths = {};
42
+ let globals = {};
43
+ for (const h of handlersMeta) {
44
+ const { route, parameters } = normalizeRoute(h.route || "");
45
+ const tags = defaultTags(h.route || "");
46
+ const method = (h.method || "get").toLowerCase();
47
+ const { $global, ...openAPI } = h.meta?.openAPI || {};
48
+ const item = {
49
+ [method]: {
50
+ tags,
51
+ parameters,
52
+ responses: {
53
+ 200: { description: "OK" }
54
+ },
55
+ ...openAPI
56
+ }
57
+ };
58
+ if ($global) {
59
+ globals = defu($global, globals);
60
+ }
61
+ if (paths[route] === void 0) {
62
+ paths[route] = item;
63
+ } else {
64
+ Object.assign(paths[route], item);
65
+ }
66
+ }
67
+ return { paths, globals };
68
+ }
69
+ function normalizeRoute(_route) {
70
+ const parameters = [];
71
+ let anonymousCtr = 0;
72
+ const route = _route.replace(/:(\w+)/g, (_, name) => `{${name}}`).replace(/\/(\*)\//g, () => `/{param${++anonymousCtr}}/`).replace(/\*\*{/, "{").replace(/\/(\*\*)$/g, () => `/{*param${++anonymousCtr}}`);
73
+ const paramMatches = route.matchAll(/{(\*?\w+)}/g);
74
+ for (const match of paramMatches) {
75
+ const name = match[1];
76
+ if (!parameters.some((p) => p.name === name)) {
77
+ parameters.push({
78
+ name,
79
+ in: "path",
80
+ required: true,
81
+ schema: { type: "string" }
82
+ });
83
+ }
84
+ }
85
+ return {
86
+ route,
87
+ parameters
88
+ };
89
+ }
90
+ function defaultTags(route) {
91
+ const tags = [];
92
+ if (route.startsWith("/api/")) {
93
+ tags.push("API Routes");
94
+ } else if (route.startsWith("/_")) {
95
+ tags.push("Internal");
96
+ } else {
97
+ tags.push("App Routes");
98
+ }
99
+ return tags;
100
+ }
@@ -0,0 +1,2 @@
1
+ import type { H3Event } from "h3";
2
+ export default function renderIndexHTML(event: H3Event): any;
@@ -0,0 +1,3 @@
1
+ import type { H3Event } from "h3";
2
+ import { HTTPResponse } from "h3";
3
+ export default function renderIndexHTML(event: H3Event): Promise<Response | HTTPResponse>;
@@ -0,0 +1,21 @@
1
+ import {
2
+ rendererTemplate,
3
+ rendererTemplateFile
4
+ } from "#nitro-internal-virtual/renderer-template";
5
+ import { HTTPResponse } from "h3";
6
+ import { hasTemplateSyntax, renderToResponse, compileTemplate } from "rendu";
7
+ export default async function renderIndexHTML(event) {
8
+ let html = await rendererTemplate(event.req);
9
+ if (globalThis.__transform_html__) {
10
+ html = await globalThis.__transform_html__(html);
11
+ }
12
+ if (!hasTemplateSyntax(html)) {
13
+ return new HTTPResponse(html, {
14
+ headers: { "content-type": "text/html; charset=utf-8" }
15
+ });
16
+ }
17
+ const template = compileTemplate(html, { filename: rendererTemplateFile });
18
+ return renderToResponse(template, {
19
+ request: event.req
20
+ });
21
+ }
@@ -0,0 +1,4 @@
1
+ import { rendererTemplate } from "#nitro-internal-virtual/renderer-template";
2
+ export default function renderIndexHTML(event) {
3
+ return rendererTemplate(event.req);
4
+ }
@@ -0,0 +1,3 @@
1
+ import { type EventHandler } from "h3";
2
+ declare const _default: EventHandler;
3
+ export default _default;