nitro 3.0.1-alpha.0 → 3.0.1-alpha.2

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 (316) hide show
  1. package/README.md +2 -0
  2. package/dist/_build/common.mjs +24940 -0
  3. package/dist/_build/rolldown.mjs +172 -0
  4. package/dist/_build/rollup.mjs +201 -0
  5. package/dist/_build/vite.build.mjs +16 -0
  6. package/dist/_chunks/dev.mjs +707 -0
  7. package/dist/_chunks/nitro.mjs +1191 -0
  8. package/dist/_chunks/nitro2.mjs +101 -0
  9. package/dist/_chunks/utils.mjs +254 -0
  10. package/dist/_common.mjs +45 -0
  11. package/dist/_dev.d.mts +12 -0
  12. package/dist/_libs/c12+giget+readdirp+chokidar.d.mts +214 -0
  13. package/dist/_libs/citty.mjs +363 -0
  14. package/dist/_libs/commondir+is-reference.mjs +1300 -0
  15. package/dist/_libs/compatx.d.mts +47 -0
  16. package/dist/_libs/compatx.mjs +46 -0
  17. package/dist/_libs/confbox.mjs +2509 -0
  18. package/dist/_libs/esbuild.d.mts +20 -0
  19. package/dist/_libs/escape-string-regexp.mjs +8 -0
  20. package/dist/_libs/estree-walker.mjs +187 -0
  21. package/dist/_libs/hasown+resolve+deepmerge.mjs +1972 -0
  22. package/dist/_libs/httpxy.d.mts +79 -0
  23. package/dist/_libs/httpxy.mjs +415 -0
  24. package/dist/_libs/klona.mjs +38 -0
  25. package/dist/_libs/magic-string.d.mts +220 -0
  26. package/dist/_libs/mlly.d.mts +57 -0
  27. package/dist/_libs/nypm+giget+tinyexec.mjs +3603 -0
  28. package/dist/_libs/pkg-types.d.mts +23 -0
  29. package/dist/_libs/plugin-alias.mjs +66 -0
  30. package/dist/_libs/plugin-inject.mjs +135 -0
  31. package/dist/_libs/plugin-json.mjs +36 -0
  32. package/dist/_libs/pluginutils+plugin-commonjs.d.mts +241 -0
  33. package/dist/_libs/pluginutils.mjs +652 -0
  34. package/dist/_libs/rc9+c12+dotenv.mjs +972 -0
  35. package/dist/_libs/readdirp+chokidar.mjs +1611 -0
  36. package/dist/_libs/remapping.mjs +117 -0
  37. package/dist/_libs/resolve-uri+gen-mapping.mjs +448 -0
  38. package/dist/_libs/rou3.d.mts +43 -0
  39. package/dist/_libs/rou3.mjs +322 -0
  40. package/dist/_libs/std-env.d.mts +4 -0
  41. package/dist/_libs/tsconfck.mjs +832 -0
  42. package/dist/_libs/ultrahtml.mjs +138 -0
  43. package/dist/_libs/unimport+unplugin.mjs +1785 -0
  44. package/dist/_libs/unplugin+unimport.d.mts +426 -0
  45. package/dist/_libs/unwasm.d.mts +29 -0
  46. package/dist/_presets.mjs +1802 -0
  47. package/dist/builder.d.mts +63 -0
  48. package/dist/builder.mjs +9 -0
  49. package/dist/cli/_chunks/build.mjs +48 -0
  50. package/dist/cli/_chunks/common.mjs +15 -0
  51. package/dist/cli/_chunks/dev.mjs +62 -0
  52. package/dist/cli/_chunks/list.mjs +27 -0
  53. package/dist/cli/_chunks/prepare.mjs +19 -0
  54. package/dist/cli/_chunks/run.mjs +55 -0
  55. package/dist/cli/_chunks/task.mjs +16 -0
  56. package/dist/cli/index.d.mts +1 -1
  57. package/dist/cli/index.mjs +20 -476
  58. package/dist/node_modules/@poppinss/colors/build/index.js +130 -160
  59. package/dist/node_modules/@poppinss/colors/package.json +20 -18
  60. package/dist/node_modules/@poppinss/dumper/build/formatters/html/main.js +1 -1
  61. package/dist/node_modules/@poppinss/dumper/package.json +1 -1
  62. package/dist/node_modules/@poppinss/exception/build/index.js +36 -55
  63. package/dist/node_modules/@poppinss/exception/package.json +19 -16
  64. package/dist/node_modules/@sindresorhus/is/distribution/index.js +47 -6
  65. package/dist/node_modules/@sindresorhus/is/package.json +1 -1
  66. package/dist/node_modules/@speed-highlight/core/dist/index.js +2 -2
  67. package/dist/node_modules/@speed-highlight/core/dist/terminal.js +2 -2
  68. package/dist/node_modules/@speed-highlight/core/package.json +8 -4
  69. package/dist/node_modules/cookie-es/dist/index.mjs +262 -0
  70. package/dist/node_modules/cookie-es/package.json +37 -0
  71. package/dist/node_modules/hookable/dist/index.mjs +244 -268
  72. package/dist/node_modules/hookable/package.json +29 -26
  73. package/dist/node_modules/rendu/dist/index.mjs +380 -0
  74. package/dist/node_modules/rendu/package.json +47 -0
  75. package/dist/node_modules/ufo/dist/index.mjs +16 -9
  76. package/dist/node_modules/ufo/package.json +15 -14
  77. package/dist/node_modules/unctx/package.json +16 -16
  78. package/dist/node_modules/youch/build/{chunk-4XB2BYKC.js → chunk-7QV3D5YX.js} +2 -4
  79. package/dist/node_modules/youch/build/{chunk-PUHGL6HA.js → chunk-AUGPHE32.js} +2 -4
  80. package/dist/node_modules/youch/build/{chunk-VE4LENUR.js → chunk-CM7DWJNZ.js} +4 -5
  81. package/dist/node_modules/youch/build/{chunk-JAN2TFI2.js → chunk-EJH674NB.js} +6 -5
  82. package/dist/node_modules/youch/build/{chunk-EUJBVOYB.js → chunk-OIJ3WD7L.js} +2 -4
  83. package/dist/node_modules/youch/build/{chunk-HFSXRSKS.js → chunk-P36L72PL.js} +5 -3
  84. package/dist/node_modules/youch/build/{chunk-4YEN7HVQ.js → chunk-PE3GG3TN.js} +5 -1
  85. package/dist/node_modules/youch/build/{chunk-PINJDICN.js → chunk-X53OIOJH.js} +2 -4
  86. package/dist/node_modules/youch/build/index.js +22 -15
  87. package/dist/node_modules/youch/build/public/error_info/style.css +1 -0
  88. package/dist/node_modules/youch/build/public/error_metadata/style.css +3 -0
  89. package/dist/node_modules/youch/build/public/error_stack/script.js +20 -22
  90. package/dist/node_modules/youch/build/public/error_stack/style.css +2 -3
  91. package/dist/node_modules/youch/build/public/header/script.js +0 -2
  92. package/dist/node_modules/youch/build/public/layout/script.js +0 -8
  93. package/dist/node_modules/youch/build/public/layout/style.css +4 -0
  94. package/dist/node_modules/youch/package.json +16 -17
  95. package/dist/presets/_nitro/runtime/nitro-dev.d.mts +2 -1
  96. package/dist/presets/_nitro/runtime/nitro-dev.mjs +47 -42
  97. package/dist/presets/_nitro/runtime/nitro-prerenderer.d.mts +3 -3
  98. package/dist/presets/_nitro/runtime/nitro-prerenderer.mjs +11 -15
  99. package/dist/presets/_nitro/runtime/service-worker.d.mts +2 -1
  100. package/dist/presets/_nitro/runtime/service-worker.mjs +17 -14
  101. package/dist/presets/aws-amplify/runtime/aws-amplify.d.mts +2 -1
  102. package/dist/presets/aws-amplify/runtime/aws-amplify.mjs +8 -7
  103. package/dist/presets/aws-lambda/runtime/_utils.d.mts +3 -13
  104. package/dist/presets/aws-lambda/runtime/_utils.mjs +95 -81
  105. package/dist/presets/aws-lambda/runtime/aws-lambda-streaming.d.mts +2 -3
  106. package/dist/presets/aws-lambda/runtime/aws-lambda-streaming.mjs +25 -29
  107. package/dist/presets/aws-lambda/runtime/aws-lambda.d.mts +1 -1
  108. package/dist/presets/aws-lambda/runtime/aws-lambda.mjs +9 -9
  109. package/dist/presets/azure/runtime/_utils.mjs +43 -43
  110. package/dist/presets/azure/runtime/azure-swa.d.mts +3 -3
  111. package/dist/presets/azure/runtime/azure-swa.mjs +25 -23
  112. package/dist/presets/bun/runtime/bun.d.mts +3 -1
  113. package/dist/presets/bun/runtime/bun.mjs +34 -22
  114. package/dist/presets/cloudflare/runtime/_module-handler.d.mts +12 -9
  115. package/dist/presets/cloudflare/runtime/_module-handler.mjs +84 -90
  116. package/dist/presets/cloudflare/runtime/cloudflare-durable.d.mts +7 -15
  117. package/dist/presets/cloudflare/runtime/cloudflare-durable.mjs +62 -64
  118. package/dist/presets/cloudflare/runtime/cloudflare-module.d.mts +2 -8
  119. package/dist/presets/cloudflare/runtime/cloudflare-module.mjs +15 -18
  120. package/dist/presets/cloudflare/runtime/cloudflare-pages.d.mts +13 -13
  121. package/dist/presets/cloudflare/runtime/cloudflare-pages.mjs +35 -43
  122. package/dist/presets/cloudflare/runtime/plugin.dev.d.mts +2 -2
  123. package/dist/presets/cloudflare/runtime/plugin.dev.mjs +89 -82
  124. package/dist/presets/cloudflare/runtime/shims/workers.dev.mjs +27 -0
  125. package/dist/presets/deno/runtime/deno-deploy.d.mts +5 -1
  126. package/dist/presets/deno/runtime/deno-deploy.mjs +15 -13
  127. package/dist/presets/deno/runtime/deno-server.d.mts +1 -4
  128. package/dist/presets/deno/runtime/deno-server.mjs +32 -53
  129. package/dist/presets/netlify/runtime/netlify-edge.d.mts +2 -2
  130. package/dist/presets/netlify/runtime/netlify-edge.mjs +18 -14
  131. package/dist/presets/netlify/runtime/netlify.d.mts +3 -2
  132. package/dist/presets/netlify/runtime/netlify.mjs +15 -19
  133. package/dist/presets/node/runtime/node-cluster.d.mts +3 -1
  134. package/dist/presets/node/runtime/node-cluster.mjs +49 -54
  135. package/dist/presets/node/runtime/node-middleware.d.mts +3 -4
  136. package/dist/presets/node/runtime/node-middleware.mjs +9 -9
  137. package/dist/presets/node/runtime/node-server.d.mts +1 -1
  138. package/dist/presets/node/runtime/node-server.mjs +36 -34
  139. package/dist/presets/standard/runtime/server.d.mts +2 -4
  140. package/dist/presets/standard/runtime/server.mjs +3 -5
  141. package/dist/presets/stormkit/runtime/stormkit.d.mts +14 -14
  142. package/dist/presets/stormkit/runtime/stormkit.mjs +22 -22
  143. package/dist/presets/vercel/runtime/isr.d.mts +2 -0
  144. package/dist/presets/vercel/runtime/isr.mjs +19 -0
  145. package/dist/presets/vercel/runtime/vercel.node.d.mts +3 -0
  146. package/dist/presets/vercel/runtime/vercel.node.mjs +24 -0
  147. package/dist/presets/vercel/runtime/vercel.web.d.mts +8 -0
  148. package/dist/presets/vercel/runtime/vercel.web.mjs +25 -0
  149. package/dist/presets/winterjs/runtime/winterjs.d.mts +2 -1
  150. package/dist/presets/winterjs/runtime/winterjs.mjs +74 -70
  151. package/dist/presets/zeabur/runtime/zeabur.d.mts +2 -2
  152. package/dist/presets/zeabur/runtime/zeabur.mjs +2 -2
  153. package/dist/runtime/app.d.mts +1 -0
  154. package/dist/runtime/app.mjs +1 -0
  155. package/dist/runtime/cache.d.mts +1 -0
  156. package/dist/runtime/cache.mjs +1 -0
  157. package/dist/runtime/config.d.mts +3 -0
  158. package/dist/runtime/config.mjs +4 -0
  159. package/dist/runtime/context.d.mts +1 -0
  160. package/dist/runtime/context.mjs +1 -0
  161. package/dist/runtime/database.d.mts +1 -0
  162. package/dist/runtime/database.mjs +1 -0
  163. package/dist/runtime/internal/app.d.mts +15 -1
  164. package/dist/runtime/internal/app.mjs +199 -144
  165. package/dist/runtime/internal/cache.d.mts +9 -5
  166. package/dist/runtime/internal/cache.mjs +248 -219
  167. package/dist/runtime/internal/context.d.mts +9 -9
  168. package/dist/runtime/internal/context.mjs +17 -10
  169. package/dist/runtime/internal/database.mjs +9 -11
  170. package/dist/runtime/internal/error/dev.d.mts +4 -4
  171. package/dist/runtime/internal/error/dev.mjs +106 -105
  172. package/dist/runtime/internal/error/hooks.d.mts +1 -0
  173. package/dist/runtime/internal/error/hooks.mjs +9 -0
  174. package/dist/runtime/internal/error/prod.d.mts +5 -4
  175. package/dist/runtime/internal/error/prod.mjs +51 -59
  176. package/dist/runtime/internal/error/utils.d.mts +4 -4
  177. package/dist/runtime/internal/error/utils.mjs +1 -1
  178. package/dist/runtime/internal/meta.d.mts +1 -1
  179. package/dist/runtime/internal/meta.mjs +1 -1
  180. package/dist/runtime/internal/plugin.d.mts +2 -2
  181. package/dist/runtime/internal/plugin.mjs +1 -1
  182. package/dist/runtime/internal/route-rules.d.mts +4 -8
  183. package/dist/runtime/internal/route-rules.mjs +54 -52
  184. package/dist/runtime/internal/routes/dev-tasks.d.mts +1 -2
  185. package/dist/runtime/internal/routes/dev-tasks.mjs +17 -19
  186. package/dist/runtime/internal/routes/openapi.mjs +82 -88
  187. package/dist/runtime/internal/routes/renderer-template.d.mts +1 -1
  188. package/dist/runtime/internal/routes/renderer-template.dev.d.mts +1 -2
  189. package/dist/runtime/internal/routes/renderer-template.dev.mjs +15 -17
  190. package/dist/runtime/internal/routes/renderer-template.mjs +2 -2
  191. package/dist/runtime/internal/routes/scalar.mjs +22 -23
  192. package/dist/runtime/internal/routes/swagger.mjs +9 -11
  193. package/dist/runtime/internal/runtime-config.d.mts +4 -4
  194. package/dist/runtime/internal/runtime-config.mjs +44 -39
  195. package/dist/runtime/internal/static.mjs +63 -74
  196. package/dist/runtime/internal/storage.mjs +3 -3
  197. package/dist/runtime/internal/task.d.mts +6 -6
  198. package/dist/runtime/internal/task.mjs +57 -61
  199. package/dist/runtime/internal/vite/dev-entry.mjs +11 -2
  200. package/dist/runtime/internal/vite/{dev-worker.mjs → node-runner.mjs} +54 -57
  201. package/dist/runtime/internal/vite/ssr-renderer.mjs +3 -1
  202. package/{lib/runtime-meta.d.mts → dist/runtime/meta.d.mts} +2 -2
  203. package/dist/runtime/meta.mjs +26 -0
  204. package/dist/runtime/nitro.d.mts +9 -0
  205. package/dist/runtime/nitro.mjs +32 -0
  206. package/dist/runtime/runtime-config.d.mts +1 -0
  207. package/dist/runtime/runtime-config.mjs +1 -0
  208. package/dist/runtime/storage.d.mts +1 -0
  209. package/dist/runtime/storage.mjs +1 -0
  210. package/dist/runtime/task.d.mts +1 -0
  211. package/dist/runtime/task.mjs +1 -0
  212. package/dist/runtime/virtual/_runtime_warn.mjs +5 -0
  213. package/dist/runtime/virtual/database.d.mts +8 -0
  214. package/dist/runtime/virtual/database.mjs +2 -0
  215. package/dist/runtime/virtual/error-handler.d.mts +6 -0
  216. package/dist/runtime/virtual/error-handler.mjs +9 -0
  217. package/dist/runtime/virtual/feature-flags.d.mts +7 -0
  218. package/dist/runtime/virtual/feature-flags.mjs +7 -0
  219. package/dist/runtime/virtual/plugins.d.mts +3 -0
  220. package/dist/runtime/virtual/plugins.mjs +2 -0
  221. package/dist/runtime/virtual/polyfills.d.mts +3 -0
  222. package/dist/runtime/virtual/polyfills.mjs +2 -0
  223. package/dist/runtime/virtual/public-assets.d.mts +9 -0
  224. package/dist/runtime/virtual/public-assets.mjs +8 -0
  225. package/dist/runtime/virtual/renderer-template.d.mts +4 -0
  226. package/dist/runtime/virtual/renderer-template.mjs +7 -0
  227. package/dist/runtime/virtual/routing-meta.d.mts +7 -0
  228. package/dist/runtime/virtual/routing-meta.mjs +2 -0
  229. package/dist/runtime/virtual/routing.d.mts +8 -0
  230. package/dist/runtime/virtual/routing.mjs +11 -0
  231. package/dist/runtime/virtual/runtime-config.d.mts +3 -0
  232. package/dist/runtime/virtual/runtime-config.mjs +5 -0
  233. package/dist/runtime/virtual/server-assets.d.mts +6 -0
  234. package/dist/runtime/virtual/server-assets.mjs +12 -0
  235. package/dist/runtime/virtual/storage.d.mts +3 -0
  236. package/dist/runtime/virtual/storage.mjs +5 -0
  237. package/dist/runtime/virtual/tasks.d.mts +10 -0
  238. package/dist/runtime/virtual/tasks.mjs +3 -0
  239. package/dist/runtime/vite.d.mts +8 -0
  240. package/dist/runtime/vite.mjs +9 -0
  241. package/dist/types/index.d.mts +2561 -2312
  242. package/dist/types/index.mjs +10 -0
  243. package/dist/vite.d.mts +44 -51
  244. package/dist/vite.mjs +737 -68
  245. package/lib/tsconfig.json +27 -0
  246. package/lib/vite.types.d.mts +26 -0
  247. package/lib/vite.types.mjs +2 -0
  248. package/package.json +118 -101
  249. package/dist/_chunks/app.mjs +0 -19797
  250. package/dist/_chunks/build.mjs +0 -84
  251. package/dist/_chunks/build2.mjs +0 -318
  252. package/dist/_chunks/build3.mjs +0 -6452
  253. package/dist/_chunks/detect-acorn.mjs +0 -503
  254. package/dist/_chunks/index.mjs +0 -22242
  255. package/dist/_chunks/index2.mjs +0 -297
  256. package/dist/_chunks/index3.mjs +0 -1058
  257. package/dist/_chunks/index4.mjs +0 -1206
  258. package/dist/_chunks/info.mjs +0 -11157
  259. package/dist/_chunks/json5.mjs +0 -68
  260. package/dist/_chunks/jsonc.mjs +0 -51
  261. package/dist/_chunks/pathe.M-eThtNZ.mjs +0 -204
  262. package/dist/_chunks/plugin.mjs +0 -960
  263. package/dist/_chunks/server.mjs +0 -254
  264. package/dist/_chunks/snapshot.mjs +0 -284
  265. package/dist/_chunks/toml.mjs +0 -259
  266. package/dist/_chunks/yaml.mjs +0 -86
  267. package/dist/cli/build.mjs +0 -54
  268. package/dist/cli/common.mjs +0 -13
  269. package/dist/cli/dev.mjs +0 -95
  270. package/dist/cli/index2.mjs +0 -17
  271. package/dist/cli/list.mjs +0 -34
  272. package/dist/cli/prepare.mjs +0 -24
  273. package/dist/cli/run.mjs +0 -60
  274. package/dist/index.d.mts +0 -52
  275. package/dist/index.mjs +0 -55
  276. package/dist/node_modules/cookie/dist/index.js +0 -239
  277. package/dist/node_modules/cookie/package.json +0 -42
  278. package/dist/node_modules/kleur/index.js +0 -110
  279. package/dist/node_modules/klona/dist/index.mjs +0 -81
  280. package/dist/node_modules/klona/full/index.mjs +0 -53
  281. package/dist/node_modules/klona/package.json +0 -74
  282. package/dist/node_modules/std-env/dist/index.mjs +0 -1
  283. package/dist/node_modules/std-env/package.json +0 -46
  284. package/dist/node_modules/youch/build/chunk-OSUFJZHZ.js +0 -6
  285. package/dist/presets/vercel/runtime/vercel.d.mts +0 -8
  286. package/dist/presets/vercel/runtime/vercel.mjs +0 -17
  287. package/dist/presets.mjs +0 -2460
  288. package/dist/runtime/index.d.mts +0 -11
  289. package/dist/runtime/index.mjs +0 -17
  290. package/dist/runtime/internal/debug.d.mts +0 -2
  291. package/dist/runtime/internal/debug.mjs +0 -5
  292. package/dist/runtime/internal/empty.d.mts +0 -0
  293. package/dist/runtime/internal/index.d.mts +0 -3
  294. package/dist/runtime/internal/index.mjs +0 -3
  295. package/dist/runtime/internal/lib/http-graceful-shutdown.d.mts +0 -16
  296. package/dist/runtime/internal/lib/http-graceful-shutdown.mjs +0 -213
  297. package/dist/runtime/internal/renderer.d.mts +0 -3
  298. package/dist/runtime/internal/renderer.mjs +0 -36
  299. package/dist/runtime/internal/shutdown.d.mts +0 -9
  300. package/dist/runtime/internal/shutdown.mjs +0 -34
  301. package/dist/runtime/internal/utils.d.mts +0 -1
  302. package/dist/runtime/internal/utils.mjs +0 -15
  303. package/dist/runtime/internal/vite/dev-entry.d.mts +0 -1
  304. package/dist/runtime/internal/vite/prod-setup.d.mts +0 -4
  305. package/dist/runtime/internal/vite/prod-setup.mjs +0 -55
  306. package/dist/runtime/internal/vite/ssr-renderer.d.mts +0 -4
  307. package/lib/config.d.mts +0 -9
  308. package/lib/config.mjs +0 -5
  309. package/lib/deps/ofetch.mjs +0 -1
  310. package/lib/deps/ofetch.mts +0 -1
  311. package/lib/meta.d.mts +0 -5
  312. package/lib/meta.mjs +0 -21
  313. package/lib/runtime-meta.mjs +0 -38
  314. /package/dist/runtime/{internal/vite/dev-worker.d.mts → virtual/_runtime_warn.d.mts} +0 -0
  315. /package/lib/{deps/h3.d.mts → h3.d.mts} +0 -0
  316. /package/lib/{deps/h3.mjs → h3.mjs} +0 -0
