nitro 3.0.0 → 3.0.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/dist/_build/common.mjs +68 -0
  2. package/dist/_build/common2.mjs +772 -0
  3. package/dist/_build/rolldown.mjs +206 -0
  4. package/dist/_build/rollup.mjs +289 -0
  5. package/dist/_build/vite.build.mjs +56 -0
  6. package/dist/_build/vite.plugin.mjs +768 -0
  7. package/dist/_chunks/ANM1K1bE.mjs +304 -0
  8. package/dist/_chunks/B-D1JOIz.mjs +1355 -0
  9. package/dist/_chunks/BX9-zVkM.mjs +59 -0
  10. package/dist/_chunks/Bqks5huO.mjs +31 -0
  11. package/dist/_chunks/C7CbzoI1.mjs +39 -0
  12. package/dist/_dev.d.mts +12 -0
  13. package/dist/_dev.mjs +705 -0
  14. package/dist/_libs/acorn.mjs +5034 -0
  15. package/dist/_libs/c12.mjs +2858 -0
  16. package/dist/_libs/chokidar.mjs +1561 -0
  17. package/dist/_libs/citty.mjs +333 -0
  18. package/dist/_libs/commondir.mjs +22 -0
  19. package/dist/_libs/compatx.mjs +46 -0
  20. package/dist/_libs/confbox.mjs +2920 -0
  21. package/dist/_libs/deepmerge.mjs +86 -0
  22. package/dist/_libs/dot-prop.mjs +138 -0
  23. package/dist/_libs/duplexer.mjs +71 -0
  24. package/dist/_libs/escape-string-regexp.mjs +8 -0
  25. package/dist/_libs/estree-walker.mjs +330 -0
  26. package/dist/_libs/etag.mjs +80 -0
  27. package/dist/_libs/fdir.mjs +514 -0
  28. package/dist/_libs/function-bind.mjs +63 -0
  29. package/dist/_libs/gen-mapping.mjs +612 -0
  30. package/dist/_libs/giget.mjs +19289 -0
  31. package/dist/_libs/gzip-size.mjs +21 -0
  32. package/dist/_libs/hasown.mjs +14 -0
  33. package/dist/_libs/httpxy.mjs +410 -0
  34. package/dist/_libs/is-core-module.mjs +220 -0
  35. package/dist/_libs/is-module.mjs +13 -0
  36. package/dist/_libs/is-reference.mjs +32 -0
  37. package/dist/_libs/js-tokens.mjs +382 -0
  38. package/dist/_libs/klona.mjs +38 -0
  39. package/dist/_libs/knitwork.mjs +124 -0
  40. package/dist/_libs/local-pkg.mjs +1686 -0
  41. package/dist/_libs/magic-string.mjs +939 -0
  42. package/dist/_libs/mime.mjs +1391 -0
  43. package/dist/_libs/node-fetch-native.mjs +173 -0
  44. package/dist/_libs/path-parse.mjs +47 -0
  45. package/dist/_libs/pathe.mjs +41 -0
  46. package/dist/_libs/picomatch.mjs +1673 -0
  47. package/dist/_libs/plugin-alias.mjs +64 -0
  48. package/dist/_libs/plugin-commonjs.mjs +1491 -0
  49. package/dist/_libs/plugin-inject.mjs +135 -0
  50. package/dist/_libs/plugin-json.mjs +36 -0
  51. package/dist/_libs/plugin-node-resolve.mjs +1553 -0
  52. package/dist/_libs/plugin-replace.mjs +104 -0
  53. package/dist/_libs/pretty-bytes.mjs +116 -0
  54. package/dist/_libs/remapping.mjs +117 -0
  55. package/dist/_libs/rou3.mjs +319 -0
  56. package/dist/_libs/std-env.mjs +158 -0
  57. package/dist/_libs/strip-literal.mjs +51 -0
  58. package/dist/_libs/tinyglobby.mjs +292 -0
  59. package/dist/_libs/tsconfck.mjs +832 -0
  60. package/dist/_libs/ultrahtml.mjs +138 -0
  61. package/dist/_libs/unimport.mjs +3520 -0
  62. package/dist/_libs/untyped.mjs +271 -0
  63. package/dist/_libs/unwasm.mjs +5836 -0
  64. package/dist/_libs/vite-plugin-fullstack.mjs +561 -0
  65. package/dist/_presets.mjs +1752 -0
  66. package/dist/builder.d.mts +63 -0
  67. package/dist/builder.mjs +33 -0
  68. package/dist/cli/_chunks/build.mjs +48 -0
  69. package/dist/cli/_chunks/common.mjs +15 -0
  70. package/dist/cli/_chunks/detect-acorn.mjs +12 -0
  71. package/dist/cli/_chunks/dev.mjs +68 -0
  72. package/dist/cli/_chunks/dist.mjs +3 -0
  73. package/dist/cli/_chunks/dist2.mjs +3 -0
  74. package/dist/cli/_chunks/dist3.mjs +3 -0
  75. package/dist/cli/_chunks/dist4.mjs +4 -0
  76. package/dist/cli/_chunks/dist5.mjs +4 -0
  77. package/dist/cli/_chunks/esm.mjs +3 -0
  78. package/dist/cli/_chunks/json5.mjs +4 -0
  79. package/dist/cli/_chunks/jsonc.mjs +4 -0
  80. package/dist/cli/_chunks/list.mjs +27 -0
  81. package/dist/cli/_chunks/multipart-parser.mjs +6 -0
  82. package/dist/cli/_chunks/prepare.mjs +19 -0
  83. package/dist/cli/_chunks/run.mjs +55 -0
  84. package/dist/cli/_chunks/task.mjs +16 -0
  85. package/dist/cli/_chunks/toml.mjs +4 -0
  86. package/dist/cli/_chunks/yaml.mjs +4 -0
  87. package/dist/cli/index.d.mts +1 -1
  88. package/dist/cli/index.mjs +20 -476
  89. package/dist/node_modules/@poppinss/dumper/build/formatters/html/main.js +1 -1
  90. package/dist/node_modules/@poppinss/dumper/package.json +1 -1
  91. package/dist/node_modules/@sindresorhus/is/distribution/index.js +1 -1
  92. package/dist/node_modules/@sindresorhus/is/package.json +1 -1
  93. package/dist/node_modules/@speed-highlight/core/dist/index.js +2 -2
  94. package/dist/node_modules/@speed-highlight/core/dist/terminal.js +2 -2
  95. package/dist/node_modules/@speed-highlight/core/package.json +7 -3
  96. package/dist/node_modules/cookie-es/dist/index.mjs +262 -0
  97. package/dist/node_modules/cookie-es/package.json +37 -0
  98. package/dist/node_modules/hookable/dist/index.mjs +243 -266
  99. package/dist/node_modules/hookable/package.json +29 -26
  100. package/dist/node_modules/rendu/dist/index.mjs +380 -0
  101. package/dist/node_modules/rendu/package.json +47 -0
  102. package/dist/node_modules/youch/build/{chunk-VE4LENUR.js → chunk-F4I6KX4R.js} +2 -1
  103. package/dist/node_modules/youch/build/{chunk-JAN2TFI2.js → chunk-YYEJ3AGB.js} +4 -1
  104. package/dist/node_modules/youch/build/index.js +16 -8
  105. package/dist/node_modules/youch/build/public/error_stack/script.js +20 -22
  106. package/dist/node_modules/youch/build/public/header/script.js +0 -2
  107. package/dist/node_modules/youch/build/public/layout/script.js +0 -8
  108. package/dist/node_modules/youch/build/public/layout/style.css +4 -0
  109. package/dist/node_modules/youch/package.json +16 -17
  110. package/dist/presets/_nitro/runtime/nitro-dev.d.mts +1 -0
  111. package/dist/presets/_nitro/runtime/nitro-dev.mjs +48 -42
  112. package/dist/presets/_nitro/runtime/nitro-prerenderer.d.mts +2 -2
  113. package/dist/presets/_nitro/runtime/nitro-prerenderer.mjs +10 -14
  114. package/dist/presets/_nitro/runtime/service-worker.d.mts +1 -0
  115. package/dist/presets/_nitro/runtime/service-worker.mjs +15 -12
  116. package/dist/presets/aws-amplify/runtime/aws-amplify.d.mts +1 -0
  117. package/dist/presets/aws-amplify/runtime/aws-amplify.mjs +7 -6
  118. package/dist/presets/aws-lambda/runtime/_utils.d.mts +8 -13
  119. package/dist/presets/aws-lambda/runtime/_utils.mjs +95 -81
  120. package/dist/presets/aws-lambda/runtime/aws-lambda-streaming.d.mts +1 -2
  121. package/dist/presets/aws-lambda/runtime/aws-lambda-streaming.mjs +26 -28
  122. package/dist/presets/aws-lambda/runtime/aws-lambda.mjs +8 -8
  123. package/dist/presets/azure/runtime/_utils.mjs +43 -43
  124. package/dist/presets/azure/runtime/azure-swa.d.mts +2 -2
  125. package/dist/presets/azure/runtime/azure-swa.mjs +24 -22
  126. package/dist/presets/bun/runtime/bun.d.mts +2 -0
  127. package/dist/presets/bun/runtime/bun.mjs +34 -21
  128. package/dist/presets/cloudflare/runtime/_module-handler.d.mts +10 -7
  129. package/dist/presets/cloudflare/runtime/_module-handler.mjs +80 -88
  130. package/dist/presets/cloudflare/runtime/cloudflare-durable.d.mts +6 -14
  131. package/dist/presets/cloudflare/runtime/cloudflare-durable.mjs +60 -63
  132. package/dist/presets/cloudflare/runtime/cloudflare-module.d.mts +1 -7
  133. package/dist/presets/cloudflare/runtime/cloudflare-module.mjs +14 -16
  134. package/dist/presets/cloudflare/runtime/cloudflare-pages.d.mts +12 -12
  135. package/dist/presets/cloudflare/runtime/cloudflare-pages.mjs +40 -42
  136. package/dist/presets/cloudflare/runtime/plugin.dev.d.mts +2 -2
  137. package/dist/presets/cloudflare/runtime/plugin.dev.mjs +89 -82
  138. package/dist/presets/cloudflare/runtime/shims/workers.dev.mjs +27 -0
  139. package/dist/presets/deno/runtime/deno-deploy.d.mts +4 -0
  140. package/dist/presets/deno/runtime/deno-deploy.mjs +15 -12
  141. package/dist/presets/deno/runtime/deno-server.d.mts +0 -3
  142. package/dist/presets/deno/runtime/deno-server.mjs +32 -52
  143. package/dist/presets/netlify/runtime/netlify-edge.d.mts +2 -1
  144. package/dist/presets/netlify/runtime/netlify-edge.mjs +15 -12
  145. package/dist/presets/netlify/runtime/netlify.mjs +12 -18
  146. package/dist/presets/node/runtime/node-cluster.d.mts +3 -1
  147. package/dist/presets/node/runtime/node-cluster.mjs +50 -54
  148. package/dist/presets/node/runtime/node-middleware.d.mts +2 -3
  149. package/dist/presets/node/runtime/node-middleware.mjs +9 -8
  150. package/dist/presets/node/runtime/node-server.mjs +37 -34
  151. package/dist/presets/standard/runtime/server.d.mts +1 -3
  152. package/dist/presets/standard/runtime/server.mjs +2 -4
  153. package/dist/presets/stormkit/runtime/stormkit.d.mts +13 -13
  154. package/dist/presets/stormkit/runtime/stormkit.mjs +21 -21
  155. package/dist/presets/vercel/runtime/vercel.node.d.mts +3 -0
  156. package/dist/presets/vercel/runtime/vercel.node.mjs +15 -0
  157. package/dist/presets/vercel/runtime/{vercel.d.mts → vercel.web.d.mts} +3 -3
  158. package/dist/presets/vercel/runtime/vercel.web.mjs +20 -0
  159. package/dist/presets/winterjs/runtime/winterjs.d.mts +2 -0
  160. package/dist/presets/winterjs/runtime/winterjs.mjs +73 -69
  161. package/dist/presets/zeabur/runtime/zeabur.d.mts +1 -1
  162. package/dist/presets/zeabur/runtime/zeabur.mjs +1 -1
  163. package/dist/runtime/app.d.mts +1 -0
  164. package/dist/runtime/app.mjs +1 -0
  165. package/dist/runtime/cache.d.mts +1 -0
  166. package/dist/runtime/cache.mjs +1 -0
  167. package/dist/runtime/config.d.mts +3 -0
  168. package/dist/runtime/config.mjs +4 -0
  169. package/dist/runtime/context.d.mts +1 -0
  170. package/dist/runtime/context.mjs +1 -0
  171. package/dist/runtime/database.d.mts +1 -0
  172. package/dist/runtime/database.mjs +1 -0
  173. package/dist/runtime/internal/app.d.mts +11 -1
  174. package/dist/runtime/internal/app.mjs +188 -140
  175. package/dist/runtime/internal/cache.d.mts +9 -5
  176. package/dist/runtime/internal/cache.mjs +248 -219
  177. package/dist/runtime/internal/context.d.mts +9 -9
  178. package/dist/runtime/internal/context.mjs +17 -10
  179. package/dist/runtime/internal/database.mjs +8 -10
  180. package/dist/runtime/internal/error/dev.d.mts +5 -4
  181. package/dist/runtime/internal/error/dev.mjs +106 -105
  182. package/dist/runtime/internal/error/hooks.d.mts +1 -0
  183. package/dist/runtime/internal/error/hooks.mjs +9 -0
  184. package/dist/runtime/internal/error/prod.d.mts +5 -4
  185. package/dist/runtime/internal/error/prod.mjs +51 -59
  186. package/dist/runtime/internal/error/utils.d.mts +4 -4
  187. package/dist/runtime/internal/error/utils.mjs +1 -1
  188. package/dist/runtime/internal/meta.d.mts +1 -1
  189. package/dist/runtime/internal/meta.mjs +1 -1
  190. package/dist/runtime/internal/plugin.d.mts +2 -2
  191. package/dist/runtime/internal/plugin.mjs +1 -1
  192. package/dist/runtime/internal/route-rules.d.mts +8 -8
  193. package/dist/runtime/internal/route-rules.mjs +54 -52
  194. package/dist/runtime/internal/routes/dev-tasks.d.mts +1 -2
  195. package/dist/runtime/internal/routes/dev-tasks.mjs +16 -18
  196. package/dist/runtime/internal/routes/openapi.d.mts +1 -0
  197. package/dist/runtime/internal/routes/openapi.mjs +81 -87
  198. package/dist/runtime/internal/routes/renderer-template.d.mts +1 -1
  199. package/dist/runtime/internal/routes/renderer-template.dev.d.mts +1 -2
  200. package/dist/runtime/internal/routes/renderer-template.dev.mjs +15 -17
  201. package/dist/runtime/internal/routes/renderer-template.mjs +1 -1
  202. package/dist/runtime/internal/routes/scalar.d.mts +1 -0
  203. package/dist/runtime/internal/routes/scalar.mjs +22 -23
  204. package/dist/runtime/internal/routes/swagger.d.mts +1 -0
  205. package/dist/runtime/internal/routes/swagger.mjs +9 -11
  206. package/dist/runtime/internal/runtime-config.d.mts +4 -4
  207. package/dist/runtime/internal/runtime-config.mjs +40 -35
  208. package/dist/runtime/internal/static.mjs +63 -74
  209. package/dist/runtime/internal/storage.mjs +2 -2
  210. package/dist/runtime/internal/task.d.mts +6 -6
  211. package/dist/runtime/internal/task.mjs +56 -60
  212. package/dist/runtime/internal/vite/dev-entry.mjs +11 -1
  213. package/dist/runtime/internal/vite/dev-worker.mjs +9 -57
  214. package/dist/runtime/internal/vite/ssr-renderer.mjs +3 -1
  215. package/{lib/runtime-meta.d.mts → dist/runtime/meta.d.mts} +1 -1
  216. package/dist/runtime/meta.mjs +26 -0
  217. package/dist/runtime/nitro.d.mts +12 -0
  218. package/dist/runtime/nitro.mjs +32 -0
  219. package/dist/runtime/runtime-config.d.mts +1 -0
  220. package/dist/runtime/runtime-config.mjs +1 -0
  221. package/dist/runtime/storage.d.mts +1 -0
  222. package/dist/runtime/storage.mjs +1 -0
  223. package/dist/runtime/task.d.mts +1 -0
  224. package/dist/runtime/task.mjs +1 -0
  225. package/dist/runtime/vite-runtime.d.mts +8 -0
  226. package/dist/runtime/vite-runtime.mjs +9 -0
  227. package/dist/types/index.d.mts +2625 -2297
  228. package/dist/types/index.mjs +1 -1
  229. package/dist/vite.d.mts +49 -51
  230. package/dist/vite.mjs +44 -68
  231. package/lib/tsconfig.json +27 -0
  232. package/package.json +86 -76
  233. package/dist/_chunks/app.mjs +0 -19797
  234. package/dist/_chunks/build.mjs +0 -84
  235. package/dist/_chunks/build2.mjs +0 -318
  236. package/dist/_chunks/build3.mjs +0 -6452
  237. package/dist/_chunks/detect-acorn.mjs +0 -503
  238. package/dist/_chunks/index.mjs +0 -22242
  239. package/dist/_chunks/index2.mjs +0 -297
  240. package/dist/_chunks/index3.mjs +0 -1058
  241. package/dist/_chunks/index4.mjs +0 -1206
  242. package/dist/_chunks/info.mjs +0 -11157
  243. package/dist/_chunks/json5.mjs +0 -68
  244. package/dist/_chunks/jsonc.mjs +0 -51
  245. package/dist/_chunks/pathe.M-eThtNZ.mjs +0 -204
  246. package/dist/_chunks/plugin.mjs +0 -960
  247. package/dist/_chunks/server.mjs +0 -254
  248. package/dist/_chunks/snapshot.mjs +0 -284
  249. package/dist/_chunks/toml.mjs +0 -259
  250. package/dist/_chunks/yaml.mjs +0 -86
  251. package/dist/cli/build.mjs +0 -54
  252. package/dist/cli/common.mjs +0 -13
  253. package/dist/cli/dev.mjs +0 -95
  254. package/dist/cli/index2.mjs +0 -17
  255. package/dist/cli/list.mjs +0 -34
  256. package/dist/cli/prepare.mjs +0 -24
  257. package/dist/cli/run.mjs +0 -60
  258. package/dist/index.d.mts +0 -52
  259. package/dist/index.mjs +0 -55
  260. package/dist/node_modules/cookie/dist/index.js +0 -239
  261. package/dist/node_modules/cookie/package.json +0 -42
  262. package/dist/node_modules/klona/dist/index.mjs +0 -81
  263. package/dist/node_modules/klona/full/index.mjs +0 -53
  264. package/dist/node_modules/klona/package.json +0 -74
  265. package/dist/node_modules/std-env/dist/index.mjs +0 -1
  266. package/dist/node_modules/std-env/package.json +0 -46
  267. package/dist/presets/vercel/runtime/vercel.mjs +0 -17
  268. package/dist/presets.mjs +0 -2460
  269. package/dist/runtime/index.d.mts +0 -11
  270. package/dist/runtime/index.mjs +0 -17
  271. package/dist/runtime/internal/debug.d.mts +0 -2
  272. package/dist/runtime/internal/debug.mjs +0 -5
  273. package/dist/runtime/internal/empty.d.mts +0 -0
  274. package/dist/runtime/internal/index.d.mts +0 -3
  275. package/dist/runtime/internal/index.mjs +0 -3
  276. package/dist/runtime/internal/lib/http-graceful-shutdown.d.mts +0 -16
  277. package/dist/runtime/internal/lib/http-graceful-shutdown.mjs +0 -213
  278. package/dist/runtime/internal/renderer.d.mts +0 -3
  279. package/dist/runtime/internal/renderer.mjs +0 -36
  280. package/dist/runtime/internal/shutdown.d.mts +0 -9
  281. package/dist/runtime/internal/shutdown.mjs +0 -34
  282. package/dist/runtime/internal/utils.d.mts +0 -1
  283. package/dist/runtime/internal/utils.mjs +0 -15
  284. package/dist/runtime/internal/vite/dev-entry.d.mts +0 -1
  285. package/dist/runtime/internal/vite/dev-worker.d.mts +0 -1
  286. package/dist/runtime/internal/vite/prod-setup.d.mts +0 -4
  287. package/dist/runtime/internal/vite/prod-setup.mjs +0 -55
  288. package/dist/runtime/internal/vite/ssr-renderer.d.mts +0 -4
  289. package/lib/config.d.mts +0 -9
  290. package/lib/config.mjs +0 -5
  291. package/lib/meta.d.mts +0 -5
  292. package/lib/meta.mjs +0 -21
  293. package/lib/runtime-meta.mjs +0 -38
