nitro 3.0.1-alpha.2 → 3.0.260415-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/LICENSE +6 -0
  2. package/README.md +2 -2
  3. package/dist/THIRD-PARTY-LICENSES.md +1646 -0
  4. package/dist/_build/common.mjs +7261 -3812
  5. package/dist/_build/rolldown.mjs +32 -42
  6. package/dist/_build/rollup.mjs +28 -48
  7. package/dist/_build/vite.build.mjs +10 -10
  8. package/dist/_chunks/nitro.mjs +102 -327
  9. package/dist/_chunks/nitro2.mjs +8 -9
  10. package/dist/_chunks/nitro3.mjs +136 -0
  11. package/dist/_chunks/nitro4.mjs +127 -0
  12. package/dist/_chunks/utils.mjs +40 -29
  13. package/dist/_common.mjs +13 -25
  14. package/dist/_dev.d.mts +0 -3
  15. package/dist/{_chunks/dev.mjs → _dev.mjs} +132 -330
  16. package/dist/_libs/_.mjs +2 -0
  17. package/dist/_libs/_2.mjs +2 -0
  18. package/dist/_libs/_3.mjs +2 -0
  19. package/dist/_libs/_4.mjs +2 -0
  20. package/dist/_libs/_5.mjs +2 -0
  21. package/dist/_libs/_6.mjs +2 -0
  22. package/dist/_libs/_7.mjs +2 -0
  23. package/dist/_libs/c12+rc9.mjs +814 -0
  24. package/dist/_libs/{c12+giget+readdirp+chokidar.d.mts → c12+readdirp+chokidar.d.mts} +49 -40
  25. package/dist/_libs/citty.mjs +142 -41
  26. package/dist/_libs/commondir+is-reference.mjs +60 -56
  27. package/dist/_libs/compatx.d.mts +0 -2
  28. package/dist/_libs/compatx.mjs +1 -4
  29. package/dist/_libs/esbuild.d.mts +0 -1
  30. package/dist/_libs/escape-string-regexp.mjs +1 -4
  31. package/dist/_libs/{pluginutils+plugin-commonjs.d.mts → estree+pluginutils.d.mts} +0 -5
  32. package/dist/_libs/estree-walker.mjs +4 -92
  33. package/dist/_libs/exsolve.d.mts +1 -0
  34. package/dist/_libs/hasown+resolve+deepmerge.mjs +160 -246
  35. package/dist/_libs/httpxy.d.mts +20 -13
  36. package/dist/_libs/httpxy.mjs +519 -95
  37. package/dist/_libs/js-tokens.d.mts +1 -0
  38. package/dist/_libs/klona.mjs +1 -4
  39. package/dist/_libs/magic-string.d.mts +0 -2
  40. package/dist/_libs/mlly.d.mts +0 -2
  41. package/dist/_libs/nypm+tinyexec.mjs +822 -0
  42. package/dist/_libs/perfect-debounce.mjs +68 -0
  43. package/dist/_libs/pkg-types.d.mts +0 -3
  44. package/dist/_libs/plugin-alias.mjs +1 -5
  45. package/dist/_libs/plugin-inject.mjs +1 -7
  46. package/dist/_libs/plugin-json.mjs +1 -5
  47. package/dist/_libs/pluginutils.mjs +3 -35
  48. package/dist/_libs/readdirp+chokidar.mjs +187 -365
  49. package/dist/_libs/remapping.mjs +1 -5
  50. package/dist/_libs/resolve-uri+gen-mapping.mjs +15 -53
  51. package/dist/_libs/rou3.d.mts +1 -4
  52. package/dist/_libs/rou3.mjs +223 -78
  53. package/dist/_libs/std-env.d.mts +8 -2
  54. package/dist/_libs/strip-literal.d.mts +1 -0
  55. package/dist/_libs/tsconfck.mjs +21 -334
  56. package/dist/_libs/ultrahtml.mjs +3 -16
  57. package/dist/_libs/unimport+unplugin.mjs +244 -388
  58. package/dist/_libs/unplugin+unimport.d.mts +5 -15
  59. package/dist/_libs/unwasm.d.mts +0 -3
  60. package/dist/_presets.mjs +576 -488
  61. package/dist/builder.d.mts +5 -25
  62. package/dist/builder.mjs +3 -8
  63. package/dist/cli/_chunks/build.mjs +22 -25
  64. package/dist/cli/_chunks/common.mjs +1 -4
  65. package/dist/cli/_chunks/deploy.mjs +37 -0
  66. package/dist/cli/_chunks/dev.mjs +6 -11
  67. package/dist/cli/_chunks/docs.mjs +28 -0
  68. package/dist/cli/_chunks/list.mjs +4 -8
  69. package/dist/cli/_chunks/prepare.mjs +2 -6
  70. package/dist/cli/_chunks/preview.mjs +48 -0
  71. package/dist/cli/_chunks/run.mjs +7 -11
  72. package/dist/cli/_chunks/task.mjs +1 -5
  73. package/dist/cli/index.mjs +5 -6
  74. package/dist/docs/0.docs/0.index/index.md +56 -0
  75. package/dist/docs/0.docs/1.quick-start.md +110 -0
  76. package/dist/docs/0.docs/10.lifecycle.md +204 -0
  77. package/dist/docs/0.docs/11.openapi.md +291 -0
  78. package/dist/docs/0.docs/12.plugins.md +164 -0
  79. package/dist/docs/0.docs/13.tasks.md +277 -0
  80. package/dist/docs/0.docs/14.websocket.md +386 -0
  81. package/dist/docs/0.docs/15.migration.md +213 -0
  82. package/dist/docs/0.docs/16.nightly.md +31 -0
  83. package/dist/docs/0.docs/2.renderer.md +322 -0
  84. package/dist/docs/0.docs/3.routing.md +711 -0
  85. package/dist/docs/0.docs/4.server-entry.md +239 -0
  86. package/dist/docs/0.docs/5.cache.md +408 -0
  87. package/dist/docs/0.docs/6.storage.md +261 -0
  88. package/dist/docs/0.docs/7.assets.md +166 -0
  89. package/dist/docs/0.docs/8.configuration.md +256 -0
  90. package/dist/docs/0.docs/9.database.md +185 -0
  91. package/dist/docs/1.deploy/0.index/index.md +64 -0
  92. package/dist/docs/1.deploy/1.runtimes/0.node.md +63 -0
  93. package/dist/docs/1.deploy/1.runtimes/1.bun.md +15 -0
  94. package/dist/docs/1.deploy/1.runtimes/2.deno.md +19 -0
  95. package/dist/docs/1.deploy/2.providers/0.alwaysdata.md +50 -0
  96. package/dist/docs/1.deploy/2.providers/1.aws.md +47 -0
  97. package/dist/docs/1.deploy/2.providers/10.flightcontrol.md +67 -0
  98. package/dist/docs/1.deploy/2.providers/11.genezio.md +67 -0
  99. package/dist/docs/1.deploy/2.providers/12.github-pages.md +68 -0
  100. package/dist/docs/1.deploy/2.providers/13.gitlab-pages.md +37 -0
  101. package/dist/docs/1.deploy/2.providers/14.heroku.md +84 -0
  102. package/dist/docs/1.deploy/2.providers/15.iis.md +38 -0
  103. package/dist/docs/1.deploy/2.providers/16.koyeb.md +109 -0
  104. package/dist/docs/1.deploy/2.providers/17.netlify.md +47 -0
  105. package/dist/docs/1.deploy/2.providers/18.platform-sh.md +37 -0
  106. package/dist/docs/1.deploy/2.providers/19.render.md +37 -0
  107. package/dist/docs/1.deploy/2.providers/2.aws-amplify.md +81 -0
  108. package/dist/docs/1.deploy/2.providers/20.stormkit.md +24 -0
  109. package/dist/docs/1.deploy/2.providers/21.vercel.md +270 -0
  110. package/dist/docs/1.deploy/2.providers/22.zeabur.md +19 -0
  111. package/dist/docs/1.deploy/2.providers/23.zephyr.md +99 -0
  112. package/dist/docs/1.deploy/2.providers/24.zerops.md +102 -0
  113. package/dist/docs/1.deploy/2.providers/3.azure.md +72 -0
  114. package/dist/docs/1.deploy/2.providers/4.cleavr.md +33 -0
  115. package/dist/docs/1.deploy/2.providers/5.cloudflare.md +369 -0
  116. package/dist/docs/1.deploy/2.providers/6.deno-deploy.md +66 -0
  117. package/dist/docs/1.deploy/2.providers/7.digitalocean.md +46 -0
  118. package/dist/docs/1.deploy/2.providers/8.edgeone.md +20 -0
  119. package/dist/docs/1.deploy/2.providers/9.firebase.md +32 -0
  120. package/dist/docs/2.config/0.index/index.md +1221 -0
  121. package/dist/docs/3.examples/0.index/index.md +3 -0
  122. package/dist/docs/3.examples/1.api-routes.md +145 -0
  123. package/dist/docs/3.examples/10.hono.md +74 -0
  124. package/dist/docs/3.examples/11.import-alias.md +97 -0
  125. package/dist/docs/3.examples/12.middleware.md +91 -0
  126. package/dist/docs/3.examples/13.mono-jsx.md +68 -0
  127. package/dist/docs/3.examples/14.nano-jsx.md +70 -0
  128. package/dist/docs/3.examples/15.plugins.md +91 -0
  129. package/dist/docs/3.examples/16.renderer.md +113 -0
  130. package/dist/docs/3.examples/17.runtime-config.md +97 -0
  131. package/dist/docs/3.examples/18.server-fetch.md +87 -0
  132. package/dist/docs/3.examples/19.shiki.md +198 -0
  133. package/dist/docs/3.examples/2.auto-imports.md +92 -0
  134. package/dist/docs/3.examples/20.virtual-routes.md +74 -0
  135. package/dist/docs/3.examples/21.vite-nitro-plugin.md +79 -0
  136. package/dist/docs/3.examples/22.vite-rsc.md +1041 -0
  137. package/dist/docs/3.examples/23.vite-ssr-html.md +217 -0
  138. package/dist/docs/3.examples/24.vite-ssr-preact.md +247 -0
  139. package/dist/docs/3.examples/25.vite-ssr-react.md +226 -0
  140. package/dist/docs/3.examples/26.vite-ssr-solid.md +256 -0
  141. package/dist/docs/3.examples/27.vite-ssr-tsr-react.md +442 -0
  142. package/dist/docs/3.examples/28.vite-ssr-tss-react.md +444 -0
  143. package/dist/docs/3.examples/29.vite-ssr-vue-router.md +617 -0
  144. package/dist/docs/3.examples/3.cached-handler.md +81 -0
  145. package/dist/docs/3.examples/30.vite-trpc.md +335 -0
  146. package/dist/docs/3.examples/31.websocket.md +282 -0
  147. package/dist/docs/3.examples/4.custom-error-handler.md +98 -0
  148. package/dist/docs/3.examples/5.database.md +157 -0
  149. package/dist/docs/3.examples/6.elysia.md +70 -0
  150. package/dist/docs/3.examples/7.express.md +78 -0
  151. package/dist/docs/3.examples/8.fastify.md +79 -0
  152. package/dist/docs/3.examples/9.hello-world.md +68 -0
  153. package/dist/docs/README.md +86 -0
  154. package/dist/docs/index.md +121 -0
  155. package/dist/node_modules/@poppinss/dumper/build/formatters/html/main.js +8 -0
  156. package/dist/node_modules/@poppinss/dumper/package.json +1 -1
  157. package/dist/node_modules/@speed-highlight/core/dist/index.js +4 -4
  158. package/dist/node_modules/@speed-highlight/core/dist/terminal.js +2 -2
  159. package/dist/node_modules/@speed-highlight/core/package.json +1 -1
  160. package/dist/node_modules/cookie-es/dist/index.mjs +299 -250
  161. package/dist/node_modules/cookie-es/package.json +26 -23
  162. package/dist/node_modules/croner/dist/croner.js +1 -1
  163. package/dist/node_modules/croner/package.json +11 -1
  164. package/dist/node_modules/defu/dist/defu.mjs +2 -2
  165. package/dist/node_modules/defu/package.json +33 -28
  166. package/dist/node_modules/rendu/dist/_chunks/libs/cookie-es.mjs +151 -0
  167. package/dist/node_modules/rendu/dist/index.mjs +5 -112
  168. package/dist/node_modules/rendu/package.json +25 -24
  169. package/dist/node_modules/youch/build/helpers-B9BQYaS6.js +23 -0
  170. package/dist/node_modules/youch/build/index.js +204 -351
  171. package/dist/node_modules/youch/build/public/error_info/script.js +1 -1
  172. package/dist/node_modules/youch/build/public_dir-C5bujZKB.js +25 -0
  173. package/dist/node_modules/youch/build/src/templates/error_cause/main.js +44 -0
  174. package/dist/node_modules/youch/build/src/templates/error_info/main.js +72 -0
  175. package/dist/node_modules/youch/build/src/templates/error_metadata/main.js +65 -0
  176. package/dist/node_modules/youch/build/src/templates/error_stack/main.js +152 -0
  177. package/dist/node_modules/youch/build/src/templates/error_stack_source/main.js +46 -0
  178. package/dist/node_modules/youch/build/src/templates/header/main.js +24 -0
  179. package/dist/node_modules/youch/build/src/templates/layout/main.js +27 -0
  180. package/dist/node_modules/youch/package.json +35 -32
  181. package/dist/presets/_nitro/runtime/nitro-dev.mjs +12 -57
  182. package/dist/presets/_nitro/runtime/nitro-prerenderer.mjs +1 -0
  183. package/dist/presets/_nitro/runtime/service-worker.mjs +1 -2
  184. package/dist/presets/aws-lambda/runtime/_utils.mjs +6 -6
  185. package/dist/presets/aws-lambda/runtime/aws-lambda-streaming.mjs +3 -1
  186. package/dist/presets/azure/runtime/_utils.mjs +5 -5
  187. package/dist/presets/azure/runtime/azure-swa.mjs +5 -5
  188. package/dist/presets/bun/runtime/bun.mjs +9 -6
  189. package/dist/presets/cloudflare/runtime/_module-handler.mjs +1 -1
  190. package/dist/presets/cloudflare/runtime/cloudflare-durable.mjs +4 -4
  191. package/dist/presets/cloudflare/runtime/cloudflare-module.mjs +3 -3
  192. package/dist/presets/cloudflare/runtime/cloudflare-pages.mjs +2 -2
  193. package/dist/presets/cloudflare/runtime/plugin.dev.mjs +10 -21
  194. package/dist/presets/deno/runtime/deno-deploy.mjs +4 -4
  195. package/dist/presets/deno/runtime/deno-server.mjs +9 -6
  196. package/dist/presets/edgeone/runtime/edgeone.mjs +10 -0
  197. package/dist/presets/netlify/runtime/netlify-edge.mjs +2 -3
  198. package/dist/presets/netlify/runtime/netlify.mjs +1 -1
  199. package/dist/presets/node/runtime/node-cluster.mjs +5 -4
  200. package/dist/presets/node/runtime/node-middleware.mjs +1 -1
  201. package/dist/presets/node/runtime/node-server.mjs +8 -5
  202. package/dist/presets/stormkit/runtime/stormkit.mjs +1 -2
  203. package/dist/presets/vercel/runtime/cron-handler.mjs +25 -0
  204. package/dist/presets/vercel/runtime/queue-handler.mjs +21 -0
  205. package/dist/presets/vercel/runtime/vercel.node.mjs +3 -3
  206. package/dist/presets/vercel/runtime/vercel.web.mjs +3 -5
  207. package/dist/presets/winterjs/runtime/winterjs.mjs +10 -10
  208. package/dist/presets/zephyr/runtime/server.mjs +3 -0
  209. package/dist/runtime/internal/app.mjs +12 -11
  210. package/dist/runtime/internal/cache.d.mts +0 -4
  211. package/dist/runtime/internal/cache.mjs +32 -256
  212. package/dist/runtime/internal/context.d.mts +3 -1
  213. package/dist/runtime/internal/context.mjs +1 -9
  214. package/dist/runtime/internal/error/dev.d.mts +5 -4
  215. package/dist/runtime/internal/error/dev.mjs +47 -49
  216. package/dist/runtime/internal/error/hooks.d.mts +1 -1
  217. package/dist/runtime/internal/error/prod.d.mts +2 -5
  218. package/dist/runtime/internal/error/prod.mjs +19 -33
  219. package/dist/runtime/internal/error/utils.d.mts +4 -4
  220. package/dist/runtime/internal/meta.d.mts +1 -1
  221. package/dist/runtime/internal/plugin.d.mts +2 -2
  222. package/dist/runtime/internal/route-rules.d.mts +11 -4
  223. package/dist/runtime/internal/route-rules.mjs +15 -5
  224. package/dist/runtime/internal/routes/dev-tasks.d.mts +3 -2
  225. package/dist/runtime/internal/routes/dev-tasks.mjs +15 -10
  226. package/dist/runtime/internal/routes/openapi.mjs +2 -2
  227. package/dist/runtime/internal/routes/renderer-template.d.mts +1 -1
  228. package/dist/runtime/internal/routes/renderer-template.dev.d.mts +2 -1
  229. package/dist/runtime/internal/routes/scalar.mjs +3 -3
  230. package/dist/runtime/internal/routes/swagger.mjs +7 -4
  231. package/dist/runtime/internal/runtime-config.d.mts +1 -1
  232. package/dist/runtime/internal/runtime-config.mjs +2 -2
  233. package/dist/runtime/internal/static.mjs +5 -4
  234. package/dist/runtime/internal/task.d.mts +3 -1
  235. package/dist/runtime/internal/task.mjs +7 -7
  236. package/dist/runtime/internal/vite/dev-entry.mjs +6 -3
  237. package/dist/runtime/internal/vite/dev-worker.mjs +264 -0
  238. package/dist/runtime/meta.d.mts +1 -0
  239. package/dist/runtime/meta.mjs +2 -0
  240. package/dist/runtime/nitro.d.mts +2 -0
  241. package/dist/runtime/nitro.mjs +4 -2
  242. package/dist/runtime/virtual/error-handler.mjs +1 -1
  243. package/dist/runtime/virtual/renderer-template.mjs +1 -1
  244. package/dist/runtime/virtual/server-assets.d.mts +2 -1
  245. package/dist/runtime/virtual/tracing.d.mts +5 -0
  246. package/dist/runtime/virtual/tracing.mjs +1 -0
  247. package/dist/runtime/vite.d.mts +1 -1
  248. package/dist/types/index.d.mts +215 -195
  249. package/dist/types/index.mjs +1 -11
  250. package/dist/vite.d.mts +3 -8
  251. package/dist/vite.mjs +285 -253
  252. package/lib/tsconfig.json +3 -5
  253. package/package.json +97 -80
  254. package/dist/_libs/confbox.mjs +0 -2509
  255. package/dist/_libs/nypm+giget+tinyexec.mjs +0 -3603
  256. package/dist/_libs/rc9+c12+dotenv.mjs +0 -972
  257. package/dist/node_modules/hookable/dist/index.mjs +0 -266
  258. package/dist/node_modules/hookable/package.json +0 -52
  259. package/dist/node_modules/youch/build/chunk-4L7RY2JA.js +0 -42
  260. package/dist/node_modules/youch/build/chunk-7QV3D5YX.js +0 -83
  261. package/dist/node_modules/youch/build/chunk-AUGPHE32.js +0 -39
  262. package/dist/node_modules/youch/build/chunk-CM7DWJNZ.js +0 -44
  263. package/dist/node_modules/youch/build/chunk-EJH674NB.js +0 -223
  264. package/dist/node_modules/youch/build/chunk-OIJ3WD7L.js +0 -81
  265. package/dist/node_modules/youch/build/chunk-P36L72PL.js +0 -87
  266. package/dist/node_modules/youch/build/chunk-PE3GG3TN.js +0 -65
  267. package/dist/node_modules/youch/build/chunk-X53OIOJH.js +0 -70
  268. package/dist/presets/_nitro/runtime/nitro-dev.d.mts +0 -2
  269. package/dist/presets/_nitro/runtime/nitro-prerenderer.d.mts +0 -3
  270. package/dist/presets/_nitro/runtime/service-worker.d.mts +0 -2
  271. package/dist/presets/aws-amplify/runtime/aws-amplify.d.mts +0 -2
  272. package/dist/presets/aws-lambda/runtime/_utils.d.mts +0 -8
  273. package/dist/presets/aws-lambda/runtime/aws-lambda-streaming.d.mts +0 -2
  274. package/dist/presets/aws-lambda/runtime/aws-lambda.d.mts +0 -3
  275. package/dist/presets/azure/runtime/_utils.d.mts +0 -2
  276. package/dist/presets/azure/runtime/azure-swa.d.mts +0 -5
  277. package/dist/presets/bun/runtime/bun.d.mts +0 -3
  278. package/dist/presets/cloudflare/runtime/_module-handler.d.mts +0 -16
  279. package/dist/presets/cloudflare/runtime/cloudflare-durable.d.mts +0 -11
  280. package/dist/presets/cloudflare/runtime/cloudflare-module.d.mts +0 -3
  281. package/dist/presets/cloudflare/runtime/cloudflare-pages.d.mts +0 -20
  282. package/dist/presets/cloudflare/runtime/plugin.dev.d.mts +0 -3
  283. package/dist/presets/deno/runtime/deno-deploy.d.mts +0 -5
  284. package/dist/presets/deno/runtime/deno-server.d.mts +0 -3
  285. package/dist/presets/netlify/runtime/netlify-edge.d.mts +0 -3
  286. package/dist/presets/netlify/runtime/netlify.d.mts +0 -4
  287. package/dist/presets/node/runtime/node-cluster.d.mts +0 -3
  288. package/dist/presets/node/runtime/node-middleware.d.mts +0 -3
  289. package/dist/presets/node/runtime/node-server.d.mts +0 -3
  290. package/dist/presets/standard/runtime/server.d.mts +0 -3
  291. package/dist/presets/stormkit/runtime/stormkit.d.mts +0 -21
  292. package/dist/presets/vercel/runtime/isr.d.mts +0 -2
  293. package/dist/presets/vercel/runtime/vercel.node.d.mts +0 -3
  294. package/dist/presets/vercel/runtime/vercel.web.d.mts +0 -8
  295. package/dist/presets/winterjs/runtime/winterjs.d.mts +0 -2
  296. package/dist/presets/zeabur/runtime/zeabur.d.mts +0 -3
  297. package/dist/runtime/internal/vite/node-runner.mjs +0 -359