@@ -0,0 +1,380 @@
1
+ import { FastResponse } from "srvx";
2
+
3
+ //#region src/parser.ts
4
+ function parseTemplate(template) {
5
+ if (!template) return [];
6
+ template = template.replace(/<script\s+server\s*>([\s\S]*?)<\/script>/gi, (_m, code) => `<?js${code}?>`);
7
+ template = template.replace(/{{\s*(.+)\s*}}|{{{\s*(.+)\s*}}}/g, (_m, code) => {
8
+ if (code[0] === "{") return `<?=${code.slice(1, -1).trim()}?>`;
9
+ return `<?=htmlspecialchars(${code.trim()})?>`;
10
+ });
11
+ const tokens = [];
12
+ const re = /<\?(?:js)?(?<equals>=)?(?<value>[\s\S]*?)\?>/g;
13
+ let cursor = 0;
14
+ let match;
15
+ while (match = re.exec(template)) {
16
+ const { equals, value } = match.groups || {};
17
+ const matchStart = match.index;
18
+ const matchEnd = matchStart + match[0].length;
19
+ if (matchStart > cursor) {
20
+ const textContent = template.slice(cursor, matchStart);
21
+ if (textContent) tokens.push({
22
+ type: "text",
23
+ contents: textContent
24
+ });
25
+ }
26
+ if (equals) tokens.push({
27
+ type: "expr",
28
+ contents: value || ""
29
+ });
30
+ else tokens.push({
31
+ type: "code",
32
+ contents: value || ""
33
+ });
34
+ cursor = matchEnd;
35
+ }
36
+ if (cursor < template.length) {
37
+ const remainingText = template.slice(cursor);
38
+ if (remainingText) tokens.push({
39
+ type: "text",
40
+ contents: remainingText
41
+ });
42
+ }
43
+ return tokens;
44
+ }
45
+ /**
46
+ * Check if a template string contains template syntax.
47
+ */
48
+ function hasTemplateSyntax(template) {
49
+ return /(?:<script\s+server\s*>[\s\S]*?<\/script>)|(?:<\?(?:js)?=?[\s\S]*?\?>)|(?:\{\{[\s\S]*?\}\})/i.test(template);
50
+ }
51
+
52
+ //#endregion
53
+ //#region src/_runtime.ts
54
+ function runtimeStream(body) {
55
+ return `const __chunks__ = [];const echo = (chunk) => { __chunks__.push(chunk); };${body};
56
+ function concatStreams(chunks) {
57
+ const encoder = new TextEncoder();
58
+ return new ReadableStream({
59
+ async pull(controller) {
60
+ for (let chunk of chunks) {
61
+ if (typeof chunk === 'function'){
62
+ chunk = chunk();
63
+ }
64
+ if (chunk instanceof Promise) {
65
+ chunk = await chunk;
66
+ if (!chunk) continue;
67
+ if (chunk instanceof Response){
68
+ chunk = chunk.body;
69
+ }
70
+ if (!(chunk instanceof ReadableStream)) {
71
+ controller.enqueue(chunk instanceof Uint8Array ? chunk : encoder.encode(chunk));
72
+ continue;
73
+ }
74
+ }
75
+ if (chunk instanceof ReadableStream) {
76
+ const reader = chunk.getReader();
77
+ while (true) {
78
+ const { value, done } = await reader.read();
79
+ if (done) break;
80
+ controller.enqueue(value);
81
+ }
82
+ reader.releaseLock();
83
+ } else {
84
+ controller.enqueue(chunk instanceof Uint8Array ? chunk : encoder.encode(chunk));
85
+ }
86
+ }
87
+ controller.close();
88
+ },
89
+ });
90
+ }
91
+ return concatStreams(__chunks__);
92
+ `;
93
+ }
94
+ function runtimeText(body) {
95
+ return `const __chunks__ = [];const echo = (chunk) => { __chunks__.push(chunk); };${body};
96
+ let __out__ = "";
97
+ for(let chunk of __chunks__){
98
+ if (typeof chunk === 'function'){
99
+ chunk = chunk();
100
+ }
101
+ if (chunk instanceof Promise){
102
+ chunk = await chunk;
103
+ }
104
+ if (chunk instanceof Response){
105
+ chunk = chunk.body;
106
+ }
107
+ if (chunk instanceof ReadableStream){
108
+ const reader = chunk.getReader();
109
+ while(true){
110
+ const {value, done} = await reader.read();
111
+ if(done) break;
112
+ __out__ += typeof value === "string" ? value : new TextDecoder().decode(value);
113
+ }
114
+ reader.releaseLock();
115
+ } else {
116
+ __out__ += typeof chunk === "string" ? chunk : new TextDecoder().decode(chunk);
117
+ }
118
+ }
119
+ return __out__;
120
+ `;
121
+ }
122
+
123
+ //#endregion
124
+ //#region src/compiler.ts
125
+ /**
126
+ * Compile a template string into a render function.
127
+ *
128
+ * @example
129
+ * ```ts
130
+ * import { compileTemplate } from "rendu";
131
+ *
132
+ * const template = `
133
+ * <h1>{{ title }}</h1>
134
+ * <ul>
135
+ * <? for (const item of items) { ?>
136
+ * <li>{{ item }}</li>
137
+ * <? } ?>
138
+ * </ul>
139
+ * `;
140
+ *
141
+ * const render = compileTemplate(template, { stream: false });
142
+ *
143
+ * const html = await render({ title: "My List", items: ["Item 1", "Item 2", "Item 3"] });
144
+ * console.log(html);
145
+ * // Output:
146
+ * // <h1>My List</h1>
147
+ * // <ul>
148
+ * // <li>Item 1</li>
149
+ * // <li>Item 2</li>
150
+ * // <li>Item 3</li>
151
+ * // </ul>
152
+ * ```
153
+ */
154
+ function compileTemplate(template, opts = {}) {
155
+ const body = compileTemplateToString(template, opts, false);
156
+ const sourcemaps = opts.filename ? `\n//# sourceURL=${opts.filename}` : "";
157
+ try {
158
+ const AsyncFunction = Object.getPrototypeOf(async () => {}).constructor;
159
+ return new AsyncFunction("__context__", body + sourcemaps);
160
+ } catch (error) {
161
+ throw new SyntaxError(`Template syntax error: ${error.message}`, {});
162
+ }
163
+ }
164
+ /**
165
+ * Compile a template string into a render function code string.
166
+ *
167
+ * **Note:** This function is for advanced use cases where you need the generated code as a string.
168
+ */
169
+ function compileTemplateToString(template, opts, asyncWrapper) {
170
+ const parts = [];
171
+ const tokens = parseTemplate(template);
172
+ for (const token of tokens) switch (token.type) {
173
+ case "text":
174
+ if (opts.preserveLines) for (const line of token.contents.split("\n")) parts.push(`echo(${JSON.stringify(line + "\n")})\n`);
175
+ else parts.push(`echo(${JSON.stringify(token.contents)})`);
176
+ break;
177
+ case "expr":
178
+ parts.push(`echo(${token.contents})`);
179
+ break;
180
+ case "code":
181
+ parts.push(token.contents);
182
+ break;
183
+ }
184
+ let body = parts.join(opts.preserveLines ? ";" : "\n");
185
+ body = opts.contextKeys ? `const {${opts.contextKeys.join(",")}}=__context__;${body}` : `with(__context__){${body}}`;
186
+ body = opts.stream === false ? runtimeText(body) : runtimeStream(body);
187
+ return asyncWrapper === false ? body : `(async (__context__) => {${body}})`;
188
+ }
189
+
190
+ //#endregion
191
+ //#region node_modules/.pnpm/cookie-es@2.0.0/node_modules/cookie-es/dist/index.mjs
192
+ function parse(str, options) {
193
+ if (typeof str !== "string") throw new TypeError("argument str must be a string");
194
+ const obj = {};
195
+ const opt = options || {};
196
+ const dec = opt.decode || decode;
197
+ let index = 0;
198
+ while (index < str.length) {
199
+ const eqIdx = str.indexOf("=", index);
200
+ if (eqIdx === -1) break;
201
+ let endIdx = str.indexOf(";", index);
202
+ if (endIdx === -1) endIdx = str.length;
203
+ else if (endIdx < eqIdx) {
204
+ index = str.lastIndexOf(";", eqIdx - 1) + 1;
205
+ continue;
206
+ }
207
+ const key = str.slice(index, eqIdx).trim();
208
+ if (opt?.filter && !opt?.filter(key)) {
209
+ index = endIdx + 1;
210
+ continue;
211
+ }
212
+ if (void 0 === obj[key]) {
213
+ let val = str.slice(eqIdx + 1, endIdx).trim();
214
+ if (val.codePointAt(0) === 34) val = val.slice(1, -1);
215
+ obj[key] = tryDecode(val, dec);
216
+ }
217
+ index = endIdx + 1;
218
+ }
219
+ return obj;
220
+ }
221
+ function decode(str) {
222
+ return str.includes("%") ? decodeURIComponent(str) : str;
223
+ }
224
+ function tryDecode(str, decode2) {
225
+ try {
226
+ return decode2(str);
227
+ } catch {
228
+ return str;
229
+ }
230
+ }
231
+ const fieldContentRegExp = /^[\u0009\u0020-\u007E\u0080-\u00FF]+$/;
232
+ function serialize(name, value, options) {
233
+ const opt = options || {};
234
+ const enc = opt.encode || encodeURIComponent;
235
+ if (typeof enc !== "function") throw new TypeError("option encode is invalid");
236
+ if (!fieldContentRegExp.test(name)) throw new TypeError("argument name is invalid");
237
+ const encodedValue = enc(value);
238
+ if (encodedValue && !fieldContentRegExp.test(encodedValue)) throw new TypeError("argument val is invalid");
239
+ let str = name + "=" + encodedValue;
240
+ if (void 0 !== opt.maxAge && opt.maxAge !== null) {
241
+ const maxAge = opt.maxAge - 0;
242
+ if (Number.isNaN(maxAge) || !Number.isFinite(maxAge)) throw new TypeError("option maxAge is invalid");
243
+ str += "; Max-Age=" + Math.floor(maxAge);
244
+ }
245
+ if (opt.domain) {
246
+ if (!fieldContentRegExp.test(opt.domain)) throw new TypeError("option domain is invalid");
247
+ str += "; Domain=" + opt.domain;
248
+ }
249
+ if (opt.path) {
250
+ if (!fieldContentRegExp.test(opt.path)) throw new TypeError("option path is invalid");
251
+ str += "; Path=" + opt.path;
252
+ }
253
+ if (opt.expires) {
254
+ if (!isDate(opt.expires) || Number.isNaN(opt.expires.valueOf())) throw new TypeError("option expires is invalid");
255
+ str += "; Expires=" + opt.expires.toUTCString();
256
+ }
257
+ if (opt.httpOnly) str += "; HttpOnly";
258
+ if (opt.secure) str += "; Secure";
259
+ if (opt.priority) switch (typeof opt.priority === "string" ? opt.priority.toLowerCase() : opt.priority) {
260
+ case "low":
261
+ str += "; Priority=Low";
262
+ break;
263
+ case "medium":
264
+ str += "; Priority=Medium";
265
+ break;
266
+ case "high":
267
+ str += "; Priority=High";
268
+ break;
269
+ default: throw new TypeError("option priority is invalid");
270
+ }
271
+ if (opt.sameSite) switch (typeof opt.sameSite === "string" ? opt.sameSite.toLowerCase() : opt.sameSite) {
272
+ case true:
273
+ str += "; SameSite=Strict";
274
+ break;
275
+ case "lax":
276
+ str += "; SameSite=Lax";
277
+ break;
278
+ case "strict":
279
+ str += "; SameSite=Strict";
280
+ break;
281
+ case "none":
282
+ str += "; SameSite=None";
283
+ break;
284
+ default: throw new TypeError("option sameSite is invalid");
285
+ }
286
+ if (opt.partitioned) str += "; Partitioned";
287
+ return str;
288
+ }
289
+ function isDate(val) {
290
+ return Object.prototype.toString.call(val) === "[object Date]" || val instanceof Date;
291
+ }
292
+
293
+ //#endregion
294
+ //#region src/render.ts
295
+ /**
296
+ * Renders an HTML template to a Response object.
297
+ *
298
+ * @example
299
+ * ```ts
300
+ * import { compileTemplate, renderToResponse } from "rendu";
301
+ *
302
+ * const render = compileTemplate(template, { stream: true });
303
+ *
304
+ * const response = await renderToResponse(render, { request });
305
+ * ```
306
+ * @param htmlTemplate The compiled HTML template.
307
+ * @param opts Options for rendering.
308
+ * @returns A Response object.
309
+ */
310
+ async function renderToResponse(htmlTemplate, opts) {
311
+ const ctx = createRenderContext(opts);
312
+ const body = await htmlTemplate(ctx);
313
+ if (body instanceof Response) return body;
314
+ return new FastResponse(body, {
315
+ status: ctx.$RESPONSE.status,
316
+ statusText: ctx.$RESPONSE.statusText,
317
+ headers: ctx.$RESPONSE.headers
318
+ });
319
+ }
320
+ const RENDER_CONTEXT_KEYS = [
321
+ "htmlspecialchars",
322
+ "setCookie",
323
+ "redirect",
324
+ "$REQUEST",
325
+ "$METHOD",
326
+ "$URL",
327
+ "$HEADERS",
328
+ "$COOKIES",
329
+ "$RESPONSE"
330
+ ];
331
+ function createRenderContext(options) {
332
+ const url = new URL(options.request?.url || "http://_");
333
+ const response = {
334
+ status: 200,
335
+ statusText: "OK",
336
+ headers: new Headers({ "Content-Type": "text/html ; charset=utf-8" })
337
+ };
338
+ const $COOKIES = lazyCookies(options.request);
339
+ const setCookie = (name, value, sOpts = {}) => {
340
+ response.headers.append("Set-Cookie", serialize(name, value, sOpts));
341
+ };
342
+ const redirect = (to, status = 302) => {
343
+ response.status = status;
344
+ response.headers.set("Location", to);
345
+ };
346
+ return {
347
+ ...options.context,
348
+ htmlspecialchars,
349
+ setCookie,
350
+ redirect,
351
+ $REQUEST: options.request,
352
+ $METHOD: options.request?.method,
353
+ $URL: url,
354
+ $HEADERS: options.request?.headers,
355
+ $COOKIES,
356
+ $RESPONSE: response
357
+ };
358
+ }
359
+ function lazyCookies(req) {
360
+ if (!req) return {};
361
+ let parsed;
362
+ return new Proxy(Object.freeze(Object.create(null)), { get(_, prop) {
363
+ if (typeof prop !== "string") return void 0;
364
+ parsed ??= parse(req.headers.get("cookie") || "");
365
+ return parsed[prop];
366
+ } });
367
+ }
368
+ function htmlspecialchars(s) {
369
+ const htmlSpecialCharsMap = {
370
+ "&": "&amp;",
371
+ "<": "&lt;",
372
+ ">": "&gt;",
373
+ "\"": "&quot;",
374
+ "'": "&#39;"
375
+ };
376
+ return String(s).replace(/[&<>"']/g, (c) => htmlSpecialCharsMap[c] || c);
377
+ }
378
+
379
+ //#endregion
380
+ export { RENDER_CONTEXT_KEYS, compileTemplate, compileTemplateToString, createRenderContext, hasTemplateSyntax, renderToResponse };
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "rendu",
3
+ "version": "0.0.7",
4
+ "description": "",
5
+ "repository": "h3js/rendu",
6
+ "license": "MIT",
7
+ "sideEffects": false,
8
+ "type": "module",
9
+ "exports": {
10
+ ".": "./dist/index.mjs"
11
+ },
12
+ "types": "./dist/index.d.mts",
13
+ "bin": "./dist/cli.mjs",
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "obuild",
19
+ "dev": "vitest dev",
20
+ "lint": "eslint . && prettier -c .",
21
+ "lint:fix": "automd && eslint . --fix && prettier -w .",
22
+ "prepack": "pnpm build",
23
+ "play": "pnpm rendu playground",
24
+ "release": "pnpm test && pnpm build && changelogen --release && npm publish && git push --follow-tags",
25
+ "rendu": "node ./src/cli.ts",
26
+ "test": "pnpm lint && pnpm test:types && vitest run --coverage",
27
+ "test:types": "tsc --noEmit --skipLibCheck"
28
+ },
29
+ "dependencies": {
30
+ "srvx": "^0.9.1"
31
+ },
32
+ "devDependencies": {
33
+ "@types/node": "^24.9.1",
34
+ "@vitest/coverage-v8": "^4.0.4",
35
+ "automd": "^0.4.2",
36
+ "changelogen": "^0.6.2",
37
+ "cookie-es": "^2.0.0",
38
+ "eslint": "^9.38.0",
39
+ "eslint-config-unjs": "^0.5.0",
40
+ "obuild": "^0.3.0",
41
+ "prettier": "^3.6.2",
42
+ "rendu": "^0.0.6",
43
+ "typescript": "^5.9.3",
44
+ "vitest": "^4.0.4"
45
+ },
46
+ "packageManager": "pnpm@10.19.0"
47
+ }
@@ -21,23 +21,23 @@ const u = function(n2, t2, o2) {
21
21
  return e(r2 + 36 * n2 / (n2 + 38));
22
22
  };