@@ -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,12 +21,13 @@ var Layout = class extends BaseComponent {
21
21
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
22
22
  <title>${props.title}</title>
23
23
  <!-- STYLES -->
24
- <!-- SCRIPTS -->
24
+ <!-- GLOBAL SCRIPT -->
25
25
  </head>
26
26
  <body>
27
27
  <div id="layout">
28
28
  ${await props.children()}
29
29
  </div>
30
+ <!-- SCRIPTS -->
30
31
  </body>
31
32
  </html>`;
32
33
  }
@@ -211,9 +211,12 @@ ${dumpCli(props.error.raw, {
211
211
  );
212
212
  })
213
213
  );
214
- return `
214
+ if (frames.length) {
215
+ return `
215
216
 
216
217
  ${frames.join("\n")}`;
218
+ }
219
+ return "";
217
220
  }
218
221
  };
219
222
 
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Layout
3
- } from "./chunk-VE4LENUR.js";
3
+ } from "./chunk-F4I6KX4R.js";
4
4
  import {
5
5
  ErrorCause
6
6
  } from "./chunk-PINJDICN.js";
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-HFSXRSKS.js";
13
13
  import {
14
14
  ErrorStack
15
- } from "./chunk-JAN2TFI2.js";
15
+ } from "./chunk-YYEJ3AGB.js";
16
16
  import {
17
17
  ErrorStackSource
18
18
  } from "./chunk-4XB2BYKC.js";