package/dist/vite.mjs CHANGED
@@ -1,88 +1,88 @@
1
- import "./_common.mjs";
2
- import { $ as resolveModulePath, B as T, D as prepare, I as prettyPath, O as copyPublicAssets, V as a, at as join$1, ct as resolve$1, d as libChunkName, f as baseBuildConfig, h as writeBuildInfo, it as isAbsolute$1, l as NODE_MODULES_RE, m as getBuildInfo, n as baseBuildPlugins, nt as dirname$1, st as relative$1, tt as basename$1, u as getChunkName } from "./_build/common.mjs";
3
- import { i as debounce } from "./_libs/rc9+c12+dotenv.mjs";
1
+ import { D as copyPublicAssets, E as prepare, F as prettyPath, H as v, V as m, at as dirname$1, ct as join$1, d as libChunkName, dt as resolve$1, f as baseBuildConfig, h as writeBuildInfo, it as basename$1, l as NODE_MODULES_RE, n as baseBuildPlugins, nt as resolveModulePath, st as isAbsolute$1, u as getChunkName } from "./_build/common.mjs";
4
2
  import { t as formatCompatibilityDate } from "./_libs/compatx.mjs";
5
- import { i as createNitro } from "./_chunks/nitro.mjs";
6
- import "./_libs/tsconfck.mjs";
3
+ import { i as createNitro, r as prerender } from "./_chunks/nitro.mjs";
7
4
  import { n as scanHandlers } from "./_chunks/nitro2.mjs";