23
23
  function toASCII(o2) {
24
- return function(n2, o3) {
24
+ return (function(n2, o3) {
25
25
  const e2 = n2.split("@");
26
26
  let r2 = "";
27
27
  e2.length > 1 && (r2 = e2[0] + "@", n2 = e2[1]);
28
- const s2 = function(n3, t2) {
28
+ const s2 = (function(n3, t2) {
29
29
  const o4 = [];
30
30
  let e3 = n3.length;
31
31
  for (; e3--; ) {
32
32
  o4[e3] = t2(n3[e3]);
33
33
  }
34
34
  return o4;
35
- }((n2 = n2.replace(t, ".")).split("."), o3).join(".");
35
+ })((n2 = n2.replace(t, ".")).split("."), o3).join(".");
36
36
  return r2 + s2;
37
- }(o2, function(t2) {
38
- return n.test(t2) ? "xn--" + function(n2) {
37
+ })(o2, function(t2) {
38
+ return n.test(t2) ? "xn--" + (function(n2) {
39
39
  const t3 = [];
40
- const o3 = (n2 = function(n3) {
40
+ const o3 = (n2 = (function(n3) {
41
41
  const t4 = [];
42
42
  let o4 = 0;
43
43
  const e2 = n3.length;
@@ -51,7 +51,7 @@ function toASCII(o2) {
51
51
  }
52
52
  }
53
53
  return t4;
54
- }(n2)).length;
54
+ })(n2)).length;
55
55
  let f = 128;
56
56
  let i = 0;
57
57
  let l = 72;
@@ -85,7 +85,7 @@ function toASCII(o2) {
85
85
  ++i, ++f;
86
86
  }
87
87
  return t3.join("");
88
- }(t2) : t2;
88
+ })(t2) : t2;
89
89
  });
90
90
  }
91
91
 
@@ -267,7 +267,10 @@ function withBase(input, base) {
267
267
  }
268
268
  const _base = withoutTrailingSlash(base);
269
269
  if (input.startsWith(_base)) {
270
- return input;
270
+ const nextChar = input[_base.length];
271
+ if (!nextChar || nextChar === "/" || nextChar === "?") {
272
+ return input;
273
+ }
271
274
  }
272
275
  return joinURL(_base, input);
273
276
  }
