@absolutejs/absolute 0.20.0-beta.181 → 0.20.0-beta.183

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 (126) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/changelog.json +75 -0
  3. package/dist/angular/browser.js +2 -2
  4. package/dist/angular/browser.js.map +4 -4
  5. package/dist/angular/components/constants.js +4 -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/index.js +520 -84
  9. package/dist/angular/index.js.map +13 -12
  10. package/dist/angular/server.js +520 -84
  11. package/dist/angular/server.js.map +13 -12
  12. package/dist/build.js +452 -85
  13. package/dist/build.js.map +18 -18
  14. package/dist/cli/{add-8gw9mk2b.js → add-jft96bp4.js} +9 -9
  15. package/dist/cli/{analyze-e57zz9x8.js → analyze-5w46d1f0.js} +3 -3
  16. package/dist/cli/{androidEmulatorController-vqc5m2rp.js → androidEmulatorController-gbf9r660.js} +6 -6
  17. package/dist/cli/{androidNativeWatcher-s03aczxv.js → androidNativeWatcher-3astrxxz.js} +6 -6
  18. package/dist/cli/{api-8ppxw487.js → api-zmvnvdsf.js} +8 -8
  19. package/dist/cli/{build-ptx5a72p.js → build-df81wh71.js} +67 -6
  20. package/dist/cli/{build-fz7qbdn3.js → build-mskrk9zb.js} +3 -3
  21. package/dist/cli/{buildDepVendor-qnwfct22.js → buildDepVendor-36d1aa7c.js} +2 -2
  22. package/dist/cli/{buildReactServerComponents-01s87hnk.js → buildReactServerComponents-k6amghrj.js} +5 -5
  23. package/dist/cli/{compile-54rb8szn.js → compile-7mjd739p.js} +10 -6
  24. package/dist/cli/config/server.js +37 -18
  25. package/dist/cli/{db-qbzjw3en.js → db-mpmj37jq.js} +2 -2
  26. package/dist/cli/{dev-6s6g5tnk.js → dev-9d6d7757.js} +14 -14
  27. package/dist/cli/{doctor-m36tmx4d.js → doctor-nng9szw6.js} +3 -3
  28. package/dist/cli/{emulatorDoctor-s1z5tkp7.js → emulatorDoctor-3eszsqs8.js} +5 -5
  29. package/dist/cli/{emulatorInstaller-pgkdswvq.js → emulatorInstaller-1r6cawm0.js} +6 -6
  30. package/dist/cli/{env-5nz1qm8e.js → env-bfa7vs35.js} +3 -3
  31. package/dist/cli/{expoDevController-018anvbm.js → expoDevController-s0msdwbm.js} +6 -6
  32. package/dist/cli/{generate-5vyz1s44.js → generate-xk3a7qnc.js} +8 -8
  33. package/dist/cli/{heapDiff-kncvdtn8.js → heapDiff-3ba8p8wf.js} +3 -3
  34. package/dist/cli/{htmx-26hs6jdm.js → htmx-an2x3gpx.js} +6 -6
  35. package/dist/cli/{index-7854xf0m.js → index-1bszxtdj.js} +1 -1
  36. package/dist/cli/{index-kx2d067c.js → index-3066eqr3.js} +8 -5
  37. package/dist/cli/{index-8khbn8qr.js → index-3a9h87v5.js} +3 -3
  38. package/dist/cli/{index-jkg2h10c.js → index-3dz754hk.js} +3 -3
  39. package/dist/cli/{index-9djrap79.js → index-3pz5sjaz.js} +1 -1
  40. package/dist/cli/{index-50ag35xg.js → index-3ys9tz53.js} +2 -2
  41. package/dist/cli/{index-6f448d7m.js → index-4ynx0cq6.js} +26 -12
  42. package/dist/cli/{index-btp4fyf1.js → index-785hpa2r.js} +2 -2
  43. package/dist/cli/{index-kes8he5s.js → index-9sqqzeq4.js} +1 -1
  44. package/dist/cli/{index-pr1skxen.js → index-akseq9ps.js} +1 -1
  45. package/dist/cli/{index-23hvdyxf.js → index-c6j2727a.js} +1 -1
  46. package/dist/cli/{index-pkw3jktb.js → index-eh786rj4.js} +2 -2
  47. package/dist/cli/{index-aemhvvwb.js → index-eydgkr7w.js} +1 -1
  48. package/dist/cli/{index-rz56x932.js → index-fbmfpqk8.js} +1 -1
  49. package/dist/cli/{index-c8rcfe5a.js → index-fy4th3n0.js} +1 -1
  50. package/dist/cli/{index-prza6tkp.js → index-gx6pjzzk.js} +3 -3
  51. package/dist/cli/{index-125cfzvn.js → index-hker5fs4.js} +2 -2
  52. package/dist/cli/{index-cgmp9d02.js → index-hqkcxa2p.js} +1 -1
  53. package/dist/cli/{index-5w8arh3m.js → index-pq4qqz0r.js} +2 -2
  54. package/dist/cli/{index-enbw9484.js → index-wpgsermq.js} +1 -1
  55. package/dist/cli/{index-0z5fgb80.js → index-wqpg377f.js} +1 -1
  56. package/dist/cli/{index-3sfcmb49.js → index-x7h6w6td.js} +1 -1
  57. package/dist/cli/{index-a6xx0p9e.js → index-ydaxsftq.js} +1 -1
  58. package/dist/cli/{index-3ewt17wm.js → index-yhkg5by0.js} +1 -1
  59. package/dist/cli/{index-aqe25w4h.js → index-zeeep92g.js} +1 -1
  60. package/dist/cli/index.js +32 -32
  61. package/dist/cli/{info-k124sh7g.js → info-5rwsbhe2.js} +4 -4
  62. package/dist/cli/{inspect-n6pcfvfw.js → inspect-nmwb0q5k.js} +5 -5
  63. package/dist/cli/{iosNativeWatcher-wdq2fvj1.js → iosNativeWatcher-7r9gnk87.js} +7 -7
  64. package/dist/cli/{iosSimulatorController-n97dpa8p.js → iosSimulatorController-w963vv9r.js} +7 -7
  65. package/dist/cli/{islands-17tfx8jf.js → islands-w9xrehpk.js} +3 -3
  66. package/dist/cli/{logs-shg23fbt.js → logs-m793x8a7.js} +3 -3
  67. package/dist/cli/{ls-0wr74w0b.js → ls-k31npd5b.js} +3 -3
  68. package/dist/cli/{mem-16sy1707.js → mem-jm6kw6gr.js} +5 -5
  69. package/dist/cli/{migrate-k91k050s.js → migrate-95bjkqkr.js} +2 -2
  70. package/dist/cli/{mobile-hpqpy61f.js → mobile-cpp8vfn7.js} +13 -13
  71. package/dist/cli/prerender-26pzynh4.js +13 -0
  72. package/dist/cli/{prettier-dh5fh786.js → prettier-0ws9pbc1.js} +1 -1
  73. package/dist/cli/{ps-pk7ncjac.js → ps-fx8mz3e3.js} +6 -6
  74. package/dist/cli/{psTui-50wf0b72.js → psTui-0e9c7an6.js} +7 -7
  75. package/dist/cli/{remoteMacProtocol-g10s408w.js → remoteMacProtocol-y7h79gr8.js} +7 -7
  76. package/dist/cli/{remove-x987pvd3.js → remove-xhvph8bz.js} +8 -8
  77. package/dist/cli/{routes-mc3ymp8t.js → routes-hq9yje5z.js} +3 -3
  78. package/dist/cli/{start-mbn2zgs2.js → start-5mjh9hh2.js} +5 -5
  79. package/dist/cli/{typecheck-ynzw2eep.js → typecheck-bvm0ndq4.js} +188 -75
  80. package/dist/cli/{workspace-7sbyyc59.js → workspace-xeb6abxj.js} +5 -5
  81. package/dist/dev/serverBootstrap.js +8 -2
  82. package/dist/index.js +469 -99
  83. package/dist/index.js.map +20 -20
  84. package/dist/islands/index.js +312 -23
  85. package/dist/islands/index.js.map +5 -5
  86. package/dist/mobile/index.js +2 -2
  87. package/dist/mobile/index.js.map +3 -3
  88. package/dist/react/browser.js +18 -1
  89. package/dist/react/browser.js.map +6 -4
  90. package/dist/react/components/index.js +2 -2
  91. package/dist/react/components/index.js.map +3 -3
  92. package/dist/react/index.js +370 -62
  93. package/dist/react/index.js.map +14 -13
  94. package/dist/react/server.js +51 -36
  95. package/dist/react/server.js.map +10 -10
  96. package/dist/src/angular/colocatedRouteMatch.d.ts +23 -0
  97. package/dist/src/angular/components/constants.d.ts +1 -0
  98. package/dist/src/angular/components/defer-slot-payload.d.ts +5 -0
  99. package/dist/src/cli/scripts/manifestKeysEditorHint.d.ts +9 -0
  100. package/dist/src/cli/scripts/typecheck.d.ts +1 -0
  101. package/dist/src/cli/scripts/typecheckDiagnostics.d.ts +41 -0
  102. package/dist/src/constants.d.ts +1 -0
  103. package/dist/src/core/prerender.d.ts +10 -0
  104. package/dist/src/dev/hot/analyze.d.ts +1 -1
  105. package/dist/src/react/browser.d.ts +1 -0
  106. package/dist/src/react/index.d.ts +1 -0
  107. package/dist/src/svelte/lowerAwaitSlotSyntax.d.ts +23 -0
  108. package/dist/src/utils/pageCspNonce.d.ts +14 -0
  109. package/dist/src/utils/spaRouteManifest.d.ts +1 -0
  110. package/dist/svelte/index.js +372 -69
  111. package/dist/svelte/index.js.map +11 -11
  112. package/dist/svelte/server.js +363 -60
  113. package/dist/svelte/server.js.map +11 -11
  114. package/dist/types/manifest.d.ts +3 -2
  115. package/dist/types/svelte.d.ts +3 -0
  116. package/dist/vue/components/Image.js +2 -2
  117. package/dist/vue/components/Image.js.map +3 -3
  118. package/dist/vue/components/index.js +2 -2
  119. package/dist/vue/components/index.js.map +3 -3
  120. package/dist/vue/index.js +364 -61
  121. package/dist/vue/index.js.map +11 -11
  122. package/dist/vue/server.js +54 -40
  123. package/dist/vue/server.js.map +9 -9
  124. package/package.json +1 -1
  125. package/dist/cli/prerender-w65xp6h8.js +0 -11
  126. /package/dist/cli/{index-t8jmj8w1.js → index-fm9x6sjs.js} +0 -0
