@rebask/core 0.2.1 → 0.4.0

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 (210) hide show
  1. package/dist/components/head.d.ts +2 -11
  2. package/dist/components/head.d.ts.map +1 -1
  3. package/dist/components/head.js +12 -24
  4. package/dist/components/image.d.ts +16 -3
  5. package/dist/components/image.d.ts.map +1 -1
  6. package/dist/components/image.js +50 -68
  7. package/dist/components/link.d.ts.map +1 -1
  8. package/dist/components/link.js +6 -2
  9. package/dist/entry.browser.js +2 -2
  10. package/dist/entry.ssr.d.ts.map +1 -1
  11. package/dist/entry.ssr.js +12 -7
  12. package/dist/handlers/rsc/background-render.js +2 -2
  13. package/dist/handlers/rsc/render-request.js +2 -2
  14. package/dist/handlers/rsc/render-to-response.js +2 -2
  15. package/dist/handlers/rsc/state.d.ts.map +1 -1
  16. package/dist/handlers/rsc/state.js +11 -5
  17. package/dist/lib/client-route-prediction.d.ts +1 -1
  18. package/dist/lib/client-route-prediction.d.ts.map +1 -1
  19. package/dist/lib/client-route-prediction.js +2 -7
  20. package/dist/lib/head/head-manager.d.ts +9 -0
  21. package/dist/lib/head/head-manager.d.ts.map +1 -0
  22. package/dist/lib/head/head-manager.js +98 -0
  23. package/dist/lib/head/head-script.js +8 -13
  24. package/dist/lib/image-optimization/fetch-remote-image.d.ts +17 -0
  25. package/dist/lib/image-optimization/fetch-remote-image.d.ts.map +1 -0
  26. package/dist/lib/image-optimization/fetch-remote-image.js +157 -0
  27. package/dist/lib/image-optimization/get-img-props.d.ts +3 -5
  28. package/dist/lib/image-optimization/get-img-props.d.ts.map +1 -1
  29. package/dist/lib/image-optimization/get-img-props.js +66 -40
  30. package/dist/lib/image-optimization/handler.d.ts +0 -3
  31. package/dist/lib/image-optimization/handler.d.ts.map +1 -1
  32. package/dist/lib/image-optimization/handler.js +339 -124
  33. package/dist/lib/image-optimization/image-config.d.ts +31 -4
  34. package/dist/lib/image-optimization/image-config.d.ts.map +1 -1
  35. package/dist/lib/image-optimization/image-config.js +6 -0
  36. package/dist/lib/image-optimization/image-error.d.ts +8 -0
  37. package/dist/lib/image-optimization/image-error.d.ts.map +1 -0
  38. package/dist/lib/image-optimization/image-error.js +10 -0
  39. package/dist/lib/image-optimization/image-plugin.d.ts +2 -0
  40. package/dist/lib/image-optimization/image-plugin.d.ts.map +1 -1
  41. package/dist/lib/image-optimization/image-plugin.js +36 -16
  42. package/dist/lib/image-optimization/is-private-ip.d.ts +2 -0
  43. package/dist/lib/image-optimization/is-private-ip.d.ts.map +1 -0
  44. package/dist/lib/image-optimization/is-private-ip.js +43 -0
  45. package/dist/lib/image-optimization/match-patterns.d.ts +4 -0
  46. package/dist/lib/image-optimization/match-patterns.d.ts.map +1 -0
  47. package/dist/lib/image-optimization/match-patterns.js +39 -0
  48. package/dist/lib/image-optimization/read-body.d.ts +2 -0
  49. package/dist/lib/image-optimization/read-body.d.ts.map +1 -0
  50. package/dist/lib/image-optimization/read-body.js +27 -0
  51. package/dist/lib/image-optimization/static-image-loader.d.ts +2 -0
  52. package/dist/lib/image-optimization/static-image-loader.d.ts.map +1 -0
  53. package/dist/lib/image-optimization/static-image-loader.js +60 -0
  54. package/dist/lib/plugin-names.d.ts +3 -0
  55. package/dist/lib/plugin-names.d.ts.map +1 -0
  56. package/dist/lib/plugin-names.js +2 -0
  57. package/dist/lib/proxy/build-proxy.d.ts +1 -1
  58. package/dist/lib/proxy/build-proxy.d.ts.map +1 -1
  59. package/dist/lib/proxy/build-proxy.js +4 -11
  60. package/dist/lib/proxy/pattern.d.ts +7 -0
  61. package/dist/lib/proxy/pattern.d.ts.map +1 -0
  62. package/dist/lib/proxy/pattern.js +18 -0
  63. package/dist/lib/proxy/types.d.ts +3 -1
  64. package/dist/lib/proxy/types.d.ts.map +1 -1
  65. package/dist/lib/route-prediction.d.ts.map +1 -1
  66. package/dist/lib/rsc-request.d.ts.map +1 -1
  67. package/dist/lib/rsc-request.js +6 -4
  68. package/dist/lib/server-router/build-entries.d.ts +76 -0
  69. package/dist/lib/server-router/build-entries.d.ts.map +1 -0
  70. package/dist/lib/server-router/build-entries.js +74 -0
  71. package/dist/lib/server-router/get-router.d.ts.map +1 -1
  72. package/dist/lib/server-router/get-router.js +55 -105
  73. package/dist/lib/server-router/rou3.d.ts +20 -0
  74. package/dist/lib/server-router/rou3.d.ts.map +1 -0
  75. package/dist/lib/server-router/rou3.js +55 -0
  76. package/dist/lib/server-router/route-entries.d.ts +16 -0
  77. package/dist/lib/server-router/route-entries.d.ts.map +1 -0
  78. package/dist/lib/server-router/route-entries.js +67 -0
  79. package/dist/lib/server-router/types.d.ts +24 -33
  80. package/dist/lib/server-router/types.d.ts.map +1 -1
  81. package/dist/lib/server-router/types.js +1 -6
  82. package/dist/lib/types.d.ts +2 -2
  83. package/dist/lib/types.d.ts.map +1 -1
  84. package/dist/plugins/prerender.d.ts +3 -4
  85. package/dist/plugins/prerender.d.ts.map +1 -1
  86. package/dist/plugins/prerender.js +31 -0
  87. package/dist/plugins/proxy.d.ts.map +1 -1
  88. package/dist/plugins/proxy.js +7 -1
  89. package/dist/plugins/router/rou3-compiled.d.ts +9 -0
  90. package/dist/plugins/router/rou3-compiled.d.ts.map +1 -0
  91. package/dist/plugins/router/rou3-compiled.js +14 -0
  92. package/dist/plugins/router/rou3-router.d.ts +3 -0
  93. package/dist/plugins/router/rou3-router.d.ts.map +1 -0
  94. package/dist/plugins/router/rou3-router.js +16 -0
  95. package/dist/plugins/router/router-plugin.d.ts +6 -16
  96. package/dist/plugins/router/router-plugin.d.ts.map +1 -1
  97. package/dist/plugins/router/router-plugin.js +43 -22
  98. package/dist/proxy.d.ts +1 -0
  99. package/dist/proxy.d.ts.map +1 -1
  100. package/dist/proxy.js +1 -0
  101. package/dist/request-context.d.ts +0 -2
  102. package/dist/request-context.d.ts.map +1 -1
  103. package/dist/request-context.js +0 -4
  104. package/dist/router.d.ts +1 -1
  105. package/dist/router.d.ts.map +1 -1
  106. package/dist/router.js +4 -4
  107. package/dist/server-router.d.ts +3 -3
  108. package/dist/server-router.d.ts.map +1 -1
  109. package/dist/server-router.js +2 -2
  110. package/dist/vite.d.ts +8 -3
  111. package/dist/vite.d.ts.map +1 -1
  112. package/dist/vite.js +72 -33
  113. package/package.json +6 -4
  114. package/dist/components/error-boundary-client.d.ts +0 -49
  115. package/dist/components/error-boundary-client.d.ts.map +0 -1
  116. package/dist/components/error-boundary-client.js +0 -71
  117. package/dist/components/error-boundary.browser.d.ts +0 -8
  118. package/dist/components/error-boundary.browser.d.ts.map +0 -1
  119. package/dist/components/error-boundary.browser.js +0 -6
  120. package/dist/components/error.d.ts +0 -2
  121. package/dist/components/error.d.ts.map +0 -1
  122. package/dist/components/error.js +0 -5
  123. package/dist/components/not-found-activator.d.ts +0 -11
  124. package/dist/components/not-found-activator.d.ts.map +0 -1
  125. package/dist/components/not-found-activator.js +0 -26
  126. package/dist/components/not-found-boundary-client.d.ts +0 -3
  127. package/dist/components/not-found-boundary-client.d.ts.map +0 -1
  128. package/dist/components/not-found-boundary-client.js +0 -20
  129. package/dist/components/not-found-boundary.browser.d.ts +0 -8
  130. package/dist/components/not-found-boundary.browser.d.ts.map +0 -1
  131. package/dist/components/not-found-boundary.browser.js +0 -4
  132. package/dist/components/not-found-boundary.d.ts +0 -8
  133. package/dist/components/not-found-boundary.d.ts.map +0 -1
  134. package/dist/components/not-found-boundary.js +0 -9
  135. package/dist/components/not-found-thrower.d.ts +0 -2
  136. package/dist/components/not-found-thrower.d.ts.map +0 -1
  137. package/dist/components/not-found-thrower.js +0 -7
  138. package/dist/components/not-found.d.ts +0 -2
  139. package/dist/components/not-found.d.ts.map +0 -1
  140. package/dist/components/not-found.js +0 -5
  141. package/dist/components/status-page.d.ts +0 -6
  142. package/dist/components/status-page.d.ts.map +0 -1
  143. package/dist/components/status-page.js +0 -61
  144. package/dist/handler.d.ts +0 -12
  145. package/dist/handler.d.ts.map +0 -1
  146. package/dist/handler.js +0 -21
  147. package/dist/handlers/rsc/constants.d.ts +0 -3
  148. package/dist/handlers/rsc/constants.d.ts.map +0 -1
  149. package/dist/handlers/rsc/constants.js +0 -2
  150. package/dist/handlers/rsc/create-response.d.ts +0 -3
  151. package/dist/handlers/rsc/create-response.d.ts.map +0 -1
  152. package/dist/handlers/rsc/create-response.js +0 -378
  153. package/dist/handlers/rsc/render-with-retries.d.ts +0 -4
  154. package/dist/handlers/rsc/render-with-retries.d.ts.map +0 -1
  155. package/dist/handlers/rsc/render-with-retries.js +0 -154
  156. package/dist/handlers/rsc/retry-loop.d.ts +0 -3
  157. package/dist/handlers/rsc/retry-loop.d.ts.map +0 -1
  158. package/dist/handlers/rsc/retry-loop.js +0 -145
  159. package/dist/handlers/rsc/stream-rsc-payload.d.ts +0 -9
  160. package/dist/handlers/rsc/stream-rsc-payload.d.ts.map +0 -1
  161. package/dist/handlers/rsc/stream-rsc-payload.js +0 -20
  162. package/dist/handlers/rsc/types.d.ts +0 -26
  163. package/dist/handlers/rsc/types.d.ts.map +0 -1
  164. package/dist/handlers/rsc/types.js +0 -7
  165. package/dist/handlers/rsc.d.ts +0 -20
  166. package/dist/handlers/rsc.d.ts.map +0 -1
  167. package/dist/handlers/rsc.js +0 -872
  168. package/dist/integration.d.ts +0 -14
  169. package/dist/integration.d.ts.map +0 -1
  170. package/dist/integration.js +0 -9
  171. package/dist/lib/dev-module-load-race.d.ts +0 -8
  172. package/dist/lib/dev-module-load-race.d.ts.map +0 -1
  173. package/dist/lib/dev-module-load-race.js +0 -31
  174. package/dist/lib/dev-page-exports.d.ts +0 -5
  175. package/dist/lib/dev-page-exports.d.ts.map +0 -1
  176. package/dist/lib/dev-page-exports.js +0 -14
  177. package/dist/lib/environment-names.d.ts +0 -11
  178. package/dist/lib/environment-names.d.ts.map +0 -1
  179. package/dist/lib/environment-names.js +0 -10
  180. package/dist/lib/initial-hash-scroll.d.ts.map +0 -1
  181. package/dist/lib/not-found.d.ts +0 -5
  182. package/dist/lib/not-found.d.ts.map +0 -1
  183. package/dist/lib/not-found.js +0 -7
  184. package/dist/lib/page-exports.d.ts +0 -9
  185. package/dist/lib/page-exports.d.ts.map +0 -1
  186. package/dist/lib/page-exports.js +0 -47
  187. package/dist/lib/pattern-segments.d.ts +0 -8
  188. package/dist/lib/pattern-segments.d.ts.map +0 -1
  189. package/dist/lib/pattern-segments.js +0 -22
  190. package/dist/lib/ppr/cache-status.d.ts +0 -3
  191. package/dist/lib/ppr/cache-status.d.ts.map +0 -1
  192. package/dist/lib/ppr/cache-status.js +0 -5
  193. package/dist/lib/server-router-contract.d.ts +0 -42
  194. package/dist/lib/server-router-contract.d.ts.map +0 -1
  195. package/dist/lib/server-router-contract.js +0 -6
  196. package/dist/lib/server-router-loader.d.ts +0 -10
  197. package/dist/lib/server-router-loader.d.ts.map +0 -1
  198. package/dist/lib/server-router-loader.js +0 -180
  199. package/dist/lib/server-router.d.ts +0 -8
  200. package/dist/lib/server-router.d.ts.map +0 -1
  201. package/dist/lib/server-router.js +0 -173
  202. package/dist/plugins/ppr-upgrade.d.ts +0 -36
  203. package/dist/plugins/ppr-upgrade.d.ts.map +0 -1
  204. package/dist/plugins/ppr-upgrade.js +0 -32
  205. package/dist/plugins/server-router-fallback.d.ts +0 -15
  206. package/dist/plugins/server-router-fallback.d.ts.map +0 -1
  207. package/dist/plugins/server-router-fallback.js +0 -30
  208. package/dist/server.d.ts +0 -10
  209. package/dist/server.d.ts.map +0 -1
  210. package/dist/server.js +0 -57