@@ -279,6 +282,10 @@ function withoutBase(input, base) {
279
282
  if (!input.startsWith(_base)) {
280
283
  return input;
281
284
  }
285
+ const nextChar = input[_base.length];
286
+ if (nextChar && nextChar !== "/" && nextChar !== "?") {
287
+ return input;
288
+ }
282
289
  const trimmed = input.slice(_base.length);
283
290
  return trimmed[0] === "/" ? trimmed : "/" + trimmed;
284
291
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ufo",
3
- "version": "1.6.1",
3
+ "version": "1.6.3",
4
4
  "description": "URL utils for humans",
5
5
  "repository": "unjs/ufo",
6
6
  "license": "MIT",
@@ -8,8 +8,9 @@
8
8
  "exports": {
9
9
  ".": {
10
10
  "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
11
12
  "require": "./dist/index.cjs",
12
- "import": "./dist/index.mjs"
13
+ "default": "./dist/index.mjs"
13
14
  },
14
15
  "./*": "./*"
15
16
  },
@@ -30,18 +31,18 @@
30
31
  "test": "pnpm lint && vitest run --typecheck"
31
32
  },
32
33
  "devDependencies": {
33
- "@types/node": "^22.14.0",
34
- "@vitest/coverage-v8": "^3.1.1",
35
- "automd": "^0.4.0",
36
- "changelogen": "^0.6.1",
37
- "eslint": "^9.24.0",
38
- "eslint-config-unjs": "^0.4.2",
39
- "jiti": "^2.4.2",
40
- "prettier": "^3.5.3",
41
- "typescript": "^5.8.3",
42
- "unbuild": "^3.5.0",
34
+ "@types/node": "^25.0.8",
35
+ "@vitest/coverage-v8": "^4.0.17",
36
+ "automd": "^0.4.2",
37
+ "changelogen": "^0.6.2",
38
+ "eslint": "^9.39.2",
39
+ "eslint-config-unjs": "^0.6.2",
40
+ "jiti": "^2.6.1",
41
+ "prettier": "^3.7.4",
42
+ "typescript": "^5.9.3",
43
+ "unbuild": "^3.6.1",
43
44
  "untyped": "^2.0.0",
44
- "vitest": "^3.1.1"
45
+ "vitest": "^4.0.17"
45
46
  },
