@absolutejs/absolute 0.19.0-beta.999 → 0.20.0-beta.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 (341) hide show
  1. package/LICENSE +21 -13
  2. package/README.md +48 -2
  3. package/dist/angular/browser.js +82 -77
  4. package/dist/angular/browser.js.map +11 -11
  5. package/dist/angular/components/constants.js +43 -0
  6. package/dist/angular/components/core/streamingSlotRegistrar.js +1 -1
  7. package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
  8. package/dist/angular/hmrPreserveCore.ts +132 -134
  9. package/dist/angular/index.js +1719 -844
  10. package/dist/angular/index.js.map +34 -26
  11. package/dist/angular/server.js +1620 -768
  12. package/dist/angular/server.js.map +28 -20
  13. package/dist/build.js +4935 -2593
  14. package/dist/build.js.map +72 -57
  15. package/dist/cli/config/client.js +578 -0
  16. package/dist/cli/config/server.js +39587 -0
  17. package/dist/cli/htmx/htmx.min.js +1 -0
  18. package/dist/cli/index.js +16828 -3511
  19. package/dist/client/index.js +49 -46
  20. package/dist/client/index.js.map +12 -12
  21. package/dist/core/streamingSlotRegistrar.js +1 -19
  22. package/dist/core/streamingSlotRegistrar.js.map +2 -2
  23. package/dist/core/streamingSlotRegistry.js +1 -19
  24. package/dist/core/streamingSlotRegistry.js.map +2 -2
  25. package/dist/dev/client/cssUtils.ts +98 -41
  26. package/dist/dev/client/domState.ts +2 -0
  27. package/dist/dev/client/errorOverlay.ts +14 -13
  28. package/dist/dev/client/handlers/angularHmrShim.ts +20 -20
  29. package/dist/dev/client/handlers/angularRemount.ts +74 -55
  30. package/dist/dev/client/handlers/angularRemountWiring.ts +1 -2
  31. package/dist/dev/client/handlers/html.ts +144 -41
  32. package/dist/dev/client/handlers/htmx.ts +43 -8
  33. package/dist/dev/client/handlers/react.ts +114 -32
  34. package/dist/dev/client/handlers/rebuild.ts +28 -8
  35. package/dist/dev/client/handlers/svelte.ts +92 -51
  36. package/dist/dev/client/handlers/vue.ts +36 -45
  37. package/dist/dev/client/hmrClient.ts +101 -26
  38. package/dist/dev/client/hmrTiming.ts +141 -0
  39. package/dist/dev/client/hmrToast.ts +22 -24
  40. package/dist/dev/client/reactRefreshSetup.ts +4 -0
  41. package/dist/dev/client/vendor/reactRefreshRuntime.d.ts +12 -0
  42. package/dist/dev/client/vendor/reactRefreshRuntime.js +313 -0
  43. package/dist/dev/serverBootstrap.js +45 -0
  44. package/dist/index.js +7153 -3224
  45. package/dist/index.js.map +118 -86
  46. package/dist/islands/browser.js +1 -19
  47. package/dist/islands/browser.js.map +3 -3
  48. package/dist/islands/index.js +709 -120
  49. package/dist/islands/index.js.map +18 -13
  50. package/dist/mobile/browser.js +428 -0
  51. package/dist/mobile/browser.js.map +12 -0
  52. package/dist/mobile/index.js +3058 -0
  53. package/dist/mobile/index.js.map +35 -0
  54. package/dist/react/browser.js +13 -62
  55. package/dist/react/browser.js.map +5 -6
  56. package/dist/react/components/browser/index.js +23 -13
  57. package/dist/react/components/index.js +30 -34
  58. package/dist/react/components/index.js.map +8 -7
  59. package/dist/react/hooks/index.js +1 -19
  60. package/dist/react/hooks/index.js.map +3 -3
  61. package/dist/react/index.js +1643 -679
  62. package/dist/react/index.js.map +29 -20
  63. package/dist/react/jsxDevRuntimeCompat.js +22 -20
  64. package/dist/react/jsxDevRuntimeCompat.js.map +5 -4
  65. package/dist/react/jsxRuntimeCompat.js +90 -0
  66. package/dist/react/jsxRuntimeCompat.js.map +10 -0
  67. package/dist/react/router/browser.js +77 -0
  68. package/dist/react/router/browser.js.map +10 -0
  69. package/dist/react/router/index.js +77 -0
  70. package/dist/react/router/index.js.map +10 -0
  71. package/dist/react/server.js +950 -565
  72. package/dist/react/server.js.map +16 -11
  73. package/dist/src/angular/components/constants.d.ts +21 -0
  74. package/dist/src/angular/hmrPreserveCore.d.ts +7 -20
  75. package/dist/src/angular/islands.d.ts +1 -1
  76. package/dist/src/angular/pageHandler.d.ts +2 -0
  77. package/dist/src/angular/ssrRender.d.ts +4 -1
  78. package/dist/src/build/bunStringRawUnicodePlugin.d.ts +12 -0
  79. package/dist/src/build/chainInlineSourcemaps.d.ts +1 -0
  80. package/dist/src/build/compileAngular.d.ts +5 -7
  81. package/dist/src/build/compileSvelte.d.ts +3 -0
  82. package/dist/src/build/compileVue.d.ts +3 -1
  83. package/dist/src/build/generateReactIndexes.d.ts +1 -0
  84. package/dist/src/build/islandRegistryTransform.d.ts +17 -0
  85. package/dist/src/build/maskLiterals.d.ts +28 -0
  86. package/dist/src/build/parseVueSpaRoutes.d.ts +5 -0
  87. package/dist/src/build/resolveBuildMode.d.ts +7 -0
  88. package/dist/src/build/serverExternals.d.ts +14 -0
  89. package/dist/src/build/spaSideManifests.d.ts +16 -0
  90. package/dist/src/build/tailwindCompiler.d.ts +0 -1
  91. package/dist/src/cli/add/dependencies.d.ts +13 -0
  92. package/dist/src/cli/config/absolute/AbsoluteConfigPanel.d.ts +6 -0
  93. package/dist/src/cli/config/absolute/editAbsoluteConfig.d.ts +5 -0
  94. package/dist/src/cli/config/absolute/resolveAbsoluteConfig.d.ts +19 -0
  95. package/dist/src/cli/config/auth/AuthPanel.d.ts +6 -0
  96. package/dist/src/cli/config/auth/authCatalog.d.ts +10 -0
  97. package/dist/src/cli/config/auth/authScaffolds.d.ts +16 -0
  98. package/dist/src/cli/config/auth/editAuthConfig.d.ts +5 -0
  99. package/dist/src/cli/config/auth/resolveAuthSettings.d.ts +14 -0
  100. package/dist/src/cli/config/auth/resolveAuthState.d.ts +2 -0
  101. package/dist/src/cli/config/auth/scaffoldAuthFeature.d.ts +6 -0
  102. package/dist/src/cli/config/client.d.ts +1 -0
  103. package/dist/src/cli/config/configCert.d.ts +12 -0
  104. package/dist/src/cli/config/eslint/EslintPanel.d.ts +6 -0
  105. package/dist/src/cli/config/eslint/configAst.d.ts +18 -0
  106. package/dist/src/cli/config/eslint/editConfigRule.d.ts +6 -0
  107. package/dist/src/cli/config/eslint/eslintStyles.d.ts +1 -0
  108. package/dist/src/cli/config/eslint/resolveConfig.d.ts +3 -0
  109. package/dist/src/cli/config/eslint/serializeValue.d.ts +9 -0
  110. package/dist/src/cli/config/guards.d.ts +4 -0
  111. package/dist/src/cli/config/integrations/IntegrationsPanel.d.ts +6 -0
  112. package/dist/src/cli/config/packageJson/PackageJsonPanel.d.ts +6 -0
  113. package/dist/src/cli/config/packageJson/editPackageJson.d.ts +9 -0
  114. package/dist/src/cli/config/packageJson/resolvePackageJson.d.ts +8 -0
  115. package/dist/src/cli/config/page/ConfigShell.d.ts +6 -0
  116. package/dist/src/cli/config/page/FieldEditor.d.ts +9 -0
  117. package/dist/src/cli/config/page/PanelHost.d.ts +6 -0
  118. package/dist/src/cli/config/page/configStyles.d.ts +1 -0
  119. package/dist/src/cli/config/panels.d.ts +7 -0
  120. package/dist/src/cli/config/prettier/PrettierPanel.d.ts +6 -0
  121. package/dist/src/cli/config/prettier/editPrettier.d.ts +5 -0
  122. package/dist/src/cli/config/prettier/resolvePrettier.d.ts +11 -0
  123. package/dist/src/cli/config/schema/fromJsonSchema.d.ts +3 -0
  124. package/dist/src/cli/config/schema/fromType.d.ts +1 -0
  125. package/dist/src/cli/config/schema/serialize.d.ts +1 -0
  126. package/dist/src/cli/config/server.d.ts +527 -0
  127. package/dist/src/cli/config/tsconfig/TsconfigPanel.d.ts +6 -0
  128. package/dist/src/cli/config/tsconfig/editTsconfig.d.ts +5 -0
  129. package/dist/src/cli/config/tsconfig/resolveTsconfig.d.ts +8 -0
  130. package/dist/src/cli/config/tsconfig/tsconfigStyles.d.ts +1 -0
  131. package/dist/src/cli/discoverInstances.d.ts +5 -0
  132. package/dist/src/cli/elysiaOpenApiTypeboxPlugin.d.ts +8 -0
  133. package/dist/src/cli/generate/componentTemplates.d.ts +7 -0
  134. package/dist/src/cli/generate/context.d.ts +30 -0
  135. package/dist/src/cli/generate/cssStrategy.d.ts +20 -0
  136. package/dist/src/cli/generate/frameworkKey.d.ts +3 -0
  137. package/dist/src/cli/generate/frameworks.d.ts +40 -0
  138. package/dist/src/cli/generate/generateApi.d.ts +3 -0
  139. package/dist/src/cli/generate/generateComponent.d.ts +4 -0
  140. package/dist/src/cli/generate/generatePage.d.ts +4 -0
  141. package/dist/src/cli/generate/naming.d.ts +5 -0
  142. package/dist/src/cli/generate/navData.d.ts +10 -0
  143. package/dist/src/cli/generate/outcome.d.ts +17 -0
  144. package/dist/src/cli/generate/pageTemplates.d.ts +11 -0
  145. package/dist/src/cli/generate/routeWiring.d.ts +40 -0
  146. package/dist/src/cli/generate/staticNav.d.ts +5 -0
  147. package/dist/src/cli/heapDiff.d.ts +1 -0
  148. package/dist/src/cli/htmx/install.d.ts +6 -0
  149. package/dist/src/cli/inspectData.d.ts +12 -0
  150. package/dist/src/cli/inspectTui.d.ts +1 -0
  151. package/dist/src/cli/instanceStatus.d.ts +22 -0
  152. package/dist/src/cli/integrations/addPlugin.d.ts +8 -0
  153. package/dist/src/cli/integrations/catalog.d.ts +20 -0
  154. package/dist/src/cli/psTui.d.ts +1 -0
  155. package/dist/src/cli/scripts/add.d.ts +1 -0
  156. package/dist/src/cli/scripts/analyze.d.ts +1 -0
  157. package/dist/src/cli/scripts/api.d.ts +1 -0
  158. package/dist/src/cli/scripts/build.d.ts +1 -1
  159. package/dist/src/cli/scripts/db.d.ts +20 -0
  160. package/dist/src/cli/scripts/dev.d.ts +5 -1
  161. package/dist/src/cli/scripts/doctor.d.ts +1 -0
  162. package/dist/src/cli/scripts/env.d.ts +7 -0
  163. package/dist/src/cli/scripts/eslint.d.ts +37 -2
  164. package/dist/src/cli/scripts/eslintChunked.d.ts +37 -0
  165. package/dist/src/cli/scripts/generate.d.ts +1 -0
  166. package/dist/src/cli/scripts/htmx.d.ts +1 -0
  167. package/dist/src/cli/scripts/inspect.d.ts +1 -0
  168. package/dist/src/cli/scripts/islands.d.ts +1 -0
  169. package/dist/src/cli/scripts/lintProof.d.ts +42 -0
  170. package/dist/src/cli/scripts/logs.d.ts +1 -0
  171. package/dist/src/cli/scripts/ls.d.ts +1 -0
  172. package/dist/src/cli/scripts/mem.d.ts +1 -0
  173. package/dist/src/cli/scripts/mobile.d.ts +1 -0
  174. package/dist/src/cli/scripts/prettier.d.ts +2 -0
  175. package/dist/src/cli/scripts/ps.d.ts +1 -0
  176. package/dist/src/cli/scripts/remove.d.ts +1 -0
  177. package/dist/src/cli/scripts/routes.d.ts +1 -0
  178. package/dist/src/cli/scripts/start.d.ts +6 -1
  179. package/dist/src/cli/scripts/tunnelRelay.d.ts +9 -0
  180. package/dist/src/cli/scripts/workspace.d.ts +3 -1
  181. package/dist/src/cli/serverBundleExternals.d.ts +2 -0
  182. package/dist/src/cli/tuiPrimitives.d.ts +14 -0
  183. package/dist/src/cli/typeGraphCoherence.d.ts +32 -0
  184. package/dist/src/cli/utils.d.ts +3 -1
  185. package/dist/src/cli/workspaceTui.d.ts +2 -1
  186. package/dist/src/client/hydrators/react.d.ts +1 -1
  187. package/dist/src/client/hydrators/svelte.d.ts +1 -1
  188. package/dist/src/client/hydrators/vue.d.ts +1 -1
  189. package/dist/src/client/islandStore.d.ts +3 -3
  190. package/dist/src/client/preserveIslandMarkup.d.ts +4 -1
  191. package/dist/src/constants.d.ts +21 -0
  192. package/dist/src/core/angularServerModule.d.ts +1 -0
  193. package/dist/src/core/build.d.ts +11 -3
  194. package/dist/src/core/devRouteRegistrationCallsite.d.ts +1 -5
  195. package/dist/src/core/index.d.ts +1 -0
  196. package/dist/src/core/pageResponseCache.d.ts +23 -0
  197. package/dist/src/core/prepare.d.ts +192 -154
  198. package/dist/src/core/requestContext.d.ts +18 -0
  199. package/dist/src/dev/angular/fastHmrCompiler.d.ts +5 -3
  200. package/dist/src/dev/angular/hmrCompiler.d.ts +1 -1
  201. package/dist/src/dev/angular/resolveOwningComponents.d.ts +1 -1
  202. package/dist/src/dev/clientManager.d.ts +10 -1
  203. package/dist/src/dev/configResolver.d.ts +2 -0
  204. package/dist/src/dev/moduleMapper.d.ts +1 -1
  205. package/dist/src/dev/moduleServer.d.ts +2 -1
  206. package/dist/src/dev/pathUtils.d.ts +1 -1
  207. package/dist/src/dev/reactComponentClassifier.d.ts +1 -1
  208. package/dist/src/dev/rebuildTrigger.d.ts +4 -0
  209. package/dist/src/dev/requestInspector.d.ts +31 -0
  210. package/dist/src/dev/serverBootstrap.d.ts +1 -0
  211. package/dist/src/dev/serverEntryWatcher.d.ts +3 -3
  212. package/dist/src/dev/tunnel/client.d.ts +20 -0
  213. package/dist/src/dev/tunnel/protocol.d.ts +85 -0
  214. package/dist/src/dev/tunnel/relay.d.ts +28 -0
  215. package/dist/src/dev/webSocket.d.ts +1 -1
  216. package/dist/src/mobile/androidConformance.d.ts +42 -0
  217. package/dist/src/mobile/androidEmulatorController.d.ts +99 -0
  218. package/dist/src/mobile/androidNativeWatcher.d.ts +19 -0
  219. package/dist/src/mobile/androidRelease.d.ts +47 -0
  220. package/dist/src/mobile/androidWebView.d.ts +46 -0
  221. package/dist/src/mobile/artifactStore.d.ts +47 -0
  222. package/dist/src/mobile/associationFiles.d.ts +49 -0
  223. package/dist/src/mobile/browser.d.ts +2 -0
  224. package/dist/src/mobile/buildMetadata.d.ts +10 -0
  225. package/dist/src/mobile/buildPipeline.d.ts +8 -0
  226. package/dist/src/mobile/buildRelease.d.ts +24 -0
  227. package/dist/src/mobile/capacitorBundle.d.ts +28 -0
  228. package/dist/src/mobile/capacitorProject.d.ts +9 -0
  229. package/dist/src/mobile/client.d.ts +35 -0
  230. package/dist/src/mobile/compatibilityDispatcher.d.ts +26 -0
  231. package/dist/src/mobile/config.d.ts +16 -0
  232. package/dist/src/mobile/emulatorDoctor.d.ts +25 -0
  233. package/dist/src/mobile/emulatorInstaller.d.ts +41 -0
  234. package/dist/src/mobile/index.d.ts +19 -0
  235. package/dist/src/mobile/materializedBundle.d.ts +36 -0
  236. package/dist/src/mobile/nativeDeepLinks.d.ts +5 -0
  237. package/dist/src/mobile/pageProtocol.d.ts +89 -0
  238. package/dist/src/mobile/producerContext.d.ts +4 -0
  239. package/dist/src/mobile/producerContextState.d.ts +10 -0
  240. package/dist/src/mobile/releaseArtifact.d.ts +75 -0
  241. package/dist/src/mobile/releaseDoctor.d.ts +13 -0
  242. package/dist/src/mobile/routeMatcher.d.ts +3 -0
  243. package/dist/src/mobile/routeMetadataTransform.d.ts +13 -0
  244. package/dist/src/mobile/shellBootstrap.d.ts +1 -0
  245. package/dist/src/mobile/transport.d.ts +31 -0
  246. package/dist/src/plugins/devtoolsJson.d.ts +6 -47
  247. package/dist/src/plugins/hmr.d.ts +22 -96
  248. package/dist/src/plugins/imageOptimizer.d.ts +150 -62
  249. package/dist/src/plugins/networking.d.ts +2 -2
  250. package/dist/src/plugins/openApiPlugin.d.ts +4 -0
  251. package/dist/src/plugins/telemetryPlugin.d.ts +36 -0
  252. package/dist/src/react/browser.d.ts +0 -2
  253. package/dist/src/react/hooks/useMediaQuery.d.ts +1 -1
  254. package/dist/src/react/index.d.ts +0 -2
  255. package/dist/src/react/jsxDevRuntimeCompat.d.ts +1 -1
  256. package/dist/src/react/jsxRuntimeCompat.d.ts +7 -0
  257. package/dist/src/react/pageHandler.d.ts +8 -0
  258. package/dist/src/react/router/UniversalRouter.d.ts +43 -0
  259. package/dist/src/react/router/browser.d.ts +2 -0
  260. package/dist/src/react/router/index.d.ts +2 -0
  261. package/dist/src/svelte/pageHandler.d.ts +5 -0
  262. package/dist/src/svelte/router/hashMode.d.ts +1 -6
  263. package/dist/src/svelte/router/matchPath.d.ts +4 -24
  264. package/dist/src/svelte/router/page.svelte.d.ts +1 -10
  265. package/dist/src/svelte/router/prefetchCache.d.ts +2 -6
  266. package/dist/src/utils/cleanup.d.ts +1 -0
  267. package/dist/src/utils/defineConvention.d.ts +2 -2
  268. package/dist/src/utils/defineEnv.d.ts +4 -4
  269. package/dist/src/utils/formatBytes.d.ts +2 -0
  270. package/dist/src/utils/generatedDir.d.ts +1 -1
  271. package/dist/src/utils/iconVersion.d.ts +5 -0
  272. package/dist/src/utils/imageProcessing.d.ts +1 -1
  273. package/dist/src/utils/index.d.ts +2 -0
  274. package/dist/src/utils/inlinePageCss.d.ts +9 -0
  275. package/dist/src/utils/instanceRegistry.d.ts +13 -0
  276. package/dist/src/utils/isTestSourcePath.d.ts +1 -0
  277. package/dist/src/utils/jsonLd.d.ts +1 -1
  278. package/dist/src/utils/loadConfig.d.ts +11 -3
  279. package/dist/src/utils/logger.d.ts +2 -0
  280. package/dist/src/utils/portScan.d.ts +22 -0
  281. package/dist/src/utils/projectRoot.d.ts +17 -0
  282. package/dist/src/utils/resolveConvention.d.ts +1 -1
  283. package/dist/src/utils/resolveDevPort.d.ts +4 -1
  284. package/dist/src/utils/runtimeMode.d.ts +1 -1
  285. package/dist/src/utils/spaRouteCss.d.ts +10 -0
  286. package/dist/src/utils/spaRouteManifest.d.ts +8 -0
  287. package/dist/src/utils/stripStringsAndComments.d.ts +18 -0
  288. package/dist/src/utils/userAgentFunctions.d.ts +1 -1
  289. package/dist/src/utils/vueCompiler.d.ts +1 -0
  290. package/dist/src/vue/components/Image.d.ts +2 -2
  291. package/dist/src/vue/defineVuePage.d.ts +1 -11
  292. package/dist/src/vue/index.d.ts +3 -0
  293. package/dist/src/vue/pageHandler.d.ts +5 -0
  294. package/dist/src/vue/resolveGeneratedVueModulePath.d.ts +1 -0
  295. package/dist/src/vue/teleports.d.ts +2 -0
  296. package/dist/src/vue/useResource.d.ts +65 -0
  297. package/dist/svelte/browser.js +1 -19
  298. package/dist/svelte/browser.js.map +3 -3
  299. package/dist/svelte/components/Head.svelte +7 -1
  300. package/dist/svelte/index.js +1281 -543
  301. package/dist/svelte/index.js.map +27 -19
  302. package/dist/svelte/router/Link.svelte.d.ts +3 -3
  303. package/dist/svelte/router/Route.svelte.d.ts +5 -5
  304. package/dist/svelte/router/Router.svelte.d.ts +3 -3
  305. package/dist/svelte/router/hashMode.ts +6 -12
  306. package/dist/svelte/router/matchPath.ts +44 -61
  307. package/dist/svelte/router/page.d.ts +1 -10
  308. package/dist/svelte/router/page.js +6 -6
  309. package/dist/svelte/router/prefetchCache.ts +21 -23
  310. package/dist/svelte/router/viewTransitions.ts +22 -12
  311. package/dist/svelte/server.js +697 -565
  312. package/dist/svelte/server.js.map +14 -11
  313. package/dist/types/absoluteConfig.d.ts +22 -0
  314. package/dist/types/angular.d.ts +4 -1
  315. package/dist/types/authPanel.d.ts +62 -0
  316. package/dist/types/build.d.ts +116 -0
  317. package/dist/types/cli.d.ts +57 -0
  318. package/dist/types/config.d.ts +52 -0
  319. package/dist/types/eslintConfig.d.ts +68 -0
  320. package/dist/types/globals.d.ts +31 -10
  321. package/dist/types/image.d.ts +2 -0
  322. package/dist/types/index.d.ts +1 -0
  323. package/dist/types/integrationsPanel.d.ts +29 -0
  324. package/dist/types/messages.d.ts +12 -0
  325. package/dist/types/packageJson.d.ts +74 -0
  326. package/dist/types/packageJsonPanel.d.ts +29 -0
  327. package/dist/types/prettier.d.ts +26 -0
  328. package/dist/types/tsconfig.d.ts +31 -0
  329. package/dist/types/vue.d.ts +13 -15
  330. package/dist/vue/browser.js +14 -36
  331. package/dist/vue/browser.js.map +5 -5
  332. package/dist/vue/components/Image.js +3 -20
  333. package/dist/vue/components/Image.js.map +3 -3
  334. package/dist/vue/components/index.js +3 -20
  335. package/dist/vue/components/index.js.map +3 -3
  336. package/dist/vue/index.js +1573 -620
  337. package/dist/vue/index.js.map +34 -22
  338. package/dist/vue/server.js +800 -520
  339. package/dist/vue/server.js.map +17 -11
  340. package/package.json +145 -68
  341. package/dist/src/react/UniversalRouter.d.ts +0 -12