@@ -2,9 +2,7 @@ import { type ReactNode } from "react";
2
2
  /**
3
3
  * Head component for managing document head elements with automatic deduplication.
4
4
  *
5
- * Renders tags directly — React 19 hoists them to `<head>`. `HeadScript` then
6
- * deduplicates by keeping the highest `data-order` within each dedupe key
7
- * (title, meta[name], meta[property], meta[http-equiv], canonical link, base).
5
+ * Tags rendered by nested `<Head>` components override their parents.
8
6
  *
9
7
  * @example
10
8
  * ```tsx
@@ -16,12 +14,5 @@ import { type ReactNode } from "react";
16
14
  */
17
15
  export declare function Head({ children }: {
18
16
  children: ReactNode;
19
- }): import("react").JSX.Element;
20
- /**
21
- * Inline script that deduplicates head elements.
22
- * Place this in your layout's <head>.
23
- *
24
- * Keeps only the highest `data-order` element within each dedupe key.
25
- */
26
- export declare function HeadScript(): import("react").JSX.Element;
17
+ }): import("react").JSX.Element | null;
27
18
  //# sourceMappingURL=head.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"head.d.ts","sourceRoot":"","sources":["../../src/components/head.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA2C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AA6B/E;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAoBzD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,gCAEzB"}