8
- import { i as NodeEnvRunner, r as NitroDevApp } from "./_chunks/dev.mjs";
9
5
  import { n as watch$1 } from "./_libs/readdirp+chokidar.mjs";
6
+ import { t as debounce } from "./_libs/perfect-debounce.mjs";
7
+ import { r as NitroDevApp } from "./_dev.mjs";
8
+ import { t as startPreview } from "./_chunks/nitro4.mjs";
10
9
  import { n as assetsPlugin } from "./_libs/pluginutils.mjs";
11
- import consola$1 from "consola";
10
+ import { runtimeDependencies, runtimeDir } from "nitro/meta";
12
11
  import { existsSync, watch } from "node:fs";
13
12
  import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
14
13
  import { join, resolve } from "node:path";
15
14
  import { defu } from "defu";
16
- import { runtimeDependencies, runtimeDir } from "nitro/meta";
15
+ import { withBase } from "ufo";
17
16
  import { colors } from "consola/utils";
18
- import { IncomingMessage } from "node:http";
17
+ import { RunnerManager, loadRunner } from "env-runner";
19
18
  import { NodeRequest, sendNodeResponse } from "srvx/node";
19
+ import "node:http";
20
20
  import { DevEnvironment } from "vite";
21
- import { spawn } from "node:child_process";
22
-
23
- //#region src/build/vite/bundler.ts
21
+ import { createViteHotChannel } from "env-runner/vite";
24
22
  const getBundlerConfig = async (ctx) => {
25
- const nitro$1 = ctx.nitro;
26
- const base = baseBuildConfig(nitro$1);
23
+ const nitro = ctx.nitro;
24
+ const base = baseBuildConfig(nitro);
27
25
  const commonConfig = {
28
- input: nitro$1.options.entry,
26
+ input: nitro.options.entry,
29
27
  external: [...base.env.external],
30
- plugins: [...await baseBuildPlugins(nitro$1, base)].filter(Boolean),
31
- treeshake: { moduleSideEffects(id) {
32
- return nitro$1.options.moduleSideEffects.some((p) => id.startsWith(p));
33
- } },
28
+ plugins: [...await baseBuildPlugins(nitro, base)].filter(Boolean),
34
29
  onwarn(warning, warn) {
35
30
  if (!base.ignoreWarningCodes.has(warning.code || "")) warn(warning);
36
31
  },
37
32
  output: {
38
- dir: nitro$1.options.output.serverDir,
33
+ dir: nitro.options.output.serverDir,
39
34
  format: "esm",
40
35
  entryFileNames: "index.mjs",
41
- chunkFileNames: (chunk) => getChunkName(chunk, nitro$1),
42
- inlineDynamicImports: nitro$1.options.inlineDynamicImports,
36
+ chunkFileNames: (chunk) => getChunkName(chunk, nitro),
37
+ inlineDynamicImports: nitro.options.inlineDynamicImports,
43
38
  sourcemapIgnoreList: (id) => id.includes("node_modules")
44
39
  }
45
40
  };
46
- if (ctx._isRolldown) return {
47
- base,
48
- rollupConfig: void 0,
49
- rolldownConfig: defu({
41
+ if (ctx._isRolldown) {
42
+ const rolldownConfig = defu({
50
43
  transform: { inject: base.env.inject },
51
44
  output: { codeSplitting: { groups: [{
52
45
  test: NODE_MODULES_RE,
53
46
  name: (id) => libChunkName(id)
54
47
  }] } }
55
- }, nitro$1.options.rolldownConfig, nitro$1.options.rollupConfig, commonConfig)
56
- };
57
- else {
58
- const inject = (await import("./_libs/plugin-inject.mjs").then((n) => n.t)).default;
59
- const alias = (await import("./_libs/plugin-alias.mjs").then((n) => n.n)).default;
48
+ }, nitro.options.rolldownConfig, nitro.options.rollupConfig, commonConfig);
49
+ const outputConfig = rolldownConfig.output;
50
+ if (outputConfig.inlineDynamicImports || outputConfig.format === "iife") {
51
+ delete outputConfig.inlineDynamicImports;
52
+ outputConfig.codeSplitting = false;
53
+ }
60
54
  return {
61
55
  base,
62
- rolldownConfig: void 0,
63
- rollupConfig: defu({
64
- plugins: [inject(base.env.inject), alias({ entries: base.aliases })],
65
- output: {
66
- sourcemapExcludeSources: true,
67
- generatedCode: { constBindings: true },
68
- manualChunks(id) {
69
- if (NODE_MODULES_RE.test(id)) return libChunkName(id);
70
- }
56
+ rolldownConfig
57
+ };
58
+ } else {
59
+ const inject = (await import("./_libs/_3.mjs")).default;
60
+ const alias = (await import("./_libs/plugin-alias.mjs").then((n) => n.n)).default;
61
+ const rollupConfig = defu({
62
+ plugins: [inject(base.env.inject), alias({ entries: base.aliases })],
63
+ output: {
64
+ sourcemapExcludeSources: true,
65
+ generatedCode: { constBindings: true },
66
+ manualChunks(id) {
67
+ if (NODE_MODULES_RE.test(id)) return libChunkName(id);
71
68
  }
72
- }, nitro$1.options.rolldownConfig, nitro$1.options.rollupConfig, commonConfig)
69
+ }
70
+ }, nitro.options.rolldownConfig, nitro.options.rollupConfig, commonConfig);
71
+ const outputConfig = rollupConfig.output;
72
+ if (outputConfig.inlineDynamicImports || outputConfig.format === "iife") delete outputConfig.manualChunks;
73
+ return {
74
+ base,
75
+ rollupConfig
73
76
  };
74
77
  }
75
78
  };
76
-
77
- //#endregion
78
- //#region src/build/vite/prod.ts
79
79
  const BuilderNames = {
80
80
  nitro: colors.magenta("Nitro"),
81
81
  client: colors.green("Client"),
82
82
  ssr: colors.blue("SSR")
83
83
  };
84
84
  async function buildEnvironments(ctx, builder) {
85
- const nitro$1 = ctx.nitro;
85
+ const nitro = ctx.nitro;
86
86
  for (const [envName, env] of Object.entries(builder.environments)) {
87
87
  const fmtName = BuilderNames[envName] || (envName.length <= 3 ? envName.toUpperCase() : envName[0].toUpperCase() + envName.slice(1));
88
88
  if (envName === "nitro" || !env.config.build.rollupOptions.input || env.isBuilt) {
@@ -90,11 +90,11 @@ async function buildEnvironments(ctx, builder) {
90
90
  "nitro",
91
91
  "ssr",
92
92
  "client"
93
- ].includes(envName)) nitro$1.logger.info(env.isBuilt ? `Skipping ${fmtName} (already built)` : `Skipping ${fmtName} (no input defined)`);
93
+ ].includes(envName)) nitro.logger.info(env.isBuilt ? `Skipping ${fmtName} (already built)` : `Skipping ${fmtName} (no input defined)`);
94
94
  continue;
95
95
  }
96
- if (!a && !T) console.log();
97
- nitro$1.logger.start(`Building [${fmtName}]`);
96
+ if (!v && !m) console.log();
97
+ nitro.logger.start(`Building [${fmtName}]`);
98
98
  await builder.build(env);
99
99
  }
