@absolutejs/absolute 0.20.0-beta.171 → 0.20.0-beta.173

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 (65) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +3 -2
  3. package/changelog.json +73 -0
  4. package/dist/angular/browser.js +12 -12
  5. package/dist/angular/browser.js.map +6 -7
  6. package/dist/angular/components/core/streamingSlotRegistrar.js +2 -6
  7. package/dist/angular/components/core/streamingSlotRegistry.js +3 -7
  8. package/dist/angular/components/defer-slot.component.js +12 -7
  9. package/dist/angular/components/stream-slot.component.js +3 -1
  10. package/dist/angular/index.js +40 -13
  11. package/dist/angular/index.js.map +7 -7
  12. package/dist/angular/server.js +39 -12
  13. package/dist/angular/server.js.map +6 -6
  14. package/dist/build/buildWorker.js +135 -57
  15. package/dist/build.js +1183 -1011
  16. package/dist/build.js.map +16 -15
  17. package/dist/cli/config/server.js +43 -12
  18. package/dist/cli/{doctor-repprx92.js → doctor-m36tmx4d.js} +70 -15
  19. package/dist/cli/index.js +2 -2
  20. package/dist/cli/{typecheck-209bemxm.js → typecheck-fag7djt5.js} +21 -6
  21. package/dist/core/streamingSlotRegistrar.js +2 -5
  22. package/dist/core/streamingSlotRegistrar.js.map +4 -5
  23. package/dist/core/streamingSlotRegistry.js +2 -5
  24. package/dist/core/streamingSlotRegistry.js.map +4 -5
  25. package/dist/dev/serverBootstrap.js +2 -1
  26. package/dist/index.js +1116 -940
  27. package/dist/index.js.map +18 -17
  28. package/dist/islands/index.js +2 -2
  29. package/dist/islands/index.js.map +3 -3
  30. package/dist/mobile/browser.js +2 -2
  31. package/dist/mobile/browser.js.map +3 -3
  32. package/dist/mobile/index.js +2 -2
  33. package/dist/mobile/index.js.map +3 -3
  34. package/dist/react/components/index.js +2 -5
  35. package/dist/react/components/index.js.map +5 -6
  36. package/dist/react/index.js +45 -16
  37. package/dist/react/index.js.map +8 -8
  38. package/dist/react/router/browser.js.map +2 -2
  39. package/dist/react/router/index.js.map +2 -2
  40. package/dist/react/server.js +45 -16
  41. package/dist/react/server.js.map +8 -8
  42. package/dist/src/angular/components/defer-slot.component.d.ts +1 -0
  43. package/dist/src/build/missingReactRouter.d.ts +8 -0
  44. package/dist/src/build/vueModuleOutputPath.d.ts +10 -6
  45. package/dist/src/cli/scripts/bunCheck.d.ts +3 -1
  46. package/dist/src/cli/scripts/doctor.d.ts +10 -0
  47. package/dist/src/core/streamingSlotWarningScope.d.ts +3 -0
  48. package/dist/src/dev/hot/reload.d.ts +5 -0
  49. package/dist/src/dev/hot/runtime.d.ts +2 -0
  50. package/dist/src/dev/srcPath.d.ts +2 -1
  51. package/dist/src/react/pageHandler.d.ts +5 -0
  52. package/dist/src/react/router/Link.d.ts +6 -1
  53. package/dist/src/react/serverComponents/pageHandler.d.ts +2 -0
  54. package/dist/src/utils/portInUse.d.ts +16 -0
  55. package/dist/svelte/index.js +39 -12
  56. package/dist/svelte/index.js.map +6 -6
  57. package/dist/svelte/server.js +39 -12
  58. package/dist/svelte/server.js.map +6 -6
  59. package/dist/vue/components/index.js +2 -5
  60. package/dist/vue/components/index.js.map +4 -5
  61. package/dist/vue/index.js +39 -12
  62. package/dist/vue/index.js.map +6 -6
  63. package/dist/vue/server.js +39 -12
  64. package/dist/vue/server.js.map +6 -6
  65. package/package.json +2 -1
