@absolutejs/absolute 0.19.0-beta.1074 → 0.19.0-beta.1076

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 (42) hide show
  1. package/dist/angular/browser.js +2 -2
  2. package/dist/angular/browser.js.map +3 -3
  3. package/dist/angular/components/constants.js +10 -0
  4. package/dist/angular/components/core/streamingSlotRegistrar.js +1 -1
  5. package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
  6. package/dist/angular/index.js +6 -4
  7. package/dist/angular/index.js.map +4 -4
  8. package/dist/angular/server.js +6 -4
  9. package/dist/angular/server.js.map +4 -4
  10. package/dist/build.js +6 -4
  11. package/dist/build.js.map +4 -4
  12. package/dist/cli/config/server.js +7 -3
  13. package/dist/cli/index.js +15 -1
  14. package/dist/index.js +23 -4
  15. package/dist/index.js.map +5 -5
  16. package/dist/islands/index.js +2 -2
  17. package/dist/islands/index.js.map +3 -3
  18. package/dist/react/components/index.js +2 -2
  19. package/dist/react/components/index.js.map +3 -3
  20. package/dist/react/index.js +9 -5
  21. package/dist/react/index.js.map +5 -5
  22. package/dist/react/server.js +9 -5
  23. package/dist/react/server.js.map +5 -5
  24. package/dist/src/angular/components/constants.d.ts +2 -0
  25. package/dist/src/constants.d.ts +2 -0
  26. package/dist/src/core/pageResponseCache.d.ts +16 -2
  27. package/dist/src/react/pageHandler.d.ts +5 -0
  28. package/dist/src/svelte/pageHandler.d.ts +5 -0
  29. package/dist/src/vue/pageHandler.d.ts +5 -0
  30. package/dist/svelte/index.js +9 -5
  31. package/dist/svelte/index.js.map +5 -5
  32. package/dist/svelte/server.js +9 -5
  33. package/dist/svelte/server.js.map +5 -5
  34. package/dist/vue/components/Image.js +2 -2
  35. package/dist/vue/components/Image.js.map +3 -3
  36. package/dist/vue/components/index.js +2 -2
  37. package/dist/vue/components/index.js.map +3 -3
  38. package/dist/vue/index.js +9 -5
  39. package/dist/vue/index.js.map +5 -5
  40. package/dist/vue/server.js +9 -5
  41. package/dist/vue/server.js.map +5 -5
  42. package/package.json +1 -1
@@ -75,6 +75,8 @@ export declare const TWO_THIRDS: number;
75
75
  export declare const UNFOUND_INDEX = -1;
76
76
  export declare const WEBSOCKET_NORMAL_CLOSURE = 1000;
77
77
  export declare const DEFAULT_WEBSOCKET_IDLE_TIMEOUT_SECONDS = 240;
78
+ export declare const DEFAULT_HTTP_IDLE_TIMEOUT_SECONDS = 240;
79
+ export declare const MAX_HTTP_IDLE_TIMEOUT_SECONDS = 255;
78
80
  export declare const WORKSPACE_COMMAND_ARGS_OFFSET = 3;
79
81
  export declare const WORKSPACE_FAILURE_LOG_PRINT_LIMIT = 30;
80
82
  export declare const WORKSPACE_FAILURE_RECENT_LOG_LIMIT = 60;
@@ -75,6 +75,8 @@ export declare const TWO_THIRDS: number;
75
75
  export declare const UNFOUND_INDEX = -1;
76
76
  export declare const WEBSOCKET_NORMAL_CLOSURE = 1000;
77
77
  export declare const DEFAULT_WEBSOCKET_IDLE_TIMEOUT_SECONDS = 240;
78
+ export declare const DEFAULT_HTTP_IDLE_TIMEOUT_SECONDS = 240;
79
+ export declare const MAX_HTTP_IDLE_TIMEOUT_SECONDS = 255;
78
80
  export declare const WORKSPACE_COMMAND_ARGS_OFFSET = 3;
79
81
  export declare const WORKSPACE_FAILURE_LOG_PRINT_LIMIT = 30;
80
82
  export declare const WORKSPACE_FAILURE_RECENT_LOG_LIMIT = 60;
@@ -2,8 +2,22 @@ export declare const STREAMING_PAGE_HEADER = "x-absolute-stream";
2
2
  /** Headers for a STREAMING html page response — `text/html` plus the streaming
3
3
  * marker so {@link withPageCacheHeaders} marks it `no-cache` (no ETag). */
4
4
  export declare const streamingPageHeaders: (extra?: HeadersInit) => Headers;