100
100
  const nitroOptions = ctx.nitro.options;
@@ -111,13 +111,13 @@ async function buildEnvironments(ctx, builder) {
111
111
  }
112
112
  }
113
113
  await builder.writeAssetsManifest?.();
114
- if (!a && !T) console.log();
115
- const buildInfo = [["preset", nitro$1.options.preset], ["compatibility", formatCompatibilityDate(nitro$1.options.compatibilityDate)]].filter((e) => e[1]);
116
- nitro$1.logger.start(`Building [${BuilderNames.nitro}] ${colors.dim(`(${buildInfo.map(([k, v]) => `${k}: \`${v}\``).join(", ")})`)}`);
117
- await copyPublicAssets(nitro$1);
114
+ if (!v && !m) console.log();
115
+ const buildInfo = [["preset", nitro.options.preset], ["compatibility", formatCompatibilityDate(nitro.options.compatibilityDate)]].filter((e) => e[1]);
116
+ nitro.logger.start(`Building [${BuilderNames.nitro}] ${colors.dim(`(${buildInfo.map(([k, v]) => `${k}: \`${v}\``).join(", ")})`)}`);
117
+ await copyPublicAssets(nitro);
118
118
  const assetDirs = new Set(Object.values(builder.environments).filter((env) => env.config.consumer === "client").map((env) => env.config.build.assetsDir).filter(Boolean));