1
+ {"version":3,"file":"head.d.ts","sourceRoot":"","sources":["../../src/components/head.tsx"],"names":[],"mappings":"AAEA,OAAO,EAIN,KAAK,SAAS,EAGd,MAAM,OAAO,CAAA;AAoBd;;;;;;;;;;;;GAYG;AACH,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,sCAsBzD"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
3
- import { Children, createElement, isValidElement } from "react";
4
- import headDedupeScript from "virtual:rebask/head-dedupe";
3
+ import { Children, createElement, isValidElement, useId, useLayoutEffect, } from "react";
4
+ import { registerHead, unregisterHead } from "../lib/head/head-manager.js";
5
5
  function parseChildren(children) {
6
6
  const entries = [];
7
7
  for (const child of Children.toArray(children)) {
@@ -11,18 +11,14 @@ function parseChildren(children) {
11
11
  if (!tag)
12
12
  continue;
13
13
  const { children, ...props } = child.props;
14
- const entry = { tag, props, children };
15
- entries.push(entry);
14
+ entries.push({ tag, props, children });
16
15
  }
17
16
  return entries;
18
17
  }
19
- let headOrder = 0;
20
18
  /**
21
19
  * Head component for managing document head elements with automatic deduplication.
22
20
  *
23
- * Renders tags directly — React 19 hoists them to `<head>`. `HeadScript` then
24
- * deduplicates by keeping the highest `data-order` within each dedupe key
25
- * (title, meta[name], meta[property], meta[http-equiv], canonical link, base).
21
+ * Tags rendered by nested `<Head>` components override their parents.
26
22
  *
27
23
  * @example
28
24
  * ```tsx
@@ -34,20 +30,12 @@ let headOrder = 0;
34
30
  */
35
31
  export function Head({ children }) {
36
32
  const entries = parseChildren(children);
37
- // Render tags directly - React 19 hoists them to <head>
38
- // The HeadScript component handles deduplication
39
- return (_jsx(_Fragment, { children: entries.map((entry, i) => createElement(entry.tag, {
40
- key: i,
41
- "data-order": String((headOrder += 1)),
42
- ...entry.props,
43
- }, entry.children)) }));
44
- }
45
- /**
46
- * Inline script that deduplicates head elements.
47
- * Place this in your layout's <head>.
48
- *
49
- * Keeps only the highest `data-order` element within each dedupe key.
50
- */
51
- export function HeadScript() {
52
- return _jsx("script", { dangerouslySetInnerHTML: { __html: headDedupeScript } });
33
+ const id = useId();
34
+ useLayoutEffect(() => {
35
+ registerHead(id, entries);
36
+ });
37
+ useLayoutEffect(() => () => unregisterHead(id), [id]);
38
+ if (typeof window !== "undefined")
39
+ return null;
40
+ return (_jsx(_Fragment, { children: entries.map((entry, i) => createElement(entry.tag, { key: i, ...entry.props, "data-rebask-head": "" }, entry.children)) }));
53
41
  }
@@ -1,7 +1,20 @@
1
- import type { ImageProps } from "../lib/image-optimization/get-img-props.js";
2
- export type { ImageProps } from "../lib/image-optimization/get-img-props.js";
1
+ import type { ImageProps, PlaceholderValue } from "../lib/image-optimization/get-img-props.js";
2
+ export type { ImageProps };
3
3
  /**
4
4
  * The `Image` component is used to optimize images.
5
5
  */
6
- export declare function Image(props: ImageProps): import("react").JSX.Element;
6
+ export declare const Image: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, "alt" | "height" | "loading" | "ref" | "src" | "srcSet" | "width"> & {
7
+ src: string | import("../lib/image-optimization/get-img-props.js").StaticImport;
8
+ alt: string;
9
+ width?: number | `${number}`;
10
+ height?: number | `${number}`;
11
+ fill?: boolean;
12
+ loader?: import("../lib/image-optimization/get-img-props.js").ImageLoader;
13
+ quality?: number | `${number}`;
14
+ preload?: boolean;
15
+ loading?: "eager" | "lazy" | undefined;
16
+ placeholder?: PlaceholderValue;
17
+ blurDataURL?: string;
18
+ unoptimized?: boolean;
19
+ } & import("react").RefAttributes<HTMLImageElement>>;
7
20
  //# sourceMappingURL=image.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/components/image.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACX,UAAU,EAIV,MAAM,4CAA4C,CAAA;AAGnD,YAAY,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAA;AAyO5E;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,+BAyDtC"}
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/components/image.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACX,UAAU,EAGV,gBAAgB,EAChB,MAAM,4CAA4C,CAAA;AAMnD,YAAY,EAAE,UAAU,EAAE,CAAA;AA2O1B;;GAEG;AACH,eAAO,MAAM,KAAK;;;;;;;;;;;;;oDA0ChB,CAAA"}
@@ -1,36 +1,34 @@
1
1
  "use client";
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
- import { useCallback, useEffect, useMemo, useRef, useState } from "react";
3
+ import { forwardRef, useCallback, useEffect, useRef, useState } from "react";
4
4
  import ReactDOM from "react-dom";
5
5
  import { getImgProps } from "../lib/image-optimization/get-img-props.js";
6
6
  import { imageConfigDefault } from "../lib/image-optimization/image-config.js";
7
7
  import { warnOnce } from "../lib/image-optimization/warn-once.js";
8
- // Get image config from injected global (via Vite define) or default.
9
8
  // Vite replaces __REBASK_IMAGE_OPTS at build time.
10
9
  function getImageConfig() {
11
10
  try {
12
- // @ts-expect-error - __REBASK_IMAGE_OPTS is injected at build time by Vite
13
- const configEnv = __REBASK_IMAGE_OPTS;
14
- if (configEnv && typeof configEnv === "string") {
15
- return JSON.parse(configEnv);
16
- }
11
+ // @ts-expect-error - injected at build time by Vite
12
+ return JSON.parse(__REBASK_IMAGE_OPTS);
17
13
  }
18
14
  catch {
19
- // __REBASK_IMAGE_OPTS not defined (plugin not configured), fall through to default
15
+ return imageConfigDefault;
20
16
  }
21
- return imageConfigDefault;
22
17
  }
18
+ const config = getImageConfig();
19
+ const VALID_POSITIONS = ["absolute", "fixed", "relative"];
23
20
  // See https://stackoverflow.com/q/39777833/266535 for why we use this ref
24
21
  // handler instead of the img's onLoad attribute.
25
- function handleLoading(img, placeholder, onLoadRef, setBlurComplete, unoptimized, sizesInput) {
26
- const src = img?.src;
27
- if (!img || img["data-loaded-src"] === src) {
22
+ function handleLoading(img, placeholder, onLoadRef, setBlurComplete, unoptimized, sizesInput, fill) {
23
+ const src = img.src;
24
+ if (img["data-loaded-src"] === src)
28
25
  return;
29
- }
30
26
  img["data-loaded-src"] = src;
31
- const p = "decode" in img ? img.decode() : Promise.resolve();
32
- p.catch(() => { }).then(() => {
33
- if (!img.parentElement || !img.isConnected) {
27
+ img
28
+ .decode()
29
+ .catch(() => { })
30
+ .then(() => {
31
+ if (!img.isConnected) {
34
32
  // Exit early in case of race condition:
35
33
  // - onload() is called
36
34
  // - decode() is called but incomplete
@@ -41,26 +39,21 @@ function handleLoading(img, placeholder, onLoadRef, setBlurComplete, unoptimized
41
39
  if (placeholder !== "empty") {
42
40
  setBlurComplete(true);
43
41
  }
44
- if (onLoadRef?.current) {
42
+ if (onLoadRef.current) {
45
43
  // Since we don't have the SyntheticEvent here,
46
44
  // we must create one with the same shape.
47
45
  // See https://reactjs.org/docs/events.html
48
46
  const event = new Event("load");
49
47
  Object.defineProperty(event, "target", { writable: false, value: img });
50
- let prevented = false;
51
48
  let stopped = false;
52
49
  onLoadRef.current({
53
- ...event,
54
50
  nativeEvent: event,
55
51
  currentTarget: img,
56
52
  target: img,
57
- isDefaultPrevented: () => prevented,
53
+ isDefaultPrevented: () => event.defaultPrevented,
58
54
  isPropagationStopped: () => stopped,
59
55
  persist: () => { },
60
- preventDefault: () => {
61
- prevented = true;
62
- event.preventDefault();
63
- },
56
+ preventDefault: () => event.preventDefault(),
64
57
  stopPropagation: () => {
65
58
  stopped = true;
66
59
  event.stopPropagation();
@@ -69,7 +62,7 @@ function handleLoading(img, placeholder, onLoadRef, setBlurComplete, unoptimized
69
62
  }
70
63
  if (import.meta.env.DEV) {
71
64
  const origSrc = new URL(src, "http://n").searchParams.get("url") || src;
72
- if (img.getAttribute("data-nimg") === "fill") {
65
+ if (fill) {
73
66
  if (!unoptimized && (!sizesInput || sizesInput === "100vw")) {
74
67
  const widthViewportRatio = img.getBoundingClientRect().width / window.innerWidth;
75
68
  if (widthViewportRatio < 0.6) {
@@ -83,9 +76,8 @@ function handleLoading(img, placeholder, onLoadRef, setBlurComplete, unoptimized
83
76
  }
84
77
  if (img.parentElement) {
85
78
  const { position } = window.getComputedStyle(img.parentElement);
86
- const valid = ["absolute", "fixed", "relative"];
87
- if (!valid.includes(position)) {
88
- warnOnce(`Image with src "${origSrc}" has "fill" and parent element with invalid "position". Provided "${position}" should be one of ${valid.map(String).join(",")}.`);
79
+ if (!VALID_POSITIONS.includes(position)) {
80
+ warnOnce(`Image with src "${origSrc}" has "fill" and parent element with invalid "position". Provided "${position}" should be one of ${VALID_POSITIONS.join(",")}.`);
89
81
  }
90
82
  }
91
83
  if (img.height === 0) {
@@ -94,21 +86,27 @@ function handleLoading(img, placeholder, onLoadRef, setBlurComplete, unoptimized
94
86
  }
95
87
  const heightModified = img.height.toString() !== img.getAttribute("height");
96
88
  const widthModified = img.width.toString() !== img.getAttribute("width");
97
- if ((heightModified && !widthModified) || (!heightModified && widthModified)) {
89
+ if (heightModified !== widthModified) {
98
90
  warnOnce(`Image with src "${origSrc}" has either width or height modified, but not the other. If you use CSS to change the size of your image, also include the styles 'width: "auto"' or 'height: "auto"' to maintain the aspect ratio.`);
99
91
  }
100
92
  }
101
93
  });
102
94
  }
103
- function getDynamicProps(fetchPriority) {
104
- // React 19 always uses camelCase
105
- return { fetchPriority };
106
- }
107
- function ImageElement({ src, srcSet, sizes, height, width, decoding, className, style, fetchPriority, placeholder, loading, unoptimized, fill: _fill, onLoadRef, setBlurComplete, setShowAltText, sizesInput, onLoad: _onLoad, onError, ...rest }) {
108
- const ownRef = useCallback((img) => {
109
- if (!img) {
110
- return;
95
+ function ImageElement({ src, srcSet, sizes, height, width, decoding, className, style, fetchPriority, placeholder, loading, unoptimized, fill, onLoadRef, setBlurComplete, setShowAltText, sizesInput, forwardedRef, onError, ...rest }) {
96
+ const imgRef = useRef(null);
97
+ const setRef = useCallback((img) => {
98
+ imgRef.current = img;
99
+ if (typeof forwardedRef === "function") {
100
+ forwardedRef(img);
101
+ }
102
+ else if (forwardedRef) {
103
+ forwardedRef.current = img;
111
104
  }
105
+ }, [forwardedRef]);
106
+ useEffect(() => {
107
+ const img = imgRef.current;
108
+ if (!img)
109
+ return;
112
110
  if (onError) {
113
111
  // If the image has an error before react hydrates, then the error is lost.
114
112
  // The workaround is to wait until the image is mounted which is after hydration,
@@ -121,15 +119,15 @@ function ImageElement({ src, srcSet, sizes, height, width, decoding, className,
121
119
  if (!src) {
122
120
  console.error(`Image is missing required "src" property:`, img);
123
121
  }
124
- if (img.getAttribute("alt") === null) {
122
+ if (!img.hasAttribute("alt")) {
125
123
  console.error(`Image is missing required "alt" property. Please add Alternative Text to describe the image for screen readers and search engines.`);
126
124
  }
127
125
  }
128
126
  if (img.complete) {
129
- handleLoading(img, placeholder, onLoadRef, setBlurComplete, unoptimized, sizesInput);
127
+ handleLoading(img, placeholder, onLoadRef, setBlurComplete, unoptimized, sizesInput, fill);
130
128
  }
131
- }, [src, placeholder, onLoadRef, setBlurComplete, onError, unoptimized, sizesInput]);
132
- return (_jsx("img", { ...rest, ...getDynamicProps(fetchPriority), alt: rest.alt,
129
+ }, []);
130
+ return (_jsx("img", { ...rest, fetchPriority: fetchPriority,
133
131
  // It's intended to keep `loading` before `src` because React updates
134
132
  // props in order which causes Safari/Firefox to not lazy load properly.
135
133
  // See https://github.com/facebook/react/issues/25883
@@ -140,9 +138,9 @@ function ImageElement({ src, srcSet, sizes, height, width, decoding, className,
140
138
  // updated by React. That causes multiple unnecessary requests if `srcSet`
141
139
  // and `sizes` are defined.
142
140
  // This bug cannot be reproduced in Chrome or Firefox.
143
- sizes: sizes, srcSet: srcSet, src: src, ref: ownRef, onLoad: (event) => {
141
+ sizes: sizes, srcSet: srcSet, src: src, ref: setRef, onLoad: (event) => {
144
142
  const img = event.currentTarget;
145
- handleLoading(img, placeholder, onLoadRef, setBlurComplete, unoptimized, sizesInput);
143
+ handleLoading(img, placeholder, onLoadRef, setBlurComplete, unoptimized, sizesInput, fill);
146
144
  }, onError: (event) => {
147
145
  // if the real image fails to load, this will ensure "alt" is visible
148
146
  setShowAltText(true);
@@ -158,7 +156,7 @@ function ImageElement({ src, srcSet, sizes, height, width, decoding, className,
158
156
  /**
159
157
  * The `Image` component is used to optimize images.
160
158
  */
161
- export function Image(props) {
159
+ export const Image = forwardRef(function Image(props, forwardedRef) {
162
160
  const { onLoad } = props;
163
161
  const onLoadRef = useRef(onLoad);
164
162
  useEffect(() => {
@@ -166,37 +164,21 @@ export function Image(props) {
166
164
  }, [onLoad]);
167
165
  const [blurComplete, setBlurComplete] = useState(false);
168
166
  const [showAltText, setShowAltText] = useState(false);
169
- const config = useMemo(() => getImageConfig(), []);
170
167
  const { props: imgAttributes, meta: imgMeta } = getImgProps(props, {
171
168
  imgConf: config,
172
169
  blurComplete,
173
170
  showAltText,
174
171
  });
175
- const { sizes, crossOrigin, referrerPolicy, fetchPriority } = imgAttributes;
176
- // Add preload for priority images
177
- useEffect(() => {
178
- if (!imgMeta.preload)
179
- return;
172
+ if (imgMeta.preload) {
173
+ const { sizes, crossOrigin, referrerPolicy, fetchPriority } = imgAttributes;
180
174
  ReactDOM.preload(imgAttributes.src, {
181
175
  as: "image",
182
176
  imageSrcSet: imgAttributes.srcSet,
183
177
  imageSizes: sizes,
184
- crossOrigin: crossOrigin,
185
- referrerPolicy: referrerPolicy,
186
- ...(fetchPriority
187
- ? {
188
- fetchPriority: fetchPriority,
189
- }
190
- : {}),
178
+ crossOrigin,
179
+ referrerPolicy,
180
+ fetchPriority,
191
181
  });
192
- }, [
193
- imgMeta.preload,
194
- imgAttributes.src,
195
- imgAttributes.srcSet,
196
- sizes,
197
- crossOrigin,
198
- referrerPolicy,
199
- fetchPriority,
200
- ]);
201
- return (_jsx(ImageElement, { ...imgAttributes, unoptimized: imgMeta.unoptimized, placeholder: imgMeta.placeholder, fill: imgMeta.fill, onLoadRef: onLoadRef, setBlurComplete: setBlurComplete, setShowAltText: setShowAltText, sizesInput: props.sizes }));
202
- }
182
+ }
183
+ return (_jsx(ImageElement, { ...imgAttributes, unoptimized: imgMeta.unoptimized, placeholder: imgMeta.placeholder, fill: imgMeta.fill, onLoadRef: onLoadRef, setBlurComplete: setBlurComplete, setShowAltText: setShowAltText, sizesInput: props.sizes, forwardedRef: forwardedRef }));
184
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/components/link.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAO,MAAM,OAAO,CAAA;AAEvD,OAAO,EAKN,KAAK,aAAa,EAClB,MAAM,0BAA0B,CAAA;AAIjC,MAAM,WAAW,SAAU,SAAQ,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,aAAa;IACzF,IAAI,EAAE,MAAM,CAAA;IACZ,qEAAqE;IACrE,MAAM,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,+BA2GjF"}
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/components/link.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAO,MAAM,OAAO,CAAA;AAEvD,OAAO,EAKN,KAAK,aAAa,EAClB,MAAM,0BAA0B,CAAA;AAIjC,MAAM,WAAW,SAAU,SAAQ,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,aAAa;IACzF,IAAI,EAAE,MAAM,CAAA;IACZ,qEAAqE;IACrE,MAAM,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,+BA6GjF"}
@@ -56,8 +56,12 @@ export function Link({ href, prefetch, scroll, onClick, ref, ...props }) {
56
56
  }
57
57
  return listenLinkViewport(link, onPrefetchStatic);
58
58
  }, [router, prefetch]);
59
- // Prefetch this link again after an invalidation
60
- useOnCacheInvalidation(prefetchLink);
59
+ useOnCacheInvalidation((invalidation) => {
60
+ // Path invalidations already refresh active segments and links re-check on intent. Tags can
61
+ // affect any link's data, so only tags need this eager pass.
62
+ if (invalidation.tags.length > 0)
63
+ prefetchLink();
64
+ });
61
65
  // The persistent observer only fires on intersection changes, so a link that stays in view across
62
66
  // a navigation keeps a dropped shell otherwise.
63
67
  useEffect(prefetchLink, [router, prefetch, pathname]);
@@ -12,7 +12,7 @@ import { HandledDeploymentMismatch, isRebaskServerError, ServerFunctionError, }
12
12
  import { REBASK_ACTION_HEADER } from "./lib/ppr/headers.js";
13
13
  import { RouterCache } from "./lib/router-cache.js";
14
14
  import { initializeScrollHandling } from "./lib/scroll.js";
15
- import { proxyPatternsAtom } from "./router.js";
15
+ import { proxyRegexpsAtom } from "./router.js";
16
16
  async function main() {
17
17
  const [payload, route] = await Promise.all([
18
18
  createFromReadableStream(rscStream),
@@ -32,7 +32,7 @@ async function main() {
32
32
  // the server (through `useRouter`) and break the build.
33
33
  createFromFetch,
34
34
  });
35
- proxyPatternsAtom.set(payload.proxyPatterns);
35
+ proxyRegexpsAtom.set(payload.proxyRegexps);
36
36
  if (payload.routePrediction) {
37
37
  learnRoutePrediction(routeTreeResponse);
38
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"entry.ssr.d.ts","sourceRoot":"","sources":["../src/entry.ssr.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAoB,MAAM,kBAAkB,CAAA;AAMxE,OAAO,EAAE,KAAK,aAAa,EAAyC,MAAM,yBAAyB,CAAA;AAInG,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAgFtD,wBAAsB,cAAc,CACnC,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC,EACrC,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,MAAM,wBAwBX;AAED,2DAA2D;AAC3D,wBAAsB,UAAU,CAC/B,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC,EACrC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,aAAa,CAAA;CAAE,gCAW7D;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAClC,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC,EACrC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE;IACR,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,KAAK,EAAE,aAAa,CAAA;IACpB,sFAAsF;IACtF,OAAO,CAAC,EAAE,OAAO,CAAA;CACjB;;;;;;GAsCD;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC/B,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC,EACrC,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE;IAAE,KAAK,EAAE,aAAa,CAAA;CAAE,GAC/B,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAUrC"}
1
+ {"version":3,"file":"entry.ssr.d.ts","sourceRoot":"","sources":["../src/entry.ssr.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAoB,MAAM,kBAAkB,CAAA;AAOxE,OAAO,EAAE,KAAK,aAAa,EAAyC,MAAM,yBAAyB,CAAA;AAInG,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AA8FtD,wBAAsB,cAAc,CACnC,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC,EACrC,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,MAAM,wBAwBX;AAED,2DAA2D;AAC3D,wBAAsB,UAAU,CAC/B,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC,EACrC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,aAAa,CAAA;CAAE,gCAU7D;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAClC,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC,EACrC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE;IACR,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,KAAK,EAAE,aAAa,CAAA;IACpB,sFAAsF;IACtF,OAAO,CAAC,EAAE,OAAO,CAAA;CACjB;;;;;;GAmCD;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC/B,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC,EACrC,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE;IAAE,KAAK,EAAE,aAAa,CAAA;CAAE,GAC/B,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAUrC"}
package/dist/entry.ssr.js CHANGED
@@ -3,6 +3,7 @@ import { createFromReadableStream } from "@vitejs/plugin-rsc/ssr";
3
3
  import { renderToReadableStream, resume } from "react-dom/server.edge";
4
4
  import { prerender } from "react-dom/static.edge";
5
5
  import { injectRSCPayload } from "rsc-html-stream/server";
6
+ import headDedupeScript from "virtual:rebask/head-dedupe";
6
7
  import { AppRoot } from "./components/app-root.js";
7
8
  import { Delay } from "./components/delay.js";
8
9
  import { waitForRunnerIdle } from "./lib/dev-server.js";
@@ -26,8 +27,15 @@ function handleSSRError(error, logError = true) {
26
27
  console.error(error);
27
28
  }
28
29
  let bootstrapScriptContentPromise = null;
29
- function getBootstrapScriptContent() {
30
- return (bootstrapScriptContentPromise ??= import.meta.viteRsc.loadBootstrapScriptContent("index"));
30
+ function versionScript() {
31
+ return `self.__REBASK__={version:${JSON.stringify(__REBASK_VERSION__)}}`;
32
+ }
33
+ async function getBootstrapScriptContent(route) {
34
+ const scripts = [versionScript(), headDedupeScript];
35
+ if (route)
36
+ scripts.push(documentRouteScript(route));
37
+ scripts.push(await (bootstrapScriptContentPromise ??= import.meta.viteRsc.loadBootstrapScriptContent("index")));
38
+ return scripts.join(";");
31
39
  }
32
40
  function SsrRoot({ cache, onShell }) {
33
41
  return (_jsx(AppRoot, { cache: cache, trailing: _jsx(Delay, { promise: new Promise((resolve) => {
@@ -90,7 +98,7 @@ export async function getRouterCache(rscStream, routeTree, url) {
90
98
  export async function renderHTML(rscStream, cache, options) {
91
99
  const htmlStream = await renderToReadableStream(_jsx(SsrRoot, { cache: cache }), {
92
100
  // The document route must be available before hydration starts.
93
- bootstrapScriptContent: documentRouteScript(options.route) + ";" + (await getBootstrapScriptContent()),
101
+ bootstrapScriptContent: await getBootstrapScriptContent(options.route),
94
102
  formState: options.formState,
95
103
  onError: (error) => handleSSRError(error),
96
104
  });
@@ -107,12 +115,9 @@ export async function prerenderHTML(rscStream, cache, options) {
107
115
  const { signal, onShell, renderToCompletion, route, isShell } = options;
108
116
  // Start prerender - this blocks until abort or completion.
109
117
  const result = await MicrotaskStorage.run({ pending: 0, subs: new Set() }, async () => {
110
- const bootstrapScriptContent = await getBootstrapScriptContent();
111
118
  const prerenderOptions = {
112
119
  signal,
113
- bootstrapScriptContent: isShell
114
- ? bootstrapScriptContent
115
- : documentRouteScript(route) + ";" + bootstrapScriptContent,
120
+ bootstrapScriptContent: await getBootstrapScriptContent(isShell ? undefined : route),
116
121
  onError: (error) => handleSSRError(error, false),
117
122
  };
118
123
  // `Number.MAX_SAFE_INTEGER` keeps Fizz from flushing partial chunks so resolved Suspense
@@ -1,4 +1,4 @@
1
- import { proxyPatterns } from "virtual:rebask/proxy-router";
1
+ import { proxyRegexps } from "virtual:rebask/proxy-router";
2
2
  import { scheduleBackgroundRevalidation } from "../../lib/background-revalidation.js";
3
3
  import { createResumeState, serializeResumeState } from "../../lib/ppr/postponed-state.js";
4
4
  import { maybeAbort, RenderStorage } from "../../lib/render-context.js";
@@ -22,7 +22,7 @@ async function createRscStream(state) {
22
22
  const bgRscStream = renderRsc({
23
23
  seedData: state.seedData,
24
24
  ...(state.routePrediction && { routePrediction: state.routePrediction }),
25
- ...(proxyPatterns && { proxyPatterns }),
25
+ ...(proxyRegexps && { proxyRegexps }),
26
26
  }, { temporaryReferences: state.postBody.temporaryReferences });
27
27
  const [bgRscStream1, bgRscStream2] = bgRscStream.tee();
28
28
  const routerCache = await state.ssrEntryModule.getRouterCache(bgRscStream1, state.routeTree, state.url.href);
@@ -1,5 +1,5 @@
1
1
  import { hooks, hooksOptions } from "virtual:rebask/hooks";
2
- import { proxyPatterns } from "virtual:rebask/proxy-router";
2
+ import { proxyRegexps } from "virtual:rebask/proxy-router";
3
3
  import { ResumeMode } from "../../lib/ppr/types.js";
4
4
  import { prerenderPaths } from "../../lib/prerender-paths.js";
5
5
  import { renderPageSegment, renderRouteSegments } from "../../lib/route-renderer.js";
@@ -102,7 +102,7 @@ export async function renderRequest(state, cacheContext) {
102
102
  : {
103
103
  seedData,
104
104
  ...(state.routePrediction && { routePrediction: state.routePrediction }),
105
- ...(proxyPatterns && { proxyPatterns }),
105
+ ...(proxyRegexps && { proxyRegexps }),
106
106
  ...(formState !== undefined && { formState }),
107
107
  // The built-in error route is only ever rendered after a failed shell.
108
108
  ...(state.isErrorRoute && { shellError: true }),
@@ -1,5 +1,5 @@
1
1
  import { pprConfig, rscPathSuffix } from "virtual:rebask/ppr-config";
2
- import { proxyPatterns } from "virtual:rebask/proxy-router";
2
+ import { proxyRegexps } from "virtual:rebask/proxy-router";
3
3
  import { scheduleBackgroundRevalidation } from "../../lib/background-revalidation.js";
4
4
  import {} from "../../lib/cache-context.js";
5
5
  import { CacheKeyTag } from "../../lib/cache-key-tags.js";
@@ -250,7 +250,7 @@ async function renderResumeStream(state, postponed) {
250
250
  const rscStream = renderRsc({
251
251
  seedData,
252
252
  ...(state.routePrediction && { routePrediction: state.routePrediction }),
253
- ...(proxyPatterns && { proxyPatterns }),
253
+ ...(proxyRegexps && { proxyRegexps }),
254
254
  ...(state.postBody.formState && { formState: state.postBody.formState }),
255
255
  }, { temporaryReferences: state.postBody.temporaryReferences }, () => markRenderError());
256
256
  const [serverStream, browserStream] = rscStream.tee();
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/handlers/rsc/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/handlers/rsc/state.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { pprConfig } from "virtual:rebask/ppr-config";
2
2
  import { pageModules } from "../../lib/app-manifest.js";
3
3
  import { REBASK_TREE_HEADER } from "../../lib/ppr/headers.js";
4
+ import { getPrerenderParams } from "../../lib/prerender-params.js";
4
5
  import { prerenderPaths } from "../../lib/prerender-paths.js";
5
6
  import { getDynamicSegmentNames } from "../../lib/route-matcher.js";
6
7
  import { buildRouteTree } from "../../lib/route-tree.js";
@@ -31,9 +32,17 @@ export async function buildRenderRequestState(request, route, params, handleOpti
31
32
  // (catch-all) prediction would only teach clients to prefetch 404s and shadow real sibling
32
33
  // routes. Suppress it.
33
34
  const canPredict = isPageRoute && !isNotFound;
35
+ const dynamicSegmentNames = getDynamicSegmentNames(route.segments);
36
+ const isDynamicRoute = dynamicSegmentNames.length > 0;
37
+ const fullParamsSet = new Set(dynamicSegmentNames);
34
38
  // A route with `allowExtraParams: false` has only fixed paths, so params resolve and
35
- // `routeParams()` is not dynamic IO.
36
- const isStaticOnly = isPageRoute && (await prerenderPaths.isStaticOnly(route));
39
+ // `routeParams()` is not dynamic IO. During build prerendering this reads `prerenderParams()`
40
+ // because the manifest is written after rendering; at runtime it reads the manifest.
41
+ const isStaticOnly = isPageRoute &&
42
+ isDynamicRoute &&
43
+ (handleOptions?.isBuildPrerender
44
+ ? (await getPrerenderParams(route))?.allowExtraParams === false
45
+ : await prerenderPaths.isStaticOnly(route));
37
46
  const routePrediction = canPredict ? await getRoutePrediction(route, isStaticOnly) : undefined;
38
47
  const isBotRequest = __REBASK_FULL_HTML_FOR_BOTS &&
39
48
  isHtmlRequest &&
@@ -42,9 +51,6 @@ export async function buildRenderRequestState(request, route, params, handleOpti
42
51
  const isBuildPrerender = handleOptions?.isBuildPrerender ?? false;
43
52
  const shouldPrerender = !isBotRequest && isHtmlRequest;
44
53
  const isStaticGen = import.meta.env.PROD && !isPost;
45
- const dynamicSegmentNames = getDynamicSegmentNames(route.segments);
46
- const isDynamicRoute = dynamicSegmentNames.length > 0;
47
- const fullParamsSet = new Set(dynamicSegmentNames);
48
54
  const fillHeader = pprConfig && request.headers.get(pprConfig.fillHeader);
49
55
  const isHtmlFillRequest = !isResumeRequest && fillHeader === "html";
50
56
  const isRscFillRequest = fillHeader === "rsc" && isPageRoute && !isPost;
@@ -35,6 +35,6 @@ export declare function getRoutePathInfo(pathname: string): {
35
35
  staticOnly: boolean;
36
36
  hasDynamicIO: HasDynamicIO | undefined;
37
37
  };
38
- export declare function predictRouteTree(url: string, proxyPatterns?: string[]): RouteTreeResponse | undefined;
38
+ export declare function predictRouteTree(url: string, proxyRegexps?: string[]): RouteTreeResponse | undefined;
39
39
  export {};
40
40
  //# sourceMappingURL=client-route-prediction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-route-prediction.d.ts","sourceRoot":"","sources":["../../src/lib/client-route-prediction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtF,OAAO,EAEN,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,mBAAmB,CAAA;AAEpE,UAAU,sBAAsB;IAC/B,IAAI,EAAE,SAAS,CAAA;IACf,UAAU,EAAE,eAAe,CAAA;IAC3B,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,8FAA8F;IAC9F,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACxC;;;;OAIG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;QAAC,EAAE,EAAE,YAAY,CAAA;KAAE,CAAC,CAAA;IACtE,qDAAqD;IACrD,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,qEAAqE;IACrE,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACzB,MAAM,EAAE,OAAO,CAAA;CACf;AAED,eAAO,MAAM,kBAAkB,qCAA4C,CAAA;AAE3E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAMpE;AA4FD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAkCtE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACnD,UAAU,EAAE,OAAO,CAAA;IACnB,YAAY,EAAE,YAAY,GAAG,SAAS,CAAA;CACtC,CA4BA;AAED,wBAAgB,gBAAgB,CAC/B,GAAG,EAAE,MAAM,EACX,aAAa,CAAC,EAAE,MAAM,EAAE,GACtB,iBAAiB,GAAG,SAAS,CA0B/B"}
1
+ {"version":3,"file":"client-route-prediction.d.ts","sourceRoot":"","sources":["../../src/lib/client-route-prediction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtF,OAAO,EAEN,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,mBAAmB,CAAA;AAEpE,UAAU,sBAAsB;IAC/B,IAAI,EAAE,SAAS,CAAA;IACf,UAAU,EAAE,eAAe,CAAA;IAC3B,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,8FAA8F;IAC9F,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACxC;;;;OAIG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;QAAC,EAAE,EAAE,YAAY,CAAA;KAAE,CAAC,CAAA;IACtE,qDAAqD;IACrD,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,qEAAqE;IACrE,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACzB,MAAM,EAAE,OAAO,CAAA;CACf;AAED,eAAO,MAAM,kBAAkB,qCAA4C,CAAA;AAE3E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAMpE;AAqFD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAkCtE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACnD,UAAU,EAAE,OAAO,CAAA;IACnB,YAAY,EAAE,YAAY,GAAG,SAAS,CAAA;CACtC,CA4BA;AAED,wBAAgB,gBAAgB,CAC/B,GAAG,EAAE,MAAM,EACX,YAAY,CAAC,EAAE,MAAM,EAAE,GACrB,iBAAiB,GAAG,SAAS,CAyB/B"}
@@ -82,11 +82,6 @@ function applyRouteTreeParams(tree, params) {
82
82
  ? [applySegmentParams(segment, params), nextSlots, flags]
83
83
  : [applySegmentParams(segment, params), nextSlots];
84
84
  }
85
- function proxyPatternToRegex(pattern) {
86
- const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&");
87
- const source = escaped.replace(/\*/g, ".*").replace(/\/:([^/]+)/g, "/[^/]+");
88
- return new RegExp(`^${source}$`);
89
- }
90
85
  export function learnRoutePrediction(response) {
91
86
  const { tree, routePrediction: prediction } = response;
92
87
  if (!prediction)
@@ -144,9 +139,9 @@ export function getRoutePathInfo(pathname) {
144
139
  }
145
140
  return { staticOnly, hasDynamicIO };
146
141
  }
147
- export function predictRouteTree(url, proxyPatterns) {
142
+ export function predictRouteTree(url, proxyRegexps) {
148
143
  const pathname = new URL(url, "http://localhost").pathname;
149
- const proxyMatched = proxyPatterns?.some((pattern) => proxyPatternToRegex(pattern).test(pathname)) ?? false;
144
+ const proxyMatched = proxyRegexps?.some((source) => new RegExp(source).test(pathname)) ?? false;
150
145
  const predictions = [...learnedPredictions.values()].sort((a, b) => {
151
146
  return compareRouteSegments(getTemplateSegments(a.segments), getTemplateSegments(b.segments));
152
147
  });
@@ -0,0 +1,9 @@
1
+ import { type ReactNode } from "react";
2
+ export interface HeadEntry {
3
+ tag: string;
4
+ props: Record<string, unknown>;
5
+ children?: ReactNode;
6
+ }
7
+ export declare function registerHead(id: string, entries: HeadEntry[]): void;
8
+ export declare function unregisterHead(id: string): void;
9
+ //# sourceMappingURL=head-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"head-manager.d.ts","sourceRoot":"","sources":["../../../src/lib/head/head-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAIxE,MAAM,WAAW,SAAS;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,QAAQ,CAAC,EAAE,SAAS,CAAA;CACpB;AAsGD,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAG5D;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,QAExC"}