@tanstack/redact 0.0.13 → 0.0.15

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 (93) hide show
  1. package/dist/core/internal.d.ts +23 -39
  2. package/dist/core/internal.js +7 -23
  3. package/dist/core/internal.js.map +3 -3
  4. package/dist/dom/dispatcher.d.ts +3 -1
  5. package/dist/dom/dispatcher.js +104 -97
  6. package/dist/dom/dispatcher.js.map +2 -2
  7. package/dist/dom/dom.js +1 -1
  8. package/dist/dom/dom.js.map +2 -2
  9. package/dist/dom/event-replay.js +7 -29
  10. package/dist/dom/event-replay.js.map +2 -2
  11. package/dist/dom/features/class/full.js +16 -16
  12. package/dist/dom/features/class/full.js.map +2 -2
  13. package/dist/dom/features/class/stub.js +7 -7
  14. package/dist/dom/features/class/stub.js.map +2 -2
  15. package/dist/dom/features/context/full.js +7 -7
  16. package/dist/dom/features/context/full.js.map +2 -2
  17. package/dist/dom/features/context/stub.js +3 -3
  18. package/dist/dom/features/context/stub.js.map +2 -2
  19. package/dist/dom/features/forward-ref/full.js +11 -11
  20. package/dist/dom/features/forward-ref/full.js.map +2 -2
  21. package/dist/dom/features/hydration/full.d.ts +26 -14
  22. package/dist/dom/features/hydration/full.js +412 -92
  23. package/dist/dom/features/hydration/full.js.map +2 -2
  24. package/dist/dom/features/hydration/stub.d.ts +13 -12
  25. package/dist/dom/features/hydration/stub.js +23 -8
  26. package/dist/dom/features/hydration/stub.js.map +2 -2
  27. package/dist/dom/features/lazy/full.js +3 -43
  28. package/dist/dom/features/lazy/full.js.map +2 -2
  29. package/dist/dom/features/lazy/stub.js +1 -1
  30. package/dist/dom/features/lazy/stub.js.map +2 -2
  31. package/dist/dom/features/memo/full.js +3 -3
  32. package/dist/dom/features/memo/full.js.map +2 -2
  33. package/dist/dom/features/memo/stub.js +1 -1
  34. package/dist/dom/features/memo/stub.js.map +2 -2
  35. package/dist/dom/features/portal/full.js +2 -2
  36. package/dist/dom/features/portal/full.js.map +2 -2
  37. package/dist/dom/features/suspense/full.js +151 -109
  38. package/dist/dom/features/suspense/full.js.map +2 -2
  39. package/dist/dom/reconcile.d.ts +3 -1
  40. package/dist/dom/reconcile.js +141 -129
  41. package/dist/dom/reconcile.js.map +2 -2
  42. package/dist/dom/root-internal.d.ts +9 -0
  43. package/dist/dom/root-internal.js +31 -0
  44. package/dist/dom/root-internal.js.map +7 -0
  45. package/dist/dom/root.d.ts +1 -1
  46. package/dist/dom/root.js +4 -136
  47. package/dist/dom/root.js.map +2 -2
  48. package/dist/dom/test-utils.js +1 -1
  49. package/dist/dom/test-utils.js.map +2 -2
  50. package/dist/react/children.js +4 -1
  51. package/dist/react/children.js.map +2 -2
  52. package/dist/react/class.js +8 -2
  53. package/dist/react/class.js.map +2 -2
  54. package/dist/react/context.js +4 -1
  55. package/dist/react/context.js.map +2 -2
  56. package/dist/react/index.js +1 -1
  57. package/dist/react/index.js.map +2 -2
  58. package/dist/react/shared-internals.d.ts +4 -7
  59. package/dist/react/shared-internals.js +4 -7
  60. package/dist/react/shared-internals.js.map +2 -2
  61. package/dist/server/stream.d.ts +5 -1
  62. package/dist/server/stream.js.map +2 -2
  63. package/dist/vite/index.js +19 -3
  64. package/dist/vite/index.js.map +2 -2
  65. package/package.json +1 -1
  66. package/src/core/internal.ts +30 -50
  67. package/src/dom/dispatcher.ts +114 -105
  68. package/src/dom/dom.ts +1 -1
  69. package/src/dom/event-replay.ts +14 -30
  70. package/src/dom/features/class/full.ts +16 -16
  71. package/src/dom/features/class/stub.ts +7 -7
  72. package/src/dom/features/context/full.ts +7 -7
  73. package/src/dom/features/context/stub.ts +3 -3
  74. package/src/dom/features/forward-ref/full.ts +11 -11
  75. package/src/dom/features/hydration/full.ts +516 -104
  76. package/src/dom/features/hydration/stub.ts +28 -14
  77. package/src/dom/features/lazy/full.ts +3 -56
  78. package/src/dom/features/lazy/stub.ts +1 -1
  79. package/src/dom/features/memo/full.ts +3 -3
  80. package/src/dom/features/memo/stub.ts +1 -1
  81. package/src/dom/features/portal/full.ts +2 -2
  82. package/src/dom/features/suspense/full.ts +176 -129
  83. package/src/dom/reconcile.ts +164 -170
  84. package/src/dom/root-internal.ts +40 -0
  85. package/src/dom/root.ts +5 -165
  86. package/src/dom/test-utils.ts +1 -1
  87. package/src/react/children.ts +4 -1
  88. package/src/react/class.ts +8 -2
  89. package/src/react/context.ts +4 -1
  90. package/src/react/index.ts +1 -1
  91. package/src/react/shared-internals.ts +8 -14
  92. package/src/server/stream.ts +9 -4
  93. package/src/vite/index.ts +34 -3