5
+ /** Options for {@link withPageCacheHeaders}. */
6
+ export type PageCacheOptions = {
7
+ /** Opt a *streaming* page into the buffered-ETag path: buffer its whole
8
+ * body before sending so it can carry a content-hash `ETag` and serve a
9
+ * `304` on repeat visits. This trades streaming's fast first byte for the
10
+ * revalidation saving, so only set it on pages whose output is static
11
+ * enough that the 304 is worth losing the stream (e.g. a marketing page).
12
+ * No effect on already-buffered pages — those are ETagged regardless. */
13
+ bufferStreamForEtag?: boolean;
14
+ };
5
15
  /** Apply the SPA cache policy to a page Response. HTML gets `no-cache` (+ a
6
16
  * content-hash `ETag` / `304` for buffered responses); non-HTML responses
7
17
  * (redirects, JSON, etc.) pass through untouched. Safe to call on every page
8
- * handler's final response. */
9
- export declare const withPageCacheHeaders: (response: Response, request?: Request) => Promise<Response>;
18
+ * handler's final response.
19
+ *
20
+ * Streaming pages skip the ETag (their headers flush before the body renders)
21
+ * unless the caller passes `bufferStreamForEtag`, which buffers the stream so
22
+ * it can be hashed — see {@link PageCacheOptions}. */
23
+ export declare const withPageCacheHeaders: (response: Response, request?: Request, options?: PageCacheOptions) => Promise<Response>;
@@ -2,6 +2,11 @@ import type { ComponentType as ReactComponent } from 'react';
2
2
  import { type StreamingSlotEnhancerOptions } from '../core/responseEnhancers';
3
3
  type ReactPageRenderOptions = StreamingSlotEnhancerOptions & {
4
4
  collectStreamingSlots?: boolean;
5
+ /** Buffer this page's stream so it can carry a content-hash `ETag` and
6
+ * serve a `304` on repeat visits, at the cost of streaming's fast first
7
+ * byte. Only worth it on pages static enough that the 304 beats the
8
+ * stream. See {@link PageCacheOptions.bufferStreamForEtag}. */
9
+ bufferStreamForEtag?: boolean;
5
10
  };
