@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,23 +60,465 @@ 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
63
+ // src/utils/inlinePageCss.ts
64
+ var siblingCssCache, clearSiblingCssCache = () => {
65
+ siblingCssCache.clear();
66
+ }, injectInlineCss = (headTag, css) => {
67
+ if (!css)
68
+ return headTag;
69
+ const styleBlock = `<style data-absolute-page-css>${css}</style>`;
70
+ return headTag.replace("</head>", `${styleBlock}</head>`);
71
+ }, readSiblingCss = async (siblingJsPath) => {
72
+ if (!siblingJsPath)
73
+ return "";
74
+ const cssPath = siblingJsPath.replace(/\.js$/, ".css");
75
+ if (cssPath === siblingJsPath)
76
+ return "";
77
+ const cached = siblingCssCache.get(cssPath);
78
+ if (cached !== undefined)
79
+ return cached;
80
+ const { readFile } = await import("fs/promises");
81
+ try {
82
+ const css = await readFile(cssPath, "utf-8");
83
+ siblingCssCache.set(cssPath, css);
84
+ return css;
85
+ } catch {
86
+ siblingCssCache.set(cssPath, "");
87
+ return "";
88
+ }
89
+ };
90
+ var init_inlinePageCss = __esm(() => {
91
+ siblingCssCache = new Map;
92
+ });
93
+
94
+ // src/utils/spaRouteCss.ts
95
+ import { readFile } from "fs/promises";
96
+ import { dirname, isAbsolute, resolve } from "path";
97
+ var sideManifestCache, readSideManifest = async (sideManifestPath) => {
98
+ const cached = sideManifestCache.get(sideManifestPath);
99
+ if (cached !== undefined)
100
+ return cached;
101
+ try {
102
+ const raw = await readFile(sideManifestPath, "utf-8");
103
+ const parsed = JSON.parse(raw);
104
+ const routes = Array.isArray(parsed) ? parsed : [];
105
+ sideManifestCache.set(sideManifestPath, routes);
106
+ return routes;
107
+ } catch {
108
+ sideManifestCache.set(sideManifestPath, []);
109
+ return [];
110
+ }
111
+ }, compilePathToRegExp = (pattern) => {
112
+ const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&");
113
+ const withParams = escaped.replace(/:([a-zA-Z_$][a-zA-Z0-9_$]*)/g, "[^/]+").replace(/\\\*/g, ".*");
114
+ return new RegExp(`^${withParams}$`);
115
+ }, routeMatchers, matcherFor = (pattern) => {
116
+ const cached = routeMatchers.get(pattern);
117
+ if (cached !== undefined)
118
+ return cached;
119
+ const compiled = compilePathToRegExp(pattern);
120
+ routeMatchers.set(pattern, compiled);
121
+ return compiled;
122
+ }, findMatchingRoute = (routes, pathname) => {
123
+ for (const route of routes) {
124
+ if (matcherFor(route.path).test(pathname))
125
+ return route;
126
+ }
127
+ return null;
128
+ }, childCssCache, clearSpaRouteCssCaches = () => {
129
+ sideManifestCache.clear();
130
+ childCssCache.clear();
131
+ }, readChildCss = async (cssPath, sideManifestPath) => {
132
+ if (!cssPath)
133
+ return "";
134
+ const resolvedCssPath = isAbsolute(cssPath) ? cssPath : resolve(dirname(sideManifestPath), cssPath);
135
+ const cached = childCssCache.get(resolvedCssPath);
136
+ if (cached !== undefined)
137
+ return cached;
138
+ try {
139
+ const css = await readFile(resolvedCssPath, "utf-8");
140
+ childCssCache.set(resolvedCssPath, css);
141
+ return css;
142
+ } catch {
143
+ childCssCache.set(resolvedCssPath, "");
144
+ return "";
145
+ }
146
+ }, resolveSpaChildCss = async (siblingJsPath, requestUrl) => {
147
+ if (!siblingJsPath || !requestUrl)
148
+ return "";
149
+ const sideManifestPath = siblingJsPath.replace(/\.js$/, ".spa.json");
150
+ if (sideManifestPath === siblingJsPath)
151
+ return "";
152
+ const routes = await readSideManifest(sideManifestPath);
153
+ if (routes.length === 0)
154
+ return "";
155
+ let pathname;
156
+ try {
157
+ ({ pathname } = new URL(requestUrl));
158
+ } catch {
159
+ pathname = requestUrl.split("?")[0] ?? requestUrl;
160
+ }
161
+ const matched = findMatchingRoute(routes, pathname);
162
+ if (!matched)
163
+ return "";
164
+ const { cssPath: routeCssPath } = matched;
165
+ const cssPaths = [
166
+ routeCssPath,
167
+ ...routes.map((route) => route.cssPath)
168
+ ].filter((childCssPath, index, all) => childCssPath && all.indexOf(childCssPath) === index);
169
+ const chunks = await Promise.all(cssPaths.map((childCssPath) => readChildCss(childCssPath, sideManifestPath)));
170
+ return chunks.filter(Boolean).join(`
171
+ `);
172
+ };
173
+ var init_spaRouteCss = __esm(() => {
174
+ sideManifestCache = new Map;
175
+ routeMatchers = new Map;
176
+ childCssCache = new Map;
177
+ });
178
+
179
+ // src/utils/stringModifiers.ts
180
+ var normalizeSlug = (str) => str.trim().replace(/\s+/g, "-").replace(/[^A-Za-z0-9\-_]+/g, "").replace(/[-_]{2,}/g, "-"), toKebab = (str) => normalizeSlug(str).replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), toPascal = (str) => {
181
+ if (!str.includes("-") && !str.includes("_")) {
182
+ return str.charAt(0).toUpperCase() + str.slice(1);
183
+ }
184
+ return normalizeSlug(str).split(/[-_]/).filter(Boolean).map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1).toLowerCase()).join("");
185
+ };
186
+
187
+ // src/utils/resolveConvention.ts
188
+ import { basename } from "path";
189
+ var CONVENTIONS_KEY = "__absoluteConventions", isConventionsMap = (value) => Boolean(value) && typeof value === "object", getMap = () => {
190
+ const value = Reflect.get(globalThis, CONVENTIONS_KEY);
191
+ if (isConventionsMap(value))
192
+ return value;
193
+ const empty = {};
194
+ return empty;
195
+ }, derivePageName = (pagePath) => {
196
+ const base = basename(pagePath);
197
+ const dotIndex = base.indexOf(".");
198
+ const name = dotIndex > 0 ? base.slice(0, dotIndex) : base;
199
+ return toPascal(name);
200
+ }, normalizeConventionPageName = (name) => toPascal(name).replace(/\d+$/, ""), hasErrorConvention = (framework) => {
201
+ const conventions = getMap()[framework];
202
+ if (!conventions)
203
+ return false;
204
+ if (conventions.defaults?.error)
205
+ return true;
206
+ return Object.values(conventions.pages ?? {}).some((page) => Boolean(page.error));
207
+ }, resolveErrorConventionPath = (framework, pageName) => {
208
+ const conventions = getMap()[framework];
209
+ if (!conventions)
210
+ return;
211
+ const exact = conventions.pages?.[pageName]?.error;
212
+ if (exact)
213
+ return exact;
214
+ const normalizedPageName = normalizeConventionPageName(pageName);
215
+ for (const [candidate, page] of Object.entries(conventions.pages ?? {})) {
216
+ if (normalizeConventionPageName(candidate) === normalizedPageName) {
217
+ return page.error ?? conventions.defaults?.error;
218
+ }
219
+ }
220
+ return conventions.defaults?.error;
221
+ }, resolveNotFoundConventionPath = (framework) => getMap()[framework]?.defaults?.notFound, setConventions = (map) => {
222
+ Reflect.set(globalThis, CONVENTIONS_KEY, map);
223
+ }, isDev = () => true, buildErrorProps = (error) => {
224
+ if (error instanceof Error) {
225
+ return {
226
+ message: error.message,
227
+ name: error.name,
228
+ ...isDev() && error.stack ? { stack: error.stack } : {}
229
+ };
230
+ }
231
+ return { message: String(error), name: "Error" };
232
+ }, renderReactError = async (conventionPath, errorProps) => {
233
+ const { createElement } = await import("react");
234
+ const { renderToReadableStream } = await import("react-dom/server");
235
+ const mod = await import(conventionPath);
236
+ const ErrorComponent = mod.default;
237
+ if (typeof ErrorComponent !== "function")
238
+ return null;
239
+ const element = createElement(ErrorComponent, errorProps);
240
+ const stream = await renderToReadableStream(element);
241
+ return new Response(stream, {
242
+ headers: { "Content-Type": "text/html" },
243
+ status: 500
244
+ });
245
+ }, renderSvelteError = async (conventionPath, errorProps) => {
246
+ const { render } = await import("svelte/server");
247
+ const mod = await import(conventionPath);
248
+ const ErrorComponent = mod.default;
249
+ if (!ErrorComponent)
250
+ return null;
251
+ const { head, body } = render(ErrorComponent, {
252
+ props: errorProps
253
+ });
254
+ const html = `<!DOCTYPE html><html><head>${head}</head><body>${body}</body></html>`;
255
+ return new Response(html, {
256
+ headers: { "Content-Type": "text/html" },
257
+ status: 500
258
+ });
259
+ }, unescapeVueStyles = (ssrBody) => {
260
+ let styles = "";
261
+ const body = ssrBody.replace(/<style>([\s\S]*?)<\/style>/g, (_, css) => {
262
+ styles += `<style>${css.replace(/&quot;/g, '"').replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">")}</style>`;
263
+ return "";
264
+ });
265
+ return { body, styles };
266
+ }, renderVueError = async (conventionPath, errorProps) => {
267
+ const { createSSRApp, h } = await import("vue");
268
+ const { renderToString } = await import("vue/server-renderer");
269
+ const mod = await import(conventionPath);
270
+ const ErrorComponent = mod.default;
271
+ if (!ErrorComponent)
272
+ return null;
273
+ const app = createSSRApp({
274
+ render: () => h(ErrorComponent, errorProps)
275
+ });
276
+ const rawBody = await renderToString(app);
277
+ const { styles, body } = unescapeVueStyles(rawBody);
278
+ const html = `<!DOCTYPE html><html><head>${styles}</head><body><div id="root">${body}</div></body></html>`;
279
+ return new Response(html, {
280
+ headers: { "Content-Type": "text/html" },
281
+ status: 500
282
+ });
283
+ }, renderAngularError = async (conventionPath, errorProps) => {
284
+ const mod = await import(conventionPath);
285
+ const renderFn = mod.default;
286
+ if (typeof renderFn !== "function")
287
+ return null;
288
+ const html = renderFn(errorProps);
289
+ return new Response(html, {
290
+ headers: { "Content-Type": "text/html" },
291
+ status: 500
292
+ });
293
+ }, 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) => {
294
+ const template = await Bun.file(conventionPath).text();
295
+ const html = replaceErrorTokens(template, errorProps);
296
+ return new Response(html, {
297
+ headers: { "Content-Type": "text/html" },
298
+ status: 500
299
+ });
300
+ }, logConventionRenderError = (framework, label, renderError) => {
301
+ const message = renderError instanceof Error ? renderError.message : "";
302
+ if (message.includes("Cannot find module") || message.includes("Cannot find package") || message.includes("not found in module")) {
303
+ 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}).`);
304
+ return;
305
+ }
306
+ console.error(`[SSR] Failed to render ${framework} convention ${label} page:`, renderError);
307
+ }, renderEmberError = async () => null, renderEmberNotFound = async () => null, ERROR_RENDERERS, tryFrameworkErrorConvention = async (framework, pageName, errorProps, error) => {
308
+ let conventionPath = resolveErrorConventionPath(framework, pageName);
309
+ if (!conventionPath && error instanceof Error && error.stack) {
310
+ for (const match of error.stack.matchAll(/^\s*at\s+([A-Za-z_$][\w$]*)/gm)) {
311
+ const [, candidate] = match;
312
+ if (!candidate)
313
+ continue;
314
+ conventionPath = resolveErrorConventionPath(framework, candidate);
315
+ if (conventionPath)
316
+ break;
317
+ }
318
+ }
319
+ if (!conventionPath)
320
+ return null;
321
+ const renderer = ERROR_RENDERERS[framework];
322
+ if (!renderer)
323
+ return null;
324
+ try {
325
+ return await renderer(conventionPath, errorProps);
326
+ } catch (renderError) {
327
+ logConventionRenderError(framework, "error", renderError);
328
+ }
329
+ return null;
330
+ }, renderConventionError = async (framework, pageName, error) => {
331
+ const errorProps = buildErrorProps(error);
332
+ const frameworkResponse = await tryFrameworkErrorConvention(framework, pageName, errorProps, error);
333
+ if (frameworkResponse)
334
+ return frameworkResponse;
335
+ if (framework !== "html") {
336
+ const htmlResponse = await tryFrameworkErrorConvention("html", pageName, errorProps, error);
337
+ if (htmlResponse)
338
+ return htmlResponse;
339
+ }
340
+ return null;
341
+ }, renderReactNotFound = async (conventionPath) => {
342
+ const { createElement } = await import("react");
343
+ const { renderToReadableStream } = await import("react-dom/server");
344
+ const mod = await import(conventionPath);
345
+ const NotFoundComponent = mod.default;
346
+ if (typeof NotFoundComponent !== "function")
347
+ return null;
348
+ const element = createElement(NotFoundComponent);
349
+ const stream = await renderToReadableStream(element);
350
+ return new Response(stream, {
351
+ headers: { "Content-Type": "text/html" },
352
+ status: 404
353
+ });
354
+ }, renderSvelteNotFound = async (conventionPath) => {
355
+ const { render } = await import("svelte/server");
356
+ const mod = await import(conventionPath);
357
+ const NotFoundComponent = mod.default;
358
+ if (!NotFoundComponent)
359
+ return null;
360
+ const { head, body } = render(NotFoundComponent);
361
+ const html = `<!DOCTYPE html><html><head>${head}</head><body>${body}</body></html>`;
362
+ return new Response(html, {
363
+ headers: { "Content-Type": "text/html" },
364
+ status: 404
365
+ });
366
+ }, renderVueNotFound = async (conventionPath) => {
367
+ const { createSSRApp, h } = await import("vue");
368
+ const { renderToString } = await import("vue/server-renderer");
369
+ const mod = await import(conventionPath);
370
+ const NotFoundComponent = mod.default;
371
+ if (!NotFoundComponent)
372
+ return null;
373
+ const app = createSSRApp({
374
+ render: () => h(NotFoundComponent)
375
+ });
376
+ const rawBody = await renderToString(app);
377
+ const { styles, body } = unescapeVueStyles(rawBody);
378
+ const html = `<!DOCTYPE html><html><head>${styles}</head><body><div id="root">${body}</div></body></html>`;
379
+ return new Response(html, {
380
+ headers: { "Content-Type": "text/html" },
381
+ status: 404
382
+ });
383
+ }, renderAngularNotFound = async (conventionPath) => {
384
+ const mod = await import(conventionPath);
385
+ const renderFn = mod.default;
386
+ if (typeof renderFn !== "function")
387
+ return null;
388
+ const html = renderFn();
389
+ return new Response(html, {
390
+ headers: { "Content-Type": "text/html" },
391
+ status: 404
392
+ });
393
+ }, renderHtmlNotFound = async (conventionPath) => {
394
+ const html = await Bun.file(conventionPath).text();
395
+ return new Response(html, {
396
+ headers: { "Content-Type": "text/html" },
397
+ status: 404
398
+ });
399
+ }, NOT_FOUND_RENDERERS, renderConventionNotFound = async (framework) => {
400
+ const conventionPath = resolveNotFoundConventionPath(framework);
401
+ if (!conventionPath)
402
+ return null;
403
+ const renderer = NOT_FOUND_RENDERERS[framework];
404
+ if (!renderer)
405
+ return null;
406
+ try {
407
+ return await renderer(conventionPath);
408
+ } catch (renderError) {
409
+ logConventionRenderError(framework, "not-found", renderError);
410
+ }
411
+ return null;
412
+ }, NOT_FOUND_PRIORITY, renderFirstNotFound = async () => {
413
+ const renderNext = async (frameworks) => {
414
+ const [framework, ...remaining] = frameworks;
415
+ if (!framework) {
416
+ return null;
417
+ }
418
+ if (!getMap()[framework]?.defaults?.notFound) {
419
+ return renderNext(remaining);
420
+ }
421
+ const response = await renderConventionNotFound(framework);
422
+ if (response) {
423
+ return response;
424
+ }
425
+ return renderNext(remaining);
426
+ };
427
+ return renderNext(NOT_FOUND_PRIORITY);
428
+ };
429
+ var init_resolveConvention = __esm(() => {
430
+ ERROR_RENDERERS = {
431
+ angular: renderAngularError,
432
+ ember: renderEmberError,
433
+ html: renderHtmlError,
434
+ react: renderReactError,
435
+ svelte: renderSvelteError,
436
+ vue: renderVueError
437
+ };
438
+ NOT_FOUND_RENDERERS = {
439
+ angular: renderAngularNotFound,
440
+ ember: renderEmberNotFound,
441
+ html: renderHtmlNotFound,
442
+ react: renderReactNotFound,
443
+ svelte: renderSvelteNotFound,
444
+ vue: renderVueNotFound
445
+ };
446
+ NOT_FOUND_PRIORITY = [
447
+ "react",
448
+ "svelte",
449
+ "vue",
450
+ "angular",
451
+ "html"
93
452
  ];
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;
453
+ });
454
+
455
+ // src/utils/spaRouteManifest.ts
456
+ import { basename as basename2 } from "path";
457
+ var SPA_ROUTES_KEY = "__absoluteSpaRoutes", setSpaRouteManifest = (hosts) => {
458
+ Reflect.set(globalThis, SPA_ROUTES_KEY, hosts);
459
+ }, isRuntimeSpaHost = (value) => typeof value === "object" && value !== null && typeof Reflect.get(value, "framework") === "string", getSpaRouteManifest = () => {
460
+ const value = Reflect.get(globalThis, SPA_ROUTES_KEY);
461
+ return Array.isArray(value) ? value.filter(isRuntimeSpaHost) : [];
462
+ }, normalizePath = (path) => {
463
+ const withLeadingSlash = path.startsWith("/") ? path : `/${path}`;
464
+ const trimmed = withLeadingSlash.replace(/\/+$/, "");
465
+ return trimmed || "/";
466
+ }, fullRoutePath = (baseHref, routePath) => {
467
+ const base = normalizePath(baseHref);
468
+ const route = normalizePath(routePath);
469
+ if (base !== "/" && (route === base || route.startsWith(`${base}/`))) {
470
+ return route;
471
+ }
472
+ if (base === "/")
473
+ return route;
474
+ return normalizePath(`${base}/${route.replace(/^\/+/, "")}`);
475
+ }, routePattern = (path) => {
476
+ const segments = normalizePath(path).split("/").filter(Boolean);
477
+ let expression = "^";
478
+ for (const segment of segments) {
479
+ if (segment === "*" || segment === "**") {
480
+ expression += "(?:/.*)?";
481
+ continue;
482
+ }
483
+ const parameter = /^:[A-Za-z_$][A-Za-z0-9_$]*(?:\((.*)\))?(\?)?$/.exec(segment);
484
+ if (parameter) {
485
+ const valuePattern = parameter[1] || "[^/]+";
486
+ expression += parameter[2] ? `(?:/${valuePattern})?` : `/${valuePattern}`;
487
+ continue;
488
+ }
489
+ expression += `/${segment.replace(/[.+?^${}()|[\]\\]/g, "\\$&")}`;
490
+ }
491
+ return new RegExp(`${expression || "^/"}/?$`);
492
+ }, sourcePageName = (sourceFile) => basename2(sourceFile).replace(/\.[^.]+$/, "").toLowerCase(), isKnownSpaRoute = (framework, pageName, request) => {
493
+ if (!request)
494
+ return true;
495
+ let pathname;
496
+ try {
497
+ pathname = normalizePath(new URL(request.url).pathname);
498
+ } catch {
499
+ return true;
500
+ }
501
+ const hosts = getSpaRouteManifest().filter((host) => {
502
+ if (host.framework !== framework)
503
+ return false;
504
+ if (sourcePageName(host.sourceFile) !== pageName.toLowerCase())
505
+ return false;
506
+ const base = normalizePath(host.baseHref);
507
+ return base === "/" || pathname === base || pathname.startsWith(`${base}/`);
508
+ });
509
+ if (hosts.length === 0)
510
+ return true;
511
+ return hosts.some((host) => host.routes.some((route) => routePattern(fullRoutePath(host.baseHref, route.path)).test(pathname)));
512
+ }, renderSpaNotFound = async (framework, pageName, request) => {
513
+ if (isKnownSpaRoute(framework, pageName, request))
514
+ return null;
515
+ return await renderFirstNotFound() ?? new Response("Not found", {
516
+ headers: { "Content-Type": "text/plain" },
517
+ status: 404
518
+ });
519
+ };
520
+ var init_spaRouteManifest = __esm(() => {
521
+ init_resolveConvention();
98
522
  });
99
523
 
100
524
  // src/core/devRouteRegistrationCallsite.ts
@@ -107,22 +531,20 @@ __export(exports_devRouteRegistrationCallsite, {
107
531
  });
108
532
  import { AsyncLocalStorage } from "async_hooks";
109
533
  import { Elysia } from "elysia";
110
- var ROUTE_CALLSITE_STORAGE_KEY, ROUTE_CALLSITE_PATCHED_KEY, ROUTE_METHOD_NAMES, PAGE_HANDLER_NAMES, pageHandlerWrappers, handlerSourceMentionsPageHelper = (handler) => {
534
+ 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
535
  const source = handler.toString();
112
536
  return PAGE_HANDLER_NAMES.some((name) => source.includes(name));
537
+ }, getOriginalPageHandlerSource = (handler) => {
538
+ if (!isPageHandlerFunction(handler))
539
+ return;
540
+ const info = pageHandlerWrappers.get(handler);
541
+ return (info?.originalHandler ?? handler).toString();
113
542
  }, isPageHandler = (handler) => {
114
- if (typeof handler !== "function")
543
+ if (!isPageHandlerFunction(handler))
115
544
  return false;
116
- const fn = handler;
117
- if (pageHandlerWrappers.has(fn))
545
+ if (pageHandlerWrappers.has(handler))
118
546
  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();
547
+ return handlerSourceMentionsPageHelper(handler);
126
548
  }, 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
549
  const value = Reflect.get(globalThis, ROUTE_CALLSITE_STORAGE_KEY);
128
550
  if (value === null || typeof value === "undefined") {
@@ -156,17 +578,22 @@ var ROUTE_CALLSITE_STORAGE_KEY, ROUTE_CALLSITE_PATCHED_KEY, ROUTE_METHOD_NAMES,
156
578
  return function wrappedRouteHandler(...args) {
157
579
  return storage.run({ callsite }, () => Reflect.apply(routeHandler, this, args));
158
580
  };
159
- }, createPatchedRouteMethod = (originalMethod, methodName) => function patchedRouteMethod(path, handler, ...rest) {
581
+ }, createPatchedRouteMethod = (originalMethod, methodName) => function patchedRouteMethod(path, ...routeArguments) {
582
+ const handlerIndex = routeArguments.length >= 2 ? 1 : 0;
583
+ const handler = routeArguments[handlerIndex];
160
584
  const callsite = captureRouteRegistrationCallsite();
161
585
  const wrapped = wrapRouteHandlerWithCallsite(handler, callsite);
162
- if (methodName === "get" && typeof handler === "function" && typeof wrapped === "function" && handlerSourceMentionsPageHelper(handler)) {
586
+ if (methodName === "get" && isPageHandlerFunction(handler) && isPageHandlerFunction(wrapped) && handlerSourceMentionsPageHelper(handler)) {
163
587
  pageHandlerWrappers.set(wrapped, {
164
588
  originalHandler: handler
165
589
  });
166
590
  }
167
- return Reflect.apply(originalMethod, this, [path, wrapped, ...rest]);
591
+ routeArguments[handlerIndex] = wrapped;
592
+ return Reflect.apply(originalMethod, this, [path, ...routeArguments]);
168
593
  }, getCurrentRouteRegistrationCallsite = () => getRouteCallsiteStorage()?.getStore()?.callsite, patchElysiaRouteRegistrationCallsites = () => {
169
- if (false) {}
594
+ if (process.env[NODE_ENV_KEY] === "production") {
595
+ return;
596
+ }
170
597
  if (Reflect.get(globalThis, ROUTE_CALLSITE_PATCHED_KEY) === true) {
171
598
  return;
172
599
  }
@@ -203,6 +630,43 @@ var init_devRouteRegistrationCallsite = __esm(() => {
203
630
  pageHandlerWrappers = new WeakMap;
204
631
  });
205
632
 
633
+ // src/core/pageResponseCache.ts
634
+ import { createHash } from "crypto";
635
+ var STREAMING_PAGE_HEADER = "x-absolute-stream", HTML_CONTENT_TYPE = "text/html", streamingPageHeaders = (extra) => {
636
+ const headers = new Headers(extra);
637
+ headers.set("content-type", HTML_CONTENT_TYPE);
638
+ headers.set(STREAMING_PAGE_HEADER, "1");
639
+ return headers;
640
+ }, computeEtag = (html) => `W/"${createHash("sha1").update(html).digest("base64url")}"`, withPageCacheHeaders = async (response, request, options) => {
641
+ const contentType = response.headers.get("content-type") ?? "";
642
+ if (!contentType.includes(HTML_CONTENT_TYPE))
643
+ return response;
644
+ const isStreaming = response.headers.get(STREAMING_PAGE_HEADER) === "1";
645
+ if (isStreaming && !options?.bufferStreamForEtag || !response.body) {
646
+ response.headers.delete(STREAMING_PAGE_HEADER);
647
+ response.headers.set("cache-control", "no-cache");
648
+ return response;
649
+ }
650
+ const html = await response.text();
651
+ const etag = computeEtag(html);
652
+ if (request?.headers.get("if-none-match") === etag) {
653
+ return new Response(null, {
654
+ headers: { "cache-control": "no-cache", etag },
655
+ status: 304
656
+ });
657
+ }
658
+ const headers = new Headers(response.headers);
659
+ headers.delete(STREAMING_PAGE_HEADER);
660
+ headers.set("cache-control", "no-cache");
661
+ headers.set("etag", etag);
662
+ return new Response(html, {
663
+ headers,
664
+ status: response.status,
665
+ statusText: response.statusText
666
+ });
667
+ };
668
+ var init_pageResponseCache = () => {};
669
+
206
670
  // src/client/streamSwap.ts
207
671
  var streamSwapRuntime = () => {
208
672
  const absoluteWindow = window;
@@ -312,6 +776,26 @@ var streamSwapRuntime = () => {
312
776
  return value.slice(start + 1, end);
313
777
  }, getStreamSwapRuntimeScript = () => `(function(){${stripFunctionWrapper(streamSwapRuntime.toString())}})();`;
314
778
 
779
+ // src/constants.ts
780
+ 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;
781
+ var init_constants = __esm(() => {
782
+ TAILWIND_BUN_CSS_WARNING_PATTERN = /invalid @ rule encountered: '@(theme|tailwind|source|utility|variant|custom-variant|apply|reference|plugin|config)'/;
783
+ IMAGE_DEFAULT_DEVICE_SIZES = [
784
+ 640,
785
+ 750,
786
+ 828,
787
+ 1080,
788
+ 1200,
789
+ 1920,
790
+ 2048,
791
+ 3840
792
+ ];
793
+ IMAGE_DEFAULT_IMAGE_SIZES = [16, 32, 48, 64, 96, 128, 256, 384];
794
+ MILLISECONDS_IN_A_MINUTE = MILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE;
795
+ MILLISECONDS_IN_A_DAY = MILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE * MINUTES_IN_AN_HOUR * HOURS_IN_DAY;
796
+ TWO_THIRDS = 2 / 3;
797
+ });
798
+
315
799
  // src/utils/escapeScriptContent.ts
316
800
  var ESCAPE_LOOKUP, ESCAPE_REGEX, escapeScriptContent = (content) => content.replace(ESCAPE_REGEX, (char) => {
317
801
  const escaped = ESCAPE_LOOKUP[char];
@@ -988,6 +1472,19 @@ var colors2, frameworkColors, formatPath = (filePath) => {
988
1472
  const errorMsg = error instanceof Error ? error.message : error;
989
1473
  const fullMessage = `${colors2.red}error${colors2.reset} ${message}${errorMsg ? `: ${errorMsg}` : ""}`;
990
1474
  console.error(`${timestamp} ${tag} ${fullMessage}`);
1475
+ }, logHmrClientUpdate = (path, framework, duration, target, serverMs, clientMs, outcome = "applied", kind) => {
1476
+ const timestamp = `${colors2.dim}${formatTimestamp()}${colors2.reset}`;
1477
+ const targetLabel = target.startsWith("capacitor-") ? target.slice("capacitor-".length) : target;
1478
+ const tag = `${colors2.cyan}[hmr:${targetLabel}]${colors2.reset}`;
1479
+ const pathColor = framework ? getFrameworkColor(framework) : colors2.white;
1480
+ const breakdown = serverMs === undefined || clientMs === undefined ? "" : `; server ${serverMs}ms, client ${clientMs}ms`;
1481
+ let action = "failed after";
1482
+ if (outcome === "applied")
1483
+ action = "applied in";
1484
+ else if (outcome === "reloaded")
1485
+ action = "falling back to reload after";
1486
+ const kindLabel = kind ? `${kind} ` : "";
1487
+ console.log(`${timestamp} ${tag} ${framework ?? "update"} ${kindLabel}${pathColor}${formatPath(path)}${colors2.reset} ${colors2.dim}${action} ${duration}ms${breakdown}${colors2.reset}`);
991
1488
  }, logHmrUpdate = (path, framework, duration) => {
992
1489
  log("hmr update", { duration, framework, path });
993
1490
  }, logInfo = (message) => {
@@ -1083,14 +1580,6 @@ body{min-height:100vh;background:linear-gradient(135deg,rgba(15,23,42,0.98) 0%,r
1083
1580
  </html>`;