@@ -88,7 +88,7 @@ var ABSOLUTE_HTTP_TRANSFER_CACHE_SKIP_HEADER = "x-skip-transfer-cache", buildAbs
88
88
  };
89
89
 
90
90
  // src/constants.ts
91
- 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_RELOAD_BACKOFF_BASE_MS = 1000, CSS_RELOAD_BACKOFF_MAX_MS = 60000, 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, HTTP_STATUS_GONE = 410, HTTP_STATUS_INTERNAL_SERVER_ERROR = 500, 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;
91
+ 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_RELOAD_BACKOFF_BASE_MS = 1000, CSS_RELOAD_BACKOFF_MAX_MS = 60000, 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, HTML_CONTENT_TYPE = "text/html; charset=utf-8", HTTP_STATUS_OK = 200, HTTP_STATUS_BAD_REQUEST = 400, HTTP_STATUS_NOT_FOUND = 404, HTTP_STATUS_GONE = 410, HTTP_STATUS_INTERNAL_SERVER_ERROR = 500, 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;
92
92
  var init_constants = __esm(() => {
93
93
  TAILWIND_BUN_CSS_WARNING_PATTERN = /invalid @ rule encountered: '@(theme|tailwind|source|utility|variant|custom-variant|apply|reference|plugin|config)'/;
94
94
  IMAGE_DEFAULT_DEVICE_SIZES = [
@@ -865,7 +865,7 @@ var CONVENTIONS_KEY = "__absoluteConventions", isConventionsMap = (value) => Boo
865
865
  nonce: readCspNonce()
866
866
  });
867
867
  return new Response(stream, {
868
- headers: { "Content-Type": "text/html" },
868
+ headers: { "Content-Type": HTML_CONTENT_TYPE },
869
869
  status: 500
870
870
  });
871
871
  }, renderSvelteError = async (conventionPath, errorProps) => {
@@ -881,7 +881,7 @@ var CONVENTIONS_KEY = "__absoluteConventions", isConventionsMap = (value) => Boo
881
881
  });
882
882
  const html = `<!DOCTYPE html><html><head>${nonceSvelteHeadStyles(head)}</head><body>${body}</body></html>`;
883
883
  return new Response(html, {
884
- headers: { "Content-Type": "text/html" },
884
+ headers: { "Content-Type": HTML_CONTENT_TYPE },
885
885
  status: 500
886
886
  });
887
887
  }, unescapeVueStyles = (ssrBody) => {
@@ -905,7 +905,7 @@ var CONVENTIONS_KEY = "__absoluteConventions", isConventionsMap = (value) => Boo
905
905
  const { styles, body } = unescapeVueStyles(rawBody);
906
906
  const html = `<!DOCTYPE html><html><head>${styles}</head><body><div id="root">${body}</div></body></html>`;
907
907
  return new Response(html, {
908
- headers: { "Content-Type": "text/html" },
908
+ headers: { "Content-Type": HTML_CONTENT_TYPE },
909
909
  status: 500
910
910
  });
911
911
  }, renderAngularError = async (conventionPath, errorProps) => {
@@ -915,14 +915,14 @@ var CONVENTIONS_KEY = "__absoluteConventions", isConventionsMap = (value) => Boo
915
915
  return null;
916
916
  const html = renderFn(errorProps);
917
917
  return new Response(html, {
918
- headers: { "Content-Type": "text/html" },
918
+ headers: { "Content-Type": HTML_CONTENT_TYPE },
919
919
  status: 500
920
920
  });
921
921
  }, 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) => {
922
922
  const template = await nonceStaticHtml(await Bun.file(conventionPath).text());
923
923
  const html = replaceErrorTokens(template, errorProps);
924
924
  return new Response(html, {
925
- headers: { "Content-Type": "text/html" },
925
+ headers: { "Content-Type": HTML_CONTENT_TYPE },
926
926
  status: 500
927
927
  });
928
928
  }, logConventionRenderError = (framework, label, renderError) => {
@@ -1001,7 +1001,7 @@ var CONVENTIONS_KEY = "__absoluteConventions", isConventionsMap = (value) => Boo
1001
1001
  nonce: readCspNonce()
1002
1002
  });
1003
1003
  return new Response(stream, {
1004
- headers: { "Content-Type": "text/html" },
1004
+ headers: { "Content-Type": HTML_CONTENT_TYPE },
1005
1005
  status: 404
1006
1006
  });
1007
1007
  }, renderSvelteNotFound = async (conventionPath) => {
@@ -1014,7 +1014,7 @@ var CONVENTIONS_KEY = "__absoluteConventions", isConventionsMap = (value) => Boo
1014
1014
  const { head, body } = render(NotFoundComponent, nonce ? { csp: { nonce } } : {});
1015
1015
  const html = `<!DOCTYPE html><html><head>${nonceSvelteHeadStyles(head)}</head><body>${body}</body></html>`;
1016
1016
  return new Response(html, {
1017
- headers: { "Content-Type": "text/html" },
1017
+ headers: { "Content-Type": HTML_CONTENT_TYPE },
1018
1018
  status: 404
1019
1019
  });
1020
1020
  }, renderVueNotFound = async (conventionPath) => {
@@ -1031,7 +1031,7 @@ var CONVENTIONS_KEY = "__absoluteConventions", isConventionsMap = (value) => Boo
1031
1031
  const { styles, body } = unescapeVueStyles(rawBody);
1032
1032
  const html = `<!DOCTYPE html><html><head>${styles}</head><body><div id="root">${body}</div></body></html>`;
1033
1033
  return new Response(html, {
1034
- headers: { "Content-Type": "text/html" },
1034
+ headers: { "Content-Type": HTML_CONTENT_TYPE },
1035
1035
  status: 404
1036
1036
  });
1037
1037
  }, renderAngularNotFound = async (conventionPath) => {
@@ -1041,13 +1041,13 @@ var CONVENTIONS_KEY = "__absoluteConventions", isConventionsMap = (value) => Boo
1041
1041
  return null;
1042
1042
  const html = renderFn();
1043
1043
  return new Response(html, {
1044
- headers: { "Content-Type": "text/html" },
1044
+ headers: { "Content-Type": HTML_CONTENT_TYPE },
1045
1045
  status: 404
1046
1046
  });
1047
1047
  }, renderHtmlNotFound = async (conventionPath) => {
1048
1048
  const html = await nonceStaticHtml(await Bun.file(conventionPath).text());
1049
1049
  return new Response(html, {
1050
- headers: { "Content-Type": "text/html" },
1050
+ headers: { "Content-Type": HTML_CONTENT_TYPE },
1051
1051
  status: 404
1052
1052
  });
1053
1053
  }, NOT_FOUND_RENDERERS, renderConventionNotFound = async (framework) => {
@@ -1081,6 +1081,7 @@ var CONVENTIONS_KEY = "__absoluteConventions", isConventionsMap = (value) => Boo
1081
1081
  return renderNext(options.preferHtmx ? ["htmx", ...NOT_FOUND_PRIORITY.filter((key) => key !== "htmx")] : NOT_FOUND_PRIORITY);
1082
1082
  };