119
119
  for (const assetsDir of assetDirs) {
120
- if (!existsSync(resolve$1(nitro$1.options.output.publicDir, assetsDir))) continue;
120
+ if (!existsSync(resolve$1(nitro.options.output.publicDir, assetsDir))) continue;
121
121
  const rule = ctx.nitro.options.routeRules[`/${assetsDir}/**`] ??= {};
122
122
  if (!rule.headers?.["cache-control"]) rule.headers = {
123
123
  ...rule.headers,
@@ -125,17 +125,14 @@ async function buildEnvironments(ctx, builder) {
125
125
  };
126
126
  }
127
127
  ctx.nitro.routing.sync();
128
- await builder.build(builder.environments.nitro);
129
- await nitro$1.close();
130
- await nitro$1.hooks.callHook("compiled", nitro$1);
131
- await writeBuildInfo(nitro$1);
132
- const rOutput = relative$1(process.cwd(), nitro$1.options.output.dir);
133
- const rewriteRelativePaths = (input) => {
134
- return input.replace(/([\s:])\.\/(\S*)/g, `$1${rOutput}/$2`);
135
- };
136
- if (!a && !T) console.log();
137
- if (nitro$1.options.commands.preview) nitro$1.logger.success(`You can preview this build using \`${rewriteRelativePaths(nitro$1.options.commands.preview)}\``);
138
- if (nitro$1.options.commands.deploy) nitro$1.logger.success(`You can deploy this build using \`${rewriteRelativePaths(nitro$1.options.commands.deploy)}\``);
128
+ await prerender(nitro);
129
+ const output = await builder.build(builder.environments.nitro);
130
+ await nitro.close();
131
+ await nitro.hooks.callHook("compiled", nitro);
132
+ await writeBuildInfo(nitro, output);
133
+ if (!v && !m) console.log();
134
+ nitro.logger.success("You can preview this build using `npx vite preview`");
135
+ if (nitro.options.commands.deploy) nitro.logger.success("You can deploy this build using `npx nitro deploy --prebuilt`");
139
136
  }
140
137
  function prodSetup(ctx) {
141
138
  return `
@@ -161,83 +158,67 @@ ${Object.keys(ctx.services).map((name) => {
161
158
  globalThis.__nitro_vite_envs__ = services;
162
159
  `;
163
160
  }
164
-
165
- //#endregion
166
- //#region src/build/vite/dev.ts
167
- function createFetchableDevEnvironment(name, config, devServer, entry) {
161
+ function createFetchableDevEnvironment(name, config, devServer, entry, opts) {
168
162
  return new FetchableDevEnvironment(name, config, {
169
163
  hot: true,
170
- transport: createTransport(name, devServer)
171
- }, devServer, entry);
164
+ transport: createViteHotChannel(devServer, name)
165
+ }, devServer, entry, opts);
172
166
  }
