@absolutejs/absolute 0.20.0-beta.169 → 0.20.0-beta.170

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 (238) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +232 -0
  3. package/changelog.json +228 -0
  4. package/dist/angular/browser.js +7 -8
  5. package/dist/angular/browser.js.map +6 -5
  6. package/dist/angular/components/core/streamingSlotRegistrar.js +6 -2
  7. package/dist/angular/components/core/streamingSlotRegistry.js +7 -3
  8. package/dist/angular/index.js +555 -156
  9. package/dist/angular/index.js.map +29 -23
  10. package/dist/angular/server.js +555 -156
  11. package/dist/angular/server.js.map +29 -23
  12. package/dist/build/buildWorker.js +14 -8
  13. package/dist/build.js +4949 -1941
  14. package/dist/build.js.map +72 -42
  15. package/dist/cli/{add-7azr0c83.js → add-6a7pjkn9.js} +11 -7
  16. package/dist/cli/{analyze-3cyek6v3.js → analyze-606fshwa.js} +1 -1
  17. package/dist/cli/{build-25rz8v25.js → build-g81xqbb9.js} +1 -1
  18. package/dist/cli/{compile-4jnfxts9.js → compile-9y1w9zpj.js} +3 -3
  19. package/dist/cli/config/server.js +10699 -1538
  20. package/dist/cli/{dev-9tk5hn2e.js → dev-hyeb89hp.js} +5 -1
  21. package/dist/cli/{doctor-4nv2c2j3.js → doctor-h55y9hj1.js} +1 -1
  22. package/dist/cli/{generate-v75p2fct.js → generate-20x1pkf7.js} +4 -4
  23. package/dist/cli/{htmx-427swtdz.js → htmx-6mz2h7k1.js} +2 -2
  24. package/dist/cli/{index-bhbs6d5z.js → index-32ge2w1f.js} +12 -4
  25. package/dist/cli/{index-a4ws2jwd.js → index-3wz3mktm.js} +1 -1
  26. package/dist/cli/{index-b7hjgknf.js → index-9sksd8c8.js} +13 -4
  27. package/dist/cli/{index-eyzwc7gz.js → index-qbrzvmh9.js} +4 -2
  28. package/dist/cli/index-qw98g1p6.js +269 -0
  29. package/dist/cli/{index-434b7j4a.js → index-vtp20gwf.js} +69 -1
  30. package/dist/cli/{index-h7qhz02e.js → index-wk0pyxrg.js} +3 -0
  31. package/dist/cli/{index-k3y8cb6c.js → index-z6f43b20.js} +1 -1
  32. package/dist/cli/index.js +16 -16
  33. package/dist/cli/{islands-8sgky9gh.js → islands-dc54e5y1.js} +1 -1
  34. package/dist/cli/{ls-4m4yqwww.js → ls-b6zz24nt.js} +1 -1
  35. package/dist/cli/{mobile-hcxjr2gf.js → mobile-ajnnvqtv.js} +3 -3
  36. package/dist/cli/prerender-fqpp0m1j.js +10 -0
  37. package/dist/cli/{remove-1ycjx85k.js → remove-t8x1mrxg.js} +4 -4
  38. package/dist/cli/{start-mbaejxhm.js → start-d6p831ny.js} +3 -3
  39. package/dist/cli/{typecheck-dr068pmh.js → typecheck-stbt0qt5.js} +6 -1
  40. package/dist/cli/{workspace-1sycp9g1.js → workspace-61hh6jq1.js} +1 -1
  41. package/dist/client/chunks/index-6b66nzyf.js +381 -0
  42. package/dist/client/chunks/index-6b66nzyf.js.map +11 -0
  43. package/dist/client/chunks/{islands-rc28k5sx.js → islands-s2ta5ajb.js} +5 -2
  44. package/dist/client/chunks/{islands-rc28k5sx.js.map → islands-s2ta5ajb.js.map} +7 -6
  45. package/dist/client/index.js +160 -3
  46. package/dist/client/index.js.map +6 -4
  47. package/dist/client/navigation.js +764 -0
  48. package/dist/client/navigation.js.map +10 -0
  49. package/dist/client/prefetch.js +33 -375
  50. package/dist/client/prefetch.js.map +3 -4
  51. package/dist/core/streamingSlotRegistrar.js +5 -2
  52. package/dist/core/streamingSlotRegistrar.js.map +5 -4
  53. package/dist/core/streamingSlotRegistry.js +5 -2
  54. package/dist/core/streamingSlotRegistry.js.map +5 -4
  55. package/dist/dev/client/cspNonce.ts +28 -0
  56. package/dist/dev/client/handlers/html.ts +4 -3
  57. package/dist/dev/client/handlers/htmx.ts +3 -2
  58. package/dist/dev/client/handlers/svelte.ts +15 -90
  59. package/dist/dev/client/syncDevtools.ts +2 -1
  60. package/dist/dev/serverBootstrap.js +11 -4
  61. package/dist/i18n/index.js +543 -0
  62. package/dist/i18n/index.js.map +15 -0
  63. package/dist/index.js +6339 -2233
  64. package/dist/index.js.map +89 -54
  65. package/dist/islands/index.js +282 -40
  66. package/dist/islands/index.js.map +14 -10
  67. package/dist/mobile/browser.js +7 -2
  68. package/dist/mobile/browser.js.map +5 -4
  69. package/dist/mobile/index.js +7 -2
  70. package/dist/mobile/index.js.map +5 -4
  71. package/dist/mobile/remoteMacAgentEntry.js +1 -1
  72. package/dist/react/components/browser/index.js +94 -4
  73. package/dist/react/components/index.js +150 -10
  74. package/dist/react/components/index.js.map +15 -10
  75. package/dist/react/hooks/index.js +479 -13
  76. package/dist/react/hooks/index.js.map +12 -4
  77. package/dist/react/index.js +769 -166
  78. package/dist/react/index.js.map +32 -21
  79. package/dist/react/router/browser.js +21 -4
  80. package/dist/react/router/browser.js.map +5 -4
  81. package/dist/react/router/index.js +21 -4
  82. package/dist/react/router/index.js.map +5 -4
  83. package/dist/react/server.js +597 -203
  84. package/dist/react/server.js.map +25 -15
  85. package/dist/src/angular/zoneRuntime.d.ts +5 -0
  86. package/dist/src/build/buildReactServerComponents.d.ts +22 -0
  87. package/dist/src/build/downlevelAsyncForZone.d.ts +1 -0
  88. package/dist/src/build/fileRoutes.d.ts +65 -0
  89. package/dist/src/build/fonts/buildFonts.d.ts +25 -0
  90. package/dist/src/build/fonts/fallbackMetrics.d.ts +13 -0
  91. package/dist/src/build/fonts/googleFonts.d.ts +18 -0
  92. package/dist/src/build/fonts/injectFontTags.d.ts +7 -0
  93. package/dist/src/build/fonts/parseFontMetrics.d.ts +4 -0
  94. package/dist/src/build/generateReactIndexes.d.ts +7 -1
  95. package/dist/src/build/htmlIncludes.d.ts +16 -0
  96. package/dist/src/build/inlineSourceMapComment.d.ts +1 -0
  97. package/dist/src/build/scanConventions.d.ts +3 -0
  98. package/dist/src/build/vitals.d.ts +21 -0
  99. package/dist/src/client/formActions.d.ts +29 -0
  100. package/dist/src/client/index.d.ts +2 -0
  101. package/dist/src/client/navigation.d.ts +16 -0
  102. package/dist/src/client/prefetch.d.ts +2 -30
  103. package/dist/src/core/build.d.ts +2 -2
  104. package/dist/src/core/cspNonce.d.ts +12 -0
  105. package/dist/src/core/fileRouteAdapter.d.ts +15 -0
  106. package/dist/src/core/fileRoutes.d.ts +5 -0
  107. package/dist/src/core/formActionFlash.d.ts +25 -0
  108. package/dist/src/core/formActions.d.ts +249 -0
  109. package/dist/src/core/index.d.ts +5 -0
  110. package/dist/src/core/partialPrerender.d.ts +28 -0
  111. package/dist/src/core/partialPrerenderServe.d.ts +24 -0
  112. package/dist/src/core/precompressed.d.ts +11 -1
  113. package/dist/src/core/prerenderNonce.d.ts +9 -0
  114. package/dist/src/core/productionRuntime.d.ts +4 -2
  115. package/dist/src/core/serverOnlyStaticFiles.d.ts +8 -0
  116. package/dist/src/core/staticHtmlNonce.d.ts +2 -0
  117. package/dist/src/core/vitals.d.ts +108 -0
  118. package/dist/src/dev/angular/fastHmrCompiler.d.ts +1 -1
  119. package/dist/src/dev/client/cspNonce.d.ts +2 -0
  120. package/dist/src/dev/fileRouteRefresher.d.ts +5 -0
  121. package/dist/src/dev/importCost/instrument.d.ts +1 -1
  122. package/dist/src/dev/reactServerComponentsRebuild.d.ts +3 -0
  123. package/dist/src/i18n/defineMessages.d.ts +5 -0
  124. package/dist/src/i18n/formatMessage.d.ts +26 -0
  125. package/dist/src/i18n/index.d.ts +6 -0
  126. package/dist/src/i18n/intlCache.d.ts +5 -0
  127. package/dist/src/i18n/routing.d.ts +28 -0
  128. package/dist/src/i18n/translator.d.ts +11 -0
  129. package/dist/src/mobile/androidRelease.d.ts +2 -2
  130. package/dist/src/mobile/iosRelease.d.ts +4 -4
  131. package/dist/src/mobile/materializedBundle.d.ts +1 -1
  132. package/dist/src/mobile/mobileInspect.d.ts +1 -1
  133. package/dist/src/mobile/releaseArtifact.d.ts +2 -2
  134. package/dist/src/mobile/remoteMacProtocol.d.ts +2 -2
  135. package/dist/src/plugins/i18n.d.ts +30 -0
  136. package/dist/src/plugins/index.d.ts +2 -1
  137. package/dist/src/plugins/secureHeaders.d.ts +48 -0
  138. package/dist/src/react/components/Head.d.ts +1 -1
  139. package/dist/src/react/components/StreamSlot.browser.d.ts +1 -0
  140. package/dist/src/react/components/StreamSlot.d.ts +5 -1
  141. package/dist/src/react/components/SuspenseSlot.browser.d.ts +2 -0
  142. package/dist/src/react/components/SuspenseSlot.d.ts +12 -0
  143. package/dist/src/react/fileRoute.d.ts +18 -0
  144. package/dist/src/react/hooks/index.d.ts +4 -0
  145. package/dist/src/react/hooks/useFormAction.d.ts +42 -0
  146. package/dist/src/react/hooks/useI18n.d.ts +15 -0
  147. package/dist/src/react/index.d.ts +2 -0
  148. package/dist/src/react/server.d.ts +2 -0
  149. package/dist/src/react/serverComponents/constants.d.ts +11 -0
  150. package/dist/src/react/serverComponents/flightPayload.d.ts +2 -0
  151. package/dist/src/react/serverComponents/pageHandler.d.ts +14 -0
  152. package/dist/src/svelte/browser.d.ts +1 -0
  153. package/dist/src/svelte/fileRoute.d.ts +15 -0
  154. package/dist/src/svelte/i18n.d.ts +8 -0
  155. package/dist/src/svelte/index.d.ts +2 -0
  156. package/dist/src/svelte/lowerAwaitSlotSyntax.d.ts +5 -1
  157. package/dist/src/svelte/renderToReadableStream.d.ts +10 -2
  158. package/dist/src/svelte/router/browser.d.ts +3 -1
  159. package/dist/src/svelte/router/goto.d.ts +13 -10
  160. package/dist/src/svelte/router/guards.d.ts +43 -0
  161. package/dist/src/svelte/router/index.d.ts +3 -1
  162. package/dist/src/svelte/router/lazy.d.ts +17 -0
  163. package/dist/src/svelte/router/lazyModule.d.ts +29 -0
  164. package/dist/src/svelte/router/navigation.d.ts +55 -0
  165. package/dist/src/svelte/router/pushState.d.ts +4 -2
  166. package/dist/src/svelte/router/scroll.d.ts +34 -0
  167. package/dist/src/svelte/routerSsr.d.ts +9 -0
  168. package/dist/src/svelte/server.d.ts +1 -0
  169. package/dist/src/utils/cspNonceRef.d.ts +8 -0
  170. package/dist/src/utils/fontAssets.d.ts +17 -0
  171. package/dist/src/utils/formActionProtocol.d.ts +10 -0
  172. package/dist/src/utils/generateHeadElement.d.ts +1 -1
  173. package/dist/src/utils/index.d.ts +1 -0
  174. package/dist/src/utils/inlinePageCss.d.ts +18 -0
  175. package/dist/src/utils/loadConfig.d.ts +5 -0
  176. package/dist/src/utils/localeRef.d.ts +10 -0
  177. package/dist/src/utils/resolveConvention.d.ts +6 -1
  178. package/dist/src/utils/streamingSlots.d.ts +5 -0
  179. package/dist/src/vue/browser.d.ts +2 -0
  180. package/dist/src/vue/components/Image.d.ts +2 -2
  181. package/dist/src/vue/index.d.ts +2 -0
  182. package/dist/src/vue/serverDataPayload.d.ts +32 -0
  183. package/dist/src/vue/serverDataState.d.ts +9 -0
  184. package/dist/src/vue/useServerData.browser.d.ts +6 -0
  185. package/dist/src/vue/useServerData.d.ts +24 -0
  186. package/dist/svelte/browser.js +330 -3
  187. package/dist/svelte/browser.js.map +8 -4
  188. package/dist/svelte/components/AwaitSlot.svelte +5 -0
  189. package/dist/svelte/components/Head.svelte +50 -0
  190. package/dist/svelte/components/JsonLd.svelte +9 -1
  191. package/dist/svelte/components/StreamSlot.svelte +5 -0
  192. package/dist/svelte/index.js +1017 -117
  193. package/dist/svelte/index.js.map +38 -24
  194. package/dist/svelte/router/Link.svelte +40 -8
  195. package/dist/svelte/router/Route.svelte +157 -12
  196. package/dist/svelte/router/Route.svelte.d.ts +39 -5
  197. package/dist/svelte/router/Router.svelte +140 -25
  198. package/dist/svelte/router/Router.svelte.d.ts +5 -1
  199. package/dist/svelte/router/browser.ts +10 -0
  200. package/dist/svelte/router/goto.ts +15 -86
  201. package/dist/svelte/router/guards.ts +112 -0
  202. package/dist/svelte/router/index.ts +10 -0
  203. package/dist/svelte/router/lazy.ts +82 -0
  204. package/dist/svelte/router/lazyModule.ts +74 -0
  205. package/dist/svelte/router/navigation.ts +412 -0
  206. package/dist/svelte/router/pushState.ts +7 -4
  207. package/dist/svelte/router/scroll.ts +286 -0
  208. package/dist/svelte/server.js +747 -252
  209. package/dist/svelte/server.js.map +30 -20
  210. package/dist/types/angular.d.ts +2 -0
  211. package/dist/types/build.d.ts +37 -0
  212. package/dist/types/conventions.d.ts +3 -0
  213. package/dist/types/fileRoutes.d.ts +72 -0
  214. package/dist/types/fonts.d.ts +86 -0
  215. package/dist/types/formAction.d.ts +54 -0
  216. package/dist/types/globals.d.ts +10 -0
  217. package/dist/types/i18n.d.ts +185 -0
  218. package/dist/types/index.d.ts +4 -0
  219. package/dist/types/metadata.d.ts +11 -0
  220. package/dist/types/navigation.d.ts +37 -0
  221. package/dist/types/prefetch.d.ts +10 -0
  222. package/dist/types/sitemap.d.ts +4 -0
  223. package/dist/types/svelteRouter.d.ts +89 -2
  224. package/dist/types/svelteRouter.ts +112 -2
  225. package/dist/types/vue.d.ts +46 -1
  226. package/dist/utils/iconVersion.ts +34 -0
  227. package/dist/vue/browser.js +107 -11
  228. package/dist/vue/browser.js.map +7 -4
  229. package/dist/vue/components/index.js +5 -2
  230. package/dist/vue/components/index.js.map +5 -4
  231. package/dist/vue/index.js +712 -158
  232. package/dist/vue/index.js.map +32 -23
  233. package/dist/vue/server.js +310 -79
  234. package/dist/vue/server.js.map +20 -15
  235. package/package.json +9 -1
  236. package/dist/cli/prerender-mfnwsvyt.js +0 -7
  237. package/dist/src/plugins/pageRouter.d.ts +0 -1
  238. /package/dist/cli/{index-j7m8pq48.js → index-rervww4p.js} +0 -0