@@ -14,188 +14,230 @@ import {
14
14
  findRoot,
15
15
  runEffects,
16
16
  getCurrentRoot,
17
- withCurrentRoot
17
+ withCurrentRoot,
18
+ discardPendingWork
18
19
  } from "../../reconcile";
19
20
  import {
20
21
  HydrationCursor,
21
22
  setHydrationCursor,
22
23
  clearHydrationCursor,
23
24
  advanceCursorPast,
24
- tryConsumeBoundary
25
+ tryConsumeBoundary,
26
+ isHydrationBailout
25
27
  } from "../hydration";
26
- var suspendHandlerStack = [];
28
+ var suspendHandler = null;
27
29
  function realHandleSuspended(fiber, thenable) {
28
- const handler = suspendHandlerStack[suspendHandlerStack.length - 1];
29
- if (handler) {
30
- handler(thenable);
31
- return;
32
- }
30
+ if (suspendHandler) return suspendHandler(thenable);
33
31
  thenable.then(
34
32
  () => scheduleUpdate(fiber),
35
33
  () => scheduleUpdate(fiber)
36
34
  );
37
35
  }
38
36
  function renderSuspense(fiber, domParent, anchor) {
39
- const props = fiber.pendingProps ?? {};
40
- const state = fiber.memoizedState ??= {
41
- suspended: false,
42
- pending: null,
43
- hiddenDoms: null,
44
- fallbackFiber: null
45
- };
37
+ const props = fiber.pp ?? {};
38
+ const state = fiber.ms ??= {};
46
39
  const root = getCurrentRoot();
47
- if (root?.hydrating && fiber.parent && !state.hydrated) {
40
+ if (root?.h && !state.b) {
48
41
  const boundary = tryConsumeBoundary(fiber.parent);
49
42
  if (boundary) {
50
43
  hydrateSuspenseBoundary(fiber, props, boundary, domParent, anchor);
51
- state.hydrated = true;
52
44
  return;
53
45
  }
54
46
  }
55
- if (state._awaitingLazyHydration) {
56
- fiber.memoizedProps = props;
47
+ if (state.a) {
48
+ fiber.mp = props;
57
49
  return;
58
50
  }
59
- if (state.suspended && state.pending && state.fallbackFiber) {
60
- state.fallbackFiber.pendingProps = { children: props.fallback };
61
- renderFiber(state.fallbackFiber, domParent, anchor);
62
- fiber.memoizedProps = props;
63
- return;
64
- }
65
- if (state.suspended && state.pending && !state.fallbackFiber) {
66
- reconcileChildren(fiber, childrenToArray(props.fallback), domParent, anchor);
67
- fiber.memoizedProps = props;
51
+ if (state.p) {
52
+ if (state.f) {
53
+ state.f.pp = { children: props.fallback };
54
+ renderFiber(state.f, domParent, anchor);
55
+ } else {
56
+ reconcileChildren(fiber, childrenToArray(props.fallback), domParent, anchor);
57
+ }
58
+ fiber.mp = props;
68
59
  return;
69
60
  }
70
- const hadCommittedPrimary = fiber.memoizedProps !== void 0 && fiber.child !== null;
71
- const savedHandler = suspendHandlerStack[suspendHandlerStack.length - 1];
72
- let suspendedThisRender = false;
73
- let suspendedThenable = null;
74
- suspendHandlerStack.push((thenable) => {
75
- suspendedThisRender = true;
76
- suspendedThenable = thenable;
77
- });
61
+ const hadCommittedPrimary = fiber.mp !== void 0 && fiber.child !== null;
62
+ const prevHandler = suspendHandler;
63
+ let pendingThenable;
64
+ suspendHandler = (thenable) => {
65
+ pendingThenable = thenable;
66
+ };
78
67
  try {
79
68
  reconcileChildren(fiber, childrenToArray(props.children), domParent, anchor);
80
69
  } finally {
81
- suspendHandlerStack.pop();
82
- void savedHandler;
70
+ suspendHandler = prevHandler;
83
71
  }
84
- if (suspendedThisRender && suspendedThenable) {
85
- state.suspended = true;
86
- state.pending = suspendedThenable;
72
+ if (pendingThenable) {
73
+ state.p = pendingThenable;
87
74
  const onSettle = () => {
88
- state.suspended = false;
89
- state.pending = null;
75
+ state.p = null;
90
76
  scheduleUpdate(fiber);
91
77
  };
92
- suspendedThenable.then(onSettle, onSettle);
78
+ pendingThenable.then(onSettle, onSettle);
93
79
  if (hadCommittedPrimary && fiber.child) {
94
- const hostDoms = [];
80
+ const hidden = [];
95
81
  let c = fiber.child;
96
82
  while (c) {
97
- collectRootHostDoms(c, hostDoms);
83
+ hideRootHostDoms(c, hidden);
98
84
  c = c.sibling;
99
85
  }
100
- const hidden = [];
101
- for (const d of hostDoms) {
102
- if (d.nodeType === 1) {
103
- const el = d;
104
- hidden.push([el, el.style.display]);
105
- el.style.display = "none";
106
- }
107
- }
108
- state.hiddenDoms = hidden;
109
- if (!state.fallbackFiber) {
110
- state.fallbackFiber = createFiber(FiberTag.Fragment, null, null);
111
- state.fallbackFiber.parent = fiber;
86
+ state.d = hidden;
87
+ if (!state.f) {
88
+ state.f = createFiber(FiberTag.Fragment, null, null);
89
+ state.f.parent = fiber;
112
90
  }
113
- state.fallbackFiber.pendingProps = { children: props.fallback };
114
- renderFiber(state.fallbackFiber, domParent, anchor);
91
+ state.f.pp = { children: props.fallback };
92
+ renderFiber(state.f, domParent, anchor);
115
93
  } else {
116
94
  unmountAllChildren(fiber, domParent);
117
95
  reconcileChildren(fiber, childrenToArray(props.fallback), domParent, anchor);
118
96
  }
119
97
  } else {
120
- if (state.hiddenDoms) {
121
- for (const [el, origDisplay] of state.hiddenDoms) {
98
+ if (state.d) {
99
+ for (const [el, origDisplay] of state.d) {
122
100
  el.style.display = origDisplay;
123
101
  }
124
- state.hiddenDoms = null;
102
+ state.d = null;
125
103
  }
126
- if (state.fallbackFiber) {
127
- unmountFiber(state.fallbackFiber, domParent);
128
- state.fallbackFiber = null;
104
+ if (state.f) {
105
+ unmountFiber(state.f, domParent);
106
+ state.f = null;
129
107
  }
130
108
  }
131
- fiber.memoizedProps = props;
109
+ fiber.mp = props;
132
110
  }
133
- function collectRootHostDoms(fiber, out) {
134
- if (fiber.tag === FiberTag.Host || fiber.tag === FiberTag.Text) {
135
- if (fiber.dom) out.push(fiber.dom);
111
+ function hideRootHostDoms(fiber, out) {
112
+ if (fiber.tag === FiberTag.Host) {
113
+ const el = fiber.dom;
114
+ if (el) {
115
+ out.push([el, el.style.display]);
116
+ el.style.display = "none";
117
+ }
136
118
  return;
137
119
  }
138
120
  if (fiber.tag === FiberTag.Portal) return;
139
121
  let c = fiber.child;
140
122
  while (c) {
141
- collectRootHostDoms(c, out);
123
+ hideRootHostDoms(c, out);
142
124
  c = c.sibling;
143
125
  }
144
126
  }
145
127
  function hydrateSuspenseBoundary(fiber, props, boundary, domParent, anchor) {
146
- const { kind, id, startMark, endMark } = boundary;
147
- fiber.memoizedState = {
148
- suspended: false,
149
- pending: null,
150
- hydrated: true,
151
- boundaryId: id,
152
- startMark,
153
- endMark,
154
- realChildren: props.children
128
+ const [pendingBoundary, id, startMark, endMark] = boundary;
129
+ fiber.ms = {
130
+ b: startMark,
131
+ e: endMark,
132
+ r: props.children
155
133
  };
156
- if (kind === "resolved") {
157
- const cursor = new HydrationCursor(startMark.parentNode, startMark.nextSibling, endMark);
158
- setHydrationCursor(fiber, cursor);
159
- reconcileChildren(fiber, childrenToArray(props.children), domParent, anchor);
160
- clearHydrationCursor(fiber);
161
- advanceCursorPast(fiber.parent, endMark);
162
- fiber.memoizedProps = props;
134
+ if (!pendingBoundary) {
135
+ const parent = startMark.parentNode;
136
+ try {
137
+ setHydrationCursor(fiber, new HydrationCursor(parent, startMark.nextSibling, endMark));
138
+ reconcileChildren(fiber, childrenToArray(props.children), domParent, anchor);
139
+ advanceCursorPast(fiber.parent, endMark);
140
+ } catch (e) {
141
+ if (!isHydrationBailout(e)) {
142
+ clearBoundaryRange(startMark, endMark);
143
+ unmountAllChildren(fiber, parent);
144
+ throw e;
145
+ }
146
+ recoverBoundaryHydration(fiber, props.children, parent, startMark, endMark);
147
+ } finally {
148
+ clearHydrationCursor(fiber);
149
+ }
150
+ fiber.mp = props;
163
151
  return;
164
152
  }
165
153
  const bDiv = document.getElementById(`B:${id}`);
166
- if (bDiv) {
167
- const cursor = new HydrationCursor(bDiv);
168
- setHydrationCursor(fiber, cursor);
169
- reconcileChildren(fiber, childrenToArray(props.fallback), domParent, anchor);
154
+ try {
155
+ if (bDiv) {
156
+ setHydrationCursor(fiber, new HydrationCursor(bDiv));
157
+ reconcileChildren(fiber, childrenToArray(props.fallback), domParent, anchor);
158
+ } else {
159
+ reconcileChildren(fiber, childrenToArray(props.fallback), domParent, anchor);
160
+ }
161
+ } catch (e) {
162
+ if (!isHydrationBailout(e) || !bDiv) throw e;
163
+ recoverFallbackHydration(fiber, props.fallback, bDiv);
164
+ } finally {
170
165
  clearHydrationCursor(fiber);
171
- } else {
172
- reconcileChildren(fiber, childrenToArray(props.fallback), domParent, anchor);
173
166
  }
174
167
  advanceCursorPast(fiber.parent, endMark);
175
- const win = globalThis;
176
- if (typeof win.$RH === "function") {
177
- win.$RH(id, () => rehydrateBoundary(fiber));
168
+ globalThis.$RH?.(id, () => rehydrateBoundary(fiber));
169
+ fiber.mp = props;
170
+ }
171
+ function recoverBoundaryHydration(fiber, children, parent, startMark, endMark) {
172
+ const root = findRoot(fiber);
173
+ const prevHydrating = root.h;
174
+ discardPendingWork(root);
175
+ clearBoundaryRange(startMark, endMark);
176
+ unmountAllChildren(fiber, parent);
177
+ root.h = false;
178
+ try {
179
+ reconcileChildren(fiber, childrenToArray(children), parent, endMark);
180
+ advanceCursorPast(fiber.parent, endMark);
181
+ } catch (clientError) {
182
+ clearBoundaryRange(startMark, endMark);
183
+ unmountAllChildren(fiber, parent);
184
+ throw clientError;
185
+ } finally {
186
+ root.h = prevHydrating;
187
+ }
188
+ }
189
+ function recoverFallbackHydration(fiber, fallback, parent) {
190
+ const root = findRoot(fiber);
191
+ const prevHydrating = root.h;
192
+ discardPendingWork(root);
193
+ parent.textContent = "";
194
+ unmountAllChildren(fiber, parent);
195
+ root.h = false;
196
+ try {
197
+ reconcileChildren(fiber, childrenToArray(fallback), parent, null);
198
+ } catch (clientError) {
199
+ parent.textContent = "";
200
+ unmountAllChildren(fiber, parent);
201
+ throw clientError;
202
+ } finally {
203
+ root.h = prevHydrating;
178
204
  }
179
- fiber.memoizedProps = props;
180
205
  }
181
206
  function rehydrateBoundary(fiber) {
182
- const state = fiber.memoizedState;
183
- if (!state || !state.startMark || !state.endMark) return;
207
+ const state = fiber.ms;
208
+ if (!state || !state.b || !state.e) return;
184
209
  const root = findRoot(fiber);
185
- if (!root) return;
186
- const parent = state.startMark.parentNode;
187
- if (!parent) return;
210
+ const parent = state.b.parentNode;
211
+ if (!root || !parent) return;
188
212
  withCurrentRoot(root, () => {
189
- unmountAllChildren(fiber, parent);
190
- root.hydrating = true;
191
- const cursor = new HydrationCursor(parent, state.startMark.nextSibling, state.endMark);
192
- setHydrationCursor(fiber, cursor);
193
- reconcileChildren(fiber, childrenToArray(state.realChildren), parent, null);
194
- clearHydrationCursor(fiber);
195
- root.hydrating = false;
213
+ const prevHydrating = root.h;
214
+ try {
215
+ unmountAllChildren(fiber, parent);
216
+ root.h = true;
217
+ setHydrationCursor(fiber, new HydrationCursor(parent, state.b.nextSibling, state.e));
218
+ reconcileChildren(fiber, childrenToArray(state.r), parent, null);
219
+ } catch (e) {
220
+ if (!isHydrationBailout(e)) {
221
+ clearBoundaryRange(state.b, state.e);
222
+ unmountAllChildren(fiber, parent);
223
+ throw e;
224
+ }
225
+ recoverBoundaryHydration(fiber, state.r, parent, state.b, state.e);
226
+ } finally {
227
+ root.h = prevHydrating;
228
+ clearHydrationCursor(fiber);
229
+ }
196
230
  runEffects(root);
197
231
  });
198
232
  }
233
+ function clearBoundaryRange(startMark, endMark) {
234
+ let node = startMark.nextSibling;
235
+ while (node && node !== endMark) {
236
+ const next = node.nextSibling;
237
+ node.parentNode?.removeChild(node);
238
+ node = next;
239
+ }
240
+ }
199
241
  registerTypeMatcher((type) => type === REACT_SUSPENSE_TYPE ? FiberTag.Suspense : null);
200
242
  registerRenderer(FiberTag.Suspense, renderSuspense);
201
243
  installCapability("handleSuspended", realHandleSuspended);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/dom/features/suspense/full.ts"],
4
- "sourcesContent": ["import { FiberTag, createFiber, type Fiber } from '../../../core'\nimport { REACT_SUSPENSE_TYPE } from '../../../react'\nimport {\n registerRenderer,\n registerTypeMatcher,\n installCapability,\n reconcileChildren,\n childrenToArray,\n renderFiber,\n scheduleUpdate,\n unmountAllChildren,\n unmountFiber,\n findRoot,\n runEffects,\n getCurrentRoot,\n withCurrentRoot,\n} from '../../reconcile'\nimport {\n HydrationCursor,\n setHydrationCursor,\n clearHydrationCursor,\n advanceCursorPast,\n tryConsumeBoundary,\n} from '../hydration'\n\nconst suspendHandlerStack: Array<(t: Promise<any>) => void> = []\n\nfunction realHandleSuspended(fiber: Fiber, thenable: Promise<any>): void {\n const handler = suspendHandlerStack[suspendHandlerStack.length - 1]\n if (handler) {\n handler(thenable)\n return\n }\n // Fallback: schedule re-render when promise settles\n thenable.then(\n () => scheduleUpdate(fiber),\n () => scheduleUpdate(fiber),\n )\n}\n\n// React's Suspense semantics: when a re-render of an already-committed\n// boundary suspends, the previously-committed children are kept in the DOM\n// (hidden) so their scroll position, focus, selection, native form state,\n// and component state survive across the suspension. The fallback is mounted\n// alongside the hidden primary until the pending promise resolves.\n//\n// We track the hidden subtree DOM in `state.hiddenDoms` (root host nodes +\n// their original `display` so we can restore it) and the fallback as a\n// detached Fragment fiber in `state.fallbackFiber` (deliberately kept OUT of\n// `fiber.child` so reconciles against `props.children` don't trip on it).\n// First-mount suspensions have no committed DOM worth preserving, so they\n// keep the original unmount-and-render-fallback behavior.\ninterface SuspenseState {\n suspended: boolean\n pending: Promise<any> | null\n hydrated?: boolean\n boundaryId?: number\n startMark?: Comment\n endMark?: Comment\n realChildren?: any\n _awaitingLazyHydration?: boolean\n // Re-suspend preservation:\n hiddenDoms: Array<[HTMLElement, string]> | null\n fallbackFiber: Fiber | null\n}\n\nfunction renderSuspense(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const props = fiber.pendingProps ?? {}\n const state = (fiber.memoizedState ??= {\n suspended: false,\n pending: null as Promise<any> | null,\n hiddenDoms: null,\n fallbackFiber: null,\n }) as SuspenseState\n\n // Streaming hydration: if the next DOM node is a server-emitted boundary\n // marker, route through the boundary-aware hydration path.\n const root = getCurrentRoot()\n if (root?.hydrating && fiber.parent && !state.hydrated) {\n const boundary = tryConsumeBoundary(fiber.parent)\n if (boundary) {\n hydrateSuspenseBoundary(fiber, props, boundary, domParent, anchor)\n state.hydrated = true\n return\n }\n }\n\n // A descendant Lazy deferred its hydration (see renderLazy's hydrating\n // branch). Its SSR-rendered content is still in the DOM and cursor-bound\n // via the Lazy fiber \u2014 we just haven't swapped it into a fiber subtree\n // yet. Until the Lazy's resume fires, skip our own tryChildren pass so\n // an unrelated re-render can't accidentally flip us into the suspended\n // path and mount a duplicate fallback on top of the SSR content.\n if (state._awaitingLazyHydration) {\n fiber.memoizedProps = props\n return\n }\n\n // We were already in the suspended-with-preserved-primary state. Don't\n // re-attempt primary children (would re-throw and churn the tree). Just\n // refresh the fallback in case its JSX changed, and wait for the pending\n // promise to fire scheduleUpdate.\n if (state.suspended && state.pending && state.fallbackFiber) {\n state.fallbackFiber.pendingProps = { children: props.fallback }\n renderFiber(state.fallbackFiber, domParent, anchor)\n fiber.memoizedProps = props\n return\n }\n\n // Initial-mount suspended path: no committed primary to preserve. Old\n // behavior \u2014 render fallback into fiber.child directly.\n if (state.suspended && state.pending && !state.fallbackFiber) {\n reconcileChildren(fiber, childrenToArray(props.fallback), domParent, anchor)\n fiber.memoizedProps = props\n return\n }\n\n // Snapshot whether we have an existing committed primary tree before\n // attempting the new render. If the new attempt suspends and we did have a\n // committed primary, we keep it (hidden) rather than destroying it.\n const hadCommittedPrimary = fiber.memoizedProps !== undefined && fiber.child !== null\n\n const savedHandler = suspendHandlerStack[suspendHandlerStack.length - 1]\n let suspendedThisRender = false\n let suspendedThenable: Promise<any> | null = null\n suspendHandlerStack.push((thenable) => {\n suspendedThisRender = true\n suspendedThenable = thenable\n })\n try {\n reconcileChildren(fiber, childrenToArray(props.children), domParent, anchor)\n } finally {\n suspendHandlerStack.pop()\n void savedHandler\n }\n\n if (suspendedThisRender && suspendedThenable) {\n state.suspended = true\n state.pending = suspendedThenable\n const onSettle = () => {\n state.suspended = false\n state.pending = null\n scheduleUpdate(fiber)\n }\n suspendedThenable.then(onSettle, onSettle)\n\n if (hadCommittedPrimary && fiber.child) {\n // Hide the primary subtree's root host doms so the fallback is the only\n // thing visible, but the underlying nodes (and their scroll/state/focus)\n // survive. Save original `display` for the resume path.\n const hostDoms: Node[] = []\n let c: Fiber | null = fiber.child\n while (c) {\n collectRootHostDoms(c, hostDoms)\n c = c.sibling\n }\n const hidden: Array<[HTMLElement, string]> = []\n for (const d of hostDoms) {\n if (d.nodeType === 1) {\n const el = d as HTMLElement\n hidden.push([el, el.style.display])\n el.style.display = 'none'\n }\n }\n state.hiddenDoms = hidden\n\n // Mount fallback in a detached Fragment fiber. Kept off `fiber.child`\n // so reconciles of primary don't see it as a stale match candidate.\n if (!state.fallbackFiber) {\n state.fallbackFiber = createFiber(FiberTag.Fragment, null, null)\n state.fallbackFiber.parent = fiber\n }\n state.fallbackFiber.pendingProps = { children: props.fallback }\n renderFiber(state.fallbackFiber, domParent, anchor)\n } else {\n // First-mount suspension \u2014 nothing to preserve.\n unmountAllChildren(fiber, domParent)\n reconcileChildren(fiber, childrenToArray(props.fallback), domParent, anchor)\n }\n } else {\n // Render succeeded. Clean up any preserved-suspend state from a prior\n // suspension cycle: unhide primary, unmount the orphan fallback fiber.\n if (state.hiddenDoms) {\n for (const [el, origDisplay] of state.hiddenDoms) {\n el.style.display = origDisplay\n }\n state.hiddenDoms = null\n }\n if (state.fallbackFiber) {\n unmountFiber(state.fallbackFiber, domParent)\n state.fallbackFiber = null\n }\n }\n fiber.memoizedProps = props\n}\n\n// Walk a fiber subtree collecting host/text DOM nodes that sit at the root\n// of the subtree (do not descend through their children \u2014 display:none on\n// the root hides the whole element). Used by the hide-on-suspend path.\nfunction collectRootHostDoms(fiber: Fiber, out: Node[]): void {\n if (fiber.tag === FiberTag.Host || fiber.tag === FiberTag.Text) {\n if (fiber.dom) out.push(fiber.dom)\n return\n }\n if (fiber.tag === FiberTag.Portal) return\n let c = fiber.child\n while (c) {\n collectRootHostDoms(c, out)\n c = c.sibling\n }\n}\n\nfunction hydrateSuspenseBoundary(\n fiber: Fiber,\n props: any,\n boundary: { kind: 'pending' | 'resolved'; id: number; startMark: Comment; endMark: Comment },\n domParent: Node,\n anchor: Node | null,\n): void {\n const { kind, id, startMark, endMark } = boundary\n // Record the boundary shape so we can re-hydrate on reveal.\n fiber.memoizedState = {\n suspended: false,\n pending: null,\n hydrated: true,\n boundaryId: id,\n startMark,\n endMark,\n realChildren: props.children,\n }\n\n if (kind === 'resolved') {\n // Real DOM is inline between startMark and endMark. Hydrate into it.\n const cursor = new HydrationCursor(startMark.parentNode!, startMark.nextSibling, endMark)\n setHydrationCursor(fiber, cursor)\n reconcileChildren(fiber, childrenToArray(props.children), domParent, anchor)\n clearHydrationCursor(fiber)\n advanceCursorPast(fiber.parent!, endMark)\n fiber.memoizedProps = props\n return\n }\n\n // Pending: fallback DOM lives inside <div id=\"B:ID\">. Hydrate the fallback\n // React subtree against that div's children.\n const bDiv = (document as Document).getElementById(`B:${id}`)\n if (bDiv) {\n const cursor = new HydrationCursor(bDiv)\n setHydrationCursor(fiber, cursor)\n reconcileChildren(fiber, childrenToArray(props.fallback), domParent, anchor)\n clearHydrationCursor(fiber)\n } else {\n // Couldn't find fallback container \u2014 render fresh (non-adopting)\n reconcileChildren(fiber, childrenToArray(props.fallback), domParent, anchor)\n }\n advanceCursorPast(fiber.parent!, endMark)\n\n // Register for server-streamed reveal (HTML chunks + $RC calls).\n const win = globalThis as any\n if (typeof win.$RH === 'function') {\n win.$RH(id, () => rehydrateBoundary(fiber))\n }\n // If the inline runtime isn't present, nothing external will mark us dirty.\n\n fiber.memoizedProps = props\n}\n\nfunction rehydrateBoundary(fiber: Fiber): void {\n const state = fiber.memoizedState\n if (!state || !state.startMark || !state.endMark) return\n\n const root = findRoot(fiber)\n if (!root) return\n const parent = state.startMark.parentNode as Node\n if (!parent) return\n\n // Unmount existing fallback subtree. Its DOM has already been removed by $RC\n // (or at least its container); unmounting here cleans up fibers + effects.\n withCurrentRoot(root, () => {\n unmountAllChildren(fiber, parent)\n\n // Re-hydrate with real children against the now-real DOM range.\n root.hydrating = true\n const cursor = new HydrationCursor(parent, state.startMark.nextSibling, state.endMark)\n setHydrationCursor(fiber, cursor)\n reconcileChildren(fiber, childrenToArray(state.realChildren), parent, null)\n clearHydrationCursor(fiber)\n root.hydrating = false\n runEffects(root)\n })\n}\n\nregisterTypeMatcher((type) => (type === REACT_SUSPENSE_TYPE ? FiberTag.Suspense : null))\nregisterRenderer(FiberTag.Suspense, renderSuspense)\ninstallCapability('handleSuspended', realHandleSuspended)\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { FiberTag, createFiber, type Fiber } from '../../../core'\nimport { REACT_SUSPENSE_TYPE } from '../../../react'\nimport {\n registerRenderer,\n registerTypeMatcher,\n installCapability,\n reconcileChildren,\n childrenToArray,\n renderFiber,\n scheduleUpdate,\n unmountAllChildren,\n unmountFiber,\n findRoot,\n runEffects,\n getCurrentRoot,\n withCurrentRoot,\n discardPendingWork,\n} from '../../reconcile'\nimport {\n HydrationCursor,\n setHydrationCursor,\n clearHydrationCursor,\n advanceCursorPast,\n tryConsumeBoundary,\n isHydrationBailout,\n} from '../hydration'\n\nlet suspendHandler: ((t: Promise<any>) => void) | null = null\n\nfunction realHandleSuspended(fiber: Fiber, thenable: Promise<any>): void {\n if (suspendHandler) return suspendHandler(thenable)\n // Fallback: schedule re-render when promise settles\n thenable.then(\n () => scheduleUpdate(fiber),\n () => scheduleUpdate(fiber),\n )\n}\n\n// React's Suspense semantics: when a re-render of an already-committed\n// boundary suspends, the previously-committed children are kept in the DOM\n// (hidden) so their scroll position, focus, selection, native form state,\n// and component state survive across the suspension. The fallback is mounted\n// alongside the hidden primary until the pending promise resolves.\n//\n// We track the hidden subtree DOM in `state.d` (root host nodes +\n// their original `display` so we can restore it) and the fallback as a\n// detached Fragment fiber in `state.f` (deliberately kept OUT of\n// `fiber.child` so reconciles against `props.children` don't trip on it).\n// First-mount suspensions have no committed DOM worth preserving, so they\n// keep the original unmount-and-render-fallback behavior.\ninterface SuspenseState {\n p?: Promise<any> | null\n b?: Comment\n e?: Comment\n r?: any\n a?: boolean\n // Re-suspend preservation:\n d?: Array<[HTMLElement, string]> | null\n f?: Fiber | null\n}\n\nfunction renderSuspense(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const props = fiber.pp ?? {}\n const state = (fiber.ms ??= {}) as SuspenseState\n\n // Streaming hydration: if the next DOM node is a server-emitted boundary\n // marker, route through the boundary-aware hydration path.\n const root = getCurrentRoot()\n if (root?.h && !state.b) {\n const boundary = tryConsumeBoundary(fiber.parent!)\n if (boundary) {\n hydrateSuspenseBoundary(fiber, props, boundary, domParent, anchor)\n return\n }\n }\n\n // A descendant Lazy deferred its hydration (see renderLazy's hydrating\n // branch). Its SSR-rendered content is still in the DOM and cursor-bound\n // via the Lazy fiber \u2014 we just haven't swapped it into a fiber subtree\n // yet. Until the Lazy's resume fires, skip our own tryChildren pass so\n // an unrelated re-render can't accidentally flip us into the suspended\n // path and mount a duplicate fallback on top of the SSR content.\n if (state.a) {\n fiber.mp = props\n return\n }\n\n // We were already in the suspended-with-preserved-primary state. Don't\n // re-attempt primary children (would re-throw and churn the tree). Just\n // refresh the fallback in case its JSX changed, and wait for the pending\n // promise to fire scheduleUpdate.\n if (state.p) {\n if (state.f) {\n state.f.pp = { children: props.fallback }\n renderFiber(state.f, domParent, anchor)\n } else {\n // Initial-mount suspended path: no committed primary to preserve.\n reconcileChildren(fiber, childrenToArray(props.fallback), domParent, anchor)\n }\n fiber.mp = props\n return\n }\n\n // Snapshot whether we have an existing committed primary tree before\n // attempting the new render. If the new attempt suspends and we did have a\n // committed primary, we keep it (hidden) rather than destroying it.\n const hadCommittedPrimary = fiber.mp !== undefined && fiber.child !== null\n\n const prevHandler = suspendHandler\n let pendingThenable: any\n suspendHandler = (thenable) => {\n pendingThenable = thenable\n }\n try {\n reconcileChildren(fiber, childrenToArray(props.children), domParent, anchor)\n } finally {\n suspendHandler = prevHandler\n }\n\n if (pendingThenable) {\n state.p = pendingThenable\n const onSettle = () => {\n state.p = null\n scheduleUpdate(fiber)\n }\n pendingThenable.then(onSettle, onSettle)\n\n if (hadCommittedPrimary && fiber.child) {\n // Hide the primary subtree's root host doms so the fallback is the only\n // thing visible, but the underlying nodes (and their scroll/state/focus)\n // survive. Save original `display` for the resume path.\n const hidden: Array<[HTMLElement, string]> = []\n let c: Fiber | null = fiber.child\n while (c) {\n hideRootHostDoms(c, hidden)\n c = c.sibling\n }\n state.d = hidden\n\n // Mount fallback in a detached Fragment fiber. Kept off `fiber.child`\n // so reconciles of primary don't see it as a stale match candidate.\n if (!state.f) {\n state.f = createFiber(FiberTag.Fragment, null, null)\n state.f.parent = fiber\n }\n state.f.pp = { children: props.fallback }\n renderFiber(state.f, domParent, anchor)\n } else {\n // First-mount suspension \u2014 nothing to preserve.\n unmountAllChildren(fiber, domParent)\n reconcileChildren(fiber, childrenToArray(props.fallback), domParent, anchor)\n }\n } else {\n // Render succeeded. Clean up any preserved-suspend state from a prior\n // suspension cycle: unhide primary, unmount the orphan fallback fiber.\n if (state.d) {\n for (const [el, origDisplay] of state.d) {\n el.style.display = origDisplay\n }\n state.d = null\n }\n if (state.f) {\n unmountFiber(state.f, domParent)\n state.f = null\n }\n }\n fiber.mp = props\n}\n\n// Walk a fiber subtree collecting host/text DOM nodes that sit at the root\n// of the subtree (do not descend through their children \u2014 display:none on\n// the root hides the whole element). Used by the hide-on-suspend path.\nfunction hideRootHostDoms(fiber: Fiber, out: Array<[HTMLElement, string]>): void {\n if (fiber.tag === FiberTag.Host) {\n const el = fiber.dom as HTMLElement | null\n if (el) {\n out.push([el, el.style.display])\n el.style.display = 'none'\n }\n return\n }\n if (fiber.tag === FiberTag.Portal) return\n let c = fiber.child\n while (c) {\n hideRootHostDoms(c, out)\n c = c.sibling\n }\n}\n\nfunction hydrateSuspenseBoundary(\n fiber: Fiber,\n props: any,\n boundary: [0 | 1, number, Comment, Comment],\n domParent: Node,\n anchor: Node | null,\n): void {\n const [pendingBoundary, id, startMark, endMark] = boundary\n // Record the boundary shape so we can re-hydrate on reveal.\n fiber.ms = {\n b: startMark,\n e: endMark,\n r: props.children,\n }\n\n if (!pendingBoundary) {\n // Real DOM is inline between startMark and endMark. Hydrate into it.\n const parent = startMark.parentNode!\n try {\n setHydrationCursor(fiber, new HydrationCursor(parent, startMark.nextSibling, endMark))\n reconcileChildren(fiber, childrenToArray(props.children), domParent, anchor)\n advanceCursorPast(fiber.parent!, endMark)\n } catch (e) {\n if (!isHydrationBailout(e)) {\n clearBoundaryRange(startMark, endMark)\n unmountAllChildren(fiber, parent)\n throw e\n }\n recoverBoundaryHydration(fiber, props.children, parent, startMark, endMark)\n } finally {\n clearHydrationCursor(fiber)\n }\n fiber.mp = props\n return\n }\n\n // Pending: fallback DOM lives inside <div id=\"B:ID\">. Hydrate the fallback\n // React subtree against that div's children.\n const bDiv = document.getElementById(`B:${id}`)\n try {\n if (bDiv) {\n setHydrationCursor(fiber, new HydrationCursor(bDiv))\n reconcileChildren(fiber, childrenToArray(props.fallback), domParent, anchor)\n } else {\n // Couldn't find fallback container \u2014 render fresh (non-adopting)\n reconcileChildren(fiber, childrenToArray(props.fallback), domParent, anchor)\n }\n } catch (e) {\n if (!isHydrationBailout(e) || !bDiv) throw e\n recoverFallbackHydration(fiber, props.fallback, bDiv)\n } finally {\n clearHydrationCursor(fiber)\n }\n advanceCursorPast(fiber.parent!, endMark)\n\n // Register for server-streamed reveal (HTML chunks + $RC calls).\n ;(globalThis as any).$RH?.(id, () => rehydrateBoundary(fiber))\n // If the inline runtime isn't present, nothing external will mark us dy.\n\n fiber.mp = props\n}\n\nfunction recoverBoundaryHydration(\n fiber: Fiber,\n children: any,\n parent: Node,\n startMark: Comment,\n endMark: Comment,\n): void {\n const root = findRoot(fiber)!\n const prevHydrating = root.h\n discardPendingWork(root)\n clearBoundaryRange(startMark, endMark)\n unmountAllChildren(fiber, parent)\n root.h = false\n try {\n reconcileChildren(fiber, childrenToArray(children), parent, endMark)\n advanceCursorPast(fiber.parent!, endMark)\n } catch (clientError) {\n clearBoundaryRange(startMark, endMark)\n unmountAllChildren(fiber, parent)\n throw clientError\n } finally {\n root.h = prevHydrating\n }\n}\n\nfunction recoverFallbackHydration(fiber: Fiber, fallback: any, parent: HTMLElement): void {\n const root = findRoot(fiber)!\n const prevHydrating = root.h\n discardPendingWork(root)\n parent.textContent = ''\n unmountAllChildren(fiber, parent)\n root.h = false\n try {\n reconcileChildren(fiber, childrenToArray(fallback), parent, null)\n } catch (clientError) {\n parent.textContent = ''\n unmountAllChildren(fiber, parent)\n throw clientError\n } finally {\n root.h = prevHydrating\n }\n}\n\nfunction rehydrateBoundary(fiber: Fiber): void {\n const state = fiber.ms\n if (!state || !state.b || !state.e) return\n\n const root = findRoot(fiber)\n const parent = state.b.parentNode as Node\n if (!root || !parent) return\n\n // Unmount existing fallback subtree. Its DOM has already been removed by $RC\n // (or at least its container); unmounting here cleans up fibers + fx.\n withCurrentRoot(root, () => {\n const prevHydrating = root.h\n try {\n unmountAllChildren(fiber, parent)\n\n // Re-hydrate with real children against the now-real DOM range.\n root.h = true\n setHydrationCursor(fiber, new HydrationCursor(parent, state.b.nextSibling, state.e))\n reconcileChildren(fiber, childrenToArray(state.r), parent, null)\n } catch (e) {\n if (!isHydrationBailout(e)) {\n clearBoundaryRange(state.b, state.e)\n unmountAllChildren(fiber, parent)\n throw e\n }\n\n recoverBoundaryHydration(fiber, state.r, parent, state.b, state.e)\n } finally {\n root.h = prevHydrating\n clearHydrationCursor(fiber)\n }\n runEffects(root)\n })\n}\n\nfunction clearBoundaryRange(startMark: Comment, endMark: Comment): void {\n let node = startMark.nextSibling\n while (node && node !== endMark) {\n const next = node.nextSibling\n node.parentNode?.removeChild(node)\n node = next\n }\n}\n\nregisterTypeMatcher((type) => (type === REACT_SUSPENSE_TYPE ? FiberTag.Suspense : null))\nregisterRenderer(FiberTag.Suspense, renderSuspense)\ninstallCapability('handleSuspended', realHandleSuspended)\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -2,6 +2,7 @@ import { FiberTag, type Fiber, type FiberRoot, type ReactElement, type ReactNode
2
2
  export declare function scheduleUpdate(fiber: Fiber): void;
3
3
  export declare function flushSyncWork(fn: () => void): void;
4
4
  export declare function batchedUpdates<T>(fn: () => T): T;
5
+ export declare function discardPendingWork(root: FiberRoot): void;
5
6
  export declare function findRoot(fiber: Fiber): FiberRoot | null;
6
7
  export declare function renderRoot(root: FiberRoot, children: ReactNode): void;
7
8
  type NormalizedChild = ReactElement | string | null;
@@ -21,6 +22,7 @@ export declare function getCurrentRoot(): FiberRoot | null;
21
22
  export declare function withCurrentRoot<T>(root: FiberRoot | null, fn: () => T): T;
22
23
  export declare function getForceRerenderingFiber(): Fiber | null;
23
24
  export declare function renderFiber(fiber: Fiber, domParent: Node, anchor: Node | null): void;
25
+ export declare function deferHydration(fiber: Fiber, thenable: Promise<any>): boolean;
24
26
  export interface Capabilities {
25
27
  handleSuspended: (fiber: Fiber, thenable: Promise<any>) => void;
26
28
  readContext: (fiber: Fiber, ctx: any) => any;
@@ -33,6 +35,6 @@ export declare function unmountFiber(fiber: Fiber, domParent: Node): void;
33
35
  export declare function unmountAllChildren(parent: Fiber, domParent: Node): void;
34
36
  export declare function readContext(fiber: Fiber, ctx: any): any;
35
37
  export declare function enqueueEffect(fiber: Fiber, effect: Effect): void;
36
- export declare function scheduleLifecycle(fiber: Fiber, fn: () => void): void;
38
+ export declare function scheduleLifecycle(_fiber: Fiber, fn: () => void): void;
37
39
  export declare function runEffects(root: FiberRoot): void;
38
40
  export {};