@absolutejs/absolute 0.19.0-beta.808 → 0.19.0-beta.809

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 (260) hide show
  1. package/dist/angular/browser.js +9801 -57
  2. package/dist/angular/browser.js.map +246 -4
  3. package/dist/angular/components/core/streamingSlotRegistrar.js +1 -1
  4. package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
  5. package/dist/angular/index.js +14877 -60
  6. package/dist/angular/index.js.map +281 -4
  7. package/dist/angular/server.js +5610 -45
  8. package/dist/angular/server.js.map +51 -3
  9. package/dist/build.js +18092 -45
  10. package/dist/build.js.map +99 -3
  11. package/dist/cli/index.js +317 -86
  12. package/dist/client/index.js +1100 -40
  13. package/dist/client/index.js.map +24 -4
  14. package/dist/core/streamingSlotRegistrar.js +108 -11
  15. package/dist/core/streamingSlotRegistrar.js.map +4 -3
  16. package/dist/core/streamingSlotRegistry.js +169 -7
  17. package/dist/core/streamingSlotRegistry.js.map +5 -3
  18. package/dist/index.js +19957 -547
  19. package/dist/index.js.map +116 -3
  20. package/dist/islands/browser.js +228 -9
  21. package/dist/islands/browser.js.map +9 -4
  22. package/dist/islands/index.js +1908 -17
  23. package/dist/islands/index.js.map +27 -3
  24. package/dist/react/browser.js +328 -12
  25. package/dist/react/browser.js.map +12 -4
  26. package/dist/react/components/index.js +167 -16
  27. package/dist/react/components/index.js.map +6 -3
  28. package/dist/react/hooks/index.js +183 -8
  29. package/dist/react/hooks/index.js.map +7 -3
  30. package/dist/react/index.js +3627 -36
  31. package/dist/react/index.js.map +45 -4
  32. package/dist/react/jsxDevRuntimeCompat.js +61 -2
  33. package/dist/react/jsxDevRuntimeCompat.js.map +2 -2
  34. package/dist/react/server.js +1789 -18
  35. package/dist/react/server.js.map +21 -3
  36. package/dist/src/angular/injectorPatch.d.ts +1 -0
  37. package/dist/src/index.d.ts +1 -0
  38. package/dist/svelte/browser.js +247 -12
  39. package/dist/svelte/browser.js.map +10 -3
  40. package/dist/svelte/index.js +3732 -37
  41. package/dist/svelte/index.js.map +47 -4
  42. package/dist/svelte/server.js +2794 -21
  43. package/dist/svelte/server.js.map +27 -3
  44. package/dist/vue/browser.js +348 -12
  45. package/dist/vue/browser.js.map +12 -4
  46. package/dist/vue/components/Image.js +240 -7
  47. package/dist/vue/components/Image.js.map +6 -3
  48. package/dist/vue/components/index.js +544 -11
  49. package/dist/vue/components/index.js.map +9 -3
  50. package/dist/vue/index.js +4212 -52
  51. package/dist/vue/index.js.map +50 -4
  52. package/dist/vue/server.js +1849 -18
  53. package/dist/vue/server.js.map +21 -3
  54. package/package.json +1 -1
  55. package/dist/chunk-0867j0r0.js +0 -136
  56. package/dist/chunk-0867j0r0.js.map +0 -10
  57. package/dist/chunk-0kdc6r16.js +0 -20
  58. package/dist/chunk-0kdc6r16.js.map +0 -10
  59. package/dist/chunk-102fp7xe.js +0 -63
  60. package/dist/chunk-102fp7xe.js.map +0 -10
  61. package/dist/chunk-11zpfqz6.js +0 -19
  62. package/dist/chunk-11zpfqz6.js.map +0 -10
  63. package/dist/chunk-1rfh7hw9.js +0 -319
  64. package/dist/chunk-1rfh7hw9.js.map +0 -11
  65. package/dist/chunk-25v9t56f.js +0 -29
  66. package/dist/chunk-25v9t56f.js.map +0 -11
  67. package/dist/chunk-2f21eenc.js +0 -21
  68. package/dist/chunk-2f21eenc.js.map +0 -10
  69. package/dist/chunk-2ga2znex.js +0 -13
  70. package/dist/chunk-2ga2znex.js.map +0 -9
  71. package/dist/chunk-30yrw0f6.js +0 -33
  72. package/dist/chunk-30yrw0f6.js.map +0 -10
  73. package/dist/chunk-38jwhqcw.js +0 -4410
  74. package/dist/chunk-38jwhqcw.js.map +0 -28
  75. package/dist/chunk-3g91wb4f.js +0 -358
  76. package/dist/chunk-3g91wb4f.js.map +0 -10
  77. package/dist/chunk-3yjzpcne.js +0 -34
  78. package/dist/chunk-3yjzpcne.js.map +0 -10
  79. package/dist/chunk-41bf6aqt.js +0 -17
  80. package/dist/chunk-41bf6aqt.js.map +0 -9
  81. package/dist/chunk-4d39r92n.js +0 -81
  82. package/dist/chunk-4d39r92n.js.map +0 -10
  83. package/dist/chunk-5003emhv.js +0 -17
  84. package/dist/chunk-5003emhv.js.map +0 -10
  85. package/dist/chunk-5f67rsed.js +0 -466
  86. package/dist/chunk-5f67rsed.js.map +0 -10
  87. package/dist/chunk-5fhp1jap.js +0 -9169
  88. package/dist/chunk-5fhp1jap.js.map +0 -236
  89. package/dist/chunk-6pdj08z3.js +0 -73
  90. package/dist/chunk-6pdj08z3.js.map +0 -12
  91. package/dist/chunk-6qjbrt0k.js +0 -13
  92. package/dist/chunk-6qjbrt0k.js.map +0 -9
  93. package/dist/chunk-6sccb4jr.js +0 -14
  94. package/dist/chunk-6sccb4jr.js.map +0 -9
  95. package/dist/chunk-798spvzv.js +0 -50
  96. package/dist/chunk-798spvzv.js.map +0 -10
  97. package/dist/chunk-7fw6x3js.js +0 -131
  98. package/dist/chunk-7fw6x3js.js.map +0 -11
  99. package/dist/chunk-7kjj42xm.js +0 -11
  100. package/dist/chunk-7kjj42xm.js.map +0 -10
  101. package/dist/chunk-7mtstdqn.js +0 -90
  102. package/dist/chunk-7mtstdqn.js.map +0 -10
  103. package/dist/chunk-851whwc7.js +0 -17
  104. package/dist/chunk-851whwc7.js.map +0 -10
  105. package/dist/chunk-85n68sy6.js +0 -103
  106. package/dist/chunk-85n68sy6.js.map +0 -10
  107. package/dist/chunk-8kcfffry.js +0 -35
  108. package/dist/chunk-8kcfffry.js.map +0 -10
  109. package/dist/chunk-8qqxc1h2.js +0 -426
  110. package/dist/chunk-8qqxc1h2.js.map +0 -14
  111. package/dist/chunk-92fsjfpp.js +0 -1731
  112. package/dist/chunk-92fsjfpp.js.map +0 -11
  113. package/dist/chunk-93sqk7be.js +0 -139
  114. package/dist/chunk-93sqk7be.js.map +0 -12
  115. package/dist/chunk-94gvx0hg.js +0 -28
  116. package/dist/chunk-94gvx0hg.js.map +0 -10
  117. package/dist/chunk-9c5tj4k3.js +0 -130
  118. package/dist/chunk-9c5tj4k3.js.map +0 -10
  119. package/dist/chunk-9ve9jq72.js +0 -203
  120. package/dist/chunk-9ve9jq72.js.map +0 -10
  121. package/dist/chunk-9xrsjeem.js +0 -12
  122. package/dist/chunk-9xrsjeem.js.map +0 -9
  123. package/dist/chunk-a9mvyp04.js +0 -87
  124. package/dist/chunk-a9mvyp04.js.map +0 -10
  125. package/dist/chunk-b3gbnrwe.js +0 -21
  126. package/dist/chunk-b3gbnrwe.js.map +0 -10
  127. package/dist/chunk-bmgqm774.js +0 -65
  128. package/dist/chunk-bmgqm774.js.map +0 -9
  129. package/dist/chunk-bxfghpma.js +0 -69
  130. package/dist/chunk-bxfghpma.js.map +0 -10
  131. package/dist/chunk-c1jfjnka.js +0 -74
  132. package/dist/chunk-c1jfjnka.js.map +0 -10
  133. package/dist/chunk-cbkrwmvh.js +0 -80
  134. package/dist/chunk-cbkrwmvh.js.map +0 -10
  135. package/dist/chunk-cdxd7sy2.js +0 -71
  136. package/dist/chunk-cdxd7sy2.js.map +0 -10
  137. package/dist/chunk-cg95827x.js +0 -21
  138. package/dist/chunk-cg95827x.js.map +0 -10
  139. package/dist/chunk-cm0g4q6w.js +0 -149
  140. package/dist/chunk-cm0g4q6w.js.map +0 -10
  141. package/dist/chunk-cwfy538a.js +0 -51
  142. package/dist/chunk-cwfy538a.js.map +0 -9
  143. package/dist/chunk-d7mwkzry.js +0 -261
  144. package/dist/chunk-d7mwkzry.js.map +0 -10
  145. package/dist/chunk-d8w0qm28.js +0 -184
  146. package/dist/chunk-d8w0qm28.js.map +0 -11
  147. package/dist/chunk-d9c0am65.js +0 -12
  148. package/dist/chunk-d9c0am65.js.map +0 -10
  149. package/dist/chunk-daqghmg8.js +0 -12
  150. package/dist/chunk-daqghmg8.js.map +0 -9
  151. package/dist/chunk-e3r9fxaa.js +0 -149
  152. package/dist/chunk-e3r9fxaa.js.map +0 -10
  153. package/dist/chunk-e8eecyrq.js +0 -244
  154. package/dist/chunk-e8eecyrq.js.map +0 -10
  155. package/dist/chunk-ex2hxe0v.js +0 -160
  156. package/dist/chunk-ex2hxe0v.js.map +0 -11
  157. package/dist/chunk-fak944et.js +0 -91
  158. package/dist/chunk-fak944et.js.map +0 -10
  159. package/dist/chunk-ff70rnhd.js +0 -672
  160. package/dist/chunk-ff70rnhd.js.map +0 -15
  161. package/dist/chunk-fygx2ymm.js +0 -118
  162. package/dist/chunk-fygx2ymm.js.map +0 -12
  163. package/dist/chunk-g15qj669.js +0 -271
  164. package/dist/chunk-g15qj669.js.map +0 -11
  165. package/dist/chunk-gd6wmknh.js +0 -121
  166. package/dist/chunk-gd6wmknh.js.map +0 -11
  167. package/dist/chunk-gf0ygptk.js +0 -85
  168. package/dist/chunk-gf0ygptk.js.map +0 -11
  169. package/dist/chunk-gytkmthr.js +0 -220
  170. package/dist/chunk-gytkmthr.js.map +0 -10
  171. package/dist/chunk-h5bbfn3n.js +0 -28
  172. package/dist/chunk-h5bbfn3n.js.map +0 -11
  173. package/dist/chunk-h6mye9r3.js +0 -93
  174. package/dist/chunk-h6mye9r3.js.map +0 -10
  175. package/dist/chunk-hcsmxw1v.js +0 -85
  176. package/dist/chunk-hcsmxw1v.js.map +0 -10
  177. package/dist/chunk-hyjs4bqs.js +0 -8
  178. package/dist/chunk-hyjs4bqs.js.map +0 -10
  179. package/dist/chunk-j88z31ep.js +0 -25
  180. package/dist/chunk-j88z31ep.js.map +0 -10
  181. package/dist/chunk-jn91vzkh.js +0 -66
  182. package/dist/chunk-jn91vzkh.js.map +0 -10
  183. package/dist/chunk-jpkjdgsk.js +0 -167
  184. package/dist/chunk-jpkjdgsk.js.map +0 -11
  185. package/dist/chunk-jwxt8gnp.js +0 -13
  186. package/dist/chunk-jwxt8gnp.js.map +0 -9
  187. package/dist/chunk-kk8w9rh5.js +0 -195
  188. package/dist/chunk-kk8w9rh5.js.map +0 -10
  189. package/dist/chunk-m97ze5hz.js +0 -46
  190. package/dist/chunk-m97ze5hz.js.map +0 -10
  191. package/dist/chunk-mbazhahf.js +0 -60
  192. package/dist/chunk-mbazhahf.js.map +0 -10
  193. package/dist/chunk-mgfwq18r.js +0 -15
  194. package/dist/chunk-mgfwq18r.js.map +0 -9
  195. package/dist/chunk-mtgf69xn.js +0 -88
  196. package/dist/chunk-mtgf69xn.js.map +0 -10
  197. package/dist/chunk-mtxzyxpg.js +0 -102
  198. package/dist/chunk-mtxzyxpg.js.map +0 -10
  199. package/dist/chunk-nehhtthw.js +0 -225
  200. package/dist/chunk-nehhtthw.js.map +0 -10
  201. package/dist/chunk-p5504p14.js +0 -16
  202. package/dist/chunk-p5504p14.js.map +0 -10
  203. package/dist/chunk-pnscgw95.js +0 -90
  204. package/dist/chunk-pnscgw95.js.map +0 -10
  205. package/dist/chunk-pvpp4pvs.js +0 -17
  206. package/dist/chunk-pvpp4pvs.js.map +0 -10
  207. package/dist/chunk-qh75agse.js +0 -95
  208. package/dist/chunk-qh75agse.js.map +0 -10
  209. package/dist/chunk-qxq2zcty.js +0 -52
  210. package/dist/chunk-qxq2zcty.js.map +0 -10
  211. package/dist/chunk-r6e8pytx.js +0 -22
  212. package/dist/chunk-r6e8pytx.js.map +0 -9
  213. package/dist/chunk-r7jmgqnw.js +0 -114
  214. package/dist/chunk-r7jmgqnw.js.map +0 -10
  215. package/dist/chunk-s6defjk2.js +0 -116
  216. package/dist/chunk-s6defjk2.js.map +0 -10
  217. package/dist/chunk-sd39p726.js +0 -619
  218. package/dist/chunk-sd39p726.js.map +0 -10
  219. package/dist/chunk-swrnzs4c.js +0 -63
  220. package/dist/chunk-swrnzs4c.js.map +0 -10
  221. package/dist/chunk-tfe3sb44.js +0 -33
  222. package/dist/chunk-tfe3sb44.js.map +0 -10
  223. package/dist/chunk-tjr0kcev.js +0 -41
  224. package/dist/chunk-tjr0kcev.js.map +0 -9
  225. package/dist/chunk-tx9edm1x.js +0 -34
  226. package/dist/chunk-tx9edm1x.js.map +0 -10
  227. package/dist/chunk-txhm2vb5.js +0 -18
  228. package/dist/chunk-txhm2vb5.js.map +0 -9
  229. package/dist/chunk-v5vmsxmy.js +0 -526
  230. package/dist/chunk-v5vmsxmy.js.map +0 -12
  231. package/dist/chunk-vjhxm8n2.js +0 -29
  232. package/dist/chunk-vjhxm8n2.js.map +0 -9
  233. package/dist/chunk-vkrpm7kc.js +0 -247
  234. package/dist/chunk-vkrpm7kc.js.map +0 -12
  235. package/dist/chunk-w3m4m5we.js +0 -4925
  236. package/dist/chunk-w3m4m5we.js.map +0 -12
  237. package/dist/chunk-wrxtn9ve.js +0 -18
  238. package/dist/chunk-wrxtn9ve.js.map +0 -10
  239. package/dist/chunk-wwzvp0zn.js +0 -192
  240. package/dist/chunk-wwzvp0zn.js.map +0 -10
  241. package/dist/chunk-x09cskqd.js +0 -377
  242. package/dist/chunk-x09cskqd.js.map +0 -10
  243. package/dist/chunk-xnt8c6h2.js +0 -576
  244. package/dist/chunk-xnt8c6h2.js.map +0 -10
  245. package/dist/chunk-xw0tx842.js +0 -13
  246. package/dist/chunk-xw0tx842.js.map +0 -9
  247. package/dist/chunk-xx5b6b9m.js +0 -69
  248. package/dist/chunk-xx5b6b9m.js.map +0 -10
  249. package/dist/chunk-xz1kdswj.js +0 -21
  250. package/dist/chunk-xz1kdswj.js.map +0 -9
  251. package/dist/chunk-y84qnsd3.js +0 -32
  252. package/dist/chunk-y84qnsd3.js.map +0 -10
  253. package/dist/chunk-ywjn0rad.js +0 -14
  254. package/dist/chunk-ywjn0rad.js.map +0 -9
  255. package/dist/chunk-z9nvhm6r.js +0 -13
  256. package/dist/chunk-z9nvhm6r.js.map +0 -9
  257. package/dist/chunk-zhmvdpk6.js +0 -15
  258. package/dist/chunk-zhmvdpk6.js.map +0 -9
  259. package/dist/chunk-zrg9d4zw.js +0 -784
  260. package/dist/chunk-zrg9d4zw.js.map +0 -10