46
- "packageManager": "pnpm@10.7.1"
47
+ "packageManager": "pnpm@10.28.0"
47
48
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "unctx",
3
- "version": "2.4.1",
3
+ "version": "2.5.0",
4
4
  "description": "Composition-api in Vanilla js",
5
5
  "repository": "unjs/unctx",
6
6
  "license": "MIT",
@@ -45,23 +45,23 @@
45
45
  "test:types": "tsc --noEmit"
46
46
  },
47
47
  "dependencies": {
48
- "acorn": "^8.14.0",
48
+ "acorn": "^8.15.0",
49
49
  "estree-walker": "^3.0.3",
50
- "magic-string": "^0.30.17",
51
- "unplugin": "^2.1.0"
50
+ "magic-string": "^0.30.21",
51
+ "unplugin": "^2.3.11"
52
52
  },
53
53
  "devDependencies": {
54
- "@types/estree": "^1.0.6",
55
- "@types/node": "^22.10.2",
56
- "@vitest/coverage-v8": "^2.1.8",
57
- "changelogen": "^0.5.7",
58
- "eslint": "^9.17.0",
59
- "eslint-config-unjs": "^0.4.2",
60
- "jiti": "^2.4.2",
61
- "prettier": "^3.4.2",
62
- "typescript": "^5.7.2",
63
- "unbuild": "^3.0.1",
64
- "vitest": "^2.1.8"
54
+ "@types/estree": "^1.0.8",
55
+ "@types/node": "^25.0.2",
56
+ "@vitest/coverage-v8": "^4.0.16",
57
+ "changelogen": "^0.6.2",
58
+ "eslint": "^9.39.2",
59
+ "eslint-config-unjs": "^0.5.0",
60
+ "jiti": "^2.6.1",
61
+ "prettier": "^3.7.4",
62
+ "typescript": "^5.9.3",
63
+ "unbuild": "^3.6.1",
64
+ "vitest": "^4.0.16"
65
65
  },