@@ -26,7 +26,7 @@ import {
26
26
  } from "./chunk-4YEN7HVQ.js";
27
27
 
28
28
  // src/youch.ts
29
- import cookie from "cookie";
29
+ import { parse } from "cookie-es";
30
30
  import { ErrorParser } from "youch-core";
31
31
 
32
32
  // src/metadata.ts
@@ -88,6 +88,7 @@ var Templates = class {
88
88
  */
89
89
  #getStylesAndScripts(cspNonce) {
90
90
  let customInjectedStyles = "";
91
+ let globalScript = "";
91
92
  const styles = [];
92
93
  const scripts = [];
93
94
  const cspNonceAttr = cspNonce ? ` nonce="${cspNonce}"` : "";
@@ -99,10 +100,17 @@ var Templates = class {
99
100
  }
100
101
  });
101
102
  this.#scripts.forEach((bucket, name) => {
103
+ if (name === "global") {
104
+ globalScript = `<script id="${name}-script"${cspNonceAttr}>${bucket}</script>`;
105
+ }
102
106
  scripts.push(`<script id="${name}-script"${cspNonceAttr}>${bucket}</script>`);
103
107
  });
104
- return { styles: `${styles.join("\n")}
105
- ${customInjectedStyles}`, scripts: scripts.join("\n") };
108
+ return {
109
+ styles: `${styles.join("\n")}
110
+ ${customInjectedStyles}`,
111
+ scripts: scripts.join("\n"),
112
+ globalScript
113
+ };
106
114
  }