1083
1083
  var init_resolveConvention = __esm(() => {
1084
+ init_constants();
1084
1085
  init_cspNonceRef();
1085
1086
  init_staticHtmlNonce();
1086
1087
  init_ssrErrorPage();
@@ -1436,6 +1437,7 @@ var init_angularDeps = __esm(() => {
1436
1437
  });
1437
1438
 
1438
1439
  // src/utils/spaRouteManifest.ts
1440
+ import { NotFound } from "elysia";
1439
1441
  import { basename as basename2 } from "path";
1440
1442
  var SPA_ROUTES_KEY = "__absoluteSpaRoutes", setSpaRouteManifest = (hosts) => {
1441
1443
  Reflect.set(globalThis, SPA_ROUTES_KEY, hosts);
@@ -1500,7 +1502,14 @@ var SPA_ROUTES_KEY = "__absoluteSpaRoutes", setSpaRouteManifest = (hosts) => {
1500
1502
  }, renderSpaNotFound = async (framework, pageName, request) => {
1501
1503
  if (isKnownSpaRoute(framework, pageName, request))
1502
1504
  return null;
1503
- return await renderFirstNotFound() ?? new Response("Not found", {
1505
+ return renderSpaNotFoundResponse(request);
1506
+ }, renderSpaNotFoundResponse = async (request) => {
1507
+ if (request && !isPageRequest(request)) {
1508
+ return new NotFound().toResponse();
1509
+ }
1510
+ return await renderFirstNotFound({
1511
+ preferHtmx: request?.headers.get("hx-request") === "true"
1512
+ }) ?? new Response("Not found", {
1504
1513
  headers: { "Content-Type": "text/plain" },
1505
1514
  status: 404
1506
1515
  });
@@ -1557,8 +1566,8 @@ var buildRequestProviders = (deps, request, requestContext, responseInit) => [
1557
1566
  // src/angular/zoneRuntime.ts
1558
1567
  var ZONE_NODE_SPECIFIER = "zone.js/node", MISSING_ZONE_MESSAGE = 'angular.changeDetection is "zone" but zone.js could not be loaded. Install it in your app (bun add zone.js).', isAngularZoneMode = () => globalThis.__absoluteAngularChangeDetection === "zone", setAngularChangeDetection = (mode) => {
1559
1568
  globalThis.__absoluteAngularChangeDetection = mode ?? "zoneless";
1560
- }, isRecord2 = (value) => typeof value === "object" && value !== null, adoptIntoNativePromise = (NativePromise, value) => {
1561
- if (value instanceof NativePromise || !isRecord2(value))
1569
+ }, isRecord3 = (value) => typeof value === "object" && value !== null, adoptIntoNativePromise = (NativePromise, value) => {
1570
+ if (value instanceof NativePromise || !isRecord3(value))
1562
1571
  return value;
1563
1572
  const { then } = value;
1564
1573
  if (typeof then !== "function")
@@ -1575,28 +1584,28 @@ var ZONE_NODE_SPECIFIER = "zone.js/node", MISSING_ZONE_MESSAGE = 'angular.change
1575
1584
  }, wrapRoute = (NativePromise, route) => {
1576
1585
  if (typeof route === "function")
1577
1586
  return wrapHandler(NativePromise, route);
1578
- if (!isRecord2(route) || route instanceof Response || route instanceof Blob)
1587
+ if (!isRecord3(route) || route instanceof Response || route instanceof Blob)
1579
1588
  return route;
1580
1589
  return Object.fromEntries(Object.entries(route).map(([method, handler]) => [
1581
1590
  method,
1582
1591
  wrapHandler(NativePromise, handler)
1583
1592
  ]));
1584
1593
  }, wrapServeOptions = (NativePromise, options) => {
1585
- if (!isRecord2(options))
1594
+ if (!isRecord3(options))
1586
1595
  return options;
1587
1596
  const wrapped = { ...options };
1588
1597
  if (options.fetch)
1589
1598
  wrapped.fetch = wrapHandler(NativePromise, options.fetch);
1590
1599
  if (options.error)
1591
1600
  wrapped.error = wrapHandler(NativePromise, options.error);
1592
- if (isRecord2(options.routes))
1601
+ if (isRecord3(options.routes))
1593
1602
  wrapped.routes = Object.fromEntries(Object.entries(options.routes).map(([path, route]) => [
1594
1603
  path,
1595
1604
  wrapRoute(NativePromise, route)
1596
1605
  ]));
1597
1606
  return wrapped;
1598
1607
  }, wrapServerReload = (NativePromise, server) => {
1599
- if (!isRecord2(server))
1608
+ if (!isRecord3(server))
1600
1609
  return;
1601
1610
  const { reload } = server;
1602
1611
  if (typeof reload !== "function")
@@ -2500,23 +2509,247 @@ var AWAIT_STREAM_DIRECTIVE = "<!-- absolute:stream -->", DIRECTIVE_RE, BRANCH_TA
2500
2509
  index = markup.indexOf("{", end);
2501
2510
  }
2502
2511
  return tags;
2503
- }, escapeTemplateLiteral = (value) => value.replaceAll("\\", "\\\\").replaceAll("`", "\\`").replaceAll("${", "\\${"), markupToTemplateLiteral = (markup) => {
2504
- const parts = topLevelTags(markup.trim());
2505
- const trimmed = markup.trim();
2506
- let cursor = 0;
2507
- let literal = "";
2508
- for (const { end, start, text } of parts) {
2509
- literal += escapeTemplateLiteral(trimmed.slice(cursor, start));
2510
- literal += `\${${text.slice(1, -1).trim()}}`;
2511
- cursor = end;
2512
+ }, escapeTemplateLiteral = (value) => value.replaceAll("\\", "\\\\").replaceAll("`", "\\`").replaceAll("${", "\\${"), HTML_HELPERS = "__absoluteAwaitHtml", AWAIT_SCOPE_CLASS_PLACEHOLDER = "__absoluteAwaitScopeClass__", AWAIT_HTML_HELPERS_SOURCE, applyAwaitScopeClass = (code, scopeClass) => code.replaceAll(AWAIT_SCOPE_CLASS_PLACEHOLDER, scopeClass), createAwaitScopeClassCapture = () => {
2513
+ let scopeClass = "";
2514
+ const cssHash = ({ css, filename, hash }) => {
2515
+ scopeClass = `svelte-${hash(filename === "(unknown)" ? css : filename ?? css)}`;
2516
+ return scopeClass;
2517
+ };
2518
+ const apply = (code) => applyAwaitScopeClass(code, scopeClass);
2519
+ return { apply, cssHash };
2520
+ }, BOOLEAN_ATTRIBUTES, DIRECTIVE_ATTRIBUTE_RE, ATTRIBUTE_NAME_END_RE, RAW_TEXT_ELEMENTS, helperCall = (name, ...args) => `\${${HTML_HELPERS}.${name}(${args.join(", ")})}`, SHADOW_VALUE, END_TAG_RE, isShadowAttribute = (name) => !DIRECTIVE_ATTRIBUTE_RE.test(name) && !/^on/i.test(name), pushText = (scan, text) => {
2521
+ scan.literal += escapeTemplateLiteral(text);
2522
+ }, readExpressionTag = (scan) => {
2523
+ const end = findTagEnd(scan.source, scan.index);
2524
+ if (end === -1) {
2525
+ fail(scan.filePath, `unterminated tag in the ${scan.branch} branch`);
2526
+ }
2527
+ const inner = scan.source.slice(scan.index + 1, end - 1).trim();
2528
+ scan.index = end;
2529
+ return inner;
2530
+ }, failAttribute = (scan, detail) => fail(scan.filePath, `the ${scan.branch} branch of a streamed {#await} has ${detail}`), atValueEnd = (scan, quote) => {
2531
+ const char = scan.source[scan.index] ?? "";
2532
+ if (quote)
2533
+ return char === quote;
2534
+ return /[\s>]/.test(char) || scan.source.startsWith("/>", scan.index);
2535
+ }, readValueText = (scan, quote) => {
2536
+ const start = scan.index;
2537
+ while (scan.index < scan.source.length && scan.source[scan.index] !== "{" && !atValueEnd(scan, quote)) {
2538
+ scan.index += 1;
2539
+ }
2540
+ return scan.source.slice(start, scan.index);
2541
+ }, readAttributeValue = (scan) => {
2542
+ const { source } = scan;
2543
+ const quote = source[scan.index];
2544
+ const chunks = [];
2545
+ const isQuoted = quote === '"' || quote === "'";
2546
+ if (isQuoted)
2547
+ scan.index += 1;
2548
+ if (!isQuoted && source[scan.index] === "{") {
2549
+ chunks.push({ code: readExpressionTag(scan) });
2550
+ return chunks;
2551
+ }
2552
+ const valueQuote = isQuoted ? quote : undefined;
2553
+ while (scan.index < source.length && !atValueEnd(scan, valueQuote)) {
2554
+ chunks.push({ text: readValueText(scan, valueQuote) });
2555
+ if (source[scan.index] === "{")
2556
+ chunks.push({ code: readExpressionTag(scan) });
2557
+ }
2558
+ if (isQuoted)
2559
+ scan.index += 1;
2560
+ return chunks.filter((chunk) => !("text" in chunk) || chunk.text !== "");
2561
+ }, pushDynamicAttribute = (scan, name, chunks) => {
2562
+ if (DIRECTIVE_ATTRIBUTE_RE.test(name) || /^on/i.test(name)) {
2563
+ failAttribute(scan, `an expression in ${name}= (directives and event handlers need Svelte to run them)`);
2564
+ }
2565
+ const tag = chunks.find((chunk) => ("code" in chunk) && /^[#:/@]/.test(chunk.code));
2566
+ if (tag && "code" in tag) {
2567
+ failAttribute(scan, `{${tag.code}} in the ${name}= attribute`);
2568
+ }
2569
+ if (isShadowAttribute(name))
2570
+ scan.shadow += ` ${name}=${SHADOW_VALUE}`;
2571
+ const isClass = name === "class";
2572
+ if (isClass)
2573
+ scan.hasClass = true;
2574
+ const [only] = chunks;
2575
+ const codes = chunks.flatMap((chunk) => ("code" in chunk) ? [`(${chunk.code})`] : []);
2576
+ if (isClass && chunks.length > 1 && codes.length === chunks.length) {
2577
+ scan.literal += helperCall("class", `${HTML_HELPERS}.join(${codes.join(", ")})`);
2578
+ return;
2579
+ }
2580
+ if (chunks.length === 1 && only && "code" in only) {
2581
+ const value = `(${only.code})`;
2582
+ if (name === "class")
2583
+ scan.literal += helperCall("class", value);
2584
+ else if (name === "style")
2585
+ scan.literal += helperCall("style", value);
2586
+ else
2587
+ scan.literal += helperCall("attr", JSON.stringify(name), value, String(BOOLEAN_ATTRIBUTES.has(name)));
2588
+ return;
2589
+ }
2590
+ pushText(scan, ` ${name}="`);
2591
+ for (const chunk of chunks) {
2592
+ if ("code" in chunk)
2593
+ scan.literal += helperCall("part", `(${chunk.code})`);
2594
+ else
2595
+ pushText(scan, chunk.text.replaceAll('"', "&quot;"));
2596
+ }
2597
+ if (isClass)
2598
+ scan.literal += helperCall("scoped");
2599
+ pushText(scan, '"');
2600
+ }, pushStaticAttribute = (scan, whitespace, name, value) => {
2601
+ if (isShadowAttribute(name))
2602
+ scan.shadow += `${whitespace}${name}=${value}`;
2603
+ if (name !== "class") {
2604
+ pushText(scan, `${whitespace}${name}=${value}`);
2605
+ return;
2606
+ }
2607
+ scan.hasClass = true;
2608
+ const [first = ""] = value;
2609
+ const isQuoted = first === '"' || first === "'";
2610
+ const quote = isQuoted ? first : '"';
2611
+ const classes = isQuoted ? value.slice(1, -1) : value;
2612
+ if (classes === "") {
2613
+ scan.literal += helperCall("class", "''");
2614
+ return;
2615
+ }
2616
+ pushText(scan, `${whitespace}${name}=${quote}${classes}`);
2617
+ scan.literal += helperCall("scoped");
2618
+ pushText(scan, quote);
2619
+ }, readAttributeName = (scan) => {
2620
+ const { source } = scan;
2621
+ const start = scan.index;
2622
+ while (scan.index < source.length && !ATTRIBUTE_NAME_END_RE.test(source[scan.index] ?? "")) {
2623
+ scan.index += 1;
2624
+ }
2625
+ return source.slice(start, scan.index);
2626
+ }, skipWhitespace = (scan) => {
2627
+ const start = scan.index;
2628
+ while (/\s/.test(scan.source[scan.index] ?? ""))
2629
+ scan.index += 1;
2630
+ return scan.source.slice(start, scan.index);
2631
+ }, pushTagExpression = (scan) => {
2632
+ const inner = readExpressionTag(scan);
2633
+ if (!/^[A-Za-z_$][\w$]*$/.test(inner)) {
2634
+ failAttribute(scan, `{${inner}} in a start tag`);
2635
+ }
2636
+ pushDynamicAttribute(scan, inner, [{ code: inner }]);
2637
+ }, pushAttribute = (scan) => {
2638
+ const { source } = scan;
2639
+ const whitespace = skipWhitespace(scan);
2640
+ const closing = source.startsWith("/>", scan.index) ? "/>" : ">";
2641
+ const isEnd = scan.index >= source.length;
2642
+ if (isEnd || source.startsWith(closing, scan.index)) {
2643
+ if (!scan.hasClass)
2644
+ scan.literal += helperCall("scope");
2645
+ const tagEnd = isEnd ? "" : closing;
2646
+ pushText(scan, whitespace + tagEnd);
2647
+ scan.shadow += whitespace + (isEnd ? ">" : closing);
2648
+ scan.index += tagEnd.length;
2649
+ return false;
2650
+ }
2651
+ if (source[scan.index] === "{") {
2652
+ pushTagExpression(scan);
2653
+ return true;
2654
+ }
2655
+ const name = readAttributeName(scan);
2656
+ if (!name) {
2657
+ pushText(scan, whitespace + (source[scan.index] ?? ""));
2658
+ scan.index += 1;
2659
+ return true;
2660
+ }
2661
+ const beforeEquals = scan.index;
2662
+ skipWhitespace(scan);
2663
+ if (source[scan.index] !== "=") {
2664
+ scan.index = beforeEquals;
2665
+ pushText(scan, whitespace + name);
2666
+ if (isShadowAttribute(name))
2667
+ scan.shadow += whitespace + name;
2668
+ return true;
2512
2669
  }
2513
- literal += escapeTemplateLiteral(trimmed.slice(cursor));
2514
- return `\`${literal}\``;
2670
+ scan.index += 1;
2671
+ skipWhitespace(scan);
2672
+ const valueStart = scan.index;
2673
+ const chunks = readAttributeValue(scan);
2674
+ if (chunks.some((chunk) => ("code" in chunk))) {
2675
+ pushDynamicAttribute(scan, name, chunks);
2676
+ return true;
2677
+ }
2678
+ pushStaticAttribute(scan, whitespace, name, source.slice(valueStart, scan.index));
2679
+ return true;
2680
+ }, pushStartTag = (scan) => {
2681
+ const { source } = scan;
2682
+ const nameMatch = source.slice(scan.index + 1).match(/^[^\s/>{]+/);
2683
+ const tagName = nameMatch?.[0] ?? "";
2684
+ pushText(scan, `<${tagName}`);
2685
+ scan.shadow += `<${tagName}`;
2686
+ scan.hasClass = RAW_TEXT_ELEMENTS.has(tagName.toLowerCase());
2687
+ scan.index += 1 + tagName.length;
2688
+ while (pushAttribute(scan))
2689
+ ;
2690
+ return tagName.toLowerCase();
2691
+ }, pushRawText = (scan, tagName, shadowStart) => {
2692
+ const { source } = scan;
2693
+ const close = source.toLowerCase().indexOf(`</${tagName}`, scan.index);
2694
+ const closeEnd = close === -1 ? -1 : source.indexOf(">", close);
2695
+ const end = closeEnd === -1 ? source.length : closeEnd + 1;
2696
+ pushText(scan, source.slice(scan.index, end));
2697
+ scan.shadow = scan.shadow.slice(0, shadowStart);
2698
+ scan.index = end;
2699
+ }, pushTextExpression = (scan) => {
2700
+ const inner = readExpressionTag(scan);
2701
+ const rawHtml = inner.match(/^@html\s([\s\S]*)$/);
2702
+ if (rawHtml) {
2703
+ scan.literal += helperCall("html", `(${(rawHtml[1] ?? "").trim()})`);
2704
+ return;
2705
+ }
2706
+ scan.literal += helperCall("text", `(${inner})`);
2707
+ }, pushComment = (scan) => {
2708
+ const close = scan.source.indexOf("-->", scan.index + "<!--".length);
2709
+ const end = close === -1 ? scan.source.length : close + "-->".length;
2710
+ pushText(scan, scan.source.slice(scan.index, end));
2711
+ scan.index = end;
2712
+ }, scanTextPosition = (scan) => {
2713
+ const { index, source } = scan;
2714
+ if (source.startsWith("<!--", index)) {
2715
+ pushComment(scan);
2716
+ return;
2717
+ }
2718
+ if (source[index] === "<" && /[A-Za-z]/.test(source[index + 1] ?? "")) {
2719
+ const shadowStart = scan.shadow.length;
2720
+ const tagName = pushStartTag(scan);
2721
+ if (RAW_TEXT_ELEMENTS.has(tagName))
2722
+ pushRawText(scan, tagName, shadowStart);
2723
+ return;
2724
+ }
2725
+ if (source[index] === "{") {
2726
+ pushTextExpression(scan);
2727
+ return;
2728
+ }
2729
+ const next = source.slice(index + 1).search(/[<{]/);
2730
+ const end = next === -1 ? source.length : index + 1 + next;
2731
+ const text = source.slice(index, end);
2732
+ pushText(scan, text);
2733
+ scan.shadow += (text.match(END_TAG_RE) ?? []).join("");
2734
+ scan.index = end;
2735
+ }, lowerBranch = (markup, branch, filePath) => {
2736
+ const scan = {
2737
+ branch,
2738
+ filePath,
2739
+ hasClass: false,
2740
+ index: 0,
2741
+ literal: "",
2742
+ shadow: "",
2743
+ source: markup.trim()
2744
+ };
2745
+ while (scan.index < scan.source.length)
2746
+ scanTextPosition(scan);
2747
+ return { literal: `\`${scan.literal}\``, shadow: scan.shadow };
2515
2748
  }, fail = (filePath, message) => {
2516
2749
  throw new Error(`${filePath ? `${filePath}: ` : ""}${message} (${AWAIT_STREAM_DIRECTIVE} streams plain HTML; remove the directive to let Svelte render the block and hydrate it)`);
2517
2750
  }, assertPlainHtml = (markup, branch, filePath) => {
2518
2751
  const withoutExpressions = topLevelTags(markup).reduceRight((text, { end, start }) => text.slice(0, start) + text.slice(end), markup);
2519
- const nestedTag = topLevelTags(markup).find(({ text }) => /^\{[#:/@]/.test(text));
2752
+ const nestedTag = topLevelTags(markup).find(({ text }) => /^\{(?:[#:/]|@(?!html\s))/.test(text));
2520
2753
  if (nestedTag || SVELTE_ONLY_MARKUP_RE.test(withoutExpressions)) {
2521
2754
  fail(filePath, `the ${branch} branch of a streamed {#await} holds Svelte markup (${nestedTag?.text ?? withoutExpressions.match(SVELTE_ONLY_MARKUP_RE)?.[0]}\u2026)`);
2522
2755
  }
@@ -2560,12 +2793,16 @@ var AWAIT_STREAM_DIRECTIVE = "<!-- absolute:stream -->", DIRECTIVE_RE, BRANCH_TA
2560
2793
  thenIdentifier: thenMatch?.[2],
2561
2794
  thenMarkup
2562
2795
  };
2563
- }, renderSlot = (block, slotId, dynamic) => {
2796
+ }, renderSlot = (block, slotId, dynamic, filePath) => {
2564
2797
  const thenValueIdentifier = block.thenIdentifier ?? "__awaitValue";
2565
2798
  const catchValueIdentifier = block.catchIdentifier ?? "__awaitError";
2566
- const catchBranch = block.catchMarkup === undefined ? "catch (_absoluteAwaitError) { throw _absoluteAwaitError; }" : `catch (${catchValueIdentifier}) { return ${markupToTemplateLiteral(block.catchMarkup)}; }`;
2567
- return `<AbsoluteAwaitSlot id="${slotId}"${dynamic ? " dynamic" : ""} fallbackHtml={${markupToTemplateLiteral(block.pendingMarkup)}} resolve={async () => { try { const ${thenValueIdentifier} = await (${block.expression}); return ${markupToTemplateLiteral(block.thenMarkup)}; } ${catchBranch} }} />`;
2568
- }, IMPORT_LINE = 'import AbsoluteAwaitSlot from "@absolutejs/absolute/svelte/components/AwaitSlot.svelte";', lowerSvelteAwaitSlotSyntax = (source, filePath) => {
2799
+ const pending = lowerBranch(block.pendingMarkup, "pending", filePath);
2800
+ const then = lowerBranch(block.thenMarkup, "then", filePath);
2801
+ const caught = block.catchMarkup === undefined ? undefined : lowerBranch(block.catchMarkup, "catch", filePath);
2802
+ const catchBranch = caught ? `catch (${catchValueIdentifier}) { return ${caught.literal}; }` : "catch (_absoluteAwaitError) { throw _absoluteAwaitError; }";
2803
+ const shadows = [pending, then, caught].map((branch) => branch ? `<svelte:element this={'div'} data-absolute-slot="true">${branch.shadow}</svelte:element>` : "").join("");
2804
+ return `<AbsoluteAwaitSlot id="${slotId}"${dynamic ? " dynamic" : ""} fallbackHtml={${pending.literal}} resolve={async () => { try { const ${thenValueIdentifier} = await (${block.expression}); return ${then.literal}; } ${catchBranch} }} />{#if ${HTML_HELPERS}.shadow}${shadows}{/if}`;
2805
+ }, IMPORT_LINE = 'import AbsoluteAwaitSlot from "@absolutejs/absolute/svelte/components/AwaitSlot.svelte";', INJECTED_SCRIPT, lowerSvelteAwaitSlotSyntax = (source, filePath) => {
2569
2806
  if (!source.includes("absolute:stream")) {
2570
2807
  return { code: source, transformed: false };
2571
2808
  }
@@ -2580,7 +2817,7 @@ var AWAIT_STREAM_DIRECTIVE = "<!-- absolute:stream -->", DIRECTIVE_RE, BRANCH_TA
2580
2817
  const slotId = `absolute-svelte-await-${awaitIndex.toString(BASE_36_RADIX)}`;
2581
2818
  awaitIndex += 1;
2582
2819
  lowered += source.slice(cursor, directive.index);
2583
- lowered += renderSlot(block, slotId, directive[1] !== undefined);
2820
+ lowered += renderSlot(block, slotId, directive[1] !== undefined, filePath);
2584
2821
  cursor = block.end;
2585
2822
  }
2586
2823
  if (awaitIndex === 0) {
@@ -2590,14 +2827,14 @@ var AWAIT_STREAM_DIRECTIVE = "<!-- absolute:stream -->", DIRECTIVE_RE, BRANCH_TA
2590
2827
  if (lowered.includes("<script")) {
2591
2828
  return {
2592
2829
  code: lowered.replace(/<script(\s[^>]*)?>/, (match) => `${match}
2593
- ${IMPORT_LINE}
2830
+ ${INJECTED_SCRIPT}
2594
2831
  `),
2595
2832
  transformed: true
2596
2833
  };
2597
2834
  }
2598
2835
  return {
2599
2836
  code: `<script lang="ts">
2600
- ${IMPORT_LINE}
2837
+ ${INJECTED_SCRIPT}
2601
2838
  </script>
2602
2839
  ${lowered}`,
2603
2840
  transformed: true
@@ -2609,6 +2846,64 @@ var init_lowerAwaitSlotSyntax = __esm(() => {
2609
2846
  BRANCH_TAG_RE = /^\{:(then|catch)(?:\s+([A-Za-z_$][\w$]*))?\s*\}$/;
2610
2847
  SVELTE_ONLY_MARKUP_RE = /\{[#:/@]|<[A-Z]|<svelte:/;
2611
2848
  QUOTES = new Set(['"', "'", "`"]);
2849
+ AWAIT_HTML_HELPERS_SOURCE = [
2850
+ `const ${HTML_HELPERS} = (() => {`,
2851
+ ` const scope = ${JSON.stringify(AWAIT_SCOPE_CLASS_PLACEHOLDER)};`,
2852
+ ` const escape = (value, isAttr) => String(value ?? '').replace(isAttr ? /[&"<]/g : /[&<]/g, (char) => char === '&' ? '&amp;' : char === '"' ? '&quot;' : '&lt;');`,
2853
+ "\tconst stringify = (value) => typeof value === 'string' ? value : value == null ? '' : value + '';",
2854
+ "\tconst classNames = (value) => { if (Array.isArray(value)) return value.filter(Boolean).map(classNames).filter(Boolean).join(' '); if (value && typeof value === 'object') return Object.keys(value).filter((key) => value[key]).join(' '); return typeof value === 'string' || typeof value === 'number' ? String(value) : ''; };",
2855
+ "\treturn {",
2856
+ ` attr: (name, value, isBoolean) => { const boolean = isBoolean || (name === 'hidden' && value !== 'until-found'); if (value == null || (!value && boolean)) return ''; const normalized = name === 'translate' && typeof value === 'boolean' ? (value ? 'yes' : 'no') : value; return boolean ? ' ' + name + '=""' : ' ' + name + '="' + escape(normalized, true) + '"'; },`,
2857
+ ` class: (value) => { const resolved = typeof value === 'object' ? classNames(value) : value ?? ''; let name = '' + resolved; if (scope) name = name ? name + ' ' + scope : scope; return name ? ' class="' + escape(name, true) + '"' : ''; },`,
2858
+ "\t\thtml: (value) => String(value ?? ''),",
2859
+ "\t\tjoin: (...values) => values.map(stringify).join(''),",
2860
+ "\t\tpart: (value) => escape(stringify(value), true),",
2861
+ ` scope: () => scope ? ' class="' + scope + '"' : '',`,
2862
+ "\t\tscoped: () => scope ? ' ' + scope : '',",
2863
+ "\t\tshadow: false,",
2864
+ ` style: (value) => { const style = value == null ? '' : String(value); return style ? ' style="' + escape(style, true) + '"' : ''; },`,
2865
+ "\t\ttext: (value) => escape(value, false)",
2866
+ "\t};",
2867
+ "})();"
2868
+ ].join(`
2869
+ `);
2870
+ BOOLEAN_ATTRIBUTES = new Set([
2871
+ "allowfullscreen",
2872
+ "async",
2873
+ "autofocus",
2874
+ "autoplay",
2875
+ "checked",
2876
+ "controls",
2877
+ "default",
2878
+ "defer",
2879
+ "disabled",
2880
+ "disablepictureinpicture",
2881
+ "disableremoteplayback",
2882
+ "formnovalidate",
2883
+ "indeterminate",
2884
+ "inert",
2885
+ "ismap",
2886
+ "loop",
2887
+ "multiple",
2888
+ "muted",
2889
+ "nomodule",
2890
+ "novalidate",
2891
+ "open",
2892
+ "playsinline",
2893
+ "readonly",
2894
+ "required",
2895
+ "reversed",
2896
+ "seamless",
2897
+ "selected",
2898
+ "webkitdirectory"
2899
+ ]);
2900
+ DIRECTIVE_ATTRIBUTE_RE = /^(?:animate|bind|class|in|let|on|out|style|transition|use):/;
2901
+ ATTRIBUTE_NAME_END_RE = /[\s=>/{]/;
2902
+ RAW_TEXT_ELEMENTS = new Set(["script", "style"]);
2903
+ SHADOW_VALUE = `{${HTML_HELPERS}.shadow}`;
2904
+ END_TAG_RE = /<\/[A-Za-z][^\s>]*\s*>/g;
2905
+ INJECTED_SCRIPT = `${IMPORT_LINE}
2906
+ ${AWAIT_HTML_HELPERS_SOURCE}`;
2612
2907
  });
2613
2908
 
2614
2909
  // src/build/stylePreprocessor.ts
@@ -3188,15 +3483,15 @@ var init_stylePreprocessor = __esm(() => {
3188
3483
  });
3189
3484
 
3190
3485
  // src/svelte/router/lazyModule.ts
3191
- var LAZY_RESOLVED_KEY, LAZY_SOURCE_EXPORT = "__ABSOLUTE_SVELTE_SOURCE__", isRecord3 = (value) => typeof value === "object" && value !== null, isComponent = (value) => typeof value === "function", toLazyComponent = (value) => {
3486
+ var LAZY_RESOLVED_KEY, LAZY_SOURCE_EXPORT = "__ABSOLUTE_SVELTE_SOURCE__", isRecord4 = (value) => typeof value === "object" && value !== null, isComponent = (value) => typeof value === "function", toLazyComponent = (value) => {
3192
3487
  if (isComponent(value))
3193
3488
  return value;
3194
- if (!isRecord3(value))
3489
+ if (!isRecord4(value))
3195
3490
  return;
3196
3491
  const fallback = value.default;
3197
3492
  return isComponent(fallback) ? fallback : undefined;
3198
3493
  }, readSourceFrom = (value) => {
3199
- if (!isRecord3(value) && !isComponent(value))
3494
+ if (!isRecord4(value) && !isComponent(value))
3200
3495
  return;
3201
3496
  const source = Reflect.get(value, LAZY_SOURCE_EXPORT);
3202
3497
  return typeof source === "string" ? source : undefined;
@@ -3205,7 +3500,7 @@ var LAZY_RESOLVED_KEY, LAZY_SOURCE_EXPORT = "__ABSOLUTE_SVELTE_SOURCE__", isReco
3205
3500
  const fromValue = readSourceFrom(value);
3206
3501
  if (fromValue !== undefined)
3207
3502
  return fromValue;
3208
- if (!isRecord3(value))
3503
+ if (!isRecord4(value))
3209
3504
  return;
3210
3505
  return readSourceFrom(value.default);
3211
3506
  };
@@ -3380,15 +3675,18 @@ var serverCacheRoot2, compiledModuleCache2, originalSourcePathCache, syncIslandG
3380
3675
  for (const [spec, resolvedModuleImport] of rewrittenModulePaths) {
3381
3676
  transpiled = replaceQuotedSpecifier(transpiled, spec, resolvedModuleImport);
3382
3677
  }
3383
- let compiledCode = compile(transpiled, {
3678
+ const scopeClass = createAwaitScopeClassCapture();
3679
+ const compiledServer = compile(transpiled, {
3384
3680
  css: "injected",
3681
+ cssHash: scopeClass.cssHash,
3385
3682
  experimental: {
3386
3683
  async: loweredAwaitSource.transformed || loweredSource.transformed
3387
3684
  },
3388
3685
  filename: resolutionSourcePath,
3389
3686
  generate: "server",
3390
3687
  hmr: isDevelopmentRuntime()
3391
- }).js.code;
3688
+ });
3689
+ let compiledCode = scopeClass.apply(compiledServer.js.code);
3392
3690
  for (const [spec, compiledChildPath] of childModulePaths) {
3393
3691
  compiledCode = replaceQuotedSpecifier(compiledCode, spec, ensureRelativeImportPath(getCachedModulePath2(sourcePath), compiledChildPath));
3394
3692
  }
@@ -3586,14 +3884,14 @@ var defineIslandComponent = (component, options) => ({
3586
3884
  component,
3587
3885
  export: options.export,
3588
3886
  source: options.source
3589
- }), defineIslandRegistry = (registry) => registry, isRecord4 = (value) => typeof value === "object" && value !== null, getIslandBuildReference = (component) => {
3887
+ }), defineIslandRegistry = (registry) => registry, isRecord5 = (value) => typeof value === "object" && value !== null, getIslandBuildReference = (component) => {
3590
3888
  if (!isIslandComponentDefinition(component))
3591
3889
  return null;
3592
3890
  return {
3593
3891
  export: component.export,
3594
3892
  source: component.source
3595
3893
  };
3596
- }, isIslandComponentDefinition = (value) => isRecord4(value) && ("component" in value) && ("source" in value) && typeof value.source === "string", parseIslandProps = (rawProps) => {
3894
+ }, isIslandComponentDefinition = (value) => isRecord5(value) && ("component" in value) && ("source" in value) && typeof value.source === "string", parseIslandProps = (rawProps) => {
3597
3895
  if (!rawProps)
3598
3896
  return {};
3599
3897
  return JSON.parse(rawProps);
@@ -3617,7 +3915,7 @@ var init_islandMarkupAttributes = __esm(() => {
3617
3915
  var islandSequence = 0, resolvedServerComponentCache, resolvedServerBuildComponentCache, syncIslandGeneration3, nextIslandId = () => {
3618
3916
  islandSequence += 1;
3619
3917
  return `island-${islandSequence}`;
3620
- }, isRecord5 = (value) => typeof value === "object" && value !== null, isReactServerIslandComponent = (value) => typeof value === "function", isSvelteServerIslandComponent = (value) => typeof value === "function", isVueServerIslandComponent = (value) => typeof value === "function" || isRecord5(value), isAngularServerIslandComponent = (value) => typeof value === "function", resolveBuildReferencePath = (source, registryPath) => {
3918
+ }, isRecord6 = (value) => typeof value === "object" && value !== null, isReactServerIslandComponent = (value) => typeof value === "function", isSvelteServerIslandComponent = (value) => typeof value === "function", isVueServerIslandComponent = (value) => typeof value === "function" || isRecord6(value), isAngularServerIslandComponent = (value) => typeof value === "function", resolveBuildReferencePath = (source, registryPath) => {
3621
3919
  if (source.startsWith("file://"))
3622
3920
  return new URL(source).pathname;
3623
3921
  if (source.startsWith("."))
@@ -4086,13 +4384,13 @@ var ABSOLUTE_MOBILE_PAGE_MEDIA_TYPE = "application/vnd.absolute.page+json", ABSO
4086
4384
  }, headerVaryValues, envelopeResponse = (response, status) => new Response(JSON.stringify({
4087
4385
  protocol: ABSOLUTE_MOBILE_PAGE_PROTOCOL_VERSION,
4088
4386
  response
4089
- }), { headers: responseHeaders(), status }), isRecord7 = (value) => typeof value === "object" && value !== null && !Array.isArray(value), normalizeJsonValue = (value) => {
4387
+ }), { headers: responseHeaders(), status }), isRecord8 = (value) => typeof value === "object" && value !== null && !Array.isArray(value), normalizeJsonValue = (value) => {
4090
4388
  const serialized = JSON.stringify(value);
4091
4389
  if (serialized === undefined) {
4092
4390
  throw new TypeError("Mobile page props must be JSON-serializable.");
4093
4391
  }
4094
4392
  const parsed = JSON.parse(serialized);
4095
- if (!isRecord7(parsed)) {
4393
+ if (!isRecord8(parsed)) {
4096
4394
  throw new TypeError("Mobile page props must serialize to an object.");
4097
4395
  }
4098
4396
  return parsed;
@@ -4322,14 +4620,14 @@ var init_pageProtocol = __esm(() => {
4322
4620
 
4323
4621
  // src/core/pageResponseCache.ts
4324
4622
  import { createHash } from "crypto";
4325
- var STREAMING_PAGE_HEADER = "x-absolute-stream", HTML_CONTENT_TYPE = "text/html", streamingPageHeaders = (extra) => {
4623
+ var STREAMING_PAGE_HEADER = "x-absolute-stream", HTML_MEDIA_TYPE = "text/html", streamingPageHeaders = (extra) => {
4326
4624
  const headers = new Headers(extra);
4327
4625
  headers.set("content-type", HTML_CONTENT_TYPE);
4328
4626
  headers.set(STREAMING_PAGE_HEADER, "1");
4329
4627
  return headers;
4330
4628
  }, computeEtag = (html) => `W/"${createHash("sha1").update(html).digest("base64url")}"`, withPageCacheHeaders = async (response, request, options) => {
4331
4629
  const contentType = response.headers.get("content-type") ?? "";
4332
- if (!contentType.includes(HTML_CONTENT_TYPE))
4630
+ if (!contentType.includes(HTML_MEDIA_TYPE))
4333
4631
  return response;
4334
4632
  const isStreaming = response.headers.get(STREAMING_PAGE_HEADER) === "1";
4335
4633
  if (isStreaming && !options?.bufferStreamForEtag || !response.body) {
@@ -4355,7 +4653,9 @@ var STREAMING_PAGE_HEADER = "x-absolute-stream", HTML_CONTENT_TYPE = "text/html"
4355
4653
  statusText: response.statusText
4356
4654
  });
4357
4655
  };
4358
- var init_pageResponseCache = () => {};
4656
+ var init_pageResponseCache = __esm(() => {
4657
+ init_constants();
4658
+ });
4359
4659
 
4360
4660
  // src/client/streamSwap.ts
4361
4661
  var streamSwapRuntime = () => {
@@ -4492,7 +4792,7 @@ var SLOT_ID_PREFIX = "abs-slot-", CLOSING_BODY_TAG = "</body>", CLOSING_HEAD_TAG
4492
4792
  getStreamingSlotsRuntimeScript()
4493
4793
  ].filter(Boolean).join(";");
4494
4794
  return `<script${createNonceAttr(nonce)}>${escapeScriptContent(runtimeBody)}</script>`;
4495
- }, toUint8 = (value, encoder) => encoder.encode(value), isRecord8 = (value) => Boolean(value) && typeof value === "object", isSafeHtmlLike = (value) => isRecord8(value) && typeof value.changingThisBreaksApplicationSecurity === "string", normalizeSafeHtml = (value) => {
4795
+ }, toUint8 = (value, encoder) => encoder.encode(value), isRecord9 = (value) => Boolean(value) && typeof value === "object", isSafeHtmlLike = (value) => isRecord9(value) && typeof value.changingThisBreaksApplicationSecurity === "string", normalizeSafeHtml = (value) => {
4496
4796
  if (isSafeHtmlLike(value)) {
4497
4797
  return value.changingThisBreaksApplicationSecurity;
4498
4798
  }
@@ -4553,7 +4853,7 @@ var SLOT_ID_PREFIX = "abs-slot-", CLOSING_BODY_TAG = "</body>", CLOSING_HEAD_TAG
4553
4853
  }, createTimeoutError = (slot, timeoutMs) => {
4554
4854
  const error = Object.assign(new Error(`Streaming slot "${slot.id}" timed out after ${timeoutMs}ms`), { __absTimeout: true });
4555
4855
  return error;
4556
- }, isSlotPatchPayloadObject = (value) => isRecord8(value) && ("html" in value), isTimeoutError = (error) => isRecord8(error) && error.__absTimeout === true, toStreamingSlot = (slot, policy) => ({
4856
+ }, isSlotPatchPayloadObject = (value) => isRecord9(value) && ("html" in value), isTimeoutError = (error) => isRecord9(error) && error.__absTimeout === true, toStreamingSlot = (slot, policy) => ({
4557
4857
  dynamic: slot.dynamic,
4558
4858
  errorHtml: slot.errorHtml === undefined ? policy.errorHtml : slot.errorHtml,
4559
4859
  fallbackHtml: normalizeSlotText(slot.fallbackHtml, policy.fallbackHtml),
@@ -4807,9 +5107,9 @@ var SLOT_ID_PREFIX = "abs-slot-", CLOSING_BODY_TAG = "</body>", CLOSING_HEAD_TAG
4807
5107
  tail: ""
4808
5108
  };
4809
5109
  };
4810
- const handleBaseWinner = (controller, winner, baseRead, tail, footer) => {
5110
+ const handleBaseWinner = (controller, winner, baseRead, tail, footer, baseDone) => {
4811
5111
  if (winner.kind !== "base") {
4812
- return { baseDone: false, baseRead, footer, handled: false, tail };
5112
+ return { baseDone, baseRead, footer, handled: false, tail };
4813
5113
  }
4814
5114
  if (winner.done) {
4815
5115
  return finalizeCompletedBaseWinner(controller, tail + decoder.decode(), baseRead);
@@ -4852,7 +5152,7 @@ var SLOT_ID_PREFIX = "abs-slot-", CLOSING_BODY_TAG = "</body>", CLOSING_HEAD_TAG
4852
5152
  return footer;
4853
5153
  }
4854
5154
  const winner = await Promise.race(racers);
4855
- const baseWinnerState = applyBaseWinnerState(handleBaseWinner(controller, winner, baseRead, tail, footer), winner, (slotWinner) => {
5155
+ const baseWinnerState = applyBaseWinnerState(handleBaseWinner(controller, winner, baseRead, tail, footer, baseDone), winner, (slotWinner) => {
4856
5156
  handleResolvedSlot(controller, slotWinner);
4857
5157
  });
4858
5158
  ({ baseDone, baseRead, footer, tail } = baseWinnerState);
@@ -5215,10 +5515,10 @@ var isInterpolatedExpressionStart = (value, index) => value[index] === "{" && va
5215
5515
  }
5216
5516
  return {
5217
5517
  content: parsedBlock.content.trim(),
5218
- nextIndex: input.keyword === "@placeholder" ? skipWhitespace(input.template, parsedBlock.nextIndex) : parsedBlock.nextIndex
5518
+ nextIndex: input.keyword === "@placeholder" ? skipWhitespace2(input.template, parsedBlock.nextIndex) : parsedBlock.nextIndex
5219
5519
  };
5220
5520
  }, resolveDeferSlotStart = (template, deferIndex, markerCursor) => {
5221
- const nextMarkerCursor = skipWhitespace(template, markerCursor);
5521
+ const nextMarkerCursor = skipWhitespace2(template, markerCursor);
5222
5522
  if (template[nextMarkerCursor] === "{") {
5223
5523
  return {
5224
5524
  changed: false,
@@ -5443,7 +5743,7 @@ var isInterpolatedExpressionStart = (value, index) => value[index] === "{" && va
5443
5743
  template: resolvedBlockState.template
5444
5744
  };
5445
5745
  }
5446
- const blockContent = parsePlaceholderAndErrorBlocks(template, skipWhitespace(template, resolvedBlock.nextIndex));
5746
+ const blockContent = parsePlaceholderAndErrorBlocks(template, skipWhitespace2(template, resolvedBlock.nextIndex));
5447
5747
  const builtSlot = buildDeferredSlot({
5448
5748
  cursorAfterResolved: blockContent.cursorAfterResolved,
5449
5749
  errorHtml: blockContent.errorHtml,
@@ -5473,14 +5773,14 @@ var isInterpolatedExpressionStart = (value, index) => value[index] === "{" && va
5473
5773
  ({ cursor, depth } = consumed);
5474
5774
  }
5475
5775
  return { content: value.slice(start + 1), nextIndex: value.length };
5476
- }, skipWhitespace = (value, index) => {
5776
+ }, skipWhitespace2 = (value, index) => {
5477
5777
  let cursor = index;
5478
5778
  while (cursor < value.length && /\s/.test(value[cursor] ?? "")) {
5479
5779
  cursor += 1;
5480
5780
  }
5481
5781
  return cursor;
5482
5782
  }, parseOptionalParenthesizedBlock = (value, index) => {
5483
- let cursor = skipWhitespace(value, index);
5783
+ let cursor = skipWhitespace2(value, index);
5484
5784
  if (value[cursor] !== "(") {
5485
5785
  return null;
5486
5786
  }
@@ -5544,7 +5844,7 @@ var isInterpolatedExpressionStart = (value, index) => value[index] === "{" && va
5544
5844
  return null;
5545
5845
  }
5546
5846
  const blockKeywordCursor = cursorAfterResolved + keyword.length;
5547
- const blockStart = skipWhitespace(template, blockKeywordCursor);
5847
+ const blockStart = skipWhitespace2(template, blockKeywordCursor);
5548
5848
  if (template[blockStart] !== "{") {
5549
5849
  return null;
5550
5850
  }
@@ -6216,7 +6516,7 @@ ${importLine}${source.slice(insertAt)}`;
6216
6516
  const rawExpression = value.slice(interpolationStart + 2, nextCursor - 2).trim();
6217
6517
  const expression = rawExpression.length === 0 ? "''" : rawExpression;
6218
6518
  const expressionLiteral = JSON.stringify(expression);
6219
- parts.push(`\${this.__absoluteDeferResolveTemplateExpression(${expressionLiteral})}`);
6519
+ parts.push(`\${this.__absoluteDeferEscapeHtml(this.__absoluteDeferResolveTemplateExpression(${expressionLiteral}))}`);
6220
6520
  cursor = nextCursor;
6221
6521
  }
6222
6522
  return parts.join("");
@@ -6247,6 +6547,10 @@ ${importLine}${source.slice(insertAt)}`;
6247
6547
  ` + ` return value;
6248
6548
  ` + ` }
6249
6549
 
6550
+ ` + ` __absoluteDeferEscapeHtml(value: string) {
6551
+ ` + ` return value.replace(/[&<>"']/g, (char) => char === '&' ? '&amp;' : char === '<' ? '&lt;' : char === '>' ? '&gt;' : char === '"' ? '&quot;' : '&#39;');
6552
+ ` + ` }
6553
+
6250
6554
  `, buildDeferSlotFields = (slots) => [
6251
6555
  buildDeferSlotTemplateResolver(),
6252
6556
  ...slots.map((slot, index) => {
@@ -7273,6 +7577,129 @@ var resolveRequestBaseHref = (route, request) => deriveAngularBaseHref(route, re
7273
7577
  // src/angular/pageHandler.ts
7274
7578
  init_spaRouteManifest();
7275
7579
 
7580
+ // src/angular/colocatedRouteMatch.ts
7581
+ var MAX_ROUTE_DEPTH = 32;
7582
+ var isRecord2 = (value) => typeof value === "object" && value !== null;
7583
+ var PRIMARY_OUTLET = "primary";
7584
+ var routeOutlet = (route) => typeof route.outlet === "string" ? route.outlet : PRIMARY_OUTLET;
7585
+ var matchRoute = (route, segments) => {
7586
+ if (!isRecord2(route))
7587
+ return true;
7588
+ if (routeOutlet(route) !== PRIMARY_OUTLET)
7589
+ return false;
7590
+ if (typeof route.matcher === "function")
7591
+ return true;
7592
+ if (typeof route.path !== "string")
7593
+ return true;
7594
+ const { path } = route;
7595
+ const parts = path.split("/").filter((part) => part !== "");
7596
+ if (parts.includes("**"))
7597
+ return true;
7598
+ const isFull = route.pathMatch === "full";
7599
+ if (parts.length > segments.length)
7600
+ return false;
7601
+ if (isFull && parts.length < segments.length)
7602
+ return false;
7603
+ const consumed = parts.every((part, index) => part.startsWith(":") || part === segments[index]);
7604
+ if (!consumed)
7605
+ return false;
7606
+ const rest = segments.slice(parts.length);
7607
+ if (route.redirectTo !== undefined)
7608
+ return true;
7609
+ if (route.loadChildren !== undefined)
7610
+ return true;
7611
+ if (route.children !== undefined)
7612
+ return { children: route.children, rest };
7613
+ return rest.length === 0;
7614
+ };
7615
+ var matchRoutes = (routes, segments, depth) => {
7616
+ if (!Array.isArray(routes) || depth > MAX_ROUTE_DEPTH)
7617
+ return true;
7618
+ if (segments.length === 0)
7619
+ return true;
7620
+ return routes.some((route) => {
7621
+ const result = matchRoute(route, segments);
7622
+ if (typeof result === "boolean")
7623
+ return result;
7624
+ return matchRoutes(result.children, result.rest, depth + 1);
7625
+ });
7626
+ };
7627
+ var decodeSegment = (segment) => {
7628
+ try {
7629
+ return decodeURIComponent(segment);
7630
+ } catch {
7631
+ return null;
7632
+ }
7633
+ };
7634
+ var toUrlSegments = (path) => {
7635
+ if (path.includes("(") || path.includes(")"))
7636
+ return null;
7637
+ const decoded = path.split("/").map((raw) => raw.split(";")[0] ?? "").filter((segment) => segment !== "").map(decodeSegment);
7638
+ if (decoded.some((segment) => segment === null))
7639
+ return null;
7640
+ return decoded.filter((segment) => segment !== null);
7641
+ };
7642
+ var matchesAngularColocatedRoutes = (routes, path) => {
7643
+ const segments = toUrlSegments(path);
7644
+ if (segments === null)
7645
+ return true;
7646
+ return matchRoutes(routes, segments, 0);
7647
+ };
7648
+ var pathBelowBaseHref = (pathname, baseHref) => {
7649
+ const collapsed = pathname.replace(/\/{2,}/g, "/");
7650
+ const base = baseHref.endsWith("/") ? baseHref : `${baseHref}/`;
7651
+ if (`${collapsed}/` === base)
7652
+ return "";
7653
+ if (!collapsed.startsWith(base))
7654
+ return null;
7655
+ return collapsed.slice(base.length);
7656
+ };
7657
+ var WILDCARD_SUFFIX2 = "/*";
7658
+ var ROOT_WILDCARD = "/*";
7659
+ var MAX_PROVIDER_DEPTH = 8;
7660
+ var providesBaseHref = (provider, depth = 0) => {
7661
+ if (depth > MAX_PROVIDER_DEPTH)
7662
+ return true;
7663
+ if (Array.isArray(provider))
7664
+ return provider.some((entry) => providesBaseHref(entry, depth + 1));
7665
+ if (!isRecord2(provider))
7666
+ return false;
7667
+ const nested = Reflect.get(provider, "\u0275providers");
7668
+ if (Array.isArray(nested))
7669
+ return providesBaseHref(nested, depth + 1);
7670
+ if (!("provide" in provider))
7671
+ return false;
7672
+ return String(provider.provide).includes("appBaseHref");
7673
+ };
7674
+ var isUnmatchedColocatedRoute = ({
7675
+ handlerProviders,
7676
+ pageModule,
7677
+ request,
7678
+ route,
7679
+ runtimeBaseHref
7680
+ }) => {
7681
+ if (!request || !route?.endsWith(WILDCARD_SUFFIX2))
7682
+ return false;
7683
+ const { providers, routes } = pageModule;
7684
+ if (!Array.isArray(routes) || !Array.isArray(providers))
7685
+ return false;
7686
+ if (providesBaseHref(handlerProviders))
7687
+ return false;
7688
+ const baseHref = runtimeBaseHref ?? (route === ROOT_WILDCARD ? "/" : null);
7689
+ if (baseHref === null)
7690
+ return false;
7691
+ let pathname;
7692
+ try {
7693
+ ({ pathname } = new URL(request.url));
7694
+ } catch {
7695
+ return false;
7696
+ }
7697
+ const path = pathBelowBaseHref(pathname, baseHref);
7698
+ if (path === null)
7699
+ return false;
7700
+ return !matchesAngularColocatedRoutes(routes, path);
7701
+ };
7702
+
7276
7703
  // src/angular/lowerServerIslands.ts
7277
7704
  init_renderIslandMarkup();
7278
7705
  var ANGULAR_ISLAND_TAG_RE = /<absolute-island\b([^>]*)>[\s\S]*?<\/absolute-island>/gi;
@@ -7290,7 +7717,7 @@ var islandHydrationModes = [
7290
7717
  "none"
7291
7718
  ];
7292
7719
  var decodeHtmlAttribute = (value) => value.replaceAll("&quot;", '"').replaceAll("&#34;", '"').replaceAll("&apos;", "'").replaceAll("&#39;", "'").replaceAll("&amp;", "&").replaceAll("&lt;", "<").replaceAll("&gt;", ">");
7293
- var isRecord6 = (value) => typeof value === "object" && value !== null;
7720
+ var isRecord7 = (value) => typeof value === "object" && value !== null;
7294
7721
  var isIslandFramework = (value) => islandFrameworks.some((framework) => framework === value);
7295
7722
  var isIslandHydrate = (value) => islandHydrationModes.some((mode) => mode === value);
7296
7723
  var parseAttributes = (attributeString) => {
@@ -7321,7 +7748,7 @@ var parseAngularIslandProps = (attributeString) => {
7321
7748
  let parsedProps = {};
7322
7749
  try {
7323
7750
  const candidate = JSON.parse(serializedProps);
7324
- parsedProps = isRecord6(candidate) ? candidate : {};
7751
+ parsedProps = isRecord7(candidate) ? candidate : {};
7325
7752
  } catch {}
7326
7753
  return {
7327
7754
  component,
@@ -7690,11 +8117,11 @@ var runWithStreamingSlotWarningScope = (task, metadata) => ensureWarningStorage(
7690
8117
 
7691
8118
  // src/angular/pageHandler.ts
7692
8119
  init_ssrRender();
7693
- var isRecord9 = (value) => typeof value === "object" && value !== null;
8120
+ var isRecord10 = (value) => typeof value === "object" && value !== null;
7694
8121
  var isAngularComponent = (value) => typeof value === "function";
7695
8122
  var componentHostsRouterOutlet = (component) => {
7696
8123
  const componentDef = Reflect.get(component, "\u0275cmp");
7697
- if (!isRecord9(componentDef))
8124
+ if (!isRecord10(componentDef))
7698
8125
  return false;
7699
8126
  const rawDependencies = componentDef.dependencies;
7700
8127
  const dependencies = typeof rawDependencies === "function" ? Reflect.apply(rawDependencies, undefined, []) : rawDependencies;
@@ -7704,7 +8131,7 @@ var componentHostsRouterOutlet = (component) => {
7704
8131
  if (dependency === null || typeof dependency !== "object" && typeof dependency !== "function")
7705
8132
  return false;
7706
8133
  const directiveDef = Reflect.get(dependency, "\u0275dir") ?? dependency;
7707
- if (!isRecord9(directiveDef))
8134
+ if (!isRecord10(directiveDef))
7708
8135
  return false;
7709
8136
  const { selectors } = directiveDef;
7710
8137
  return Array.isArray(selectors) && JSON.stringify(selectors).includes("router-outlet");
@@ -7734,7 +8161,7 @@ var ensureAngularCompiler = () => {
7734
8161
  }
7735
8162
  return compilerImportPromise;
7736
8163
  };
7737
- var readAngularPageModule = (value) => isRecord9(value) ? value : null;
8164
+ var readAngularPageModule = (value) => isRecord10(value) ? value : null;
7738
8165
  var resolveAngularSsrOutDir = (projectRoot = process.cwd(), configuredOutDir = process.env.ABSOLUTE_ANGULAR_SSR_OUTDIR) => configuredOutDir ?? join10(projectRoot, ".absolutejs", "runtime", "angular-ssr");
7739
8166
  var createAngularRuntimeCacheBuster = () => `${Date.now().toString(BASE_36_RADIX)}.${Math.random().toString(BASE_36_RADIX).substring(2, RANDOM_ID_END_INDEX)}`;
7740
8167
  var existingNodeModulesLinkMatches = async (nodeModulesLink, expectedTarget) => {
@@ -7819,7 +8246,7 @@ var buildRuntimeModuleSpecifier = (modulePath, cacheBuster) => {
7819
8246
  var withHtmlContentType = (responseInit = {}) => {
7820
8247
  const headers = new Headers(responseInit.headers);
7821
8248
  if (!headers.has("Content-Type")) {
7822
- headers.set("Content-Type", "text/html");
8249
+ headers.set("Content-Type", HTML_CONTENT_TYPE);
7823
8250
  }
7824
8251
  return { ...responseInit, headers };
7825
8252
  };
@@ -7852,7 +8279,7 @@ var handleAngularPageRequest = async (input) => {
7852
8279
  ],
7853
8280
  runtimes: [String(ABSOLUTE_MOBILE_PAGE_PROTOCOL_VERSION)]
7854
8281
  },
7855
- props: isRecord9(input.requestContext) ? input.requestContext : Object.create(null),
8282
+ props: isRecord10(input.requestContext) ? input.requestContext : Object.create(null),
7856
8283
  request,
7857
8284
  status: input.responseInit?.status,
7858
8285
  route: () => {
@@ -7889,18 +8316,27 @@ var handleAngularPageRequest = async (input) => {
7889
8316
  });
7890
8317
  try {
7891
8318
  const handlerCallsite = options?.collectStreamingSlots === true ? undefined : getCurrentRouteRegistrationCallsite() ?? captureStreamingSlotWarningCallsite();
8319
+ const baseDeps = await getAngularDeps();
8320
+ const runtimePagePath = await resolveRuntimeAngularModulePath(resolvedPagePath);
8321
+ const importedPageModule = await import(buildRuntimeModuleSpecifier(runtimePagePath.path, runtimePagePath.cacheBuster));
8322
+ const pageModule = readAngularPageModule(importedPageModule);
8323
+ if (!pageModule) {
8324
+ throw new Error(`Invalid Angular page module: ${resolvedPagePath}`);
8325
+ }
8326
+ const PageComponent = resolvePageComponent(pageModule);
8327
+ if (!isAngularComponent(PageComponent)) {
8328
+ throw new Error(`Angular page module must export an Angular component: ${resolvedPagePath}`);
8329
+ }
8330
+ if (isUnmatchedColocatedRoute({
8331
+ handlerProviders: input.providers,
8332
+ pageModule,
8333
+ request,
8334
+ route: getCurrentAbsoluteRoute(request),
8335
+ runtimeBaseHref
8336
+ })) {
8337
+ return withPageCacheHeaders(await renderSpaNotFoundResponse(request), request);
8338
+ }
7892
8339
  const renderPageResponse = async () => {
7893
- const baseDeps = await getAngularDeps();
7894
- const runtimePagePath = await resolveRuntimeAngularModulePath(resolvedPagePath);
7895
- const importedPageModule = await import(buildRuntimeModuleSpecifier(runtimePagePath.path, runtimePagePath.cacheBuster));
7896
- const pageModule = readAngularPageModule(importedPageModule);
7897
- if (!pageModule) {
7898
- throw new Error(`Invalid Angular page module: ${resolvedPagePath}`);
7899
- }
7900
- const PageComponent = resolvePageComponent(pageModule);
7901
- if (!isAngularComponent(PageComponent)) {
7902
- throw new Error(`Angular page module must export an Angular component: ${resolvedPagePath}`);
7903
- }
7904
8340
  const hasIslands = typeof pageModule.__ABSOLUTE_PAGE_HAS_ISLANDS__ === "boolean" ? pageModule.__ABSOLUTE_PAGE_HAS_ISLANDS__ : false;
7905
8341
  const usesLegacyAnimations = pageModule.__ABSOLUTE_PAGE_USES_LEGACY_ANIMATIONS__ === true;
7906
8342
  const deps = baseDeps;
@@ -7940,7 +8376,7 @@ var handleAngularPageRequest = async (input) => {
7940
8376
  return withPageCacheHeaders(conventionResponse, request);
7941
8377
  }
7942
8378
  return withPageCacheHeaders(new Response(ssrErrorPage("angular", error), {
7943
- headers: { "Content-Type": "text/html" },
8379
+ headers: { "Content-Type": HTML_CONTENT_TYPE },
7944
8380
  status: 500
7945
8381
  }), request);
7946
8382
  }
@@ -7968,5 +8404,5 @@ export {
7968
8404
  withPendingTask
7969
8405
  };
7970
8406
 
7971
- //# debugId=CF431FA646A483F064756E2164756E21
8407
+ //# debugId=FE97DE05426DDF8964756E2164756E21
7972
8408
  //# sourceMappingURL=server.js.map