66
- "packageManager": "pnpm@9.15.0"
66
+ "packageManager": "pnpm@10.26.0"
67
67
  }
@@ -3,11 +3,9 @@ import {
3
3
  stripAnsi
4
4
  } from "./chunk-4L7RY2JA.js";
5
5
  import {
6
+ BaseComponent,
6
7
  publicDirURL
7
- } from "./chunk-OSUFJZHZ.js";
8
- import {
9
- BaseComponent
10
- } from "./chunk-4YEN7HVQ.js";
8
+ } from "./chunk-PE3GG3TN.js";
11
9
 
12
10
  // src/templates/error_stack_source/main.ts
13
11
  import { extname } from "path";
@@ -1,9 +1,7 @@
1
1
  import {
2
+ BaseComponent,
2
3
  publicDirURL
3
- } from "./chunk-OSUFJZHZ.js";
4
- import {
5
- BaseComponent
6
- } from "./chunk-4YEN7HVQ.js";
4
+ } from "./chunk-PE3GG3TN.js";
7
5
 
8
6
  // src/templates/header/main.ts
9
7
  var DARK_MODE_SVG = `<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" width="15" height="15" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M0 0h24v24H0z" stroke="none"/><path d="M12 3h.393a7.5 7.5 0 0 0 7.92 12.446A9 9 0 1 1 12 2.992z"/></svg>`;