package/CHANGELOG.md CHANGED
@@ -6,6 +6,50 @@ This file is generated by `absolute-changelog` from the entries in
6
6
  `changelog/`. Edit an entry, not this file — and add new ones under
7
7
  `changelog/unreleased/`.
8
8
 
9
+ ## 0.20.0-beta.173 — 2026-11-14
10
+
11
+ ### Security
12
+
13
+ - **Island pages no longer expose server file paths in production**
14
+ In production, a React page that rendered an <Island> could put absolute paths from the server’s disk (server-rendered pages, server bundles and static HTML pages) into the manifest it embeds for the browser, exposing the server’s file layout. The manifest embedded in island pages now contains only browser URLs, whichever framework renders the page. No code changes are needed; rebuild and redeploy to pick up the fix.
15
+ - **Vue lazy route components no longer reveal the build machine’s file paths**
16
+ A Vue page that exports `routes` and lazily loads a route component shipped the build machine’s absolute project path to every browser: the lazy component’s file name, and the imports of it in the router page and a shared chunk, read like `vue/client/sources/%2F/home/you/app/src/frontend/vue/components/Lazy.<hash>.js`. Compiled Vue files are now named by their path inside the project, such as `vue/client/sources/src/frontend/vue/components/Lazy.<hash>.js`, in both the browser and the server build. A Vue file outside the project, such as a package in a parent `node_modules` or a sibling workspace, is placed under `_external/` and named only by its path below the folder it shares with the project, or by a hash when that folder is the filesystem root. Rebuild and redeploy to stop serving the old paths.
17
+
18
+ ### Changed
19
+
20
+ - **React pages stream SuspenseSlot and StreamSlot content without opting in** (`handleReactPageRequest`)
21
+ A React page that rendered a `<SuspenseSlot>` or `<StreamSlot>` only streamed when its handler passed `collectStreamingSlots: true`. Without it the slot stayed on its fallback forever, and production logged nothing. `handleReactPageRequest` and the React Server Components page handler now collect streaming slots by default, so the shell arrives first and each slot's content streams in when it resolves. A page that renders no slot gets the same bytes and headers as before, with no measurable extra work. Pass `collectStreamingSlots: false` to turn collection off for a route; a slot rendered there logs a warning naming that option, once per render in development and once per process in production. Svelte, Vue and Angular handlers still need `collectStreamingSlots: true`, and their warning about the missing option now shows in production too.
22
+
23
+ ### Fixed
24
+
25
+ - **Angular `@defer` sections stay on the page after hydration**
26
+ An Angular page with `@defer` blocks streamed its deferred sections correctly, then lost them once the browser hydrated the page, in dev and in production. The browser logged `ReferenceError: process is not defined` from the defer slot, and dev also logged an NG0100 error. The defer slot no longer runs its server-only streaming setup in the browser, and the NODE_ENV check that streaming slots share no longer throws where there is no `process`, which also protects Svelte and Vue streaming slots that reach the browser. Deferred sections now stay resolved after hydration, with no console errors.
27
+ - **Editing a module server.ts imports updates the dev server again**
28
+ In dev, editing a server module that server.ts imports, such as the api.ts a create-absolutejs app passes to .use(), updates the running server in place again: the new route responses are served without a restart, and scopedState keeps every visitor’s state. Before, when the project’s folder path contained "angular" (or "ember"), the edit was mistaken for an Angular component and sent to Angular HMR, or silently dropped when Angular was not configured, and the old response kept being served until dev restarted, even after later server.ts edits. A .ts file outside every configured framework directory is now always treated as server or shared code, and a server.ts edit also applies any imported module whose file changed but whose update never arrived.
29
+ - **Dev serves source files whose paths contain spaces**
30
+ The dev module server now decodes the percent-encoding a browser adds to module URLs. Before, a source file whose path contained a space or another encoded character, such as a project or linked package inside a folder named "Local Documents", was requested as `%20` and answered with a 500, so the page failed to hydrate in `absolute dev`.
31
+ - **absolute doctor reports a busy dev port as in use**
32
+ absolute doctor could say the dev port was free while another server was listening on it, most visibly on macOS, where its process lookup failed silently and found no listeners. It now checks the port directly: it tries to connect over IPv4 and IPv6 loopback and to bind the IPv4 and IPv6 wildcard addresses separately, so a listener on either family or on both is reported as in use. The port it checks is resolved the same way as absolute dev (ABSOLUTE_PORT, then PORT, then dev.port in absolute.config.ts, then the default), and the check also runs when the config file cannot be loaded.
33
+ - **Builds that import react/router without react-router installed explain why, and point to a Link that needs no router**
34
+ Importing `<Link>` from `@absolutejs/absolute/react/router` in a project without the optional `react-router` package failed the build with a bare `Could not resolve: "react-router"`. That entry also exports `<UniversalRouter>`, which is built on react-router, so it does need the package. The build now says so, tells you to install react-router for `<UniversalRouter>`, and points to `import { Link } from '@absolutejs/absolute/react/components'`: the same `<Link>`, with no react-router dependency, whose clicks `enableNavigation()` turns into soft page navigations. A react-router import in your own code without the package installed gets the same advice.
35
+
36
+ ### Internal
37
+
38
+ - **DeferSlotComponent’s declaration gains a private member** (`DeferSlotComponent`)
39
+ The published type declaration of `DeferSlotComponent` lists a new private member, used to tell the server render from the browser. Nothing about how the component is used in templates changed.
40
+
41
+ ## 0.20.0-beta.172 — 2026-11-13
42
+
43
+ ### Changed
44
+
45
+ - **absolute typecheck checks Vue projects with vue-check**
46
+ For a project with Vue, `absolute typecheck` now runs vue-check (`@absolutejs/vue-check`, a dependency of the framework) instead of vue-tsc whenever it runs bun check: the project’s own Vue codegen with Bun’s native checker, reporting the errors vue-tsc reports in a fraction of the time and memory. Its generated TypeScript stays in `.absolutejs/vue-check`. vue-tsc remains the fallback where tsc does: Bun older than 1.4.4, or `ABSOLUTE_TYPECHECK_CHECKER=tsc`.
47
+
48
+ ### Fixed
49
+
50
+ - **absolute typecheck type-checks even when the project has a check script**
51
+ When a project’s package.json has a `check` script, `bun check` runs that script instead of type-checking, so `absolute typecheck` could report a project as checked without checking it. It now always passes `--no-script`, which Bun added in 1.4.4, and so uses bun check from Bun 1.4.4 on (it was 1.4.3). On Bun 1.4.3 it type-checks with tsc, as on older Bun.
52
+
9
53
  ## 0.20.0-beta.171 — 2026-11-13