@@ -3,7 +3,6 @@ var __create = Object.create;
3
3
  var __getProtoOf = Object.getPrototypeOf;
4
4
  var __defProp = Object.defineProperty;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
7
  function __accessProp(key) {
9
8
  return this[key];
@@ -30,23 +29,6 @@ var __toESM = (mod, isNodeMode, target) => {
30
29
  cache.set(mod, to);
31
30
  return to;
32
31
  };
33
- var __toCommonJS = (from) => {
34
- var entry = (__moduleCache ??= new WeakMap).get(from), desc;
35
- if (entry)
36
- return entry;
37
- entry = __defProp({}, "__esModule", { value: true });
38
- if (from && typeof from === "object" || typeof from === "function") {
39
- for (var key of __getOwnPropNames(from))
40
- if (!__hasOwnProp.call(entry, key))
41
- __defProp(entry, key, {
42
- get: __accessProp.bind(from, key),
43
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
44
- });
45
- }
46
- __moduleCache.set(from, entry);
47
- return entry;
48
- };
49
- var __moduleCache;
50
32
  var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
51
33
  var __returnValue = (v) => v;
52
34
  function __exportSetter(name, newValue) {
@@ -78,25 +60,6 @@ var __legacyMetadataTS = (k, v) => {
78
60
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
79
61
  var __require = import.meta.require;
80
62
 
81
- // src/constants.ts
82
- var ANGULAR_INIT_TIMEOUT_MS = 500, ANSI_ESCAPE_CODE = 27, ANSI_ESCAPE_LENGTH = 3, ASCII_SPACE = 32, BASE_36_RADIX = 36, BUN_BUILD_WARNING_SUPPRESSION = "wildcard sideEffects are not supported yet", BODY_SLICE_LENGTH = 2000, BYTES_PER_KILOBYTE = 1024, CLI_ARGS_OFFSET = 3, CSS_ERROR_RESOLVE_DELAY_MS = 50, CSS_MAX_CHECK_ATTEMPTS = 10, CSS_MAX_PARSE_TIMEOUT_MS = 500, CSS_SHEET_READY_TIMEOUT_MS = 100, DEFAULT_CHUNK_SIZE = 16384, DEFAULT_DEBOUNCE_MS = 15, DEFAULT_PORT = 3000, DEV_SERVER_RESTART_DEBOUNCE_MS = 100, DOM_UPDATE_DELAY_MS = 50, FILE_PROTOCOL_PREFIX_LENGTH = 7, FOCUS_ID_PREFIX_LENGTH = 3, FOCUS_IDX_PREFIX_LENGTH = 4, FOCUS_NAME_PREFIX_LENGTH = 5, HMR_UPDATE_TIMEOUT_MS = 2000, HOOK_SIGNATURE_LENGTH = 12, EXCLUDE_LAST_OFFSET = -1, HTTP_STATUS_OK = 200, HTTP_STATUS_BAD_REQUEST = 400, HTTP_STATUS_NOT_FOUND = 404, HOURS_IN_DAY = 24, HOURS_IN_HALF_DAY = 12, IMAGE_DEFAULT_DEVICE_SIZES, IMAGE_DEFAULT_IMAGE_SIZES, IMAGE_DEFAULT_QUALITY = 75, IMAGE_GLOB_SUFFIX_LENGTH = 2, MAX_ERROR_LENGTH = 200, MAX_RECONNECT_ATTEMPTS = 60, MILLISECONDS_IN_A_SECOND = 1000, MINUTES_IN_AN_HOUR = 60, SECONDS_IN_A_MINUTE = 60, MILLISECONDS_IN_A_MINUTE, MILLISECONDS_IN_A_DAY, OVERLAY_FADE_DURATION_MS = 150, PING_INTERVAL_MS = 30000, RAF_BATCH_COUNT = 3, RANDOM_ID_END_INDEX = 11, REBUILD_BATCH_DELAY_MS = 10, REBUILD_RELOAD_DELAY_MS = 200, RECONNECT_INITIAL_DELAY_MS = 500, RECONNECT_POLL_INTERVAL_MS = 300, REACT_STREAM_SLOT_FAST_DELAY_MS = 5, REACT_STREAM_SLOT_SLOW_DELAY_MS = 20, SIGINT_EXIT_CODE = 130, SIGTERM_EXIT_CODE = 143, SVELTE_CSS_LOAD_TIMEOUT_MS = 500, TIME_PRECISION = 2, TWO_THIRDS, UNFOUND_INDEX = -1, WEBSOCKET_NORMAL_CLOSURE = 1000, WORKSPACE_COMMAND_ARGS_OFFSET = 3, WORKSPACE_FAILURE_LOG_PRINT_LIMIT = 30, WORKSPACE_FAILURE_RECENT_LOG_LIMIT = 60, WORKSPACE_READY_ATTEMPT_TIMEOUT_MS = 5000, WORKSPACE_READY_PROBE_INTERVAL_MS = 250, WORKSPACE_READY_TIMEOUT_MS = 30000, WORKSPACE_SHUTDOWN_TIMEOUT_MS = 1e4, WORKSPACE_TUI_DEFAULT_HEIGHT = 28, WORKSPACE_TUI_DEFAULT_WIDTH = 100, WORKSPACE_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, WORKSPACE_TUI_FOOTER_LINE_COUNT = 3, WORKSPACE_TUI_MIN_LOG_HEIGHT = 3, WORKSPACE_TUI_MIN_SERVICE_NAME_WIDTH = 7, WORKSPACE_TUI_MIN_TARGET_WIDTH = 8, WORKSPACE_TUI_MIN_WRAP_WIDTH = 12, WORKSPACE_TUI_PROMPT_CURSOR_OFFSET = 3, WORKSPACE_TUI_RECENT_LOG_LIMIT = 40, WORKSPACE_TUI_RENDER_DEBOUNCE_MS = 16, WORKSPACE_TUI_STATUS_WIDTH = 10, WORKSPACE_TUI_TARGET_PADDING_WIDTH = 6, WORKSPACE_TUI_VISIBILITY_WIDTH = 8;
83
- var init_constants = __esm(() => {
84
- IMAGE_DEFAULT_DEVICE_SIZES = [
85
- 640,
86
- 750,
87
- 828,
88
- 1080,
89
- 1200,
90
- 1920,
91
- 2048,
92
- 3840
93
- ];
94
- IMAGE_DEFAULT_IMAGE_SIZES = [16, 32, 48, 64, 96, 128, 256, 384];
95
- MILLISECONDS_IN_A_MINUTE = MILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE;
96
- MILLISECONDS_IN_A_DAY = MILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE * MINUTES_IN_AN_HOUR * HOURS_IN_DAY;
97
- TWO_THIRDS = 2 / 3;
98
- });
99
-
100
63
  // src/core/devRouteRegistrationCallsite.ts
101
64
  var exports_devRouteRegistrationCallsite = {};
102
65
  __export(exports_devRouteRegistrationCallsite, {
@@ -107,22 +70,20 @@ __export(exports_devRouteRegistrationCallsite, {
107
70
  });
108
71
  import { AsyncLocalStorage } from "async_hooks";
109
72
  import { Elysia } from "elysia";
110
- var ROUTE_CALLSITE_STORAGE_KEY, ROUTE_CALLSITE_PATCHED_KEY, ROUTE_METHOD_NAMES, PAGE_HANDLER_NAMES, pageHandlerWrappers, handlerSourceMentionsPageHelper = (handler) => {
73
+ var ROUTE_CALLSITE_STORAGE_KEY, ROUTE_CALLSITE_PATCHED_KEY, NODE_ENV_KEY = "NODE_ENV", ROUTE_METHOD_NAMES, PAGE_HANDLER_NAMES, pageHandlerWrappers, isPageHandlerFunction = (value) => typeof value === "function", handlerSourceMentionsPageHelper = (handler) => {
111
74
  const source = handler.toString();
112
75
  return PAGE_HANDLER_NAMES.some((name) => source.includes(name));
76
+ }, getOriginalPageHandlerSource = (handler) => {
77
+ if (!isPageHandlerFunction(handler))
78
+ return;
79
+ const info = pageHandlerWrappers.get(handler);
80
+ return (info?.originalHandler ?? handler).toString();
113
81
  }, isPageHandler = (handler) => {
114
- if (typeof handler !== "function")
82
+ if (!isPageHandlerFunction(handler))
115
83
  return false;
116
- const fn = handler;
117
- if (pageHandlerWrappers.has(fn))
84
+ if (pageHandlerWrappers.has(handler))
118
85
  return true;
119
- return handlerSourceMentionsPageHelper(fn);
120
- }, getOriginalPageHandlerSource = (handler) => {
121
- if (typeof handler !== "function")
122
- return;
123
- const fn = handler;
124
- const info = pageHandlerWrappers.get(fn);
125
- return (info?.originalHandler ?? fn).toString();
86
+ return handlerSourceMentionsPageHelper(handler);
126
87
  }, isObjectRecord3 = (value) => Boolean(value) && typeof value === "object", isAsyncLocalStorage2 = (value) => isObjectRecord3(value) && ("getStore" in value) && typeof value.getStore === "function" && ("run" in value) && typeof value.run === "function", isRouteMethod = (value) => typeof value === "function", getRouteCallsiteStorage = () => {
127
88
  const value = Reflect.get(globalThis, ROUTE_CALLSITE_STORAGE_KEY);
128
89
  if (value === null || typeof value === "undefined") {
@@ -156,17 +117,22 @@ var ROUTE_CALLSITE_STORAGE_KEY, ROUTE_CALLSITE_PATCHED_KEY, ROUTE_METHOD_NAMES,
156
117
  return function wrappedRouteHandler(...args) {
157
118
  return storage.run({ callsite }, () => Reflect.apply(routeHandler, this, args));
158
119
  };
159
- }, createPatchedRouteMethod = (originalMethod, methodName) => function patchedRouteMethod(path, handler, ...rest) {
120
+ }, createPatchedRouteMethod = (originalMethod, methodName) => function patchedRouteMethod(path, ...routeArguments) {
121
+ const handlerIndex = routeArguments.length >= 2 ? 1 : 0;
122
+ const handler = routeArguments[handlerIndex];
160
123
  const callsite = captureRouteRegistrationCallsite();
161
124
  const wrapped = wrapRouteHandlerWithCallsite(handler, callsite);
162
- if (methodName === "get" && typeof handler === "function" && typeof wrapped === "function" && handlerSourceMentionsPageHelper(handler)) {
125
+ if (methodName === "get" && isPageHandlerFunction(handler) && isPageHandlerFunction(wrapped) && handlerSourceMentionsPageHelper(handler)) {
163
126
  pageHandlerWrappers.set(wrapped, {
164
127
  originalHandler: handler
165
128
  });
166
129
  }
167
- return Reflect.apply(originalMethod, this, [path, wrapped, ...rest]);
130
+ routeArguments[handlerIndex] = wrapped;
131
+ return Reflect.apply(originalMethod, this, [path, ...routeArguments]);
168
132
  }, getCurrentRouteRegistrationCallsite = () => getRouteCallsiteStorage()?.getStore()?.callsite, patchElysiaRouteRegistrationCallsites = () => {
169
- if (false) {}
133
+ if (process.env[NODE_ENV_KEY] === "production") {
134
+ return;
135
+ }
170
136
  if (Reflect.get(globalThis, ROUTE_CALLSITE_PATCHED_KEY) === true) {
171
137
  return;
172
138
  }
@@ -203,6 +169,43 @@ var init_devRouteRegistrationCallsite = __esm(() => {
203
169
  pageHandlerWrappers = new WeakMap;
204
170
  });
205
171
 
172
+ // src/core/pageResponseCache.ts
173
+ import { createHash } from "crypto";
174
+ var STREAMING_PAGE_HEADER = "x-absolute-stream", HTML_CONTENT_TYPE = "text/html", streamingPageHeaders = (extra) => {
175
+ const headers = new Headers(extra);
176
+ headers.set("content-type", HTML_CONTENT_TYPE);
177
+ headers.set(STREAMING_PAGE_HEADER, "1");
178
+ return headers;
179
+ }, computeEtag = (html) => `W/"${createHash("sha1").update(html).digest("base64url")}"`, withPageCacheHeaders = async (response, request, options) => {
180
+ const contentType = response.headers.get("content-type") ?? "";
181
+ if (!contentType.includes(HTML_CONTENT_TYPE))
182
+ return response;
183
+ const isStreaming = response.headers.get(STREAMING_PAGE_HEADER) === "1";
184
+ if (isStreaming && !options?.bufferStreamForEtag || !response.body) {
185
+ response.headers.delete(STREAMING_PAGE_HEADER);
186
+ response.headers.set("cache-control", "no-cache");
187
+ return response;
188
+ }
189
+ const html = await response.text();
190
+ const etag = computeEtag(html);
191
+ if (request?.headers.get("if-none-match") === etag) {
192
+ return new Response(null, {
193
+ headers: { "cache-control": "no-cache", etag },
194
+ status: 304
195
+ });
196
+ }
197
+ const headers = new Headers(response.headers);
198
+ headers.delete(STREAMING_PAGE_HEADER);
199
+ headers.set("cache-control", "no-cache");
200
+ headers.set("etag", etag);
201
+ return new Response(html, {
202
+ headers,
203
+ status: response.status,
204
+ statusText: response.statusText
205
+ });
206
+ };
207
+ var init_pageResponseCache = () => {};
208
+
206
209
  // src/client/streamSwap.ts
207
210
  var streamSwapRuntime = () => {
208
211
  const absoluteWindow = window;
@@ -312,6 +315,26 @@ var streamSwapRuntime = () => {
312
315
  return value.slice(start + 1, end);
313
316
  }, getStreamSwapRuntimeScript = () => `(function(){${stripFunctionWrapper(streamSwapRuntime.toString())}})();`;
314
317
 
318
+ // src/constants.ts
319
+ var ANGULAR_INIT_TIMEOUT_MS = 500, ANSI_ESCAPE_CODE = 27, ANSI_ESCAPE_LENGTH = 3, ASCII_SPACE = 32, BASE_36_RADIX = 36, BUN_BUILD_WARNING_SUPPRESSION = "wildcard sideEffects are not supported yet", TAILWIND_BUN_CSS_WARNING_PATTERN, BODY_SLICE_LENGTH = 2000, BYTES_PER_KILOBYTE = 1024, CLI_ARGS_OFFSET = 3, CSS_ERROR_RESOLVE_DELAY_MS = 50, CSS_MAX_CHECK_ATTEMPTS = 10, CSS_MAX_PARSE_TIMEOUT_MS = 500, CSS_SHEET_READY_TIMEOUT_MS = 100, DEFAULT_CHUNK_SIZE = 16384, DEFAULT_DEBOUNCE_MS = 15, DEFAULT_PORT = 3000, DEV_SERVER_RESTART_DEBOUNCE_MS = 100, DOM_UPDATE_DELAY_MS = 50, FILE_PROTOCOL_PREFIX_LENGTH = 7, FOCUS_ID_PREFIX_LENGTH = 3, FOCUS_IDX_PREFIX_LENGTH = 4, FOCUS_NAME_PREFIX_LENGTH = 5, ESLINT_STUDIO_DEFAULT_HOST = "eslint.absolute.localhost", ESLINT_STUDIO_DEFAULT_PORT = 4099, CONFIG_DEFAULT_HOST = "config.absolute.localhost", CONFIG_DEFAULT_PORT = 4099, HMR_UPDATE_TIMEOUT_MS = 2000, HOOK_SIGNATURE_LENGTH = 12, EXCLUDE_LAST_OFFSET = -1, HTTP_STATUS_OK = 200, HTTP_STATUS_BAD_REQUEST = 400, HTTP_STATUS_NOT_FOUND = 404, HOURS_IN_DAY = 24, HOURS_IN_HALF_DAY = 12, IMAGE_DEFAULT_DEVICE_SIZES, IMAGE_DEFAULT_IMAGE_SIZES, IMAGE_DEFAULT_QUALITY = 75, IMAGE_GLOB_SUFFIX_LENGTH = 2, INSTANCE_PROBE_TIMEOUT_MS = 250, MAX_ERROR_LENGTH = 200, MAX_RECONNECT_ATTEMPTS = 60, MILLISECONDS_IN_A_SECOND = 1000, MINUTES_IN_AN_HOUR = 60, SECONDS_IN_A_MINUTE = 60, MILLISECONDS_IN_A_MINUTE, MILLISECONDS_IN_A_DAY, OVERLAY_FADE_DURATION_MS = 150, PING_INTERVAL_MS = 30000, LIST_LOG_TAIL_MAX_BYTES = 65536, LIST_TUI_COLUMN_GAP = 2, LIST_TUI_DEFAULT_HEIGHT = 28, LIST_TUI_DEFAULT_WIDTH = 100, LIST_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, LIST_TUI_FOOTER_LINE_COUNT = 2, LIST_TUI_MARKER_WIDTH = 2, LIST_TUI_MIN_LOG_HEIGHT = 3, LIST_TUI_MIN_URL_WIDTH = 16, LIST_TUI_RENDER_DEBOUNCE_MS = 16, LIST_TUI_STATUS_MESSAGE_TIMEOUT_MS = 4000, LIST_WATCH_REFRESH_MS = 1000, RAF_BATCH_COUNT = 3, RANDOM_ID_END_INDEX = 11, REBUILD_BATCH_DELAY_MS = 10, REBUILD_RELOAD_DELAY_MS = 200, RECONNECT_INITIAL_DELAY_MS = 500, RECONNECT_POLL_INTERVAL_MS = 300, REACT_STREAM_SLOT_FAST_DELAY_MS = 5, REACT_STREAM_SLOT_SLOW_DELAY_MS = 20, SIGINT_EXIT_CODE = 130, SIGTERM_EXIT_CODE = 143, SVELTE_CSS_LOAD_TIMEOUT_MS = 500, TIME_PRECISION = 2, TWO_THIRDS, UNFOUND_INDEX = -1, WEBSOCKET_NORMAL_CLOSURE = 1000, DEFAULT_WEBSOCKET_IDLE_TIMEOUT_SECONDS = 240, DEFAULT_HTTP_IDLE_TIMEOUT_SECONDS = 240, MAX_HTTP_IDLE_TIMEOUT_SECONDS = 255, WORKSPACE_COMMAND_ARGS_OFFSET = 3, WORKSPACE_FAILURE_LOG_PRINT_LIMIT = 30, WORKSPACE_FAILURE_RECENT_LOG_LIMIT = 60, WORKSPACE_READY_ATTEMPT_TIMEOUT_MS = 5000, WORKSPACE_READY_PROBE_INTERVAL_MS = 250, WORKSPACE_READY_TIMEOUT_MS = 30000, WORKSPACE_SHUTDOWN_TIMEOUT_MS = 1e4, WORKSPACE_TUI_DEFAULT_HEIGHT = 28, WORKSPACE_TUI_DEFAULT_WIDTH = 100, WORKSPACE_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, WORKSPACE_TUI_FOOTER_LINE_COUNT = 3, WORKSPACE_TUI_MIN_LOG_HEIGHT = 3, WORKSPACE_TUI_MIN_SERVICE_NAME_WIDTH = 7, WORKSPACE_TUI_MIN_TARGET_WIDTH = 8, WORKSPACE_TUI_MIN_WRAP_WIDTH = 12, WORKSPACE_TUI_PROMPT_CURSOR_OFFSET = 3, WORKSPACE_TUI_RECENT_LOG_LIMIT = 40, WORKSPACE_TUI_RENDER_DEBOUNCE_MS = 16, WORKSPACE_TUI_STATUS_WIDTH = 10, WORKSPACE_TUI_TARGET_PADDING_WIDTH = 6, WORKSPACE_TUI_VISIBILITY_WIDTH = 8;
320
+ var init_constants = __esm(() => {
321
+ TAILWIND_BUN_CSS_WARNING_PATTERN = /invalid @ rule encountered: '@(theme|tailwind|source|utility|variant|custom-variant|apply|reference|plugin|config)'/;
322
+ IMAGE_DEFAULT_DEVICE_SIZES = [
323
+ 640,
324
+ 750,
325
+ 828,
326
+ 1080,
327
+ 1200,
328
+ 1920,
329
+ 2048,
330
+ 3840
331
+ ];
332
+ IMAGE_DEFAULT_IMAGE_SIZES = [16, 32, 48, 64, 96, 128, 256, 384];
333
+ MILLISECONDS_IN_A_MINUTE = MILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE;
334
+ MILLISECONDS_IN_A_DAY = MILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE * MINUTES_IN_AN_HOUR * HOURS_IN_DAY;
335
+ TWO_THIRDS = 2 / 3;
336
+ });
337
+
315
338
  // src/utils/escapeScriptContent.ts
316
339
  var ESCAPE_LOOKUP, ESCAPE_REGEX, escapeScriptContent = (content) => content.replace(ESCAPE_REGEX, (char) => {
317
340
  const escaped = ESCAPE_LOOKUP[char];
@@ -345,7 +368,7 @@ var SLOT_ID_PREFIX = "abs-slot-", CLOSING_BODY_TAG = "</body>", CLOSING_HEAD_TAG
345
368
  getStreamingSlotsRuntimeScript()
346
369
  ].filter(Boolean).join(";");
347
370
  return `<script${createNonceAttr(nonce)}>${escapeScriptContent(runtimeBody)}</script>`;
348
- }, toUint8 = (value, encoder) => encoder.encode(value), isRecord = (value) => Boolean(value) && typeof value === "object", isSafeHtmlLike = (value) => isRecord(value) && typeof value.changingThisBreaksApplicationSecurity === "string", normalizeSafeHtml = (value) => {
371
+ }, toUint8 = (value, encoder) => encoder.encode(value), isRecord2 = (value) => Boolean(value) && typeof value === "object", isSafeHtmlLike = (value) => isRecord2(value) && typeof value.changingThisBreaksApplicationSecurity === "string", normalizeSafeHtml = (value) => {
349
372
  if (isSafeHtmlLike(value)) {
350
373
  return value.changingThisBreaksApplicationSecurity;
351
374
  }
@@ -406,7 +429,7 @@ var SLOT_ID_PREFIX = "abs-slot-", CLOSING_BODY_TAG = "</body>", CLOSING_HEAD_TAG
406
429
  }, createTimeoutError = (slot, timeoutMs) => {
407
430
  const error = Object.assign(new Error(`Streaming slot "${slot.id}" timed out after ${timeoutMs}ms`), { __absTimeout: true });
408
431
  return error;
409
- }, isSlotPatchPayloadObject = (value) => isRecord(value) && ("html" in value), isTimeoutError = (error) => isRecord(error) && error.__absTimeout === true, toStreamingSlot = (slot, policy) => ({
432
+ }, isSlotPatchPayloadObject = (value) => isRecord2(value) && ("html" in value), isTimeoutError = (error) => isRecord2(error) && error.__absTimeout === true, toStreamingSlot = (slot, policy) => ({
410
433
  errorHtml: slot.errorHtml === undefined ? policy.errorHtml : slot.errorHtml,
411
434
  fallbackHtml: normalizeSlotText(slot.fallbackHtml, policy.fallbackHtml),
412
435
  id: slot.id ?? createStreamingSlotId(),
@@ -988,6 +1011,19 @@ var colors2, frameworkColors, formatPath = (filePath) => {
988
1011
  const errorMsg = error instanceof Error ? error.message : error;
989
1012
  const fullMessage = `${colors2.red}error${colors2.reset} ${message}${errorMsg ? `: ${errorMsg}` : ""}`;
990
1013
  console.error(`${timestamp} ${tag} ${fullMessage}`);
1014
+ }, logHmrClientUpdate = (path, framework, duration, target, serverMs, clientMs, outcome = "applied", kind) => {
1015
+ const timestamp = `${colors2.dim}${formatTimestamp()}${colors2.reset}`;
1016
+ const targetLabel = target.startsWith("capacitor-") ? target.slice("capacitor-".length) : target;
1017
+ const tag = `${colors2.cyan}[hmr:${targetLabel}]${colors2.reset}`;
1018
+ const pathColor = framework ? getFrameworkColor(framework) : colors2.white;
1019
+ const breakdown = serverMs === undefined || clientMs === undefined ? "" : `; server ${serverMs}ms, client ${clientMs}ms`;
1020
+ let action = "failed after";
1021
+ if (outcome === "applied")
1022
+ action = "applied in";
1023
+ else if (outcome === "reloaded")
1024
+ action = "falling back to reload after";
1025
+ const kindLabel = kind ? `${kind} ` : "";
1026
+ console.log(`${timestamp} ${tag} ${framework ?? "update"} ${kindLabel}${pathColor}${formatPath(path)}${colors2.reset} ${colors2.dim}${action} ${duration}ms${breakdown}${colors2.reset}`);
991
1027
  }, logHmrUpdate = (path, framework, duration) => {
992
1028
  log("hmr update", { duration, framework, path });
993
1029
  }, logInfo = (message) => {
@@ -1091,168 +1127,504 @@ var normalizeSlug = (str) => str.trim().replace(/\s+/g, "-").replace(/[^A-Za-z0-
1091
1127
  return normalizeSlug(str).split(/[-_]/).filter(Boolean).map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1).toLowerCase()).join("");
1092
1128
  };
1093
1129
 
1094
- // src/core/streamingSlotRegistrar.ts
1095
- var STREAMING_SLOT_REGISTRAR_KEY = Symbol.for("absolutejs.streamingSlotRegistrar");
1096
- var STREAMING_SLOT_WARNING_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotWarningController");
1097
- var STREAMING_SLOT_COLLECTION_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotCollectionController");
1098
- var getRegisteredStreamingSlotRegistrar = () => {
1099
- const value = Reflect.get(globalThis, STREAMING_SLOT_REGISTRAR_KEY);
1100
- if (typeof value === "function" || value === null) {
1130
+ // src/utils/resolveConvention.ts
1131
+ import { basename } from "path";
1132
+ var CONVENTIONS_KEY = "__absoluteConventions", isConventionsMap = (value) => Boolean(value) && typeof value === "object", getMap = () => {
1133
+ const value = Reflect.get(globalThis, CONVENTIONS_KEY);
1134
+ if (isConventionsMap(value))
1101
1135
  return value;
1102
- }
1103
- return;
1104
- };
1105
- var isObjectRecord = (value) => Boolean(value) && typeof value === "object";
1106
- var isStreamingSlotWarningController = (value) => isObjectRecord(value) && ("maybeWarn" in value) && typeof value.maybeWarn === "function";
1107
- var isStreamingSlotCollectionController = (value) => isObjectRecord(value) && ("isCollecting" in value) && typeof value.isCollecting === "function";
1108
- var getWarningController = () => {
1109
- const value = Reflect.get(globalThis, STREAMING_SLOT_WARNING_STORAGE_KEY);
1110
- if (value === null || typeof value === "undefined")
1111
- return;
1112
- return isStreamingSlotWarningController(value) ? value : undefined;
1113
- };
1114
- var getCollectionController = () => {
1115
- const value = Reflect.get(globalThis, STREAMING_SLOT_COLLECTION_STORAGE_KEY);
1116
- if (value === null || typeof value === "undefined")
1117
- return;
1118
- return isStreamingSlotCollectionController(value) ? value : undefined;
1119
- };
1120
- var hasRegisteredStreamingSlotRegistrar = () => typeof getRegisteredStreamingSlotRegistrar() === "function";
1121
- var isStreamingSlotCollectionActive = () => getCollectionController()?.isCollecting() === true;
1122
- var registerStreamingSlot = (slot) => {
1123
- getRegisteredStreamingSlotRegistrar()?.(slot);
1124
- };
1125
- var setStreamingSlotCollectionController = (controller) => {
1126
- Reflect.set(globalThis, STREAMING_SLOT_COLLECTION_STORAGE_KEY, controller);
1127
- };
1128
- var setStreamingSlotRegistrar = (nextRegistrar) => {
1129
- Reflect.set(globalThis, STREAMING_SLOT_REGISTRAR_KEY, nextRegistrar);
1130
- };
1131
- var setStreamingSlotWarningController = (controller) => {
1132
- Reflect.set(globalThis, STREAMING_SLOT_WARNING_STORAGE_KEY, controller);
1133
- };
1134
- var warnMissingStreamingSlotCollector = (primitiveName) => {
1135
- if (isStreamingSlotCollectionActive()) {
1136
+ const empty = {};
1137
+ return empty;
1138
+ }, derivePageName = (pagePath) => {
1139
+ const base = basename(pagePath);
1140
+ const dotIndex = base.indexOf(".");
1141
+ const name = dotIndex > 0 ? base.slice(0, dotIndex) : base;
1142
+ return toPascal(name);
1143
+ }, normalizeConventionPageName = (name) => toPascal(name).replace(/\d+$/, ""), hasErrorConvention = (framework) => {
1144
+ const conventions = getMap()[framework];
1145
+ if (!conventions)
1146
+ return false;
1147
+ if (conventions.defaults?.error)
1148
+ return true;
1149
+ return Object.values(conventions.pages ?? {}).some((page) => Boolean(page.error));
1150
+ }, resolveErrorConventionPath = (framework, pageName) => {
1151
+ const conventions = getMap()[framework];
1152
+ if (!conventions)
1136
1153
  return;
1154
+ const exact = conventions.pages?.[pageName]?.error;
1155
+ if (exact)
1156
+ return exact;
1157
+ const normalizedPageName = normalizeConventionPageName(pageName);
1158
+ for (const [candidate, page] of Object.entries(conventions.pages ?? {})) {
1159
+ if (normalizeConventionPageName(candidate) === normalizedPageName) {
1160
+ return page.error ?? conventions.defaults?.error;
1161
+ }
1137
1162
  }
1138
- getWarningController()?.maybeWarn(primitiveName);
1139
- };
1140
-
1141
- // src/core/streamingSlotRegistry.ts
1142
- var STREAMING_SLOT_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotAsyncLocalStorage");
1143
- var isObjectRecord2 = (value) => Boolean(value) && typeof value === "object";
1144
- var isAsyncLocalStorage = (value) => isObjectRecord2(value) && ("getStore" in value) && typeof value.getStore === "function" && ("run" in value) && typeof value.run === "function";
1145
- var getStorageGlobal = () => {
1146
- const value = Reflect.get(globalThis, STREAMING_SLOT_STORAGE_KEY);
1147
- if (value === null || typeof value === "undefined") {
1148
- return value;
1149
- }
1150
- return isAsyncLocalStorage(value) ? value : undefined;
1151
- };
1152
- var isServerRuntime = () => typeof process !== "undefined" && typeof process.versions?.node === "string";
1153
- var ensureAsyncLocalStorage = async () => {
1154
- const storage = getStorageGlobal();
1155
- if (typeof storage !== "undefined") {
1156
- return storage;
1157
- }
1158
- if (!isServerRuntime()) {
1159
- Reflect.set(globalThis, STREAMING_SLOT_STORAGE_KEY, null);
1160
- return getStorageGlobal();
1161
- }
1162
- const mod = await import("async_hooks");
1163
- Reflect.set(globalThis, STREAMING_SLOT_STORAGE_KEY, new mod.AsyncLocalStorage);
1164
- return getStorageGlobal();
1165
- };
1166
- var getActiveSlotStore = () => {
1167
- const storage = getStorageGlobal();
1168
- if (!storage)
1169
- return;
1170
- return storage.getStore();
1171
- };
1172
- var registerStreamingSlot2 = (slot) => {
1173
- const store = getActiveSlotStore();
1174
- if (!store)
1175
- return;
1176
- store.set(slot.id, slot);
1177
- };
1178
- setStreamingSlotRegistrar(registerStreamingSlot2);
1179
- setStreamingSlotCollectionController({
1180
- isCollecting: () => getActiveSlotStore() !== undefined
1181
- });
1182
- var hasActiveStreamingSlotRegistry = () => getActiveSlotStore() !== undefined;
1183
- var runWithStreamingSlotRegistry = async (task) => {
1184
- const storage = await ensureAsyncLocalStorage();
1185
- if (!storage) {
1186
- const slots = [];
1163
+ return conventions.defaults?.error;
1164
+ }, resolveNotFoundConventionPath = (framework) => getMap()[framework]?.defaults?.notFound, setConventions = (map) => {
1165
+ Reflect.set(globalThis, CONVENTIONS_KEY, map);
1166
+ }, isDev = () => true, buildErrorProps = (error) => {
1167
+ if (error instanceof Error) {
1187
1168
  return {
1188
- result: await task(),
1189
- slots
1169
+ message: error.message,
1170
+ name: error.name,
1171
+ ...isDev() && error.stack ? { stack: error.stack } : {}
1190
1172
  };
1191
1173
  }
1192
- return storage.run(new Map, async () => {
1193
- const result = await task();
1194
- const store = storage.getStore();
1195
- return {
1196
- result,
1197
- slots: store ? [...store.values()] : []
1198
- };
1174
+ return { message: String(error), name: "Error" };
1175
+ }, renderReactError = async (conventionPath, errorProps) => {
1176
+ const { createElement } = await import("react");
1177
+ const { renderToReadableStream } = await import("react-dom/server");
1178
+ const mod = await import(conventionPath);
1179
+ const ErrorComponent = mod.default;
1180
+ if (typeof ErrorComponent !== "function")
1181
+ return null;
1182
+ const element = createElement(ErrorComponent, errorProps);
1183
+ const stream = await renderToReadableStream(element);
1184
+ return new Response(stream, {
1185
+ headers: { "Content-Type": "text/html" },
1186
+ status: 500
1199
1187
  });
1188
+ }, renderSvelteError = async (conventionPath, errorProps) => {
1189
+ const { render } = await import("svelte/server");
1190
+ const mod = await import(conventionPath);
1191
+ const ErrorComponent = mod.default;
1192
+ if (!ErrorComponent)
1193
+ return null;
1194
+ const { head, body } = render(ErrorComponent, {
1195
+ props: errorProps
1196
+ });
1197
+ const html = `<!DOCTYPE html><html><head>${head}</head><body>${body}</body></html>`;
1198
+ return new Response(html, {
1199
+ headers: { "Content-Type": "text/html" },
1200
+ status: 500
1201
+ });
1202
+ }, unescapeVueStyles = (ssrBody) => {
1203
+ let styles = "";
1204
+ const body = ssrBody.replace(/<style>([\s\S]*?)<\/style>/g, (_, css) => {
1205
+ styles += `<style>${css.replace(/&quot;/g, '"').replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">")}</style>`;
1206
+ return "";
1207
+ });
1208
+ return { body, styles };
1209
+ }, renderVueError = async (conventionPath, errorProps) => {
1210
+ const { createSSRApp, h } = await import("vue");
1211
+ const { renderToString } = await import("vue/server-renderer");
1212
+ const mod = await import(conventionPath);
1213
+ const ErrorComponent = mod.default;
1214
+ if (!ErrorComponent)
1215
+ return null;
1216
+ const app = createSSRApp({
1217
+ render: () => h(ErrorComponent, errorProps)
1218
+ });
1219
+ const rawBody = await renderToString(app);
1220
+ const { styles, body } = unescapeVueStyles(rawBody);
1221
+ const html = `<!DOCTYPE html><html><head>${styles}</head><body><div id="root">${body}</div></body></html>`;
1222
+ return new Response(html, {
1223
+ headers: { "Content-Type": "text/html" },
1224
+ status: 500
1225
+ });
1226
+ }, renderAngularError = async (conventionPath, errorProps) => {
1227
+ const mod = await import(conventionPath);
1228
+ const renderFn = mod.default;
1229
+ if (typeof renderFn !== "function")
1230
+ return null;
1231
+ const html = renderFn(errorProps);
1232
+ return new Response(html, {
1233
+ headers: { "Content-Type": "text/html" },
1234
+ status: 500
1235
+ });
1236
+ }, escapeHtml = (value) => value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;"), replaceErrorTokens = (template, errorProps) => template.replace(/\{\{\s*name\s*\}\}/g, escapeHtml(errorProps.name)).replace(/\{\{\s*message\s*\}\}/g, escapeHtml(errorProps.message)).replace(/\{\{\s*stack\s*\}\}/g, errorProps.stack ? escapeHtml(errorProps.stack) : ""), renderHtmlError = async (conventionPath, errorProps) => {
1237
+ const template = await Bun.file(conventionPath).text();
1238
+ const html = replaceErrorTokens(template, errorProps);
1239
+ return new Response(html, {
1240
+ headers: { "Content-Type": "text/html" },
1241
+ status: 500
1242
+ });
1243
+ }, logConventionRenderError = (framework, label, renderError) => {
1244
+ const message = renderError instanceof Error ? renderError.message : "";
1245
+ if (message.includes("Cannot find module") || message.includes("Cannot find package") || message.includes("not found in module")) {
1246
+ console.error(`[SSR] Convention ${label} page for ${framework} failed: missing framework package. Ensure the ${framework} runtime is installed (e.g. bun add ${framework === "react" ? "react react-dom" : framework}).`);
1247
+ return;
1248
+ }
1249
+ console.error(`[SSR] Failed to render ${framework} convention ${label} page:`, renderError);
1250
+ }, renderEmberError = async () => null, renderEmberNotFound = async () => null, ERROR_RENDERERS, tryFrameworkErrorConvention = async (framework, pageName, errorProps, error) => {
1251
+ let conventionPath = resolveErrorConventionPath(framework, pageName);
1252
+ if (!conventionPath && error instanceof Error && error.stack) {
1253
+ for (const match of error.stack.matchAll(/^\s*at\s+([A-Za-z_$][\w$]*)/gm)) {
1254
+ const [, candidate] = match;
1255
+ if (!candidate)
1256
+ continue;
1257
+ conventionPath = resolveErrorConventionPath(framework, candidate);
1258
+ if (conventionPath)
1259
+ break;
1260
+ }
1261
+ }
1262
+ if (!conventionPath)
1263
+ return null;
1264
+ const renderer = ERROR_RENDERERS[framework];
1265
+ if (!renderer)
1266
+ return null;
1267
+ try {
1268
+ return await renderer(conventionPath, errorProps);
1269
+ } catch (renderError) {
1270
+ logConventionRenderError(framework, "error", renderError);
1271
+ }
1272
+ return null;
1273
+ }, renderConventionError = async (framework, pageName, error) => {
1274
+ const errorProps = buildErrorProps(error);
1275
+ const frameworkResponse = await tryFrameworkErrorConvention(framework, pageName, errorProps, error);
1276
+ if (frameworkResponse)
1277
+ return frameworkResponse;
1278
+ if (framework !== "html") {
1279
+ const htmlResponse = await tryFrameworkErrorConvention("html", pageName, errorProps, error);
1280
+ if (htmlResponse)
1281
+ return htmlResponse;
1282
+ }
1283
+ return null;
1284
+ }, renderReactNotFound = async (conventionPath) => {
1285
+ const { createElement } = await import("react");
1286
+ const { renderToReadableStream } = await import("react-dom/server");
1287
+ const mod = await import(conventionPath);
1288
+ const NotFoundComponent = mod.default;
1289
+ if (typeof NotFoundComponent !== "function")
1290
+ return null;
1291
+ const element = createElement(NotFoundComponent);
1292
+ const stream = await renderToReadableStream(element);
1293
+ return new Response(stream, {
1294
+ headers: { "Content-Type": "text/html" },
1295
+ status: 404
1296
+ });
1297
+ }, renderSvelteNotFound = async (conventionPath) => {
1298
+ const { render } = await import("svelte/server");
1299
+ const mod = await import(conventionPath);
1300
+ const NotFoundComponent = mod.default;
1301
+ if (!NotFoundComponent)
1302
+ return null;
1303
+ const { head, body } = render(NotFoundComponent);
1304
+ const html = `<!DOCTYPE html><html><head>${head}</head><body>${body}</body></html>`;
1305
+ return new Response(html, {
1306
+ headers: { "Content-Type": "text/html" },
1307
+ status: 404
1308
+ });
1309
+ }, renderVueNotFound = async (conventionPath) => {
1310
+ const { createSSRApp, h } = await import("vue");
1311
+ const { renderToString } = await import("vue/server-renderer");
1312
+ const mod = await import(conventionPath);
1313
+ const NotFoundComponent = mod.default;
1314
+ if (!NotFoundComponent)
1315
+ return null;
1316
+ const app = createSSRApp({
1317
+ render: () => h(NotFoundComponent)
1318
+ });
1319
+ const rawBody = await renderToString(app);
1320
+ const { styles, body } = unescapeVueStyles(rawBody);
1321
+ const html = `<!DOCTYPE html><html><head>${styles}</head><body><div id="root">${body}</div></body></html>`;
1322
+ return new Response(html, {
1323
+ headers: { "Content-Type": "text/html" },
1324
+ status: 404
1325
+ });
1326
+ }, renderAngularNotFound = async (conventionPath) => {
1327
+ const mod = await import(conventionPath);
1328
+ const renderFn = mod.default;
1329
+ if (typeof renderFn !== "function")
1330
+ return null;
1331
+ const html = renderFn();
1332
+ return new Response(html, {
1333
+ headers: { "Content-Type": "text/html" },
1334
+ status: 404
1335
+ });
1336
+ }, renderHtmlNotFound = async (conventionPath) => {
1337
+ const html = await Bun.file(conventionPath).text();
1338
+ return new Response(html, {
1339
+ headers: { "Content-Type": "text/html" },
1340
+ status: 404
1341
+ });
1342
+ }, NOT_FOUND_RENDERERS, renderConventionNotFound = async (framework) => {
1343
+ const conventionPath = resolveNotFoundConventionPath(framework);
1344
+ if (!conventionPath)
1345
+ return null;
1346
+ const renderer = NOT_FOUND_RENDERERS[framework];
1347
+ if (!renderer)
1348
+ return null;
1349
+ try {
1350
+ return await renderer(conventionPath);
1351
+ } catch (renderError) {
1352
+ logConventionRenderError(framework, "not-found", renderError);
1353
+ }
1354
+ return null;
1355
+ }, NOT_FOUND_PRIORITY, renderFirstNotFound = async () => {
1356
+ const renderNext = async (frameworks2) => {
1357
+ const [framework, ...remaining] = frameworks2;
1358
+ if (!framework) {
1359
+ return null;
1360
+ }
1361
+ if (!getMap()[framework]?.defaults?.notFound) {
1362
+ return renderNext(remaining);
1363
+ }
1364
+ const response = await renderConventionNotFound(framework);
1365
+ if (response) {
1366
+ return response;
1367
+ }
1368
+ return renderNext(remaining);
1369
+ };
1370
+ return renderNext(NOT_FOUND_PRIORITY);
1371
+ };
1372
+ var init_resolveConvention = __esm(() => {
1373
+ ERROR_RENDERERS = {
1374
+ angular: renderAngularError,
1375
+ ember: renderEmberError,
1376
+ html: renderHtmlError,
1377
+ react: renderReactError,
1378
+ svelte: renderSvelteError,
1379
+ vue: renderVueError
1380
+ };
1381
+ NOT_FOUND_RENDERERS = {
1382
+ angular: renderAngularNotFound,
1383
+ ember: renderEmberNotFound,
1384
+ html: renderHtmlNotFound,
1385
+ react: renderReactNotFound,
1386
+ svelte: renderSvelteNotFound,
1387
+ vue: renderVueNotFound
1388
+ };
1389
+ NOT_FOUND_PRIORITY = [
1390
+ "react",
1391
+ "svelte",
1392
+ "vue",
1393
+ "angular",
1394
+ "html"
1395
+ ];
1396
+ });
1397
+
1398
+ // src/utils/spaRouteManifest.ts
1399
+ import { basename as basename2 } from "path";
1400
+ var SPA_ROUTES_KEY = "__absoluteSpaRoutes", setSpaRouteManifest = (hosts) => {
1401
+ Reflect.set(globalThis, SPA_ROUTES_KEY, hosts);
1402
+ }, isRuntimeSpaHost = (value) => typeof value === "object" && value !== null && typeof Reflect.get(value, "framework") === "string", getSpaRouteManifest = () => {
1403
+ const value = Reflect.get(globalThis, SPA_ROUTES_KEY);
1404
+ return Array.isArray(value) ? value.filter(isRuntimeSpaHost) : [];
1405
+ }, normalizePath = (path) => {
1406
+ const withLeadingSlash = path.startsWith("/") ? path : `/${path}`;
1407
+ const trimmed = withLeadingSlash.replace(/\/+$/, "");
1408
+ return trimmed || "/";
1409
+ }, fullRoutePath = (baseHref, routePath) => {
1410
+ const base = normalizePath(baseHref);
1411
+ const route = normalizePath(routePath);
1412
+ if (base !== "/" && (route === base || route.startsWith(`${base}/`))) {
1413
+ return route;
1414
+ }
1415
+ if (base === "/")
1416
+ return route;
1417
+ return normalizePath(`${base}/${route.replace(/^\/+/, "")}`);
1418
+ }, routePattern = (path) => {
1419
+ const segments = normalizePath(path).split("/").filter(Boolean);
1420
+ let expression = "^";
1421
+ for (const segment of segments) {
1422
+ if (segment === "*" || segment === "**") {
1423
+ expression += "(?:/.*)?";
1424
+ continue;
1425
+ }
1426
+ const parameter = /^:[A-Za-z_$][A-Za-z0-9_$]*(?:\((.*)\))?(\?)?$/.exec(segment);
1427
+ if (parameter) {
1428
+ const valuePattern = parameter[1] || "[^/]+";
1429
+ expression += parameter[2] ? `(?:/${valuePattern})?` : `/${valuePattern}`;
1430
+ continue;
1431
+ }
1432
+ expression += `/${segment.replace(/[.+?^${}()|[\]\\]/g, "\\$&")}`;
1433
+ }
1434
+ return new RegExp(`${expression || "^/"}/?$`);
1435
+ }, sourcePageName = (sourceFile) => basename2(sourceFile).replace(/\.[^.]+$/, "").toLowerCase(), isKnownSpaRoute = (framework, pageName, request) => {
1436
+ if (!request)
1437
+ return true;
1438
+ let pathname;
1439
+ try {
1440
+ pathname = normalizePath(new URL(request.url).pathname);
1441
+ } catch {
1442
+ return true;
1443
+ }
1444
+ const hosts = getSpaRouteManifest().filter((host) => {
1445
+ if (host.framework !== framework)
1446
+ return false;
1447
+ if (sourcePageName(host.sourceFile) !== pageName.toLowerCase())
1448
+ return false;
1449
+ const base = normalizePath(host.baseHref);
1450
+ return base === "/" || pathname === base || pathname.startsWith(`${base}/`);
1451
+ });
1452
+ if (hosts.length === 0)
1453
+ return true;
1454
+ return hosts.some((host) => host.routes.some((route) => routePattern(fullRoutePath(host.baseHref, route.path)).test(pathname)));
1455
+ }, renderSpaNotFound = async (framework, pageName, request) => {
1456
+ if (isKnownSpaRoute(framework, pageName, request))
1457
+ return null;
1458
+ return await renderFirstNotFound() ?? new Response("Not found", {
1459
+ headers: { "Content-Type": "text/plain" },
1460
+ status: 404
1461
+ });
1462
+ };
1463
+ var init_spaRouteManifest = __esm(() => {
1464
+ init_resolveConvention();
1465
+ });
1466
+
1467
+ // src/core/streamingSlotRegistrar.ts
1468
+ var STREAMING_SLOT_REGISTRAR_KEY = Symbol.for("absolutejs.streamingSlotRegistrar");
1469
+ var STREAMING_SLOT_WARNING_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotWarningController");
1470
+ var STREAMING_SLOT_COLLECTION_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotCollectionController");
1471
+ var getRegisteredStreamingSlotRegistrar = () => {
1472
+ const value = Reflect.get(globalThis, STREAMING_SLOT_REGISTRAR_KEY);
1473
+ if (typeof value === "function" || value === null) {
1474
+ return value;
1475
+ }
1476
+ return;
1477
+ };
1478
+ var isObjectRecord = (value) => Boolean(value) && typeof value === "object";
1479
+ var isStreamingSlotWarningController = (value) => isObjectRecord(value) && ("maybeWarn" in value) && typeof value.maybeWarn === "function";
1480
+ var isStreamingSlotCollectionController = (value) => isObjectRecord(value) && ("isCollecting" in value) && typeof value.isCollecting === "function";
1481
+ var getWarningController = () => {
1482
+ const value = Reflect.get(globalThis, STREAMING_SLOT_WARNING_STORAGE_KEY);
1483
+ if (value === null || typeof value === "undefined")
1484
+ return;
1485
+ return isStreamingSlotWarningController(value) ? value : undefined;
1486
+ };
1487
+ var getCollectionController = () => {
1488
+ const value = Reflect.get(globalThis, STREAMING_SLOT_COLLECTION_STORAGE_KEY);
1489
+ if (value === null || typeof value === "undefined")
1490
+ return;
1491
+ return isStreamingSlotCollectionController(value) ? value : undefined;
1492
+ };
1493
+ var hasRegisteredStreamingSlotRegistrar = () => typeof getRegisteredStreamingSlotRegistrar() === "function";
1494
+ var isStreamingSlotCollectionActive = () => getCollectionController()?.isCollecting() === true;
1495
+ var registerStreamingSlot = (slot) => {
1496
+ getRegisteredStreamingSlotRegistrar()?.(slot);
1497
+ };
1498
+ var setStreamingSlotCollectionController = (controller) => {
1499
+ Reflect.set(globalThis, STREAMING_SLOT_COLLECTION_STORAGE_KEY, controller);
1500
+ };
1501
+ var setStreamingSlotRegistrar = (nextRegistrar) => {
1502
+ Reflect.set(globalThis, STREAMING_SLOT_REGISTRAR_KEY, nextRegistrar);
1503
+ };
1504
+ var setStreamingSlotWarningController = (controller) => {
1505
+ Reflect.set(globalThis, STREAMING_SLOT_WARNING_STORAGE_KEY, controller);
1506
+ };
1507
+ var warnMissingStreamingSlotCollector = (primitiveName) => {
1508
+ if (isStreamingSlotCollectionActive()) {
1509
+ return;
1510
+ }
1511
+ getWarningController()?.maybeWarn(primitiveName);
1512
+ };
1513
+
1514
+ // src/core/streamingSlotRegistry.ts
1515
+ var STREAMING_SLOT_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotAsyncLocalStorage");
1516
+ var isObjectRecord2 = (value) => Boolean(value) && typeof value === "object";
1517
+ var isAsyncLocalStorage = (value) => isObjectRecord2(value) && ("getStore" in value) && typeof value.getStore === "function" && ("run" in value) && typeof value.run === "function";
1518
+ var getStorageGlobal = () => {
1519
+ const value = Reflect.get(globalThis, STREAMING_SLOT_STORAGE_KEY);
1520
+ if (value === null || typeof value === "undefined") {
1521
+ return value;
1522
+ }
1523
+ return isAsyncLocalStorage(value) ? value : undefined;
1524
+ };
1525
+ var isServerRuntime = () => typeof process !== "undefined" && typeof process.versions?.node === "string";
1526
+ var ensureAsyncLocalStorage = async () => {
1527
+ const storage = getStorageGlobal();
1528
+ if (typeof storage !== "undefined") {
1529
+ return storage;
1530
+ }
1531
+ if (!isServerRuntime()) {
1532
+ Reflect.set(globalThis, STREAMING_SLOT_STORAGE_KEY, null);
1533
+ return getStorageGlobal();
1534
+ }
1535
+ const mod = await import("async_hooks");
1536
+ Reflect.set(globalThis, STREAMING_SLOT_STORAGE_KEY, new mod.AsyncLocalStorage);
1537
+ return getStorageGlobal();
1538
+ };
1539
+ var getActiveSlotStore = () => {
1540
+ const storage = getStorageGlobal();
1541
+ if (!storage)
1542
+ return;
1543
+ return storage.getStore();
1544
+ };
1545
+ var registerStreamingSlot2 = (slot) => {
1546
+ const store = getActiveSlotStore();
1547
+ if (!store)
1548
+ return;
1549
+ store.set(slot.id, slot);
1550
+ };
1551
+ setStreamingSlotRegistrar(registerStreamingSlot2);
1552
+ setStreamingSlotCollectionController({
1553
+ isCollecting: () => getActiveSlotStore() !== undefined
1554
+ });
1555
+ var hasActiveStreamingSlotRegistry = () => getActiveSlotStore() !== undefined;
1556
+ var runWithStreamingSlotRegistry = async (task) => {
1557
+ const storage = await ensureAsyncLocalStorage();
1558
+ if (!storage) {
1559
+ const slots = [];
1560
+ return {
1561
+ result: await task(),
1562
+ slots
1563
+ };
1564
+ }
1565
+ return storage.run(new Map, async () => {
1566
+ const result = await task();
1567
+ const store = storage.getStore();
1568
+ return {
1569
+ result,
1570
+ slots: store ? [...store.values()] : []
1571
+ };
1572
+ });
1573
+ };
1574
+
1575
+ // src/core/islandPageContext.ts
1576
+ var BOOTSTRAP_MANIFEST_KEY = "BootstrapClient";
1577
+ var ISLAND_MARKER = 'data-island="true"';
1578
+ var MANIFEST_MARKER = "__ABSOLUTE_MANIFEST__";
1579
+ var ISLAND_STATE_MARKER = "__ABS_ISLAND_STATE__";
1580
+ var CLOSING_HEAD_TAG = "</head>";
1581
+ var buildIslandsHeadMarkup = (manifest) => {
1582
+ const manifestScript = `<script>window.__ABSOLUTE_MANIFEST__ = ${JSON.stringify(manifest)}</script>`;
1583
+ const islandStateScript = `<script>window.__ABS_ISLAND_STATE__ = ${JSON.stringify(globalThis.__ABS_ISLAND_STATE__ ?? {})}</script>`;
1584
+ const bootstrapPath = manifest[BOOTSTRAP_MANIFEST_KEY];
1585
+ const bootstrapScript = bootstrapPath ? `<script type="module" src="${bootstrapPath}"></script>` : "";
1586
+ return `${manifestScript}${islandStateScript}${bootstrapScript}`;
1587
+ };
1588
+ var injectHeadMarkup = (html, markup) => {
1589
+ const closingHeadIndex = html.indexOf("</head>");
1590
+ if (closingHeadIndex >= 0) {
1591
+ return `${html.slice(0, closingHeadIndex)}${markup}${html.slice(closingHeadIndex)}`;
1592
+ }
1593
+ const openingBodyIndex = html.indexOf("<body");
1594
+ if (openingBodyIndex >= 0) {
1595
+ const bodyStart = html.indexOf(">", openingBodyIndex);
1596
+ if (bodyStart >= 0) {
1597
+ return `${html.slice(0, openingBodyIndex)}<head>${markup}</head>${html.slice(openingBodyIndex)}`;
1598
+ }
1599
+ }
1600
+ return `<!DOCTYPE html><html><head>${markup}</head><body>${html}</body></html>`;
1601
+ };
1602
+ var streamChunkToString = (value, decoder) => typeof value === "string" ? value : decoder.decode(value, { stream: true });
1603
+ var flushSafePendingText = (controller, encoder, pending, lookbehind) => {
1604
+ if (pending.length <= lookbehind) {
1605
+ return pending;
1606
+ }
1607
+ const safeText = pending.slice(0, pending.length - lookbehind);
1608
+ controller.enqueue(encoder.encode(safeText));
1609
+ return pending.slice(-lookbehind);
1610
+ };
1611
+ var updateInjectedState = (consumed, injected, pending) => {
1612
+ if (consumed.done) {
1613
+ return { done: true, injected, pending };
1614
+ }
1615
+ return {
1616
+ done: false,
1617
+ injected: consumed.injected,
1618
+ pending: consumed.pending
1619
+ };
1620
+ };
1621
+ var readStreamChunk = async (reader) => {
1622
+ const { done, value } = await reader.read();
1623
+ if (done || !value) {
1624
+ return { done, value: undefined };
1625
+ }
1626
+ return { done, value };
1200
1627
  };
1201
-
1202
- // src/core/islandPageContext.ts
1203
- init_constants();
1204
- var BOOTSTRAP_MANIFEST_KEY = "BootstrapClient";
1205
- var ISLAND_MARKER = 'data-island="true"';
1206
- var MANIFEST_MARKER = "__ABSOLUTE_MANIFEST__";
1207
- var ISLAND_STATE_MARKER = "__ABS_ISLAND_STATE__";
1208
- var CLOSING_HEAD_TAG = "</head>";
1209
- var buildIslandsHeadMarkup = (manifest) => {
1210
- const manifestScript = `<script>window.__ABSOLUTE_MANIFEST__ = ${JSON.stringify(manifest)}</script>`;
1211
- const islandStateScript = `<script>window.__ABS_ISLAND_STATE__ = ${JSON.stringify(globalThis.__ABS_ISLAND_STATE__ ?? {})}</script>`;
1212
- const bootstrapPath = manifest[BOOTSTRAP_MANIFEST_KEY];
1213
- const bootstrapScript = bootstrapPath ? `<script type="module" src="${bootstrapPath}"></script>` : "";
1214
- return `${manifestScript}${islandStateScript}${bootstrapScript}`;
1215
- };
1216
- var injectHeadMarkup = (html, markup) => {
1217
- const closingHeadIndex = html.indexOf("</head>");
1218
- if (closingHeadIndex >= 0) {
1219
- return `${html.slice(0, closingHeadIndex)}${markup}${html.slice(closingHeadIndex)}`;
1220
- }
1221
- const openingBodyIndex = html.indexOf("<body");
1222
- if (openingBodyIndex >= 0) {
1223
- const bodyStart = html.indexOf(">", openingBodyIndex);
1224
- if (bodyStart >= 0) {
1225
- return `${html.slice(0, openingBodyIndex)}<head>${markup}</head>${html.slice(openingBodyIndex)}`;
1226
- }
1227
- }
1228
- return `<!DOCTYPE html><html><head>${markup}</head><body>${html}</body></html>`;
1229
- };
1230
- var streamChunkToString = (value, decoder) => typeof value === "string" ? value : decoder.decode(value, { stream: true });
1231
- var flushSafePendingText = (controller, encoder, pending, lookbehind) => {
1232
- if (pending.length <= lookbehind) {
1233
- return pending;
1234
- }
1235
- const safeText = pending.slice(0, pending.length - lookbehind);
1236
- controller.enqueue(encoder.encode(safeText));
1237
- return pending.slice(-lookbehind);
1238
- };
1239
- var updateInjectedState = (consumed, injected, pending) => {
1240
- if (consumed.done) {
1241
- return { done: true, injected, pending };
1242
- }
1243
- return {
1244
- done: false,
1245
- injected: consumed.injected,
1246
- pending: consumed.pending
1247
- };
1248
- };
1249
- var readStreamChunk = async (reader) => {
1250
- const { done, value } = await reader.read();
1251
- if (done || !value) {
1252
- return { done, value: undefined };
1253
- }
1254
- return { done, value };
1255
- };
1256
1628
  var pipeStreamWithHeadInjection = (stream, markup) => {
1257
1629
  const encoder = new TextEncoder;
1258
1630
  const decoder = new TextDecoder;
@@ -1321,61 +1693,69 @@ var pipeStreamWithHeadInjection = (stream, markup) => {
1321
1693
  var pipeStreamWithIslandMarkerDetection = (stream, markup) => {
1322
1694
  const encoder = new TextEncoder;
1323
1695
  const decoder = new TextDecoder;
1324
- const lookbehind = Math.max(ISLAND_MARKER.length, BYTES_PER_KILOBYTE);
1325
- const processPending = (controller, pending, injected) => {
1326
- if (injected) {
1327
- controller.enqueue(encoder.encode(pending));
1328
- return { injected, pending: "" };
1696
+ const headLookbehind = CLOSING_HEAD_TAG.length - 1;
1697
+ const enqueue = (controller, text) => {
1698
+ if (text.length > 0) {
1699
+ controller.enqueue(encoder.encode(text));
1329
1700
  }
1330
- const markerIndex = pending.indexOf(ISLAND_MARKER);
1331
- if (markerIndex >= 0) {
1332
- const tagStart = pending.lastIndexOf("<", markerIndex);
1333
- const injectAt = tagStart >= 0 ? tagStart : markerIndex;
1334
- const next = `${pending.slice(0, injectAt)}${markup}${pending.slice(injectAt)}`;
1335
- controller.enqueue(encoder.encode(next));
1336
- return { injected: true, pending: "" };
1701
+ };
1702
+ const processHolding = (controller, held) => {
1703
+ if (!held.includes(ISLAND_MARKER)) {
1704
+ return { held, injected: false, pending: "", sawHead: true };
1337
1705
  }
1338
- return {
1339
- injected,
1340
- pending: flushSafePendingText(controller, encoder, pending, lookbehind)
1341
- };
1706
+ enqueue(controller, `${markup}${held}`);
1707
+ return { held: "", injected: true, pending: "", sawHead: true };
1342
1708
  };
1343
- const finishIslandMarkerStream = (controller, pending) => {
1344
- const finalPending = pending + decoder.decode();
1345
- if (finalPending.length > 0) {
1346
- controller.enqueue(encoder.encode(finalPending));
1709
+ const processHead = (controller, pending) => {
1710
+ const headIndex = pending.indexOf(CLOSING_HEAD_TAG);
1711
+ if (headIndex < 0) {
1712
+ return {
1713
+ held: "",
1714
+ injected: false,
1715
+ pending: flushSafePendingText(controller, encoder, pending, headLookbehind),
1716
+ sawHead: false
1717
+ };
1347
1718
  }
1348
- controller.close();
1719
+ enqueue(controller, pending.slice(0, headIndex));
1720
+ return processHolding(controller, pending.slice(headIndex));
1349
1721
  };
1350
- const consumeIslandChunk = async (controller, reader, pending, injected) => {
1351
- const { done, value } = await readStreamChunk(reader);
1352
- if (done || !value) {
1353
- return { done, injected, pending };
1722
+ const processChunk = (controller, state, chunk) => {
1723
+ if (state.injected) {
1724
+ enqueue(controller, chunk);
1725
+ return state;
1354
1726
  }
1355
- const processed = processPending(controller, pending + streamChunkToString(value, decoder), injected);
1356
- return {
1357
- done,
1358
- injected: processed.injected,
1359
- pending: processed.pending
1360
- };
1727
+ if (!state.sawHead) {
1728
+ return processHead(controller, state.pending + chunk);
1729
+ }
1730
+ return processHolding(controller, state.held + chunk);
1361
1731
  };
1362
- const runIslandMarkerLoop = async (controller, reader) => {
1363
- const consumeNextIslandChunk = async (injected, pending) => {
1364
- const consumed = await consumeIslandChunk(controller, reader, pending, injected);
1365
- const nextState = updateInjectedState(consumed, injected, pending);
1366
- if (nextState.done) {
1367
- return { injected, pending };
1732
+ const finishMarkerStream = (controller, state) => {
1733
+ const tail = decoder.decode();
1734
+ const remainder = state.injected ? tail : (state.sawHead ? state.held : state.pending) + tail;
1735
+ enqueue(controller, remainder);
1736
+ controller.close();
1737
+ };
1738
+ const runMarkerLoop = (controller, reader) => {
1739
+ const consumeNext = async (state) => {
1740
+ const { done, value } = await readStreamChunk(reader);
1741
+ if (done || !value) {
1742
+ return state;
1368
1743
  }
1369
- return consumeNextIslandChunk(nextState.injected, nextState.pending);
1744
+ return consumeNext(processChunk(controller, state, streamChunkToString(value, decoder)));
1370
1745
  };
1371
- return consumeNextIslandChunk(false, "");
1746
+ return consumeNext({
1747
+ held: "",
1748
+ injected: false,
1749
+ pending: "",
1750
+ sawHead: false
1751
+ });
1372
1752
  };
1373
1753
  return new ReadableStream({
1374
1754
  async start(controller) {
1375
1755
  const reader = stream.getReader();
1376
1756
  try {
1377
- const { pending } = await runIslandMarkerLoop(controller, reader);
1378
- finishIslandMarkerStream(controller, pending);
1757
+ const finalState = await runMarkerLoop(controller, reader);
1758
+ finishMarkerStream(controller, finalState);
1379
1759
  } catch (error) {
1380
1760
  controller.error(error);
1381
1761
  }
@@ -1405,17 +1785,291 @@ var injectIslandPageContextStream = (stream, options) => {
1405
1785
  if (options?.hasIslands === false) {
1406
1786
  return stream;
1407
1787
  }
1408
- return pipeStreamWithIslandMarkerDetection(stream, markup);
1409
- };
1410
- var setCurrentIslandManifest = (manifest) => {
1411
- globalThis.__absoluteManifest = manifest;
1788
+ return pipeStreamWithIslandMarkerDetection(stream, markup);
1789
+ };
1790
+ var setCurrentIslandManifest = (manifest) => {
1791
+ globalThis.__absoluteManifest = manifest;
1792
+ };
1793
+
1794
+ // src/react/pageHandler.ts
1795
+ init_devRouteRegistrationCallsite();
1796
+
1797
+ // src/core/requestContext.ts
1798
+ import { AsyncLocalStorage as AsyncLocalStorage2 } from "async_hooks";
1799
+ import { Elysia as Elysia2 } from "elysia";
1800
+ var REQUEST_STORAGE_KEY = Symbol.for("absolutejs.requestAsyncLocalStorage");
1801
+ var isAbsoluteRequestStorage = (value) => typeof value === "object" && value !== null && ("getStore" in value) && typeof value.getStore === "function" && ("run" in value) && typeof value.run === "function";
1802
+ var getRequestStorage = () => {
1803
+ const value = Reflect.get(globalThis, REQUEST_STORAGE_KEY);
1804
+ return isAbsoluteRequestStorage(value) ? value : undefined;
1805
+ };
1806
+ var ensureRequestStorage = () => {
1807
+ const existing = getRequestStorage();
1808
+ if (existing)
1809
+ return existing;
1810
+ const storage = new AsyncLocalStorage2;
1811
+ Reflect.set(globalThis, REQUEST_STORAGE_KEY, storage);
1812
+ return storage;
1813
+ };
1814
+ var absoluteRequestContext = new Elysia2({
1815
+ name: "absolutejs-request-context"
1816
+ }).request(({ request }) => {
1817
+ ensureRequestStorage().enterWith({ request });
1818
+ }).as("global");
1819
+ var getCurrentAbsoluteRequest = () => getRequestStorage()?.getStore()?.request;
1820
+ var runWithAbsoluteRequest = (request, callback) => ensureRequestStorage().run({ request }, callback);
1821
+
1822
+ // src/mobile/producerContextState.ts
1823
+ var ABSOLUTE_MOBILE_PRODUCER_STORAGE_KEY = Symbol.for("absolutejs.mobileProducerAsyncLocalStorage");
1824
+ var frameworks = new Set([
1825
+ "angular",
1826
+ "ember",
1827
+ "html",
1828
+ "htmx",
1829
+ "react",
1830
+ "svelte",
1831
+ "vue"
1832
+ ]);
1833
+ var isCompatibilityPage = (value) => typeof value === "object" && value !== null && ("bundleHash" in value) && typeof value.bundleHash === "string" && ("contract" in value) && typeof value.contract === "string" && ("framework" in value) && typeof value.framework === "string" && frameworks.has(value.framework) && ("pageId" in value) && typeof value.pageId === "string" && ("propsSchemaHash" in value) && typeof value.propsSchemaHash === "string";
1834
+ var getCurrentAbsoluteMobileProducerContext = () => {
1835
+ const value = Reflect.get(globalThis, ABSOLUTE_MOBILE_PRODUCER_STORAGE_KEY);
1836
+ if (typeof value !== "object" || value === null || !("getStore" in value) || typeof value.getStore !== "function") {
1837
+ return;
1838
+ }
1839
+ const context = value.getStore();
1840
+ if (typeof context !== "object" || context === null || !("page" in context) || !isCompatibilityPage(context.page) || !("releaseId" in context) || typeof context.releaseId !== "string") {
1841
+ return;
1842
+ }
1843
+ return { page: context.page, releaseId: context.releaseId };
1844
+ };
1845
+
1846
+ // src/mobile/pageProtocol.ts
1847
+ var ABSOLUTE_MOBILE_PAGE_MEDIA_TYPE = "application/vnd.absolute.page+json";
1848
+ var ABSOLUTE_MOBILE_PAGE_PROTOCOL_VERSION = 1;
1849
+ var BAD_REQUEST_STATUS = 400;
1850
+ var OK_STATUS = 200;
1851
+ var SERVER_ERROR_STATUS = 500;
1852
+ var UPGRADE_REQUIRED_STATUS = 426;
1853
+ var MOBILE_PAGE_REQUEST_HEADERS = {
1854
+ appBuild: "x-absolute-mobile-app-build",
1855
+ pageBundle: "x-absolute-mobile-page-bundle",
1856
+ pageContracts: "x-absolute-mobile-page-contracts",
1857
+ pageId: "x-absolute-mobile-page-id",
1858
+ protocol: "x-absolute-mobile-protocol",
1859
+ runtime: "x-absolute-mobile-runtime"
1860
+ };
1861
+ var parseMediaType = (value) => value.split(";", 1)[0]?.trim().toLowerCase();
1862
+ var acceptsAbsoluteMobilePage = (request) => {
1863
+ if (!request)
1864
+ return false;
1865
+ return (request.headers.get("accept") ?? "").split(",").some((value) => parseMediaType(value) === ABSOLUTE_MOBILE_PAGE_MEDIA_TYPE);
1866
+ };
1867
+ var readRequiredHeader = (request, name) => {
1868
+ const value = request.headers.get(name)?.trim();
1869
+ return value ? value : undefined;
1870
+ };
1871
+ var parseAbsoluteMobilePageRequest = (request) => {
1872
+ if (!request || !acceptsAbsoluteMobilePage(request)) {
1873
+ return { kind: "not-mobile" };
1874
+ }
1875
+ const protocolValue = readRequiredHeader(request, MOBILE_PAGE_REQUEST_HEADERS.protocol);
1876
+ const runtime = readRequiredHeader(request, MOBILE_PAGE_REQUEST_HEADERS.runtime);
1877
+ const appBuild = readRequiredHeader(request, MOBILE_PAGE_REQUEST_HEADERS.appBuild);
1878
+ const pageBundle = readRequiredHeader(request, MOBILE_PAGE_REQUEST_HEADERS.pageBundle);
1879
+ const pageContractsValue = readRequiredHeader(request, MOBILE_PAGE_REQUEST_HEADERS.pageContracts);
1880
+ const pageId = readRequiredHeader(request, MOBILE_PAGE_REQUEST_HEADERS.pageId);
1881
+ if (!protocolValue || !/^\d+$/.test(protocolValue)) {
1882
+ return {
1883
+ kind: "invalid",
1884
+ message: `Missing or invalid ${MOBILE_PAGE_REQUEST_HEADERS.protocol} header.`
1885
+ };
1886
+ }
1887
+ if (!runtime) {
1888
+ return {
1889
+ kind: "invalid",
1890
+ message: `Missing ${MOBILE_PAGE_REQUEST_HEADERS.runtime} header.`
1891
+ };
1892
+ }
1893
+ if (!appBuild) {
1894
+ return {
1895
+ kind: "invalid",
1896
+ message: `Missing ${MOBILE_PAGE_REQUEST_HEADERS.appBuild} header.`
1897
+ };
1898
+ }
1899
+ if (!pageBundle) {
1900
+ return {
1901
+ kind: "invalid",
1902
+ message: `Missing ${MOBILE_PAGE_REQUEST_HEADERS.pageBundle} header.`
1903
+ };
1904
+ }
1905
+ if (!pageContractsValue) {
1906
+ return {
1907
+ kind: "invalid",
1908
+ message: `Missing ${MOBILE_PAGE_REQUEST_HEADERS.pageContracts} header.`
1909
+ };
1910
+ }
1911
+ if (!pageId) {
1912
+ return {
1913
+ kind: "invalid",
1914
+ message: `Missing ${MOBILE_PAGE_REQUEST_HEADERS.pageId} header.`
1915
+ };
1916
+ }
1917
+ const pageContracts = [
1918
+ ...new Set(pageContractsValue.split(",").map((value) => value.trim()).filter(Boolean))
1919
+ ];
1920
+ if (pageContracts.length === 0) {
1921
+ return {
1922
+ kind: "invalid",
1923
+ message: `${MOBILE_PAGE_REQUEST_HEADERS.pageContracts} must contain at least one contract.`
1924
+ };
1925
+ }
1926
+ return {
1927
+ client: {
1928
+ appBuild,
1929
+ pageBundle,
1930
+ pageContracts,
1931
+ pageId,
1932
+ protocol: Number(protocolValue),
1933
+ runtime
1934
+ },
1935
+ kind: "mobile"
1936
+ };
1937
+ };
1938
+ var responseHeaders = () => {
1939
+ const headers = new Headers({
1940
+ "cache-control": "no-store",
1941
+ "content-type": `${ABSOLUTE_MOBILE_PAGE_MEDIA_TYPE}; version=${ABSOLUTE_MOBILE_PAGE_PROTOCOL_VERSION}`
1942
+ });
1943
+ headerVaryValues.forEach((value) => headers.append("vary", value));
1944
+ return headers;
1945
+ };
1946
+ var headerVaryValues = [
1947
+ "Accept",
1948
+ MOBILE_PAGE_REQUEST_HEADERS.protocol,
1949
+ MOBILE_PAGE_REQUEST_HEADERS.runtime,
1950
+ MOBILE_PAGE_REQUEST_HEADERS.appBuild,
1951
+ MOBILE_PAGE_REQUEST_HEADERS.pageBundle,
1952
+ MOBILE_PAGE_REQUEST_HEADERS.pageContracts,
1953
+ MOBILE_PAGE_REQUEST_HEADERS.pageId
1954
+ ];
1955
+ var envelopeResponse = (response, status) => new Response(JSON.stringify({
1956
+ protocol: ABSOLUTE_MOBILE_PAGE_PROTOCOL_VERSION,
1957
+ response
1958
+ }), { headers: responseHeaders(), status });
1959
+ var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
1960
+ var normalizeJsonValue = (value) => {
1961
+ const serialized = JSON.stringify(value);
1962
+ if (serialized === undefined) {
1963
+ throw new TypeError("Mobile page props must be JSON-serializable.");
1964
+ }
1965
+ const parsed = JSON.parse(serialized);
1966
+ if (!isRecord(parsed)) {
1967
+ throw new TypeError("Mobile page props must serialize to an object.");
1968
+ }
1969
+ return parsed;
1970
+ };
1971
+ var finalizeArchivedMobilePage = (context, input) => {
1972
+ const { page } = context;
1973
+ if (page.pageId !== input.compatibility.pageId || page.framework !== input.compatibility.framework) {
1974
+ return envelopeResponse({
1975
+ kind: "invalid-request",
1976
+ message: "Archived producer page identity does not match its release artifact."
1977
+ }, BAD_REQUEST_STATUS);
1978
+ }
1979
+ try {
1980
+ const [currentRepresentation] = input.compatibility.representations;
1981
+ if (!currentRepresentation) {
1982
+ throw new TypeError("Mobile page has no current representation.");
1983
+ }
1984
+ return envelopeResponse({
1985
+ contract: page.contract,
1986
+ framework: page.framework,
1987
+ kind: "page",
1988
+ pageId: page.pageId,
1989
+ props: normalizeJsonValue(currentRepresentation.mapProps(input.props)),
1990
+ status: input.status ?? OK_STATUS
1991
+ }, input.status ?? OK_STATUS);
1992
+ } catch (error) {
1993
+ console.error(`[Mobile] Archived producer ${context.releaseId} failed for ${page.pageId}:`, error);
1994
+ return createAbsoluteMobilePageErrorResponse(page.pageId);
1995
+ }
1996
+ };
1997
+ var createAbsoluteMobileInvalidRequestResponse = (message) => envelopeResponse({ kind: "invalid-request", message }, BAD_REQUEST_STATUS);
1998
+ var createAbsoluteMobilePageErrorResponse = (pageId) => envelopeResponse({
1999
+ code: "representation-failed",
2000
+ kind: "error",
2001
+ pageId,
2002
+ status: SERVER_ERROR_STATUS
2003
+ }, SERVER_ERROR_STATUS);
2004
+ var createAbsoluteMobileUpgradeResponse = (result) => envelopeResponse(result, UPGRADE_REQUIRED_STATUS);
2005
+ var finalizeAbsoluteMobilePage = (input) => {
2006
+ const parsed = parseAbsoluteMobilePageRequest(input.request);
2007
+ if (parsed.kind === "not-mobile")
2008
+ return;
2009
+ if (parsed.kind === "invalid") {
2010
+ return envelopeResponse({ kind: "invalid-request", message: parsed.message }, BAD_REQUEST_STATUS);
2011
+ }
2012
+ const { client } = parsed;
2013
+ if (client.pageId !== input.compatibility.pageId) {
2014
+ return envelopeResponse({
2015
+ kind: "invalid-request",
2016
+ message: `Requested mobile page ${client.pageId} does not match ${input.compatibility.pageId}.`
2017
+ }, BAD_REQUEST_STATUS);
2018
+ }
2019
+ const producerContext = getCurrentAbsoluteMobileProducerContext();
2020
+ if (producerContext)
2021
+ return finalizeArchivedMobilePage(producerContext, input);
2022
+ if (client.protocol !== ABSOLUTE_MOBILE_PAGE_PROTOCOL_VERSION) {
2023
+ return envelopeResponse({
2024
+ kind: "upgrade-required",
2025
+ pageId: input.compatibility.pageId,
2026
+ reason: "protocol"
2027
+ }, UPGRADE_REQUIRED_STATUS);
2028
+ }
2029
+ if (!input.compatibility.runtimes.includes(client.runtime)) {
2030
+ return envelopeResponse({
2031
+ kind: "upgrade-required",
2032
+ pageId: input.compatibility.pageId,
2033
+ reason: "runtime",
2034
+ supportedRuntimes: [...input.compatibility.runtimes]
2035
+ }, UPGRADE_REQUIRED_STATUS);
2036
+ }
2037
+ const clientContracts = new Set(client.pageContracts);
2038
+ const representation = input.compatibility.representations.find(({ contract }) => clientContracts.has(contract));
2039
+ if (!representation) {
2040
+ return envelopeResponse({
2041
+ kind: "upgrade-required",
2042
+ pageId: input.compatibility.pageId,
2043
+ reason: "page-contract",
2044
+ supportedContracts: input.compatibility.representations.map(({ contract }) => contract)
2045
+ }, UPGRADE_REQUIRED_STATUS);
2046
+ }
2047
+ try {
2048
+ return envelopeResponse({
2049
+ contract: representation.contract,
2050
+ framework: input.compatibility.framework,
2051
+ kind: "page",
2052
+ pageId: input.compatibility.pageId,
2053
+ props: normalizeJsonValue(representation.mapProps(input.props)),
2054
+ status: input.status ?? OK_STATUS
2055
+ }, input.status ?? OK_STATUS);
2056
+ } catch (error) {
2057
+ console.error(`[Mobile] Failed to produce ${input.compatibility.pageId} representation ${representation.contract}:`, error);
2058
+ return envelopeResponse({
2059
+ code: "representation-failed",
2060
+ kind: "error",
2061
+ pageId: input.compatibility.pageId,
2062
+ status: SERVER_ERROR_STATUS
2063
+ }, SERVER_ERROR_STATUS);
2064
+ }
1412
2065
  };
1413
2066
 
1414
2067
  // src/react/pageHandler.ts
1415
- init_devRouteRegistrationCallsite();
2068
+ init_pageResponseCache();
1416
2069
 
1417
2070
  // src/core/responseEnhancers.ts
1418
2071
  init_streamingSlots();
2072
+ init_pageResponseCache();
1419
2073
  var toResponse = async (responseLike) => responseLike;
1420
2074
  var cloneHeaders = (response) => {
1421
2075
  const headers = new Headers(response.headers);
@@ -1439,8 +2093,10 @@ var enhanceHtmlResponseWithStreamingSlots = (response, {
1439
2093
  runtimePlacement,
1440
2094
  runtimePreludeScript
1441
2095
  });
2096
+ const headers = cloneHeaders(response);
2097
+ headers.set(STREAMING_PAGE_HEADER, "1");
1442
2098
  return new Response(body, {
1443
- headers: cloneHeaders(response),
2099
+ headers,
1444
2100
  status: response.status,
1445
2101
  statusText: response.statusText
1446
2102
  });
@@ -1465,7 +2121,7 @@ var withRegisteredStreamingSlots = async (renderResponse, options = {}) => {
1465
2121
 
1466
2122
  // src/core/streamingSlotWarningScope.ts
1467
2123
  init_logger();
1468
- import { AsyncLocalStorage as AsyncLocalStorage2 } from "async_hooks";
2124
+ import { AsyncLocalStorage as AsyncLocalStorage3 } from "async_hooks";
1469
2125
  var STREAMING_SLOT_WARNING_STORAGE_KEY2 = Symbol.for("absolutejs.streamingSlotWarningAsyncLocalStorage");
1470
2126
  var isObjectRecord4 = (value) => Boolean(value) && typeof value === "object";
1471
2127
  var isAsyncLocalStorage3 = (value) => isObjectRecord4(value) && ("getStore" in value) && typeof value.getStore === "function" && ("run" in value) && typeof value.run === "function";
@@ -1481,7 +2137,7 @@ var ensureWarningStorage = () => {
1481
2137
  if (existing) {
1482
2138
  return existing;
1483
2139
  }
1484
- const storage = new AsyncLocalStorage2;
2140
+ const storage = new AsyncLocalStorage3;
1485
2141
  Reflect.set(globalThis, STREAMING_SLOT_WARNING_STORAGE_KEY2, storage);
1486
2142
  return storage;
1487
2143
  };
@@ -1520,303 +2176,11 @@ var captureStreamingSlotWarningCallsite = () => {
1520
2176
  return extractCallsiteFromStack(stack);
1521
2177
  };
1522
2178
  var runWithStreamingSlotWarningScope = (task, metadata) => ensureWarningStorage().run({ handlerCallsite: metadata?.handlerCallsite, hasWarned: false }, task);
1523
- // src/utils/resolveConvention.ts
1524
- import { basename } from "path";
1525
- var CONVENTIONS_KEY = "__absoluteConventions";
1526
- var isConventionsMap = (value) => Boolean(value) && typeof value === "object";
1527
- var getMap = () => {
1528
- const value = Reflect.get(globalThis, CONVENTIONS_KEY);
1529
- if (isConventionsMap(value))
1530
- return value;
1531
- const empty = {};
1532
- return empty;
1533
- };
1534
- var derivePageName = (pagePath) => {
1535
- const base = basename(pagePath);
1536
- const dotIndex = base.indexOf(".");
1537
- const name = dotIndex > 0 ? base.slice(0, dotIndex) : base;
1538
- return toPascal(name);
1539
- };
1540
- var normalizeConventionPageName = (name) => toPascal(name).replace(/\d+$/, "");
1541
- var resolveErrorConventionPath = (framework, pageName) => {
1542
- const conventions = getMap()[framework];
1543
- if (!conventions)
1544
- return;
1545
- const exact = conventions.pages?.[pageName]?.error;
1546
- if (exact)
1547
- return exact;
1548
- const normalizedPageName = normalizeConventionPageName(pageName);
1549
- for (const [candidate, page] of Object.entries(conventions.pages ?? {})) {
1550
- if (normalizeConventionPageName(candidate) === normalizedPageName) {
1551
- return page.error ?? conventions.defaults?.error;
1552
- }
1553
- }
1554
- return conventions.defaults?.error;
1555
- };
1556
- var resolveNotFoundConventionPath = (framework) => getMap()[framework]?.defaults?.notFound;
1557
- var hasErrorConvention = (framework) => {
1558
- const conventions = getMap()[framework];
1559
- if (!conventions)
1560
- return false;
1561
- if (conventions.defaults?.error)
1562
- return true;
1563
- return Object.values(conventions.pages ?? {}).some((page) => Boolean(page.error));
1564
- };
1565
- var setConventions = (map) => {
1566
- Reflect.set(globalThis, CONVENTIONS_KEY, map);
1567
- };
1568
- var isDev = () => true;
1569
- var buildErrorProps = (error) => {
1570
- if (error instanceof Error) {
1571
- return {
1572
- name: error.name,
1573
- message: error.message,
1574
- ...isDev() && error.stack ? { stack: error.stack } : {}
1575
- };
1576
- }
1577
- return { name: "Error", message: String(error) };
1578
- };
1579
- var renderReactError = async (conventionPath, errorProps) => {
1580
- const { createElement } = await import("react");
1581
- const { renderToReadableStream } = await import("react-dom/server");
1582
- const mod = await import(conventionPath);
1583
- const ErrorComponent = mod.default;
1584
- if (typeof ErrorComponent !== "function")
1585
- return null;
1586
- const element = createElement(ErrorComponent, errorProps);
1587
- const stream = await renderToReadableStream(element);
1588
- return new Response(stream, {
1589
- headers: { "Content-Type": "text/html" },
1590
- status: 500
1591
- });
1592
- };
1593
- var renderSvelteError = async (conventionPath, errorProps) => {
1594
- const { render } = await import("svelte/server");
1595
- const mod = await import(conventionPath);
1596
- const ErrorComponent = mod.default;
1597
- if (!ErrorComponent)
1598
- return null;
1599
- const { head, body } = render(ErrorComponent, {
1600
- props: errorProps
1601
- });
1602
- const html = `<!DOCTYPE html><html><head>${head}</head><body>${body}</body></html>`;
1603
- return new Response(html, {
1604
- headers: { "Content-Type": "text/html" },
1605
- status: 500
1606
- });
1607
- };
1608
- var unescapeVueStyles = (ssrBody) => {
1609
- let styles = "";
1610
- const body = ssrBody.replace(/<style>([\s\S]*?)<\/style>/g, (_, css) => {
1611
- styles += `<style>${css.replace(/&quot;/g, '"').replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">")}</style>`;
1612
- return "";
1613
- });
1614
- return { body, styles };
1615
- };
1616
- var renderVueError = async (conventionPath, errorProps) => {
1617
- const { createSSRApp, h } = await import("vue");
1618
- const { renderToString } = await import("vue/server-renderer");
1619
- const mod = await import(conventionPath);
1620
- const ErrorComponent = mod.default;
1621
- if (!ErrorComponent)
1622
- return null;
1623
- const app = createSSRApp({
1624
- render: () => h(ErrorComponent, errorProps)
1625
- });
1626
- const rawBody = await renderToString(app);
1627
- const { styles, body } = unescapeVueStyles(rawBody);
1628
- const html = `<!DOCTYPE html><html><head>${styles}</head><body><div id="root">${body}</div></body></html>`;
1629
- return new Response(html, {
1630
- headers: { "Content-Type": "text/html" },
1631
- status: 500
1632
- });
1633
- };
1634
- var renderAngularError = async (conventionPath, errorProps) => {
1635
- const mod = await import(conventionPath);
1636
- const renderFn = mod.default;
1637
- if (typeof renderFn !== "function")
1638
- return null;
1639
- const html = renderFn(errorProps);
1640
- return new Response(html, {
1641
- headers: { "Content-Type": "text/html" },
1642
- status: 500
1643
- });
1644
- };
1645
- var escapeHtml = (value) => value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
1646
- var replaceErrorTokens = (template, errorProps) => template.replace(/\{\{\s*name\s*\}\}/g, escapeHtml(errorProps.name)).replace(/\{\{\s*message\s*\}\}/g, escapeHtml(errorProps.message)).replace(/\{\{\s*stack\s*\}\}/g, errorProps.stack ? escapeHtml(errorProps.stack) : "");
1647
- var renderHtmlError = async (conventionPath, errorProps) => {
1648
- const template = await Bun.file(conventionPath).text();
1649
- const html = replaceErrorTokens(template, errorProps);
1650
- return new Response(html, {
1651
- headers: { "Content-Type": "text/html" },
1652
- status: 500
1653
- });
1654
- };
1655
- var logConventionRenderError = (framework, label, renderError) => {
1656
- const message = renderError instanceof Error ? renderError.message : "";
1657
- if (message.includes("Cannot find module") || message.includes("Cannot find package") || message.includes("not found in module")) {
1658
- console.error(`[SSR] Convention ${label} page for ${framework} failed: missing framework package. Ensure the ${framework} runtime is installed (e.g. bun add ${framework === "react" ? "react react-dom" : framework}).`);
1659
- return;
1660
- }
1661
- console.error(`[SSR] Failed to render ${framework} convention ${label} page:`, renderError);
1662
- };
1663
- var renderEmberError = async () => null;
1664
- var renderEmberNotFound = async () => null;
1665
- var ERROR_RENDERERS = {
1666
- angular: renderAngularError,
1667
- ember: renderEmberError,
1668
- html: renderHtmlError,
1669
- react: renderReactError,
1670
- svelte: renderSvelteError,
1671
- vue: renderVueError
1672
- };
1673
- var tryFrameworkErrorConvention = async (framework, pageName, errorProps, error) => {
1674
- let conventionPath = resolveErrorConventionPath(framework, pageName);
1675
- if (!conventionPath && error instanceof Error && error.stack) {
1676
- for (const match of error.stack.matchAll(/^\s*at\s+([A-Za-z_$][\w$]*)/gm)) {
1677
- const candidate = match[1];
1678
- if (!candidate)
1679
- continue;
1680
- conventionPath = resolveErrorConventionPath(framework, candidate);
1681
- if (conventionPath)
1682
- break;
1683
- }
1684
- }
1685
- if (!conventionPath)
1686
- return null;
1687
- const renderer = ERROR_RENDERERS[framework];
1688
- if (!renderer)
1689
- return null;
1690
- try {
1691
- return await renderer(conventionPath, errorProps);
1692
- } catch (renderError) {
1693
- logConventionRenderError(framework, "error", renderError);
1694
- }
1695
- return null;
1696
- };
1697
- var renderConventionError = async (framework, pageName, error) => {
1698
- const errorProps = buildErrorProps(error);
1699
- const frameworkResponse = await tryFrameworkErrorConvention(framework, pageName, errorProps, error);
1700
- if (frameworkResponse)
1701
- return frameworkResponse;
1702
- if (framework !== "html") {
1703
- const htmlResponse = await tryFrameworkErrorConvention("html", pageName, errorProps, error);
1704
- if (htmlResponse)
1705
- return htmlResponse;
1706
- }
1707
- return null;
1708
- };
1709
- var renderReactNotFound = async (conventionPath) => {
1710
- const { createElement } = await import("react");
1711
- const { renderToReadableStream } = await import("react-dom/server");
1712
- const mod = await import(conventionPath);
1713
- const NotFoundComponent = mod.default;
1714
- if (typeof NotFoundComponent !== "function")
1715
- return null;
1716
- const element = createElement(NotFoundComponent);
1717
- const stream = await renderToReadableStream(element);
1718
- return new Response(stream, {
1719
- headers: { "Content-Type": "text/html" },
1720
- status: 404
1721
- });
1722
- };
1723
- var renderSvelteNotFound = async (conventionPath) => {
1724
- const { render } = await import("svelte/server");
1725
- const mod = await import(conventionPath);
1726
- const NotFoundComponent = mod.default;
1727
- if (!NotFoundComponent)
1728
- return null;
1729
- const { head, body } = render(NotFoundComponent);
1730
- const html = `<!DOCTYPE html><html><head>${head}</head><body>${body}</body></html>`;
1731
- return new Response(html, {
1732
- headers: { "Content-Type": "text/html" },
1733
- status: 404
1734
- });
1735
- };
1736
- var renderVueNotFound = async (conventionPath) => {
1737
- const { createSSRApp, h } = await import("vue");
1738
- const { renderToString } = await import("vue/server-renderer");
1739
- const mod = await import(conventionPath);
1740
- const NotFoundComponent = mod.default;
1741
- if (!NotFoundComponent)
1742
- return null;
1743
- const app = createSSRApp({
1744
- render: () => h(NotFoundComponent)
1745
- });
1746
- const rawBody = await renderToString(app);
1747
- const { styles, body } = unescapeVueStyles(rawBody);
1748
- const html = `<!DOCTYPE html><html><head>${styles}</head><body><div id="root">${body}</div></body></html>`;
1749
- return new Response(html, {
1750
- headers: { "Content-Type": "text/html" },
1751
- status: 404
1752
- });
1753
- };
1754
- var renderAngularNotFound = async (conventionPath) => {
1755
- const mod = await import(conventionPath);
1756
- const renderFn = mod.default;
1757
- if (typeof renderFn !== "function")
1758
- return null;
1759
- const html = renderFn();
1760
- return new Response(html, {
1761
- headers: { "Content-Type": "text/html" },
1762
- status: 404
1763
- });
1764
- };
1765
- var renderHtmlNotFound = async (conventionPath) => {
1766
- const html = await Bun.file(conventionPath).text();
1767
- return new Response(html, {
1768
- headers: { "Content-Type": "text/html" },
1769
- status: 404
1770
- });
1771
- };
1772
- var NOT_FOUND_RENDERERS = {
1773
- angular: renderAngularNotFound,
1774
- ember: renderEmberNotFound,
1775
- html: renderHtmlNotFound,
1776
- react: renderReactNotFound,
1777
- svelte: renderSvelteNotFound,
1778
- vue: renderVueNotFound
1779
- };
1780
- var renderConventionNotFound = async (framework) => {
1781
- const conventionPath = resolveNotFoundConventionPath(framework);
1782
- if (!conventionPath)
1783
- return null;
1784
- const renderer = NOT_FOUND_RENDERERS[framework];
1785
- if (!renderer)
1786
- return null;
1787
- try {
1788
- return await renderer(conventionPath);
1789
- } catch (renderError) {
1790
- logConventionRenderError(framework, "not-found", renderError);
1791
- }
1792
- return null;
1793
- };
1794
- var NOT_FOUND_PRIORITY = [
1795
- "react",
1796
- "svelte",
1797
- "vue",
1798
- "angular",
1799
- "html"
1800
- ];
1801
- var renderFirstNotFound = async () => {
1802
- const renderNext = async (frameworks) => {
1803
- const [framework, ...remaining] = frameworks;
1804
- if (!framework) {
1805
- return null;
1806
- }
1807
- if (!getMap()[framework]?.defaults?.notFound) {
1808
- return renderNext(remaining);
1809
- }
1810
- const response = await renderConventionNotFound(framework);
1811
- if (response) {
1812
- return response;
1813
- }
1814
- return renderNext(remaining);
1815
- };
1816
- return renderNext(NOT_FOUND_PRIORITY);
1817
- };
1818
2179
 
1819
2180
  // src/react/pageHandler.ts
2181
+ init_spaRouteManifest();
2182
+ init_resolveConvention();
2183
+ var withRequestUrl = (props, url) => Object.assign(Object.create(null), props, { url });
1820
2184
  var resolveRequestPathname = (request) => {
1821
2185
  if (!request)
1822
2186
  return;
@@ -1832,17 +2196,34 @@ var buildRefreshSetup = () => {
1832
2196
  return "window.__REFRESH_BUFFER__=[];" + "window.$RefreshReg$=function(t,i){window.__REFRESH_BUFFER__.push([t,i])};" + "window.$RefreshSig$=function(){return function(t){return t}};";
1833
2197
  };
1834
2198
  var handleReactPageRequest = async (input) => {
1835
- const Page = input.Page;
2199
+ const { Page } = input;
1836
2200
  const resolvedIndex = input.index;
1837
2201
  const options = input;
1838
2202
  const userProps = input.props;
1839
- const requestPathname = resolveRequestPathname(input.request);
1840
- const maybeProps = requestPathname !== undefined && (!userProps || !("url" in userProps)) ? {
1841
- ...userProps ?? {},
1842
- url: requestPathname
1843
- } : userProps;
2203
+ const request = input.request ?? getCurrentAbsoluteRequest();
2204
+ const requestPathname = resolveRequestPathname(request);
2205
+ const maybeProps = requestPathname !== undefined && (!userProps || !("url" in userProps)) ? withRequestUrl(userProps, requestPathname) : userProps;
1844
2206
  const pageName = Page.name || Page.displayName || "";
2207
+ const pageId = input.__absoluteMobile?.pageId ?? (pageName || resolvedIndex);
2208
+ const currentContract = input.__absoluteMobile?.contract ?? `react:${pageId}:${ABSOLUTE_MOBILE_PAGE_PROTOCOL_VERSION}`;
2209
+ const mobileResponse = finalizeAbsoluteMobilePage({
2210
+ compatibility: {
2211
+ framework: "react",
2212
+ pageId,
2213
+ representations: [
2214
+ { contract: currentContract, mapProps: (props) => props }
2215
+ ],
2216
+ runtimes: [String(ABSOLUTE_MOBILE_PAGE_PROTOCOL_VERSION)]
2217
+ },
2218
+ props: maybeProps ?? Object.create(null),
2219
+ request
2220
+ });
2221
+ if (mobileResponse)
2222
+ return mobileResponse;
1845
2223
  try {
2224
+ const spaNotFound = await renderSpaNotFound("react", pageName, request);
2225
+ if (spaNotFound)
2226
+ return withPageCacheHeaders(spaNotFound, request);
1846
2227
  const handlerCallsite = options?.collectStreamingSlots === true ? undefined : getCurrentRouteRegistrationCallsite() ?? captureStreamingSlotWarningCallsite();
1847
2228
  const renderPageResponse = async () => {
1848
2229
  const { createElement } = await import("react");
@@ -1865,24 +2246,28 @@ var handleReactPageRequest = async (input) => {
1865
2246
  });
1866
2247
  }
1867
2248
  return new Response(htmlStream, {
1868
- headers: { "Content-Type": "text/html" }
2249
+ headers: streamingPageHeaders()
1869
2250
  });
1870
2251
  };
1871
- return await runWithStreamingSlotWarningScope(() => options?.collectStreamingSlots === true ? withRegisteredStreamingSlots(renderPageResponse, options) : renderPageResponse(), { handlerCallsite });
2252
+ const pageResponse = await runWithStreamingSlotWarningScope(() => options?.collectStreamingSlots === true ? withRegisteredStreamingSlots(renderPageResponse, options) : renderPageResponse(), { handlerCallsite });
2253
+ return withPageCacheHeaders(pageResponse, request, {
2254
+ bufferStreamForEtag: input.bufferStreamForEtag
2255
+ });
1872
2256
  } catch (error) {
1873
2257
  console.error("[SSR] React render error:", error);
1874
2258
  const conventionResponse = await renderConventionError("react", pageName, error);
1875
- if (conventionResponse)
1876
- return conventionResponse;
1877
- return new Response(ssrErrorPage("react", error), {
2259
+ if (conventionResponse) {
2260
+ return withPageCacheHeaders(conventionResponse, request);
2261
+ }
2262
+ return withPageCacheHeaders(new Response(ssrErrorPage("react", error), {
1878
2263
  headers: { "Content-Type": "text/html" },
1879
2264
  status: 500
1880
- });
2265
+ }), request);
1881
2266
  }
1882
2267
  };
1883
2268
  export {
1884
2269
  handleReactPageRequest
1885
2270
  };
1886
2271
 
1887
- //# debugId=227361C42EA2BB3F64756E2164756E21
2272
+ //# debugId=823109CB5C4C5BF664756E2164756E21
1888
2273
  //# sourceMappingURL=server.js.map