@tanstack/redact 0.0.20 → 0.0.21
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.
- package/dist/dom/features/class/full.js +8 -2
- package/dist/dom/features/class/full.js.map +2 -2
- package/dist/dom/features/hydration/full.js +2 -1
- package/dist/dom/features/hydration/full.js.map +2 -2
- package/dist/dom/features/suspense/full.js +9 -9
- package/dist/dom/features/suspense/full.js.map +2 -2
- package/dist/dom/reconcile.d.ts +3 -3
- package/dist/dom/reconcile.js +14 -18
- package/dist/dom/reconcile.js.map +2 -2
- package/package.json +1 -1
- package/src/dom/features/class/full.ts +9 -2
- package/src/dom/features/hydration/full.ts +4 -1
- package/src/dom/features/suspense/full.ts +9 -9
- package/src/dom/reconcile.ts +13 -19
|
@@ -79,8 +79,14 @@ function renderClass(fiber, domParent, anchor) {
|
|
|
79
79
|
reconcileChildren(fiber, childrenToArray(rendered), domParent, anchor);
|
|
80
80
|
fiber.mp = props;
|
|
81
81
|
if (isNew) {
|
|
82
|
-
if (instance.componentDidMount) {
|
|
83
|
-
scheduleLifecycle(fiber, () =>
|
|
82
|
+
if (instance.componentDidMount || instance.componentWillUnmount) {
|
|
83
|
+
scheduleLifecycle(fiber, () => {
|
|
84
|
+
if (instance.componentWillUnmount) {
|
|
85
|
+
fiber.cu ||= [];
|
|
86
|
+
fiber.cu.push(() => instance.componentWillUnmount());
|
|
87
|
+
}
|
|
88
|
+
instance.componentDidMount?.();
|
|
89
|
+
});
|
|
84
90
|
}
|
|
85
91
|
} else if (instance.componentDidUpdate) {
|
|
86
92
|
const { p, s } = fiber.ms ?? {};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/dom/features/class/full.ts"],
|
|
4
|
-
"sourcesContent": ["import { FiberTag, type Fiber, type ReactNode } from '../../../core'\nimport {\n registerRenderer,\n reconcileChildren,\n childrenToArray,\n scheduleUpdate,\n scheduleLifecycle,\n isThenable,\n handleSuspended,\n handleErrorInRender,\n} from '../../reconcile'\n\nfunction renderClass(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const Ctor = fiber.type as any\n let instance = fiber.sn\n const props = fiber.pp ?? {}\n const isNew = !instance\n\n // Class contextType: read the current value of the subscribed context so\n // `this.context` reflects the nearest Provider. Evaluated every render.\n const ctxValue = Ctor.contextType ? Ctor.contextType._currentValue : undefined\n\n if (isNew) {\n instance = new Ctor(props, ctxValue)\n instance.props = props\n instance.context = ctxValue\n instance._fiber = fiber\n instance._enqueueUpdate = (updater: any, cb?: () => void) => {\n const next = typeof updater == 'function' ? updater(instance.state, instance.props) : updater\n if (next != null) instance.state = { ...instance.state, ...next }\n if (cb) {\n fiber.cu ||= []\n fiber.cu.push(cb)\n }\n scheduleUpdate(fiber)\n }\n instance._forceUpdate = (cb?: () => void) => {\n if (cb) {\n fiber.cu ||= []\n fiber.cu.push(cb)\n }\n scheduleUpdate(fiber)\n }\n fiber.sn = instance\n if (Ctor.getDerivedStateFromProps) {\n const d = Ctor.getDerivedStateFromProps(props, instance.state)\n if (d) instance.state = { ...instance.state, ...d }\n }\n } else {\n const prevProps = instance.props\n const prevState = instance.state\n // Refresh context on every render \u2014 Providers higher up may have changed.\n instance.context = ctxValue\n if (Ctor.getDerivedStateFromProps) {\n const d = Ctor.getDerivedStateFromProps(props, instance.state)\n if (d) instance.state = { ...instance.state, ...d }\n }\n if (instance.shouldComponentUpdate) {\n if (!instance.shouldComponentUpdate(props, instance.state, instance.context)) {\n instance.props = props\n fiber.mp = props\n // Still need to render children with previous output\n if (fiber.ms?.r) {\n reconcileChildren(fiber, childrenToArray(fiber.ms.r), domParent, anchor)\n }\n return\n }\n }\n instance.props = props\n // New snapshot must win over any stale one from a previous render \u2014\n // otherwise componentDidUpdate keeps seeing the original props and can\n // ping-pong setState forever.\n fiber.ms = { ...(fiber.ms ?? {}), p: prevProps, s: prevState }\n }\n\n let rendered: ReactNode\n try {\n rendered = instance.render()\n } catch (e: any) {\n if (isThenable(e)) {\n handleSuspended(fiber, e)\n rendered = null\n } else {\n handleErrorInRender(fiber, e)\n return\n }\n }\n fiber.ms = { ...(fiber.ms ?? {}), r: rendered }\n\n reconcileChildren(fiber, childrenToArray(rendered), domParent, anchor)\n fiber.mp = props\n\n // Schedule lifecycle\n if (isNew) {\n if (instance.componentDidMount) {\n scheduleLifecycle(fiber, () => instance.componentDidMount())\n }\n } else if (instance.componentDidUpdate) {\n const { p, s } = fiber.ms ?? {}\n scheduleLifecycle(fiber, () => instance.componentDidUpdate(p, s))\n }\n}\n\nregisterRenderer(FiberTag.Class, renderClass)\n"],
|
|
5
|
-
"mappings": ";AAAA,SAAS,gBAA4C;AACrD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,YAAY,OAAc,WAAiB,QAA2B;AAC7E,QAAM,OAAO,MAAM;AACnB,MAAI,WAAW,MAAM;AACrB,QAAM,QAAQ,MAAM,MAAM,CAAC;AAC3B,QAAM,QAAQ,CAAC;AAIf,QAAM,WAAW,KAAK,cAAc,KAAK,YAAY,gBAAgB;AAErE,MAAI,OAAO;AACT,eAAW,IAAI,KAAK,OAAO,QAAQ;AACnC,aAAS,QAAQ;AACjB,aAAS,UAAU;AACnB,aAAS,SAAS;AAClB,aAAS,iBAAiB,CAAC,SAAc,OAAoB;AAC3D,YAAM,OAAO,OAAO,WAAW,aAAa,QAAQ,SAAS,OAAO,SAAS,KAAK,IAAI;AACtF,UAAI,QAAQ,KAAM,UAAS,QAAQ,EAAE,GAAG,SAAS,OAAO,GAAG,KAAK;AAChE,UAAI,IAAI;AACN,cAAM,OAAO,CAAC;AACd,cAAM,GAAG,KAAK,EAAE;AAAA,MAClB;AACA,qBAAe,KAAK;AAAA,IACtB;AACA,aAAS,eAAe,CAAC,OAAoB;AAC3C,UAAI,IAAI;AACN,cAAM,OAAO,CAAC;AACd,cAAM,GAAG,KAAK,EAAE;AAAA,MAClB;AACA,qBAAe,KAAK;AAAA,IACtB;AACA,UAAM,KAAK;AACX,QAAI,KAAK,0BAA0B;AACjC,YAAM,IAAI,KAAK,yBAAyB,OAAO,SAAS,KAAK;AAC7D,UAAI,EAAG,UAAS,QAAQ,EAAE,GAAG,SAAS,OAAO,GAAG,EAAE;AAAA,IACpD;AAAA,EACF,OAAO;AACL,UAAM,YAAY,SAAS;AAC3B,UAAM,YAAY,SAAS;AAE3B,aAAS,UAAU;AACnB,QAAI,KAAK,0BAA0B;AACjC,YAAM,IAAI,KAAK,yBAAyB,OAAO,SAAS,KAAK;AAC7D,UAAI,EAAG,UAAS,QAAQ,EAAE,GAAG,SAAS,OAAO,GAAG,EAAE;AAAA,IACpD;AACA,QAAI,SAAS,uBAAuB;AAClC,UAAI,CAAC,SAAS,sBAAsB,OAAO,SAAS,OAAO,SAAS,OAAO,GAAG;AAC5E,iBAAS,QAAQ;AACjB,cAAM,KAAK;AAEX,YAAI,MAAM,IAAI,GAAG;AACf,4BAAkB,OAAO,gBAAgB,MAAM,GAAG,CAAC,GAAG,WAAW,MAAM;AAAA,QACzE;AACA;AAAA,MACF;AAAA,IACF;AACA,aAAS,QAAQ;AAIjB,UAAM,KAAK,EAAE,GAAI,MAAM,MAAM,CAAC,GAAI,GAAG,WAAW,GAAG,UAAU;AAAA,EAC/D;AAEA,MAAI;AACJ,MAAI;AACF,eAAW,SAAS,OAAO;AAAA,EAC7B,SAAS,GAAQ;AACf,QAAI,WAAW,CAAC,GAAG;AACjB,sBAAgB,OAAO,CAAC;AACxB,iBAAW;AAAA,IACb,OAAO;AACL,0BAAoB,OAAO,CAAC;AAC5B;AAAA,IACF;AAAA,EACF;AACA,QAAM,KAAK,EAAE,GAAI,MAAM,MAAM,CAAC,GAAI,GAAG,SAAS;AAE9C,oBAAkB,OAAO,gBAAgB,QAAQ,GAAG,WAAW,MAAM;AACrE,QAAM,KAAK;AAGX,MAAI,OAAO;AACT,QAAI,SAAS,
|
|
4
|
+
"sourcesContent": ["import { FiberTag, type Fiber, type ReactNode } from '../../../core'\nimport {\n registerRenderer,\n reconcileChildren,\n childrenToArray,\n scheduleUpdate,\n scheduleLifecycle,\n isThenable,\n handleSuspended,\n handleErrorInRender,\n} from '../../reconcile'\n\nfunction renderClass(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const Ctor = fiber.type as any\n let instance = fiber.sn\n const props = fiber.pp ?? {}\n const isNew = !instance\n\n // Class contextType: read the current value of the subscribed context so\n // `this.context` reflects the nearest Provider. Evaluated every render.\n const ctxValue = Ctor.contextType ? Ctor.contextType._currentValue : undefined\n\n if (isNew) {\n instance = new Ctor(props, ctxValue)\n instance.props = props\n instance.context = ctxValue\n instance._fiber = fiber\n instance._enqueueUpdate = (updater: any, cb?: () => void) => {\n const next = typeof updater == 'function' ? updater(instance.state, instance.props) : updater\n if (next != null) instance.state = { ...instance.state, ...next }\n if (cb) {\n fiber.cu ||= []\n fiber.cu.push(cb)\n }\n scheduleUpdate(fiber)\n }\n instance._forceUpdate = (cb?: () => void) => {\n if (cb) {\n fiber.cu ||= []\n fiber.cu.push(cb)\n }\n scheduleUpdate(fiber)\n }\n fiber.sn = instance\n if (Ctor.getDerivedStateFromProps) {\n const d = Ctor.getDerivedStateFromProps(props, instance.state)\n if (d) instance.state = { ...instance.state, ...d }\n }\n } else {\n const prevProps = instance.props\n const prevState = instance.state\n // Refresh context on every render \u2014 Providers higher up may have changed.\n instance.context = ctxValue\n if (Ctor.getDerivedStateFromProps) {\n const d = Ctor.getDerivedStateFromProps(props, instance.state)\n if (d) instance.state = { ...instance.state, ...d }\n }\n if (instance.shouldComponentUpdate) {\n if (!instance.shouldComponentUpdate(props, instance.state, instance.context)) {\n instance.props = props\n fiber.mp = props\n // Still need to render children with previous output\n if (fiber.ms?.r) {\n reconcileChildren(fiber, childrenToArray(fiber.ms.r), domParent, anchor)\n }\n return\n }\n }\n instance.props = props\n // New snapshot must win over any stale one from a previous render \u2014\n // otherwise componentDidUpdate keeps seeing the original props and can\n // ping-pong setState forever.\n fiber.ms = { ...(fiber.ms ?? {}), p: prevProps, s: prevState }\n }\n\n let rendered: ReactNode\n try {\n rendered = instance.render()\n } catch (e: any) {\n if (isThenable(e)) {\n handleSuspended(fiber, e)\n rendered = null\n } else {\n handleErrorInRender(fiber, e)\n return\n }\n }\n fiber.ms = { ...(fiber.ms ?? {}), r: rendered }\n\n reconcileChildren(fiber, childrenToArray(rendered), domParent, anchor)\n fiber.mp = props\n\n // Schedule lifecycle\n if (isNew) {\n if (instance.componentDidMount || instance.componentWillUnmount) {\n scheduleLifecycle(fiber, () => {\n // An abandoned render never mounted, so it has no unmount lifecycle.\n if (instance.componentWillUnmount) {\n fiber.cu ||= []\n fiber.cu.push(() => instance.componentWillUnmount())\n }\n instance.componentDidMount?.()\n })\n }\n } else if (instance.componentDidUpdate) {\n const { p, s } = fiber.ms ?? {}\n scheduleLifecycle(fiber, () => instance.componentDidUpdate(p, s))\n }\n}\n\nregisterRenderer(FiberTag.Class, renderClass)\n"],
|
|
5
|
+
"mappings": ";AAAA,SAAS,gBAA4C;AACrD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,YAAY,OAAc,WAAiB,QAA2B;AAC7E,QAAM,OAAO,MAAM;AACnB,MAAI,WAAW,MAAM;AACrB,QAAM,QAAQ,MAAM,MAAM,CAAC;AAC3B,QAAM,QAAQ,CAAC;AAIf,QAAM,WAAW,KAAK,cAAc,KAAK,YAAY,gBAAgB;AAErE,MAAI,OAAO;AACT,eAAW,IAAI,KAAK,OAAO,QAAQ;AACnC,aAAS,QAAQ;AACjB,aAAS,UAAU;AACnB,aAAS,SAAS;AAClB,aAAS,iBAAiB,CAAC,SAAc,OAAoB;AAC3D,YAAM,OAAO,OAAO,WAAW,aAAa,QAAQ,SAAS,OAAO,SAAS,KAAK,IAAI;AACtF,UAAI,QAAQ,KAAM,UAAS,QAAQ,EAAE,GAAG,SAAS,OAAO,GAAG,KAAK;AAChE,UAAI,IAAI;AACN,cAAM,OAAO,CAAC;AACd,cAAM,GAAG,KAAK,EAAE;AAAA,MAClB;AACA,qBAAe,KAAK;AAAA,IACtB;AACA,aAAS,eAAe,CAAC,OAAoB;AAC3C,UAAI,IAAI;AACN,cAAM,OAAO,CAAC;AACd,cAAM,GAAG,KAAK,EAAE;AAAA,MAClB;AACA,qBAAe,KAAK;AAAA,IACtB;AACA,UAAM,KAAK;AACX,QAAI,KAAK,0BAA0B;AACjC,YAAM,IAAI,KAAK,yBAAyB,OAAO,SAAS,KAAK;AAC7D,UAAI,EAAG,UAAS,QAAQ,EAAE,GAAG,SAAS,OAAO,GAAG,EAAE;AAAA,IACpD;AAAA,EACF,OAAO;AACL,UAAM,YAAY,SAAS;AAC3B,UAAM,YAAY,SAAS;AAE3B,aAAS,UAAU;AACnB,QAAI,KAAK,0BAA0B;AACjC,YAAM,IAAI,KAAK,yBAAyB,OAAO,SAAS,KAAK;AAC7D,UAAI,EAAG,UAAS,QAAQ,EAAE,GAAG,SAAS,OAAO,GAAG,EAAE;AAAA,IACpD;AACA,QAAI,SAAS,uBAAuB;AAClC,UAAI,CAAC,SAAS,sBAAsB,OAAO,SAAS,OAAO,SAAS,OAAO,GAAG;AAC5E,iBAAS,QAAQ;AACjB,cAAM,KAAK;AAEX,YAAI,MAAM,IAAI,GAAG;AACf,4BAAkB,OAAO,gBAAgB,MAAM,GAAG,CAAC,GAAG,WAAW,MAAM;AAAA,QACzE;AACA;AAAA,MACF;AAAA,IACF;AACA,aAAS,QAAQ;AAIjB,UAAM,KAAK,EAAE,GAAI,MAAM,MAAM,CAAC,GAAI,GAAG,WAAW,GAAG,UAAU;AAAA,EAC/D;AAEA,MAAI;AACJ,MAAI;AACF,eAAW,SAAS,OAAO;AAAA,EAC7B,SAAS,GAAQ;AACf,QAAI,WAAW,CAAC,GAAG;AACjB,sBAAgB,OAAO,CAAC;AACxB,iBAAW;AAAA,IACb,OAAO;AACL,0BAAoB,OAAO,CAAC;AAC5B;AAAA,IACF;AAAA,EACF;AACA,QAAM,KAAK,EAAE,GAAI,MAAM,MAAM,CAAC,GAAI,GAAG,SAAS;AAE9C,oBAAkB,OAAO,gBAAgB,QAAQ,GAAG,WAAW,MAAM;AACrE,QAAM,KAAK;AAGX,MAAI,OAAO;AACT,QAAI,SAAS,qBAAqB,SAAS,sBAAsB;AAC/D,wBAAkB,OAAO,MAAM;AAE7B,YAAI,SAAS,sBAAsB;AACjC,gBAAM,OAAO,CAAC;AACd,gBAAM,GAAG,KAAK,MAAM,SAAS,qBAAqB,CAAC;AAAA,QACrD;AACA,iBAAS,oBAAoB;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,EACF,WAAW,SAAS,oBAAoB;AACtC,UAAM,EAAE,GAAG,EAAE,IAAI,MAAM,MAAM,CAAC;AAC9B,sBAAkB,OAAO,MAAM,SAAS,mBAAmB,GAAG,CAAC,CAAC;AAAA,EAClE;AACF;AAEA,iBAAiB,SAAS,OAAO,WAAW;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
import { attributeName, STRING_BOOLEAN_ATTRS } from "../../../core/attributes";
|
|
7
7
|
import { createHostNode, setProp } from "../../dom";
|
|
8
8
|
import { drainReplayQueue } from "../../event-replay";
|
|
9
|
-
import { discardPendingWork, findRoot, flushSyncWork, renderRoot } from "../../reconcile";
|
|
9
|
+
import { discardPendingWork, findRoot, flushSyncWork, renderRoot, unmountFiber } from "../../reconcile";
|
|
10
10
|
import { attachRootFiber, createFiberRoot } from "../../root-internal";
|
|
11
11
|
function installHydrationScrollGuard() {
|
|
12
12
|
if (typeof window === "undefined") return;
|
|
@@ -372,6 +372,7 @@ function recoverHydration(root, error) {
|
|
|
372
372
|
return true;
|
|
373
373
|
}
|
|
374
374
|
function resetAfterHydrationFailure(root, container) {
|
|
375
|
+
unmountFiber(root.r, false);
|
|
375
376
|
discardPendingWork(root);
|
|
376
377
|
clearHydrationContainer(container);
|
|
377
378
|
attachRootFiber(root, container);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/dom/features/hydration/full.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n FiberTag,\n REACT_ELEMENT_TYPE,\n type Fiber,\n type FiberRoot,\n type ReactElement,\n type ReactNode,\n} from '../../../core'\nimport { attributeName, STRING_BOOLEAN_ATTRS } from '../../../core/attributes'\nimport { createHostNode, setProp } from '../../dom'\nimport { drainReplayQueue } from '../../event-replay'\nimport { discardPendingWork, findRoot, flushSyncWork, renderRoot } from '../../reconcile'\nimport { attachRootFiber, createFiberRoot } from '../../root-internal'\n\n// Re-export from event-replay so all hydration concerns live behind one\n// feature boundary \u2014 the plugin's stub swap strips drainReplayQueue too.\nexport { drainReplayQueue }\n\n/**\n * Preserve the user's scroll position across hydration. If the user scrolled\n * between SSR paint and hydrate (common in dev where JS takes seconds to\n * load), libraries that wire scroll-restoration into a `useLayoutEffect`\n * near the root (e.g. TanStack Router) will run during our synchronous\n * hydrate and call `window.scrollTo(savedFromLastVisit)` \u2014 overwriting the\n * user's fresh scroll. We install a short-lived wrapper around scrollTo that\n * suppresses programmatic calls when a user-initiated scroll happened\n * recently. Only runs in the hydration feature \u2014 the stub skips it.\n */\nexport function installHydrationScrollGuard(): void {\n if (typeof window === 'undefined') return\n const w = window as any\n if (w._r) return\n const time = Date.now\n const guardStartedAt = w._r = time()\n let lastUserScrollAt = 0\n let programmatic = false\n w.addEventListener(\n 'scroll',\n () => {\n if (!programmatic) {\n lastUserScrollAt = time()\n }\n },\n { capture: true, passive: true },\n )\n const origScrollTo = w.scrollTo\n w.scrollTo = function (...args: any[]) {\n const now = time()\n if (\n now - guardStartedAt < 3000 &&\n now - lastUserScrollAt < 1500\n ) {\n return\n }\n programmatic = true\n try {\n return (origScrollTo as any).apply(w, args)\n } finally {\n queueMicrotask(() => {\n programmatic = false\n })\n }\n }\n}\n\n/**\n * Hydration cursor: walks existing DOM children in document order so we can\n * adopt them during fiber tree construction. One cursor per host parent.\n *\n * `endBefore` scopes the cursor to a subrange \u2014 used by rehydrateBoundary()\n * so we only adopt DOM up to the closing `/$` marker for that boundary.\n */\nexport class HydrationCursor {\n n: ChildNode | null\n p: Node\n e: ChildNode | null\n constructor(parent: Node, start: ChildNode | null = null, endBefore: ChildNode | null = null) {\n this.p = parent\n this.n = start ?? parent.firstChild\n this.e = endBefore\n }\n take(): ChildNode | null {\n while (this.n && this.n !== this.e) {\n const n = this.n\n // Skip anything that isn't an element (1) or text (3):\n // comments (8), doctype (10), processing instructions (7), cdata (4).\n if (n.nodeType !== 1 && n.nodeType !== 3) {\n this.n = n.nextSibling\n continue\n }\n this.n = n.nextSibling\n return n\n }\n return null\n }\n /**\n * Position-insensitive lookup for head/html adoption. Scans forward past\n * non-matching nodes without removing them, matching by tag AND the key\n * attributes that identify head elements uniquely (rel/href for links,\n * name/property for meta, src for script). Non-matching nodes stay in\n * place so the SSR'd stylesheet/script order is preserved.\n */\n head(tag: string, props: Record<string, any>): ChildNode | null {\n const target = tag.toLowerCase()\n const keyAttrs = HEAD_KEY_ATTRS[target]\n let scan = this.p.firstChild\n while (scan) {\n if (\n scan.nodeType === 1 &&\n (scan as Element).tagName.toLowerCase() === target &&\n headAttrsMatch(scan as Element, props, keyAttrs)\n ) {\n CLAIMED.add(scan)\n return scan\n }\n scan = scan.nextSibling\n }\n return null\n }\n has(): boolean {\n let n = this.n\n while (n && n !== this.e) {\n if (n.nodeType === 1 || n.nodeType === 3) return true\n n = n.nextSibling\n }\n return false\n }\n}\n\nconst hydrationCursors = new WeakMap<Fiber, HydrationCursor>()\nconst PROD_HYDRATION_ERROR = 'Hydration mismatch.'\n\nexport interface HydrationBailoutError extends Error {\n f: Fiber | null\n}\n\nexport function isHydrationBailout(error: unknown): error is HydrationBailoutError {\n return !!error && (error as any).f !== undefined\n}\n\nexport function abortHydration(cause: unknown, fiber: Fiber | null = null): never {\n const error = (cause instanceof Error ? cause : new Error(PROD_HYDRATION_ERROR)) as HydrationBailoutError\n ;(error as any).f = fiber\n throw error\n}\n\ninterface HydrateRootOptions {\n identifierPrefix?: string\n onRecoverableError?: (error: unknown) => void\n onCaughtError?: (error: unknown) => void\n onUncaughtError?: (error: unknown) => void\n}\n\ninterface HydratedRoot {\n render(children: ReactNode): void\n unmount(): void\n}\n\nexport function hydrateRootImpl(\n container: Element | Document,\n initialChildren: ReactNode,\n options: HydrateRootOptions,\n): HydratedRoot {\n const target = container as any as Element | Document\n const isDocument = (container as Node).nodeType === 9\n const body = isDocument ? (target as Document).body : null\n const root = createFiberRoot(target, options)\n\n installHydrationScrollGuard()\n\n const normalizedInitialChildren =\n isDocument ? normalizeDocumentChildren(initialChildren) : initialChildren\n let hydrationError: unknown = null\n beginHydration(root)\n try {\n flushSyncWork(() => {\n renderRoot(root, normalizedInitialChildren)\n })\n } catch (e) {\n hydrationError = e\n }\n endHydration(root)\n\n if (hydrationError && !recoverHydration(root, hydrationError)) throw hydrationError\n drainReplayQueue()\n\n return {\n render(children) {\n flushSyncWork(() => {\n const normalized = isDocument ? normalizeDocumentChildren(children) : children\n renderRoot(\n root,\n root.c === body ? getStaticDocumentBodyChildren(normalized) ?? normalized : normalized,\n )\n })\n },\n unmount() {\n flushSyncWork(() => {\n renderRoot(root, null)\n })\n },\n }\n}\n\n// Head elements that we match against server DOM by attribute signature.\nconst HEAD_KEY_ATTRS: Record<string, ReadonlyArray<string>> = {\n link: ['rel', 'href', 'sizes', 'type'],\n meta: ['name', 'property', 'charSet', 'httpEquiv'],\n script: ['src', 'type'],\n style: ['id', 'media', 'nonce', 'title'],\n}\n\nconst DOCUMENT_HEAD_TAGS = new Set(['base', 'link', 'meta', 'script', 'style', 'title'])\n\n// DOM elements already claimed by some fiber during this hydration pass.\nconst CLAIMED = new WeakSet<Node>()\n\nfunction headAttrsMatch(\n el: Element,\n props: Record<string, any>,\n keys: ReadonlyArray<string> | undefined,\n): boolean {\n if (CLAIMED.has(el)) return false\n if (!keys) return true\n for (const k of keys) {\n const propVal = props[k]\n const elVal = el.getAttribute(attributeName(k))\n if (propVal == null && elVal == null) continue\n if (propVal == null || elVal == null || String(propVal) !== elVal) return false\n }\n return true\n}\n\nexport function beginHydration(root: FiberRoot): void {\n root.ic = 0\n root.h = true\n hydrationCursors.set(root.r, new HydrationCursor(root.c))\n}\n\nexport function endHydration(root: FiberRoot): void {\n root.h = false\n hydrationCursors.delete(root.r)\n}\n\n/**\n * Inspect the current cursor position for a streaming-suspense boundary\n * marker emitted by the server. Returns info + advances the cursor past the\n * marker pair (start comment + fallback/real content + end comment).\n */\nexport type BoundaryInfo = [0 | 1, number, Comment, Comment]\n\nexport function tryConsumeBoundary(parent: Fiber): BoundaryInfo | null {\n const cursor = hydrationCursors.get(findHostParent(parent))\n if (!cursor) return null\n const peek = cursor.n\n if (!peek || peek.nodeType !== 8) return null\n const data = (peek as Comment).data\n const m = /^(\\$\\??)(\\d+)$/.exec(data)\n if (!m) return null\n const kind = m[1] === '$?' ? 1 : 0\n const id = Number(m[2])\n const startMark = peek as Comment\n // Advance past the start comment\n cursor.n = startMark.nextSibling\n // Locate end comment: closest <!--/$-->\n let endMark: Comment | null = null\n let scan = startMark.nextSibling\n while (scan) {\n if (scan.nodeType === 8 && (scan as Comment).data === '/$') {\n endMark = scan as Comment\n break\n }\n scan = scan.nextSibling\n }\n if (!endMark) return null\n return [kind, id, startMark, endMark]\n}\n\nexport function advanceCursorPast(parent: Fiber, node: Node): void {\n const cursor = hydrationCursors.get(findHostParent(parent))\n if (!cursor) return\n cursor.n = node.nextSibling\n}\n\nexport function getHydrationCursor(hostFiber: Fiber): HydrationCursor | undefined {\n return hydrationCursors.get(hostFiber)\n}\n\nexport function setHydrationCursor(hostFiber: Fiber, cursor: HydrationCursor): void {\n hydrationCursors.set(hostFiber, cursor)\n}\n\nexport function clearHydrationCursor(hostFiber: Fiber): void {\n hydrationCursors.delete(hostFiber)\n}\n\n/**\n * Try to adopt a DOM node for this host fiber. Returns true if adopted.\n * Attaches existing attrs/children via separate hydrate pass.\n */\nexport function adoptHostDom(fiber: Fiber, parent: Fiber): boolean {\n const hostParent = findHostParent(parent)\n const cursor = hydrationCursors.get(hostParent)\n if (!cursor) return false\n\n const tag = (fiber.type as string).toLowerCase()\n const documentHeadParent =\n cursor.p.nodeType === 9 && DOCUMENT_HEAD_TAGS.has(tag)\n ? (cursor.p as Document).head\n : null\n const parentEl = cursor.p as Element\n const parentTag =\n parentEl.nodeType === 1 ? (parentEl as Element).tagName.toLowerCase() : ''\n const isHeadish = parentTag === 'head' || parentTag === 'html' || !!documentHeadParent\n\n let candidate: ChildNode | null\n if (documentHeadParent) {\n // React 19 can project <meta>/<title>/<link> from anywhere in the tree into\n // document.head. Redact does not have that projection yet, so when a\n // document-root hydration pass sees a top-level head element, adopt it\n // from <head> rather than trying to append it beside <html>.\n candidate = new HydrationCursor(documentHeadParent).head(\n tag,\n fiber.pp ?? {},\n )\n } else if (isHeadish) {\n // Head/html children are position-insensitive \u2014 server may emit them in\n // a different order than the React tree (React 19 head hoisting, etc.).\n // Scan forward without removing non-matching nodes; match on attribute\n // signature so we don't adopt the wrong <link> and clobber its props.\n candidate = cursor.head(tag, fiber.pp ?? {})\n } else {\n candidate = cursor.take()\n }\n\n if (!candidate) {\n // Client expected a host here but the cursor is exhausted \u2014 server gave\n // fewer children than the client tree. Report the structural gap (React\n // fires `onRecoverableError` for this exact case) and let the reconciler\n // mount a fresh DOM for this fiber below.\n // Exception: <head> children are position-insensitive; a missing match\n // there means \"server didn't hoist this one yet\", which we silently mount.\n if (!isHeadish) onMismatch(fiber, null)\n return false\n }\n\n if (candidate.nodeType !== 1 || (candidate as Element).tagName.toLowerCase() !== tag) {\n // mismatch \u2014 log and re-render fresh from this point\n onMismatch(fiber, candidate)\n return false\n }\n fiber.dom = candidate\n // Apply props (attach events, sync IDL props). Don't re-set existing attrs.\n const props = fiber.pp ?? {}\n const isSvg =\n tag === 'svg' ||\n ((candidate as Element).namespaceURI === 'http://www.w3.org/2000/svg' &&\n tag !== 'foreignobject')\n const syncHydrationProps =\n !props.suppressHydrationWarning &&\n canRecoverHydrationPropMismatch(candidate, tag)\n validateHydrationProps(fiber, candidate as Element, props, tag, isSvg)\n for (const k in props) {\n if (\n k === 'children' ||\n k === 'key' ||\n k === 'ref' ||\n k === 'suppressHydrationWarning' ||\n k === 'suppressContentEditableWarning'\n ) continue\n if (\n syncHydrationProps ||\n (k[0] === 'o' && k[1] === 'n' && typeof props[k] == 'function')\n ) {\n setProp(candidate as Element, k, props[k], undefined, isSvg)\n }\n }\n // Set up child cursor for this host's children\n hydrationCursors.set(fiber, new HydrationCursor(candidate))\n return true\n}\n\nexport function adoptTextDom(fiber: Fiber, parent: Fiber, text: string): boolean {\n const cursor = hydrationCursors.get(findHostParent(parent))\n if (!cursor) return false\n const candidate = cursor.take()\n if (!candidate) {\n onMismatch(fiber, null)\n return false\n }\n if (candidate.nodeType === 3) {\n if ((candidate as Text).data !== text) {\n const recovered = failHydration(\n fiber,\n process.env.NODE_ENV !== 'production'\n ? new Error(\n `Hydration text mismatch: expected \"${text}\" but found \"${(candidate as Text).data}\".`,\n )\n : undefined,\n canRecoverHydrationPropMismatch(candidate),\n )\n if (recovered) {\n ;(candidate as Text).data = text\n }\n }\n fiber.dom = candidate\n return true\n }\n onMismatch(fiber, candidate)\n return false\n}\n\nexport function findHostParent(fiber: Fiber): Fiber {\n let f: Fiber | null = fiber\n while (f) {\n // A fiber explicitly holding a cursor acts as a boundary for hydration\n // (e.g. Suspense with a scoped cursor during fallback/boundary hydration).\n if (hydrationCursors.has(f)) return f\n if (f.tag === FiberTag.Host || f.tag === FiberTag.Root || f.tag === FiberTag.Portal) {\n return f\n }\n f = f.parent\n }\n if (process.env.NODE_ENV !== 'production') {\n throw new Error('No host parent found')\n }\n throw new Error()\n}\n\nfunction onMismatch(fiber: Fiber, actualNode: ChildNode | null): void {\n failHydration(\n fiber,\n process.env.NODE_ENV !== 'production'\n ? new Error(\n `Hydration mismatch: expected <${(fiber.type as string) ?? 'text'}> but found ${\n actualNode ? (actualNode.nodeType === 1 ? (actualNode as Element).tagName : 'text') : 'nothing'\n }.`,\n )\n : undefined,\n )\n}\n\nfunction failHydration(\n fiber: Fiber,\n error: Error = new Error(PROD_HYDRATION_ERROR),\n recoverInPlace = false,\n): boolean {\n const root = findRoot(fiber)\n if (root?.re) {\n root.re(error)\n }\n if (recoverInPlace) return true\n abortHydration(error, findHostRecoveryParent(fiber) ?? fiber)\n}\n\nfunction canRecoverHydrationPropMismatch(node: Node, tag?: string): boolean {\n return (\n tag === 'html' ||\n tag === 'head' ||\n tag === 'body' ||\n !!node.ownerDocument?.head?.contains(node)\n )\n}\n\nfunction findHostRecoveryParent(fiber: Fiber): Fiber | null {\n if (fiber.tag === FiberTag.Text) {\n let directHost = fiber.parent\n while (directHost && (directHost.tag !== FiberTag.Host || !directHost.dom)) {\n directHost = directHost.parent\n }\n if (!directHost) return null\n let hasEvent\n const props = directHost.pp ?? directHost.mp\n if (props) {\n for (const k in props) {\n if (k[0] === 'o' && k[1] === 'n' && typeof props[k] == 'function') {\n hasEvent = true\n }\n }\n }\n return findNearestSafeHostAboveComposite(\n hasEvent\n ? directHost.parent\n : directHost.parent?.tag === FiberTag.Host\n ? directHost.parent\n : directHost,\n )\n }\n\n return findNearestSafeHostAboveComposite(fiber.parent)\n}\n\nfunction findNearestSafeHostAboveComposite(fiber: Fiber | null): Fiber | null {\n let host: Fiber | null = null\n let f = fiber\n while (f) {\n if (f.tag === FiberTag.Host && f.dom) {\n if (!isSafeHostRecoveryElement(f)) return null\n const parentTag = f.parent?.tag as number\n if (!host || (parentTag > FiberTag.Text && parentTag < FiberTag.Suspense)) {\n host = f\n }\n }\n f = f.parent\n }\n return host\n}\n\nfunction isSafeHostRecoveryElement(fiber: Fiber): boolean {\n const tag = fiber.type.toLowerCase()\n return tag !== 'html' && tag !== 'head' && tag !== 'body'\n}\n\nexport function recoverHydration(root: FiberRoot, error: unknown): boolean {\n if (!isHydrationBailout(error)) return false\n\n let container = root.c as Element | Document\n let children = root.r.pp?.children ?? null\n const hostRecovery = getRecoverableHostChildren(error)\n if (hostRecovery) {\n container = hostRecovery[0]\n children = hostRecovery[1]\n } else if (container.nodeType === 9) {\n const bodyChildren = getRecoverableDocumentBodyChildren(error)\n if (bodyChildren != null) {\n container = (container as Document).body\n children = bodyChildren\n }\n }\n\n resetAfterHydrationFailure(root, container)\n try {\n flushSyncWork(() => renderRoot(root, children))\n } catch (clientError) {\n resetAfterHydrationFailure(root, container)\n throw clientError\n }\n return true\n}\n\nfunction resetAfterHydrationFailure(\n root: FiberRoot,\n container: Element | Document,\n): void {\n discardPendingWork(root)\n clearHydrationContainer(container)\n attachRootFiber(root, container)\n root.h = false\n}\n\nfunction clearHydrationContainer(container: Element | Document): void {\n if (container.nodeType === 9) {\n let node = container.firstChild\n while (node) {\n const next = node.nextSibling\n if (node.nodeType !== 10 /* DOCUMENT_TYPE_NODE */) {\n container.removeChild(node)\n }\n node = next\n }\n return\n }\n ;(container as Element).textContent = ''\n}\n\nfunction getRecoverableHostChildren(\n error: HydrationBailoutError,\n): [Element, ReactNode] | null {\n const host = error.f\n if (\n host?.tag !== FiberTag.Host ||\n !host.dom ||\n !findNearestSafeHostAboveComposite(host.parent)\n ) {\n return null\n }\n return [host.dom as Element, (host.pp ?? host.mp)?.children ?? null]\n}\n\nfunction getRecoverableDocumentBodyChildren(error: HydrationBailoutError): ReactNode | null {\n const bodyFiber = findBodyAncestor(error.f)\n if (!bodyFiber) return null\n return (bodyFiber.pp ?? bodyFiber.mp)?.children ?? null\n}\n\nfunction findBodyAncestor(fiber: Fiber | null): Fiber | null {\n let f = fiber\n while (f) {\n if (f.tag === FiberTag.Host && f.type === 'body') {\n return f === fiber ? null : f\n }\n f = f.parent\n }\n return null\n}\n\nfunction getStaticDocumentBodyChildren(children: ReactNode): ReactNode | null {\n const list = toChildArray(children)\n const html = list.find((child) => isHostElement(child, 'html')) as ReactElement | undefined\n if (!html) return null\n const htmlChildren = toChildArray(html.props?.children)\n const body = htmlChildren.find((child) => isHostElement(child, 'body')) as ReactElement | undefined\n return body ? body.props?.children ?? null : null\n}\n\nfunction normalizeDocumentChildren(children: ReactNode): ReactNode {\n const list = toChildArray(children)\n const htmlIndex = list.findIndex((child) => isHostElement(child, 'html'))\n if (htmlIndex === -1) return children\n\n const headNodes = list.filter(isHeadElement)\n if (headNodes.length === 0) return children\n\n const htmlElement = list[htmlIndex] as ReactElement\n const normalizedHtml = hoistIntoHtmlHead(htmlElement, headNodes)\n return list\n .filter((child, index) => index === htmlIndex || !isHeadElement(child))\n .map((child) => (child === htmlElement ? normalizedHtml : child))\n}\n\nfunction hoistIntoHtmlHead(htmlElement: ReactElement, headNodes: ReactNode[]): ReactElement {\n const htmlChildren = toChildArray(htmlElement.props?.children)\n const headIndex = htmlChildren.findIndex((child) => isHostElement(child, 'head'))\n let nextChildren: ReactNode[]\n\n if (headIndex === -1) {\n nextChildren = [\n createHostElement('head', { children: headNodes }),\n ...htmlChildren,\n ]\n } else {\n const headElement = htmlChildren[headIndex] as ReactElement\n const existingHeadChildren = toChildArray(headElement.props?.children)\n const nextHead = {\n ...headElement,\n props: {\n ...headElement.props,\n children: [...headNodes, ...existingHeadChildren],\n },\n }\n nextChildren = htmlChildren.map((child, index) => (index === headIndex ? nextHead : child))\n }\n\n return {\n ...htmlElement,\n props: {\n ...htmlElement.props,\n children: nextChildren,\n },\n }\n}\n\nfunction toChildArray(children: unknown): ReactNode[] {\n if (children == null || typeof children === 'boolean') return []\n if (Array.isArray(children)) return children as ReactNode[]\n if (isReactElement(children)) return [children]\n if (typeof children !== 'string' && isIterable(children)) return Array.from(children) as ReactNode[]\n return [children as ReactNode]\n}\n\nfunction isHeadElement(value: ReactNode): boolean {\n return isReactElement(value) && typeof value.type === 'string' && DOCUMENT_HEAD_TAGS.has(value.type)\n}\n\nfunction isHostElement(value: ReactNode, tag: string): boolean {\n return isReactElement(value) && value.type === tag\n}\n\nfunction isReactElement(value: unknown): value is ReactElement {\n return !!value && typeof value === 'object' && (value as ReactElement).$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction isIterable(value: unknown): value is Iterable<ReactNode> {\n return !!value && typeof (value as { [Symbol.iterator]?: unknown })[Symbol.iterator] == 'function'\n}\n\nfunction createHostElement(type: string, props: Record<string, unknown>): ReactElement {\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type,\n key: null,\n ref: null,\n props,\n }\n}\n\nfunction validateHydrationProps(\n fiber: Fiber,\n el: Element,\n props: Record<string, any>,\n tag: string,\n isSvg: boolean,\n): void {\n if (props.suppressHydrationWarning) return\n\n const recoverInPlace = canRecoverHydrationPropMismatch(el, tag)\n let expected: Element | undefined\n\n for (const k in props) {\n const value = props[k]\n if (\n k === 'children' ||\n k === 'key' ||\n k === 'ref' ||\n k === 'suppressHydrationWarning' ||\n k === 'suppressContentEditableWarning' ||\n (k[0] === 'o' && k[1] === 'n' && typeof value == 'function')\n ) continue\n\n if (k === 'dangerouslySetInnerHTML') {\n let html = '' + (value?.__html ?? '')\n if (tag !== 'script' && tag !== 'style') {\n const probe = document.createElement('div')\n probe.innerHTML = html\n html = probe.innerHTML\n }\n if ((el as HTMLElement).innerHTML !== html) {\n failHydration(\n fiber,\n process.env.NODE_ENV !== 'production'\n ? new Error(`Hydration HTML mismatch inside <${tag}>.`)\n : undefined,\n recoverInPlace,\n )\n }\n continue\n }\n\n if (k === 'value' || k === 'defaultValue') {\n if (tag === 'select') continue\n if (tag === 'input' || tag === 'textarea') {\n if (k === 'value' || props.value == null) {\n if (value != null && (el as HTMLInputElement).value !== '' + value) {\n failHydration(\n fiber,\n process.env.NODE_ENV !== 'production'\n ? new Error(`Hydration ${tag} value mismatch on <${tag}>.`)\n : undefined,\n recoverInPlace,\n )\n }\n }\n continue\n }\n }\n\n if (tag === 'input' && (k === 'checked' || k === 'defaultChecked')) {\n if (k === 'checked' || props.checked == null) {\n if (value != null && (el as HTMLInputElement).checked !== !!value) {\n failHydration(\n fiber,\n process.env.NODE_ENV !== 'production'\n ? new Error(`Hydration checked mismatch on <input>.`)\n : undefined,\n recoverInPlace,\n )\n }\n }\n continue\n }\n\n if (tag === 'option' && k === 'selected') {\n if (value != null && (el as HTMLOptionElement).selected !== !!value) {\n failHydration(\n fiber,\n process.env.NODE_ENV !== 'production'\n ? new Error(`Hydration selected mismatch on <option>.`)\n : undefined,\n recoverInPlace,\n )\n }\n continue\n }\n\n if (k === 'style') {\n expected ??= createHostNode(tag, isSvg)\n setProp(expected, k, value, undefined, isSvg)\n if (\n !hydrationStylesMatch(\n (el as HTMLElement).style,\n (expected as HTMLElement).style,\n )\n ) {\n failHydration(\n fiber,\n process.env.NODE_ENV !== 'production'\n ? new Error(`Hydration style mismatch on <${tag}>.`)\n : undefined,\n recoverInPlace,\n )\n }\n continue\n }\n\n const attr = attributeName(k, isSvg)\n const stringifiedBoolean =\n STRING_BOOLEAN_ATTRS.has(attr) || k.startsWith('aria-') || k.startsWith('data-')\n\n let expectedValue: string | null\n if (value == null || (value === false && !stringifiedBoolean)) {\n expectedValue = null\n } else if (k === 'muted' && !isSvg && (tag === 'video' || tag === 'audio')) {\n // The muted property controls playback; defaultMuted reflects the SSR attribute.\n expectedValue = value ? '' : null\n } else {\n expected ??= createHostNode(tag, isSvg)\n setProp(expected, k, value, undefined, isSvg)\n expectedValue = expected.getAttribute(attr)\n }\n const actualValue = el.getAttribute(attr)\n if (expectedValue !== actualValue) {\n failHydration(\n fiber,\n process.env.NODE_ENV !== 'production'\n ? new Error(\n `Hydration attribute mismatch on <${tag}> for \"${attr}\": ` +\n `expected ${formatHydrationValue(expectedValue)} but found ${formatHydrationValue(actualValue)}.`,\n )\n : undefined,\n recoverInPlace,\n )\n }\n }\n}\n\nfunction hydrationStylesMatch(\n actual: CSSStyleDeclaration,\n expected: CSSStyleDeclaration,\n): boolean {\n for (let index = 0; index < expected.length; index++) {\n const property = expected.item(index)\n if (\n actual.getPropertyValue(property) !== expected.getPropertyValue(property) ||\n actual.getPropertyPriority(property) !== expected.getPropertyPriority(property)\n ) {\n return false\n }\n }\n return true\n}\n\nfunction formatHydrationValue(value: string | null): string {\n return value == null ? 'nothing' : JSON.stringify(value)\n}\n"],
|
|
5
|
-
"mappings": ";AAAA;AAAA,EACE;AAAA,EACA;AAAA,OAKK;AACP,SAAS,eAAe,4BAA4B;AACpD,SAAS,gBAAgB,eAAe;AACxC,SAAS,wBAAwB;AACjC,SAAS,oBAAoB,UAAU,eAAe,kBAAkB;AACxE,SAAS,iBAAiB,uBAAuB;AAgB1C,SAAS,8BAAoC;AAClD,MAAI,OAAO,WAAW,YAAa;AACnC,QAAM,IAAI;AACV,MAAI,EAAE,GAAI;AACV,QAAM,OAAO,KAAK;AAClB,QAAM,iBAAiB,EAAE,KAAK,KAAK;AACnC,MAAI,mBAAmB;AACvB,MAAI,eAAe;AACnB,IAAE;AAAA,IACA;AAAA,IACA,MAAM;AACJ,UAAI,CAAC,cAAc;AACjB,2BAAmB,KAAK;AAAA,MAC1B;AAAA,IACF;AAAA,IACA,EAAE,SAAS,MAAM,SAAS,KAAK;AAAA,EACjC;AACA,QAAM,eAAe,EAAE;AACvB,IAAE,WAAW,YAAa,MAAa;AACrC,UAAM,MAAM,KAAK;AACjB,QACE,MAAM,iBAAiB,OACvB,MAAM,mBAAmB,MACzB;AACA;AAAA,IACF;AACA,mBAAe;AACf,QAAI;AACF,aAAQ,aAAqB,MAAM,GAAG,IAAI;AAAA,IAC5C,UAAE;AACA,qBAAe,MAAM;AACnB,uBAAe;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,EACF;AACF;AASO,IAAM,kBAAN,MAAsB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,QAAc,QAA0B,MAAM,YAA8B,MAAM;AAC5F,SAAK,IAAI;AACT,SAAK,IAAI,SAAS,OAAO;AACzB,SAAK,IAAI;AAAA,EACX;AAAA,EACA,OAAyB;AACvB,WAAO,KAAK,KAAK,KAAK,MAAM,KAAK,GAAG;AAClC,YAAM,IAAI,KAAK;AAGf,UAAI,EAAE,aAAa,KAAK,EAAE,aAAa,GAAG;AACxC,aAAK,IAAI,EAAE;AACX;AAAA,MACF;AACA,WAAK,IAAI,EAAE;AACX,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAK,KAAa,OAA8C;AAC9D,UAAM,SAAS,IAAI,YAAY;AAC/B,UAAM,WAAW,eAAe,MAAM;AACtC,QAAI,OAAO,KAAK,EAAE;AAClB,WAAO,MAAM;AACX,UACE,KAAK,aAAa,KACjB,KAAiB,QAAQ,YAAY,MAAM,UAC5C,eAAe,MAAiB,OAAO,QAAQ,GAC/C;AACA,gBAAQ,IAAI,IAAI;AAChB,eAAO;AAAA,MACT;AACA,aAAO,KAAK;AAAA,IACd;AACA,WAAO;AAAA,EACT;AAAA,EACA,MAAe;AACb,QAAI,IAAI,KAAK;AACb,WAAO,KAAK,MAAM,KAAK,GAAG;AACxB,UAAI,EAAE,aAAa,KAAK,EAAE,aAAa,EAAG,QAAO;AACjD,UAAI,EAAE;AAAA,IACR;AACA,WAAO;AAAA,EACT;AACF;AAEA,IAAM,mBAAmB,oBAAI,QAAgC;AAC7D,IAAM,uBAAuB;AAMtB,SAAS,mBAAmB,OAAgD;AACjF,SAAO,CAAC,CAAC,SAAU,MAAc,MAAM;AACzC;AAEO,SAAS,eAAe,OAAgB,QAAsB,MAAa;AAChF,QAAM,QAAS,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,oBAAoB;AAC7E,EAAC,MAAc,IAAI;AACpB,QAAM;AACR;AAcO,SAAS,gBACd,WACA,iBACA,SACc;AACd,QAAM,SAAS;AACf,QAAM,aAAc,UAAmB,aAAa;AACpD,QAAM,OAAO,aAAc,OAAoB,OAAO;AACtD,QAAM,OAAO,gBAAgB,QAAQ,OAAO;AAE5C,8BAA4B;AAE5B,QAAM,4BACJ,aAAa,0BAA0B,eAAe,IAAI;AAC5D,MAAI,iBAA0B;AAC9B,iBAAe,IAAI;AACnB,MAAI;AACF,kBAAc,MAAM;AAClB,iBAAW,MAAM,yBAAyB;AAAA,IAC5C,CAAC;AAAA,EACH,SAAS,GAAG;AACV,qBAAiB;AAAA,EACnB;AACA,eAAa,IAAI;AAEjB,MAAI,kBAAkB,CAAC,iBAAiB,MAAM,cAAc,EAAG,OAAM;AACrE,mBAAiB;AAEjB,SAAO;AAAA,IACL,OAAO,UAAU;AACf,oBAAc,MAAM;AAClB,cAAM,aAAa,aAAa,0BAA0B,QAAQ,IAAI;AACtE;AAAA,UACE;AAAA,UACA,KAAK,MAAM,OAAO,8BAA8B,UAAU,KAAK,aAAa;AAAA,QAC9E;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,UAAU;AACR,oBAAc,MAAM;AAClB,mBAAW,MAAM,IAAI;AAAA,MACvB,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAGA,IAAM,iBAAwD;AAAA,EAC5D,MAAM,CAAC,OAAO,QAAQ,SAAS,MAAM;AAAA,EACrC,MAAM,CAAC,QAAQ,YAAY,WAAW,WAAW;AAAA,EACjD,QAAQ,CAAC,OAAO,MAAM;AAAA,EACtB,OAAO,CAAC,MAAM,SAAS,SAAS,OAAO;AACzC;AAEA,IAAM,qBAAqB,oBAAI,IAAI,CAAC,QAAQ,QAAQ,QAAQ,UAAU,SAAS,OAAO,CAAC;AAGvF,IAAM,UAAU,oBAAI,QAAc;AAElC,SAAS,eACP,IACA,OACA,MACS;AACT,MAAI,QAAQ,IAAI,EAAE,EAAG,QAAO;AAC5B,MAAI,CAAC,KAAM,QAAO;AAClB,aAAW,KAAK,MAAM;AACpB,UAAM,UAAU,MAAM,CAAC;AACvB,UAAM,QAAQ,GAAG,aAAa,cAAc,CAAC,CAAC;AAC9C,QAAI,WAAW,QAAQ,SAAS,KAAM;AACtC,QAAI,WAAW,QAAQ,SAAS,QAAQ,OAAO,OAAO,MAAM,MAAO,QAAO;AAAA,EAC5E;AACA,SAAO;AACT;AAEO,SAAS,eAAe,MAAuB;AACpD,OAAK,KAAK;AACV,OAAK,IAAI;AACT,mBAAiB,IAAI,KAAK,GAAG,IAAI,gBAAgB,KAAK,CAAC,CAAC;AAC1D;AAEO,SAAS,aAAa,MAAuB;AAClD,OAAK,IAAI;AACT,mBAAiB,OAAO,KAAK,CAAC;AAChC;AASO,SAAS,mBAAmB,QAAoC;AACrE,QAAM,SAAS,iBAAiB,IAAI,eAAe,MAAM,CAAC;AAC1D,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,OAAO,OAAO;AACpB,MAAI,CAAC,QAAQ,KAAK,aAAa,EAAG,QAAO;AACzC,QAAM,OAAQ,KAAiB;AAC/B,QAAM,IAAI,iBAAiB,KAAK,IAAI;AACpC,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,OAAO,EAAE,CAAC,MAAM,OAAO,IAAI;AACjC,QAAM,KAAK,OAAO,EAAE,CAAC,CAAC;AACtB,QAAM,YAAY;AAElB,SAAO,IAAI,UAAU;AAErB,MAAI,UAA0B;AAC9B,MAAI,OAAO,UAAU;AACrB,SAAO,MAAM;AACX,QAAI,KAAK,aAAa,KAAM,KAAiB,SAAS,MAAM;AAC1D,gBAAU;AACV;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AACA,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,CAAC,MAAM,IAAI,WAAW,OAAO;AACtC;AAEO,SAAS,kBAAkB,QAAe,MAAkB;AACjE,QAAM,SAAS,iBAAiB,IAAI,eAAe,MAAM,CAAC;AAC1D,MAAI,CAAC,OAAQ;AACb,SAAO,IAAI,KAAK;AAClB;AAEO,SAAS,mBAAmB,WAA+C;AAChF,SAAO,iBAAiB,IAAI,SAAS;AACvC;AAEO,SAAS,mBAAmB,WAAkB,QAA+B;AAClF,mBAAiB,IAAI,WAAW,MAAM;AACxC;AAEO,SAAS,qBAAqB,WAAwB;AAC3D,mBAAiB,OAAO,SAAS;AACnC;AAMO,SAAS,aAAa,OAAc,QAAwB;AACjE,QAAM,aAAa,eAAe,MAAM;AACxC,QAAM,SAAS,iBAAiB,IAAI,UAAU;AAC9C,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,MAAO,MAAM,KAAgB,YAAY;AAC/C,QAAM,qBACJ,OAAO,EAAE,aAAa,KAAK,mBAAmB,IAAI,GAAG,IAChD,OAAO,EAAe,OACvB;AACN,QAAM,WAAW,OAAO;AACxB,QAAM,YACJ,SAAS,aAAa,IAAK,SAAqB,QAAQ,YAAY,IAAI;AAC1E,QAAM,YAAY,cAAc,UAAU,cAAc,UAAU,CAAC,CAAC;AAEpE,MAAI;AACJ,MAAI,oBAAoB;AAKtB,gBAAY,IAAI,gBAAgB,kBAAkB,EAAE;AAAA,MAClD;AAAA,MACA,MAAM,MAAM,CAAC;AAAA,IACf;AAAA,EACF,WAAW,WAAW;AAKpB,gBAAY,OAAO,KAAK,KAAK,MAAM,MAAM,CAAC,CAAC;AAAA,EAC7C,OAAO;AACL,gBAAY,OAAO,KAAK;AAAA,EAC1B;AAEA,MAAI,CAAC,WAAW;AAOd,QAAI,CAAC,UAAW,YAAW,OAAO,IAAI;AACtC,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,aAAa,KAAM,UAAsB,QAAQ,YAAY,MAAM,KAAK;AAEpF,eAAW,OAAO,SAAS;AAC3B,WAAO;AAAA,EACT;AACA,QAAM,MAAM;AAEZ,QAAM,QAAQ,MAAM,MAAM,CAAC;AAC3B,QAAM,QACJ,QAAQ,SACN,UAAsB,iBAAiB,gCACvC,QAAQ;AACZ,QAAM,qBACJ,CAAC,MAAM,4BACP,gCAAgC,WAAW,GAAG;AAChD,yBAAuB,OAAO,WAAsB,OAAO,KAAK,KAAK;AACrE,aAAW,KAAK,OAAO;AACrB,QACE,MAAM,cACN,MAAM,SACN,MAAM,SACN,MAAM,8BACN,MAAM,iCACN;AACF,QACE,sBACC,EAAE,CAAC,MAAM,OAAO,EAAE,CAAC,MAAM,OAAO,OAAO,MAAM,CAAC,KAAK,YACpD;AACA,cAAQ,WAAsB,GAAG,MAAM,CAAC,GAAG,QAAW,KAAK;AAAA,IAC7D;AAAA,EACF;AAEA,mBAAiB,IAAI,OAAO,IAAI,gBAAgB,SAAS,CAAC;AAC1D,SAAO;AACT;AAEO,SAAS,aAAa,OAAc,QAAe,MAAuB;AAC/E,QAAM,SAAS,iBAAiB,IAAI,eAAe,MAAM,CAAC;AAC1D,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,YAAY,OAAO,KAAK;AAC9B,MAAI,CAAC,WAAW;AACd,eAAW,OAAO,IAAI;AACtB,WAAO;AAAA,EACT;AACA,MAAI,UAAU,aAAa,GAAG;AAC5B,QAAK,UAAmB,SAAS,MAAM;AACrC,YAAM,YAAY;AAAA,QAChB;AAAA,QACA,OACI,IAAI;AAAA,UACF,sCAAsC,IAAI,gBAAiB,UAAmB,IAAI;AAAA,QACpF,IACA;AAAA,QACJ,gCAAgC,SAAS;AAAA,MAC3C;AACA,UAAI,WAAW;AACb;AAAC,QAAC,UAAmB,OAAO;AAAA,MAC9B;AAAA,IACF;AACA,UAAM,MAAM;AACZ,WAAO;AAAA,EACT;AACA,aAAW,OAAO,SAAS;AAC3B,SAAO;AACT;AAEO,SAAS,eAAe,OAAqB;AAClD,MAAI,IAAkB;AACtB,SAAO,GAAG;AAGR,QAAI,iBAAiB,IAAI,CAAC,EAAG,QAAO;AACpC,QAAI,EAAE,QAAQ,SAAS,QAAQ,EAAE,QAAQ,SAAS,QAAQ,EAAE,QAAQ,SAAS,QAAQ;AACnF,aAAO;AAAA,IACT;AACA,QAAI,EAAE;AAAA,EACR;AACA,MAAI,MAAuC;AACzC,UAAM,IAAI,MAAM,sBAAsB;AAAA,EACxC;AACA,QAAM,IAAI,MAAM;AAClB;AAEA,SAAS,WAAW,OAAc,YAAoC;AACpE;AAAA,IACE;AAAA,IACA,OACI,IAAI;AAAA,MACF,iCAAkC,MAAM,QAAmB,MAAM,eAC/D,aAAc,WAAW,aAAa,IAAK,WAAuB,UAAU,SAAU,SACxF;AAAA,IACF,IACA;AAAA,EACN;AACF;AAEA,SAAS,cACP,OACA,QAAe,IAAI,MAAM,oBAAoB,GAC7C,iBAAiB,OACR;AACT,QAAM,OAAO,SAAS,KAAK;AAC3B,MAAI,MAAM,IAAI;AACZ,SAAK,GAAG,KAAK;AAAA,EACf;AACA,MAAI,eAAgB,QAAO;AAC3B,iBAAe,OAAO,uBAAuB,KAAK,KAAK,KAAK;AAC9D;AAEA,SAAS,gCAAgC,MAAY,KAAuB;AAC1E,SACE,QAAQ,UACR,QAAQ,UACR,QAAQ,UACR,CAAC,CAAC,KAAK,eAAe,MAAM,SAAS,IAAI;AAE7C;AAEA,SAAS,uBAAuB,OAA4B;AAC1D,MAAI,MAAM,QAAQ,SAAS,MAAM;AAC/B,QAAI,aAAa,MAAM;AACvB,WAAO,eAAe,WAAW,QAAQ,SAAS,QAAQ,CAAC,WAAW,MAAM;AAC1E,mBAAa,WAAW;AAAA,IAC1B;AACA,QAAI,CAAC,WAAY,QAAO;AACxB,QAAI;AACJ,UAAM,QAAQ,WAAW,MAAM,WAAW;AAC1C,QAAI,OAAO;AACT,iBAAW,KAAK,OAAO;AACrB,YAAI,EAAE,CAAC,MAAM,OAAO,EAAE,CAAC,MAAM,OAAO,OAAO,MAAM,CAAC,KAAK,YAAY;AACjE,qBAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL,WACI,WAAW,SACX,WAAW,QAAQ,QAAQ,SAAS,OAClC,WAAW,SACX;AAAA,IACR;AAAA,EACF;AAEA,SAAO,kCAAkC,MAAM,MAAM;AACvD;AAEA,SAAS,kCAAkC,OAAmC;AAC5E,MAAI,OAAqB;AACzB,MAAI,IAAI;AACR,SAAO,GAAG;AACR,QAAI,EAAE,QAAQ,SAAS,QAAQ,EAAE,KAAK;AACpC,UAAI,CAAC,0BAA0B,CAAC,EAAG,QAAO;AAC1C,YAAM,YAAY,EAAE,QAAQ;AAC5B,UAAI,CAAC,QAAS,YAAY,SAAS,QAAQ,YAAY,SAAS,UAAW;AACzE,eAAO;AAAA,MACT;AAAA,IACF;AACA,QAAI,EAAE;AAAA,EACR;AACA,SAAO;AACT;AAEA,SAAS,0BAA0B,OAAuB;AACxD,QAAM,MAAM,MAAM,KAAK,YAAY;AACnC,SAAO,QAAQ,UAAU,QAAQ,UAAU,QAAQ;AACrD;AAEO,SAAS,iBAAiB,MAAiB,OAAyB;AACzE,MAAI,CAAC,mBAAmB,KAAK,EAAG,QAAO;AAEvC,MAAI,YAAY,KAAK;AACrB,MAAI,WAAW,KAAK,EAAE,IAAI,YAAY;AACtC,QAAM,eAAe,2BAA2B,KAAK;AACrD,MAAI,cAAc;AAChB,gBAAY,aAAa,CAAC;AAC1B,eAAW,aAAa,CAAC;AAAA,EAC3B,WAAW,UAAU,aAAa,GAAG;AACnC,UAAM,eAAe,mCAAmC,KAAK;AAC7D,QAAI,gBAAgB,MAAM;AACxB,kBAAa,UAAuB;AACpC,iBAAW;AAAA,IACb;AAAA,EACF;AAEA,6BAA2B,MAAM,SAAS;AAC1C,MAAI;AACF,kBAAc,MAAM,WAAW,MAAM,QAAQ,CAAC;AAAA,EAChD,SAAS,aAAa;AACpB,+BAA2B,MAAM,SAAS;AAC1C,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAEA,SAAS,2BACP,MACA,WACM;AACN,qBAAmB,IAAI;AACvB,0BAAwB,SAAS;AACjC,kBAAgB,MAAM,SAAS;AAC/B,OAAK,IAAI;AACX;AAEA,SAAS,wBAAwB,WAAqC;AACpE,MAAI,UAAU,aAAa,GAAG;AAC5B,QAAI,OAAO,UAAU;AACrB,WAAO,MAAM;AACX,YAAM,OAAO,KAAK;AAClB,UAAI,KAAK,aAAa,IAA6B;AACjD,kBAAU,YAAY,IAAI;AAAA,MAC5B;AACA,aAAO;AAAA,IACT;AACA;AAAA,EACF;AACA;AAAC,EAAC,UAAsB,cAAc;AACxC;AAEA,SAAS,2BACP,OAC6B;AAC7B,QAAM,OAAO,MAAM;AACnB,MACE,MAAM,QAAQ,SAAS,QACvB,CAAC,KAAK,OACN,CAAC,kCAAkC,KAAK,MAAM,GAC9C;AACA,WAAO;AAAA,EACT;AACA,SAAO,CAAC,KAAK,MAAiB,KAAK,MAAM,KAAK,KAAK,YAAY,IAAI;AACrE;AAEA,SAAS,mCAAmC,OAAgD;AAC1F,QAAM,YAAY,iBAAiB,MAAM,CAAC;AAC1C,MAAI,CAAC,UAAW,QAAO;AACvB,UAAQ,UAAU,MAAM,UAAU,KAAK,YAAY;AACrD;AAEA,SAAS,iBAAiB,OAAmC;AAC3D,MAAI,IAAI;AACR,SAAO,GAAG;AACR,QAAI,EAAE,QAAQ,SAAS,QAAQ,EAAE,SAAS,QAAQ;AAChD,aAAO,MAAM,QAAQ,OAAO;AAAA,IAC9B;AACA,QAAI,EAAE;AAAA,EACR;AACA,SAAO;AACT;AAEA,SAAS,8BAA8B,UAAuC;AAC5E,QAAM,OAAO,aAAa,QAAQ;AAClC,QAAM,OAAO,KAAK,KAAK,CAAC,UAAU,cAAc,OAAO,MAAM,CAAC;AAC9D,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,eAAe,aAAa,KAAK,OAAO,QAAQ;AACtD,QAAM,OAAO,aAAa,KAAK,CAAC,UAAU,cAAc,OAAO,MAAM,CAAC;AACtE,SAAO,OAAO,KAAK,OAAO,YAAY,OAAO;AAC/C;AAEA,SAAS,0BAA0B,UAAgC;AACjE,QAAM,OAAO,aAAa,QAAQ;AAClC,QAAM,YAAY,KAAK,UAAU,CAAC,UAAU,cAAc,OAAO,MAAM,CAAC;AACxE,MAAI,cAAc,GAAI,QAAO;AAE7B,QAAM,YAAY,KAAK,OAAO,aAAa;AAC3C,MAAI,UAAU,WAAW,EAAG,QAAO;AAEnC,QAAM,cAAc,KAAK,SAAS;AAClC,QAAM,iBAAiB,kBAAkB,aAAa,SAAS;AAC/D,SAAO,KACJ,OAAO,CAAC,OAAO,UAAU,UAAU,aAAa,CAAC,cAAc,KAAK,CAAC,EACrE,IAAI,CAAC,UAAW,UAAU,cAAc,iBAAiB,KAAM;AACpE;AAEA,SAAS,kBAAkB,aAA2B,WAAsC;AAC1F,QAAM,eAAe,aAAa,YAAY,OAAO,QAAQ;AAC7D,QAAM,YAAY,aAAa,UAAU,CAAC,UAAU,cAAc,OAAO,MAAM,CAAC;AAChF,MAAI;AAEJ,MAAI,cAAc,IAAI;AACpB,mBAAe;AAAA,MACb,kBAAkB,QAAQ,EAAE,UAAU,UAAU,CAAC;AAAA,MACjD,GAAG;AAAA,IACL;AAAA,EACF,OAAO;AACL,UAAM,cAAc,aAAa,SAAS;AAC1C,UAAM,uBAAuB,aAAa,YAAY,OAAO,QAAQ;AACrE,UAAM,WAAW;AAAA,MACf,GAAG;AAAA,MACH,OAAO;AAAA,QACL,GAAG,YAAY;AAAA,QACf,UAAU,CAAC,GAAG,WAAW,GAAG,oBAAoB;AAAA,MAClD;AAAA,IACF;AACA,mBAAe,aAAa,IAAI,CAAC,OAAO,UAAW,UAAU,YAAY,WAAW,KAAM;AAAA,EAC5F;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO;AAAA,MACL,GAAG,YAAY;AAAA,MACf,UAAU;AAAA,IACZ;AAAA,EACF;AACF;AAEA,SAAS,aAAa,UAAgC;AACpD,MAAI,YAAY,QAAQ,OAAO,aAAa,UAAW,QAAO,CAAC;AAC/D,MAAI,MAAM,QAAQ,QAAQ,EAAG,QAAO;AACpC,MAAI,eAAe,QAAQ,EAAG,QAAO,CAAC,QAAQ;AAC9C,MAAI,OAAO,aAAa,YAAY,WAAW,QAAQ,EAAG,QAAO,MAAM,KAAK,QAAQ;AACpF,SAAO,CAAC,QAAqB;AAC/B;AAEA,SAAS,cAAc,OAA2B;AAChD,SAAO,eAAe,KAAK,KAAK,OAAO,MAAM,SAAS,YAAY,mBAAmB,IAAI,MAAM,IAAI;AACrG;AAEA,SAAS,cAAc,OAAkB,KAAsB;AAC7D,SAAO,eAAe,KAAK,KAAK,MAAM,SAAS;AACjD;AAEA,SAAS,eAAe,OAAuC;AAC7D,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAa,MAAuB,aAAa;AACtF;AAEA,SAAS,WAAW,OAA8C;AAChE,SAAO,CAAC,CAAC,SAAS,OAAQ,MAA0C,OAAO,QAAQ,KAAK;AAC1F;AAEA,SAAS,kBAAkB,MAAc,OAA8C;AACrF,SAAO;AAAA,IACL,UAAU;AAAA,IACV;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AAAA,EACF;AACF;AAEA,SAAS,uBACP,OACA,IACA,OACA,KACA,OACM;AACN,MAAI,MAAM,yBAA0B;AAEpC,QAAM,iBAAiB,gCAAgC,IAAI,GAAG;AAC9D,MAAI;AAEJ,aAAW,KAAK,OAAO;AACrB,UAAM,QAAQ,MAAM,CAAC;AACrB,QACE,MAAM,cACN,MAAM,SACN,MAAM,SACN,MAAM,8BACN,MAAM,oCACL,EAAE,CAAC,MAAM,OAAO,EAAE,CAAC,MAAM,OAAO,OAAO,SAAS,WACjD;AAEF,QAAI,MAAM,2BAA2B;AACnC,UAAI,OAAO,MAAM,OAAO,UAAU;AAClC,UAAI,QAAQ,YAAY,QAAQ,SAAS;AACvC,cAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,cAAM,YAAY;AAClB,eAAO,MAAM;AAAA,MACf;AACA,UAAK,GAAmB,cAAc,MAAM;AAC1C;AAAA,UACE;AAAA,UACA,OACI,IAAI,MAAM,mCAAmC,GAAG,IAAI,IACpD;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,MAAM,WAAW,MAAM,gBAAgB;AACzC,UAAI,QAAQ,SAAU;AACtB,UAAI,QAAQ,WAAW,QAAQ,YAAY;AACzC,YAAI,MAAM,WAAW,MAAM,SAAS,MAAM;AACxC,cAAI,SAAS,QAAS,GAAwB,UAAU,KAAK,OAAO;AAClE;AAAA,cACE;AAAA,cACA,OACI,IAAI,MAAM,aAAa,GAAG,uBAAuB,GAAG,IAAI,IACxD;AAAA,cACJ;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,YAAY,MAAM,aAAa,MAAM,mBAAmB;AAClE,UAAI,MAAM,aAAa,MAAM,WAAW,MAAM;AAC5C,YAAI,SAAS,QAAS,GAAwB,YAAY,CAAC,CAAC,OAAO;AACjE;AAAA,YACE;AAAA,YACA,OACI,IAAI,MAAM,wCAAwC,IAClD;AAAA,YACJ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,YAAY,MAAM,YAAY;AACxC,UAAI,SAAS,QAAS,GAAyB,aAAa,CAAC,CAAC,OAAO;AACnE;AAAA,UACE;AAAA,UACA,OACI,IAAI,MAAM,0CAA0C,IACpD;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,MAAM,SAAS;AACjB,mBAAa,eAAe,KAAK,KAAK;AACtC,cAAQ,UAAU,GAAG,OAAO,QAAW,KAAK;AAC5C,UACE,CAAC;AAAA,QACE,GAAmB;AAAA,QACnB,SAAyB;AAAA,MAC5B,GACA;AACA;AAAA,UACE;AAAA,UACA,OACI,IAAI,MAAM,gCAAgC,GAAG,IAAI,IACjD;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,OAAO,cAAc,GAAG,KAAK;AACnC,UAAM,qBACJ,qBAAqB,IAAI,IAAI,KAAK,EAAE,WAAW,OAAO,KAAK,EAAE,WAAW,OAAO;AAEjF,QAAI;AACJ,QAAI,SAAS,QAAS,UAAU,SAAS,CAAC,oBAAqB;AAC7D,sBAAgB;AAAA,IAClB,WAAW,MAAM,WAAW,CAAC,UAAU,QAAQ,WAAW,QAAQ,UAAU;AAE1E,sBAAgB,QAAQ,KAAK;AAAA,IAC/B,OAAO;AACL,mBAAa,eAAe,KAAK,KAAK;AACtC,cAAQ,UAAU,GAAG,OAAO,QAAW,KAAK;AAC5C,sBAAgB,SAAS,aAAa,IAAI;AAAA,IAC5C;AACA,UAAM,cAAc,GAAG,aAAa,IAAI;AACxC,QAAI,kBAAkB,aAAa;AACjC;AAAA,QACE;AAAA,QACA,OACI,IAAI;AAAA,UACF,oCAAoC,GAAG,UAAU,IAAI,eACvC,qBAAqB,aAAa,CAAC,cAAc,qBAAqB,WAAW,CAAC;AAAA,QAClG,IACA;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,qBACP,QACA,UACS;AACT,WAAS,QAAQ,GAAG,QAAQ,SAAS,QAAQ,SAAS;AACpD,UAAM,WAAW,SAAS,KAAK,KAAK;AACpC,QACE,OAAO,iBAAiB,QAAQ,MAAM,SAAS,iBAAiB,QAAQ,KACxE,OAAO,oBAAoB,QAAQ,MAAM,SAAS,oBAAoB,QAAQ,GAC9E;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,OAA8B;AAC1D,SAAO,SAAS,OAAO,YAAY,KAAK,UAAU,KAAK;AACzD;",
|
|
4
|
+
"sourcesContent": ["import {\n FiberTag,\n REACT_ELEMENT_TYPE,\n type Fiber,\n type FiberRoot,\n type ReactElement,\n type ReactNode,\n} from '../../../core'\nimport { attributeName, STRING_BOOLEAN_ATTRS } from '../../../core/attributes'\nimport { createHostNode, setProp } from '../../dom'\nimport { drainReplayQueue } from '../../event-replay'\nimport { discardPendingWork, findRoot, flushSyncWork, renderRoot, unmountFiber } from '../../reconcile'\nimport { attachRootFiber, createFiberRoot } from '../../root-internal'\n\n// Re-export from event-replay so all hydration concerns live behind one\n// feature boundary \u2014 the plugin's stub swap strips drainReplayQueue too.\nexport { drainReplayQueue }\n\n/**\n * Preserve the user's scroll position across hydration. If the user scrolled\n * between SSR paint and hydrate (common in dev where JS takes seconds to\n * load), libraries that wire scroll-restoration into a `useLayoutEffect`\n * near the root (e.g. TanStack Router) will run during our synchronous\n * hydrate and call `window.scrollTo(savedFromLastVisit)` \u2014 overwriting the\n * user's fresh scroll. We install a short-lived wrapper around scrollTo that\n * suppresses programmatic calls when a user-initiated scroll happened\n * recently. Only runs in the hydration feature \u2014 the stub skips it.\n */\nexport function installHydrationScrollGuard(): void {\n if (typeof window === 'undefined') return\n const w = window as any\n if (w._r) return\n const time = Date.now\n const guardStartedAt = w._r = time()\n let lastUserScrollAt = 0\n let programmatic = false\n w.addEventListener(\n 'scroll',\n () => {\n if (!programmatic) {\n lastUserScrollAt = time()\n }\n },\n { capture: true, passive: true },\n )\n const origScrollTo = w.scrollTo\n w.scrollTo = function (...args: any[]) {\n const now = time()\n if (\n now - guardStartedAt < 3000 &&\n now - lastUserScrollAt < 1500\n ) {\n return\n }\n programmatic = true\n try {\n return (origScrollTo as any).apply(w, args)\n } finally {\n queueMicrotask(() => {\n programmatic = false\n })\n }\n }\n}\n\n/**\n * Hydration cursor: walks existing DOM children in document order so we can\n * adopt them during fiber tree construction. One cursor per host parent.\n *\n * `endBefore` scopes the cursor to a subrange \u2014 used by rehydrateBoundary()\n * so we only adopt DOM up to the closing `/$` marker for that boundary.\n */\nexport class HydrationCursor {\n n: ChildNode | null\n p: Node\n e: ChildNode | null\n constructor(parent: Node, start: ChildNode | null = null, endBefore: ChildNode | null = null) {\n this.p = parent\n this.n = start ?? parent.firstChild\n this.e = endBefore\n }\n take(): ChildNode | null {\n while (this.n && this.n !== this.e) {\n const n = this.n\n // Skip anything that isn't an element (1) or text (3):\n // comments (8), doctype (10), processing instructions (7), cdata (4).\n if (n.nodeType !== 1 && n.nodeType !== 3) {\n this.n = n.nextSibling\n continue\n }\n this.n = n.nextSibling\n return n\n }\n return null\n }\n /**\n * Position-insensitive lookup for head/html adoption. Scans forward past\n * non-matching nodes without removing them, matching by tag AND the key\n * attributes that identify head elements uniquely (rel/href for links,\n * name/property for meta, src for script). Non-matching nodes stay in\n * place so the SSR'd stylesheet/script order is preserved.\n */\n head(tag: string, props: Record<string, any>): ChildNode | null {\n const target = tag.toLowerCase()\n const keyAttrs = HEAD_KEY_ATTRS[target]\n let scan = this.p.firstChild\n while (scan) {\n if (\n scan.nodeType === 1 &&\n (scan as Element).tagName.toLowerCase() === target &&\n headAttrsMatch(scan as Element, props, keyAttrs)\n ) {\n CLAIMED.add(scan)\n return scan\n }\n scan = scan.nextSibling\n }\n return null\n }\n has(): boolean {\n let n = this.n\n while (n && n !== this.e) {\n if (n.nodeType === 1 || n.nodeType === 3) return true\n n = n.nextSibling\n }\n return false\n }\n}\n\nconst hydrationCursors = new WeakMap<Fiber, HydrationCursor>()\nconst PROD_HYDRATION_ERROR = 'Hydration mismatch.'\n\nexport interface HydrationBailoutError extends Error {\n f: Fiber | null\n}\n\nexport function isHydrationBailout(error: unknown): error is HydrationBailoutError {\n return !!error && (error as any).f !== undefined\n}\n\nexport function abortHydration(cause: unknown, fiber: Fiber | null = null): never {\n const error = (cause instanceof Error ? cause : new Error(PROD_HYDRATION_ERROR)) as HydrationBailoutError\n ;(error as any).f = fiber\n throw error\n}\n\ninterface HydrateRootOptions {\n identifierPrefix?: string\n onRecoverableError?: (error: unknown) => void\n onCaughtError?: (error: unknown) => void\n onUncaughtError?: (error: unknown) => void\n}\n\ninterface HydratedRoot {\n render(children: ReactNode): void\n unmount(): void\n}\n\nexport function hydrateRootImpl(\n container: Element | Document,\n initialChildren: ReactNode,\n options: HydrateRootOptions,\n): HydratedRoot {\n const target = container as any as Element | Document\n const isDocument = (container as Node).nodeType === 9\n const body = isDocument ? (target as Document).body : null\n const root = createFiberRoot(target, options)\n\n installHydrationScrollGuard()\n\n const normalizedInitialChildren =\n isDocument ? normalizeDocumentChildren(initialChildren) : initialChildren\n let hydrationError: unknown = null\n beginHydration(root)\n try {\n flushSyncWork(() => {\n renderRoot(root, normalizedInitialChildren)\n })\n } catch (e) {\n hydrationError = e\n }\n endHydration(root)\n\n if (hydrationError && !recoverHydration(root, hydrationError)) throw hydrationError\n drainReplayQueue()\n\n return {\n render(children) {\n flushSyncWork(() => {\n const normalized = isDocument ? normalizeDocumentChildren(children) : children\n renderRoot(\n root,\n root.c === body ? getStaticDocumentBodyChildren(normalized) ?? normalized : normalized,\n )\n })\n },\n unmount() {\n flushSyncWork(() => {\n renderRoot(root, null)\n })\n },\n }\n}\n\n// Head elements that we match against server DOM by attribute signature.\nconst HEAD_KEY_ATTRS: Record<string, ReadonlyArray<string>> = {\n link: ['rel', 'href', 'sizes', 'type'],\n meta: ['name', 'property', 'charSet', 'httpEquiv'],\n script: ['src', 'type'],\n style: ['id', 'media', 'nonce', 'title'],\n}\n\nconst DOCUMENT_HEAD_TAGS = new Set(['base', 'link', 'meta', 'script', 'style', 'title'])\n\n// DOM elements already claimed by some fiber during this hydration pass.\nconst CLAIMED = new WeakSet<Node>()\n\nfunction headAttrsMatch(\n el: Element,\n props: Record<string, any>,\n keys: ReadonlyArray<string> | undefined,\n): boolean {\n if (CLAIMED.has(el)) return false\n if (!keys) return true\n for (const k of keys) {\n const propVal = props[k]\n const elVal = el.getAttribute(attributeName(k))\n if (propVal == null && elVal == null) continue\n if (propVal == null || elVal == null || String(propVal) !== elVal) return false\n }\n return true\n}\n\nexport function beginHydration(root: FiberRoot): void {\n root.ic = 0\n root.h = true\n hydrationCursors.set(root.r, new HydrationCursor(root.c))\n}\n\nexport function endHydration(root: FiberRoot): void {\n root.h = false\n hydrationCursors.delete(root.r)\n}\n\n/**\n * Inspect the current cursor position for a streaming-suspense boundary\n * marker emitted by the server. Returns info + advances the cursor past the\n * marker pair (start comment + fallback/real content + end comment).\n */\nexport type BoundaryInfo = [0 | 1, number, Comment, Comment]\n\nexport function tryConsumeBoundary(parent: Fiber): BoundaryInfo | null {\n const cursor = hydrationCursors.get(findHostParent(parent))\n if (!cursor) return null\n const peek = cursor.n\n if (!peek || peek.nodeType !== 8) return null\n const data = (peek as Comment).data\n const m = /^(\\$\\??)(\\d+)$/.exec(data)\n if (!m) return null\n const kind = m[1] === '$?' ? 1 : 0\n const id = Number(m[2])\n const startMark = peek as Comment\n // Advance past the start comment\n cursor.n = startMark.nextSibling\n // Locate end comment: closest <!--/$-->\n let endMark: Comment | null = null\n let scan = startMark.nextSibling\n while (scan) {\n if (scan.nodeType === 8 && (scan as Comment).data === '/$') {\n endMark = scan as Comment\n break\n }\n scan = scan.nextSibling\n }\n if (!endMark) return null\n return [kind, id, startMark, endMark]\n}\n\nexport function advanceCursorPast(parent: Fiber, node: Node): void {\n const cursor = hydrationCursors.get(findHostParent(parent))\n if (!cursor) return\n cursor.n = node.nextSibling\n}\n\nexport function getHydrationCursor(hostFiber: Fiber): HydrationCursor | undefined {\n return hydrationCursors.get(hostFiber)\n}\n\nexport function setHydrationCursor(hostFiber: Fiber, cursor: HydrationCursor): void {\n hydrationCursors.set(hostFiber, cursor)\n}\n\nexport function clearHydrationCursor(hostFiber: Fiber): void {\n hydrationCursors.delete(hostFiber)\n}\n\n/**\n * Try to adopt a DOM node for this host fiber. Returns true if adopted.\n * Attaches existing attrs/children via separate hydrate pass.\n */\nexport function adoptHostDom(fiber: Fiber, parent: Fiber): boolean {\n const hostParent = findHostParent(parent)\n const cursor = hydrationCursors.get(hostParent)\n if (!cursor) return false\n\n const tag = (fiber.type as string).toLowerCase()\n const documentHeadParent =\n cursor.p.nodeType === 9 && DOCUMENT_HEAD_TAGS.has(tag)\n ? (cursor.p as Document).head\n : null\n const parentEl = cursor.p as Element\n const parentTag =\n parentEl.nodeType === 1 ? (parentEl as Element).tagName.toLowerCase() : ''\n const isHeadish = parentTag === 'head' || parentTag === 'html' || !!documentHeadParent\n\n let candidate: ChildNode | null\n if (documentHeadParent) {\n // React 19 can project <meta>/<title>/<link> from anywhere in the tree into\n // document.head. Redact does not have that projection yet, so when a\n // document-root hydration pass sees a top-level head element, adopt it\n // from <head> rather than trying to append it beside <html>.\n candidate = new HydrationCursor(documentHeadParent).head(\n tag,\n fiber.pp ?? {},\n )\n } else if (isHeadish) {\n // Head/html children are position-insensitive \u2014 server may emit them in\n // a different order than the React tree (React 19 head hoisting, etc.).\n // Scan forward without removing non-matching nodes; match on attribute\n // signature so we don't adopt the wrong <link> and clobber its props.\n candidate = cursor.head(tag, fiber.pp ?? {})\n } else {\n candidate = cursor.take()\n }\n\n if (!candidate) {\n // Client expected a host here but the cursor is exhausted \u2014 server gave\n // fewer children than the client tree. Report the structural gap (React\n // fires `onRecoverableError` for this exact case) and let the reconciler\n // mount a fresh DOM for this fiber below.\n // Exception: <head> children are position-insensitive; a missing match\n // there means \"server didn't hoist this one yet\", which we silently mount.\n if (!isHeadish) onMismatch(fiber, null)\n return false\n }\n\n if (candidate.nodeType !== 1 || (candidate as Element).tagName.toLowerCase() !== tag) {\n // mismatch \u2014 log and re-render fresh from this point\n onMismatch(fiber, candidate)\n return false\n }\n fiber.dom = candidate\n // Apply props (attach events, sync IDL props). Don't re-set existing attrs.\n const props = fiber.pp ?? {}\n const isSvg =\n tag === 'svg' ||\n ((candidate as Element).namespaceURI === 'http://www.w3.org/2000/svg' &&\n tag !== 'foreignobject')\n const syncHydrationProps =\n !props.suppressHydrationWarning &&\n canRecoverHydrationPropMismatch(candidate, tag)\n validateHydrationProps(fiber, candidate as Element, props, tag, isSvg)\n for (const k in props) {\n if (\n k === 'children' ||\n k === 'key' ||\n k === 'ref' ||\n k === 'suppressHydrationWarning' ||\n k === 'suppressContentEditableWarning'\n ) continue\n if (\n syncHydrationProps ||\n (k[0] === 'o' && k[1] === 'n' && typeof props[k] == 'function')\n ) {\n setProp(candidate as Element, k, props[k], undefined, isSvg)\n }\n }\n // Set up child cursor for this host's children\n hydrationCursors.set(fiber, new HydrationCursor(candidate))\n return true\n}\n\nexport function adoptTextDom(fiber: Fiber, parent: Fiber, text: string): boolean {\n const cursor = hydrationCursors.get(findHostParent(parent))\n if (!cursor) return false\n const candidate = cursor.take()\n if (!candidate) {\n onMismatch(fiber, null)\n return false\n }\n if (candidate.nodeType === 3) {\n if ((candidate as Text).data !== text) {\n const recovered = failHydration(\n fiber,\n process.env.NODE_ENV !== 'production'\n ? new Error(\n `Hydration text mismatch: expected \"${text}\" but found \"${(candidate as Text).data}\".`,\n )\n : undefined,\n canRecoverHydrationPropMismatch(candidate),\n )\n if (recovered) {\n ;(candidate as Text).data = text\n }\n }\n fiber.dom = candidate\n return true\n }\n onMismatch(fiber, candidate)\n return false\n}\n\nexport function findHostParent(fiber: Fiber): Fiber {\n let f: Fiber | null = fiber\n while (f) {\n // A fiber explicitly holding a cursor acts as a boundary for hydration\n // (e.g. Suspense with a scoped cursor during fallback/boundary hydration).\n if (hydrationCursors.has(f)) return f\n if (f.tag === FiberTag.Host || f.tag === FiberTag.Root || f.tag === FiberTag.Portal) {\n return f\n }\n f = f.parent\n }\n if (process.env.NODE_ENV !== 'production') {\n throw new Error('No host parent found')\n }\n throw new Error()\n}\n\nfunction onMismatch(fiber: Fiber, actualNode: ChildNode | null): void {\n failHydration(\n fiber,\n process.env.NODE_ENV !== 'production'\n ? new Error(\n `Hydration mismatch: expected <${(fiber.type as string) ?? 'text'}> but found ${\n actualNode ? (actualNode.nodeType === 1 ? (actualNode as Element).tagName : 'text') : 'nothing'\n }.`,\n )\n : undefined,\n )\n}\n\nfunction failHydration(\n fiber: Fiber,\n error: Error = new Error(PROD_HYDRATION_ERROR),\n recoverInPlace = false,\n): boolean {\n const root = findRoot(fiber)\n if (root?.re) {\n root.re(error)\n }\n if (recoverInPlace) return true\n abortHydration(error, findHostRecoveryParent(fiber) ?? fiber)\n}\n\nfunction canRecoverHydrationPropMismatch(node: Node, tag?: string): boolean {\n return (\n tag === 'html' ||\n tag === 'head' ||\n tag === 'body' ||\n !!node.ownerDocument?.head?.contains(node)\n )\n}\n\nfunction findHostRecoveryParent(fiber: Fiber): Fiber | null {\n if (fiber.tag === FiberTag.Text) {\n let directHost = fiber.parent\n while (directHost && (directHost.tag !== FiberTag.Host || !directHost.dom)) {\n directHost = directHost.parent\n }\n if (!directHost) return null\n let hasEvent\n const props = directHost.pp ?? directHost.mp\n if (props) {\n for (const k in props) {\n if (k[0] === 'o' && k[1] === 'n' && typeof props[k] == 'function') {\n hasEvent = true\n }\n }\n }\n return findNearestSafeHostAboveComposite(\n hasEvent\n ? directHost.parent\n : directHost.parent?.tag === FiberTag.Host\n ? directHost.parent\n : directHost,\n )\n }\n\n return findNearestSafeHostAboveComposite(fiber.parent)\n}\n\nfunction findNearestSafeHostAboveComposite(fiber: Fiber | null): Fiber | null {\n let host: Fiber | null = null\n let f = fiber\n while (f) {\n if (f.tag === FiberTag.Host && f.dom) {\n if (!isSafeHostRecoveryElement(f)) return null\n const parentTag = f.parent?.tag as number\n if (!host || (parentTag > FiberTag.Text && parentTag < FiberTag.Suspense)) {\n host = f\n }\n }\n f = f.parent\n }\n return host\n}\n\nfunction isSafeHostRecoveryElement(fiber: Fiber): boolean {\n const tag = fiber.type.toLowerCase()\n return tag !== 'html' && tag !== 'head' && tag !== 'body'\n}\n\nexport function recoverHydration(root: FiberRoot, error: unknown): boolean {\n if (!isHydrationBailout(error)) return false\n\n let container = root.c as Element | Document\n let children = root.r.pp?.children ?? null\n const hostRecovery = getRecoverableHostChildren(error)\n if (hostRecovery) {\n container = hostRecovery[0]\n children = hostRecovery[1]\n } else if (container.nodeType === 9) {\n const bodyChildren = getRecoverableDocumentBodyChildren(error)\n if (bodyChildren != null) {\n container = (container as Document).body\n children = bodyChildren\n }\n }\n\n resetAfterHydrationFailure(root, container)\n try {\n flushSyncWork(() => renderRoot(root, children))\n } catch (clientError) {\n resetAfterHydrationFailure(root, container)\n throw clientError\n }\n return true\n}\n\nfunction resetAfterHydrationFailure(\n root: FiberRoot,\n container: Element | Document,\n): void {\n // Retire subscriptions and queued effects without removing the document shell\n // or host ancestors retained by the recovery container.\n unmountFiber(root.r, false)\n discardPendingWork(root)\n clearHydrationContainer(container)\n attachRootFiber(root, container)\n root.h = false\n}\n\nfunction clearHydrationContainer(container: Element | Document): void {\n if (container.nodeType === 9) {\n let node = container.firstChild\n while (node) {\n const next = node.nextSibling\n if (node.nodeType !== 10 /* DOCUMENT_TYPE_NODE */) {\n container.removeChild(node)\n }\n node = next\n }\n return\n }\n ;(container as Element).textContent = ''\n}\n\nfunction getRecoverableHostChildren(\n error: HydrationBailoutError,\n): [Element, ReactNode] | null {\n const host = error.f\n if (\n host?.tag !== FiberTag.Host ||\n !host.dom ||\n !findNearestSafeHostAboveComposite(host.parent)\n ) {\n return null\n }\n return [host.dom as Element, (host.pp ?? host.mp)?.children ?? null]\n}\n\nfunction getRecoverableDocumentBodyChildren(error: HydrationBailoutError): ReactNode | null {\n const bodyFiber = findBodyAncestor(error.f)\n if (!bodyFiber) return null\n return (bodyFiber.pp ?? bodyFiber.mp)?.children ?? null\n}\n\nfunction findBodyAncestor(fiber: Fiber | null): Fiber | null {\n let f = fiber\n while (f) {\n if (f.tag === FiberTag.Host && f.type === 'body') {\n return f === fiber ? null : f\n }\n f = f.parent\n }\n return null\n}\n\nfunction getStaticDocumentBodyChildren(children: ReactNode): ReactNode | null {\n const list = toChildArray(children)\n const html = list.find((child) => isHostElement(child, 'html')) as ReactElement | undefined\n if (!html) return null\n const htmlChildren = toChildArray(html.props?.children)\n const body = htmlChildren.find((child) => isHostElement(child, 'body')) as ReactElement | undefined\n return body ? body.props?.children ?? null : null\n}\n\nfunction normalizeDocumentChildren(children: ReactNode): ReactNode {\n const list = toChildArray(children)\n const htmlIndex = list.findIndex((child) => isHostElement(child, 'html'))\n if (htmlIndex === -1) return children\n\n const headNodes = list.filter(isHeadElement)\n if (headNodes.length === 0) return children\n\n const htmlElement = list[htmlIndex] as ReactElement\n const normalizedHtml = hoistIntoHtmlHead(htmlElement, headNodes)\n return list\n .filter((child, index) => index === htmlIndex || !isHeadElement(child))\n .map((child) => (child === htmlElement ? normalizedHtml : child))\n}\n\nfunction hoistIntoHtmlHead(htmlElement: ReactElement, headNodes: ReactNode[]): ReactElement {\n const htmlChildren = toChildArray(htmlElement.props?.children)\n const headIndex = htmlChildren.findIndex((child) => isHostElement(child, 'head'))\n let nextChildren: ReactNode[]\n\n if (headIndex === -1) {\n nextChildren = [\n createHostElement('head', { children: headNodes }),\n ...htmlChildren,\n ]\n } else {\n const headElement = htmlChildren[headIndex] as ReactElement\n const existingHeadChildren = toChildArray(headElement.props?.children)\n const nextHead = {\n ...headElement,\n props: {\n ...headElement.props,\n children: [...headNodes, ...existingHeadChildren],\n },\n }\n nextChildren = htmlChildren.map((child, index) => (index === headIndex ? nextHead : child))\n }\n\n return {\n ...htmlElement,\n props: {\n ...htmlElement.props,\n children: nextChildren,\n },\n }\n}\n\nfunction toChildArray(children: unknown): ReactNode[] {\n if (children == null || typeof children === 'boolean') return []\n if (Array.isArray(children)) return children as ReactNode[]\n if (isReactElement(children)) return [children]\n if (typeof children !== 'string' && isIterable(children)) return Array.from(children) as ReactNode[]\n return [children as ReactNode]\n}\n\nfunction isHeadElement(value: ReactNode): boolean {\n return isReactElement(value) && typeof value.type === 'string' && DOCUMENT_HEAD_TAGS.has(value.type)\n}\n\nfunction isHostElement(value: ReactNode, tag: string): boolean {\n return isReactElement(value) && value.type === tag\n}\n\nfunction isReactElement(value: unknown): value is ReactElement {\n return !!value && typeof value === 'object' && (value as ReactElement).$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction isIterable(value: unknown): value is Iterable<ReactNode> {\n return !!value && typeof (value as { [Symbol.iterator]?: unknown })[Symbol.iterator] == 'function'\n}\n\nfunction createHostElement(type: string, props: Record<string, unknown>): ReactElement {\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type,\n key: null,\n ref: null,\n props,\n }\n}\n\nfunction validateHydrationProps(\n fiber: Fiber,\n el: Element,\n props: Record<string, any>,\n tag: string,\n isSvg: boolean,\n): void {\n if (props.suppressHydrationWarning) return\n\n const recoverInPlace = canRecoverHydrationPropMismatch(el, tag)\n let expected: Element | undefined\n\n for (const k in props) {\n const value = props[k]\n if (\n k === 'children' ||\n k === 'key' ||\n k === 'ref' ||\n k === 'suppressHydrationWarning' ||\n k === 'suppressContentEditableWarning' ||\n (k[0] === 'o' && k[1] === 'n' && typeof value == 'function')\n ) continue\n\n if (k === 'dangerouslySetInnerHTML') {\n let html = '' + (value?.__html ?? '')\n if (tag !== 'script' && tag !== 'style') {\n const probe = document.createElement('div')\n probe.innerHTML = html\n html = probe.innerHTML\n }\n if ((el as HTMLElement).innerHTML !== html) {\n failHydration(\n fiber,\n process.env.NODE_ENV !== 'production'\n ? new Error(`Hydration HTML mismatch inside <${tag}>.`)\n : undefined,\n recoverInPlace,\n )\n }\n continue\n }\n\n if (k === 'value' || k === 'defaultValue') {\n if (tag === 'select') continue\n if (tag === 'input' || tag === 'textarea') {\n if (k === 'value' || props.value == null) {\n if (value != null && (el as HTMLInputElement).value !== '' + value) {\n failHydration(\n fiber,\n process.env.NODE_ENV !== 'production'\n ? new Error(`Hydration ${tag} value mismatch on <${tag}>.`)\n : undefined,\n recoverInPlace,\n )\n }\n }\n continue\n }\n }\n\n if (tag === 'input' && (k === 'checked' || k === 'defaultChecked')) {\n if (k === 'checked' || props.checked == null) {\n if (value != null && (el as HTMLInputElement).checked !== !!value) {\n failHydration(\n fiber,\n process.env.NODE_ENV !== 'production'\n ? new Error(`Hydration checked mismatch on <input>.`)\n : undefined,\n recoverInPlace,\n )\n }\n }\n continue\n }\n\n if (tag === 'option' && k === 'selected') {\n if (value != null && (el as HTMLOptionElement).selected !== !!value) {\n failHydration(\n fiber,\n process.env.NODE_ENV !== 'production'\n ? new Error(`Hydration selected mismatch on <option>.`)\n : undefined,\n recoverInPlace,\n )\n }\n continue\n }\n\n if (k === 'style') {\n expected ??= createHostNode(tag, isSvg)\n setProp(expected, k, value, undefined, isSvg)\n if (\n !hydrationStylesMatch(\n (el as HTMLElement).style,\n (expected as HTMLElement).style,\n )\n ) {\n failHydration(\n fiber,\n process.env.NODE_ENV !== 'production'\n ? new Error(`Hydration style mismatch on <${tag}>.`)\n : undefined,\n recoverInPlace,\n )\n }\n continue\n }\n\n const attr = attributeName(k, isSvg)\n const stringifiedBoolean =\n STRING_BOOLEAN_ATTRS.has(attr) || k.startsWith('aria-') || k.startsWith('data-')\n\n let expectedValue: string | null\n if (value == null || (value === false && !stringifiedBoolean)) {\n expectedValue = null\n } else if (k === 'muted' && !isSvg && (tag === 'video' || tag === 'audio')) {\n // The muted property controls playback; defaultMuted reflects the SSR attribute.\n expectedValue = value ? '' : null\n } else {\n expected ??= createHostNode(tag, isSvg)\n setProp(expected, k, value, undefined, isSvg)\n expectedValue = expected.getAttribute(attr)\n }\n const actualValue = el.getAttribute(attr)\n if (expectedValue !== actualValue) {\n failHydration(\n fiber,\n process.env.NODE_ENV !== 'production'\n ? new Error(\n `Hydration attribute mismatch on <${tag}> for \"${attr}\": ` +\n `expected ${formatHydrationValue(expectedValue)} but found ${formatHydrationValue(actualValue)}.`,\n )\n : undefined,\n recoverInPlace,\n )\n }\n }\n}\n\nfunction hydrationStylesMatch(\n actual: CSSStyleDeclaration,\n expected: CSSStyleDeclaration,\n): boolean {\n for (let index = 0; index < expected.length; index++) {\n const property = expected.item(index)\n if (\n actual.getPropertyValue(property) !== expected.getPropertyValue(property) ||\n actual.getPropertyPriority(property) !== expected.getPropertyPriority(property)\n ) {\n return false\n }\n }\n return true\n}\n\nfunction formatHydrationValue(value: string | null): string {\n return value == null ? 'nothing' : JSON.stringify(value)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -91,7 +91,7 @@ function renderSuspense(fiber, domParent, anchor) {
|
|
|
91
91
|
state.f.pp = { children: props.fallback };
|
|
92
92
|
renderFiber(state.f, domParent, anchor);
|
|
93
93
|
} else {
|
|
94
|
-
unmountAllChildren(fiber
|
|
94
|
+
unmountAllChildren(fiber);
|
|
95
95
|
reconcileChildren(fiber, childrenToArray(props.fallback), domParent, anchor);
|
|
96
96
|
}
|
|
97
97
|
} else {
|
|
@@ -102,7 +102,7 @@ function renderSuspense(fiber, domParent, anchor) {
|
|
|
102
102
|
state.d = null;
|
|
103
103
|
}
|
|
104
104
|
if (state.f) {
|
|
105
|
-
unmountFiber(state.f
|
|
105
|
+
unmountFiber(state.f);
|
|
106
106
|
state.f = null;
|
|
107
107
|
}
|
|
108
108
|
}
|
|
@@ -138,7 +138,7 @@ function hydrateSuspenseBoundary(fiber, props, boundary, domParent, anchor) {
|
|
|
138
138
|
} catch (e) {
|
|
139
139
|
if (!isHydrationBailout(e)) {
|
|
140
140
|
clearBoundaryRange(startMark, endMark);
|
|
141
|
-
unmountAllChildren(fiber
|
|
141
|
+
unmountAllChildren(fiber);
|
|
142
142
|
throw e;
|
|
143
143
|
}
|
|
144
144
|
recoverBoundaryHydration(fiber, props.children, parent, startMark, endMark);
|
|
@@ -171,14 +171,14 @@ function recoverBoundaryHydration(fiber, children, parent, startMark, endMark) {
|
|
|
171
171
|
const prevHydrating = root.h;
|
|
172
172
|
discardPendingWork(root);
|
|
173
173
|
clearBoundaryRange(startMark, endMark);
|
|
174
|
-
unmountAllChildren(fiber
|
|
174
|
+
unmountAllChildren(fiber);
|
|
175
175
|
root.h = false;
|
|
176
176
|
try {
|
|
177
177
|
reconcileChildren(fiber, childrenToArray(children), parent, endMark);
|
|
178
178
|
advanceCursorPast(fiber.parent, endMark);
|
|
179
179
|
} catch (clientError) {
|
|
180
180
|
clearBoundaryRange(startMark, endMark);
|
|
181
|
-
unmountAllChildren(fiber
|
|
181
|
+
unmountAllChildren(fiber);
|
|
182
182
|
throw clientError;
|
|
183
183
|
} finally {
|
|
184
184
|
root.h = prevHydrating;
|
|
@@ -189,13 +189,13 @@ function recoverFallbackHydration(fiber, fallback, parent) {
|
|
|
189
189
|
const prevHydrating = root.h;
|
|
190
190
|
discardPendingWork(root);
|
|
191
191
|
parent.textContent = "";
|
|
192
|
-
unmountAllChildren(fiber
|
|
192
|
+
unmountAllChildren(fiber);
|
|
193
193
|
root.h = false;
|
|
194
194
|
try {
|
|
195
195
|
reconcileChildren(fiber, childrenToArray(fallback), parent, null);
|
|
196
196
|
} catch (clientError) {
|
|
197
197
|
parent.textContent = "";
|
|
198
|
-
unmountAllChildren(fiber
|
|
198
|
+
unmountAllChildren(fiber);
|
|
199
199
|
throw clientError;
|
|
200
200
|
} finally {
|
|
201
201
|
root.h = prevHydrating;
|
|
@@ -210,14 +210,14 @@ function rehydrateBoundary(fiber) {
|
|
|
210
210
|
withCurrentRoot(root, () => {
|
|
211
211
|
const prevHydrating = root.h;
|
|
212
212
|
try {
|
|
213
|
-
unmountAllChildren(fiber
|
|
213
|
+
unmountAllChildren(fiber);
|
|
214
214
|
root.h = true;
|
|
215
215
|
setHydrationCursor(fiber, new HydrationCursor(parent, state.b.nextSibling, state.e));
|
|
216
216
|
reconcileChildren(fiber, childrenToArray(state.r), parent, null);
|
|
217
217
|
} catch (e) {
|
|
218
218
|
if (!isHydrationBailout(e)) {
|
|
219
219
|
clearBoundaryRange(state.b, state.e);
|
|
220
|
-
unmountAllChildren(fiber
|
|
220
|
+
unmountAllChildren(fiber);
|
|
221
221
|
throw e;
|
|
222
222
|
}
|
|
223
223
|
recoverBoundaryHydration(fiber, state.r, parent, state.b, state.e);
|
|
@@ -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 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 && fiber.child\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) {\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 = hadCommittedPrimary\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\n out.push([el, el.style.display])\n el.style.display = 'none'\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?.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": ";AAAA,SAAS,UAAU,mBAA+B;AAClD,SAAS,2BAA2B;AACpC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,IAAI,iBAAqD;AAEzD,SAAS,oBAAoB,OAAc,UAA8B;AACvE,MAAI,eAAgB,QAAO,eAAe,QAAQ;AAElD,WAAS;AAAA,IACP,MAAM,eAAe,KAAK;AAAA,IAC1B,MAAM,eAAe,KAAK;AAAA,EAC5B;AACF;AAyBA,SAAS,eAAe,OAAc,WAAiB,QAA2B;AAChF,QAAM,QAAQ,MAAM,MAAM,CAAC;AAC3B,QAAM,QAAS,MAAM,OAAO,CAAC;AAI7B,QAAM,OAAO,eAAe;AAC5B,MAAI,MAAM,KAAK,CAAC,MAAM,GAAG;AACvB,UAAM,WAAW,mBAAmB,MAAM,MAAO;AACjD,QAAI,UAAU;AACZ,8BAAwB,OAAO,OAAO,UAAU,WAAW,MAAM;AACjE;AAAA,IACF;AAAA,EACF;AAQA,MAAI,MAAM,GAAG;AACX,UAAM,KAAK;AACX;AAAA,EACF;AAMA,MAAI,MAAM,GAAG;AACX,QAAI,MAAM,GAAG;AACX,YAAM,EAAE,KAAK,EAAE,UAAU,MAAM,SAAS;AACxC,kBAAY,MAAM,GAAG,WAAW,MAAM;AAAA,IACxC,OAAO;AAEL,wBAAkB,OAAO,gBAAgB,MAAM,QAAQ,GAAG,WAAW,MAAM;AAAA,IAC7E;AACA,UAAM,KAAK;AACX;AAAA,EACF;AAKA,QAAM,sBAAsB,MAAM,MAAM,MAAM;AAE9C,QAAM,cAAc;AACpB,MAAI;AACJ,mBAAiB,CAAC,aAAa;AAC7B,sBAAkB;AAAA,EACpB;AACA,MAAI;AACF,sBAAkB,OAAO,gBAAgB,MAAM,QAAQ,GAAG,WAAW,MAAM;AAAA,EAC7E,UAAE;AACA,qBAAiB;AAAA,EACnB;AAEA,MAAI,iBAAiB;AACnB,UAAM,IAAI;AACV,UAAM,WAAW,MAAM;AACrB,YAAM,IAAI;AACV,qBAAe,KAAK;AAAA,IACtB;AACA,oBAAgB,KAAK,UAAU,QAAQ;AAEvC,QAAI,qBAAqB;AAIvB,YAAM,SAAuC,CAAC;AAC9C,UAAI,IAAkB;AACtB,aAAO,GAAG;AACR,yBAAiB,GAAG,MAAM;AAC1B,YAAI,EAAE;AAAA,MACR;AACA,YAAM,IAAI;AAIV,UAAI,CAAC,MAAM,GAAG;AACZ,cAAM,IAAI,YAAY,SAAS,UAAU,MAAM,IAAI;AACnD,cAAM,EAAE,SAAS;AAAA,MACnB;AACA,YAAM,EAAE,KAAK,EAAE,UAAU,MAAM,SAAS;AACxC,kBAAY,MAAM,GAAG,WAAW,MAAM;AAAA,IACxC,OAAO;AAEL,yBAAmB,
|
|
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 && fiber.child\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) {\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 = hadCommittedPrimary\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)\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)\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\n out.push([el, el.style.display])\n el.style.display = 'none'\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)\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)\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)\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)\n root.h = false\n try {\n reconcileChildren(fiber, childrenToArray(fallback), parent, null)\n } catch (clientError) {\n parent.textContent = ''\n unmountAllChildren(fiber)\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?.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)\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)\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
|
}
|
package/dist/dom/reconcile.d.ts
CHANGED
|
@@ -31,10 +31,10 @@ export declare function installCapability<K extends keyof Capabilities>(name: K,
|
|
|
31
31
|
export declare function handleSuspended(fiber: Fiber, thenable: Promise<any>): void;
|
|
32
32
|
export declare function handleErrorInRender(fiber: Fiber, err: any): void;
|
|
33
33
|
export declare function isThenable(x: any): x is Promise<any>;
|
|
34
|
-
export declare function unmountFiber(fiber: Fiber,
|
|
35
|
-
export declare function unmountAllChildren(parent: Fiber
|
|
34
|
+
export declare function unmountFiber(fiber: Fiber, removeDom?: boolean): void;
|
|
35
|
+
export declare function unmountAllChildren(parent: Fiber): void;
|
|
36
36
|
export declare function readContext(fiber: Fiber, ctx: any): any;
|
|
37
37
|
export declare function enqueueEffect(fiber: Fiber, effect: Effect): void;
|
|
38
|
-
export declare function scheduleLifecycle(
|
|
38
|
+
export declare function scheduleLifecycle(fiber: Fiber, fn: () => void): void;
|
|
39
39
|
export declare function runEffects(root: FiberRoot): void;
|
|
40
40
|
export {};
|
package/dist/dom/reconcile.js
CHANGED
|
@@ -371,13 +371,13 @@ function reconcileChildren(parent, newChildren, domParent, anchor) {
|
|
|
371
371
|
if (!parentIsHeadHost) {
|
|
372
372
|
for (const f of existing) {
|
|
373
373
|
if (!claimed.has(f)) {
|
|
374
|
-
unmountFiber(f
|
|
374
|
+
unmountFiber(f);
|
|
375
375
|
structurallyChanged = true;
|
|
376
376
|
}
|
|
377
377
|
}
|
|
378
378
|
for (const f of keyed.values()) {
|
|
379
379
|
if (!claimed.has(f)) {
|
|
380
|
-
unmountFiber(f
|
|
380
|
+
unmountFiber(f);
|
|
381
381
|
structurallyChanged = true;
|
|
382
382
|
}
|
|
383
383
|
}
|
|
@@ -681,12 +681,12 @@ function handleErrorInRender(fiber, err) {
|
|
|
681
681
|
function isThenable(x) {
|
|
682
682
|
return x != null && typeof x.then == "function";
|
|
683
683
|
}
|
|
684
|
-
function unmountFiber(fiber,
|
|
684
|
+
function unmountFiber(fiber, removeDom = true) {
|
|
685
685
|
fiber.um = true;
|
|
686
686
|
let c = fiber.child;
|
|
687
687
|
while (c) {
|
|
688
688
|
const next = c.sibling;
|
|
689
|
-
unmountFiber(c, fiber.tag === FiberTag.
|
|
689
|
+
unmountFiber(c, removeDom || fiber.tag === FiberTag.Portal);
|
|
690
690
|
c = next;
|
|
691
691
|
}
|
|
692
692
|
fiber.child = null;
|
|
@@ -700,28 +700,21 @@ function unmountFiber(fiber, domParent) {
|
|
|
700
700
|
}
|
|
701
701
|
fiber.cu = null;
|
|
702
702
|
}
|
|
703
|
-
if (fiber.tag === FiberTag.Class && fiber.sn
|
|
704
|
-
try {
|
|
705
|
-
fiber.sn.componentWillUnmount();
|
|
706
|
-
} catch (e) {
|
|
707
|
-
if (currentRoot?.re) currentRoot.re(e);
|
|
708
|
-
}
|
|
703
|
+
if (fiber.tag === FiberTag.Class && fiber.sn) {
|
|
709
704
|
fiber.sn._fiber = null;
|
|
710
705
|
fiber.sn._enqueueUpdate = null;
|
|
711
706
|
fiber.sn._forceUpdate = null;
|
|
712
707
|
}
|
|
713
708
|
if (fiber.ref) detachRef(fiber.ref);
|
|
714
|
-
if (
|
|
715
|
-
fiber.dom
|
|
716
|
-
} else if (fiber.tag === FiberTag.Text && fiber.dom && fiber.dom.parentNode) {
|
|
717
|
-
fiber.dom.parentNode.removeChild(fiber.dom);
|
|
709
|
+
if (removeDom) {
|
|
710
|
+
fiber.dom?.parentNode?.removeChild(fiber.dom);
|
|
718
711
|
}
|
|
719
712
|
}
|
|
720
|
-
function unmountAllChildren(parent
|
|
713
|
+
function unmountAllChildren(parent) {
|
|
721
714
|
let c = parent.child;
|
|
722
715
|
while (c) {
|
|
723
716
|
const next = c.sibling;
|
|
724
|
-
unmountFiber(c
|
|
717
|
+
unmountFiber(c);
|
|
725
718
|
c = next;
|
|
726
719
|
}
|
|
727
720
|
parent.child = null;
|
|
@@ -828,8 +821,10 @@ function enqueueEffect(fiber, effect) {
|
|
|
828
821
|
pendingEffects.push([fiber, effect]);
|
|
829
822
|
}
|
|
830
823
|
}
|
|
831
|
-
function scheduleLifecycle(
|
|
832
|
-
pendingLifecycles.push(
|
|
824
|
+
function scheduleLifecycle(fiber, fn) {
|
|
825
|
+
pendingLifecycles.push(() => {
|
|
826
|
+
if (!fiber.um) fn();
|
|
827
|
+
});
|
|
833
828
|
}
|
|
834
829
|
function runEffects(root) {
|
|
835
830
|
while (pendingLayoutEffects.length) {
|
|
@@ -852,6 +847,7 @@ function runEffects(root) {
|
|
|
852
847
|
}
|
|
853
848
|
}
|
|
854
849
|
function runEffect(fiber, effect, root) {
|
|
850
|
+
if (fiber.um) return;
|
|
855
851
|
try {
|
|
856
852
|
const cleanup = effect.c();
|
|
857
853
|
if (typeof cleanup == "function") {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/dom/reconcile.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n FiberTag,\n createFiber,\n REACT_ELEMENT_TYPE,\n REACT_LEGACY_ELEMENT_TYPE,\n REACT_FRAGMENT_TYPE,\n type Fiber,\n type FiberRoot,\n type ReactElement,\n type ReactNode,\n type Hook,\n type Effect,\n} from '../core'\nimport {\n ReactSharedInternals,\n REACT_LAZY_TYPE,\n REACT_STRICT_MODE_TYPE,\n REACT_PROFILER_TYPE,\n} from '../react'\nimport { createHostNode, setProp } from './dom'\nimport { makeDispatcher } from './dispatcher'\nimport {\n adoptHostDom,\n adoptTextDom,\n setHydrationCursor,\n getHydrationCursor,\n clearHydrationCursor,\n findHostParent as findHydrationHost,\n abortHydration,\n recoverHydration,\n} from './features/hydration'\n\n// ---------------------------------------------------------------------------\n// Render scheduling\n// ---------------------------------------------------------------------------\n\nlet currentRoot: FiberRoot | null = null\nlet flushing = false\nlet isBatching = false\nconst pendingRoots = new Set<FiberRoot>()\n\n// Set by rerenderFiber to identify the exact memo-tagged fiber whose INTERNAL\n// state (hook update, useSyncExternalStore notification) triggered this render\n// pass. renderMemo checks this to bypass its prop-equality gate for that fiber.\n// Without the bypass, a memo bail would swallow state changes: React's memo is\n// only a parent-triggered gate \u2014 state-driven rerenders must always run the\n// inner function. Router-adjacent components (Outlet, Match, MatchInner) are\n// all memo-wrapped and subscribe to stores; missing this bypass breaks nav\n// content updates even though the URL changes.\nlet forceRerenderingFiber: Fiber | null = null\n\nexport function scheduleUpdate(fiber: Fiber): void {\n // Drop updates scheduled on already-um fibers. Subscribers (router,\n // query, any external store) can fire after unmount if their cleanup was\n // missed, and letting those reach rerenderFiber mounts zombie DOM into the\n // old .parent's DOM (which stays reachable via the stale pointer).\n if (fiber.um) return\n const root = findRoot(fiber)\n if (!root) return\n root.p.add(fiber)\n fiber.dy = true\n pendingRoots.add(root)\n if (isBatching) return\n if (!root.s) {\n root.s = true\n queueMicrotask(flushPending)\n }\n}\n\nexport function flushSyncWork(fn: () => void): void {\n const wasBatching = isBatching\n isBatching = true\n try {\n fn()\n } finally {\n isBatching = wasBatching\n }\n flushPending()\n}\n\nexport function batchedUpdates<T>(fn: () => T): T {\n const wasBatching = isBatching\n isBatching = true\n try {\n return fn()\n } finally {\n isBatching = wasBatching\n if (!wasBatching) flushPending()\n }\n}\n\nfunction flushPending(): void {\n if (flushing) return\n flushing = true\n try {\n let guard = 0\n while (pendingRoots.size > 0) {\n if (++guard > 50) {\n if (process.env.NODE_ENV !== 'production') {\n throw new Error('flushPending exceeded 50 iterations \u2014 suspected infinite update loop.')\n }\n throw new Error()\n }\n const roots = [...pendingRoots]\n pendingRoots.clear()\n for (const root of roots) {\n root.s = false\n // Render each pending fiber from shallowest first so an ancestor's\n // cascade reaches descendants before we try to render them directly.\n // Descendants rendered via cascade still have `dy=true` (only\n // rerenderFiber clears it); when we later reach them in this loop,\n // rerenderFiber's own `if (!dy) return` is our short-circuit. We\n // previously filtered descendants of dy ancestors here, but that\n // loses updates whenever an ancestor's render doesn't actually reach\n // the descendant \u2014 e.g. React.memo bailing on equal props. Keep all\n // dy fibers and let rerenderFiber de-dupe via its dy check.\n const pending = [...root.p]\n root.p.clear()\n pending.sort((a, b) => fiberDepth(a) - fiberDepth(b))\n for (const fiber of pending) {\n try {\n rerenderFiber(fiber, root)\n } catch (error) {\n if (!recoverHydration(root, error)) throw error\n break\n }\n }\n runEffects(root)\n }\n }\n } finally {\n flushing = false\n }\n}\n\nexport function discardPendingWork(root: FiberRoot): void {\n root.p.clear()\n root.s = false\n pendingRoots.delete(root)\n}\n\nfunction fiberDepth(fiber: Fiber): number {\n let d = 0\n let p: Fiber | null = fiber.parent\n while (p) {\n d++\n p = p.parent\n }\n return d\n}\n\nexport function findRoot(fiber: Fiber): FiberRoot | null {\n let f: Fiber | null = fiber\n while (f) {\n if (f.root) return f.root\n f = f.parent\n }\n return null\n}\n\n// ---------------------------------------------------------------------------\n// Entry points (called by createRoot)\n// ---------------------------------------------------------------------------\n\nexport function renderRoot(root: FiberRoot, children: ReactNode): void {\n const rootFiber = root.r\n rootFiber.pp = { children }\n currentRoot = root\n try {\n reconcileChildren(rootFiber, childrenToArray(children), root.c as Node, null)\n rootFiber.mp = rootFiber.pp\n rootFiber.dy = false\n } finally {\n currentRoot = null\n }\n runEffects(root)\n}\n\nfunction rerenderFiber(fiber: Fiber, root: FiberRoot): void {\n if (!fiber.dy) return\n // Skip fibers that were um between scheduling and flush. Without this,\n // the flush loop re-enters a zombie fiber whose .parent is still set; its\n // render mounts fresh DOM into the old parent's still-attached DOM (since\n // unmountFiber only clears fiber.child, not fiber.parent). Visible as route\n // content from a previous location staying on screen after nav, because a\n // pending rerender on the old route's LibraryLandingPage (um during\n // Outlet's shallow-first render) still fires from root.pending.\n if (fiber.um) return\n // Clear BEFORE rendering so a scheduleUpdate() triggered mid-render (e.g.\n // error boundary catching a descendant throw) marks us dy for the next\n // flush iteration instead of being wiped out when render() completes.\n fiber.dy = false\n currentRoot = root\n // If this rerender is resuming a hydration that was deferred by a suspension,\n // re-activate hydration mode for its duration so descendants adopt DOM\n // instead of re-creating it.\n const resumeHydration =\n fiber.ms && (fiber.ms as any).p === true\n const prevHydrating = root.h\n if (resumeHydration) {\n delete (fiber.ms as any).p\n root.h = true\n }\n const prevForcing = forceRerenderingFiber\n forceRerenderingFiber = fiber\n try {\n renderFiber(fiber, getHostParent(fiber), getAnchor(fiber))\n } finally {\n forceRerenderingFiber = prevForcing\n if (resumeHydration) {\n root.h = prevHydrating\n // Deferred hydration completed \u2014 detach the preserved cursor so future\n // updates (post-hydration state changes) don't try to adopt stale DOM.\n clearHydrationCursor(fiber)\n }\n currentRoot = null\n }\n}\n\n// ---------------------------------------------------------------------------\n// Element \u2192 children normalization\n// ---------------------------------------------------------------------------\n\n// Text children pass through as raw strings \u2014 no wrapper. The previous\n// `{_text: string}` shape allocated tens of thousands of objects per\n// stable-list re-render and dominated minor-GC pressure. `typeof === 'string'`\n// is also robust to RSC renderable proxies (which have `has` traps that\n// would fool a `'_text' in child` predicate but can't fool `typeof`).\ntype NormalizedChild = ReactElement | string | null\n\nfunction isTextChild(child: Exclude<NormalizedChild, null>): child is string {\n return typeof child === 'string'\n}\n\nexport function childrenToArray(children: ReactNode): NormalizedChild[] {\n const out: NormalizedChild[] = []\n pushChildren(children, out)\n return out\n}\n\nfunction pushChildren(node: ReactNode, out: NormalizedChild[]): void {\n if (node == null || typeof node === 'boolean') return\n if (typeof node === 'string') {\n // Empty strings render no text node (matches React + the `<!-- -->`\n // separator elision on the SSR side so server/client agree).\n if (node === '') return\n out.push(node)\n return\n }\n if (typeof node === 'number') {\n out.push('' + node)\n return\n }\n if (Array.isArray(node)) {\n for (let i = 0; i < node.length; i++) pushChildren(node[i], out)\n return\n }\n if (isIterable(node)) {\n for (const item of node as Iterable<ReactNode>) pushChildren(item, out)\n return\n }\n if (typeof node === 'object') {\n const t = (node as any).$$typeof\n if (ACCEPTED_ELEMENT_MARKERS.has(t)) {\n out.push(node as ReactElement)\n return\n }\n // Raw React.lazy as a child. RSC Flight encodes 'use client' components\n // (CodeBlock, CodeExplorer, etc.) as bare Lazy objects in the tree, not\n // wrapped in REACT_ELEMENT_TYPE. Dropping them made code snippets\n // disappear from docs pages. The RSC decoder pre-awaits payloads via\n // `awaitLazyElements`, so by render time the status is 'fulfilled' and\n // `_init()` returns the resolved element synchronously.\n if (t === REACT_LAZY_TYPE) {\n const lazy = node as any\n const resolved = lazy._init(lazy._payload)\n pushChildren(resolved, out)\n return\n }\n }\n}\n\nfunction isIterable(obj: any): boolean {\n return obj != null && typeof obj[Symbol.iterator] == 'function'\n}\n\nfunction getKeyOf(child: NormalizedChild, index: number): string {\n if (!child) return 'n' + index\n if (isTextChild(child)) return '$t' + index\n if (child.key != null) return 'k' + child.key\n return 'i' + index\n}\n\nfunction sameType(fiber: Fiber, child: NormalizedChild): boolean {\n if (!child) return false\n if (isTextChild(child)) return fiber.tag === FiberTag.Text\n return fiber.type === child.type && sameKey(fiber.key, child.key)\n}\n\nfunction sameKey(a: string | null, b: string | null | undefined): boolean {\n return (a ?? null) === (b ?? null)\n}\n\n// ---------------------------------------------------------------------------\n// Fiber creation\n// ---------------------------------------------------------------------------\n\nfunction fiberFromChild(child: NormalizedChild, parent: Fiber): Fiber {\n if (!child) return createFiber(FiberTag.Fragment, null, null)\n if (isTextChild(child)) {\n const f = createFiber(FiberTag.Text, null, null)\n f.pp = child\n f.parent = parent\n return f\n }\n const type = child.type\n let tag: FiberTag = FiberTag.Host\n const marker = type && (type as any).$$typeof\n if (typeof type === 'string') tag = FiberTag.Host\n else if (type === REACT_FRAGMENT_TYPE) tag = FiberTag.Fragment\n else if (type === REACT_STRICT_MODE_TYPE || type === REACT_PROFILER_TYPE) tag = FiberTag.Fragment\n else {\n // Feature-registered type matchers (Portal, future extractions). Features\n // that carry the symbol as element.type directly (rather than wrapping in\n // REACT_ELEMENT_TYPE) match here by type identity.\n let matched: FiberTag | null = null\n for (const m of TYPE_MATCHERS) {\n matched = m(type, marker)\n if (matched !== null) break\n }\n if (matched !== null) tag = matched\n else if (typeof type == 'function') {\n tag = type.prototype && type.prototype.isReactComponent ? FiberTag.Class : FiberTag.Function\n }\n }\n const f = createFiber(tag, type, child.key ?? null)\n f.ref = (child as any).ref ?? null\n f.pp = child.props\n f.parent = parent\n return f\n}\n\n// ---------------------------------------------------------------------------\n// Reconciliation\n// ---------------------------------------------------------------------------\n\n/**\n * Reconcile a parent fiber's child list against new normalized children.\n * Mutates parent.child and the sibling chain.\n * Mounts new host DOM into `domParent` before `anchor` (or appends if anchor === null).\n */\nexport function reconcileChildren(\n parent: Fiber,\n newChildren: NormalizedChild[],\n domParent: Node,\n anchor: Node | null,\n): void {\n // Fast path: unkeyed positional steady-state. Walk the existing sibling\n // chain and newChildren in lockstep, validating AND committing in one pass.\n // On any divergence we fall back to the slow path, which rebuilds the\n // sibling chain anyway \u2014 partial pp writes are idempotent.\n // Skips the Map / Set / existing-array allocation entirely.\n if (!currentRoot?.h) {\n let f: Fiber | null = parent.child\n let ok = true\n for (let i = 0; i < newChildren.length; i++) {\n const child = newChildren[i]\n if (child == null || !f || f.key != null) { ok = false; break }\n if (typeof child === 'string') {\n if (f.tag !== FiberTag.Text) { ok = false; break }\n f.pp = child\n } else {\n if ((child as ReactElement).key != null) { ok = false; break }\n if (f.type !== (child as ReactElement).type) { ok = false; break }\n f.pp = (child as ReactElement).props\n f.ref = (child as any).ref ?? null\n }\n f = f.sibling\n }\n if (ok && f === null) {\n // Pass 2: render forward with per-child anchors. Identical to the slow\n // path's pass 2.\n for (let r: Fiber | null = parent.child; r; r = r.sibling) {\n let a = anchor\n for (let s: Fiber | null = r.sibling; s; s = s.sibling) {\n const d = firstDomNode(s)\n if (d && d.parentNode === domParent) { a = d; break }\n }\n renderFiber(r, domParent, a)\n }\n return\n }\n }\n\n const existing = collectChildren(parent)\n const keyed = new Map<string, Fiber>()\n for (const f of existing) {\n if (f.key != null) keyed.set('k' + f.key, f)\n }\n\n let prevNewFiber: Fiber | null = null\n const claimed = new Set<Fiber>()\n let structurallyChanged = false\n // Budget-guided positional matching. We walk `existing` (unkeyed only) with a\n // single cursor `existingIdx` and, on a type mismatch, choose insert vs delete\n // based on the remaining length delta (`budget`):\n // budget > 0: more new than old remain \u2192 treat slot as an INSERTION: keep\n // the old cursor and create a fresh fiber for new[i].\n // budget < 0: more old than new remain \u2192 treat slot as a DELETION: advance\n // the old cursor past the mismatched fiber (it'll be um\n // in the unclaimed pass) and retry.\n // budget == 0: equal remaining \u2192 treat as REPLACE by preferring delete\n // until budget flips positive or we hit a match.\n // This avoids greedy forward scans that steal a later same-type fiber for a\n // newly inserted leading sibling (e.g. smallMenu flipping null \u2192 <div>\n // stealing the content <div>'s fiber and tearing down the drawer fragment).\n let existingIdx = 0\n let unkeyedOld = 0\n for (const f of existing) if (f.key == null) unkeyedOld++\n let unkeyedNew = 0\n for (const c of newChildren) if (c != null) unkeyedNew++\n let budget = unkeyedNew - unkeyedOld\n\n // Pass 1 (this loop): match against existing fibers and build the sibling\n // chain. Pass 2 (after the loop) renders each fiber with the correct\n // per-child anchor \u2014 the firstDomNode of its next still-mounted sibling,\n // or the parent's own anchor for the rightmost. Without per-child anchors\n // a child whose render output type changes from no-DOM (Portal, null) to\n // an in-flow host gets appended to the end of domParent (every child\n // would otherwise share the parent's anchor) and never moves before its\n // later siblings. Hit by the t3code Sidebar swap from a portal-rendering\n // <Sheet> to a <div data-slot=sidebar> when isMobile flips during a\n // Provider re-render.\n for (let i = 0; i < newChildren.length; i++) {\n const child = newChildren[i]\n if (child == null) continue\n\n let match: Fiber | null = null\n\n // key-based match\n if (child && typeof child === 'object' && !isTextChild(child) && (child as ReactElement).key != null) {\n const k = 'k' + (child as ReactElement).key\n const m = keyed.get(k)\n if (m && m.type === (child as ReactElement).type) {\n match = m\n keyed.delete(k)\n }\n }\n\n if (!match) {\n while (existingIdx < existing.length) {\n const cand = existing[existingIdx]!\n if (claimed.has(cand) || cand.key != null) {\n existingIdx++\n continue\n }\n if (sameType(cand, child)) {\n match = cand\n existingIdx++\n break\n }\n // Type mismatch at the cursor. Resolve via budget.\n if (budget > 0) {\n // Insertion: leave cand in place, create new for child.\n break\n }\n // Deletion (or replace-as-delete-first): advance past cand. It remains\n // unclaimed and will be um at the end.\n existingIdx++\n budget++\n }\n }\n\n // Detect reorder: matched fiber is not at its original position\n if (match && existing[i] !== match) structurallyChanged = true\n\n let fiber: Fiber\n if (match) {\n claimed.add(match)\n fiber = match\n if (isTextChild(child!)) {\n fiber.pp = child\n } else {\n fiber.type = (child as ReactElement).type\n fiber.pp = (child as ReactElement).props\n fiber.ref = (child as any).ref ?? null\n }\n } else {\n fiber = fiberFromChild(child, parent)\n structurallyChanged = true\n if (budget > 0) budget--\n }\n\n fiber.parent = parent\n fiber.sibling = null\n if (prevNewFiber) prevNewFiber.sibling = fiber\n else parent.child = fiber\n prevNewFiber = fiber\n }\n\n // Pass 2: walk the sibling chain we just built and render each fiber\n // forward with the correct per-child anchor. During hydration the cursor\n // walks DOM forward and each renderFiber adopts the next existing node,\n // so per-child anchors are moot \u2014 fall back to the parent's anchor.\n const hydrating = !!currentRoot?.h\n for (let f: Fiber | null = parent.child; f; f = f.sibling) {\n let a = anchor\n if (!hydrating) {\n // Find the firstDomNode of the next still-mounted sibling, if any.\n for (let s: Fiber | null = f.sibling; s; s = s.sibling) {\n const d = firstDomNode(s)\n if (d && d.parentNode === domParent) { a = d; break }\n }\n }\n renderFiber(f, domParent, a)\n }\n\n if (!prevNewFiber) parent.child = null\n else prevNewFiber.sibling = null\n\n // Head content is additive \u2014 server may inject metadata/stylesheets (Vite\n // dev styles, Sentry, analytics) that aren't in the React tree. Unmounting\n // them on every reconcile thrashes styles and causes flash of unstyled\n // content. Keep existing head children that weren't matched this pass.\n const parentIsHeadHost =\n parent.tag === FiberTag.Host &&\n typeof parent.type === 'string' &&\n (parent.type as string).toLowerCase() === 'head'\n\n if (!parentIsHeadHost) {\n // Unmount unclaimed\n for (const f of existing) {\n if (!claimed.has(f)) {\n unmountFiber(f, domParent)\n structurallyChanged = true\n }\n }\n // Leftover keyed\n for (const f of keyed.values()) {\n if (!claimed.has(f)) {\n unmountFiber(f, domParent)\n structurallyChanged = true\n }\n }\n }\n\n // During hydration, DOM is already in document order from the cursor-driven\n // adoption walk. Running placeChildrenInOrder here would reappend nodes to\n // the end of domParent when the true anchor (often an end marker comment)\n // isn't reflected in `anchor`. Skip it in hydration mode.\n //\n // For <head>, skip always \u2014 HeadContent re-renders routinely (route match\n // changes, providers updating), and reordering every <link>/<style>/<meta>\n // on each re-render causes stylesheet flash and re-download. Head element\n // ordering is semantically fluid; the browser doesn't care about exact\n // order within <head>.\n const parentIsHead = (domParent as Element).nodeName === 'HEAD'\n if (structurallyChanged && !currentRoot?.h && !parentIsHead) {\n placeChildrenInOrder(parent, domParent, anchor)\n }\n}\n\nfunction placeChildrenInOrder(parent: Fiber, domParent: Node, anchor: Node | null): void {\n const doms: Node[] = []\n let c = parent.child\n while (c) {\n collectHostDoms(c, doms)\n c = c.sibling\n }\n\n // Pre-check: if our fiber-owned DOM is already in document order within\n // domParent AND the trailing anchor matches, no reorder is needed. This is\n // the common case on stable re-renders, and avoids detaching/re-attaching\n // subtrees (which cancels CSS animations and triggers layout).\n if (doms.length > 0) {\n let current: Node | null = doms[0]!\n let inOrder = current.parentNode === domParent\n for (let i = 1; inOrder && i < doms.length; i++) {\n current = current!.nextSibling\n // Skip foreign nodes (SSR-injected scripts, dev-styles) between owned\n // fiber DOMs \u2014 they should stay where they are.\n while (current && !doms.includes(current as Node)) {\n current = current.nextSibling\n }\n if (current !== doms[i]) inOrder = false\n }\n // Also verify the LAST dom's next sibling lines up with `anchor`. A\n // single-dom collection (or correctly-internally-ordered doms) can sit\n // at the WRONG absolute position in domParent and still pass the\n // relative-order check above. This happens when a fiber's render output\n // changes from no-DOM (e.g. a Portal-using <Sheet>, or null) to an\n // in-flow host element: the new host is appended to the end of\n // domParent (because the parent reconcileChildren loop hands every\n // child the same anchor \u2014 typically null), and without this trailing\n // check it would never get moved before its later siblings.\n if (inOrder) {\n let last: Node | null = doms[doms.length - 1]!.nextSibling\n while (last && !doms.includes(last as Node) && last !== anchor) {\n last = last.nextSibling\n }\n if (last !== anchor) inOrder = false\n }\n if (inOrder) return\n }\n\n // Reverse-iterate, anchoring each node before the one that should follow it.\n // This works because by the time we're placing doms[i], doms[i+1] is already\n // in its final slot. Forward iteration is buggy: insertBefore(doms[i],\n // doms[i+1]) pulls doms[i] forward past any nodes that SHOULD move behind\n // it, leaving those nodes mis-anchored (app-starter Analyze/Lucky swap, npm\n // stats library dropdown reorder \u2014 both reported by users).\n //\n // Concrete example: start=[A, R, L], target=[A, L, R]. Forward pass gives\n // [L, A, R] (wrong). Reverse pass moves R to end, then L and A are already\n // correct \u2014 1 move, matches target.\n //\n // Skip nodes already in their target position so CSS transitions on stable\n // siblings aren't cancelled (e.g. drawer slide animation).\n for (let i = doms.length - 1; i >= 0; i--) {\n const d = doms[i]!\n const targetNext: Node | null = i + 1 < doms.length ? doms[i + 1]! : anchor\n if (d.parentNode !== domParent || d.nextSibling !== targetNext) {\n domParent.insertBefore(d, targetNext)\n }\n }\n}\n\nfunction collectHostDoms(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 collectHostDoms(c, out)\n c = c.sibling\n }\n}\n\nfunction collectChildren(parent: Fiber): Fiber[] {\n const out: Fiber[] = []\n let c = parent.child\n while (c) {\n out.push(c)\n c = c.sibling\n }\n return out\n}\n\n// ---------------------------------------------------------------------------\n// Rendering per fiber tag\n// ---------------------------------------------------------------------------\n\nexport type RenderFn = (fiber: Fiber, domParent: Node, anchor: Node | null) => void\nexport type TypeMatcher = (type: any, marker: any) => FiberTag | null\n\n// Mutable renderer registry indexed by FiberTag. Feature modules install their\n// renderer via registerRenderer(); unregistered features render as no-ops. The\n// initial registrations below rely on function-declaration hoisting \u2014 every\n// render* function is declared with `function` later in this file.\nconst RENDERERS: Array<RenderFn | undefined> = new Array(13)\n\n// Element-marker allowlist for child normalization (pushChildren). Core-always\n// markers are seeded here; features add their own via registerElementMarker.\nconst ACCEPTED_ELEMENT_MARKERS = new Set<symbol>([\n REACT_ELEMENT_TYPE as symbol,\n REACT_LEGACY_ELEMENT_TYPE as symbol,\n])\n\n// Type-to-tag matchers tried in registration order from fiberFromChild's\n// fallback branch. Features register here for element types that aren't\n// marker-based (e.g. Portal, where element.type IS the symbol).\nconst TYPE_MATCHERS: TypeMatcher[] = []\n\nexport function registerRenderer(tag: FiberTag, fn: RenderFn): void {\n RENDERERS[tag] = fn\n}\n\nexport function registerTypeMatcher(m: TypeMatcher): void {\n TYPE_MATCHERS.push(m)\n}\n\nexport function registerElementMarker(sym: symbol): void {\n ACCEPTED_ELEMENT_MARKERS.add(sym)\n}\n\n// Accessor + scoped setter for the module-level `currentRoot`. Feature modules\n// need these to participate in the render loop (e.g. Suspense re-hydration\n// must temporarily set the root while rebuilding a boundary subtree).\nexport function getCurrentRoot(): FiberRoot | null {\n return currentRoot\n}\n\nexport function withCurrentRoot<T>(root: FiberRoot | null, fn: () => T): T {\n const prev = currentRoot\n currentRoot = root\n try {\n return fn()\n } finally {\n currentRoot = prev\n }\n}\n\n// The memo feature uses this to bypass its prop-equality gate on state-driven\n// rerenders of the memoized fiber itself (hook update / subscribed store),\n// where props haven't changed by definition.\nexport function getForceRerenderingFiber(): Fiber | null {\n return forceRerenderingFiber\n}\n\nregisterRenderer(FiberTag.Text, renderText)\nregisterRenderer(FiberTag.Host, renderHost)\nregisterRenderer(FiberTag.Function, renderFunction)\nregisterRenderer(FiberTag.Fragment, renderFragment)\n\nexport function renderFiber(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const fn = RENDERERS[fiber.tag]\n if (fn) fn(fiber, domParent, anchor)\n}\n\nfunction renderText(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const text = fiber.pp as string\n // Identity-unchanged fast path: skip the native Text.data write entirely.\n if (fiber.dom && fiber.mp === text) return\n if (!fiber.dom) {\n const hydrated = currentRoot?.h ? adoptTextDom(fiber, fiber.parent!, text) : false\n if (!hydrated) {\n fiber.dom = document.createTextNode(text)\n insertInto(domParent, fiber.dom, anchor)\n }\n } else {\n // Past the fast path, and adoptTextDom already realigned `.data` on\n // hydration \u2014 `.data !== text` here is guaranteed, so write directly.\n ;(fiber.dom as Text).data = text\n }\n fiber.mp = text\n // dy cleared at rerender start; leaving true lets mid-render schedule persist\n}\n\nfunction renderHost(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const props = fiber.pp ?? {}\n const prev = fiber.mp ?? {}\n const type = fiber.type as string\n const isSvg = type === 'svg' || (domParent as Element).namespaceURI === 'http://www.w3.org/2000/svg'\n\n // <select value> must be applied AFTER children mount \u2014 setting `.value`\n // on a `<select>` with no matching `<option>` yet resets it to empty. Same\n // for `defaultValue` on first mount. Stash and replay.\n const isSelect = type === 'select'\n const deferredSelectValue =\n isSelect && (props.value !== undefined || props.defaultValue !== undefined)\n ? props.value !== undefined ? props.value : props.defaultValue\n : undefined\n\n if (!fiber.dom) {\n const hydrated = currentRoot?.h ? adoptHostDom(fiber, fiber.parent!) : false\n if (!hydrated) {\n fiber.dom = createHostNode(type, isSvg)\n // Two passes so form-control attributes (notably <input type>) are in\n // place before event handlers attach. setEventHandler reads the\n // element's runtime state to decide the DOM event name (e.g. onChange\n // \u2192 `input` vs `change`); binding before `type` is applied would\n // attach to the wrong event for checkbox/radio/file inputs.\n for (const k in props) {\n if (isSelect && (k === 'value' || k === 'defaultValue')) continue\n if (isEventProp(k)) continue\n setProp(fiber.dom as Element, k, props[k], undefined, isSvg)\n }\n for (const k in props) {\n if (!isEventProp(k)) continue\n setProp(fiber.dom as Element, k, props[k], undefined, isSvg)\n }\n insertInto(domParent, fiber.dom, anchor)\n }\n attachRef(fiber, fiber.dom)\n } else if (prev !== props) {\n const el = fiber.dom as Element\n // Single-pass diff. Defer changed event props into a small array so the\n // `type-before-events` invariant the mount path needs (setEventHandler\n // reads `el.type` to resolve onChange\u2192input vs change) still holds when\n // a render flips both `type` and an event handler in the same pass.\n // The vast majority of host updates have no events at all (e.g. data-*\n // attributes flipping on a stable list), so the deferred array stays\n // null and we collapse to one for-in over `props`.\n let deferredEvents: string[] | null = null\n for (const k in props) {\n if (isSelect && (k === 'value' || k === 'defaultValue')) continue\n if (isEventProp(k)) {\n if (prev[k] !== props[k]) {\n deferredEvents ||= []\n deferredEvents.push(k)\n }\n continue\n }\n if (prev[k] !== props[k]) setProp(el, k, props[k], prev[k], isSvg)\n }\n // Removals \u2014 keys present in prev but not in props.\n for (const k in prev) {\n if (!(k in props)) setProp(el, k, undefined, prev[k], isSvg)\n }\n if (deferredEvents) {\n for (let i = 0; i < deferredEvents.length; i++) {\n const k = deferredEvents[i]!\n setProp(el, k, props[k], prev[k], isSvg)\n }\n }\n syncRefIfChanged(fiber, fiber.dom)\n }\n\n // Children go into this DOM node\n reconcileChildren(fiber, childrenToArray(props.children), fiber.dom!, null)\n\n // During hydration, if after reconciling all client-expected children we\n // still have server DOM left in the cursor for this host, that's a\n // structural mismatch (server produced more than client wants). Report.\n // <head>/<html> are position-insensitive \u2014 leftover here is normal\n // (Vite dev-style injections, SSR-only scripts, etc.).\n if (currentRoot?.h) {\n const parentTag = (fiber.type as string).toLowerCase()\n const hasOpaqueHydrationChildren =\n props.dangerouslySetInnerHTML != null ||\n (parentTag === 'textarea' && (props.value != null || props.defaultValue != null))\n if (\n parentTag !== 'head' &&\n parentTag !== 'html' &&\n parentTag !== 'body' &&\n !hasOpaqueHydrationChildren\n ) {\n const cursor = getHydrationCursor(fiber)\n if (cursor) {\n if (cursor.has()) {\n const error = new Error(\n process.env.NODE_ENV !== 'production'\n ? `Hydration mismatch: server rendered extra nodes inside <${parentTag}>.`\n : 'Hydration mismatch.',\n )\n if (currentRoot.re) currentRoot.re(error)\n abortHydration(error, fiber)\n }\n }\n }\n }\n\n // Apply <select> value after options are mounted.\n if (isSelect && deferredSelectValue !== undefined) {\n const select = fiber.dom as HTMLSelectElement\n if (Array.isArray(deferredSelectValue)) {\n const asStrings = deferredSelectValue.map((v) => '' + v)\n for (const opt of Array.from(select.options)) {\n opt.selected = asStrings.includes(opt.value)\n }\n } else {\n select.value = '' + deferredSelectValue\n }\n }\n\n fiber.mp = props\n // dy cleared at rerender start; leaving true lets mid-render schedule persist\n}\n\nfunction renderFunction(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const prevDispatcher = ReactSharedInternals.H\n const prevFiber = ReactSharedInternals.F\n const prevHook = ReactSharedInternals.K\n const prevIndex = ReactSharedInternals.I\n\n ReactSharedInternals.H = makeDispatcher()\n ReactSharedInternals.F = fiber\n ReactSharedInternals.K = null\n ReactSharedInternals.I = 0\n\n let rendered: ReactNode\n let deferredForHydration = false\n try {\n rendered = (fiber.type as Function)(fiber.pp ?? {})\n } catch (e: any) {\n if (isThenable(e)) {\n if (deferHydration(fiber, e)) {\n deferredForHydration = true\n } else {\n CAPABILITIES.handleSuspended(fiber, e)\n rendered = null\n }\n } else {\n handleErrorInRender(fiber, e)\n return\n }\n } finally {\n ReactSharedInternals.H = prevDispatcher\n ReactSharedInternals.F = prevFiber\n ReactSharedInternals.K = prevHook\n ReactSharedInternals.I = prevIndex\n }\n\n if (deferredForHydration) return\n\n reconcileChildren(fiber, childrenToArray(rendered), domParent, anchor)\n fiber.mp = fiber.pp\n // dy cleared at rerender start; leaving true lets mid-render schedule persist\n}\n\nfunction hasAncestorHydrationCursor(_fiber: Fiber): boolean {\n // Reserved for future per-Suspense-boundary hydration deferral. For now the\n // top-level hydration path is all we need to special-case.\n return false\n}\n\nexport function deferHydration(fiber: Fiber, thenable: Promise<any>): boolean {\n if (!currentRoot?.h) return false\n const hostParent = findHydrationHost(fiber)\n const inheritedCursor = getHydrationCursor(hostParent)\n if (inheritedCursor) setHydrationCursor(fiber, inheritedCursor)\n ;((fiber.ms ??= {}) as any).p = true\n let sus: Fiber | null = fiber.parent\n while (sus && sus.tag !== FiberTag.Suspense) sus = sus.parent\n if (sus && sus.ms) {\n ;(sus.ms as any).a = true\n }\n const clearAwait = () => {\n if (sus && sus.ms) {\n ;(sus.ms as any).a = false\n }\n scheduleUpdate(fiber)\n }\n thenable.then(clearAwait, clearAwait)\n return true\n}\n\nfunction renderFragment(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const props = fiber.pp ?? {}\n reconcileChildren(fiber, childrenToArray(props.children), domParent, anchor)\n fiber.mp = props\n // dy cleared at rerender start; leaving true lets mid-render schedule persist\n}\n\n// ---------------------------------------------------------------------------\n// Error handling + default Suspense capability\n// ---------------------------------------------------------------------------\n\n// Default handler when the Suspense feature isn't installed: just schedule\n// a re-render when the thrown thenable settles. No boundary walk, no\n// fallback swap \u2014 children render empty during the pending window.\nfunction defaultHandleSuspended(fiber: Fiber, thenable: Promise<any>): void {\n thenable.then(\n () => scheduleUpdate(fiber),\n () => scheduleUpdate(fiber),\n )\n}\n\n// ---------------------------------------------------------------------------\n// Capability hooks \u2014 cross-cutting behaviors that features override.\n// Defaults here preserve today's behavior so the indirection is transparent\n// when all features are loaded. A feature's full-module can install its own\n// implementation via installCapability(); stubs leave the default in place,\n// where the default may intentionally degrade (e.g. a no-Context build's\n// readContext never walks the tree because no Provider fibers exist).\n// ---------------------------------------------------------------------------\n\nexport interface Capabilities {\n handleSuspended: (fiber: Fiber, thenable: Promise<any>) => void\n readContext: (fiber: Fiber, ctx: any) => any\n}\n\nconst CAPABILITIES: Capabilities = {\n handleSuspended: defaultHandleSuspended,\n readContext: defaultReadContext,\n}\n\nexport function installCapability<K extends keyof Capabilities>(\n name: K,\n fn: Capabilities[K],\n): void {\n CAPABILITIES[name] = fn\n}\n\n// Wrapper for features that catch thrown thenables inside their render\n// functions. Delegates to the installed Suspense capability.\nexport function handleSuspended(fiber: Fiber, thenable: Promise<any>): void {\n CAPABILITIES.handleSuspended(fiber, thenable)\n}\n\nexport function handleErrorInRender(fiber: Fiber, err: any): void {\n if (currentRoot?.h) {\n abortHydration(err, fiber)\n }\n // Bubble to nearest class boundary with getDerivedStateFromError / componentDidCatch\n let f: Fiber | null = fiber.parent\n while (f) {\n if (f.tag === FiberTag.Class) {\n const Ctor = f.type as any\n const instance = f.sn\n if (Ctor.getDerivedStateFromError) {\n const update = Ctor.getDerivedStateFromError(err)\n instance.state = { ...instance.state, ...update }\n }\n if (instance.componentDidCatch) {\n try {\n instance.componentDidCatch(err, { componentStack: '' })\n } catch {}\n }\n scheduleUpdate(f)\n return\n }\n f = f.parent\n }\n // No boundary \u2014 report to root\n if (currentRoot?.ue) currentRoot.ue(err)\n else throw err\n}\n\nexport function isThenable(x: any): x is Promise<any> {\n return x != null && typeof x.then == 'function'\n}\n\n// ---------------------------------------------------------------------------\n// Unmount\n// ---------------------------------------------------------------------------\n\nexport function unmountFiber(fiber: Fiber, domParent: Node): void {\n fiber.um = true\n // Recurse first\n let c = fiber.child\n while (c) {\n const next = c.sibling\n unmountFiber(c, fiber.tag === FiberTag.Host ? fiber.dom! : domParent)\n c = next\n }\n fiber.child = null\n\n // Run cu (fx + layout fx)\n if (fiber.cu) {\n for (const cleanup of fiber.cu) {\n try {\n cleanup()\n } catch (e) {\n if (currentRoot?.re) currentRoot.re(e)\n }\n }\n fiber.cu = null\n }\n\n if (fiber.tag === FiberTag.Class && fiber.sn?.componentWillUnmount) {\n try {\n fiber.sn.componentWillUnmount()\n } catch (e) {\n if (currentRoot?.re) currentRoot.re(e)\n }\n fiber.sn._fiber = null\n fiber.sn._enqueueUpdate = null\n fiber.sn._forceUpdate = null\n }\n\n // Detach ref\n if (fiber.ref) detachRef(fiber.ref)\n\n // Remove DOM if host\n if (fiber.tag === FiberTag.Host && fiber.dom && fiber.dom.parentNode) {\n fiber.dom.parentNode.removeChild(fiber.dom)\n } else if (fiber.tag === FiberTag.Text && fiber.dom && fiber.dom.parentNode) {\n fiber.dom.parentNode.removeChild(fiber.dom)\n }\n}\n\nexport function unmountAllChildren(parent: Fiber, domParent: Node): void {\n let c = parent.child\n while (c) {\n const next = c.sibling\n unmountFiber(c, domParent)\n c = next\n }\n parent.child = null\n}\n\n// ---------------------------------------------------------------------------\n// DOM navigation helpers\n// ---------------------------------------------------------------------------\n\nfunction insertInto(parent: Node, node: Node, anchor: Node | null): void {\n const projectedHeadParent = getDocumentHeadInsertionParent(parent, node)\n if (projectedHeadParent) {\n projectedHeadParent.appendChild(node)\n return\n }\n\n // Anchor may have been removed or moved since it was computed (mutations\n // from unmount, boundary reveal, user code, HMR). If it's no longer a child\n // of `parent`, fall back to append \u2014 trying to insertBefore a non-child\n // throws NotFoundError and dev-loops the reconciler.\n if (anchor && anchor.parentNode === parent) {\n parent.insertBefore(node, anchor)\n } else {\n parent.appendChild(node)\n }\n}\n\nconst DOCUMENT_HEAD_TAGS = new Set(['base', 'link', 'meta', 'script', 'style', 'title'])\n\nfunction getDocumentHeadInsertionParent(parent: Node, node: Node): HTMLHeadElement | null {\n if (parent.nodeType !== 9 || node.nodeType !== 1) return null\n const tag = (node as Element).tagName.toLowerCase()\n if (!DOCUMENT_HEAD_TAGS.has(tag)) return null\n return (parent as Document).head\n}\n\nfunction getHostParent(fiber: Fiber): Node {\n let p = fiber.parent\n while (p) {\n if (p.tag === FiberTag.Host) return p.dom!\n if (p.tag === FiberTag.Root)\n return (p.sn as Node) || (p.dom as Node) || (p.root?.c as Node)\n if (p.tag === FiberTag.Portal) {\n // Portal renders its children into the `container` prop, not into any\n // DOM element the portal fiber \"owns\". Read the container from the\n // portal's own props so a rerenderFiber triggered on a descendant\n // (e.g. a Floating-UI-positioned popper in a Radix Portal) finds its\n // host parent \u2014 otherwise getHostParent returns undefined and the\n // next renderHost crashes reading `.namespaceURI` on undefined.\n const props = (p.pp ?? p.mp) as { container?: Element } | null\n return (props?.container as Node) || (p.sn as Node) || (p.dom as Node) || (p.root?.c as Node)\n }\n p = p.parent\n }\n if (process.env.NODE_ENV !== 'production') {\n throw new Error('No host parent found.')\n }\n throw new Error()\n}\n\nfunction getAnchor(fiber: Fiber): Node | null {\n // Return the first DOM node that comes after this fiber within the host parent\n let f: Fiber | null = fiber.sibling\n while (f) {\n const d = firstDomNode(f)\n if (d) return d\n f = f.sibling\n }\n // Ascend\n let p = fiber.parent\n while (p && p.tag !== FiberTag.Host && p.tag !== FiberTag.Root && p.tag !== FiberTag.Portal) {\n if (p.sibling) {\n const d = firstDomNode(p.sibling)\n if (d) return d\n }\n p = p.parent\n }\n return null\n}\n\nfunction firstDomNode(fiber: Fiber): Node | null {\n if (fiber.tag === FiberTag.Host || fiber.tag === FiberTag.Text) return fiber.dom\n let c = fiber.child\n while (c) {\n const d = firstDomNode(c)\n if (d) return d\n c = c.sibling\n }\n return null\n}\n\n// ---------------------------------------------------------------------------\n// Context read \u2014 exported for dispatcher.ts (useContext, use()). Delegates to\n// the installed capability so the Context feature can override with a walking\n// implementation that finds the nearest Provider fiber. When the feature is\n// stubbed, the default here returns ctx._currentValue \u2014 correct because no\n// Provider fibers exist in the tree (Provider element \u2192 Fragment via the\n// stub's type matcher).\n// ---------------------------------------------------------------------------\n\nexport function readContext(fiber: Fiber, ctx: any): any {\n return CAPABILITIES.readContext(fiber, ctx)\n}\n\nfunction defaultReadContext(_fiber: Fiber, ctx: any): any {\n return ctx._currentValue\n}\n\n// ---------------------------------------------------------------------------\n// Refs\n// ---------------------------------------------------------------------------\n\nfunction attachRef(fiber: Fiber, value: any): void {\n const ref = fiber.ref ?? (fiber.pp?.ref ?? null)\n if (!ref) return\n if (typeof ref == 'function') {\n // Match React's commit-phase semantics: callback refs run after render\n // (during the layout/commit phase), not during render. Calling them\n // synchronously here breaks libraries that assert no event handlers run\n // during render (e.g. base-ui's useStableCallback trampoline).\n scheduleLifecycle(fiber, () => {\n const cleanup = ref(value)\n fiber.cu ||= []\n fiber.cu.push(typeof cleanup == 'function' ? cleanup : () => ref(null))\n })\n } else {\n ref.current = value\n }\n}\n\nfunction syncRefIfChanged(fiber: Fiber, value: any): void {\n const ref = fiber.ref ?? (fiber.pp?.ref ?? null)\n if (!ref) return\n if (typeof ref === 'object' && ref.current !== value) ref.current = value\n}\n\nfunction detachRef(ref: any): void {\n // Function refs are handled via fiber.cu (queued in attachRef during\n // the commit phase): the cleanup either invokes the user-returned cleanup\n // fn or calls ref(null). Calling ref(null) here would double-fire it.\n if (ref && typeof ref === 'object') {\n ref.current = null\n }\n}\n\n// ---------------------------------------------------------------------------\n// Effects\n// ---------------------------------------------------------------------------\n\nconst pendingEffects: Array<[Fiber, Effect]> = []\nconst pendingLayoutEffects: Array<[Fiber, Effect]> = []\nconst pendingLifecycles: Array<() => void> = []\n\nexport function enqueueEffect(fiber: Fiber, effect: Effect): void {\n if (effect.t) {\n pendingLayoutEffects.push([fiber, effect])\n } else {\n pendingEffects.push([fiber, effect])\n }\n}\n\nexport function scheduleLifecycle(_fiber: Fiber, fn: () => void): void {\n pendingLifecycles.push(fn)\n}\n\nexport function runEffects(root: FiberRoot): void {\n // Layout fx synchronously\n while (pendingLayoutEffects.length) {\n const [fiber, effect] = pendingLayoutEffects.shift()!\n runEffect(fiber, effect, root)\n }\n // Then lifecycles\n while (pendingLifecycles.length) {\n const fn = pendingLifecycles.shift()!\n try {\n fn()\n } catch (e) {\n if (root.ce) root.ce(e)\n }\n }\n // Passive fx on microtask\n if (pendingEffects.length) {\n const batch = pendingEffects.splice(0)\n queueMicrotask(() => {\n for (const [fiber, effect] of batch) runEffect(fiber, effect, root)\n })\n }\n}\n\nfunction runEffect(fiber: Fiber, effect: Effect, root: FiberRoot): void {\n try {\n const cleanup = effect.c()\n if (typeof cleanup == 'function') {\n fiber.cu ||= []\n fiber.cu.push(cleanup)\n }\n } catch (e) {\n if (root.ce) root.ce(e)\n }\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction isEventProp(name: string): boolean {\n return (\n name.length > 2 &&\n name.charCodeAt(0) === 111 /* o */ &&\n name.charCodeAt(1) === 110 /* n */ &&\n name.charCodeAt(2) >= 65 /* 'A'-ish: any uppercase start (onClick, onChange, \u2026) */\n )\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import {\n FiberTag,\n createFiber,\n REACT_ELEMENT_TYPE,\n REACT_LEGACY_ELEMENT_TYPE,\n REACT_FRAGMENT_TYPE,\n type Fiber,\n type FiberRoot,\n type ReactElement,\n type ReactNode,\n type Hook,\n type Effect,\n} from '../core'\nimport {\n ReactSharedInternals,\n REACT_LAZY_TYPE,\n REACT_STRICT_MODE_TYPE,\n REACT_PROFILER_TYPE,\n} from '../react'\nimport { createHostNode, setProp } from './dom'\nimport { makeDispatcher } from './dispatcher'\nimport {\n adoptHostDom,\n adoptTextDom,\n setHydrationCursor,\n getHydrationCursor,\n clearHydrationCursor,\n findHostParent as findHydrationHost,\n abortHydration,\n recoverHydration,\n} from './features/hydration'\n\n// ---------------------------------------------------------------------------\n// Render scheduling\n// ---------------------------------------------------------------------------\n\nlet currentRoot: FiberRoot | null = null\nlet flushing = false\nlet isBatching = false\nconst pendingRoots = new Set<FiberRoot>()\n\n// Set by rerenderFiber to identify the exact memo-tagged fiber whose INTERNAL\n// state (hook update, useSyncExternalStore notification) triggered this render\n// pass. renderMemo checks this to bypass its prop-equality gate for that fiber.\n// Without the bypass, a memo bail would swallow state changes: React's memo is\n// only a parent-triggered gate \u2014 state-driven rerenders must always run the\n// inner function. Router-adjacent components (Outlet, Match, MatchInner) are\n// all memo-wrapped and subscribe to stores; missing this bypass breaks nav\n// content updates even though the URL changes.\nlet forceRerenderingFiber: Fiber | null = null\n\nexport function scheduleUpdate(fiber: Fiber): void {\n // Drop updates scheduled on already-um fibers. Subscribers (router,\n // query, any external store) can fire after unmount if their cleanup was\n // missed, and letting those reach rerenderFiber mounts zombie DOM into the\n // old .parent's DOM (which stays reachable via the stale pointer).\n if (fiber.um) return\n const root = findRoot(fiber)\n if (!root) return\n root.p.add(fiber)\n fiber.dy = true\n pendingRoots.add(root)\n if (isBatching) return\n if (!root.s) {\n root.s = true\n queueMicrotask(flushPending)\n }\n}\n\nexport function flushSyncWork(fn: () => void): void {\n const wasBatching = isBatching\n isBatching = true\n try {\n fn()\n } finally {\n isBatching = wasBatching\n }\n flushPending()\n}\n\nexport function batchedUpdates<T>(fn: () => T): T {\n const wasBatching = isBatching\n isBatching = true\n try {\n return fn()\n } finally {\n isBatching = wasBatching\n if (!wasBatching) flushPending()\n }\n}\n\nfunction flushPending(): void {\n if (flushing) return\n flushing = true\n try {\n let guard = 0\n while (pendingRoots.size > 0) {\n if (++guard > 50) {\n if (process.env.NODE_ENV !== 'production') {\n throw new Error('flushPending exceeded 50 iterations \u2014 suspected infinite update loop.')\n }\n throw new Error()\n }\n const roots = [...pendingRoots]\n pendingRoots.clear()\n for (const root of roots) {\n root.s = false\n // Render each pending fiber from shallowest first so an ancestor's\n // cascade reaches descendants before we try to render them directly.\n // Descendants rendered via cascade still have `dy=true` (only\n // rerenderFiber clears it); when we later reach them in this loop,\n // rerenderFiber's own `if (!dy) return` is our short-circuit. We\n // previously filtered descendants of dy ancestors here, but that\n // loses updates whenever an ancestor's render doesn't actually reach\n // the descendant \u2014 e.g. React.memo bailing on equal props. Keep all\n // dy fibers and let rerenderFiber de-dupe via its dy check.\n const pending = [...root.p]\n root.p.clear()\n pending.sort((a, b) => fiberDepth(a) - fiberDepth(b))\n for (const fiber of pending) {\n try {\n rerenderFiber(fiber, root)\n } catch (error) {\n if (!recoverHydration(root, error)) throw error\n break\n }\n }\n runEffects(root)\n }\n }\n } finally {\n flushing = false\n }\n}\n\nexport function discardPendingWork(root: FiberRoot): void {\n root.p.clear()\n root.s = false\n pendingRoots.delete(root)\n}\n\nfunction fiberDepth(fiber: Fiber): number {\n let d = 0\n let p: Fiber | null = fiber.parent\n while (p) {\n d++\n p = p.parent\n }\n return d\n}\n\nexport function findRoot(fiber: Fiber): FiberRoot | null {\n let f: Fiber | null = fiber\n while (f) {\n if (f.root) return f.root\n f = f.parent\n }\n return null\n}\n\n// ---------------------------------------------------------------------------\n// Entry points (called by createRoot)\n// ---------------------------------------------------------------------------\n\nexport function renderRoot(root: FiberRoot, children: ReactNode): void {\n const rootFiber = root.r\n rootFiber.pp = { children }\n currentRoot = root\n try {\n reconcileChildren(rootFiber, childrenToArray(children), root.c as Node, null)\n rootFiber.mp = rootFiber.pp\n rootFiber.dy = false\n } finally {\n currentRoot = null\n }\n runEffects(root)\n}\n\nfunction rerenderFiber(fiber: Fiber, root: FiberRoot): void {\n if (!fiber.dy) return\n // Skip fibers that were um between scheduling and flush. Without this,\n // the flush loop re-enters a zombie fiber whose .parent is still set; its\n // render mounts fresh DOM into the old parent's still-attached DOM (since\n // unmountFiber only clears fiber.child, not fiber.parent). Visible as route\n // content from a previous location staying on screen after nav, because a\n // pending rerender on the old route's LibraryLandingPage (um during\n // Outlet's shallow-first render) still fires from root.pending.\n if (fiber.um) return\n // Clear BEFORE rendering so a scheduleUpdate() triggered mid-render (e.g.\n // error boundary catching a descendant throw) marks us dy for the next\n // flush iteration instead of being wiped out when render() completes.\n fiber.dy = false\n currentRoot = root\n // If this rerender is resuming a hydration that was deferred by a suspension,\n // re-activate hydration mode for its duration so descendants adopt DOM\n // instead of re-creating it.\n const resumeHydration =\n fiber.ms && (fiber.ms as any).p === true\n const prevHydrating = root.h\n if (resumeHydration) {\n delete (fiber.ms as any).p\n root.h = true\n }\n const prevForcing = forceRerenderingFiber\n forceRerenderingFiber = fiber\n try {\n renderFiber(fiber, getHostParent(fiber), getAnchor(fiber))\n } finally {\n forceRerenderingFiber = prevForcing\n if (resumeHydration) {\n root.h = prevHydrating\n // Deferred hydration completed \u2014 detach the preserved cursor so future\n // updates (post-hydration state changes) don't try to adopt stale DOM.\n clearHydrationCursor(fiber)\n }\n currentRoot = null\n }\n}\n\n// ---------------------------------------------------------------------------\n// Element \u2192 children normalization\n// ---------------------------------------------------------------------------\n\n// Text children pass through as raw strings \u2014 no wrapper. The previous\n// `{_text: string}` shape allocated tens of thousands of objects per\n// stable-list re-render and dominated minor-GC pressure. `typeof === 'string'`\n// is also robust to RSC renderable proxies (which have `has` traps that\n// would fool a `'_text' in child` predicate but can't fool `typeof`).\ntype NormalizedChild = ReactElement | string | null\n\nfunction isTextChild(child: Exclude<NormalizedChild, null>): child is string {\n return typeof child === 'string'\n}\n\nexport function childrenToArray(children: ReactNode): NormalizedChild[] {\n const out: NormalizedChild[] = []\n pushChildren(children, out)\n return out\n}\n\nfunction pushChildren(node: ReactNode, out: NormalizedChild[]): void {\n if (node == null || typeof node === 'boolean') return\n if (typeof node === 'string') {\n // Empty strings render no text node (matches React + the `<!-- -->`\n // separator elision on the SSR side so server/client agree).\n if (node === '') return\n out.push(node)\n return\n }\n if (typeof node === 'number') {\n out.push('' + node)\n return\n }\n if (Array.isArray(node)) {\n for (let i = 0; i < node.length; i++) pushChildren(node[i], out)\n return\n }\n if (isIterable(node)) {\n for (const item of node as Iterable<ReactNode>) pushChildren(item, out)\n return\n }\n if (typeof node === 'object') {\n const t = (node as any).$$typeof\n if (ACCEPTED_ELEMENT_MARKERS.has(t)) {\n out.push(node as ReactElement)\n return\n }\n // Raw React.lazy as a child. RSC Flight encodes 'use client' components\n // (CodeBlock, CodeExplorer, etc.) as bare Lazy objects in the tree, not\n // wrapped in REACT_ELEMENT_TYPE. Dropping them made code snippets\n // disappear from docs pages. The RSC decoder pre-awaits payloads via\n // `awaitLazyElements`, so by render time the status is 'fulfilled' and\n // `_init()` returns the resolved element synchronously.\n if (t === REACT_LAZY_TYPE) {\n const lazy = node as any\n const resolved = lazy._init(lazy._payload)\n pushChildren(resolved, out)\n return\n }\n }\n}\n\nfunction isIterable(obj: any): boolean {\n return obj != null && typeof obj[Symbol.iterator] == 'function'\n}\n\nfunction getKeyOf(child: NormalizedChild, index: number): string {\n if (!child) return 'n' + index\n if (isTextChild(child)) return '$t' + index\n if (child.key != null) return 'k' + child.key\n return 'i' + index\n}\n\nfunction sameType(fiber: Fiber, child: NormalizedChild): boolean {\n if (!child) return false\n if (isTextChild(child)) return fiber.tag === FiberTag.Text\n return fiber.type === child.type && sameKey(fiber.key, child.key)\n}\n\nfunction sameKey(a: string | null, b: string | null | undefined): boolean {\n return (a ?? null) === (b ?? null)\n}\n\n// ---------------------------------------------------------------------------\n// Fiber creation\n// ---------------------------------------------------------------------------\n\nfunction fiberFromChild(child: NormalizedChild, parent: Fiber): Fiber {\n if (!child) return createFiber(FiberTag.Fragment, null, null)\n if (isTextChild(child)) {\n const f = createFiber(FiberTag.Text, null, null)\n f.pp = child\n f.parent = parent\n return f\n }\n const type = child.type\n let tag: FiberTag = FiberTag.Host\n const marker = type && (type as any).$$typeof\n if (typeof type === 'string') tag = FiberTag.Host\n else if (type === REACT_FRAGMENT_TYPE) tag = FiberTag.Fragment\n else if (type === REACT_STRICT_MODE_TYPE || type === REACT_PROFILER_TYPE) tag = FiberTag.Fragment\n else {\n // Feature-registered type matchers (Portal, future extractions). Features\n // that carry the symbol as element.type directly (rather than wrapping in\n // REACT_ELEMENT_TYPE) match here by type identity.\n let matched: FiberTag | null = null\n for (const m of TYPE_MATCHERS) {\n matched = m(type, marker)\n if (matched !== null) break\n }\n if (matched !== null) tag = matched\n else if (typeof type == 'function') {\n tag = type.prototype && type.prototype.isReactComponent ? FiberTag.Class : FiberTag.Function\n }\n }\n const f = createFiber(tag, type, child.key ?? null)\n f.ref = (child as any).ref ?? null\n f.pp = child.props\n f.parent = parent\n return f\n}\n\n// ---------------------------------------------------------------------------\n// Reconciliation\n// ---------------------------------------------------------------------------\n\n/**\n * Reconcile a parent fiber's child list against new normalized children.\n * Mutates parent.child and the sibling chain.\n * Mounts new host DOM into `domParent` before `anchor` (or appends if anchor === null).\n */\nexport function reconcileChildren(\n parent: Fiber,\n newChildren: NormalizedChild[],\n domParent: Node,\n anchor: Node | null,\n): void {\n // Fast path: unkeyed positional steady-state. Walk the existing sibling\n // chain and newChildren in lockstep, validating AND committing in one pass.\n // On any divergence we fall back to the slow path, which rebuilds the\n // sibling chain anyway \u2014 partial pp writes are idempotent.\n // Skips the Map / Set / existing-array allocation entirely.\n if (!currentRoot?.h) {\n let f: Fiber | null = parent.child\n let ok = true\n for (let i = 0; i < newChildren.length; i++) {\n const child = newChildren[i]\n if (child == null || !f || f.key != null) { ok = false; break }\n if (typeof child === 'string') {\n if (f.tag !== FiberTag.Text) { ok = false; break }\n f.pp = child\n } else {\n if ((child as ReactElement).key != null) { ok = false; break }\n if (f.type !== (child as ReactElement).type) { ok = false; break }\n f.pp = (child as ReactElement).props\n f.ref = (child as any).ref ?? null\n }\n f = f.sibling\n }\n if (ok && f === null) {\n // Pass 2: render forward with per-child anchors. Identical to the slow\n // path's pass 2.\n for (let r: Fiber | null = parent.child; r; r = r.sibling) {\n let a = anchor\n for (let s: Fiber | null = r.sibling; s; s = s.sibling) {\n const d = firstDomNode(s)\n if (d && d.parentNode === domParent) { a = d; break }\n }\n renderFiber(r, domParent, a)\n }\n return\n }\n }\n\n const existing = collectChildren(parent)\n const keyed = new Map<string, Fiber>()\n for (const f of existing) {\n if (f.key != null) keyed.set('k' + f.key, f)\n }\n\n let prevNewFiber: Fiber | null = null\n const claimed = new Set<Fiber>()\n let structurallyChanged = false\n // Budget-guided positional matching. We walk `existing` (unkeyed only) with a\n // single cursor `existingIdx` and, on a type mismatch, choose insert vs delete\n // based on the remaining length delta (`budget`):\n // budget > 0: more new than old remain \u2192 treat slot as an INSERTION: keep\n // the old cursor and create a fresh fiber for new[i].\n // budget < 0: more old than new remain \u2192 treat slot as a DELETION: advance\n // the old cursor past the mismatched fiber (it'll be um\n // in the unclaimed pass) and retry.\n // budget == 0: equal remaining \u2192 treat as REPLACE by preferring delete\n // until budget flips positive or we hit a match.\n // This avoids greedy forward scans that steal a later same-type fiber for a\n // newly inserted leading sibling (e.g. smallMenu flipping null \u2192 <div>\n // stealing the content <div>'s fiber and tearing down the drawer fragment).\n let existingIdx = 0\n let unkeyedOld = 0\n for (const f of existing) if (f.key == null) unkeyedOld++\n let unkeyedNew = 0\n for (const c of newChildren) if (c != null) unkeyedNew++\n let budget = unkeyedNew - unkeyedOld\n\n // Pass 1 (this loop): match against existing fibers and build the sibling\n // chain. Pass 2 (after the loop) renders each fiber with the correct\n // per-child anchor \u2014 the firstDomNode of its next still-mounted sibling,\n // or the parent's own anchor for the rightmost. Without per-child anchors\n // a child whose render output type changes from no-DOM (Portal, null) to\n // an in-flow host gets appended to the end of domParent (every child\n // would otherwise share the parent's anchor) and never moves before its\n // later siblings. Hit by the t3code Sidebar swap from a portal-rendering\n // <Sheet> to a <div data-slot=sidebar> when isMobile flips during a\n // Provider re-render.\n for (let i = 0; i < newChildren.length; i++) {\n const child = newChildren[i]\n if (child == null) continue\n\n let match: Fiber | null = null\n\n // key-based match\n if (child && typeof child === 'object' && !isTextChild(child) && (child as ReactElement).key != null) {\n const k = 'k' + (child as ReactElement).key\n const m = keyed.get(k)\n if (m && m.type === (child as ReactElement).type) {\n match = m\n keyed.delete(k)\n }\n }\n\n if (!match) {\n while (existingIdx < existing.length) {\n const cand = existing[existingIdx]!\n if (claimed.has(cand) || cand.key != null) {\n existingIdx++\n continue\n }\n if (sameType(cand, child)) {\n match = cand\n existingIdx++\n break\n }\n // Type mismatch at the cursor. Resolve via budget.\n if (budget > 0) {\n // Insertion: leave cand in place, create new for child.\n break\n }\n // Deletion (or replace-as-delete-first): advance past cand. It remains\n // unclaimed and will be um at the end.\n existingIdx++\n budget++\n }\n }\n\n // Detect reorder: matched fiber is not at its original position\n if (match && existing[i] !== match) structurallyChanged = true\n\n let fiber: Fiber\n if (match) {\n claimed.add(match)\n fiber = match\n if (isTextChild(child!)) {\n fiber.pp = child\n } else {\n fiber.type = (child as ReactElement).type\n fiber.pp = (child as ReactElement).props\n fiber.ref = (child as any).ref ?? null\n }\n } else {\n fiber = fiberFromChild(child, parent)\n structurallyChanged = true\n if (budget > 0) budget--\n }\n\n fiber.parent = parent\n fiber.sibling = null\n if (prevNewFiber) prevNewFiber.sibling = fiber\n else parent.child = fiber\n prevNewFiber = fiber\n }\n\n // Pass 2: walk the sibling chain we just built and render each fiber\n // forward with the correct per-child anchor. During hydration the cursor\n // walks DOM forward and each renderFiber adopts the next existing node,\n // so per-child anchors are moot \u2014 fall back to the parent's anchor.\n const hydrating = !!currentRoot?.h\n for (let f: Fiber | null = parent.child; f; f = f.sibling) {\n let a = anchor\n if (!hydrating) {\n // Find the firstDomNode of the next still-mounted sibling, if any.\n for (let s: Fiber | null = f.sibling; s; s = s.sibling) {\n const d = firstDomNode(s)\n if (d && d.parentNode === domParent) { a = d; break }\n }\n }\n renderFiber(f, domParent, a)\n }\n\n if (!prevNewFiber) parent.child = null\n else prevNewFiber.sibling = null\n\n // Head content is additive \u2014 server may inject metadata/stylesheets (Vite\n // dev styles, Sentry, analytics) that aren't in the React tree. Unmounting\n // them on every reconcile thrashes styles and causes flash of unstyled\n // content. Keep existing head children that weren't matched this pass.\n const parentIsHeadHost =\n parent.tag === FiberTag.Host &&\n typeof parent.type === 'string' &&\n (parent.type as string).toLowerCase() === 'head'\n\n if (!parentIsHeadHost) {\n // Unmount unclaimed\n for (const f of existing) {\n if (!claimed.has(f)) {\n unmountFiber(f)\n structurallyChanged = true\n }\n }\n // Leftover keyed\n for (const f of keyed.values()) {\n if (!claimed.has(f)) {\n unmountFiber(f)\n structurallyChanged = true\n }\n }\n }\n\n // During hydration, DOM is already in document order from the cursor-driven\n // adoption walk. Running placeChildrenInOrder here would reappend nodes to\n // the end of domParent when the true anchor (often an end marker comment)\n // isn't reflected in `anchor`. Skip it in hydration mode.\n //\n // For <head>, skip always \u2014 HeadContent re-renders routinely (route match\n // changes, providers updating), and reordering every <link>/<style>/<meta>\n // on each re-render causes stylesheet flash and re-download. Head element\n // ordering is semantically fluid; the browser doesn't care about exact\n // order within <head>.\n const parentIsHead = (domParent as Element).nodeName === 'HEAD'\n if (structurallyChanged && !currentRoot?.h && !parentIsHead) {\n placeChildrenInOrder(parent, domParent, anchor)\n }\n}\n\nfunction placeChildrenInOrder(parent: Fiber, domParent: Node, anchor: Node | null): void {\n const doms: Node[] = []\n let c = parent.child\n while (c) {\n collectHostDoms(c, doms)\n c = c.sibling\n }\n\n // Pre-check: if our fiber-owned DOM is already in document order within\n // domParent AND the trailing anchor matches, no reorder is needed. This is\n // the common case on stable re-renders, and avoids detaching/re-attaching\n // subtrees (which cancels CSS animations and triggers layout).\n if (doms.length > 0) {\n let current: Node | null = doms[0]!\n let inOrder = current.parentNode === domParent\n for (let i = 1; inOrder && i < doms.length; i++) {\n current = current!.nextSibling\n // Skip foreign nodes (SSR-injected scripts, dev-styles) between owned\n // fiber DOMs \u2014 they should stay where they are.\n while (current && !doms.includes(current as Node)) {\n current = current.nextSibling\n }\n if (current !== doms[i]) inOrder = false\n }\n // Also verify the LAST dom's next sibling lines up with `anchor`. A\n // single-dom collection (or correctly-internally-ordered doms) can sit\n // at the WRONG absolute position in domParent and still pass the\n // relative-order check above. This happens when a fiber's render output\n // changes from no-DOM (e.g. a Portal-using <Sheet>, or null) to an\n // in-flow host element: the new host is appended to the end of\n // domParent (because the parent reconcileChildren loop hands every\n // child the same anchor \u2014 typically null), and without this trailing\n // check it would never get moved before its later siblings.\n if (inOrder) {\n let last: Node | null = doms[doms.length - 1]!.nextSibling\n while (last && !doms.includes(last as Node) && last !== anchor) {\n last = last.nextSibling\n }\n if (last !== anchor) inOrder = false\n }\n if (inOrder) return\n }\n\n // Reverse-iterate, anchoring each node before the one that should follow it.\n // This works because by the time we're placing doms[i], doms[i+1] is already\n // in its final slot. Forward iteration is buggy: insertBefore(doms[i],\n // doms[i+1]) pulls doms[i] forward past any nodes that SHOULD move behind\n // it, leaving those nodes mis-anchored (app-starter Analyze/Lucky swap, npm\n // stats library dropdown reorder \u2014 both reported by users).\n //\n // Concrete example: start=[A, R, L], target=[A, L, R]. Forward pass gives\n // [L, A, R] (wrong). Reverse pass moves R to end, then L and A are already\n // correct \u2014 1 move, matches target.\n //\n // Skip nodes already in their target position so CSS transitions on stable\n // siblings aren't cancelled (e.g. drawer slide animation).\n for (let i = doms.length - 1; i >= 0; i--) {\n const d = doms[i]!\n const targetNext: Node | null = i + 1 < doms.length ? doms[i + 1]! : anchor\n if (d.parentNode !== domParent || d.nextSibling !== targetNext) {\n domParent.insertBefore(d, targetNext)\n }\n }\n}\n\nfunction collectHostDoms(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 collectHostDoms(c, out)\n c = c.sibling\n }\n}\n\nfunction collectChildren(parent: Fiber): Fiber[] {\n const out: Fiber[] = []\n let c = parent.child\n while (c) {\n out.push(c)\n c = c.sibling\n }\n return out\n}\n\n// ---------------------------------------------------------------------------\n// Rendering per fiber tag\n// ---------------------------------------------------------------------------\n\nexport type RenderFn = (fiber: Fiber, domParent: Node, anchor: Node | null) => void\nexport type TypeMatcher = (type: any, marker: any) => FiberTag | null\n\n// Mutable renderer registry indexed by FiberTag. Feature modules install their\n// renderer via registerRenderer(); unregistered features render as no-ops. The\n// initial registrations below rely on function-declaration hoisting \u2014 every\n// render* function is declared with `function` later in this file.\nconst RENDERERS: Array<RenderFn | undefined> = new Array(13)\n\n// Element-marker allowlist for child normalization (pushChildren). Core-always\n// markers are seeded here; features add their own via registerElementMarker.\nconst ACCEPTED_ELEMENT_MARKERS = new Set<symbol>([\n REACT_ELEMENT_TYPE as symbol,\n REACT_LEGACY_ELEMENT_TYPE as symbol,\n])\n\n// Type-to-tag matchers tried in registration order from fiberFromChild's\n// fallback branch. Features register here for element types that aren't\n// marker-based (e.g. Portal, where element.type IS the symbol).\nconst TYPE_MATCHERS: TypeMatcher[] = []\n\nexport function registerRenderer(tag: FiberTag, fn: RenderFn): void {\n RENDERERS[tag] = fn\n}\n\nexport function registerTypeMatcher(m: TypeMatcher): void {\n TYPE_MATCHERS.push(m)\n}\n\nexport function registerElementMarker(sym: symbol): void {\n ACCEPTED_ELEMENT_MARKERS.add(sym)\n}\n\n// Accessor + scoped setter for the module-level `currentRoot`. Feature modules\n// need these to participate in the render loop (e.g. Suspense re-hydration\n// must temporarily set the root while rebuilding a boundary subtree).\nexport function getCurrentRoot(): FiberRoot | null {\n return currentRoot\n}\n\nexport function withCurrentRoot<T>(root: FiberRoot | null, fn: () => T): T {\n const prev = currentRoot\n currentRoot = root\n try {\n return fn()\n } finally {\n currentRoot = prev\n }\n}\n\n// The memo feature uses this to bypass its prop-equality gate on state-driven\n// rerenders of the memoized fiber itself (hook update / subscribed store),\n// where props haven't changed by definition.\nexport function getForceRerenderingFiber(): Fiber | null {\n return forceRerenderingFiber\n}\n\nregisterRenderer(FiberTag.Text, renderText)\nregisterRenderer(FiberTag.Host, renderHost)\nregisterRenderer(FiberTag.Function, renderFunction)\nregisterRenderer(FiberTag.Fragment, renderFragment)\n\nexport function renderFiber(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const fn = RENDERERS[fiber.tag]\n if (fn) fn(fiber, domParent, anchor)\n}\n\nfunction renderText(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const text = fiber.pp as string\n // Identity-unchanged fast path: skip the native Text.data write entirely.\n if (fiber.dom && fiber.mp === text) return\n if (!fiber.dom) {\n const hydrated = currentRoot?.h ? adoptTextDom(fiber, fiber.parent!, text) : false\n if (!hydrated) {\n fiber.dom = document.createTextNode(text)\n insertInto(domParent, fiber.dom, anchor)\n }\n } else {\n // Past the fast path, and adoptTextDom already realigned `.data` on\n // hydration \u2014 `.data !== text` here is guaranteed, so write directly.\n ;(fiber.dom as Text).data = text\n }\n fiber.mp = text\n // dy cleared at rerender start; leaving true lets mid-render schedule persist\n}\n\nfunction renderHost(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const props = fiber.pp ?? {}\n const prev = fiber.mp ?? {}\n const type = fiber.type as string\n const isSvg = type === 'svg' || (domParent as Element).namespaceURI === 'http://www.w3.org/2000/svg'\n\n // <select value> must be applied AFTER children mount \u2014 setting `.value`\n // on a `<select>` with no matching `<option>` yet resets it to empty. Same\n // for `defaultValue` on first mount. Stash and replay.\n const isSelect = type === 'select'\n const deferredSelectValue =\n isSelect && (props.value !== undefined || props.defaultValue !== undefined)\n ? props.value !== undefined ? props.value : props.defaultValue\n : undefined\n\n if (!fiber.dom) {\n const hydrated = currentRoot?.h ? adoptHostDom(fiber, fiber.parent!) : false\n if (!hydrated) {\n fiber.dom = createHostNode(type, isSvg)\n // Two passes so form-control attributes (notably <input type>) are in\n // place before event handlers attach. setEventHandler reads the\n // element's runtime state to decide the DOM event name (e.g. onChange\n // \u2192 `input` vs `change`); binding before `type` is applied would\n // attach to the wrong event for checkbox/radio/file inputs.\n for (const k in props) {\n if (isSelect && (k === 'value' || k === 'defaultValue')) continue\n if (isEventProp(k)) continue\n setProp(fiber.dom as Element, k, props[k], undefined, isSvg)\n }\n for (const k in props) {\n if (!isEventProp(k)) continue\n setProp(fiber.dom as Element, k, props[k], undefined, isSvg)\n }\n insertInto(domParent, fiber.dom, anchor)\n }\n attachRef(fiber, fiber.dom)\n } else if (prev !== props) {\n const el = fiber.dom as Element\n // Single-pass diff. Defer changed event props into a small array so the\n // `type-before-events` invariant the mount path needs (setEventHandler\n // reads `el.type` to resolve onChange\u2192input vs change) still holds when\n // a render flips both `type` and an event handler in the same pass.\n // The vast majority of host updates have no events at all (e.g. data-*\n // attributes flipping on a stable list), so the deferred array stays\n // null and we collapse to one for-in over `props`.\n let deferredEvents: string[] | null = null\n for (const k in props) {\n if (isSelect && (k === 'value' || k === 'defaultValue')) continue\n if (isEventProp(k)) {\n if (prev[k] !== props[k]) {\n deferredEvents ||= []\n deferredEvents.push(k)\n }\n continue\n }\n if (prev[k] !== props[k]) setProp(el, k, props[k], prev[k], isSvg)\n }\n // Removals \u2014 keys present in prev but not in props.\n for (const k in prev) {\n if (!(k in props)) setProp(el, k, undefined, prev[k], isSvg)\n }\n if (deferredEvents) {\n for (let i = 0; i < deferredEvents.length; i++) {\n const k = deferredEvents[i]!\n setProp(el, k, props[k], prev[k], isSvg)\n }\n }\n syncRefIfChanged(fiber, fiber.dom)\n }\n\n // Children go into this DOM node\n reconcileChildren(fiber, childrenToArray(props.children), fiber.dom!, null)\n\n // During hydration, if after reconciling all client-expected children we\n // still have server DOM left in the cursor for this host, that's a\n // structural mismatch (server produced more than client wants). Report.\n // <head>/<html> are position-insensitive \u2014 leftover here is normal\n // (Vite dev-style injections, SSR-only scripts, etc.).\n if (currentRoot?.h) {\n const parentTag = (fiber.type as string).toLowerCase()\n const hasOpaqueHydrationChildren =\n props.dangerouslySetInnerHTML != null ||\n (parentTag === 'textarea' && (props.value != null || props.defaultValue != null))\n if (\n parentTag !== 'head' &&\n parentTag !== 'html' &&\n parentTag !== 'body' &&\n !hasOpaqueHydrationChildren\n ) {\n const cursor = getHydrationCursor(fiber)\n if (cursor) {\n if (cursor.has()) {\n const error = new Error(\n process.env.NODE_ENV !== 'production'\n ? `Hydration mismatch: server rendered extra nodes inside <${parentTag}>.`\n : 'Hydration mismatch.',\n )\n if (currentRoot.re) currentRoot.re(error)\n abortHydration(error, fiber)\n }\n }\n }\n }\n\n // Apply <select> value after options are mounted.\n if (isSelect && deferredSelectValue !== undefined) {\n const select = fiber.dom as HTMLSelectElement\n if (Array.isArray(deferredSelectValue)) {\n const asStrings = deferredSelectValue.map((v) => '' + v)\n for (const opt of Array.from(select.options)) {\n opt.selected = asStrings.includes(opt.value)\n }\n } else {\n select.value = '' + deferredSelectValue\n }\n }\n\n fiber.mp = props\n // dy cleared at rerender start; leaving true lets mid-render schedule persist\n}\n\nfunction renderFunction(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const prevDispatcher = ReactSharedInternals.H\n const prevFiber = ReactSharedInternals.F\n const prevHook = ReactSharedInternals.K\n const prevIndex = ReactSharedInternals.I\n\n ReactSharedInternals.H = makeDispatcher()\n ReactSharedInternals.F = fiber\n ReactSharedInternals.K = null\n ReactSharedInternals.I = 0\n\n let rendered: ReactNode\n let deferredForHydration = false\n try {\n rendered = (fiber.type as Function)(fiber.pp ?? {})\n } catch (e: any) {\n if (isThenable(e)) {\n if (deferHydration(fiber, e)) {\n deferredForHydration = true\n } else {\n CAPABILITIES.handleSuspended(fiber, e)\n rendered = null\n }\n } else {\n handleErrorInRender(fiber, e)\n return\n }\n } finally {\n ReactSharedInternals.H = prevDispatcher\n ReactSharedInternals.F = prevFiber\n ReactSharedInternals.K = prevHook\n ReactSharedInternals.I = prevIndex\n }\n\n if (deferredForHydration) return\n\n reconcileChildren(fiber, childrenToArray(rendered), domParent, anchor)\n fiber.mp = fiber.pp\n // dy cleared at rerender start; leaving true lets mid-render schedule persist\n}\n\nfunction hasAncestorHydrationCursor(_fiber: Fiber): boolean {\n // Reserved for future per-Suspense-boundary hydration deferral. For now the\n // top-level hydration path is all we need to special-case.\n return false\n}\n\nexport function deferHydration(fiber: Fiber, thenable: Promise<any>): boolean {\n if (!currentRoot?.h) return false\n const hostParent = findHydrationHost(fiber)\n const inheritedCursor = getHydrationCursor(hostParent)\n if (inheritedCursor) setHydrationCursor(fiber, inheritedCursor)\n ;((fiber.ms ??= {}) as any).p = true\n let sus: Fiber | null = fiber.parent\n while (sus && sus.tag !== FiberTag.Suspense) sus = sus.parent\n if (sus && sus.ms) {\n ;(sus.ms as any).a = true\n }\n const clearAwait = () => {\n if (sus && sus.ms) {\n ;(sus.ms as any).a = false\n }\n scheduleUpdate(fiber)\n }\n thenable.then(clearAwait, clearAwait)\n return true\n}\n\nfunction renderFragment(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const props = fiber.pp ?? {}\n reconcileChildren(fiber, childrenToArray(props.children), domParent, anchor)\n fiber.mp = props\n // dy cleared at rerender start; leaving true lets mid-render schedule persist\n}\n\n// ---------------------------------------------------------------------------\n// Error handling + default Suspense capability\n// ---------------------------------------------------------------------------\n\n// Default handler when the Suspense feature isn't installed: just schedule\n// a re-render when the thrown thenable settles. No boundary walk, no\n// fallback swap \u2014 children render empty during the pending window.\nfunction defaultHandleSuspended(fiber: Fiber, thenable: Promise<any>): void {\n thenable.then(\n () => scheduleUpdate(fiber),\n () => scheduleUpdate(fiber),\n )\n}\n\n// ---------------------------------------------------------------------------\n// Capability hooks \u2014 cross-cutting behaviors that features override.\n// Defaults here preserve today's behavior so the indirection is transparent\n// when all features are loaded. A feature's full-module can install its own\n// implementation via installCapability(); stubs leave the default in place,\n// where the default may intentionally degrade (e.g. a no-Context build's\n// readContext never walks the tree because no Provider fibers exist).\n// ---------------------------------------------------------------------------\n\nexport interface Capabilities {\n handleSuspended: (fiber: Fiber, thenable: Promise<any>) => void\n readContext: (fiber: Fiber, ctx: any) => any\n}\n\nconst CAPABILITIES: Capabilities = {\n handleSuspended: defaultHandleSuspended,\n readContext: defaultReadContext,\n}\n\nexport function installCapability<K extends keyof Capabilities>(\n name: K,\n fn: Capabilities[K],\n): void {\n CAPABILITIES[name] = fn\n}\n\n// Wrapper for features that catch thrown thenables inside their render\n// functions. Delegates to the installed Suspense capability.\nexport function handleSuspended(fiber: Fiber, thenable: Promise<any>): void {\n CAPABILITIES.handleSuspended(fiber, thenable)\n}\n\nexport function handleErrorInRender(fiber: Fiber, err: any): void {\n if (currentRoot?.h) {\n abortHydration(err, fiber)\n }\n // Bubble to nearest class boundary with getDerivedStateFromError / componentDidCatch\n let f: Fiber | null = fiber.parent\n while (f) {\n if (f.tag === FiberTag.Class) {\n const Ctor = f.type as any\n const instance = f.sn\n if (Ctor.getDerivedStateFromError) {\n const update = Ctor.getDerivedStateFromError(err)\n instance.state = { ...instance.state, ...update }\n }\n if (instance.componentDidCatch) {\n try {\n instance.componentDidCatch(err, { componentStack: '' })\n } catch {}\n }\n scheduleUpdate(f)\n return\n }\n f = f.parent\n }\n // No boundary \u2014 report to root\n if (currentRoot?.ue) currentRoot.ue(err)\n else throw err\n}\n\nexport function isThenable(x: any): x is Promise<any> {\n return x != null && typeof x.then == 'function'\n}\n\n// ---------------------------------------------------------------------------\n// Unmount\n// ---------------------------------------------------------------------------\n\nexport function unmountFiber(fiber: Fiber, removeDom = true): void {\n fiber.um = true\n // Recurse first\n let c = fiber.child\n while (c) {\n const next = c.sibling\n unmountFiber(c, removeDom || fiber.tag === FiberTag.Portal)\n c = next\n }\n fiber.child = null\n\n // Run cu (fx + layout fx)\n if (fiber.cu) {\n for (const cleanup of fiber.cu) {\n try {\n cleanup()\n } catch (e) {\n if (currentRoot?.re) currentRoot.re(e)\n }\n }\n fiber.cu = null\n }\n\n if (fiber.tag === FiberTag.Class && fiber.sn) {\n fiber.sn._fiber = null\n fiber.sn._enqueueUpdate = null\n fiber.sn._forceUpdate = null\n }\n\n // Detach ref\n if (fiber.ref) detachRef(fiber.ref)\n\n // Only host and text fibers own DOM nodes.\n if (removeDom) {\n fiber.dom?.parentNode?.removeChild(fiber.dom)\n }\n}\n\nexport function unmountAllChildren(parent: Fiber): void {\n let c = parent.child\n while (c) {\n const next = c.sibling\n unmountFiber(c)\n c = next\n }\n parent.child = null\n}\n\n// ---------------------------------------------------------------------------\n// DOM navigation helpers\n// ---------------------------------------------------------------------------\n\nfunction insertInto(parent: Node, node: Node, anchor: Node | null): void {\n const projectedHeadParent = getDocumentHeadInsertionParent(parent, node)\n if (projectedHeadParent) {\n projectedHeadParent.appendChild(node)\n return\n }\n\n // Anchor may have been removed or moved since it was computed (mutations\n // from unmount, boundary reveal, user code, HMR). If it's no longer a child\n // of `parent`, fall back to append \u2014 trying to insertBefore a non-child\n // throws NotFoundError and dev-loops the reconciler.\n if (anchor && anchor.parentNode === parent) {\n parent.insertBefore(node, anchor)\n } else {\n parent.appendChild(node)\n }\n}\n\nconst DOCUMENT_HEAD_TAGS = new Set(['base', 'link', 'meta', 'script', 'style', 'title'])\n\nfunction getDocumentHeadInsertionParent(parent: Node, node: Node): HTMLHeadElement | null {\n if (parent.nodeType !== 9 || node.nodeType !== 1) return null\n const tag = (node as Element).tagName.toLowerCase()\n if (!DOCUMENT_HEAD_TAGS.has(tag)) return null\n return (parent as Document).head\n}\n\nfunction getHostParent(fiber: Fiber): Node {\n let p = fiber.parent\n while (p) {\n if (p.tag === FiberTag.Host) return p.dom!\n if (p.tag === FiberTag.Root)\n return (p.sn as Node) || (p.dom as Node) || (p.root?.c as Node)\n if (p.tag === FiberTag.Portal) {\n // Portal renders its children into the `container` prop, not into any\n // DOM element the portal fiber \"owns\". Read the container from the\n // portal's own props so a rerenderFiber triggered on a descendant\n // (e.g. a Floating-UI-positioned popper in a Radix Portal) finds its\n // host parent \u2014 otherwise getHostParent returns undefined and the\n // next renderHost crashes reading `.namespaceURI` on undefined.\n const props = (p.pp ?? p.mp) as { container?: Element } | null\n return (props?.container as Node) || (p.sn as Node) || (p.dom as Node) || (p.root?.c as Node)\n }\n p = p.parent\n }\n if (process.env.NODE_ENV !== 'production') {\n throw new Error('No host parent found.')\n }\n throw new Error()\n}\n\nfunction getAnchor(fiber: Fiber): Node | null {\n // Return the first DOM node that comes after this fiber within the host parent\n let f: Fiber | null = fiber.sibling\n while (f) {\n const d = firstDomNode(f)\n if (d) return d\n f = f.sibling\n }\n // Ascend\n let p = fiber.parent\n while (p && p.tag !== FiberTag.Host && p.tag !== FiberTag.Root && p.tag !== FiberTag.Portal) {\n if (p.sibling) {\n const d = firstDomNode(p.sibling)\n if (d) return d\n }\n p = p.parent\n }\n return null\n}\n\nfunction firstDomNode(fiber: Fiber): Node | null {\n if (fiber.tag === FiberTag.Host || fiber.tag === FiberTag.Text) return fiber.dom\n let c = fiber.child\n while (c) {\n const d = firstDomNode(c)\n if (d) return d\n c = c.sibling\n }\n return null\n}\n\n// ---------------------------------------------------------------------------\n// Context read \u2014 exported for dispatcher.ts (useContext, use()). Delegates to\n// the installed capability so the Context feature can override with a walking\n// implementation that finds the nearest Provider fiber. When the feature is\n// stubbed, the default here returns ctx._currentValue \u2014 correct because no\n// Provider fibers exist in the tree (Provider element \u2192 Fragment via the\n// stub's type matcher).\n// ---------------------------------------------------------------------------\n\nexport function readContext(fiber: Fiber, ctx: any): any {\n return CAPABILITIES.readContext(fiber, ctx)\n}\n\nfunction defaultReadContext(_fiber: Fiber, ctx: any): any {\n return ctx._currentValue\n}\n\n// ---------------------------------------------------------------------------\n// Refs\n// ---------------------------------------------------------------------------\n\nfunction attachRef(fiber: Fiber, value: any): void {\n const ref = fiber.ref ?? (fiber.pp?.ref ?? null)\n if (!ref) return\n if (typeof ref == 'function') {\n // Match React's commit-phase semantics: callback refs run after render\n // (during the layout/commit phase), not during render. Calling them\n // synchronously here breaks libraries that assert no event handlers run\n // during render (e.g. base-ui's useStableCallback trampoline).\n scheduleLifecycle(fiber, () => {\n const cleanup = ref(value)\n fiber.cu ||= []\n fiber.cu.push(typeof cleanup == 'function' ? cleanup : () => ref(null))\n })\n } else {\n ref.current = value\n }\n}\n\nfunction syncRefIfChanged(fiber: Fiber, value: any): void {\n const ref = fiber.ref ?? (fiber.pp?.ref ?? null)\n if (!ref) return\n if (typeof ref === 'object' && ref.current !== value) ref.current = value\n}\n\nfunction detachRef(ref: any): void {\n // Function refs are handled via fiber.cu (queued in attachRef during\n // the commit phase): the cleanup either invokes the user-returned cleanup\n // fn or calls ref(null). Calling ref(null) here would double-fire it.\n if (ref && typeof ref === 'object') {\n ref.current = null\n }\n}\n\n// ---------------------------------------------------------------------------\n// Effects\n// ---------------------------------------------------------------------------\n\nconst pendingEffects: Array<[Fiber, Effect]> = []\nconst pendingLayoutEffects: Array<[Fiber, Effect]> = []\nconst pendingLifecycles: Array<() => void> = []\n\nexport function enqueueEffect(fiber: Fiber, effect: Effect): void {\n if (effect.t) {\n pendingLayoutEffects.push([fiber, effect])\n } else {\n pendingEffects.push([fiber, effect])\n }\n}\n\nexport function scheduleLifecycle(fiber: Fiber, fn: () => void): void {\n pendingLifecycles.push(() => { if (!fiber.um) fn() })\n}\n\nexport function runEffects(root: FiberRoot): void {\n // Layout fx synchronously\n while (pendingLayoutEffects.length) {\n const [fiber, effect] = pendingLayoutEffects.shift()!\n runEffect(fiber, effect, root)\n }\n // Then lifecycles\n while (pendingLifecycles.length) {\n const fn = pendingLifecycles.shift()!\n try {\n fn()\n } catch (e) {\n if (root.ce) root.ce(e)\n }\n }\n // Passive fx on microtask\n if (pendingEffects.length) {\n const batch = pendingEffects.splice(0)\n queueMicrotask(() => {\n for (const [fiber, effect] of batch) runEffect(fiber, effect, root)\n })\n }\n}\n\nfunction runEffect(fiber: Fiber, effect: Effect, root: FiberRoot): void {\n if (fiber.um) return\n try {\n const cleanup = effect.c()\n if (typeof cleanup == 'function') {\n fiber.cu ||= []\n fiber.cu.push(cleanup)\n }\n } catch (e) {\n if (root.ce) root.ce(e)\n }\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction isEventProp(name: string): boolean {\n return (\n name.length > 2 &&\n name.charCodeAt(0) === 111 /* o */ &&\n name.charCodeAt(1) === 110 /* n */ &&\n name.charCodeAt(2) >= 65 /* 'A'-ish: any uppercase start (onClick, onChange, \u2026) */\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["f"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -92,8 +92,15 @@ function renderClass(fiber: Fiber, domParent: Node, anchor: Node | null): void {
|
|
|
92
92
|
|
|
93
93
|
// Schedule lifecycle
|
|
94
94
|
if (isNew) {
|
|
95
|
-
if (instance.componentDidMount) {
|
|
96
|
-
scheduleLifecycle(fiber, () =>
|
|
95
|
+
if (instance.componentDidMount || instance.componentWillUnmount) {
|
|
96
|
+
scheduleLifecycle(fiber, () => {
|
|
97
|
+
// An abandoned render never mounted, so it has no unmount lifecycle.
|
|
98
|
+
if (instance.componentWillUnmount) {
|
|
99
|
+
fiber.cu ||= []
|
|
100
|
+
fiber.cu.push(() => instance.componentWillUnmount())
|
|
101
|
+
}
|
|
102
|
+
instance.componentDidMount?.()
|
|
103
|
+
})
|
|
97
104
|
}
|
|
98
105
|
} else if (instance.componentDidUpdate) {
|
|
99
106
|
const { p, s } = fiber.ms ?? {}
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
import { attributeName, STRING_BOOLEAN_ATTRS } from '../../../core/attributes'
|
|
10
10
|
import { createHostNode, setProp } from '../../dom'
|
|
11
11
|
import { drainReplayQueue } from '../../event-replay'
|
|
12
|
-
import { discardPendingWork, findRoot, flushSyncWork, renderRoot } from '../../reconcile'
|
|
12
|
+
import { discardPendingWork, findRoot, flushSyncWork, renderRoot, unmountFiber } from '../../reconcile'
|
|
13
13
|
import { attachRootFiber, createFiberRoot } from '../../root-internal'
|
|
14
14
|
|
|
15
15
|
// Re-export from event-replay so all hydration concerns live behind one
|
|
@@ -542,6 +542,9 @@ function resetAfterHydrationFailure(
|
|
|
542
542
|
root: FiberRoot,
|
|
543
543
|
container: Element | Document,
|
|
544
544
|
): void {
|
|
545
|
+
// Retire subscriptions and queued effects without removing the document shell
|
|
546
|
+
// or host ancestors retained by the recovery container.
|
|
547
|
+
unmountFiber(root.r, false)
|
|
545
548
|
discardPendingWork(root)
|
|
546
549
|
clearHydrationContainer(container)
|
|
547
550
|
attachRootFiber(root, container)
|
|
@@ -147,7 +147,7 @@ function renderSuspense(fiber: Fiber, domParent: Node, anchor: Node | null): voi
|
|
|
147
147
|
renderFiber(state.f, domParent, anchor)
|
|
148
148
|
} else {
|
|
149
149
|
// First-mount suspension — nothing to preserve.
|
|
150
|
-
unmountAllChildren(fiber
|
|
150
|
+
unmountAllChildren(fiber)
|
|
151
151
|
reconcileChildren(fiber, childrenToArray(props.fallback), domParent, anchor)
|
|
152
152
|
}
|
|
153
153
|
} else {
|
|
@@ -160,7 +160,7 @@ function renderSuspense(fiber: Fiber, domParent: Node, anchor: Node | null): voi
|
|
|
160
160
|
state.d = null
|
|
161
161
|
}
|
|
162
162
|
if (state.f) {
|
|
163
|
-
unmountFiber(state.f
|
|
163
|
+
unmountFiber(state.f)
|
|
164
164
|
state.f = null
|
|
165
165
|
}
|
|
166
166
|
}
|
|
@@ -210,7 +210,7 @@ function hydrateSuspenseBoundary(
|
|
|
210
210
|
} catch (e) {
|
|
211
211
|
if (!isHydrationBailout(e)) {
|
|
212
212
|
clearBoundaryRange(startMark, endMark)
|
|
213
|
-
unmountAllChildren(fiber
|
|
213
|
+
unmountAllChildren(fiber)
|
|
214
214
|
throw e
|
|
215
215
|
}
|
|
216
216
|
recoverBoundaryHydration(fiber, props.children, parent, startMark, endMark)
|
|
@@ -258,14 +258,14 @@ function recoverBoundaryHydration(
|
|
|
258
258
|
const prevHydrating = root.h
|
|
259
259
|
discardPendingWork(root)
|
|
260
260
|
clearBoundaryRange(startMark, endMark)
|
|
261
|
-
unmountAllChildren(fiber
|
|
261
|
+
unmountAllChildren(fiber)
|
|
262
262
|
root.h = false
|
|
263
263
|
try {
|
|
264
264
|
reconcileChildren(fiber, childrenToArray(children), parent, endMark)
|
|
265
265
|
advanceCursorPast(fiber.parent!, endMark)
|
|
266
266
|
} catch (clientError) {
|
|
267
267
|
clearBoundaryRange(startMark, endMark)
|
|
268
|
-
unmountAllChildren(fiber
|
|
268
|
+
unmountAllChildren(fiber)
|
|
269
269
|
throw clientError
|
|
270
270
|
} finally {
|
|
271
271
|
root.h = prevHydrating
|
|
@@ -277,13 +277,13 @@ function recoverFallbackHydration(fiber: Fiber, fallback: any, parent: HTMLEleme
|
|
|
277
277
|
const prevHydrating = root.h
|
|
278
278
|
discardPendingWork(root)
|
|
279
279
|
parent.textContent = ''
|
|
280
|
-
unmountAllChildren(fiber
|
|
280
|
+
unmountAllChildren(fiber)
|
|
281
281
|
root.h = false
|
|
282
282
|
try {
|
|
283
283
|
reconcileChildren(fiber, childrenToArray(fallback), parent, null)
|
|
284
284
|
} catch (clientError) {
|
|
285
285
|
parent.textContent = ''
|
|
286
|
-
unmountAllChildren(fiber
|
|
286
|
+
unmountAllChildren(fiber)
|
|
287
287
|
throw clientError
|
|
288
288
|
} finally {
|
|
289
289
|
root.h = prevHydrating
|
|
@@ -303,7 +303,7 @@ function rehydrateBoundary(fiber: Fiber): void {
|
|
|
303
303
|
withCurrentRoot(root, () => {
|
|
304
304
|
const prevHydrating = root.h
|
|
305
305
|
try {
|
|
306
|
-
unmountAllChildren(fiber
|
|
306
|
+
unmountAllChildren(fiber)
|
|
307
307
|
|
|
308
308
|
// Re-hydrate with real children against the now-real DOM range.
|
|
309
309
|
root.h = true
|
|
@@ -312,7 +312,7 @@ function rehydrateBoundary(fiber: Fiber): void {
|
|
|
312
312
|
} catch (e) {
|
|
313
313
|
if (!isHydrationBailout(e)) {
|
|
314
314
|
clearBoundaryRange(state.b, state.e)
|
|
315
|
-
unmountAllChildren(fiber
|
|
315
|
+
unmountAllChildren(fiber)
|
|
316
316
|
throw e
|
|
317
317
|
}
|
|
318
318
|
|
package/src/dom/reconcile.ts
CHANGED
|
@@ -531,14 +531,14 @@ export function reconcileChildren(
|
|
|
531
531
|
// Unmount unclaimed
|
|
532
532
|
for (const f of existing) {
|
|
533
533
|
if (!claimed.has(f)) {
|
|
534
|
-
unmountFiber(f
|
|
534
|
+
unmountFiber(f)
|
|
535
535
|
structurallyChanged = true
|
|
536
536
|
}
|
|
537
537
|
}
|
|
538
538
|
// Leftover keyed
|
|
539
539
|
for (const f of keyed.values()) {
|
|
540
540
|
if (!claimed.has(f)) {
|
|
541
|
-
unmountFiber(f
|
|
541
|
+
unmountFiber(f)
|
|
542
542
|
structurallyChanged = true
|
|
543
543
|
}
|
|
544
544
|
}
|
|
@@ -1017,13 +1017,13 @@ export function isThenable(x: any): x is Promise<any> {
|
|
|
1017
1017
|
// Unmount
|
|
1018
1018
|
// ---------------------------------------------------------------------------
|
|
1019
1019
|
|
|
1020
|
-
export function unmountFiber(fiber: Fiber,
|
|
1020
|
+
export function unmountFiber(fiber: Fiber, removeDom = true): void {
|
|
1021
1021
|
fiber.um = true
|
|
1022
1022
|
// Recurse first
|
|
1023
1023
|
let c = fiber.child
|
|
1024
1024
|
while (c) {
|
|
1025
1025
|
const next = c.sibling
|
|
1026
|
-
unmountFiber(c, fiber.tag === FiberTag.
|
|
1026
|
+
unmountFiber(c, removeDom || fiber.tag === FiberTag.Portal)
|
|
1027
1027
|
c = next
|
|
1028
1028
|
}
|
|
1029
1029
|
fiber.child = null
|
|
@@ -1040,12 +1040,7 @@ export function unmountFiber(fiber: Fiber, domParent: Node): void {
|
|
|
1040
1040
|
fiber.cu = null
|
|
1041
1041
|
}
|
|
1042
1042
|
|
|
1043
|
-
if (fiber.tag === FiberTag.Class && fiber.sn
|
|
1044
|
-
try {
|
|
1045
|
-
fiber.sn.componentWillUnmount()
|
|
1046
|
-
} catch (e) {
|
|
1047
|
-
if (currentRoot?.re) currentRoot.re(e)
|
|
1048
|
-
}
|
|
1043
|
+
if (fiber.tag === FiberTag.Class && fiber.sn) {
|
|
1049
1044
|
fiber.sn._fiber = null
|
|
1050
1045
|
fiber.sn._enqueueUpdate = null
|
|
1051
1046
|
fiber.sn._forceUpdate = null
|
|
@@ -1054,19 +1049,17 @@ export function unmountFiber(fiber: Fiber, domParent: Node): void {
|
|
|
1054
1049
|
// Detach ref
|
|
1055
1050
|
if (fiber.ref) detachRef(fiber.ref)
|
|
1056
1051
|
|
|
1057
|
-
//
|
|
1058
|
-
if (
|
|
1059
|
-
fiber.dom
|
|
1060
|
-
} else if (fiber.tag === FiberTag.Text && fiber.dom && fiber.dom.parentNode) {
|
|
1061
|
-
fiber.dom.parentNode.removeChild(fiber.dom)
|
|
1052
|
+
// Only host and text fibers own DOM nodes.
|
|
1053
|
+
if (removeDom) {
|
|
1054
|
+
fiber.dom?.parentNode?.removeChild(fiber.dom)
|
|
1062
1055
|
}
|
|
1063
1056
|
}
|
|
1064
1057
|
|
|
1065
|
-
export function unmountAllChildren(parent: Fiber
|
|
1058
|
+
export function unmountAllChildren(parent: Fiber): void {
|
|
1066
1059
|
let c = parent.child
|
|
1067
1060
|
while (c) {
|
|
1068
1061
|
const next = c.sibling
|
|
1069
|
-
unmountFiber(c
|
|
1062
|
+
unmountFiber(c)
|
|
1070
1063
|
c = next
|
|
1071
1064
|
}
|
|
1072
1065
|
parent.child = null
|
|
@@ -1228,8 +1221,8 @@ export function enqueueEffect(fiber: Fiber, effect: Effect): void {
|
|
|
1228
1221
|
}
|
|
1229
1222
|
}
|
|
1230
1223
|
|
|
1231
|
-
export function scheduleLifecycle(
|
|
1232
|
-
pendingLifecycles.push(fn)
|
|
1224
|
+
export function scheduleLifecycle(fiber: Fiber, fn: () => void): void {
|
|
1225
|
+
pendingLifecycles.push(() => { if (!fiber.um) fn() })
|
|
1233
1226
|
}
|
|
1234
1227
|
|
|
1235
1228
|
export function runEffects(root: FiberRoot): void {
|
|
@@ -1257,6 +1250,7 @@ export function runEffects(root: FiberRoot): void {
|
|
|
1257
1250
|
}
|
|
1258
1251
|
|
|
1259
1252
|
function runEffect(fiber: Fiber, effect: Effect, root: FiberRoot): void {
|
|
1253
|
+
if (fiber.um) return
|
|
1260
1254
|
try {
|
|
1261
1255
|
const cleanup = effect.c()
|
|
1262
1256
|
if (typeof cleanup == 'function') {
|