6
11
  export type ReactPageRequestInput<Props extends Record<string, unknown> = Record<never, never>> = ReactPageRenderOptions & {
7
12
  Page: ReactComponent<Props>;
@@ -5,6 +5,11 @@ export type SveltePageRenderOptions = {
5
5
  collectStreamingSlots?: boolean;
6
6
  bodyContent?: string;
7
7
  headContent?: string;
8
+ /** Buffer this page's stream so it can carry a content-hash `ETag` and
9
+ * serve a `304` on repeat visits, at the cost of streaming's fast first
10
+ * byte. Only worth it on pages static enough that the 304 beats the
11
+ * stream. See {@link PageCacheOptions.bufferStreamForEtag}. */
12
+ bufferStreamForEtag?: boolean;
8
13
  } & StreamingSlotEnhancerOptions;
9
14
  type HasNoSvelteProps<Props> = [Props] extends [never] ? true : keyof Props extends never ? true : false;
10
15
  export type SveltePageRequestInput<Component extends SvelteComponent<never> = SvelteComponent<Record<never, never>>> = SveltePageRenderOptions & {
@@ -3,6 +3,11 @@ import type { VuePropsOf } from '../../types/vue';
3
3
  import { type StreamingSlotEnhancerOptions } from '../core/responseEnhancers';
4
4
  type VuePageRenderOptions = StreamingSlotEnhancerOptions & {
5
5
  collectStreamingSlots?: boolean;
6
+ /** Buffer this page's stream so it can carry a content-hash `ETag` and
7
+ * serve a `304` on repeat visits, at the cost of streaming's fast first
8
+ * byte. Only worth it on pages static enough that the 304 beats the
9
+ * stream. See {@link PageCacheOptions.bufferStreamForEtag}. */
10
+ bufferStreamForEtag?: boolean;
6
11
  };
7
12
  /** Hydration mode for the page bundle.
8
13
  * - `'auto'` (default): emit `<script>window.__INITIAL_PROPS__=…</script>`
@@ -134,7 +134,7 @@ var resolveExportPath = (entry, conditions) => {
134
134
  var init_resolvePackageImport = () => {};
135
135
 
136
136
  // src/constants.ts
137
- var ANGULAR_INIT_TIMEOUT_MS = 500, ANSI_ESCAPE_CODE = 27, ANSI_ESCAPE_LENGTH = 3, ASCII_SPACE = 32, BASE_36_RADIX = 36, BUN_BUILD_WARNING_SUPPRESSION = "wildcard sideEffects are not supported yet", TAILWIND_BUN_CSS_WARNING_PATTERN, BODY_SLICE_LENGTH = 2000, BYTES_PER_KILOBYTE = 1024, CLI_ARGS_OFFSET = 3, CSS_ERROR_RESOLVE_DELAY_MS = 50, CSS_MAX_CHECK_ATTEMPTS = 10, CSS_MAX_PARSE_TIMEOUT_MS = 500, CSS_SHEET_READY_TIMEOUT_MS = 100, DEFAULT_CHUNK_SIZE = 16384, DEFAULT_DEBOUNCE_MS = 15, DEFAULT_PORT = 3000, DEV_SERVER_RESTART_DEBOUNCE_MS = 100, DOM_UPDATE_DELAY_MS = 50, FILE_PROTOCOL_PREFIX_LENGTH = 7, FOCUS_ID_PREFIX_LENGTH = 3, FOCUS_IDX_PREFIX_LENGTH = 4, FOCUS_NAME_PREFIX_LENGTH = 5, ESLINT_STUDIO_DEFAULT_HOST = "eslint.absolute.localhost", ESLINT_STUDIO_DEFAULT_PORT = 4099, CONFIG_DEFAULT_HOST = "config.absolute.localhost", CONFIG_DEFAULT_PORT = 4099, HMR_UPDATE_TIMEOUT_MS = 2000, HOOK_SIGNATURE_LENGTH = 12, EXCLUDE_LAST_OFFSET = -1, HTTP_STATUS_OK = 200, HTTP_STATUS_BAD_REQUEST = 400, HTTP_STATUS_NOT_FOUND = 404, HOURS_IN_DAY = 24, HOURS_IN_HALF_DAY = 12, IMAGE_DEFAULT_DEVICE_SIZES, IMAGE_DEFAULT_IMAGE_SIZES, IMAGE_DEFAULT_QUALITY = 75, IMAGE_GLOB_SUFFIX_LENGTH = 2, INSTANCE_PROBE_TIMEOUT_MS = 250, MAX_ERROR_LENGTH = 200, MAX_RECONNECT_ATTEMPTS = 60, MILLISECONDS_IN_A_SECOND = 1000, MINUTES_IN_AN_HOUR = 60, SECONDS_IN_A_MINUTE = 60, MILLISECONDS_IN_A_MINUTE, MILLISECONDS_IN_A_DAY, OVERLAY_FADE_DURATION_MS = 150, PING_INTERVAL_MS = 30000, LIST_LOG_TAIL_MAX_BYTES = 65536, LIST_TUI_COLUMN_GAP = 2, LIST_TUI_DEFAULT_HEIGHT = 28, LIST_TUI_DEFAULT_WIDTH = 100, LIST_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, LIST_TUI_FOOTER_LINE_COUNT = 2, LIST_TUI_MARKER_WIDTH = 2, LIST_TUI_MIN_LOG_HEIGHT = 3, LIST_TUI_MIN_URL_WIDTH = 16, LIST_TUI_RENDER_DEBOUNCE_MS = 16, LIST_TUI_STATUS_MESSAGE_TIMEOUT_MS = 4000, LIST_WATCH_REFRESH_MS = 1000, RAF_BATCH_COUNT = 3, RANDOM_ID_END_INDEX = 11, REBUILD_BATCH_DELAY_MS = 10, REBUILD_RELOAD_DELAY_MS = 200, RECONNECT_INITIAL_DELAY_MS = 500, RECONNECT_POLL_INTERVAL_MS = 300, REACT_STREAM_SLOT_FAST_DELAY_MS = 5, REACT_STREAM_SLOT_SLOW_DELAY_MS = 20, SIGINT_EXIT_CODE = 130, SIGTERM_EXIT_CODE = 143, SVELTE_CSS_LOAD_TIMEOUT_MS = 500, TIME_PRECISION = 2, TWO_THIRDS, UNFOUND_INDEX = -1, WEBSOCKET_NORMAL_CLOSURE = 1000, DEFAULT_WEBSOCKET_IDLE_TIMEOUT_SECONDS = 240, 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;
137
+ var ANGULAR_INIT_TIMEOUT_MS = 500, ANSI_ESCAPE_CODE = 27, ANSI_ESCAPE_LENGTH = 3, ASCII_SPACE = 32, BASE_36_RADIX = 36, BUN_BUILD_WARNING_SUPPRESSION = "wildcard sideEffects are not supported yet", TAILWIND_BUN_CSS_WARNING_PATTERN, BODY_SLICE_LENGTH = 2000, BYTES_PER_KILOBYTE = 1024, CLI_ARGS_OFFSET = 3, CSS_ERROR_RESOLVE_DELAY_MS = 50, CSS_MAX_CHECK_ATTEMPTS = 10, CSS_MAX_PARSE_TIMEOUT_MS = 500, CSS_SHEET_READY_TIMEOUT_MS = 100, DEFAULT_CHUNK_SIZE = 16384, DEFAULT_DEBOUNCE_MS = 15, DEFAULT_PORT = 3000, DEV_SERVER_RESTART_DEBOUNCE_MS = 100, DOM_UPDATE_DELAY_MS = 50, FILE_PROTOCOL_PREFIX_LENGTH = 7, FOCUS_ID_PREFIX_LENGTH = 3, FOCUS_IDX_PREFIX_LENGTH = 4, FOCUS_NAME_PREFIX_LENGTH = 5, ESLINT_STUDIO_DEFAULT_HOST = "eslint.absolute.localhost", ESLINT_STUDIO_DEFAULT_PORT = 4099, CONFIG_DEFAULT_HOST = "config.absolute.localhost", CONFIG_DEFAULT_PORT = 4099, HMR_UPDATE_TIMEOUT_MS = 2000, HOOK_SIGNATURE_LENGTH = 12, EXCLUDE_LAST_OFFSET = -1, HTTP_STATUS_OK = 200, HTTP_STATUS_BAD_REQUEST = 400, HTTP_STATUS_NOT_FOUND = 404, HOURS_IN_DAY = 24, HOURS_IN_HALF_DAY = 12, IMAGE_DEFAULT_DEVICE_SIZES, IMAGE_DEFAULT_IMAGE_SIZES, IMAGE_DEFAULT_QUALITY = 75, IMAGE_GLOB_SUFFIX_LENGTH = 2, INSTANCE_PROBE_TIMEOUT_MS = 250, MAX_ERROR_LENGTH = 200, MAX_RECONNECT_ATTEMPTS = 60, MILLISECONDS_IN_A_SECOND = 1000, MINUTES_IN_AN_HOUR = 60, SECONDS_IN_A_MINUTE = 60, MILLISECONDS_IN_A_MINUTE, MILLISECONDS_IN_A_DAY, OVERLAY_FADE_DURATION_MS = 150, PING_INTERVAL_MS = 30000, LIST_LOG_TAIL_MAX_BYTES = 65536, LIST_TUI_COLUMN_GAP = 2, LIST_TUI_DEFAULT_HEIGHT = 28, LIST_TUI_DEFAULT_WIDTH = 100, LIST_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, LIST_TUI_FOOTER_LINE_COUNT = 2, LIST_TUI_MARKER_WIDTH = 2, LIST_TUI_MIN_LOG_HEIGHT = 3, LIST_TUI_MIN_URL_WIDTH = 16, LIST_TUI_RENDER_DEBOUNCE_MS = 16, LIST_TUI_STATUS_MESSAGE_TIMEOUT_MS = 4000, LIST_WATCH_REFRESH_MS = 1000, RAF_BATCH_COUNT = 3, RANDOM_ID_END_INDEX = 11, REBUILD_BATCH_DELAY_MS = 10, REBUILD_RELOAD_DELAY_MS = 200, RECONNECT_INITIAL_DELAY_MS = 500, RECONNECT_POLL_INTERVAL_MS = 300, REACT_STREAM_SLOT_FAST_DELAY_MS = 5, REACT_STREAM_SLOT_SLOW_DELAY_MS = 20, SIGINT_EXIT_CODE = 130, SIGTERM_EXIT_CODE = 143, SVELTE_CSS_LOAD_TIMEOUT_MS = 500, TIME_PRECISION = 2, TWO_THIRDS, UNFOUND_INDEX = -1, WEBSOCKET_NORMAL_CLOSURE = 1000, DEFAULT_WEBSOCKET_IDLE_TIMEOUT_SECONDS = 240, DEFAULT_HTTP_IDLE_TIMEOUT_SECONDS = 240, MAX_HTTP_IDLE_TIMEOUT_SECONDS = 255, WORKSPACE_COMMAND_ARGS_OFFSET = 3, WORKSPACE_FAILURE_LOG_PRINT_LIMIT = 30, WORKSPACE_FAILURE_RECENT_LOG_LIMIT = 60, WORKSPACE_READY_ATTEMPT_TIMEOUT_MS = 5000, WORKSPACE_READY_PROBE_INTERVAL_MS = 250, WORKSPACE_READY_TIMEOUT_MS = 30000, WORKSPACE_SHUTDOWN_TIMEOUT_MS = 1e4, WORKSPACE_TUI_DEFAULT_HEIGHT = 28, WORKSPACE_TUI_DEFAULT_WIDTH = 100, WORKSPACE_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, WORKSPACE_TUI_FOOTER_LINE_COUNT = 3, WORKSPACE_TUI_MIN_LOG_HEIGHT = 3, WORKSPACE_TUI_MIN_SERVICE_NAME_WIDTH = 7, WORKSPACE_TUI_MIN_TARGET_WIDTH = 8, WORKSPACE_TUI_MIN_WRAP_WIDTH = 12, WORKSPACE_TUI_PROMPT_CURSOR_OFFSET = 3, WORKSPACE_TUI_RECENT_LOG_LIMIT = 40, WORKSPACE_TUI_RENDER_DEBOUNCE_MS = 16, WORKSPACE_TUI_STATUS_WIDTH = 10, WORKSPACE_TUI_TARGET_PADDING_WIDTH = 6, WORKSPACE_TUI_VISIBILITY_WIDTH = 8;
138
138
  var init_constants = __esm(() => {
139
139
  TAILWIND_BUN_CSS_WARNING_PATTERN = /invalid @ rule encountered: '@(theme|tailwind|source|utility|variant|custom-variant|apply|reference|plugin|config)'/;
140
140
  IMAGE_DEFAULT_DEVICE_SIZES = [
@@ -1176,11 +1176,12 @@ var STREAMING_PAGE_HEADER = "x-absolute-stream", HTML_CONTENT_TYPE = "text/html"
1176
1176
  headers.set("content-type", HTML_CONTENT_TYPE);
1177
1177
  headers.set(STREAMING_PAGE_HEADER, "1");
1178
1178
  return headers;
1179
- }, computeEtag = (html) => `W/"${createHash2("sha1").update(html).digest("base64url")}"`, withPageCacheHeaders = async (response, request) => {
1179
+ }, computeEtag = (html) => `W/"${createHash2("sha1").update(html).digest("base64url")}"`, withPageCacheHeaders = async (response, request, options) => {
1180
1180
  const contentType = response.headers.get("content-type") ?? "";
1181
1181
  if (!contentType.includes(HTML_CONTENT_TYPE))
1182
1182
  return response;
1183
- if (response.headers.get(STREAMING_PAGE_HEADER) === "1" || !response.body) {
1183
+ const isStreaming = response.headers.get(STREAMING_PAGE_HEADER) === "1";
1184
+ if (isStreaming && !options?.bufferStreamForEtag || !response.body) {
1184
1185
  response.headers.delete(STREAMING_PAGE_HEADER);
1185
1186
  response.headers.set("cache-control", "no-cache");
1186
1187
  return response;
@@ -1194,6 +1195,7 @@ var STREAMING_PAGE_HEADER = "x-absolute-stream", HTML_CONTENT_TYPE = "text/html"
1194
1195
  });
1195
1196
  }
1196
1197
  const headers = new Headers(response.headers);
1198
+ headers.delete(STREAMING_PAGE_HEADER);
1197
1199
  headers.set("cache-control", "no-cache");
1198
1200
  headers.set("etag", etag);
1199
1201
  return new Response(html, {
@@ -4254,7 +4256,9 @@ var handleSveltePageRequest = async (input) => {
4254
4256
  ...resolvedOptions,
4255
4257
  runtimePlacement: resolvedOptions.runtimePlacement ?? "body"
4256
4258
  }) : renderPageResponse(), { handlerCallsite });
4257
- return withPageCacheHeaders(pageResponse, input.request);
4259
+ return withPageCacheHeaders(pageResponse, input.request, {
4260
+ bufferStreamForEtag: input.bufferStreamForEtag
4261
+ });
4258
4262
  } catch (error) {
4259
4263
  console.error("[SSR] Svelte render error:", error);
4260
4264
  const pageName = derivePageName(resolvedPagePath);
@@ -4409,5 +4413,5 @@ export {
4409
4413
  createTypedIsland
4410
4414
  };
4411
4415
 
4412
- //# debugId=B8B5C4E9053927DC64756E2164756E21
4416
+ //# debugId=6FD656B7D1771C9464756E2164756E21
4413
4417
  //# sourceMappingURL=index.js.map