@@ -1,9 +1,7 @@
1
1
  import {
2
+ BaseComponent,
2
3
  publicDirURL
3
- } from "./chunk-OSUFJZHZ.js";
4
- import {
5
- BaseComponent
6
- } from "./chunk-4YEN7HVQ.js";
4
+ } from "./chunk-PE3GG3TN.js";
7
5
 
8
6
  // src/templates/layout/main.ts
9
7
  var Layout = class extends BaseComponent {
@@ -21,12 +19,13 @@ var Layout = class extends BaseComponent {
21
19
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
22
20
  <title>${props.title}</title>
23
21
  <!-- STYLES -->
24
- <!-- SCRIPTS -->
22
+ <!-- GLOBAL SCRIPT -->
25
23
  </head>
26
24
  <body>
27
25
  <div id="layout">
28
26
  ${await props.children()}
29
27
  </div>
28
+ <!-- SCRIPTS -->
30
29
  </body>
31
30
  </html>`;
32
31
  }
@@ -3,11 +3,9 @@ import {
3
3
  htmlEscape
4
4
  } from "./chunk-4L7RY2JA.js";
5
5
  import {
6
+ BaseComponent,
6
7
  publicDirURL
7
- } from "./chunk-OSUFJZHZ.js";
8
- import {
9
- BaseComponent
10
- } from "./chunk-4YEN7HVQ.js";
8
+ } from "./chunk-PE3GG3TN.js";
11
9
 
12
10
  // src/templates/error_stack/main.ts
13
11
  import { dump, themes } from "@poppinss/dumper/html";
@@ -211,9 +209,12 @@ ${dumpCli(props.error.raw, {
211
209
  );
212
210
  })
213
211
  );
214
- return `
212
+ if (frames.length) {
213
+ return `
215
214
 
216
215
  ${frames.join("\n")}`;
216
+ }
217
+ return "";
217
218
  }
218
219
  };
219
220
 
@@ -3,11 +3,9 @@ import {
3
3
  wordWrap
4
4
  } from "./chunk-4L7RY2JA.js";
5
5
  import {
6
+ BaseComponent,
6
7
  publicDirURL
7
- } from "./chunk-OSUFJZHZ.js";
8
- import {
9
- BaseComponent
10
- } from "./chunk-4YEN7HVQ.js";
8
+ } from "./chunk-PE3GG3TN.js";
11
9
 
12
10
  // src/templates/error_info/main.ts
13
11
  var ERROR_ICON_SVG = `<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" width="24" height="24" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 7v6m0 4.01.01-.011M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10Z"/></svg>`;