107
115
  /**
108
116
  * Collects styles and scripts for components as we render
@@ -192,8 +200,8 @@ ${cssFragment}`;
192
200
  return `${header}${info}${stackTrace}${cause}${metadata}`;
193
201
  }
194
202
  });
195
- const { scripts, styles } = this.#getStylesAndScripts(props.cspNonce);
196
- return html.replace("<!-- STYLES -->", styles).replace("<!-- SCRIPTS -->", scripts);
203
+ const { globalScript, scripts, styles } = this.#getStylesAndScripts(props.cspNonce);
204
+ return html.replace("<!-- STYLES -->", styles).replace("<!-- SCRIPTS -->", scripts).replace("<!-- GLOBAL SCRIPT -->", globalScript);
197
205
  }
198
206
  /**
199
207
  * Returns the ANSI output to be printed on the terminal
@@ -278,7 +286,7 @@ var Youch = class {
278
286
  const value = request.headers[key];
279
287
  return {
280
288
  key,
281
- value: key === "cookie" ? { ...cookie.parse(value) } : value
289
+ value: key === "cookie" ? { ...parse(value) } : value
282
290
  };
283
291
  })
284
292
  } : {}
@@ -44,31 +44,29 @@ function toggleAllFrames() {
44
44
  }
45
45
  }
46
46
 
47
- onContentLoaded(() => {
48
- document.querySelector('#formatted-frames-toggle').addEventListener('click', function () {
49
- showFormattedFrames(this)
50
- })
51
- document.querySelector('#raw-frames-toggle').addEventListener('click', function () {
52
- showRawFrames(this)
47
+ document.querySelector('#formatted-frames-toggle').addEventListener('click', function () {
48
+ showFormattedFrames(this)
49
+ })
50
+ document.querySelector('#raw-frames-toggle').addEventListener('click', function () {
51
+ showRawFrames(this)
52
+ })
53
+ document
54
+ .querySelector('#all-frames-toggle input[type="checkbox"]')
55
+ .addEventListener('change', function () {
56
+ toggleAllFrames()
53
57
  })
54
- document
55
- .querySelector('#all-frames-toggle input[type="checkbox"]')
56
- .addEventListener('change', function () {
57
- toggleAllFrames()
58
- })
59
58
 
60
- document.querySelectorAll('button[class="stack-frame-location"]').forEach((sfl) => {
61
- sfl.addEventListener('click', function (e) {
62
- if (e.target.tagName === 'A') {
63
- return
64
- }
65
- toggleFrameSource(e.target.closest('li'))
66
- })
59
+ document.querySelectorAll('button[class="stack-frame-location"]').forEach((sfl) => {
60
+ sfl.addEventListener('click', function (e) {
61
+ if (e.target.tagName === 'A') {
62
+ return
63
+ }
64
+ toggleFrameSource(e.target.closest('li'))
67
65
  })
66
+ })
68
67
 
69
- document.querySelectorAll('button[class="stack-frame-toggle-indicator"]').forEach((sfl) => {
70
- sfl.addEventListener('click', function (e) {
71
- toggleFrameSource(e.target.closest('li'))
72
- })
68
+ document.querySelectorAll('button[class="stack-frame-toggle-indicator"]').forEach((sfl) => {
69
+ sfl.addEventListener('click', function (e) {
70
+ toggleFrameSource(e.target.closest('li'))
73
71
  })
74
72
  })
@@ -8,9 +8,7 @@ function toggleTheme(input) {
8
8
  }
9
9
  }
10
10
 
11
- onContentLoaded(() => {
12
11
  document.querySelector('#toggle-theme-checkbox').checked = usesDarkMode()
13
12
  document.querySelector('#toggle-theme-checkbox').addEventListener('change', function () {
14
13
  toggleTheme(this)
15
14
  })
16
- })
@@ -9,12 +9,4 @@ function usesDarkMode() {
9
9
  return hasDarkMode
10
10
  }
11
11
 
12
- function onContentLoaded(listener) {
13
- if (document.readyState !== 'loading') {
14
- listener()
15
- return
16
- }
17
- document.addEventListener('DOMContentLoaded', listener)
18
- }
19
-
20
12
  document.documentElement.classList.add(usesDarkMode() ? 'dark' : 'light')
@@ -133,6 +133,8 @@
133
133
  --generator-label-fg-color: #7b3814;
134
134
  --blob-label-fg-color: #7b3814;
135
135
  --unknown-label-fg-color: #7b3814;
136
+
137
+ color-scheme: only light;
136
138
  }
137
139
 
138
140
  html.dark {
@@ -255,6 +257,8 @@ html.dark {
255
257
  --generator-label-fg-color: #94e2d5;
256
258
  --blob-label-fg-color: #94e2d5;
257
259
  --unknown-label-fg-color: #94e2d5;
260
+
261
+ color-scheme: dark;
258
262
  }
259
263
 
260
264
  html,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "youch",
3
3
  "description": "Pretty print JavaScript errors on the Web and the Terminal",
4
- "version": "4.1.0-beta.11",
4
+ "version": "4.1.0-beta.12",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "build",
@@ -34,38 +34,37 @@
34
34
  "@adonisjs/eslint-config": "^3.0.0-next.0",
35
35
  "@adonisjs/prettier-config": "^1.4.5",
36
36
  "@adonisjs/tsconfig": "^2.0.0-next.0",
37
- "@aws-sdk/client-s3": "^3.850.0",
38
- "@aws-sdk/s3-request-presigner": "^3.850.0",
37
+ "@aws-sdk/client-s3": "^3.922.0",
38
+ "@aws-sdk/s3-request-presigner": "^3.922.0",
39
39
  "@japa/assert": "^4.1.1",
40
40
  "@japa/expect": "^3.0.6",
41
41
  "@japa/expect-type": "^2.0.3",
42
42
  "@japa/file-system": "^2.3.2",
43
- "@japa/runner": "^4.3.0",
43
+ "@japa/runner": "^4.4.0",
44
44
  "@japa/snapshot": "^2.0.9",
45
45
  "@poppinss/exception": "^1.2.2",
46
- "@poppinss/ts-exec": "^1.4.0",
46
+ "@poppinss/ts-exec": "^1.4.1",
47
47
  "@release-it/conventional-changelog": "^10.0.1",
48
- "@types/cookie": "^1.0.0",
49
- "@types/jsdom": "^21.1.7",
50
- "@types/node": "^24.1.0",
51
- "@types/pg": "^8.15.4",
52
- "axios": "^1.11.0",
48
+ "@types/jsdom": "^27.0.0",
49
+ "@types/node": "^24.10.0",
50
+ "@types/pg": "^8.15.6",
51
+ "axios": "^1.13.1",
53
52
  "c8": "^10.1.3",
54
53
  "copyfiles": "^2.4.1",
55
- "eslint": "^9.32.0",
54
+ "eslint": "^9.39.0",
56
55
  "flydrive": "^1.3.0",
57
- "jsdom": "^26.1.0",
56
+ "jsdom": "^27.1.0",
58
57
  "pg": "^8.16.3",
59
58
  "prettier": "^3.6.2",
60
- "release-it": "^19.0.4",
59
+ "release-it": "^19.0.5",
61
60
  "tsup": "^8.5.0",
62
- "typescript": "^5.8.3"
61
+ "typescript": "^5.9.3"
63
62
  },
64
63
  "dependencies": {
65
64
  "@poppinss/colors": "^4.1.5",
66
- "@poppinss/dumper": "^0.6.4",
67
- "@speed-highlight/core": "^1.2.7",
68
- "cookie": "^1.0.2",
65
+ "@poppinss/dumper": "^0.6.5",
66
+ "@speed-highlight/core": "^1.2.9",
67
+ "cookie-es": "^2.0.0",
69
68
  "youch-core": "^0.3.3"
70
69
  },
71
70
  "homepage": "https://github.com/poppinss/youch#readme",