1084
1581
  };
1085
1582
 
1086
- // src/utils/stringModifiers.ts
1087
- var normalizeSlug = (str) => str.trim().replace(/\s+/g, "-").replace(/[^A-Za-z0-9\-_]+/g, "").replace(/[-_]{2,}/g, "-"), toKebab = (str) => normalizeSlug(str).replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), toPascal = (str) => {
1088
- if (!str.includes("-") && !str.includes("_")) {
1089
- return str.charAt(0).toUpperCase() + str.slice(1);
1090
- }
1091
- return normalizeSlug(str).split(/[-_]/).filter(Boolean).map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1).toLowerCase()).join("");
1092
- };
1093
-
1094
1583
  // src/cli/scripts/telemetry.ts
1095
1584
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
1096
1585
  import { homedir } from "os";
@@ -1114,7 +1603,7 @@ var init_telemetry = __esm(() => {
1114
1603
  // src/cli/telemetryEvent.ts
1115
1604
  import { existsSync as existsSync2, readFileSync as readFileSync2 } from "fs";
1116
1605
  import { arch, platform } from "os";
1117
- import { dirname, join as join2, parse } from "path";
1606
+ import { dirname as dirname3, join as join2, parse } from "path";
1118
1607
  var checkCandidate = (candidate) => {
1119
1608
  if (!existsSync2(candidate)) {
1120
1609
  return null;
@@ -1139,7 +1628,7 @@ var checkCandidate = (candidate) => {
1139
1628
  if (version) {
1140
1629
  return version;
1141
1630
  }
1142
- dir = dirname(dir);
1631
+ dir = dirname3(dir);
1143
1632
  }
1144
1633
  return "unknown";
1145
1634
  }, sendTelemetryEvent = (event, payload) => {
@@ -1178,18 +1667,18 @@ __export(exports_buildHMRClient, {
1178
1667
  buildHMRClient: () => buildHMRClient
1179
1668
  });
1180
1669
  import { existsSync as existsSync3 } from "fs";
1181
- import { resolve } from "path";
1670
+ import { resolve as resolve2 } from "path";
1182
1671
  var {build: bunBuild } = globalThis.Bun;
1183
1672
  var resolveHmrClientPath = () => {
1184
1673
  const projectRoot = process.cwd();
1185
- const fromSource = resolve(import.meta.dir, "client/hmrClient.ts");
1674
+ const fromSource = resolve2(import.meta.dir, "client/hmrClient.ts");
1186
1675
  if (existsSync3(fromSource) && fromSource.startsWith(projectRoot)) {
1187
1676
  return fromSource;
1188
1677
  }
1189
- const fromNodeModules = resolve(projectRoot, "node_modules/@absolutejs/absolute/dist/dev/client/hmrClient.ts");
1678
+ const fromNodeModules = resolve2(projectRoot, "node_modules/@absolutejs/absolute/dist/dev/client/hmrClient.ts");
1190
1679
  if (existsSync3(fromNodeModules))
1191
1680
  return fromNodeModules;
1192
- return resolve(import.meta.dir, "dev/client/hmrClient.ts");
1681
+ return resolve2(import.meta.dir, "dev/client/hmrClient.ts");
1193
1682
  }, hmrClientPath, buildHMRClient = async () => {
1194
1683
  const entryPoint = hmrClientPath;
1195
1684
  const result = await bunBuild({
@@ -1325,12 +1814,11 @@ var runWithStreamingSlotRegistry = async (task) => {
1325
1814
  };
1326
1815
 
1327
1816
  // src/vue/pageHandler.ts
1328
- init_constants();
1329
- import { readdir } from "fs/promises";
1330
- import { basename as basename2, dirname as dirname2 } from "path";
1817
+ init_inlinePageCss();
1818
+ init_spaRouteCss();
1819
+ init_spaRouteManifest();
1331
1820
 
1332
1821
  // src/core/islandPageContext.ts
1333
- init_constants();
1334
1822
  var BOOTSTRAP_MANIFEST_KEY = "BootstrapClient";
1335
1823
  var ISLAND_MARKER = 'data-island="true"';
1336
1824
  var MANIFEST_MARKER = "__ABSOLUTE_MANIFEST__";
@@ -1451,61 +1939,69 @@ var pipeStreamWithHeadInjection = (stream, markup) => {
1451
1939
  var pipeStreamWithIslandMarkerDetection = (stream, markup) => {
1452
1940
  const encoder = new TextEncoder;
1453
1941
  const decoder = new TextDecoder;
1454
- const lookbehind = Math.max(ISLAND_MARKER.length, BYTES_PER_KILOBYTE);
1455
- const processPending = (controller, pending, injected) => {
1456
- if (injected) {
1457
- controller.enqueue(encoder.encode(pending));
1458
- return { injected, pending: "" };
1942
+ const headLookbehind = CLOSING_HEAD_TAG.length - 1;
1943
+ const enqueue = (controller, text) => {
1944
+ if (text.length > 0) {
1945
+ controller.enqueue(encoder.encode(text));
1459
1946
  }
1460
- const markerIndex = pending.indexOf(ISLAND_MARKER);
1461
- if (markerIndex >= 0) {
1462
- const tagStart = pending.lastIndexOf("<", markerIndex);
1463
- const injectAt = tagStart >= 0 ? tagStart : markerIndex;
1464
- const next = `${pending.slice(0, injectAt)}${markup}${pending.slice(injectAt)}`;
1465
- controller.enqueue(encoder.encode(next));
1466
- return { injected: true, pending: "" };
1947
+ };
1948
+ const processHolding = (controller, held) => {
1949
+ if (!held.includes(ISLAND_MARKER)) {
1950
+ return { held, injected: false, pending: "", sawHead: true };
1467
1951
  }
1468
- return {
1469
- injected,
1470
- pending: flushSafePendingText(controller, encoder, pending, lookbehind)
1471
- };
1952
+ enqueue(controller, `${markup}${held}`);
1953
+ return { held: "", injected: true, pending: "", sawHead: true };
1472
1954
  };
1473
- const finishIslandMarkerStream = (controller, pending) => {
1474
- const finalPending = pending + decoder.decode();
1475
- if (finalPending.length > 0) {
1476
- controller.enqueue(encoder.encode(finalPending));
1955
+ const processHead = (controller, pending) => {
1956
+ const headIndex = pending.indexOf(CLOSING_HEAD_TAG);
1957
+ if (headIndex < 0) {
1958
+ return {
1959
+ held: "",
1960
+ injected: false,
1961
+ pending: flushSafePendingText(controller, encoder, pending, headLookbehind),
1962
+ sawHead: false
1963
+ };
1477
1964
  }
1478
- controller.close();
1965
+ enqueue(controller, pending.slice(0, headIndex));
1966
+ return processHolding(controller, pending.slice(headIndex));
1479
1967
  };
1480
- const consumeIslandChunk = async (controller, reader, pending, injected) => {
1481
- const { done, value } = await readStreamChunk(reader);
1482
- if (done || !value) {
1483
- return { done, injected, pending };
1968
+ const processChunk = (controller, state, chunk) => {
1969
+ if (state.injected) {
1970
+ enqueue(controller, chunk);
1971
+ return state;
1484
1972
  }
1485
- const processed = processPending(controller, pending + streamChunkToString(value, decoder), injected);
1486
- return {
1487
- done,
1488
- injected: processed.injected,
1489
- pending: processed.pending
1490
- };
1973
+ if (!state.sawHead) {
1974
+ return processHead(controller, state.pending + chunk);
1975
+ }
1976
+ return processHolding(controller, state.held + chunk);
1491
1977
  };
1492
- const runIslandMarkerLoop = async (controller, reader) => {
1493
- const consumeNextIslandChunk = async (injected, pending) => {
1494
- const consumed = await consumeIslandChunk(controller, reader, pending, injected);
1495
- const nextState = updateInjectedState(consumed, injected, pending);
1496
- if (nextState.done) {
1497
- return { injected, pending };
1978
+ const finishMarkerStream = (controller, state) => {
1979
+ const tail = decoder.decode();
1980
+ const remainder = state.injected ? tail : (state.sawHead ? state.held : state.pending) + tail;
1981
+ enqueue(controller, remainder);
1982
+ controller.close();
1983
+ };
1984
+ const runMarkerLoop = (controller, reader) => {
1985
+ const consumeNext = async (state) => {
1986
+ const { done, value } = await readStreamChunk(reader);
1987
+ if (done || !value) {
1988
+ return state;
1498
1989
  }
1499
- return consumeNextIslandChunk(nextState.injected, nextState.pending);
1990
+ return consumeNext(processChunk(controller, state, streamChunkToString(value, decoder)));
1500
1991
  };
1501
- return consumeNextIslandChunk(false, "");
1992
+ return consumeNext({
1993
+ held: "",
1994
+ injected: false,
1995
+ pending: "",
1996
+ sawHead: false
1997
+ });
1502
1998
  };
1503
1999
  return new ReadableStream({
1504
2000
  async start(controller) {
1505
2001
  const reader = stream.getReader();
1506
2002
  try {
1507
- const { pending } = await runIslandMarkerLoop(controller, reader);
1508
- finishIslandMarkerStream(controller, pending);
2003
+ const finalState = await runMarkerLoop(controller, reader);
2004
+ finishMarkerStream(controller, finalState);
1509
2005
  } catch (error) {
1510
2006
  controller.error(error);
1511
2007
  }
@@ -1543,9 +2039,11 @@ var setCurrentIslandManifest = (manifest) => {
1543
2039
 
1544
2040
  // src/vue/pageHandler.ts
1545
2041
  init_devRouteRegistrationCallsite();
2042
+ init_pageResponseCache();
1546
2043
 
1547
2044
  // src/core/responseEnhancers.ts
1548
2045
  init_streamingSlots();
2046
+ init_pageResponseCache();
1549
2047
  var toResponse = async (responseLike) => responseLike;
1550
2048
  var cloneHeaders = (response) => {
1551
2049
  const headers = new Headers(response.headers);
@@ -1560,392 +2058,140 @@ var enhanceHtmlResponseWithStreamingSlots = (response, {
1560
2058
  policy
1561
2059
  } = {}) => {
1562
2060
  if (!response.body || streamingSlots.length === 0) {
1563
- return response;
1564
- }
1565
- const body = appendStreamingSlotPatchesToStream(response.body, streamingSlots, {
1566
- nonce,
1567
- onError,
1568
- policy,
1569
- runtimePlacement,
1570
- runtimePreludeScript
1571
- });
1572
- return new Response(body, {
1573
- headers: cloneHeaders(response),
1574
- status: response.status,
1575
- statusText: response.statusText
1576
- });
1577
- };
1578
- var withStreamingSlots = async (responseLike, options = {}) => enhanceHtmlResponseWithStreamingSlots(await toResponse(responseLike), options);
1579
- var mergeStreamingSlots = (registered, explicit) => {
1580
- const merged = new Map;
1581
- for (const slot of registered)
1582
- merged.set(slot.id, slot);
1583
- for (const slot of explicit)
1584
- merged.set(slot.id, slot);
1585
- return [...merged.values()];
1586
- };
1587
- var withRegisteredStreamingSlots = async (renderResponse, options = {}) => {
1588
- const { result, slots } = await runWithStreamingSlotRegistry(renderResponse);
1589
- const explicit = options.streamingSlots ?? [];
1590
- return withStreamingSlots(result, {
1591
- ...options,
1592
- streamingSlots: mergeStreamingSlots(slots, explicit)
1593
- });
1594
- };
1595
-
1596
- // src/core/streamingSlotWarningScope.ts
1597
- init_logger();
1598
- import { AsyncLocalStorage as AsyncLocalStorage2 } from "async_hooks";
1599
- var STREAMING_SLOT_WARNING_STORAGE_KEY2 = Symbol.for("absolutejs.streamingSlotWarningAsyncLocalStorage");
1600
- var isObjectRecord4 = (value) => Boolean(value) && typeof value === "object";
1601
- var isAsyncLocalStorage3 = (value) => isObjectRecord4(value) && ("getStore" in value) && typeof value.getStore === "function" && ("run" in value) && typeof value.run === "function";
1602
- var getWarningStorage = () => {
1603
- const value = Reflect.get(globalThis, STREAMING_SLOT_WARNING_STORAGE_KEY2);
1604
- if (value === null || typeof value === "undefined") {
1605
- return;
1606
- }
1607
- return isAsyncLocalStorage3(value) ? value : undefined;
1608
- };
1609
- var ensureWarningStorage = () => {
1610
- const existing = getWarningStorage();
1611
- if (existing) {
1612
- return existing;
1613
- }
1614
- const storage = new AsyncLocalStorage2;
1615
- Reflect.set(globalThis, STREAMING_SLOT_WARNING_STORAGE_KEY2, storage);
1616
- return storage;
1617
- };
1618
- var normalizeCallsitePath2 = (value) => value.replace(`${process.cwd()}/`, "").replace(process.cwd(), "").replace(/^\.\/+/, "");
1619
- var formatWarningCallsite = (callsite) => {
1620
- const match = callsite.match(/^(.*?)(:\d+:\d+)$/);
1621
- if (!match) {
1622
- return `\x1B[36m${callsite}\x1B[0m`;
1623
- }
1624
- return `\x1B[36m${match[1]}\x1B[33m${match[2]}\x1B[0m`;
1625
- };
1626
- var shouldIgnoreWarningFrame = (frame) => frame.includes("/node_modules/") || frame.includes("/dist/") || frame.includes("/src/react/pageHandler.") || frame.includes("/src/vue/pageHandler.") || frame.includes("/src/svelte/pageHandler.") || frame.includes("/src/angular/pageHandler.") || frame.includes("/src/core/streamingSlotWarningScope.");
1627
- var getWarningLocation = (frame) => frame.match(/\((\/[^)]+:\d+:\d+)\)$/)?.[1] ?? frame.match(/at (\/[^ ]+:\d+:\d+)$/)?.[1];
1628
- var extractCallsiteFromStack = (stack) => {
1629
- const location = stack.split(`
1630
- `).slice(1).map((line) => line.trim()).filter((frame) => !shouldIgnoreWarningFrame(frame)).map((frame) => getWarningLocation(frame)).find((frameLocation) => frameLocation !== undefined);
1631
- return location ? normalizeCallsitePath2(location) : undefined;
1632
- };
1633
- var buildMissingCollectorWarning = (primitiveName, handlerCallsite) => `${primitiveName} rendered during SSR without streaming slot collection enabled. Add { collectStreamingSlots: true } to this page handler to enable out-of-order streaming for this route.${handlerCallsite ? ` Update ${formatWarningCallsite(handlerCallsite)}.` : ""}`;
1634
- setStreamingSlotWarningController({
1635
- maybeWarn: (primitiveName) => {
1636
- const store = getWarningStorage()?.getStore();
1637
- if (!store || store.hasWarned) {
1638
- return;
1639
- }
1640
- store.hasWarned = true;
1641
- logWarn(buildMissingCollectorWarning(primitiveName, store.handlerCallsite));
1642
- }
1643
- });
1644
- var captureStreamingSlotWarningCallsite = () => {
1645
- if (false) {}
1646
- const { stack } = new Error;
1647
- if (!stack) {
1648
- return;
1649
- }
1650
- return extractCallsiteFromStack(stack);
1651
- };
1652
- var runWithStreamingSlotWarningScope = (task, metadata) => ensureWarningStorage().run({ handlerCallsite: metadata?.handlerCallsite, hasWarned: false }, task);
1653
- // src/utils/resolveConvention.ts
1654
- import { basename } from "path";
1655
- var CONVENTIONS_KEY = "__absoluteConventions";
1656
- var isConventionsMap = (value) => Boolean(value) && typeof value === "object";
1657
- var getMap = () => {
1658
- const value = Reflect.get(globalThis, CONVENTIONS_KEY);
1659
- if (isConventionsMap(value))
1660
- return value;
1661
- const empty = {};
1662
- return empty;
1663
- };
1664
- var derivePageName = (pagePath) => {
1665
- const base = basename(pagePath);
1666
- const dotIndex = base.indexOf(".");
1667
- const name = dotIndex > 0 ? base.slice(0, dotIndex) : base;
1668
- return toPascal(name);
1669
- };
1670
- var normalizeConventionPageName = (name) => toPascal(name).replace(/\d+$/, "");
1671
- var resolveErrorConventionPath = (framework, pageName) => {
1672
- const conventions = getMap()[framework];
1673
- if (!conventions)
1674
- return;
1675
- const exact = conventions.pages?.[pageName]?.error;
1676
- if (exact)
1677
- return exact;
1678
- const normalizedPageName = normalizeConventionPageName(pageName);
1679
- for (const [candidate, page] of Object.entries(conventions.pages ?? {})) {
1680
- if (normalizeConventionPageName(candidate) === normalizedPageName) {
1681
- return page.error ?? conventions.defaults?.error;
1682
- }
1683
- }
1684
- return conventions.defaults?.error;
1685
- };
1686
- var resolveNotFoundConventionPath = (framework) => getMap()[framework]?.defaults?.notFound;
1687
- var hasErrorConvention = (framework) => {
1688
- const conventions = getMap()[framework];
1689
- if (!conventions)
1690
- return false;
1691
- if (conventions.defaults?.error)
1692
- return true;
1693
- return Object.values(conventions.pages ?? {}).some((page) => Boolean(page.error));
1694
- };
1695
- var setConventions = (map) => {
1696
- Reflect.set(globalThis, CONVENTIONS_KEY, map);
1697
- };
1698
- var isDev = () => true;
1699
- var buildErrorProps = (error) => {
1700
- if (error instanceof Error) {
1701
- return {
1702
- name: error.name,
1703
- message: error.message,
1704
- ...isDev() && error.stack ? { stack: error.stack } : {}
1705
- };
1706
- }
1707
- return { name: "Error", message: String(error) };
1708
- };
1709
- var renderReactError = async (conventionPath, errorProps) => {
1710
- const { createElement } = await import("react");
1711
- const { renderToReadableStream } = await import("react-dom/server");
1712
- const mod = await import(conventionPath);
1713
- const ErrorComponent = mod.default;
1714
- if (typeof ErrorComponent !== "function")
1715
- return null;
1716
- const element = createElement(ErrorComponent, errorProps);
1717
- const stream = await renderToReadableStream(element);
1718
- return new Response(stream, {
1719
- headers: { "Content-Type": "text/html" },
1720
- status: 500
1721
- });
1722
- };
1723
- var renderSvelteError = async (conventionPath, errorProps) => {
1724
- const { render } = await import("svelte/server");
1725
- const mod = await import(conventionPath);
1726
- const ErrorComponent = mod.default;
1727
- if (!ErrorComponent)
1728
- return null;
1729
- const { head, body } = render(ErrorComponent, {
1730
- props: errorProps
1731
- });
1732
- const html = `<!DOCTYPE html><html><head>${head}</head><body>${body}</body></html>`;
1733
- return new Response(html, {
1734
- headers: { "Content-Type": "text/html" },
1735
- status: 500
1736
- });
1737
- };
1738
- var unescapeVueStyles = (ssrBody) => {
1739
- let styles = "";
1740
- const body = ssrBody.replace(/<style>([\s\S]*?)<\/style>/g, (_, css) => {
1741
- styles += `<style>${css.replace(/&quot;/g, '"').replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">")}</style>`;
1742
- return "";
1743
- });
1744
- return { body, styles };
1745
- };
1746
- var renderVueError = async (conventionPath, errorProps) => {
1747
- const { createSSRApp, h } = await import("vue");
1748
- const { renderToString } = await import("vue/server-renderer");
1749
- const mod = await import(conventionPath);
1750
- const ErrorComponent = mod.default;
1751
- if (!ErrorComponent)
1752
- return null;
1753
- const app = createSSRApp({
1754
- render: () => h(ErrorComponent, errorProps)
2061
+ return response;
2062
+ }
2063
+ const body = appendStreamingSlotPatchesToStream(response.body, streamingSlots, {
2064
+ nonce,
2065
+ onError,
2066
+ policy,
2067
+ runtimePlacement,
2068
+ runtimePreludeScript
1755
2069
  });
1756
- const rawBody = await renderToString(app);
1757
- const { styles, body } = unescapeVueStyles(rawBody);
1758
- const html = `<!DOCTYPE html><html><head>${styles}</head><body><div id="root">${body}</div></body></html>`;
1759
- return new Response(html, {
1760
- headers: { "Content-Type": "text/html" },
1761
- status: 500
2070
+ const headers = cloneHeaders(response);
2071
+ headers.set(STREAMING_PAGE_HEADER, "1");
2072
+ return new Response(body, {
2073
+ headers,
2074
+ status: response.status,
2075
+ statusText: response.statusText
1762
2076
  });
1763
2077
  };
1764
- var renderAngularError = async (conventionPath, errorProps) => {
1765
- const mod = await import(conventionPath);
1766
- const renderFn = mod.default;
1767
- if (typeof renderFn !== "function")
1768
- return null;
1769
- const html = renderFn(errorProps);
1770
- return new Response(html, {
1771
- headers: { "Content-Type": "text/html" },
1772
- status: 500
1773
- });
2078
+ var withStreamingSlots = async (responseLike, options = {}) => enhanceHtmlResponseWithStreamingSlots(await toResponse(responseLike), options);
2079
+ var mergeStreamingSlots = (registered, explicit) => {
2080
+ const merged = new Map;
2081
+ for (const slot of registered)
2082
+ merged.set(slot.id, slot);
2083
+ for (const slot of explicit)
2084
+ merged.set(slot.id, slot);
2085
+ return [...merged.values()];
1774
2086
  };
1775
- var escapeHtml = (value) => value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
1776
- 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) : "");
1777
- var renderHtmlError = async (conventionPath, errorProps) => {
1778
- const template = await Bun.file(conventionPath).text();
1779
- const html = replaceErrorTokens(template, errorProps);
1780
- return new Response(html, {
1781
- headers: { "Content-Type": "text/html" },
1782
- status: 500
2087
+ var withRegisteredStreamingSlots = async (renderResponse, options = {}) => {
2088
+ const { result, slots } = await runWithStreamingSlotRegistry(renderResponse);
2089
+ const explicit = options.streamingSlots ?? [];
2090
+ return withStreamingSlots(result, {
2091
+ ...options,
2092
+ streamingSlots: mergeStreamingSlots(slots, explicit)
1783
2093
  });
1784
2094
  };
1785
- var logConventionRenderError = (framework, label, renderError) => {
1786
- const message = renderError instanceof Error ? renderError.message : "";
1787
- if (message.includes("Cannot find module") || message.includes("Cannot find package") || message.includes("not found in module")) {
1788
- 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}).`);
2095
+
2096
+ // src/core/streamingSlotWarningScope.ts
2097
+ init_logger();
2098
+ import { AsyncLocalStorage as AsyncLocalStorage2 } from "async_hooks";
2099
+ var STREAMING_SLOT_WARNING_STORAGE_KEY2 = Symbol.for("absolutejs.streamingSlotWarningAsyncLocalStorage");
2100
+ var isObjectRecord4 = (value) => Boolean(value) && typeof value === "object";
2101
+ var isAsyncLocalStorage3 = (value) => isObjectRecord4(value) && ("getStore" in value) && typeof value.getStore === "function" && ("run" in value) && typeof value.run === "function";
2102
+ var getWarningStorage = () => {
2103
+ const value = Reflect.get(globalThis, STREAMING_SLOT_WARNING_STORAGE_KEY2);
2104
+ if (value === null || typeof value === "undefined") {
1789
2105
  return;
1790
2106
  }
1791
- console.error(`[SSR] Failed to render ${framework} convention ${label} page:`, renderError);
1792
- };
1793
- var renderEmberError = async () => null;
1794
- var renderEmberNotFound = async () => null;
1795
- var ERROR_RENDERERS = {
1796
- angular: renderAngularError,
1797
- ember: renderEmberError,
1798
- html: renderHtmlError,
1799
- react: renderReactError,
1800
- svelte: renderSvelteError,
1801
- vue: renderVueError
2107
+ return isAsyncLocalStorage3(value) ? value : undefined;
1802
2108
  };
1803
- var tryFrameworkErrorConvention = async (framework, pageName, errorProps, error) => {
1804
- let conventionPath = resolveErrorConventionPath(framework, pageName);
1805
- if (!conventionPath && error instanceof Error && error.stack) {
1806
- for (const match of error.stack.matchAll(/^\s*at\s+([A-Za-z_$][\w$]*)/gm)) {
1807
- const candidate = match[1];
1808
- if (!candidate)
1809
- continue;
1810
- conventionPath = resolveErrorConventionPath(framework, candidate);
1811
- if (conventionPath)
1812
- break;
1813
- }
1814
- }
1815
- if (!conventionPath)
1816
- return null;
1817
- const renderer = ERROR_RENDERERS[framework];
1818
- if (!renderer)
1819
- return null;
1820
- try {
1821
- return await renderer(conventionPath, errorProps);
1822
- } catch (renderError) {
1823
- logConventionRenderError(framework, "error", renderError);
2109
+ var ensureWarningStorage = () => {
2110
+ const existing = getWarningStorage();
2111
+ if (existing) {
2112
+ return existing;
1824
2113
  }
1825
- return null;
2114
+ const storage = new AsyncLocalStorage2;
2115
+ Reflect.set(globalThis, STREAMING_SLOT_WARNING_STORAGE_KEY2, storage);
2116
+ return storage;
1826
2117
  };
1827
- var renderConventionError = async (framework, pageName, error) => {
1828
- const errorProps = buildErrorProps(error);
1829
- const frameworkResponse = await tryFrameworkErrorConvention(framework, pageName, errorProps, error);
1830
- if (frameworkResponse)
1831
- return frameworkResponse;
1832
- if (framework !== "html") {
1833
- const htmlResponse = await tryFrameworkErrorConvention("html", pageName, errorProps, error);
1834
- if (htmlResponse)
1835
- return htmlResponse;
2118
+ var normalizeCallsitePath2 = (value) => value.replace(`${process.cwd()}/`, "").replace(process.cwd(), "").replace(/^\.\/+/, "");
2119
+ var formatWarningCallsite = (callsite) => {
2120
+ const match = callsite.match(/^(.*?)(:\d+:\d+)$/);
2121
+ if (!match) {
2122
+ return `\x1B[36m${callsite}\x1B[0m`;
1836
2123
  }
1837
- return null;
1838
- };
1839
- var renderReactNotFound = async (conventionPath) => {
1840
- const { createElement } = await import("react");
1841
- const { renderToReadableStream } = await import("react-dom/server");
1842
- const mod = await import(conventionPath);
1843
- const NotFoundComponent = mod.default;
1844
- if (typeof NotFoundComponent !== "function")
1845
- return null;
1846
- const element = createElement(NotFoundComponent);
1847
- const stream = await renderToReadableStream(element);
1848
- return new Response(stream, {
1849
- headers: { "Content-Type": "text/html" },
1850
- status: 404
1851
- });
1852
- };
1853
- var renderSvelteNotFound = async (conventionPath) => {
1854
- const { render } = await import("svelte/server");
1855
- const mod = await import(conventionPath);
1856
- const NotFoundComponent = mod.default;
1857
- if (!NotFoundComponent)
1858
- return null;
1859
- const { head, body } = render(NotFoundComponent);
1860
- const html = `<!DOCTYPE html><html><head>${head}</head><body>${body}</body></html>`;
1861
- return new Response(html, {
1862
- headers: { "Content-Type": "text/html" },
1863
- status: 404
1864
- });
1865
- };
1866
- var renderVueNotFound = async (conventionPath) => {
1867
- const { createSSRApp, h } = await import("vue");
1868
- const { renderToString } = await import("vue/server-renderer");
1869
- const mod = await import(conventionPath);
1870
- const NotFoundComponent = mod.default;
1871
- if (!NotFoundComponent)
1872
- return null;
1873
- const app = createSSRApp({
1874
- render: () => h(NotFoundComponent)
1875
- });
1876
- const rawBody = await renderToString(app);
1877
- const { styles, body } = unescapeVueStyles(rawBody);
1878
- const html = `<!DOCTYPE html><html><head>${styles}</head><body><div id="root">${body}</div></body></html>`;
1879
- return new Response(html, {
1880
- headers: { "Content-Type": "text/html" },
1881
- status: 404
1882
- });
1883
- };
1884
- var renderAngularNotFound = async (conventionPath) => {
1885
- const mod = await import(conventionPath);
1886
- const renderFn = mod.default;
1887
- if (typeof renderFn !== "function")
1888
- return null;
1889
- const html = renderFn();
1890
- return new Response(html, {
1891
- headers: { "Content-Type": "text/html" },
1892
- status: 404
1893
- });
2124
+ return `\x1B[36m${match[1]}\x1B[33m${match[2]}\x1B[0m`;
1894
2125
  };
1895
- var renderHtmlNotFound = async (conventionPath) => {
1896
- const html = await Bun.file(conventionPath).text();
1897
- return new Response(html, {
1898
- headers: { "Content-Type": "text/html" },
1899
- status: 404
1900
- });
2126
+ var shouldIgnoreWarningFrame = (frame) => frame.includes("/node_modules/") || frame.includes("/dist/") || frame.includes("/src/react/pageHandler.") || frame.includes("/src/vue/pageHandler.") || frame.includes("/src/svelte/pageHandler.") || frame.includes("/src/angular/pageHandler.") || frame.includes("/src/core/streamingSlotWarningScope.");
2127
+ var getWarningLocation = (frame) => frame.match(/\((\/[^)]+:\d+:\d+)\)$/)?.[1] ?? frame.match(/at (\/[^ ]+:\d+:\d+)$/)?.[1];
2128
+ var extractCallsiteFromStack = (stack) => {
2129
+ const location = stack.split(`
2130
+ `).slice(1).map((line) => line.trim()).filter((frame) => !shouldIgnoreWarningFrame(frame)).map((frame) => getWarningLocation(frame)).find((frameLocation) => frameLocation !== undefined);
2131
+ return location ? normalizeCallsitePath2(location) : undefined;
1901
2132
  };
1902
- var NOT_FOUND_RENDERERS = {
1903
- angular: renderAngularNotFound,
1904
- ember: renderEmberNotFound,
1905
- html: renderHtmlNotFound,
1906
- react: renderReactNotFound,
1907
- svelte: renderSvelteNotFound,
1908
- vue: renderVueNotFound
2133
+ var buildMissingCollectorWarning = (primitiveName, handlerCallsite) => `${primitiveName} rendered during SSR without streaming slot collection enabled. Add { collectStreamingSlots: true } to this page handler to enable out-of-order streaming for this route.${handlerCallsite ? ` Update ${formatWarningCallsite(handlerCallsite)}.` : ""}`;
2134
+ setStreamingSlotWarningController({
2135
+ maybeWarn: (primitiveName) => {
2136
+ const store = getWarningStorage()?.getStore();
2137
+ if (!store || store.hasWarned) {
2138
+ return;
2139
+ }
2140
+ store.hasWarned = true;
2141
+ logWarn(buildMissingCollectorWarning(primitiveName, store.handlerCallsite));
2142
+ }
2143
+ });
2144
+ var captureStreamingSlotWarningCallsite = () => {
2145
+ if (false) {}
2146
+ const { stack } = new Error;
2147
+ if (!stack) {
2148
+ return;
2149
+ }
2150
+ return extractCallsiteFromStack(stack);
1909
2151
  };
1910
- var renderConventionNotFound = async (framework) => {
1911
- const conventionPath = resolveNotFoundConventionPath(framework);
1912
- if (!conventionPath)
1913
- return null;
1914
- const renderer = NOT_FOUND_RENDERERS[framework];
1915
- if (!renderer)
1916
- return null;
2152
+ var runWithStreamingSlotWarningScope = (task, metadata) => ensureWarningStorage().run({ handlerCallsite: metadata?.handlerCallsite, hasWarned: false }, task);
2153
+
2154
+ // src/vue/pageHandler.ts
2155
+ init_resolveConvention();
2156
+
2157
+ // src/vue/resolveGeneratedVueModulePath.ts
2158
+ init_constants();
2159
+ import { access, readdir, stat } from "fs/promises";
2160
+ import { basename as basename3, dirname as dirname2 } from "path";
2161
+ var canAccess = async (path) => {
1917
2162
  try {
1918
- return await renderer(conventionPath);
1919
- } catch (renderError) {
1920
- logConventionRenderError(framework, "not-found", renderError);
2163
+ await access(path);
2164
+ return true;
2165
+ } catch {
2166
+ return false;
1921
2167
  }
1922
- return null;
1923
2168
  };
1924
- var NOT_FOUND_PRIORITY = [
1925
- "react",
1926
- "svelte",
1927
- "vue",
1928
- "angular",
1929
- "html"
1930
- ];
1931
- var renderFirstNotFound = async () => {
1932
- const renderNext = async (frameworks) => {
1933
- const [framework, ...remaining] = frameworks;
1934
- if (!framework) {
1935
- return null;
1936
- }
1937
- if (!getMap()[framework]?.defaults?.notFound) {
1938
- return renderNext(remaining);
1939
- }
1940
- const response = await renderConventionNotFound(framework);
1941
- if (response) {
1942
- return response;
1943
- }
1944
- return renderNext(remaining);
1945
- };
1946
- return renderNext(NOT_FOUND_PRIORITY);
2169
+ var resolveGeneratedVueModulePath = async (pagePath) => {
2170
+ if (await canAccess(pagePath))
2171
+ return pagePath;
2172
+ const pageDirectory = dirname2(pagePath);
2173
+ const expectedPrefix = `${basename3(pagePath, ".js").split(".")[0]}.`;
2174
+ try {
2175
+ const pageEntries = await readdir(pageDirectory, {
2176
+ withFileTypes: true
2177
+ });
2178
+ const matchingEntries = pageEntries.filter((entry) => entry.isFile() && entry.name.endsWith(".js") && (entry.name === `${expectedPrefix.slice(0, EXCLUDE_LAST_OFFSET)}.js` || entry.name.startsWith(expectedPrefix)));
2179
+ const candidates = await Promise.all(matchingEntries.map(async (entry) => {
2180
+ const path = `${pageDirectory}/${entry.name}`;
2181
+ const metadata = await stat(path);
2182
+ return { modifiedAt: metadata.mtimeMs, path };
2183
+ }));
2184
+ candidates.sort((left, right) => right.modifiedAt - left.modifiedAt || left.path.localeCompare(right.path));
2185
+ return candidates[0]?.path ?? pagePath;
2186
+ } catch {
2187
+ return pagePath;
2188
+ }
1947
2189
  };
1948
2190
 
2191
+ // src/vue/teleports.ts
2192
+ var ABSOLUTE_TELEPORT_TARGET_ID = "absolute-teleports";
2193
+ var ABSOLUTE_TELEPORT_TARGET = `#${ABSOLUTE_TELEPORT_TARGET_ID}`;
2194
+
1949
2195
  // src/vue/pageHandler.ts
1950
2196
  var isRecord2 = (value) => typeof value === "object" && value !== null;
1951
2197
  var isGenericVueComponent = (value) => typeof value === "function" || isRecord2(value);
@@ -1955,29 +2201,15 @@ var readHasIslands = (value) => {
1955
2201
  const hasIslands = value["__ABSOLUTE_PAGE_HAS_ISLANDS__"];
1956
2202
  return typeof hasIslands === "boolean" ? hasIslands : false;
1957
2203
  };
2204
+ var isVueSetupApp = (value) => typeof value === "function";
1958
2205
  var readSetupAppHook = (value) => {
1959
2206
  if (!isRecord2(value))
1960
2207
  return null;
1961
- const setupApp = value["setupApp"];
1962
- return typeof setupApp === "function" ? setupApp : null;
2208
+ const { setupApp } = value;
2209
+ return isVueSetupApp(setupApp) ? setupApp : null;
1963
2210
  };
2211
+ var readHasSpaRoutes = (value) => isRecord2(value) && Array.isArray(value["routes"]);
1964
2212
  var readDefaultExport = (value) => isRecord2(value) ? value.default : undefined;
1965
- var resolveCurrentGeneratedVueModulePath = async (pagePath) => {
1966
- const pageDirectory = dirname2(pagePath);
1967
- const expectedPrefix = `${basename2(pagePath, ".js").split(".")[0]}.`;
1968
- try {
1969
- const pageEntries = await readdir(pageDirectory, {
1970
- withFileTypes: true
1971
- });
1972
- const matchingEntry = pageEntries.find((entry) => entry.isFile() && entry.name.endsWith(".js") && (entry.name === `${expectedPrefix.slice(0, EXCLUDE_LAST_OFFSET)}.js` || entry.name.startsWith(expectedPrefix)));
1973
- if (!matchingEntry) {
1974
- return pagePath;
1975
- }
1976
- return `${pageDirectory}/${matchingEntry.name}`;
1977
- } catch {
1978
- return pagePath;
1979
- }
1980
- };
1981
2213
  var resolveRequestRenderUrl = (request) => {
1982
2214
  if (!request)
1983
2215
  return "/";
@@ -1994,40 +2226,53 @@ var primeVueStream = async (stream) => {
1994
2226
  return { firstChunk, reader };
1995
2227
  };
1996
2228
  var cachedSsrOnlyHmrShim = null;
2229
+ var buildSsrOnlyHmrShim = async () => {
2230
+ const { buildHMRClient: buildHMRClient2 } = await Promise.resolve().then(() => (init_buildHMRClient(), exports_buildHMRClient));
2231
+ const bundle = await buildHMRClient2();
2232
+ return `<script>window.__HMR_FRAMEWORK__="vue";</script><script data-hmr-client>${bundle}</script>`;
2233
+ };
1997
2234
  var getSsrOnlyHmrShim = () => {
1998
2235
  if (cachedSsrOnlyHmrShim)
1999
2236
  return cachedSsrOnlyHmrShim;
2000
- cachedSsrOnlyHmrShim = (async () => {
2001
- const { buildHMRClient: buildHMRClient2 } = await Promise.resolve().then(() => (init_buildHMRClient(), exports_buildHMRClient));
2002
- const bundle = await buildHMRClient2();
2003
- return `<script>window.__HMR_FRAMEWORK__="vue";</script><script data-hmr-client>${bundle}</script>`;
2004
- })();
2237
+ cachedSsrOnlyHmrShim = buildSsrOnlyHmrShim();
2005
2238
  return cachedSsrOnlyHmrShim;
2006
2239
  };
2007
2240
  var handleVuePageRequest = async (input) => {
2008
2241
  const passedPageComponent = input.Page;
2009
- const resolvedHeadTag = input.headTag ?? "<head></head>";
2242
+ const userHeadTag = input.headTag ?? "<head></head>";
2010
2243
  const resolvedOptions = input;
2011
2244
  const resolvedPagePath = input.pagePath;
2245
+ const [siblingCss, spaChildCss] = await Promise.all([
2246
+ readSiblingCss(resolvedPagePath),
2247
+ resolveSpaChildCss(resolvedPagePath, input.request?.url)
2248
+ ]);
2249
+ const resolvedHeadTag = injectInlineCss(injectInlineCss(userHeadTag, siblingCss), spaChildCss);
2012
2250
  const maybeProps = input.props;
2013
2251
  const clientMode = input.client ?? "auto";
2014
2252
  const resolvedIndexPath = input.indexPath;
2253
+ if (clientMode === "auto" && resolvedIndexPath === "") {
2254
+ throw new Error(`Asset "${derivePageName(resolvedPagePath)}Index" not found in manifest.`);
2255
+ }
2015
2256
  if (clientMode === "auto" && !resolvedIndexPath) {
2016
2257
  throw new Error('handleVuePageRequest: `indexPath` is required when `client` is `"auto"` (the default). Pass `client: "none"` to ship a SSR-only page with no client bundle.');
2017
2258
  }
2018
2259
  try {
2260
+ const spaNotFound = await renderSpaNotFound("vue", derivePageName(resolvedPagePath), input.request);
2261
+ if (spaNotFound)
2262
+ return withPageCacheHeaders(spaNotFound, input.request);
2019
2263
  const handlerCallsite = resolvedOptions?.collectStreamingSlots === true ? undefined : getCurrentRouteRegistrationCallsite() ?? captureStreamingSlotWarningCallsite();
2020
2264
  const renderPageResponse = async () => {
2021
2265
  const resolvePageComponent = async () => {
2022
2266
  if (isGenericVueComponent(passedPageComponent)) {
2267
+ const setupApp = null;
2023
2268
  return {
2024
2269
  component: passedPageComponent,
2025
2270
  hasIslands: readHasIslands(passedPageComponent),
2026
- routes: null,
2027
- setupApp: null
2271
+ hasSpaRoutes: false,
2272
+ setupApp
2028
2273
  };
2029
2274
  }
2030
- const generatedPagePath = await resolveCurrentGeneratedVueModulePath(resolvedPagePath);
2275
+ const generatedPagePath = await resolveGeneratedVueModulePath(resolvedPagePath);
2031
2276
  const importedPageModule = await import(generatedPagePath);
2032
2277
  const importedPageComponent = readDefaultExport(importedPageModule) ?? importedPageModule;
2033
2278
  if (!isGenericVueComponent(importedPageComponent)) {
@@ -2036,28 +2281,31 @@ var handleVuePageRequest = async (input) => {
2036
2281
  return {
2037
2282
  component: importedPageComponent,
2038
2283
  hasIslands: readHasIslands(importedPageModule),
2284
+ hasSpaRoutes: readHasSpaRoutes(importedPageModule),
2039
2285
  setupApp: readSetupAppHook(importedPageModule)
2040
2286
  };
2041
2287
  };
2042
2288
  const resolvedPage = await resolvePageComponent();
2043
- const { createSSRApp, h } = await import("vue");
2044
- const { renderToWebStream } = await import("vue/server-renderer");
2045
- const app = createSSRApp({
2046
- render: () => h(resolvedPage.component, maybeProps ?? null)
2047
- });
2289
+ const { createSSRApp } = await import("vue");
2290
+ const { renderToString, renderToWebStream } = await import("vue/server-renderer");
2291
+ const app = createSSRApp(resolvedPage.component, maybeProps ?? null);
2048
2292
  let pendingRedirect = null;
2293
+ let pendingNotFound = false;
2049
2294
  if (resolvedPage.setupApp) {
2050
2295
  const url = resolveRequestRenderUrl(input.request);
2051
2296
  await resolvedPage.setupApp(app, {
2052
2297
  isServer: true,
2053
2298
  router: null,
2299
+ url,
2300
+ setNotFound: () => {
2301
+ pendingNotFound = true;
2302
+ },
2054
2303
  setRedirect: (location, status) => {
2055
2304
  pendingRedirect = {
2056
2305
  location,
2057
2306
  status: status ?? 302
2058
2307
  };
2059
- },
2060
- url
2308
+ }
2061
2309
  });
2062
2310
  }
2063
2311
  if (pendingRedirect !== null) {
@@ -2067,11 +2315,33 @@ var handleVuePageRequest = async (input) => {
2067
2315
  status: redirect.status
2068
2316
  });
2069
2317
  }
2070
- const bodyStream = renderToWebStream(app);
2071
- const { firstChunk, reader } = await primeVueStream(bodyStream);
2318
+ if (pendingNotFound) {
2319
+ return await renderFirstNotFound() ?? new Response("Not found", {
2320
+ headers: { "Content-Type": "text/plain" },
2321
+ status: 404
2322
+ });
2323
+ }
2324
+ const ssrContext = {};
2072
2325
  const head = `<!DOCTYPE html><html>${resolvedHeadTag}<body><div id="root">`;
2073
2326
  const ssrOnlyHmrShim = clientMode === "none" ? await getSsrOnlyHmrShim() : "";
2074
- const tail = clientMode === "none" ? `</div>${ssrOnlyHmrShim}</body></html>` : `</div><script>window.__INITIAL_PROPS__=${JSON.stringify(maybeProps ?? {})}</script><script type="module" src="${resolvedIndexPath}"></script></body></html>`;
2327
+ const buildTail = () => {
2328
+ const teleports = ssrContext.teleports?.[ABSOLUTE_TELEPORT_TARGET] ?? "";
2329
+ const teleportHost = `<div id="${ABSOLUTE_TELEPORT_TARGET_ID}">${teleports}</div>`;
2330
+ return clientMode === "none" ? `</div>${teleportHost}${ssrOnlyHmrShim}</body></html>` : `</div>${teleportHost}<script>window.__INITIAL_PROPS__=${JSON.stringify(maybeProps ?? {})}</script><script type="module" src="${resolvedIndexPath}"></script></body></html>`;
2331
+ };
2332
+ if (resolvedPage.hasSpaRoutes && clientMode === "auto") {
2333
+ return new Response(`${head}${buildTail()}`, {
2334
+ headers: { "Content-Type": "text/html" }
2335
+ });
2336
+ }
2337
+ if (resolvedOptions?.collectStreamingSlots !== true) {
2338
+ const body = await renderToString(app, ssrContext);
2339
+ return new Response(`${head}${body}${buildTail()}`, {
2340
+ headers: streamingPageHeaders()
2341
+ });
2342
+ }
2343
+ const bodyStream = renderToWebStream(app, ssrContext);
2344
+ const { firstChunk, reader } = await primeVueStream(bodyStream);
2075
2345
  const stream = new ReadableStream({
2076
2346
  start(controller) {
2077
2347
  controller.enqueue(head);
@@ -2079,12 +2349,18 @@ var handleVuePageRequest = async (input) => {
2079
2349
  controller.enqueue(firstChunk.value);
2080
2350
  }
2081
2351
  if (firstChunk.done) {
2082
- controller.enqueue(tail);
2352
+ controller.enqueue(buildTail());
2083
2353
  controller.close();
2084
2354
  return;
2085
2355
  }
2086
2356
  const pumpLoop = () => {
2087
- reader.read().then(({ done, value }) => done ? (controller.enqueue(tail), controller.close()) : (controller.enqueue(value), pumpLoop())).catch((err) => controller.error(err));
2357
+ reader.read().then(({ done, value }) => done ? (controller.enqueue(buildTail()), controller.close()) : (controller.enqueue(value), pumpLoop())).catch((err) => {
2358
+ console.error("[SSR] Vue streaming render error:", err);
2359
+ reader.cancel(err).catch(() => {
2360
+ return;
2361
+ });
2362
+ controller.error(err);
2363
+ });
2088
2364
  };
2089
2365
  pumpLoop();
2090
2366
  }
@@ -2093,20 +2369,24 @@ var handleVuePageRequest = async (input) => {
2093
2369
  hasIslands: resolvedPage.hasIslands
2094
2370
  });
2095
2371
  return new Response(htmlStream, {
2096
- headers: { "Content-Type": "text/html" }
2372
+ headers: streamingPageHeaders()
2097
2373
  });
2098
2374
  };
2099
- return await runWithStreamingSlotWarningScope(() => resolvedOptions?.collectStreamingSlots === true ? withRegisteredStreamingSlots(renderPageResponse, resolvedOptions) : renderPageResponse(), { handlerCallsite });
2375
+ const pageResponse = await runWithStreamingSlotWarningScope(() => resolvedOptions?.collectStreamingSlots === true ? withRegisteredStreamingSlots(renderPageResponse, resolvedOptions) : renderPageResponse(), { handlerCallsite });
2376
+ return withPageCacheHeaders(pageResponse, input.request, {
2377
+ bufferStreamForEtag: input.bufferStreamForEtag
2378
+ });
2100
2379
  } catch (error) {
2101
2380
  console.error("[SSR] Vue render error:", error);
2102
2381
  const pageName = derivePageName(resolvedPagePath);
2103
2382
  const conventionResponse = await renderConventionError("vue", pageName, error);
2104
- if (conventionResponse)
2105
- return conventionResponse;
2106
- return new Response(ssrErrorPage("vue", error), {
2383
+ if (conventionResponse) {
2384
+ return withPageCacheHeaders(conventionResponse, input.request);
2385
+ }
2386
+ return withPageCacheHeaders(new Response(ssrErrorPage("vue", error), {
2107
2387
  headers: { "Content-Type": "text/html" },
2108
2388
  status: 500
2109
- });
2389
+ }), input.request);
2110
2390
  }
2111
2391
  };
2112
2392
  // src/vue/routerRedirectProviders.ts
@@ -2131,5 +2411,5 @@ export {
2131
2411
  applyVueRouterRedirect
2132
2412
  };
2133
2413
 
2134
- //# debugId=F925C9676FC0E5B064756E2164756E21
2414
+ //# debugId=89D724EF33B3354364756E2164756E21
2135
2415
  //# sourceMappingURL=server.js.map