173
167
  var FetchableDevEnvironment = class extends DevEnvironment {
174
168
  devServer;
175
- constructor(name, config, context, devServer, entry) {
169
+ #entry;
170
+ #preventExternalize;
171
+ constructor(name, config, context, devServer, entry, opts) {
176
172
  super(name, config, context);
177
173
  this.devServer = devServer;
178
- this.devServer.sendMessage({
179
- type: "custom",
180
- event: "nitro:vite-env",
181
- data: {
182
- name,
183
- entry
184
- }
185
- });
174
+ this.#entry = entry;
175
+ this.#preventExternalize = opts?.preventExternalize ?? false;
176
+ }
177
+ async fetchModule(id, importer, options) {
178
+ if (this.#preventExternalize && !id.startsWith("file://") && importer && id[0] !== "." && id[0] !== "/") {
179
+ const resolved = await this.pluginContainer.resolveId(id, importer);
180
+ if (resolved && !resolved.external) return super.fetchModule(resolved.id, importer, options);
181
+ }
182
+ return super.fetchModule(id, importer, options);
186
183
  }
187
184
  async dispatchFetch(request) {
188
185
  return this.devServer.fetch(request);
189
186
  }
190
187
  async init(...args) {
191
188
  await this.devServer.init?.();
192
- return super.init(...args);
189
+ await super.init(...args);
190
+ this.devServer.sendMessage({
191
+ type: "custom",
192
+ event: "nitro:vite-env",
193
+ data: {
194
+ name: this.name,
195
+ entry: this.#entry
196
+ }
197
+ });
193
198
  }
194
199
  };
195
- function createTransport(name, hooks) {
196
- const listeners = /* @__PURE__ */ new WeakMap();
197
- return {
198
- send: (data) => hooks.sendMessage({
199
- ...data,
200
- viteEnv: name
201
- }),
202
- on: (event, handler) => {
203
- if (event === "connection") return;
204
- const listener = (value) => {
205
- if (value?.type === "custom" && value.event === event && value.viteEnv === name) handler(value.data, { send: (payload) => hooks.sendMessage({
206
- ...payload,
207
- viteEnv: name
208
- }) });
209
- };
210
- listeners.set(handler, listener);
211
- hooks.onMessage(listener);
212
- },
213
- off: (event, handler) => {
214
- if (event === "connection") return;
215
- const listener = listeners.get(handler);
216
- if (listener) {
217
- hooks.offMessage(listener);
218
- listeners.delete(handler);
219
- }
220
- }
221
- };
222
- }
223
200
  async function configureViteDevServer(ctx, server) {
224
- const nitro$1 = ctx.nitro;
225
- const nitroEnv$1 = server.environments.nitro;
226
- const nitroConfigFile = nitro$1.options._c12.configFile;
201
+ const nitro = ctx.nitro;
202
+ const nitroEnv = server.environments.nitro;
203
+ const nitroConfigFile = nitro.options._c12.configFile;
227
204
  if (nitroConfigFile) server.config.configFileDependencies.push(nitroConfigFile);
228
- if (nitro$1.options.features.websocket ?? nitro$1.options.experimental.websocket) server.httpServer.on("upgrade", (req, socket, head) => {
229
- if (req.url?.startsWith("/?token")) return;
230
- getEnvRunner(ctx).upgrade?.(req, socket, head);
205
+ if (nitro.options.features.websocket ?? nitro.options.experimental.websocket) server.httpServer.on("upgrade", (req, socket, head) => {
206
+ if (req.headers["sec-websocket-protocol"]?.startsWith("vite-")) return;
207
+ getEnvRunner(ctx).upgrade?.({ node: {
208
+ req,
209
+ socket,
210
+ head
211
+ } });
231
212
  });
232
213
  const reload = debounce(async () => {
233
- await scanHandlers(nitro$1);
234
- nitro$1.routing.sync();
235
- nitroEnv$1.moduleGraph.invalidateAll();
236
- nitroEnv$1.hot.send({ type: "full-reload" });
214
+ await scanHandlers(nitro);
215
+ nitro.routing.sync();
216
+ nitroEnv.moduleGraph.invalidateAll();
217
+ nitroEnv.hot.send({ type: "full-reload" });
237
218
  });
238
- const scanDirs = nitro$1.options.scanDirs.flatMap((dir) => [
239
- join$1(dir, nitro$1.options.apiDir || "api"),
240
- join$1(dir, nitro$1.options.routesDir || "routes"),
219
+ const scanDirs = nitro.options.scanDirs.flatMap((dir) => [
220
+ join$1(dir, nitro.options.apiDir || "api"),
221
+ join$1(dir, nitro.options.routesDir || "routes"),
241
222
  join$1(dir, "middleware"),
242
223
  join$1(dir, "plugins"),
243
224
  join$1(dir, "modules")
@@ -248,35 +229,36 @@ async function configureViteDevServer(ctx, server) {
248
229
  "unlink",
249
230
  "unlinkDir"
250
231
  ]);
251
- const scanDirsWatcher = watch$1(scanDirs, { ignoreInitial: true }).on("all", (event, path$1, stat$2) => {
232
+ const scanDirsWatcher = watch$1(scanDirs, { ignoreInitial: true }).on("all", (event, path, stat) => {
252
233
  if (watchReloadEvents.has(event)) reload();
253
234
  });
254
- const rootDirWatcher = watch(nitro$1.options.rootDir, { persistent: false }, (_event, filename) => {
235
+ const rootDirWatcher = watch(nitro.options.rootDir, { persistent: false }, (_event, filename) => {
255
236
  if (filename && /^server\.[mc]?[jt]sx?$/.test(filename)) reload();
256
237
  });
257
- nitro$1.hooks.hook("close", () => {
238
+ nitro.hooks.hook("close", () => {
258
239
  scanDirsWatcher.close();
259
240
  rootDirWatcher.close();
260
241
  });
261
- const hostIPC = { async transformHTML(html) {
262
- return server.transformIndexHtml("/", html).then((r) => r.replace("<!--ssr-outlet-->", `{{{ globalThis.__nitro_vite_envs__?.["ssr"]?.fetch($REQUEST) || "" }}}`));
263
- } };
264
- nitroEnv$1.devServer.onMessage(async (payload) => {
265
- if (payload.type === "custom" && payload.event === "nitro:vite-invoke") {
266
- const res = await hostIPC[payload.data.name](payload.data.data).then((data) => ({ data })).catch((error) => ({ error }));
267
- nitroEnv$1.devServer.sendMessage({
268
- type: "custom",
269
- event: "nitro:vite-invoke-response",
270
- data: {
271
- id: payload.data.id,
272
- data: res
273
- }
242
+ nitroEnv.devServer.onMessage(async (message) => {
243
+ if (message?.__rpc === "transformHTML") try {
244
+ const html = (await server.transformIndexHtml("/", message.data)).replace("<!--ssr-outlet-->", `{{{ globalThis.__nitro_vite_envs__?.["ssr"]?.fetch($REQUEST) || "" }}}`);
245
+ nitroEnv.devServer.sendMessage({
246
+ __rpc_id: message.__rpc_id,
247
+ data: html
248
+ });
249
+ } catch (error) {
250
+ nitroEnv.devServer.sendMessage({
251
+ __rpc_id: message.__rpc_id,
252
+ error: error instanceof Error ? error.message : String(error)
274
253
  });
275
254
  }
276
255
  });
277
256
  const nitroDevMiddleware = async (nodeReq, nodeRes, next) => {
278
257
  if (!nodeReq.url || /^\/@(?:vite|fs|id)\//.test(nodeReq.url) || nodeReq._nitroHandled || server.middlewares.stack.map((mw) => mw.route).some((base) => base && nodeReq.url.startsWith(base))) return next();
279
258
  nodeReq._nitroHandled = true;
259
+ const baseURL = nitro.options.baseURL || "/";
260
+ const originalURL = nodeReq.url;
261
+ if (baseURL !== "/") nodeReq.url = withBase(nodeReq.url, baseURL);
280
262
  try {
281
263
  const req = new NodeRequest({
282
264
  req: nodeReq,
@@ -285,34 +267,29 @@ async function configureViteDevServer(ctx, server) {
285
267
  const devAppRes = await ctx.devApp.fetch(req);
286
268
  if (nodeRes.writableEnded || nodeRes.headersSent) return;
287
269
  if (devAppRes.status !== 404) return await sendNodeResponse(nodeRes, devAppRes);
288
- const envRes = await nitroEnv$1.dispatchFetch(req);
270
+ const envRes = await nitroEnv.dispatchFetch(req);
289
271
  if (nodeRes.writableEnded || nodeRes.headersSent) return;
290
272
  return await sendNodeResponse(nodeRes, envRes);
291
273
  } catch (error) {
292
274
  return next(error);
275
+ } finally {
276
+ if (baseURL !== "/") nodeReq.url = originalURL;
293
277
  }
294
278
  };
295
279
  server.middlewares.use(function nitroDevMiddlewarePre(req, res, next) {
296
280
  const fetchDest = req.headers["sec-fetch-dest"];
281
+ const ext = req.url.match(/\.([a-z0-9]+)(?:[?#]|$)/i)?.[1];
282
+ const isNitroRoute = ext ? !!nitro.routing.routes.match(req.method || "", new URL(withBase(req.url, nitro.options.baseURL), "http://localhost").pathname) : false;
297
283
  res.setHeader("vary", "sec-fetch-dest");
298
- if ((!fetchDest || /^(document|iframe|frame|empty)$/.test(fetchDest)) && !req.url.match(/\.([a-z0-9]+)(?:[?#]|$)/i)?.[1] && !/^\/(?:__|@)/.test(req.url)) nitroDevMiddleware(req, res, next);
284
+ if ((!fetchDest || /^(document|iframe|frame|empty)$/.test(fetchDest)) && (!ext || isNitroRoute) && !/^\/(?:__|@)/.test(req.url)) nitroDevMiddleware(req, res, next);
299
285
  else next();
300
286
  });
301
287
  return () => {
302
288
  server.middlewares.use(nitroDevMiddleware);
303
289
  };
304
290
  }
305
-
306
- //#endregion
307
- //#region src/build/vite/env.ts
308
- function getEnvRunner(ctx) {
309
- return ctx._envRunner ??= new NodeEnvRunner({
310
- name: "nitro-vite",
311
- entry: resolve(runtimeDir, "internal/vite/node-runner.mjs"),
312
- data: { server: true }
313
- });
314
- }
315
291
  function createNitroEnvironment(ctx) {
292
+ const isWorkerdRunner = _isWorkerdRunner(ctx);
316
293
  return {
317
294
  consumer: "server",
318
295
  build: {
@@ -321,41 +298,150 @@ function createNitroEnvironment(ctx) {
321
298
  minify: ctx.nitro.options.minify,
322
299
  emptyOutDir: false,
323
300
  sourcemap: ctx.nitro.options.sourcemap,
324
- commonjsOptions: ctx.nitro.options.commonJS
301
+ commonjsOptions: ctx.nitro.options.commonJS,
302
+ copyPublicDir: false
325
303
  },
326
304
  resolve: {
327
- noExternal: ctx.nitro.options.dev ? [
305
+ noExternal: ctx.nitro.options.dev ? isWorkerdRunner ? true : [
328
306
  /^nitro$/,
329
- /* @__PURE__ */ new RegExp(`^(${runtimeDependencies.join("|")})$`),
307
+ new RegExp(`^(${runtimeDependencies.join("|")})$`),
330
308
  ...ctx.bundlerConfig.base.noExternal
331
309
  ] : true,
332
- conditions: ctx.nitro.options.exportConditions,
310
+ conditions: isWorkerdRunner ? [
311
+ "workerd",
312
+ "worker",
313
+ ...ctx.nitro.options.exportConditions.filter((c) => c !== "node")
314
+ ] : ctx.nitro.options.exportConditions,
333
315
  externalConditions: ctx.nitro.options.exportConditions?.filter((c) => !/browser|wasm|module/.test(c))
334
316
  },
335
317
  define: { "process.env.NODE_ENV": JSON.stringify(ctx.nitro.options.dev ? "development" : "production") },
336
- dev: { createEnvironment: (envName, envConfig) => createFetchableDevEnvironment(envName, envConfig, getEnvRunner(ctx), resolve(runtimeDir, "internal/vite/dev-entry.mjs")) }
318
+ dev: { createEnvironment: (envName, envConfig) => {
319
+ const entry = resolve(runtimeDir, "internal/vite/dev-entry.mjs");
320
+ const env = createFetchableDevEnvironment(envName, envConfig, getEnvRunner(ctx), entry, { preventExternalize: isWorkerdRunner });
321
+ ctx._transformRequest = (id) => env.transformRequest(id);
322
+ (ctx._viteEnvs ??= /* @__PURE__ */ new Map()).set(envName, entry);
323
+ return env;
324
+ } }
337
325
  };
338
326
  }
339
327
  function createServiceEnvironment(ctx, name, serviceConfig) {
328
+ const isWorkerdRunner = _isWorkerdRunner(ctx);
340
329
  return {
341
330
  consumer: "server",
342
331
  build: {
343
- rollupOptions: { input: { index: serviceConfig.entry } },
332
+ rollupOptions: {
333
+ input: { index: serviceConfig.entry },
334
+ external: [/^nitro(\/|$)/]
335
+ },
344
336
  minify: ctx.nitro.options.minify,
345
337
  sourcemap: ctx.nitro.options.sourcemap,
346
338
  outDir: join(ctx.nitro.options.buildDir, "vite/services", name),
347
- emptyOutDir: true
339
+ emptyOutDir: true,
340
+ copyPublicDir: false
348
341
  },
349
342
  resolve: {
350
- conditions: ctx.nitro.options.exportConditions,
343
+ ...isWorkerdRunner ? { noExternal: true } : {},
344
+ conditions: isWorkerdRunner ? [
345
+ "workerd",
346
+ "worker",
347
+ ...ctx.nitro.options.exportConditions.filter((c) => c !== "node")
348
+ ] : ctx.nitro.options.exportConditions,
351
349
  externalConditions: ctx.nitro.options.exportConditions?.filter((c) => !/browser|wasm|module/.test(c))
352
350
  },
353
- dev: { createEnvironment: (envName, envConfig) => createFetchableDevEnvironment(envName, envConfig, getEnvRunner(ctx), tryResolve(serviceConfig.entry)) }
351
+ dev: { createEnvironment: (envName, envConfig) => {
352
+ const entry = tryResolve(serviceConfig.entry);
353
+ (ctx._viteEnvs ??= /* @__PURE__ */ new Map()).set(envName, entry);
354
+ return createFetchableDevEnvironment(envName, envConfig, getEnvRunner(ctx), entry, { preventExternalize: isWorkerdRunner });
355
+ } }
354
356
  };
355
357
  }
356
358
  function createServiceEnvironments(ctx) {
357
359
  return Object.fromEntries(Object.entries(ctx.services).map(([name, config]) => [name, createServiceEnvironment(ctx, name, config)]));
358
360
  }
361
+ async function initEnvRunner(ctx) {
362
+ if (ctx._envRunner) return ctx._envRunner;
363
+ if (!ctx._initPromise) ctx._initPromise = (async () => {
364
+ const manager = new RunnerManager();
365
+ let _retries = 0;
366
+ manager.onClose((_runner, cause) => {
367
+ if (_retries++ < 3) {
368
+ ctx.nitro.logger.info("Restarting env runner...", cause ? `Cause: ${cause}` : "");
369
+ _loadRunner(ctx, manager);
370
+ } else ctx.nitro.logger.error("Env runner failed after 3 retries.", cause ? `Last cause: ${cause}` : "");
371
+ });
372
+ manager.onReady(() => {
373
+ _retries = 0;
374
+ if (ctx._viteEnvs) for (const [name, entry] of ctx._viteEnvs) manager.sendMessage({
375
+ type: "custom",
376
+ event: "nitro:vite-env",
377
+ data: {
378
+ name,
379
+ entry
380
+ }
381
+ });
382
+ });
383
+ await _loadRunner(ctx, manager);
384
+ ctx._envRunner = manager;
385
+ return manager;
386
+ })();
387
+ return await ctx._initPromise;
388
+ }
389
+ function getEnvRunner(ctx) {
390
+ if (!ctx._envRunner) throw new Error("Env runner not initialized. Call initEnvRunner() first.");
391
+ return ctx._envRunner;
392
+ }
393
+ async function _loadRunner(ctx, manager) {
394
+ const runnerName = ctx.nitro.options.devServer.runner || process.env.NITRO_DEV_RUNNER || "node-worker";
395
+ const entry = resolve(runtimeDir, "internal/vite/dev-worker.mjs");
396
+ let runner;
397
+ if (runnerName === "miniflare") {
398
+ const { MiniflareEnvRunner } = await import("env-runner/runners/miniflare");
399
+ runner = new MiniflareEnvRunner({
400
+ name: "nitro-vite",
401
+ data: { entry }
402
+ });
403
+ } else runner = await loadRunner(runnerName, {
404
+ name: "nitro-vite",
405
+ data: { entry }
406
+ });
407
+ await manager.reload(runner);
408
+ }
409
+ const NITRO_PROXY_PREFIX = "\0nitro-env-proxy:";
410
+ function nitroServiceProxy() {
411
+ return {
412
+ name: "nitro:service-proxy",
413
+ enforce: "pre",
414
+ applyToEnvironment: (env) => env.name !== "nitro" && env.config.consumer === "server",
415
+ apply: (_config, configEnv) => configEnv.command === "serve",
416
+ resolveId: {
417
+ filter: { id: /^nitro(\/|$)/ },
418
+ handler(id) {
419
+ if (id === "nitro" || id.startsWith("nitro/")) return {
420
+ id: NITRO_PROXY_PREFIX + id,
421
+ moduleSideEffects: false
422
+ };
423
+ }
424
+ },
425
+ load: {
426
+ filter: { id: /^\0nitro-env-proxy:/ },
427
+ handler(id) {
428
+ if (!id.startsWith(NITRO_PROXY_PREFIX)) return;
429
+ const originalId = id.slice(17);
430
+ return {
431
+ code: [
432
+ `const _mod = await globalThis.__VITE_ENVIRONMENT_RUNNER_IMPORT__("nitro", ${JSON.stringify(originalId)});`,
433
+ `__vite_ssr_exportAll__(_mod);`,
434
+ `export default _mod.default;`
435
+ ].join("\n"),
436
+ map: null
437
+ };
438
+ }
439
+ }
440
+ };
441
+ }
442
+ function _isWorkerdRunner(ctx) {
443
+ return (ctx.nitro.options.devServer.runner || process.env.NITRO_DEV_RUNNER || "node-worker") === "miniflare";
444
+ }
359
445
  function tryResolve(id) {
360
446
  if (/^[~#/\0]/.test(id) || isAbsolute$1(id)) return id;
361
447
  return resolveModulePath(id, {
@@ -372,9 +458,6 @@ function tryResolve(id) {
372
458
  try: true
373
459
  }) || id;
374
460
  }
375
-
376
- //#endregion
377
- //#region src/build/vite/preview.ts
378
461
  function nitroPreviewPlugin(ctx) {
379
462
  return {
380
463
  name: "nitro:preview",
@@ -383,89 +466,27 @@ function nitroPreviewPlugin(ctx) {
383
466
  return { preview: { port: config.preview?.port || 3e3 } };
384
467
  },
385
468
  async configurePreviewServer(server) {
386
- const { outputDir, buildInfo } = await getBuildInfo(server.config.root);
387
- if (!buildInfo) throw this.error("Cannot load nitro build info. Make sure to build first.");
388
- const info = [
389
- ["Build Directory:", prettyPath(outputDir)],
390
- ["Date:", buildInfo.date && new Date(buildInfo.date).toLocaleString()],
391
- ["Nitro Version:", buildInfo.versions.nitro],
392
- ["Nitro Preset:", buildInfo.preset],
393
- buildInfo.framework?.name !== "nitro" && ["Framework:", buildInfo.framework?.name + (buildInfo.framework?.version ? ` (v${buildInfo.framework.version})` : "")]
394
- ].filter((i) => i && i[1]);
395
- consola$1.box({
396
- title: " [Build Info] ",
397
- message: info.map((i) => `- ${i[0]} ${i[1]}`).join("\n")
398
- });
399
- if (!buildInfo.commands?.preview) {
400
- consola$1.warn("No nitro build preview command found for this preset.");
401
- return;
402
- }
403
- const dotEnvEntries = await loadPreviewDotEnv(server.config.root);
404
- if (dotEnvEntries.length > 0) consola$1.box({
405
- title: " [Environment Variables] ",
406
- message: [
407
- "Loaded variables from .env files (preview mode only).",
408
- "Set platform environment variables for production:",
409
- ...dotEnvEntries.map(([key, val]) => ` - ${key}`)
410
- ].join("\n")
411
- });
412
- const [command, ...args] = buildInfo.commands.preview.split(" ");
413
- consola$1.info(`Spawning preview server...`);
414
- consola$1.info(buildInfo.commands?.preview);
415
- console.log("");
416
- const { getRandomPort, waitForPort } = await import("get-port-please");
417
- const randomPort = await getRandomPort();
418
- const child = spawn(command, args, {
419
- stdio: "inherit",
420
- cwd: outputDir,
421
- env: {
422
- ...process.env,
423
- ...Object.fromEntries(dotEnvEntries),
424
- PORT: String(randomPort)
425
- }
426
- });
427
- const killChild = (signal) => {
428
- if (child && !child.killed) child.kill(signal);
429
- };
430
- for (const sig of ["SIGINT", "SIGHUP"]) process.once(sig, () => {
431
- consola$1.info(`Stopping preview server...`);
432
- killChild(sig);
433
- process.exit();
469
+ const preview = await startPreview({
470
+ rootDir: server.config.root,
471
+ loader: { nodeServer: server.httpServer }
434
472
  });
435
- server.httpServer.once("close", () => {
436
- killChild("SIGTERM");
473
+ server.httpServer.once("close", async () => {
474
+ await preview.close();
437
475
  });
438
- child.once("exit", (code) => {
439
- if (code && code !== 0) consola$1.error(`[nitro] Preview server exited with code ${code}`);
476
+ const { NodeRequest, sendNodeResponse } = await import("srvx/node");
477
+ server.middlewares.use(async (req, res, next) => {
478
+ const nodeReq = new NodeRequest({
479
+ req,
480
+ res
481
+ });
482
+ await sendNodeResponse(res, await preview.fetch(nodeReq)).catch(next);
440
483
  });
441
- const { createProxyServer } = await import("./_libs/httpxy.mjs").then((n) => n.n);
442
- const proxy = createProxyServer({ target: `http://localhost:${randomPort}` });
443
- server.middlewares.use((req, res, next) => {
444
- if (child && !child.killed) proxy.web(req, res).catch(next);
445
- else res.end(`Nitro preview server is not running.`);
446
- });
447
- await waitForPort(randomPort, {
448
- retries: 20,
449
- delay: 500
484
+ if (preview.upgrade) server.httpServer.on("upgrade", (req, socket, head) => {
485
+ preview.upgrade(req, socket, head);
450
486
  });
451
487
  }
452
488
  };
453
489
  }
454
- async function loadPreviewDotEnv(root) {
455
- const { loadDotenv } = await import("./_libs/rc9+c12+dotenv.mjs").then((n) => n.t);
456
- const env = await loadDotenv({
457
- cwd: root,
458
- fileName: [
459
- ".env.preview",
460
- ".env.production",
461
- ".env"
462
- ]
463
- });
464
- return Object.entries(env).filter(([_key, val]) => val);
465
- }
466
-
467
- //#endregion
468
- //#region src/build/vite/plugin.ts
469
490
  const DEFAULT_EXTENSIONS = [
470
491
  ".ts",
471
492
  ".js",
@@ -476,6 +497,7 @@ const DEFAULT_EXTENSIONS = [
476
497
  ];
477
498
  const debug = process.env.NITRO_DEBUG ? (...args) => console.log("[nitro]", ...args) : () => {};
478
499
  function nitro(pluginConfig = {}) {
500
+ if (globalThis.__nitro_build__) return [];
479
501
  const ctx = createContext(pluginConfig);
480
502
  return [
481
503
  nitroInit(ctx),
@@ -483,6 +505,7 @@ function nitro(pluginConfig = {}) {
483
505
  nitroMain(ctx),
484
506
  nitroPrepare(ctx),
485
507
  nitroService(ctx),
508
+ nitroServiceProxy(),
486
509
  nitroPreviewPlugin(ctx),
487
510
  pluginConfig.experimental?.vite?.assetsImport !== false && assetsPlugin({ experimental: { clientBuildFallback: false } })
488
511
  ].filter(Boolean);
@@ -531,6 +554,7 @@ function nitroEnv(ctx) {
531
554
  debug("[env] Configuring client environment", name === "client" ? "" : ` (${name})`);
532
555
  config.build.emptyOutDir = false;
533
556
  config.build.outDir = useNitro(ctx).options.output.publicDir;
557
+ config.build.copyPublicDir ??= false;
534
558
  return;
535
559
  }
536
560
  if (name === "nitro" || ctx.services[name]) return;
@@ -585,8 +609,14 @@ function nitroMain(ctx) {
585
609
  debug("[main] Generating manifest and entry points for environment:", environment.name);
586
610
  const isRegisteredService = Object.keys(ctx.services).includes(environment.name);
587
611
  let entryFile;
588
- for (const [_name, file] of Object.entries(bundle)) if (file.type === "chunk" && isRegisteredService && file.isEntry) if (entryFile === void 0) entryFile = file.fileName;
589
- else this.warn(`Multiple entry points found for service "${environment.name}"`);
612
+ const serviceEntry = isRegisteredService && ctx.services[environment.name]?.entry ? resolve$1(ctx.services[environment.name].entry) : void 0;
613
+ for (const [_name, file] of Object.entries(bundle)) if (file.type === "chunk" && isRegisteredService && file.isEntry) {
614
+ if (serviceEntry && file.facadeModuleId && resolve$1(file.facadeModuleId) === serviceEntry) {
615
+ entryFile = file.fileName;
616
+ break;
617
+ }
618
+ if (entryFile === void 0) entryFile = file.fileName;
619
+ }
590
620
  if (isRegisteredService) {
591
621
  if (entryFile === void 0) this.error(`No entry point found for service "${this.environment.name}".`);
592
622
  ctx._entryPoints[this.environment.name] = entryFile;
@@ -597,19 +627,21 @@ function nitroMain(ctx) {
597
627
  return configureViteDevServer(ctx, server);
598
628
  },
599
629
  async hotUpdate({ server, modules, timestamp }) {
630
+ if (ctx.pluginConfig.experimental?.vite?.serverReload === false) return;
600
631
  const env = this.environment;
601
- if (ctx.pluginConfig.experimental?.vite.serverReload === false || env.config.consumer === "client") return;
602
- const clientEnvs = Object.values(server.environments).filter((env$1) => env$1.config.consumer === "client");
603
- let hasServerOnlyModule = false;
632
+ if (env.config.consumer === "client") return;
633
+ const clientEnvs = Object.values(server.environments).filter((env) => env.config.consumer === "client");
634
+ const serverOnlyModules = [];
635
+ const sharedModules = [];
604
636
  const invalidated = /* @__PURE__ */ new Set();
605
- for (const mod of modules) if (mod.id && !clientEnvs.some((env$1) => env$1.moduleGraph.getModuleById(mod.id))) {
606
- hasServerOnlyModule = true;
637
+ for (const mod of modules) if (mod.id && !clientEnvs.some((env) => env.moduleGraph.getModuleById(mod.id))) {
638
+ serverOnlyModules.push(mod);
607
639
  env.moduleGraph.invalidateModule(mod, invalidated, timestamp, false);
608
- }
609
- if (hasServerOnlyModule) {
640
+ } else sharedModules.push(mod);
641
+ if (serverOnlyModules.length > 0) {
610
642
  env.hot.send({ type: "full-reload" });
611
- server.ws.send({ type: "full-reload" });
612
- return [];
643
+ if (sharedModules.length === 0 && serverOnlyModules.some((m) => m.environment !== "ssr")) server.ws.send({ type: "full-reload" });
644
+ return sharedModules;
613
645
  }
614
646
  }
615
647
  };
@@ -672,7 +704,9 @@ async function setupNitroContext(ctx, configEnv, userConfig) {
672
704
  };
673
705
  nitroConfig.modules ??= [];
674
706
  for (const plugin of flattenPlugins(userConfig.plugins || [])) if (plugin.nitro) nitroConfig.modules.push(plugin.nitro);
675
- ctx.nitro = ctx.pluginConfig._nitro || await createNitro(nitroConfig);
707
+ const dotenvFileNames = [".env", ".env.local"];
708
+ if (configEnv.mode) dotenvFileNames.push(`.env.${configEnv.mode}`, `.env.${configEnv.mode}.local`);
709
+ ctx.nitro = ctx.pluginConfig._nitro || await createNitro(nitroConfig, { dotenv: { fileName: dotenvFileNames } });
676
710
  if (!ctx.services?.ssr) if (userConfig.environments?.ssr === void 0) {
677
711
  const ssrEntry = resolveModulePath("./entry-server", {
678
712
  from: [
@@ -717,7 +751,7 @@ async function setupNitroContext(ctx, configEnv, userConfig) {
717
751
  await ctx.nitro.hooks.callHook("build:before", ctx.nitro);
718
752
  ctx.bundlerConfig = await getBundlerConfig(ctx);
719
753
  await ctx.nitro.hooks.callHook("rollup:before", ctx.nitro, ctx.bundlerConfig.rollupConfig || ctx.bundlerConfig.rolldownConfig);
720
- if (ctx.nitro.options.dev) getEnvRunner(ctx);
754
+ if (ctx.nitro.options.dev) await initEnvRunner(ctx);
721
755
  ctx.nitro.fetch = (req) => getEnvRunner(ctx).fetch(req);
722
756
  if (ctx.nitro.options.dev && !ctx.devApp) ctx.devApp = new NitroDevApp(ctx.nitro);
723
757
  ctx.nitro.hooks.hook("close", async () => {
@@ -732,6 +766,4 @@ function getEntry(input) {
732
766
  function flattenPlugins(plugins) {
733
767
  return plugins.flatMap((plugin) => Array.isArray(plugin) ? flattenPlugins(plugin) : [plugin]).filter((p) => p && !(p instanceof Promise));
734
768
  }
735
-
736
- //#endregion
737
- export { nitro };
769
+ export { nitro };