10
54
 
11
55
  ### Security
package/README.md CHANGED
@@ -165,8 +165,9 @@ the dynamic slots are rendered and streamed into it:
165
165
  />
166
166
  ```
167
167
 
168
- In Svelte, use the `dynamic` prop or `<!-- absolute:stream dynamic -->`. The
169
- page needs `collectStreamingSlots: true`. The shell's page props are captured
168
+ In Svelte, use the `dynamic` prop or `<!-- absolute:stream dynamic -->`. Svelte
169
+ pages need `collectStreamingSlots: true`; React pages collect streaming slots
170
+ by default (pass `collectStreamingSlots: false` to turn it off). The shell's page props are captured
170
171
  at build time, so per-user data belongs in dynamic slots. Works for React
171
172
  and Svelte pages today. See `docs/PARTIAL_PRERENDERING_PLAN.md`.
172
173
 
package/changelog.json CHANGED
@@ -2,6 +2,79 @@
2
2
  "contract": 1,
3
3
  "name": "@absolutejs/absolute",
4
4
  "releases": [
5
+ {
6
+ "changes": [
7
+ {
8
+ "detail": "An Angular page with `@defer` blocks streamed its deferred sections correctly, then lost them once the browser hydrated the page, in dev and in production. The browser logged `ReferenceError: process is not defined` from the defer slot, and dev also logged an NG0100 error. The defer slot no longer runs its server-only streaming setup in the browser, and the NODE_ENV check that streaming slots share no longer throws where there is no `process`, which also protects Svelte and Vue streaming slots that reach the browser. Deferred sections now stay resolved after hydration, with no console errors.",
9
+ "kind": "fixed",
10
+ "summary": "Angular `@defer` sections stay on the page after hydration"
11
+ },
12
+ {
13
+ "detail": "In dev, editing a server module that server.ts imports, such as the api.ts a create-absolutejs app passes to .use(), updates the running server in place again: the new route responses are served without a restart, and scopedState keeps every visitor’s state. Before, when the project’s folder path contained \"angular\" (or \"ember\"), the edit was mistaken for an Angular component and sent to Angular HMR, or silently dropped when Angular was not configured, and the old response kept being served until dev restarted, even after later server.ts edits. A .ts file outside every configured framework directory is now always treated as server or shared code, and a server.ts edit also applies any imported module whose file changed but whose update never arrived.",
14
+ "kind": "fixed",
15
+ "summary": "Editing a module server.ts imports updates the dev server again"
16
+ },
17
+ {
18
+ "detail": "The published type declaration of `DeferSlotComponent` lists a new private member, used to tell the server render from the browser. Nothing about how the component is used in templates changed.",
19
+ "kind": "internal",
20
+ "summary": "DeferSlotComponent’s declaration gains a private member",
21
+ "symbols": [
22
+ "DeferSlotComponent"
23
+ ]
24
+ },
25
+ {
26
+ "detail": "The dev module server now decodes the percent-encoding a browser adds to module URLs. Before, a source file whose path contained a space or another encoded character, such as a project or linked package inside a folder named \"Local Documents\", was requested as `%20` and answered with a 500, so the page failed to hydrate in `absolute dev`.",
27
+ "kind": "fixed",
28
+ "summary": "Dev serves source files whose paths contain spaces"
29
+ },
30
+ {
31
+ "detail": "absolute doctor could say the dev port was free while another server was listening on it, most visibly on macOS, where its process lookup failed silently and found no listeners. It now checks the port directly: it tries to connect over IPv4 and IPv6 loopback and to bind the IPv4 and IPv6 wildcard addresses separately, so a listener on either family or on both is reported as in use. The port it checks is resolved the same way as absolute dev (ABSOLUTE_PORT, then PORT, then dev.port in absolute.config.ts, then the default), and the check also runs when the config file cannot be loaded.",
32
+ "kind": "fixed",
33
+ "summary": "absolute doctor reports a busy dev port as in use"
34
+ },
35
+ {
36
+ "detail": "In production, a React page that rendered an <Island> could put absolute paths from the server’s disk (server-rendered pages, server bundles and static HTML pages) into the manifest it embeds for the browser, exposing the server’s file layout. The manifest embedded in island pages now contains only browser URLs, whichever framework renders the page. No code changes are needed; rebuild and redeploy to pick up the fix.",
37
+ "kind": "security",
38
+ "summary": "Island pages no longer expose server file paths in production"
39
+ },
40
+ {
41
+ "detail": "Importing `<Link>` from `@absolutejs/absolute/react/router` in a project without the optional `react-router` package failed the build with a bare `Could not resolve: \"react-router\"`. That entry also exports `<UniversalRouter>`, which is built on react-router, so it does need the package. The build now says so, tells you to install react-router for `<UniversalRouter>`, and points to `import { Link } from '@absolutejs/absolute/react/components'`: the same `<Link>`, with no react-router dependency, whose clicks `enableNavigation()` turns into soft page navigations. A react-router import in your own code without the package installed gets the same advice.",
42
+ "kind": "fixed",
43
+ "summary": "Builds that import react/router without react-router installed explain why, and point to a Link that needs no router"
44
+ },
45
+ {
46
+ "detail": "A React page that rendered a `<SuspenseSlot>` or `<StreamSlot>` only streamed when its handler passed `collectStreamingSlots: true`. Without it the slot stayed on its fallback forever, and production logged nothing. `handleReactPageRequest` and the React Server Components page handler now collect streaming slots by default, so the shell arrives first and each slot's content streams in when it resolves. A page that renders no slot gets the same bytes and headers as before, with no measurable extra work. Pass `collectStreamingSlots: false` to turn collection off for a route; a slot rendered there logs a warning naming that option, once per render in development and once per process in production. Svelte, Vue and Angular handlers still need `collectStreamingSlots: true`, and their warning about the missing option now shows in production too.",
47
+ "kind": "changed",
48
+ "summary": "React pages stream SuspenseSlot and StreamSlot content without opting in",
49
+ "symbols": [
50
+ "handleReactPageRequest"
51
+ ]
52
+ },
53
+ {
54
+ "detail": "A Vue page that exports `routes` and lazily loads a route component shipped the build machine’s absolute project path to every browser: the lazy component’s file name, and the imports of it in the router page and a shared chunk, read like `vue/client/sources/%2F/home/you/app/src/frontend/vue/components/Lazy.<hash>.js`. Compiled Vue files are now named by their path inside the project, such as `vue/client/sources/src/frontend/vue/components/Lazy.<hash>.js`, in both the browser and the server build. A Vue file outside the project, such as a package in a parent `node_modules` or a sibling workspace, is placed under `_external/` and named only by its path below the folder it shares with the project, or by a hash when that folder is the filesystem root. Rebuild and redeploy to stop serving the old paths.",
55
+ "kind": "security",
56
+ "summary": "Vue lazy route components no longer reveal the build machine’s file paths"
57
+ }
58
+ ],
59
+ "date": "2026-11-14",
60
+ "version": "0.20.0-beta.173"
61
+ },
62
+ {
63
+ "changes": [
64
+ {
65
+ "detail": "When a project’s package.json has a `check` script, `bun check` runs that script instead of type-checking, so `absolute typecheck` could report a project as checked without checking it. It now always passes `--no-script`, which Bun added in 1.4.4, and so uses bun check from Bun 1.4.4 on (it was 1.4.3). On Bun 1.4.3 it type-checks with tsc, as on older Bun.",
66
+ "kind": "fixed",
67
+ "summary": "absolute typecheck type-checks even when the project has a check script"
68
+ },
69
+ {
70
+ "detail": "For a project with Vue, `absolute typecheck` now runs vue-check (`@absolutejs/vue-check`, a dependency of the framework) instead of vue-tsc whenever it runs bun check: the project’s own Vue codegen with Bun’s native checker, reporting the errors vue-tsc reports in a fraction of the time and memory. Its generated TypeScript stays in `.absolutejs/vue-check`. vue-tsc remains the fallback where tsc does: Bun older than 1.4.4, or `ABSOLUTE_TYPECHECK_CHECKER=tsc`.",
71
+ "kind": "changed",
72
+ "summary": "absolute typecheck checks Vue projects with vue-check"
73
+ }
74
+ ],
75
+ "date": "2026-11-13",
76
+ "version": "0.20.0-beta.172"
77
+ },
5
78
  {
6
79
  "changes": [
7
80
  {
@@ -9088,9 +9088,6 @@ var require_cjs = __commonJS(function(exports) {
9088
9088
  } });
9089
9089
  });