@@ -1,149 +0,0 @@
1
- // @bun
2
- import {
3
- captureStreamingSlotWarningCallsite,
4
- runWithStreamingSlotWarningScope,
5
- ssrErrorPage
6
- } from "./chunk-gd6wmknh.js";
7
- import {
8
- getCurrentRouteRegistrationCallsite
9
- } from "./chunk-mtgf69xn.js";
10
- import {
11
- derivePageName,
12
- injectIslandPageContextStream,
13
- renderConventionError,
14
- withRegisteredStreamingSlots
15
- } from "./chunk-v5vmsxmy.js";
16
- import {
17
- isSsrCacheDirty
18
- } from "./chunk-d9c0am65.js";
19
- import {
20
- EXCLUDE_LAST_OFFSET
21
- } from "./chunk-qh75agse.js";
22
- import {
23
- __require
24
- } from "./chunk-bmgqm774.js";
25
-
26
- // src/vue/pageHandler.ts
27
- import { readdir } from "fs/promises";
28
- import { basename, dirname } from "path";
29
- var isRecord = (value) => typeof value === "object" && value !== null;
30
- var isGenericVueComponent = (value) => typeof value === "function" || isRecord(value);
31
- var readHasIslands = (value) => {
32
- if (!isRecord(value))
33
- return false;
34
- const hasIslands = value["__ABSOLUTE_PAGE_HAS_ISLANDS__"];
35
- return typeof hasIslands === "boolean" ? hasIslands : false;
36
- };
37
- var readDefaultExport = (value) => isRecord(value) ? value.default : undefined;
38
- var resolveCurrentGeneratedVueModulePath = async (pagePath) => {
39
- const pageDirectory = dirname(pagePath);
40
- const expectedPrefix = `${basename(pagePath, ".js").split(".")[0]}.`;
41
- try {
42
- const pageEntries = await readdir(pageDirectory, {
43
- withFileTypes: true
44
- });
45
- const matchingEntry = pageEntries.find((entry) => entry.isFile() && entry.name.endsWith(".js") && (entry.name === `${expectedPrefix.slice(0, EXCLUDE_LAST_OFFSET)}.js` || entry.name.startsWith(expectedPrefix)));
46
- if (!matchingEntry) {
47
- return pagePath;
48
- }
49
- return `${pageDirectory}/${matchingEntry.name}`;
50
- } catch {
51
- return pagePath;
52
- }
53
- };
54
- var buildDirtyResponse = (headTag, indexPath, maybeProps) => {
55
- const propsScript = `window.__INITIAL_PROPS__=${JSON.stringify(maybeProps ?? {})};`;
56
- const dirtyFlag = "window.__SSR_DIRTY__=true;";
57
- const html = `<!DOCTYPE html><html>${headTag}<body><div id="root"></div>` + `<script>${propsScript}${dirtyFlag}</script>` + `<script type="module" src="${indexPath}"></script>` + `</body></html>`;
58
- return new Response(html, {
59
- headers: { "Content-Type": "text/html" }
60
- });
61
- };
62
- var primeVueStream = async (stream) => {
63
- const reader = stream.getReader();
64
- const firstChunk = await reader.read();
65
- return { firstChunk, reader };
66
- };
67
- var handleVuePageRequest = async (input) => {
68
- const passedPageComponent = input.Page;
69
- const resolvedHeadTag = input.headTag ?? "<head></head>";
70
- const resolvedIndexPath = input.indexPath;
71
- const resolvedOptions = input;
72
- const resolvedPagePath = input.pagePath;
73
- const maybeProps = input.props;
74
- if (isSsrCacheDirty("vue")) {
75
- return buildDirtyResponse(resolvedHeadTag, resolvedIndexPath, maybeProps);
76
- }
77
- try {
78
- const handlerCallsite = resolvedOptions?.collectStreamingSlots === true ? undefined : getCurrentRouteRegistrationCallsite() ?? captureStreamingSlotWarningCallsite();
79
- const renderPageResponse = async () => {
80
- const resolvePageComponent = async () => {
81
- if (isGenericVueComponent(passedPageComponent)) {
82
- return {
83
- component: passedPageComponent,
84
- hasIslands: readHasIslands(passedPageComponent)
85
- };
86
- }
87
- const generatedPagePath = await resolveCurrentGeneratedVueModulePath(resolvedPagePath);
88
- const importedPageModule = await import(generatedPagePath);
89
- const importedPageComponent = readDefaultExport(importedPageModule) ?? importedPageModule;
90
- if (!isGenericVueComponent(importedPageComponent)) {
91
- throw new Error(`Invalid Vue page module: ${generatedPagePath}`);
92
- }
93
- return {
94
- component: importedPageComponent,
95
- hasIslands: readHasIslands(importedPageModule)
96
- };
97
- };
98
- const resolvedPage = await resolvePageComponent();
99
- const { createSSRApp, h } = await import("vue");
100
- const { renderToWebStream } = await import("vue/server-renderer");
101
- const app = createSSRApp({
102
- render: () => h(resolvedPage.component, maybeProps ?? null)
103
- });
104
- const bodyStream = renderToWebStream(app);
105
- const { firstChunk, reader } = await primeVueStream(bodyStream);
106
- const head = `<!DOCTYPE html><html>${resolvedHeadTag}<body><div id="root">`;
107
- const tail = `</div><script>window.__INITIAL_PROPS__=${JSON.stringify(maybeProps ?? {})}</script><script type="module" src="${resolvedIndexPath}"></script></body></html>`;
108
- const stream = new ReadableStream({
109
- start(controller) {
110
- controller.enqueue(head);
111
- if (!firstChunk.done) {
112
- controller.enqueue(firstChunk.value);
113
- }
114
- if (firstChunk.done) {
115
- controller.enqueue(tail);
116
- controller.close();
117
- return;
118
- }
119
- const pumpLoop = () => {
120
- reader.read().then(({ done, value }) => done ? (controller.enqueue(tail), controller.close()) : (controller.enqueue(value), pumpLoop())).catch((err) => controller.error(err));
121
- };
122
- pumpLoop();
123
- }
124
- });
125
- const htmlStream = injectIslandPageContextStream(stream, {
126
- hasIslands: resolvedPage.hasIslands
127
- });
128
- return new Response(htmlStream, {
129
- headers: { "Content-Type": "text/html" }
130
- });
131
- };
132
- return await runWithStreamingSlotWarningScope(() => resolvedOptions?.collectStreamingSlots === true ? withRegisteredStreamingSlots(renderPageResponse, resolvedOptions) : renderPageResponse(), { handlerCallsite });
133
- } catch (error) {
134
- console.error("[SSR] Vue render error:", error);
135
- const pageName = derivePageName(resolvedPagePath);
136
- const conventionResponse = await renderConventionError("vue", pageName, error);
137
- if (conventionResponse)
138
- return conventionResponse;
139
- return new Response(ssrErrorPage("vue", error), {
140
- headers: { "Content-Type": "text/html" },
141
- status: 500
142
- });
143
- }
144
- };
145
-
146
- export { handleVuePageRequest };
147
-
148
- //# debugId=26E5820BE6B0DB1864756E2164756E21
149
- //# sourceMappingURL=chunk-e3r9fxaa.js.map
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/vue/pageHandler.ts"],
4
- "sourcesContent": [
5
- "import type { Component as VueComponent } from 'vue';\nimport { readdir } from 'node:fs/promises';\nimport { basename, dirname } from 'node:path';\nimport type { VuePropsOf } from '../../types/vue';\nimport { EXCLUDE_LAST_OFFSET } from '../constants';\nimport { injectIslandPageContextStream } from '../core/islandPageContext';\nimport { getCurrentRouteRegistrationCallsite } from '../core/devRouteRegistrationCallsite';\nimport {\n\ttype StreamingSlotEnhancerOptions,\n\twithRegisteredStreamingSlots\n} from '../core/responseEnhancers';\nimport {\n\tcaptureStreamingSlotWarningCallsite,\n\trunWithStreamingSlotWarningScope\n} from '../core/streamingSlotWarningScope';\nimport { isSsrCacheDirty, markSsrCacheDirty } from '../core/ssrCache';\nimport { ssrErrorPage } from '../utils/ssrErrorPage';\nimport {\n\tderivePageName,\n\trenderConventionError\n} from '../utils/resolveConvention';\n\ntype VuePageRenderOptions = StreamingSlotEnhancerOptions & {\n\tcollectStreamingSlots?: boolean;\n};\nexport type VuePageRequestInput<Component extends VueComponent> =\n\tVuePageRenderOptions & {\n\t\theadTag?: `<head>${string}</head>`;\n\t\tindexPath: string;\n\t\tpagePath: string;\n\t\tPage?: Component;\n\t} & (keyof VuePropsOf<Component> extends never\n\t\t\t? { props?: NoInfer<VuePropsOf<Component>> }\n\t\t\t: { props: NoInfer<VuePropsOf<Component>> });\ntype GenericVueComponent = VueComponent;\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null;\n\nconst isGenericVueComponent = (value: unknown): value is GenericVueComponent =>\n\ttypeof value === 'function' || isRecord(value);\n\nconst readHasIslands = (value: unknown) => {\n\tif (!isRecord(value)) return false;\n\tconst hasIslands = value['__ABSOLUTE_PAGE_HAS_ISLANDS__'];\n\n\treturn typeof hasIslands === 'boolean' ? hasIslands : false;\n};\n\nconst readDefaultExport = (value: unknown) =>\n\tisRecord(value) ? value.default : undefined;\n\nconst resolveCurrentGeneratedVueModulePath = async (pagePath: string) => {\n\tconst pageDirectory = dirname(pagePath);\n\tconst expectedPrefix = `${basename(pagePath, '.js').split('.')[0]}.`;\n\n\ttry {\n\t\tconst pageEntries = await readdir(pageDirectory, {\n\t\t\twithFileTypes: true\n\t\t});\n\t\tconst matchingEntry = pageEntries.find(\n\t\t\t(entry) =>\n\t\t\t\tentry.isFile() &&\n\t\t\t\tentry.name.endsWith('.js') &&\n\t\t\t\t(entry.name ===\n\t\t\t\t\t`${expectedPrefix.slice(0, EXCLUDE_LAST_OFFSET)}.js` ||\n\t\t\t\t\tentry.name.startsWith(expectedPrefix))\n\t\t);\n\t\tif (!matchingEntry) {\n\t\t\treturn pagePath;\n\t\t}\n\n\t\treturn `${pageDirectory}/${matchingEntry.name}`;\n\t} catch {\n\t\treturn pagePath;\n\t}\n};\n\nconst buildDirtyResponse = (\n\theadTag: string,\n\tindexPath: string,\n\tmaybeProps: Record<string, unknown> | undefined\n) => {\n\tconst propsScript = `window.__INITIAL_PROPS__=${JSON.stringify(maybeProps ?? {})};`;\n\tconst dirtyFlag = 'window.__SSR_DIRTY__=true;';\n\tconst html =\n\t\t`<!DOCTYPE html><html>${headTag}<body><div id=\"root\"></div>` +\n\t\t`<script>${propsScript}${dirtyFlag}</script>` +\n\t\t`<script type=\"module\" src=\"${indexPath}\"></script>` +\n\t\t`</body></html>`;\n\n\treturn new Response(html, {\n\t\theaders: { 'Content-Type': 'text/html' }\n\t});\n};\n\nconst primeVueStream = async (stream: ReadableStream) => {\n\tconst reader = stream.getReader();\n\tconst firstChunk = await reader.read();\n\n\treturn { firstChunk, reader };\n};\n\nexport const handleVuePageRequest = async <Component extends VueComponent>(\n\tinput: VuePageRequestInput<Component>\n) => {\n\tconst passedPageComponent = input.Page;\n\tconst resolvedHeadTag = input.headTag ?? '<head></head>';\n\tconst resolvedIndexPath = input.indexPath;\n\tconst resolvedOptions = input;\n\tconst resolvedPagePath = input.pagePath;\n\tconst maybeProps = input.props;\n\n\tif (isSsrCacheDirty('vue')) {\n\t\treturn buildDirtyResponse(\n\t\t\tresolvedHeadTag,\n\t\t\tresolvedIndexPath,\n\t\t\tmaybeProps\n\t\t);\n\t}\n\n\ttry {\n\t\tconst handlerCallsite =\n\t\t\tresolvedOptions?.collectStreamingSlots === true\n\t\t\t\t? undefined\n\t\t\t\t: (getCurrentRouteRegistrationCallsite() ??\n\t\t\t\t\tcaptureStreamingSlotWarningCallsite());\n\t\tconst renderPageResponse = async () => {\n\t\t\tconst resolvePageComponent = async () => {\n\t\t\t\tif (isGenericVueComponent(passedPageComponent)) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcomponent: passedPageComponent,\n\t\t\t\t\t\thasIslands: readHasIslands(passedPageComponent)\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst generatedPagePath =\n\t\t\t\t\tawait resolveCurrentGeneratedVueModulePath(\n\t\t\t\t\t\tresolvedPagePath\n\t\t\t\t\t);\n\t\t\t\tconst importedPageModule: unknown = await import(\n\t\t\t\t\tgeneratedPagePath\n\t\t\t\t);\n\t\t\t\tconst importedPageComponent =\n\t\t\t\t\treadDefaultExport(importedPageModule) ?? importedPageModule;\n\t\t\t\tif (!isGenericVueComponent(importedPageComponent)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Invalid Vue page module: ${generatedPagePath}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcomponent: importedPageComponent,\n\t\t\t\t\thasIslands: readHasIslands(importedPageModule)\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tconst resolvedPage = await resolvePageComponent();\n\t\t\tconst { createSSRApp, h } = await import('vue');\n\t\t\tconst { renderToWebStream } = await import('vue/server-renderer');\n\n\t\t\tconst app = createSSRApp({\n\t\t\t\trender: () => h(resolvedPage.component, maybeProps ?? null)\n\t\t\t});\n\n\t\t\tconst bodyStream = renderToWebStream(app);\n\t\t\tconst { firstChunk, reader } = await primeVueStream(bodyStream);\n\n\t\t\tconst head = `<!DOCTYPE html><html>${resolvedHeadTag}<body><div id=\"root\">`;\n\t\t\tconst tail = `</div><script>window.__INITIAL_PROPS__=${JSON.stringify(\n\t\t\t\tmaybeProps ?? {}\n\t\t\t)}</script><script type=\"module\" src=\"${resolvedIndexPath}\"></script></body></html>`;\n\n\t\t\tconst stream = new ReadableStream({\n\t\t\t\tstart(controller) {\n\t\t\t\t\tcontroller.enqueue(head);\n\t\t\t\t\tif (!firstChunk.done) {\n\t\t\t\t\t\tcontroller.enqueue(firstChunk.value);\n\t\t\t\t\t}\n\t\t\t\t\tif (firstChunk.done) {\n\t\t\t\t\t\tcontroller.enqueue(tail);\n\t\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst pumpLoop = () => {\n\t\t\t\t\t\treader\n\t\t\t\t\t\t\t.read()\n\t\t\t\t\t\t\t.then(({ done, value }) =>\n\t\t\t\t\t\t\t\tdone\n\t\t\t\t\t\t\t\t\t? (controller.enqueue(tail),\n\t\t\t\t\t\t\t\t\t\tcontroller.close())\n\t\t\t\t\t\t\t\t\t: (controller.enqueue(value), pumpLoop())\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.catch((err) => controller.error(err));\n\t\t\t\t\t};\n\t\t\t\t\tpumpLoop();\n\t\t\t\t}\n\t\t\t});\n\t\t\tconst htmlStream = injectIslandPageContextStream(stream, {\n\t\t\t\thasIslands: resolvedPage.hasIslands\n\t\t\t});\n\n\t\t\treturn new Response(htmlStream, {\n\t\t\t\theaders: { 'Content-Type': 'text/html' }\n\t\t\t});\n\t\t};\n\n\t\treturn await runWithStreamingSlotWarningScope(\n\t\t\t() =>\n\t\t\t\tresolvedOptions?.collectStreamingSlots === true\n\t\t\t\t\t? withRegisteredStreamingSlots(\n\t\t\t\t\t\t\trenderPageResponse,\n\t\t\t\t\t\t\tresolvedOptions\n\t\t\t\t\t\t)\n\t\t\t\t\t: renderPageResponse(),\n\t\t\t{ handlerCallsite }\n\t\t);\n\t} catch (error) {\n\t\tconsole.error('[SSR] Vue render error:', error);\n\n\t\tconst pageName = derivePageName(resolvedPagePath);\n\t\tconst conventionResponse = await renderConventionError(\n\t\t\t'vue',\n\t\t\tpageName,\n\t\t\terror\n\t\t);\n\t\tif (conventionResponse) return conventionResponse;\n\n\t\treturn new Response(ssrErrorPage('vue', error), {\n\t\t\theaders: { 'Content-Type': 'text/html' },\n\t\t\tstatus: 500\n\t\t});\n\t}\n};\n\nexport const invalidateVueSsrCache = () => {\n\tmarkSsrCacheDirty('vue');\n};\n"
6
- ],
7
- "mappings": "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",
8
- "debugId": "26E5820BE6B0DB1864756E2164756E21",
9
- "names": []
10
- }
@@ -1,244 +0,0 @@
1
- // @bun
2
- import {
3
- validateSafePath
4
- } from "./chunk-cg95827x.js";
5
- import"./chunk-hyjs4bqs.js";
6
- import {
7
- DEFAULT_DEVICE_SIZES,
8
- DEFAULT_IMAGE_SIZES,
9
- DEFAULT_QUALITY,
10
- OPTIMIZATION_ENDPOINT,
11
- formatToMime,
12
- getCacheDir,
13
- getCacheKey,
14
- isCacheStale,
15
- matchRemotePattern,
16
- negotiateFormat,
17
- optimizeImage,
18
- readFromCache,
19
- writeToCache
20
- } from "./chunk-kk8w9rh5.js";
21
- import"./chunk-qh75agse.js";
22
- import"./chunk-bmgqm774.js";
23
-
24
- // src/plugins/imageOptimizer.ts
25
- import { existsSync } from "fs";
26
- import { resolve } from "path";
27
- import { Elysia } from "elysia";
28
- var DEFAULT_CACHE_TTL_SECONDS = 60;
29
- var MS_PER_SECOND = 1000;
30
- var MAX_QUALITY = 100;
31
- var avifInProgress = new Set;
32
- var safeResolve = (path, baseDir) => {
33
- try {
34
- const resolved = validateSafePath(path, baseDir);
35
- if (existsSync(resolved))
36
- return resolved;
37
- return null;
38
- } catch {
39
- return null;
40
- }
41
- };
42
- var resolveLocalImage = (url, buildDir) => {
43
- const cleanPath = url.startsWith("/") ? url.slice(1) : url;
44
- return safeResolve(cleanPath, buildDir) ?? safeResolve(cleanPath, resolve(process.cwd()));
45
- };
46
- var parseQueryParams = (query, allowedSizes, defaultQuality) => {
47
- const url = typeof query["url"] === "string" ? query["url"] : undefined;
48
- const wParam = typeof query["w"] === "string" ? query["w"] : undefined;
49
- const qParam = typeof query["q"] === "string" ? query["q"] : undefined;
50
- if (!url || !wParam) {
51
- return {
52
- error: new Response("Missing required params: url, w", {
53
- status: 400
54
- })
55
- };
56
- }
57
- const width = parseInt(wParam, 10);
58
- if (isNaN(width) || !allowedSizes.has(width)) {
59
- return {
60
- error: new Response(`Invalid width: ${wParam}. Must be one of: ${[...allowedSizes].sort((left, right) => left - right).join(", ")}`, { status: 400 })
61
- };
62
- }
63
- const quality = qParam ? parseInt(qParam, 10) : defaultQuality;
64
- if (isNaN(quality) || quality < 1 || quality > MAX_QUALITY) {
65
- return {
66
- error: new Response("Invalid quality: must be 1-100", {
67
- status: 400
68
- })
69
- };
70
- }
71
- return { params: { quality, url, width } };
72
- };
73
- var validateImageSecurity = (url, remotePatterns, buildDir) => {
74
- const isRemote = url.startsWith("http://") || url.startsWith("https://");
75
- if (isRemote) {
76
- if (remotePatterns.length === 0 || !matchRemotePattern(url, remotePatterns)) {
77
- return {
78
- error: new Response("Remote image not allowed. Configure remotePatterns in images config.", { status: 400 }),
79
- isRemote
80
- };
81
- }
82
- return { isRemote, resolvedPath: null };
83
- }
84
- const resolvedPath = resolveLocalImage(url, buildDir);
85
- if (!resolvedPath) {
86
- return {
87
- error: new Response(`Image not found: ${url}`, { status: 404 }),
88
- isRemote
89
- };
90
- }
91
- return { isRemote, resolvedPath };
92
- };
93
- var fetchSourceImage = async (url, isRemote, resolvedPath) => {
94
- if (isRemote) {
95
- const response = await fetch(url);
96
- if (!response.ok) {
97
- return {
98
- error: new Response(`Failed to fetch remote image: ${response.status}`, { status: 502 })
99
- };
100
- }
101
- return {
102
- buffer: Buffer.from(await response.arrayBuffer()),
103
- upstreamEtag: response.headers.get("ETag") ?? undefined
104
- };
105
- }
106
- if (!resolvedPath) {
107
- return {
108
- error: new Response(`Image not found: ${url}`, { status: 404 })
109
- };
110
- }
111
- const file = Bun.file(resolvedPath);
112
- if (!await file.exists()) {
113
- return {
114
- error: new Response(`Image not found: ${url}`, { status: 404 })
115
- };
116
- }
117
- return {
118
- buffer: Buffer.from(await file.arrayBuffer()),
119
- upstreamEtag: undefined
120
- };
121
- };
122
- var scheduleAvifPregen = (url, width, quality, sourceBuffer, configuredFormats, format, cacheDir, minimumCacheTTL, upstreamEtag) => {
123
- if (!configuredFormats.includes("avif") || format === "avif") {
124
- return;
125
- }
126
- const avifKey = `${url}|${width}|${quality}`;
127
- if (avifInProgress.has(avifKey))
128
- return;
129
- const avifCacheKey = getCacheKey(url, width, quality, "avif");
130
- const avifCached = readFromCache(cacheDir, avifCacheKey);
131
- if (avifCached && !isCacheStale(avifCached.meta))
132
- return;
133
- avifInProgress.add(avifKey);
134
- queueMicrotask(async () => {
135
- try {
136
- const avifBuffer = await optimizeImage(sourceBuffer, width, quality, "avif");
137
- const avifMeta = {
138
- contentType: "image/avif",
139
- etag: `"${avifCacheKey}"`,
140
- expireAt: Date.now() + minimumCacheTTL,
141
- upstreamEtag
142
- };
143
- writeToCache(cacheDir, avifCacheKey, avifBuffer, avifMeta);
144
- } catch {} finally {
145
- avifInProgress.delete(avifKey);
146
- }
147
- });
148
- };
149
- var imageOptimizer = (config, buildDir) => {
150
- const plugin = new Elysia({ name: "image-optimizer" });
151
- if (!config && config !== undefined)
152
- return plugin;
153
- if (config?.unoptimized)
154
- return plugin;
155
- const endpointPath = config?.path ?? OPTIMIZATION_ENDPOINT;
156
- const allowedSizes = new Set([
157
- ...config?.deviceSizes ?? DEFAULT_DEVICE_SIZES,
158
- ...config?.imageSizes ?? DEFAULT_IMAGE_SIZES
159
- ]);
160
- const defaultQuality = config?.quality ?? DEFAULT_QUALITY;
161
- const minimumCacheTTL = (config?.minimumCacheTTL ?? DEFAULT_CACHE_TTL_SECONDS) * MS_PER_SECOND;
162
- const cacheControlHeader = `public, max-age=${Math.ceil(minimumCacheTTL / MS_PER_SECOND)}, must-revalidate`;
163
- const configuredFormats = config?.formats ?? ["webp"];
164
- const remotePatterns = config?.remotePatterns ?? [];
165
- const cacheDir = getCacheDir(buildDir);
166
- return plugin.get(endpointPath, async ({ query, request }) => {
167
- const parsed = parseQueryParams(query, allowedSizes, defaultQuality);
168
- if ("error" in parsed)
169
- return parsed.error;
170
- const { quality, url, width } = parsed.params;
171
- const security = validateImageSecurity(url, remotePatterns, buildDir);
172
- if ("error" in security)
173
- return security.error;
174
- const { isRemote, resolvedPath } = security;
175
- const acceptHeader = request.headers.get("Accept") ?? "";
176
- const format = negotiateFormat(acceptHeader, configuredFormats);
177
- const mime = formatToMime(format);
178
- const cacheKey = getCacheKey(url, width, quality, format);
179
- const cached = readFromCache(cacheDir, cacheKey);
180
- if (cached && !isCacheStale(cached.meta)) {
181
- const ifNoneMatch = request.headers.get("If-None-Match");
182
- if (ifNoneMatch && ifNoneMatch === cached.meta.etag) {
183
- return new Response(null, {
184
- headers: {
185
- "Cache-Control": cacheControlHeader,
186
- ETag: cached.meta.etag,
187
- Vary: "Accept"
188
- },
189
- status: 304
190
- });
191
- }
192
- return new Response(new Uint8Array(cached.buffer), {
193
- headers: {
194
- "Cache-Control": cacheControlHeader,
195
- "Content-Type": cached.meta.contentType,
196
- ETag: cached.meta.etag,
197
- Vary: "Accept"
198
- }
199
- });
200
- }
201
- let sourceBuffer;
202
- let upstreamEtag;
203
- try {
204
- const source = await fetchSourceImage(url, isRemote, resolvedPath ?? null);
205
- if ("error" in source)
206
- return source.error;
207
- sourceBuffer = source.buffer;
208
- ({ upstreamEtag } = source);
209
- } catch (err) {
210
- return new Response(`Failed to load image: ${err instanceof Error ? err.message : "unknown error"}`, { status: 500 });
211
- }
212
- let optimizedBuffer;
213
- try {
214
- optimizedBuffer = await optimizeImage(sourceBuffer, width, quality, format);
215
- } catch {
216
- optimizedBuffer = sourceBuffer;
217
- }
218
- const etag = `"${cacheKey}"`;
219
- const meta = {
220
- contentType: mime,
221
- etag,
222
- expireAt: Date.now() + minimumCacheTTL,
223
- upstreamEtag
224
- };
225
- try {
226
- writeToCache(cacheDir, cacheKey, optimizedBuffer, meta);
227
- } catch {}
228
- scheduleAvifPregen(url, width, quality, sourceBuffer, configuredFormats, format, cacheDir, minimumCacheTTL, upstreamEtag);
229
- return new Response(new Uint8Array(optimizedBuffer), {
230
- headers: {
231
- "Cache-Control": cacheControlHeader,
232
- "Content-Type": mime,
233
- ETag: etag,
234
- Vary: "Accept"
235
- }
236
- });
237
- });
238
- };
239
- export {
240
- imageOptimizer
241
- };
242
-
243
- //# debugId=6A88C49F9E6C16C364756E2164756E21
244
- //# sourceMappingURL=chunk-e8eecyrq.js.map
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/plugins/imageOptimizer.ts"],
4
- "sourcesContent": [
5
- "import { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { Elysia } from 'elysia';\nimport type { ImageConfig, ImageFormat } from '../../types/image';\nimport {\n\ttype CacheMeta,\n\tDEFAULT_DEVICE_SIZES,\n\tDEFAULT_IMAGE_SIZES,\n\tDEFAULT_QUALITY,\n\tOPTIMIZATION_ENDPOINT,\n\tformatToMime,\n\tgetCacheDir,\n\tgetCacheKey,\n\tisCacheStale,\n\tmatchRemotePattern,\n\tnegotiateFormat,\n\toptimizeImage,\n\treadFromCache,\n\twriteToCache\n} from '../utils/imageProcessing';\nimport { validateSafePath } from '../utils/validateSafePath';\n\n/** Default cache TTL in seconds */\nconst DEFAULT_CACHE_TTL_SECONDS = 60;\n\n/** Milliseconds per second */\nconst MS_PER_SECOND = 1000;\n\n/** Maximum image quality value */\nconst MAX_QUALITY = 100;\n\n/** Set of AVIF cache keys currently being generated to avoid duplicate work */\nconst avifInProgress = new Set<string>();\n\n/** Try to resolve a path safely against a base directory, returning null if the file doesn't exist */\nconst safeResolve = (path: string, baseDir: string) => {\n\ttry {\n\t\tconst resolved = validateSafePath(path, baseDir);\n\n\t\tif (existsSync(resolved)) return resolved;\n\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n};\n\n/** Resolve a local image path against build dir and project root */\nconst resolveLocalImage = (url: string, buildDir: string) => {\n\tconst cleanPath = url.startsWith('/') ? url.slice(1) : url;\n\n\treturn (\n\t\tsafeResolve(cleanPath, buildDir) ??\n\t\tsafeResolve(cleanPath, resolve(process.cwd()))\n\t);\n};\n\n/** Parse and validate query parameters, returning an error Response or valid params */\nconst parseQueryParams = (\n\tquery: Record<string, string | undefined>,\n\tallowedSizes: Set<number>,\n\tdefaultQuality: number\n) => {\n\tconst url = typeof query['url'] === 'string' ? query['url'] : undefined;\n\tconst wParam = typeof query['w'] === 'string' ? query['w'] : undefined;\n\tconst qParam = typeof query['q'] === 'string' ? query['q'] : undefined;\n\n\tif (!url || !wParam) {\n\t\treturn {\n\t\t\terror: new Response('Missing required params: url, w', {\n\t\t\t\tstatus: 400\n\t\t\t})\n\t\t};\n\t}\n\n\tconst width = parseInt(wParam, 10);\n\tif (isNaN(width) || !allowedSizes.has(width)) {\n\t\treturn {\n\t\t\terror: new Response(\n\t\t\t\t`Invalid width: ${wParam}. Must be one of: ${[...allowedSizes].sort((left, right) => left - right).join(', ')}`,\n\t\t\t\t{ status: 400 }\n\t\t\t)\n\t\t};\n\t}\n\n\tconst quality = qParam ? parseInt(qParam, 10) : defaultQuality;\n\tif (isNaN(quality) || quality < 1 || quality > MAX_QUALITY) {\n\t\treturn {\n\t\t\terror: new Response('Invalid quality: must be 1-100', {\n\t\t\t\tstatus: 400\n\t\t\t})\n\t\t};\n\t}\n\n\treturn { params: { quality, url, width } };\n};\n\n/** Validate security for the given image URL */\nconst validateImageSecurity = (\n\turl: string,\n\tremotePatterns: ImageConfig['remotePatterns'] & object,\n\tbuildDir: string\n) => {\n\tconst isRemote = url.startsWith('http://') || url.startsWith('https://');\n\n\tif (isRemote) {\n\t\tif (\n\t\t\tremotePatterns.length === 0 ||\n\t\t\t!matchRemotePattern(url, remotePatterns)\n\t\t) {\n\t\t\treturn {\n\t\t\t\terror: new Response(\n\t\t\t\t\t'Remote image not allowed. Configure remotePatterns in images config.',\n\t\t\t\t\t{ status: 400 }\n\t\t\t\t),\n\t\t\t\tisRemote\n\t\t\t};\n\t\t}\n\n\t\treturn { isRemote, resolvedPath: null };\n\t}\n\n\tconst resolvedPath = resolveLocalImage(url, buildDir);\n\tif (!resolvedPath) {\n\t\treturn {\n\t\t\terror: new Response(`Image not found: ${url}`, { status: 404 }),\n\t\t\tisRemote\n\t\t};\n\t}\n\n\treturn { isRemote, resolvedPath };\n};\n\n/** Fetch the source image buffer from remote URL or local file */\nconst fetchSourceImage = async (\n\turl: string,\n\tisRemote: boolean,\n\tresolvedPath: string | null\n) => {\n\tif (isRemote) {\n\t\tconst response = await fetch(url);\n\t\tif (!response.ok) {\n\t\t\treturn {\n\t\t\t\terror: new Response(\n\t\t\t\t\t`Failed to fetch remote image: ${response.status}`,\n\t\t\t\t\t{ status: 502 }\n\t\t\t\t)\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: Buffer.from(await response.arrayBuffer()),\n\t\t\tupstreamEtag: response.headers.get('ETag') ?? undefined\n\t\t};\n\t}\n\n\tif (!resolvedPath) {\n\t\treturn {\n\t\t\terror: new Response(`Image not found: ${url}`, { status: 404 })\n\t\t};\n\t}\n\n\tconst file = Bun.file(resolvedPath);\n\tif (!(await file.exists())) {\n\t\treturn {\n\t\t\terror: new Response(`Image not found: ${url}`, { status: 404 })\n\t\t};\n\t}\n\n\treturn {\n\t\tbuffer: Buffer.from(await file.arrayBuffer()),\n\t\tupstreamEtag: undefined\n\t};\n};\n\n/** Schedule AVIF pre-generation in the background */\nconst scheduleAvifPregen = (\n\turl: string,\n\twidth: number,\n\tquality: number,\n\tsourceBuffer: Buffer,\n\tconfiguredFormats: ImageFormat[],\n\tformat: ImageFormat,\n\tcacheDir: string,\n\tminimumCacheTTL: number,\n\tupstreamEtag: string | undefined\n) => {\n\tif (!configuredFormats.includes('avif') || format === 'avif') {\n\t\treturn;\n\t}\n\n\tconst avifKey = `${url}|${width}|${quality}`;\n\tif (avifInProgress.has(avifKey)) return;\n\n\tconst avifCacheKey = getCacheKey(url, width, quality, 'avif');\n\tconst avifCached = readFromCache(cacheDir, avifCacheKey);\n\tif (avifCached && !isCacheStale(avifCached.meta)) return;\n\n\tavifInProgress.add(avifKey);\n\tqueueMicrotask(async () => {\n\t\ttry {\n\t\t\tconst avifBuffer = await optimizeImage(\n\t\t\t\tsourceBuffer,\n\t\t\t\twidth,\n\t\t\t\tquality,\n\t\t\t\t'avif'\n\t\t\t);\n\t\t\tconst avifMeta: CacheMeta = {\n\t\t\t\tcontentType: 'image/avif',\n\t\t\t\tetag: `\"${avifCacheKey}\"`,\n\t\t\t\texpireAt: Date.now() + minimumCacheTTL,\n\t\t\t\tupstreamEtag\n\t\t\t};\n\t\t\twriteToCache(cacheDir, avifCacheKey, avifBuffer, avifMeta);\n\t\t} catch {\n\t\t\t// AVIF generation failure is non-fatal\n\t\t} finally {\n\t\t\tavifInProgress.delete(avifKey);\n\t\t}\n\t});\n};\n\nexport const imageOptimizer = (\n\tconfig: ImageConfig | undefined,\n\tbuildDir: string\n) => {\n\tconst plugin = new Elysia({ name: 'image-optimizer' });\n\n\t// No-op if disabled or no config\n\tif (!config && config !== undefined) return plugin;\n\tif (config?.unoptimized) return plugin;\n\n\tconst endpointPath = config?.path ?? OPTIMIZATION_ENDPOINT;\n\tconst allowedSizes = new Set([\n\t\t...(config?.deviceSizes ?? DEFAULT_DEVICE_SIZES),\n\t\t...(config?.imageSizes ?? DEFAULT_IMAGE_SIZES)\n\t]);\n\tconst defaultQuality = config?.quality ?? DEFAULT_QUALITY;\n\tconst minimumCacheTTL =\n\t\t(config?.minimumCacheTTL ?? DEFAULT_CACHE_TTL_SECONDS) * MS_PER_SECOND;\n\tconst cacheControlHeader = `public, max-age=${Math.ceil(minimumCacheTTL / MS_PER_SECOND)}, must-revalidate`;\n\tconst configuredFormats: ImageFormat[] = config?.formats ?? ['webp'];\n\tconst remotePatterns = config?.remotePatterns ?? [];\n\tconst cacheDir = getCacheDir(buildDir);\n\n\treturn plugin.get(endpointPath, async ({ query, request }) => {\n\t\t// ── Parse & Validate ────────────────────────────────\n\t\tconst parsed = parseQueryParams(query, allowedSizes, defaultQuality);\n\t\tif ('error' in parsed) return parsed.error;\n\t\tconst { quality, url, width } = parsed.params;\n\n\t\t// ── Security ────────────────────────────────────────\n\t\tconst security = validateImageSecurity(url, remotePatterns, buildDir);\n\t\tif ('error' in security) return security.error;\n\t\tconst { isRemote, resolvedPath } = security;\n\n\t\t// ── Content Negotiation ─────────────────────────────\n\t\tconst acceptHeader = request.headers.get('Accept') ?? '';\n\t\tconst format = negotiateFormat(acceptHeader, configuredFormats);\n\t\tconst mime = formatToMime(format);\n\n\t\t// ── Cache Lookup ────────────────────────────────────\n\t\tconst cacheKey = getCacheKey(url, width, quality, format);\n\t\tconst cached = readFromCache(cacheDir, cacheKey);\n\n\t\tif (cached && !isCacheStale(cached.meta)) {\n\t\t\tconst ifNoneMatch = request.headers.get('If-None-Match');\n\t\t\tif (ifNoneMatch && ifNoneMatch === cached.meta.etag) {\n\t\t\t\treturn new Response(null, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'Cache-Control': cacheControlHeader,\n\t\t\t\t\t\tETag: cached.meta.etag,\n\t\t\t\t\t\tVary: 'Accept'\n\t\t\t\t\t},\n\t\t\t\t\tstatus: 304\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn new Response(new Uint8Array(cached.buffer), {\n\t\t\t\theaders: {\n\t\t\t\t\t'Cache-Control': cacheControlHeader,\n\t\t\t\t\t'Content-Type': cached.meta.contentType,\n\t\t\t\t\tETag: cached.meta.etag,\n\t\t\t\t\tVary: 'Accept'\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// ── Fetch Source ────────────────────────────────────\n\t\tlet sourceBuffer: Buffer;\n\t\tlet upstreamEtag: string | undefined;\n\n\t\ttry {\n\t\t\tconst source = await fetchSourceImage(\n\t\t\t\turl,\n\t\t\t\tisRemote,\n\t\t\t\tresolvedPath ?? null\n\t\t\t);\n\t\t\tif ('error' in source) return source.error;\n\t\t\tsourceBuffer = source.buffer;\n\t\t\t({ upstreamEtag } = source);\n\t\t} catch (err) {\n\t\t\treturn new Response(\n\t\t\t\t`Failed to load image: ${err instanceof Error ? err.message : 'unknown error'}`,\n\t\t\t\t{ status: 500 }\n\t\t\t);\n\t\t}\n\n\t\t// ── Optimize ────────────────────────────────────────\n\t\tlet optimizedBuffer: Buffer;\n\t\ttry {\n\t\t\toptimizedBuffer = await optimizeImage(\n\t\t\t\tsourceBuffer,\n\t\t\t\twidth,\n\t\t\t\tquality,\n\t\t\t\tformat\n\t\t\t);\n\t\t} catch {\n\t\t\t// Graceful degradation: serve original\n\t\t\toptimizedBuffer = sourceBuffer;\n\t\t}\n\n\t\t// ── Cache Write ─────────────────────────────────────\n\t\tconst etag = `\"${cacheKey}\"`;\n\t\tconst meta: CacheMeta = {\n\t\t\tcontentType: mime,\n\t\t\tetag,\n\t\t\texpireAt: Date.now() + minimumCacheTTL,\n\t\t\tupstreamEtag\n\t\t};\n\n\t\ttry {\n\t\t\twriteToCache(cacheDir, cacheKey, optimizedBuffer, meta);\n\t\t} catch {\n\t\t\t// Cache write failure is non-fatal\n\t\t}\n\n\t\t// ── AVIF Async Pre-generation ───────────────────────\n\t\tscheduleAvifPregen(\n\t\t\turl,\n\t\t\twidth,\n\t\t\tquality,\n\t\t\tsourceBuffer,\n\t\t\tconfiguredFormats,\n\t\t\tformat,\n\t\t\tcacheDir,\n\t\t\tminimumCacheTTL,\n\t\t\tupstreamEtag\n\t\t);\n\n\t\t// ── Response ────────────────────────────────────────\n\t\treturn new Response(new Uint8Array(optimizedBuffer), {\n\t\t\theaders: {\n\t\t\t\t'Cache-Control': cacheControlHeader,\n\t\t\t\t'Content-Type': mime,\n\t\t\t\tETag: etag,\n\t\t\t\tVary: 'Accept'\n\t\t\t}\n\t\t});\n\t});\n};\n"
6
- ],
7
- "mappings": "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",
8
- "debugId": "6A88C49F9E6C16C364756E2164756E21",
9
- "names": []
10
- }
@@ -1,160 +0,0 @@
1
- // @bun
2
- import {
3
- getMimeType,
4
- handleClientConnect,
5
- handleClientDisconnect,
6
- handleHMRMessage,
7
- lookupAsset
8
- } from "./chunk-vkrpm7kc.js";
9
- import"./chunk-h5bbfn3n.js";
10
- import"./chunk-cbkrwmvh.js";
11
- import"./chunk-gf0ygptk.js";
12
- import {
13
- UNFOUND_INDEX
14
- } from "./chunk-qh75agse.js";
15
- import {
16
- __require
17
- } from "./chunk-bmgqm774.js";
18
-
19
- // src/plugins/hmr.ts
20
- import Elysia from "elysia";
21
-
22
- // src/react/bridgeInternals.ts
23
- var INTERNALS_KEYS = [
24
- "__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE",
25
- "__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED"
26
- ];
27
- var isRecord = (val) => typeof val === "object" && val !== null;
28
- var findInternals = (mod) => {
29
- for (const key of INTERNALS_KEYS) {
30
- const val = mod[key];
31
- if (isRecord(val))
32
- return val;
33
- }
34
- return;
35
- };
36
- var bridgeReactInternals = async () => {
37
- const pinnedRef = globalThis.__reactModuleRef;
38
- if (!isRecord(pinnedRef))
39
- return;
40
- const react = await import("react");
41
- if (pinnedRef === react)
42
- return;
43
- const pinnedInternals = findInternals(pinnedRef);
44
- const currentInternals = findInternals(react);
45
- if (!pinnedInternals || !currentInternals || pinnedInternals === currentInternals)
46
- return;
47
- for (const prop of Object.keys(pinnedInternals)) {
48
- Object.defineProperty(currentInternals, prop, {
49
- configurable: true,
50
- enumerable: true,
51
- get() {
52
- return pinnedInternals[prop];
53
- },
54
- set(value) {
55
- pinnedInternals[prop] = value;
56
- }
57
- });
58
- }
59
- };
60
-
61
- // src/plugins/hmr.ts
62
- var STORE_KEY = "__elysiaStore";
63
- var getGlobalValue = (key) => Reflect.get(globalThis, key);
64
- var restoreStore = (store) => {
65
- const saved = getGlobalValue(STORE_KEY);
66
- if (saved && typeof saved === "object") {
67
- restoreSavedStoreValues(store, saved);
68
- }
69
- if (store && typeof store === "object") {
70
- Reflect.set(globalThis, STORE_KEY, store);
71
- }
72
- };
73
- var restoreSavedStoreValues = (store, saved) => {
74
- if (!store || typeof store !== "object") {
75
- return;
76
- }
77
- Object.entries(saved).forEach(([key, value]) => {
78
- Reflect.set(store, key, value);
79
- });
80
- };
81
- var resolveModuleResponse = (moduleResponse, ifNoneMatch) => {
82
- const etag = moduleResponse.headers.get("ETag");
83
- if (etag && ifNoneMatch === etag) {
84
- return new Response(null, { headers: { ETag: etag }, status: 304 });
85
- }
86
- return moduleResponse;
87
- };
88
- var resolveRequestPathname = (request) => {
89
- const rawUrl = request.url;
90
- const qIdx = rawUrl.indexOf("?");
91
- const pathEnd = qIdx === UNFOUND_INDEX ? rawUrl.length : qIdx;
92
- const pathStart = rawUrl.indexOf("/", rawUrl.indexOf("//") + 2);
93
- return rawUrl.slice(pathStart, pathEnd);
94
- };
95
- var resolveDevAssetResponse = async (request, hmrState, moduleServerHandler) => {
96
- const pathname = resolveRequestPathname(request);
97
- if (moduleServerHandler) {
98
- const moduleResponse = await moduleServerHandler(pathname);
99
- if (moduleResponse) {
100
- return resolveModuleResponse(moduleResponse, request.headers.get("If-None-Match"));
101
- }
102
- }
103
- const bytes = lookupAsset(hmrState.assetStore, pathname);
104
- if (bytes) {
105
- return new Response(new Uint8Array(bytes).buffer, {
106
- headers: {
107
- "Cache-Control": "no-cache",
108
- "Content-Type": getMimeType(pathname)
109
- }
110
- });
111
- }
112
- const aliasedTarget = resolveHashlessAlias(hmrState, pathname);
113
- if (aliasedTarget) {
114
- return new Response(null, {
115
- headers: {
116
- "Cache-Control": "no-cache",
117
- Location: aliasedTarget
118
- },
119
- status: 302
120
- });
121
- }
122
- return;
123
- };
124
- var HASHLESS_INDEX_PATH_PATTERN = /^(\/[^/]+)?\/indexes\/([^/.]+)\/?$/;
125
- var resolveHashlessAlias = (hmrState, pathname) => {
126
- const match = pathname.match(HASHLESS_INDEX_PATH_PATTERN);
127
- if (!match)
128
- return null;
129
- const prefix = `${match[1] ?? ""}/indexes/${match[2]}.`;
130
- for (const candidate of hmrState.assetStore.keys()) {
131
- if (candidate.startsWith(prefix))
132
- return candidate;
133
- }
134
- return null;
135
- };
136
- var hmr = (hmrState, manifest, moduleServerHandler) => new Elysia({ name: "absolutejs-hmr" }).onStart(({ store }) => {
137
- restoreStore(store);
138
- }).onRequest(async ({ request }) => {
139
- if (globalThis.__reactModuleRef) {
140
- await bridgeReactInternals();
141
- }
142
- return resolveDevAssetResponse(request, hmrState, moduleServerHandler);
143
- }).get("/@src/*", ({ request }) => resolveDevAssetResponse(request, hmrState, moduleServerHandler)).get("/@stub/*", ({ request }) => resolveDevAssetResponse(request, hmrState, moduleServerHandler)).get("/@hmr/*", ({ request }) => resolveDevAssetResponse(request, hmrState, moduleServerHandler)).ws("/hmr", {
144
- close: (ws) => handleClientDisconnect(hmrState, ws),
145
- message: (ws, msg) => handleHMRMessage(hmrState, ws, msg),
146
- open: (ws) => handleClientConnect(hmrState, ws, manifest)
147
- }).get("/hmr-status", () => ({
148
- connectedClients: hmrState.connectedClients.size,
149
- isRebuilding: hmrState.isRebuilding,
150
- manifestKeys: Object.keys(manifest),
151
- rebuildCount: hmrState.rebuildCount,
152
- rebuildQueue: Array.from(hmrState.rebuildQueue),
153
- timestamp: Date.now()
154
- }));
155
- export {
156
- hmr
157
- };
158
-
159
- //# debugId=4B480B1E52FA111664756E2164756E21
160
- //# sourceMappingURL=chunk-ex2hxe0v.js.map