@@ -72,6 +72,51 @@ var __esm = (fn, res, err) => () => {
72
72
  };
73
73
  var __require = import.meta.require;
74
74
 
75
+ // src/utils/cspNonceRef.ts
76
+ var GETTER_KEY, nonceAttr = (nonce = readCspNonce()) => nonce ? ` nonce="${nonce}"` : "", nonceSvelteHeadStyles = (head, nonce = readCspNonce()) => nonce ? head.replace(/<style(?=\s+id="svelte-[^"]*")(?![^>]*\snonce=)/g, `<style nonce="${nonce}"`) : head, readCspNonce = () => {
77
+ const getter = Reflect.get(globalThis, GETTER_KEY);
78
+ if (typeof getter !== "function")
79
+ return;
80
+ const nonce = getter();
81
+ return typeof nonce === "string" ? nonce : undefined;
82
+ }, registerCspNonceGetter = (getter) => {
83
+ Reflect.set(globalThis, GETTER_KEY, getter);
84
+ };
85
+ var init_cspNonceRef = __esm(() => {
86
+ GETTER_KEY = Symbol.for("absolutejs.cspNonceGetter");
87
+ });
88
+
89
+ // src/utils/fontAssets.ts
90
+ var FONT_PRELOAD_MANIFEST_PREFIX = "AbsoluteFontPreload", FONTS_CSS_MANIFEST_KEY = "AbsoluteFontsCSS", FONTS_REMOTE_CSS_MANIFEST_PREFIX = "AbsoluteFontsRemoteCSS", MIME_BY_EXTENSION, numberedValues = (manifest, prefix) => Object.keys(manifest).filter((key) => key.startsWith(prefix)).map((key) => ({
91
+ index: Number(key.slice(prefix.length)),
92
+ value: manifest[key]
93
+ })).filter((entry) => Number.isInteger(entry.index) && entry.value !== undefined).sort((left, right) => left.index - right.index).map((entry) => entry.value), fontAssets = (manifest) => {
94
+ const stylesheet = manifest[FONTS_CSS_MANIFEST_KEY];
95
+ const assets = {
96
+ preload: numberedValues(manifest, FONT_PRELOAD_MANIFEST_PREFIX),
97
+ stylesheets: [
98
+ ...numberedValues(manifest, FONTS_REMOTE_CSS_MANIFEST_PREFIX),
99
+ ...stylesheet ? [stylesheet] : []
100
+ ]
101
+ };
102
+ return assets;
103
+ }, fontMimeType = (href) => {
104
+ const extension = /\.([a-z0-9]+)(?:[?#].*)?$/i.exec(href)?.[1]?.toLowerCase();
105
+ return (extension && MIME_BY_EXTENSION[extension]) ?? "font/woff2";
106
+ }, escapeAttribute = (value) => value.replace(/&/g, "&amp;").replace(/"/g, "&quot;"), isRemote = (href) => /^https?:\/\//i.test(href), fontPreconnectOrigins = (fonts) => fonts.stylesheets.some(isRemote) ? ["https://fonts.googleapis.com", "https://fonts.gstatic.com"] : [], renderFontTags = (fonts) => [
107
+ ...fontPreconnectOrigins(fonts).map((origin) => origin.includes("gstatic") ? `<link rel="preconnect" href="${origin}" crossorigin>` : `<link rel="preconnect" href="${origin}">`),
108
+ ...fonts.preload.map((href) => `<link rel="preload" href="${escapeAttribute(href)}" as="font" type="${fontMimeType(href)}" crossorigin>`),
109
+ ...fonts.stylesheets.map((href) => `<link rel="stylesheet" href="${escapeAttribute(href)}" data-absolute-fonts>`)
110
+ ];
111
+ var init_fontAssets = __esm(() => {
112
+ MIME_BY_EXTENSION = {
113
+ otf: "font/otf",
114
+ ttf: "font/ttf",
115
+ woff: "font/woff",
116
+ woff2: "font/woff2"
117
+ };
118
+ });
119
+
75
120
  // src/utils/iconVersion.ts
76
121
  var iconMimeType = (icon) => {
77
122
  if (icon.endsWith(".svg"))
@@ -83,6 +128,20 @@ var iconMimeType = (icon) => {
83
128
  resolver = resolverFn;
84
129
  };
85
130
 
131
+ // src/utils/escapeScriptContent.ts
132
+ var ESCAPE_LOOKUP, ESCAPE_REGEX, escapeScriptContent = (content) => content.replace(ESCAPE_REGEX, (char) => {
133
+ const escaped = ESCAPE_LOOKUP[char];
134
+ return escaped !== undefined ? escaped : char;
135
+ });
136
+ var init_escapeScriptContent = __esm(() => {
137
+ ESCAPE_LOOKUP = {
138
+ "\u2028": "\\u2028",
139
+ "\u2029": "\\u2029",
140
+ "<": "\\u003C"
141
+ };
142
+ ESCAPE_REGEX = /[<\u2028\u2029]/g;
143
+ });
144
+
86
145
  // src/constants.ts
87
146
  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, 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;
88
147
  var init_constants = __esm(() => {
@@ -102,12 +161,25 @@ var init_constants = __esm(() => {
102
161
  MILLISECONDS_IN_A_DAY = MILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE * MINUTES_IN_AN_HOUR * HOURS_IN_DAY;
103
162
  TWO_THIRDS = 2 / 3;
104
163
  });
164
+
165
+ // src/utils/runtimeMode.ts
166
+ var ENV_VAR = "NODE_ENV", getNodeEnv = () => process.env[ENV_VAR], isDevelopmentRuntime = () => process.env[ENV_VAR] === "development", isProductionRuntime = () => process.env[ENV_VAR] === "production";
167
+
168
+ // src/react/components/Head.tsx
169
+ init_cspNonceRef();
170
+ init_fontAssets();
171
+
172
+ // src/utils/generateHeadElement.ts
173
+ init_fontAssets();
174
+ init_cspNonceRef();
175
+
105
176
  // src/utils/jsonLd.ts
177
+ init_escapeScriptContent();
106
178
  var jsonLd = (schema) => `<script type="application/ld+json">${serializeJsonLd(schema)}</script>`;
107
179
  var serializeJsonLd = (schema) => {
108
180
  const schemaOrgContext = "https://schema.org";
109
181
  const data = Array.isArray(schema) ? { "@context": schemaOrgContext, "@graph": schema } : { "@context": schemaOrgContext, ...schema };
110
- return JSON.stringify(data);
182
+ return escapeScriptContent(JSON.stringify(data));
111
183
  };
112
184
 
113
185
  // src/utils/generateHeadElement.ts
@@ -194,6 +266,8 @@ var renderMetaTag = (tag) => {
194
266
  return `<meta name="${tag.name}" content="${tag.content}">`;
195
267
  return;
196
268
  };
269
+ var escapeAttribute2 = (value) => value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;");
270
+ var renderAlternateLinks = (alternates = []) => alternates.map(({ href, hreflang }) => `<link rel="alternate" hreflang="${escapeAttribute2(hreflang)}" href="${escapeAttribute2(href)}">`);
197
271
  var renderPreloadLink = (preload) => {
198
272
  const rel = preload.module ? "modulepreload" : "preload";
199
273
  const asAttribute = !preload.module && preload.as ? ` as="${preload.as}"` : "";
@@ -205,8 +279,10 @@ var generateHeadElement = ({
205
279
  title = "AbsoluteJS",
206
280
  description = "A page created using AbsoluteJS",
207
281
  font,
282
+ fonts,
208
283
  icon = "/assets/ico/favicon.ico",
209
284
  canonical,
285
+ alternates,
210
286
  openGraph,
211
287
  twitter,
212
288
  robots,
@@ -225,6 +301,7 @@ var generateHeadElement = ({
225
301
  if (canonical) {
226
302
  tags.push(`<link rel="canonical" href="${canonical}">`);
227
303
  }
304
+ tags.push(...renderAlternateLinks(alternates));
228
305
  tags.push(...renderOpenGraphTags(openGraph, title, description));
229
306
  tags.push(...renderTwitterTags(twitter, title, description));
230
307
  const robotsContent = robots ? renderRobotsContent(robots) : "";
@@ -236,19 +313,22 @@ var generateHeadElement = ({
236
313
  if (font) {
237
314
  tags.push(`<link rel="preconnect" href="https://fonts.googleapis.com">`, `<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>`, `<link href="https://fonts.googleapis.com/css2?family=${font}:wght@100..900&display=swap" rel="stylesheet">`);
238
315
  }
316
+ if (fonts) {
317
+ tags.push(...renderFontTags(fonts));
318
+ }
239
319
  for (const link of preload ?? []) {
240
320
  tags.push(renderPreloadLink(link));
241
321
  }
242
322
  const speculation = speculationRules ? serializeSpeculationRules(speculationRules) : undefined;
243
323
  if (speculation) {
244
- tags.push(`<script type="speculationrules">${speculation}</script>`);
324
+ tags.push(`<script${nonceAttr()} type="speculationrules">${speculation}</script>`);
245
325
  }
246
326
  const cssPaths = cssPath ? [cssPath].flat() : [];
247
327
  for (const path of cssPaths) {
248
328
  tags.push(`<link rel="stylesheet" href="${path}" type="text/css">`);
249
329
  }
250
330
  if (jsonLd) {
251
- tags.push(`<script type="application/ld+json">${serializeJsonLd(jsonLd)}</script>`);
331
+ tags.push(`<script${nonceAttr()} type="application/ld+json">${serializeJsonLd(jsonLd)}</script>`);
252
332
  }
253
333
  return `<head>
254
334
  ${tags.join(`
@@ -405,6 +485,29 @@ var toCrossOrigin = (value) => {
405
485
  return value;
406
486
  return "anonymous";
407
487
  };
488
+ var FontLinks = ({ fonts }) => /* @__PURE__ */ jsxs(Fragment, {
489
+ children: [
490
+ fontPreconnectOrigins(fonts).map((origin) => /* @__PURE__ */ jsx("link", {
491
+ crossOrigin: origin.includes("gstatic") ? "anonymous" : undefined,
492
+ href: origin,
493
+ rel: "preconnect"
494
+ }, `preconnect:${origin}`)),
495
+ fonts.preload.map((href) => /* @__PURE__ */ jsx("link", {
496
+ as: "font",
497
+ crossOrigin: "anonymous",
498
+ href,
499
+ rel: "preload",
500
+ suppressHydrationWarning: true,
501
+ type: fontMimeType(href)
502
+ }, `preload:${href}`)),
503
+ fonts.stylesheets.map((href) => /* @__PURE__ */ jsx("link", {
504
+ "data-absolute-fonts": "",
505
+ href,
506
+ rel: "stylesheet",
507
+ suppressHydrationWarning: true
508
+ }, `stylesheet:${href}`))
509
+ ]
510
+ });
408
511
  var SpeculationRulesScript = ({
409
512
  rules
410
513
  }) => {
@@ -413,6 +516,8 @@ var SpeculationRulesScript = ({
413
516
  return null;
414
517
  return /* @__PURE__ */ jsx("script", {
415
518
  dangerouslySetInnerHTML: { __html: body },
519
+ nonce: readCspNonce(),
520
+ suppressHydrationWarning: true,
416
521
  type: "speculationrules"
417
522
  });
418
523
  };
@@ -421,8 +526,10 @@ var Head = ({
421
526
  description = "A page created using AbsoluteJS",
422
527
  icon = "/assets/ico/favicon.ico",
423
528
  font,
529
+ fonts,
424
530
  cssPath,
425
531
  canonical,
532
+ alternates,
426
533
  openGraph,
427
534
  twitter,
428
535
  robots,
@@ -456,6 +563,11 @@ var Head = ({
456
563
  href: canonical,
457
564
  rel: "canonical"
458
565
  }),
566
+ alternates?.map(({ href, hreflang }) => /* @__PURE__ */ jsx("link", {
567
+ href,
568
+ hrefLang: hreflang,
569
+ rel: "alternate"
570
+ }, `alternate:${hreflang}`)),
459
571
  openGraph && /* @__PURE__ */ jsx(OpenGraphTags, {
460
572
  description,
461
573
  openGraph,
@@ -491,6 +603,9 @@ var Head = ({
491
603
  })
492
604
  ]
493
605
  }),
606
+ fonts && /* @__PURE__ */ jsx(FontLinks, {
607
+ fonts
608
+ }),
494
609
  preload?.map((link) => /* @__PURE__ */ jsx("link", {
495
610
  as: link.module ? undefined : link.as,
496
611
  crossOrigin: toCrossOrigin(link.crossorigin),
@@ -508,6 +623,8 @@ var Head = ({
508
623
  }, path)),
509
624
  jsonLd && /* @__PURE__ */ jsx("script", {
510
625
  dangerouslySetInnerHTML: { __html: serializeJsonLd(jsonLd) },
626
+ nonce: readCspNonce(),
627
+ suppressHydrationWarning: true,
511
628
  type: "application/ld+json"
512
629
  })
513
630
  ]
@@ -735,7 +852,7 @@ var setStreamingSlotWarningController = (controller) => {
735
852
  Reflect.set(globalThis, STREAMING_SLOT_WARNING_STORAGE_KEY, controller);
736
853
  };
737
854
  var warnMissingStreamingSlotCollector = (primitiveName) => {
738
- if (isStreamingSlotCollectionActive()) {
855
+ if (isProductionRuntime() || isStreamingSlotCollectionActive()) {
739
856
  return;
740
857
  }
741
858
  getWarningController()?.maybeWarn(primitiveName);
@@ -746,10 +863,12 @@ import { jsx as jsx4 } from "react/jsx-runtime";
746
863
  var isLegacyProps = (props) => ("fallbackHtml" in props) || ("errorHtml" in props);
747
864
  var renderReactNodeToHtml = async (node) => {
748
865
  const { Fragment } = await import("react");
749
- const { renderToStaticMarkup } = await import("react-dom/server");
750
- return renderToStaticMarkup(/* @__PURE__ */ jsx4(Fragment, {
866
+ const { renderToReadableStream } = await import("react-dom/server");
867
+ const stream = await renderToReadableStream(/* @__PURE__ */ jsx4(Fragment, {
751
868
  children: node
752
869
  }));
870
+ await stream.allReady;
871
+ return new Response(stream).text();
753
872
  };
754
873
  var hasRenderChildren = (props) => typeof props.children === "function";
755
874
  async function resolveRenderSuspenseValue(props) {
@@ -781,6 +900,7 @@ var renderErrorFallback = async (props, error) => {
781
900
  };
782
901
  var registerLegacySuspenseSlot = (props) => {
783
902
  registerStreamingSlot({
903
+ dynamic: props.dynamic,
784
904
  errorHtml: props.errorHtml,
785
905
  fallbackHtml: props.fallbackHtml,
786
906
  id: props.id,
@@ -790,6 +910,7 @@ var registerLegacySuspenseSlot = (props) => {
790
910
  };
791
911
  var registerFrameworkSuspenseSlot = (props) => {
792
912
  registerStreamingSlot({
913
+ dynamic: props.dynamic,
793
914
  id: props.id,
794
915
  timeoutMs: props.timeoutMs,
795
916
  resolve: async () => {
@@ -837,6 +958,7 @@ var SuspenseSlot = (props) => {
837
958
  import { jsx as jsx5 } from "react/jsx-runtime";
838
959
  var StreamSlot = ({
839
960
  className,
961
+ dynamic,
840
962
  errorHtml,
841
963
  fallbackHtml = "",
842
964
  id,
@@ -845,6 +967,7 @@ var StreamSlot = ({
845
967
  }) => {
846
968
  if (isStreamingSlotCollectionActive()) {
847
969
  registerStreamingSlot({
970
+ dynamic,
848
971
  errorHtml,
849
972
  fallbackHtml,
850
973
  id,
@@ -867,6 +990,20 @@ import {
867
990
  useContext
868
991
  } from "react";
869
992
 
993
+ // src/dev/client/cspNonce.ts
994
+ var applyPageNonce = (element) => {
995
+ const nonce = readPageNonce();
996
+ if (nonce)
997
+ element.nonce = nonce;
998
+ return element;
999
+ };
1000
+ var readPageNonce = () => {
1001
+ if (typeof document === "undefined")
1002
+ return;
1003
+ const carrier = document.querySelector("script[nonce], style[nonce]");
1004
+ return carrier?.nonce || undefined;
1005
+ };
1006
+
870
1007
  // src/client/prefetch.ts
871
1008
  var PREFETCH_CACHE_LIMIT = 16;
872
1009
  var HOVER_DEBOUNCE_MS = 250;
@@ -1141,7 +1278,7 @@ var speculate = (url) => {
1141
1278
  liveSpeculationRules.get(oldest.value)?.remove();
1142
1279
  liveSpeculationRules.delete(oldest.value);
1143
1280
  }
1144
- const script = document.createElement("script");
1281
+ const script = applyPageNonce(document.createElement("script"));
1145
1282
  script.type = "speculationrules";
1146
1283
  script.textContent = JSON.stringify({
1147
1284
  prerender: [{ eagerness: "immediate", urls: [url] }]
@@ -1160,6 +1297,7 @@ var scheduleHoverPrefetch = (url, options = {}) => {
1160
1297
  prefetch(url, { kind: options.kind ?? "route" });
1161
1298
  if (options.prerender)
1162
1299
  speculate(url);
1300
+ options.onPrefetch?.();
1163
1301
  }, HOVER_DEBOUNCE_MS);
1164
1302
  return {
1165
1303
  cancel: () => window.clearTimeout(timer)
@@ -1174,8 +1312,10 @@ var handleIntersections = (entries) => {
1174
1312
  const target = viewportTargets.get(entry.target);
1175
1313
  viewportObserver?.unobserve(entry.target);
1176
1314
  viewportTargets.delete(entry.target);
1177
- if (target)
1178
- prefetch(target.url, target.options);
1315
+ if (!target)
1316
+ continue;
1317
+ prefetch(target.url, { kind: target.options.kind });
1318
+ target.options.onVisible?.();
1179
1319
  }
1180
1320
  };
1181
1321
  var getViewportObserver = () => {
@@ -1351,5 +1491,5 @@ export {
1351
1491
  usePrefetch
1352
1492
  };
1353
1493
 
1354
- //# debugId=56D3BF5740E6482864756E2164756E21
1494
+ //# debugId=4FB4CF45E57F77C164756E2164756E21
1355
1495
  //# sourceMappingURL=index.js.map