9090
9090
 
9091
- // src/utils/runtimeMode.ts
9092
- var ENV_VAR = "NODE_ENV", getNodeEnv = () => process.env[ENV_VAR], isDevelopmentRuntime = () => process.env[ENV_VAR] === "development", isProductionRuntime = () => process.env[ENV_VAR] === "production";
9093
-
9094
9091
  // src/constants.ts
9095
9092
  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;
9096
9093
  var init_constants = __esm(() => {
@@ -9832,9 +9829,10 @@ import {
9832
9829
  ContentChild,
9833
9830
  Input as Input2,
9834
9831
  inject as inject8,
9832
+ PLATFORM_ID,
9835
9833
  signal as signal2
9836
9834
  } from "@angular/core";
9837
- import { NgTemplateOutlet } from "@angular/common";
9835
+ import { isPlatformServer, NgTemplateOutlet } from "@angular/common";
9838
9836
 
9839
9837
  // src/core/streamingSlotRegistrar.ts
9840
9838
  var STREAMING_SLOT_REGISTRAR_KEY = Symbol.for("absolutejs.streamingSlotRegistrar");
@@ -9877,7 +9875,7 @@ var setStreamingSlotWarningController = (controller) => {
9877
9875
  Reflect.set(globalThis, STREAMING_SLOT_WARNING_STORAGE_KEY, controller);
9878
9876
  };
9879
9877
  var warnMissingStreamingSlotCollector = (primitiveName) => {
9880
- if (isProductionRuntime() || isStreamingSlotCollectionActive()) {
9878
+ if (isStreamingSlotCollectionActive()) {
9881
9879
  return;
9882
9880
  }
9883
9881
  getWarningController()?.maybeWarn(primitiveName);
@@ -9936,6 +9934,7 @@ DeferResolvedTemplateDirective = __legacyDecorateClassTS([
9936
9934
  class DeferSlotComponent {
9937
9935
  constructor() {
9938
9936
  this.cdr = inject8(ChangeDetectorRef2);
9937
+ this.isServer = isPlatformServer(inject8(PLATFORM_ID));
9939
9938
  this.runtimeReady = signal2(false);
9940
9939
  this.serverSlotRegistered = false;
9941
9940
  this.id = "";
@@ -9962,7 +9961,8 @@ class DeferSlotComponent {
9962
9961
  const { id } = this;
9963
9962
  if (!id)
9964
9963
  return;
9965
- if (this.registerServerSlot()) {
9964
+ if (this.isServer) {
9965
+ this.registerServerSlot();
9966
9966
  return;
9967
9967
  }
9968
9968
  const absoluteWindow = window;
@@ -9975,10 +9975,10 @@ class DeferSlotComponent {
9975
9975
  };
9976
9976
  }
9977
9977
  ngAfterViewInit() {
9978
- if (this.registerServerSlot())
9979
- return;
9980
- if (typeof window === "undefined")
9978
+ if (this.isServer) {
9979
+ this.registerServerSlot();
9981
9980
  return;
9981
+ }
9982
9982
  requestAnimationFrame(() => {
9983
9983
  this.runtimeReady.set(true);
9984
9984
  this.cdr.markForCheck();
@@ -9987,7 +9987,7 @@ class DeferSlotComponent {
9987
9987
  });
9988
9988
  }
9989
9989
  ngOnDestroy() {
9990
- if (typeof window === "undefined")
9990
+ if (this.isServer)
9991
9991
  return;
9992
9992
  const { id } = this;
9993
9993
  if (!id)
@@ -10261,8 +10261,8 @@ class StreamSlotComponent {
10261
10261
  });
10262
10262
  return;
10263
10263
  }
10264
- warnMissingStreamingSlotCollector("StreamSlot");
10265
10264
  if (typeof window === "undefined") {
10265
+ warnMissingStreamingSlotCollector("StreamSlot");
10266
10266
  this.currentHtml.set(this.sanitizer.bypassSecurityTrustHtml(this.fallbackHtml));
10267
10267
  return;
10268
10268
  }
@@ -10357,5 +10357,5 @@ export {
10357
10357
  withPendingTask
10358
10358
  };
10359
10359
 
10360
- //# debugId=244693C5959A9FB164756E2164756E21
10360
+ //# debugId=51CF21EE181EB84C64756E2164756E21
10361
10361
  //# sourceMappingURL=browser.js.map