@tanstack/redact 0.0.14 → 0.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/dist/core/internal.d.ts +23 -39
  2. package/dist/core/internal.js +7 -23
  3. package/dist/core/internal.js.map +3 -3
  4. package/dist/dom/dispatcher.d.ts +3 -1
  5. package/dist/dom/dispatcher.js +104 -97
  6. package/dist/dom/dispatcher.js.map +2 -2
  7. package/dist/dom/dom.js +1 -1
  8. package/dist/dom/dom.js.map +2 -2
  9. package/dist/dom/event-replay.js +7 -29
  10. package/dist/dom/event-replay.js.map +2 -2
  11. package/dist/dom/features/class/full.js +16 -16
  12. package/dist/dom/features/class/full.js.map +2 -2
  13. package/dist/dom/features/class/stub.js +7 -7
  14. package/dist/dom/features/class/stub.js.map +2 -2
  15. package/dist/dom/features/context/full.js +7 -7
  16. package/dist/dom/features/context/full.js.map +2 -2
  17. package/dist/dom/features/context/stub.js +3 -3
  18. package/dist/dom/features/context/stub.js.map +2 -2
  19. package/dist/dom/features/forward-ref/full.js +11 -11
  20. package/dist/dom/features/forward-ref/full.js.map +2 -2
  21. package/dist/dom/features/hydration/full.d.ts +26 -14
  22. package/dist/dom/features/hydration/full.js +412 -92
  23. package/dist/dom/features/hydration/full.js.map +2 -2
  24. package/dist/dom/features/hydration/stub.d.ts +13 -12
  25. package/dist/dom/features/hydration/stub.js +23 -8
  26. package/dist/dom/features/hydration/stub.js.map +2 -2
  27. package/dist/dom/features/lazy/full.js +3 -43
  28. package/dist/dom/features/lazy/full.js.map +2 -2
  29. package/dist/dom/features/lazy/stub.js +1 -1
  30. package/dist/dom/features/lazy/stub.js.map +2 -2
  31. package/dist/dom/features/memo/full.js +3 -3
  32. package/dist/dom/features/memo/full.js.map +2 -2
  33. package/dist/dom/features/memo/stub.js +1 -1
  34. package/dist/dom/features/memo/stub.js.map +2 -2
  35. package/dist/dom/features/portal/full.js +2 -2
  36. package/dist/dom/features/portal/full.js.map +2 -2
  37. package/dist/dom/features/suspense/full.js +151 -109
  38. package/dist/dom/features/suspense/full.js.map +2 -2
  39. package/dist/dom/reconcile.d.ts +3 -1
  40. package/dist/dom/reconcile.js +141 -129
  41. package/dist/dom/reconcile.js.map +2 -2
  42. package/dist/dom/root-internal.d.ts +9 -0
  43. package/dist/dom/root-internal.js +31 -0
  44. package/dist/dom/root-internal.js.map +7 -0
  45. package/dist/dom/root.d.ts +1 -1
  46. package/dist/dom/root.js +4 -136
  47. package/dist/dom/root.js.map +2 -2
  48. package/dist/dom/test-utils.js +1 -1
  49. package/dist/dom/test-utils.js.map +2 -2
  50. package/dist/react/children.js +4 -1
  51. package/dist/react/children.js.map +2 -2
  52. package/dist/react/class.js +8 -2
  53. package/dist/react/class.js.map +2 -2
  54. package/dist/react/context.js +4 -1
  55. package/dist/react/context.js.map +2 -2
  56. package/dist/react/index.js +1 -1
  57. package/dist/react/index.js.map +2 -2
  58. package/dist/react/shared-internals.d.ts +4 -7
  59. package/dist/react/shared-internals.js +4 -7
  60. package/dist/react/shared-internals.js.map +2 -2
  61. package/dist/server/stream.d.ts +5 -1
  62. package/dist/server/stream.js.map +2 -2
  63. package/package.json +1 -1
  64. package/src/core/internal.ts +30 -50
  65. package/src/dom/dispatcher.ts +114 -105
  66. package/src/dom/dom.ts +1 -1
  67. package/src/dom/event-replay.ts +14 -30
  68. package/src/dom/features/class/full.ts +16 -16
  69. package/src/dom/features/class/stub.ts +7 -7
  70. package/src/dom/features/context/full.ts +7 -7
  71. package/src/dom/features/context/stub.ts +3 -3
  72. package/src/dom/features/forward-ref/full.ts +11 -11
  73. package/src/dom/features/hydration/full.ts +516 -104
  74. package/src/dom/features/hydration/stub.ts +28 -14
  75. package/src/dom/features/lazy/full.ts +3 -56
  76. package/src/dom/features/lazy/stub.ts +1 -1
  77. package/src/dom/features/memo/full.ts +3 -3
  78. package/src/dom/features/memo/stub.ts +1 -1
  79. package/src/dom/features/portal/full.ts +2 -2
  80. package/src/dom/features/suspense/full.ts +176 -129
  81. package/src/dom/reconcile.ts +164 -170
  82. package/src/dom/root-internal.ts +40 -0
  83. package/src/dom/root.ts +5 -165
  84. package/src/dom/test-utils.ts +1 -1
  85. package/src/react/children.ts +4 -1
  86. package/src/react/class.ts +8 -2
  87. package/src/react/context.ts +4 -1
  88. package/src/react/index.ts +1 -1
  89. package/src/react/shared-internals.ts +8 -14
  90. package/src/server/stream.ts +9 -4
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/dom/features/hydration/full.ts"],
4
- "sourcesContent": ["import { FiberTag, type Fiber, type FiberRoot } from '../../../core'\nimport { setProp } from '../../dom'\nimport { findRoot } from '../../reconcile'\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 } from '../../event-replay'\n\nconst GUARD_WINDOW_MS = 3000\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.__redactScrollGuardInstalled) return\n w.__redactScrollGuardInstalled = true\n const guardStartedAt = performance.now()\n let lastUserScrollAt = 0\n let programmatic = 0\n w.__redactScrollLog = []\n window.addEventListener(\n 'scroll',\n () => {\n if (programmatic === 0) {\n lastUserScrollAt = performance.now()\n w.__redactScrollLog.push({ t: Math.round(lastUserScrollAt), ev: 'user-scroll', y: window.scrollY })\n }\n },\n { capture: true, passive: true },\n )\n const origScrollTo = window.scrollTo.bind(window)\n window.scrollTo = function (this: any, ...args: any[]) {\n const now = performance.now()\n const inGuardWindow = now - guardStartedAt < GUARD_WINDOW_MS\n const userScrolledRecently = lastUserScrollAt > 0 && now - lastUserScrollAt < 1500\n if (inGuardWindow && userScrolledRecently) {\n w.__redactScrollLog.push({\n t: Math.round(now),\n ev: 'suppressed',\n args: JSON.stringify(args).slice(0, 80),\n tSinceHydrate: Math.round(now - guardStartedAt),\n tSinceUserScroll: Math.round(now - lastUserScrollAt),\n })\n return\n }\n w.__redactScrollLog.push({\n t: Math.round(now),\n ev: 'allowed',\n args: JSON.stringify(args).slice(0, 80),\n tSinceHydrate: Math.round(now - guardStartedAt),\n inGuard: inGuardWindow,\n userScrolled: userScrolledRecently,\n })\n programmatic++\n try {\n return (origScrollTo as any).apply(this, args)\n } finally {\n queueMicrotask(() => {\n programmatic = Math.max(0, programmatic - 1)\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 next: ChildNode | null\n parent: Node\n endBefore: ChildNode | null\n constructor(parent: Node, start: ChildNode | null = null, endBefore: ChildNode | null = null) {\n this.parent = parent\n this.next = start ?? parent.firstChild\n this.endBefore = endBefore\n }\n takeHostNode(): ChildNode | null {\n while (this.next && this.next !== this.endBefore) {\n const n = this.next\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.next = n.nextSibling\n continue\n }\n this.next = 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 takeMatchingHeadElement(tag: string, props: Record<string, any>): ChildNode | null {\n const target = tag.toLowerCase()\n const keyAttrs = HEAD_KEY_ATTRS[target] ?? []\n let scan = this.parent.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 remaining(): ChildNode[] {\n const out: ChildNode[] = []\n let n = this.next\n while (n && n !== this.endBefore) {\n out.push(n)\n n = n.nextSibling\n }\n return out\n }\n}\n\nconst hydrationCursors = new WeakMap<Fiber, HydrationCursor>()\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', 'http-equiv'],\n script: ['src', 'type'],\n style: [],\n 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>,\n): boolean {\n if (CLAIMED.has(el)) return false\n if (keys.length === 0) return true\n for (const k of keys) {\n const propVal = props[k] ?? (k === 'http-equiv' ? props.httpEquiv : undefined)\n const elVal = el.getAttribute(k)\n // If neither defines it, skip this key; if one defines it, they must match.\n if (propVal == null && elVal == null) continue\n if (propVal == null || elVal == null) continue // tolerate missing on either side\n if (String(propVal) !== elVal) return false\n }\n // At least one matching signal must be present.\n return keys.some((k) => props[k] != null || el.hasAttribute(k))\n}\n\nexport function beginHydration(root: FiberRoot): void {\n root.hydrating = true\n hydrationCursors.set(root.current, new HydrationCursor(root.container))\n}\n\nexport function endHydration(root: FiberRoot): void {\n root.hydrating = false\n hydrationCursors.delete(root.current)\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 interface BoundaryInfo {\n kind: 'pending' | 'resolved'\n id: number\n startMark: Comment\n endMark: Comment\n}\n\nexport function tryConsumeBoundary(parent: Fiber): BoundaryInfo | null {\n const cursor = hydrationCursors.get(findHostParent(parent))\n if (!cursor) return null\n const peek = cursor.next\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] === '$?' ? 'pending' : 'resolved'\n const id = Number(m[2])\n const startMark = peek as Comment\n // Advance past the start comment\n cursor.next = 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.next = 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 = getDocumentHeadParent(cursor.parent, tag)\n const parentEl = cursor.parent 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).takeMatchingHeadElement(\n tag,\n fiber.pendingProps ?? {},\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.takeMatchingHeadElement(tag, fiber.pendingProps ?? {})\n } else {\n candidate = cursor.takeHostNode()\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.pendingProps ?? {}\n const isSvg =\n tag === 'svg' ||\n ((candidate as Element).namespaceURI === 'http://www.w3.org/2000/svg' &&\n tag !== 'foreignobject')\n for (const k in props) {\n if (k === 'children') continue\n if (k[0] === 'o' && k[1] === 'n' && typeof props[k] === 'function') {\n setProp(candidate as Element, k, props[k], undefined, isSvg)\n }\n // Non-event props: trust the server HTML, skip\n }\n // Set up child cursor for this host's children\n hydrationCursors.set(fiber, new HydrationCursor(candidate))\n return true\n}\n\nfunction getDocumentHeadParent(parent: Node, tag: string): HTMLHeadElement | null {\n if (parent.nodeType !== 9 || !DOCUMENT_HEAD_TAGS.has(tag)) return null\n return (parent as Document).head\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.takeHostNode()\n if (!candidate) return false\n if (candidate.nodeType === 3) {\n if ((candidate as Text).data !== text) {\n ;(candidate as Text).data = text\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 throw new Error('No host parent found')\n}\n\nfunction onMismatch(fiber: Fiber, actualNode: ChildNode | null): void {\n // For v1: log and exit hydration for this subtree. The normal reconciler\n // will create a fresh DOM node below.\n const root = findRoot(fiber)\n if (root?.onRecoverableError) {\n root.onRecoverableError(\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 )\n }\n // Remove stale DOM if still there\n if (actualNode && actualNode.parentNode) actualNode.parentNode.removeChild(actualNode)\n}\n"],
5
- "mappings": ";AAAA,SAAS,gBAA4C;AACrD,SAAS,eAAe;AACxB,SAAS,gBAAgB;AAIzB,SAAS,wBAAwB;AAEjC,IAAM,kBAAkB;AAYjB,SAAS,8BAAoC;AAClD,MAAI,OAAO,WAAW,YAAa;AACnC,QAAM,IAAI;AACV,MAAI,EAAE,6BAA8B;AACpC,IAAE,+BAA+B;AACjC,QAAM,iBAAiB,YAAY,IAAI;AACvC,MAAI,mBAAmB;AACvB,MAAI,eAAe;AACnB,IAAE,oBAAoB,CAAC;AACvB,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AACJ,UAAI,iBAAiB,GAAG;AACtB,2BAAmB,YAAY,IAAI;AACnC,UAAE,kBAAkB,KAAK,EAAE,GAAG,KAAK,MAAM,gBAAgB,GAAG,IAAI,eAAe,GAAG,OAAO,QAAQ,CAAC;AAAA,MACpG;AAAA,IACF;AAAA,IACA,EAAE,SAAS,MAAM,SAAS,KAAK;AAAA,EACjC;AACA,QAAM,eAAe,OAAO,SAAS,KAAK,MAAM;AAChD,SAAO,WAAW,YAAwB,MAAa;AACrD,UAAM,MAAM,YAAY,IAAI;AAC5B,UAAM,gBAAgB,MAAM,iBAAiB;AAC7C,UAAM,uBAAuB,mBAAmB,KAAK,MAAM,mBAAmB;AAC9E,QAAI,iBAAiB,sBAAsB;AACzC,QAAE,kBAAkB,KAAK;AAAA,QACvB,GAAG,KAAK,MAAM,GAAG;AAAA,QACjB,IAAI;AAAA,QACJ,MAAM,KAAK,UAAU,IAAI,EAAE,MAAM,GAAG,EAAE;AAAA,QACtC,eAAe,KAAK,MAAM,MAAM,cAAc;AAAA,QAC9C,kBAAkB,KAAK,MAAM,MAAM,gBAAgB;AAAA,MACrD,CAAC;AACD;AAAA,IACF;AACA,MAAE,kBAAkB,KAAK;AAAA,MACvB,GAAG,KAAK,MAAM,GAAG;AAAA,MACjB,IAAI;AAAA,MACJ,MAAM,KAAK,UAAU,IAAI,EAAE,MAAM,GAAG,EAAE;AAAA,MACtC,eAAe,KAAK,MAAM,MAAM,cAAc;AAAA,MAC9C,SAAS;AAAA,MACT,cAAc;AAAA,IAChB,CAAC;AACD;AACA,QAAI;AACF,aAAQ,aAAqB,MAAM,MAAM,IAAI;AAAA,IAC/C,UAAE;AACA,qBAAe,MAAM;AACnB,uBAAe,KAAK,IAAI,GAAG,eAAe,CAAC;AAAA,MAC7C,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,SAAS;AACd,SAAK,OAAO,SAAS,OAAO;AAC5B,SAAK,YAAY;AAAA,EACnB;AAAA,EACA,eAAiC;AAC/B,WAAO,KAAK,QAAQ,KAAK,SAAS,KAAK,WAAW;AAChD,YAAM,IAAI,KAAK;AAGf,UAAI,EAAE,aAAa,KAAK,EAAE,aAAa,GAAG;AACxC,aAAK,OAAO,EAAE;AACd;AAAA,MACF;AACA,WAAK,OAAO,EAAE;AACd,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,wBAAwB,KAAa,OAA8C;AACjF,UAAM,SAAS,IAAI,YAAY;AAC/B,UAAM,WAAW,eAAe,MAAM,KAAK,CAAC;AAC5C,QAAI,OAAO,KAAK,OAAO;AACvB,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,YAAyB;AACvB,UAAM,MAAmB,CAAC;AAC1B,QAAI,IAAI,KAAK;AACb,WAAO,KAAK,MAAM,KAAK,WAAW;AAChC,UAAI,KAAK,CAAC;AACV,UAAI,EAAE;AAAA,IACR;AACA,WAAO;AAAA,EACT;AACF;AAEA,IAAM,mBAAmB,oBAAI,QAAgC;AAG7D,IAAM,iBAAwD;AAAA,EAC5D,MAAM,CAAC,OAAO,QAAQ,SAAS,MAAM;AAAA,EACrC,MAAM,CAAC,QAAQ,YAAY,WAAW,YAAY;AAAA,EAClD,QAAQ,CAAC,OAAO,MAAM;AAAA,EACtB,OAAO,CAAC;AAAA,EACR,OAAO,CAAC;AACV;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,KAAK,WAAW,EAAG,QAAO;AAC9B,aAAW,KAAK,MAAM;AACpB,UAAM,UAAU,MAAM,CAAC,MAAM,MAAM,eAAe,MAAM,YAAY;AACpE,UAAM,QAAQ,GAAG,aAAa,CAAC;AAE/B,QAAI,WAAW,QAAQ,SAAS,KAAM;AACtC,QAAI,WAAW,QAAQ,SAAS,KAAM;AACtC,QAAI,OAAO,OAAO,MAAM,MAAO,QAAO;AAAA,EACxC;AAEA,SAAO,KAAK,KAAK,CAAC,MAAM,MAAM,CAAC,KAAK,QAAQ,GAAG,aAAa,CAAC,CAAC;AAChE;AAEO,SAAS,eAAe,MAAuB;AACpD,OAAK,YAAY;AACjB,mBAAiB,IAAI,KAAK,SAAS,IAAI,gBAAgB,KAAK,SAAS,CAAC;AACxE;AAEO,SAAS,aAAa,MAAuB;AAClD,OAAK,YAAY;AACjB,mBAAiB,OAAO,KAAK,OAAO;AACtC;AAcO,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,YAAY;AACzC,QAAM,KAAK,OAAO,EAAE,CAAC,CAAC;AACtB,QAAM,YAAY;AAElB,SAAO,OAAO,UAAU;AAExB,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,EAAE,MAAM,IAAI,WAAW,QAAQ;AACxC;AAEO,SAAS,kBAAkB,QAAe,MAAkB;AACjE,QAAM,SAAS,iBAAiB,IAAI,eAAe,MAAM,CAAC;AAC1D,MAAI,CAAC,OAAQ;AACb,SAAO,OAAO,KAAK;AACrB;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,qBAAqB,sBAAsB,OAAO,QAAQ,GAAG;AACnE,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,gBAAgB,CAAC;AAAA,IACzB;AAAA,EACF,WAAW,WAAW;AAKpB,gBAAY,OAAO,wBAAwB,KAAK,MAAM,gBAAgB,CAAC,CAAC;AAAA,EAC1E,OAAO;AACL,gBAAY,OAAO,aAAa;AAAA,EAClC;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,gBAAgB,CAAC;AACrC,QAAM,QACJ,QAAQ,SACN,UAAsB,iBAAiB,gCACvC,QAAQ;AACZ,aAAW,KAAK,OAAO;AACrB,QAAI,MAAM,WAAY;AACtB,QAAI,EAAE,CAAC,MAAM,OAAO,EAAE,CAAC,MAAM,OAAO,OAAO,MAAM,CAAC,MAAM,YAAY;AAClE,cAAQ,WAAsB,GAAG,MAAM,CAAC,GAAG,QAAW,KAAK;AAAA,IAC7D;AAAA,EAEF;AAEA,mBAAiB,IAAI,OAAO,IAAI,gBAAgB,SAAS,CAAC;AAC1D,SAAO;AACT;AAEA,SAAS,sBAAsB,QAAc,KAAqC;AAChF,MAAI,OAAO,aAAa,KAAK,CAAC,mBAAmB,IAAI,GAAG,EAAG,QAAO;AAClE,SAAQ,OAAoB;AAC9B;AAEO,SAAS,aAAa,OAAc,QAAe,MAAuB;AAC/E,QAAM,SAAS,iBAAiB,IAAI,eAAe,MAAM,CAAC;AAC1D,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,YAAY,OAAO,aAAa;AACtC,MAAI,CAAC,UAAW,QAAO;AACvB,MAAI,UAAU,aAAa,GAAG;AAC5B,QAAK,UAAmB,SAAS,MAAM;AACrC;AAAC,MAAC,UAAmB,OAAO;AAAA,IAC9B;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,QAAM,IAAI,MAAM,sBAAsB;AACxC;AAEA,SAAS,WAAW,OAAc,YAAoC;AAGpE,QAAM,OAAO,SAAS,KAAK;AAC3B,MAAI,MAAM,oBAAoB;AAC5B,SAAK;AAAA,MACH,IAAI;AAAA,QACF,iCAAkC,MAAM,QAAmB,MAAM,eAC/D,aAAc,WAAW,aAAa,IAAK,WAAuB,UAAU,SAAU,SACxF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,cAAc,WAAW,WAAY,YAAW,WAAW,YAAY,UAAU;AACvF;",
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 { 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 documentBodyFallback = false\n\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) {\n if (!isHydrationBailout(hydrationError)) {\n throw hydrationError\n }\n let recoveryContainer: Element | Document = target\n let recoveryChildren = normalizedInitialChildren\n const hostRecovery = getRecoverableHostChildren(hydrationError)\n if (hostRecovery) {\n recoveryContainer = hostRecovery[0]\n recoveryChildren = hostRecovery[1]\n } else if (body) {\n const bodyChildren = getRecoverableDocumentBodyChildren(hydrationError)\n if (bodyChildren != null) {\n documentBodyFallback = true\n recoveryContainer = body\n recoveryChildren = bodyChildren\n }\n }\n resetAfterHydrationFailure(root, recoveryContainer)\n try {\n flushSyncWork(() => {\n renderRoot(root, recoveryChildren)\n })\n } catch (clientError) {\n resetAfterHydrationFailure(root, recoveryContainer)\n throw clientError\n }\n }\n drainReplayQueue()\n\n return {\n render(children) {\n flushSyncWork(() => {\n const normalized = isDocument ? normalizeDocumentChildren(children) : children\n renderRoot(\n root,\n documentBodyFallback ? 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', 'http-equiv'],\n script: ['src', 'type'],\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 let matched = false\n for (const k of keys) {\n const propVal = props[k] ?? (k === 'http-equiv' ? props.httpEquiv : undefined)\n const elVal = el.getAttribute(k)\n // If neither defines it, skip this key; if one defines it, they must match.\n if (propVal == null && elVal == null) continue\n matched = true\n if (propVal == null || elVal == null) continue // tolerate missing on either side\n if (String(propVal) !== elVal) return false\n }\n // At least one matching signal must be present.\n return matched\n}\n\nexport function beginHydration(root: FiberRoot): void {\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 validateHydrationProps(fiber, candidate as Element, props, tag, isSvg)\n for (const k in props) {\n if (k === 'children') continue\n if (k[0] === 'o' && k[1] === 'n' && typeof props[k] == 'function') {\n setProp(candidate as Element, k, props[k], undefined, isSvg)\n }\n // Non-event props: trust the server HTML, skip\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) onMismatch(fiber, null)\n if (candidate.nodeType === 3) {\n if ((candidate as Text).data !== text) {\n if (process.env.NODE_ENV !== 'production') {\n failHydration(\n fiber,\n new Error(`Hydration text mismatch: expected \"${text}\" but found \"${(candidate as Text).data}\".`),\n )\n }\n failHydration(fiber)\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): never {\n if (process.env.NODE_ENV !== 'production') {\n failHydration(\n fiber,\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 )\n }\n failHydration(fiber)\n}\n\nfunction failHydration(fiber: Fiber, error: Error = new Error(PROD_HYDRATION_ERROR)): never {\n const root = findRoot(fiber)\n if (root?.re) {\n root.re(error)\n }\n abortHydration(error, findHostRecoveryParent(fiber) ?? fiber)\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 f = fiber\n while (f) {\n if (f.tag === FiberTag.Host && f.dom) {\n return isSafeHostRecoveryElement(f) ? f : null\n }\n f = f.parent\n }\n return null\n}\n\nfunction isSafeHostRecoveryElement(fiber: Fiber): boolean {\n const tag = fiber.type.toLowerCase()\n return tag !== 'html' && tag !== 'head' && tag !== 'body'\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 ||\n host.tag !== FiberTag.Host ||\n !host.dom ||\n !isSafeHostRecoveryElement(host) ||\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 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 const probe = document.createElement('div')\n probe.innerHTML = value?.__html ?? ''\n if ((el as HTMLElement).innerHTML !== probe.innerHTML) {\n if (process.env.NODE_ENV !== 'production') {\n failHydration(\n fiber,\n new Error(`Hydration HTML mismatch inside <${tag}>.`),\n )\n }\n failHydration(fiber)\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 if (process.env.NODE_ENV !== 'production') {\n failHydration(fiber, new Error(`Hydration ${tag} value mismatch on <${tag}>.`))\n }\n failHydration(fiber)\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 if (process.env.NODE_ENV !== 'production') {\n failHydration(fiber, new Error(`Hydration checked mismatch on <input>.`))\n }\n failHydration(fiber)\n }\n }\n continue\n }\n\n if (tag === 'option' && k === 'selected') {\n if (value != null && (el as HTMLOptionElement).selected !== !!value) {\n if (process.env.NODE_ENV !== 'production') {\n failHydration(fiber, new Error(`Hydration selected mismatch on <option>.`))\n }\n failHydration(fiber)\n }\n continue\n }\n\n if (k === 'style') {\n expected ??= createHostNode(tag, isSvg)\n setProp(expected, k, value, undefined, isSvg)\n if ((el as HTMLElement).style.cssText !== (expected as HTMLElement).style.cssText) {\n if (process.env.NODE_ENV !== 'production') {\n failHydration(\n fiber,\n new Error(`Hydration style mismatch on <${tag}>.`),\n )\n }\n failHydration(fiber)\n }\n continue\n }\n\n const stringifiedBoolean = k.startsWith('aria-') || k.startsWith('data-')\n const attr = k === 'className' ? 'class' : k === 'htmlFor' ? 'for' : stringifiedBoolean ? k : k.toLowerCase()\n\n let expectedValue: string | null\n if (value == null || (value === false && !stringifiedBoolean)) {\n expectedValue = 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 if (process.env.NODE_ENV !== 'production') {\n failHydration(\n fiber,\n new Error(\n `Hydration attribute mismatch on <${tag}> for \"${attr}\": ` +\n `expected ${formatHydrationValue(expectedValue)} but found ${formatHydrationValue(actualValue)}.`,\n ),\n )\n }\n failHydration(fiber)\n }\n }\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
  }
@@ -1,19 +1,14 @@
1
1
  import type { Fiber, FiberRoot } from '../../../core';
2
2
  export declare class HydrationCursor {
3
- next: ChildNode | null;
4
- parent: Node;
5
- endBefore: ChildNode | null;
3
+ n: ChildNode | null;
4
+ p: Node;
5
+ e: ChildNode | null;
6
6
  constructor(parent?: Node, _s?: ChildNode | null, _e?: ChildNode | null);
7
- takeHostNode(): ChildNode | null;
8
- takeMatchingHeadElement(): ChildNode | null;
9
- remaining(): ChildNode[];
10
- }
11
- export interface BoundaryInfo {
12
- kind: 'pending' | 'resolved';
13
- id: number;
14
- startMark: Comment;
15
- endMark: Comment;
7
+ take(): ChildNode | null;
8
+ head(): ChildNode | null;
9
+ has(): boolean;
16
10
  }
11
+ export type BoundaryInfo = [0 | 1, number, Comment, Comment];
17
12
  export declare function beginHydration(_root: FiberRoot): void;
18
13
  export declare function endHydration(_root: FiberRoot): void;
19
14
  export declare function tryConsumeBoundary(_parent: Fiber): BoundaryInfo | null;
@@ -26,3 +21,9 @@ export declare function adoptTextDom(_fiber: Fiber, _parent: Fiber, _text: strin
26
21
  export declare function findHostParent(fiber: Fiber): Fiber;
27
22
  export declare function installHydrationScrollGuard(): void;
28
23
  export declare function drainReplayQueue(): void;
24
+ export interface HydrationBailoutError extends Error {
25
+ f: Fiber | null;
26
+ }
27
+ export declare function isHydrationBailout(_error: unknown): _error is HydrationBailoutError;
28
+ export declare function abortHydration(cause: unknown, fiber?: Fiber | null): never;
29
+ export declare function hydrateRootImpl(): never;
@@ -1,19 +1,19 @@
1
1
  // packages/redact/src/dom/features/hydration/stub.ts
2
2
  var HydrationCursor = class {
3
- next = null;
4
- parent;
5
- endBefore = null;
3
+ n = null;
4
+ p;
5
+ e = null;
6
6
  constructor(parent, _s, _e) {
7
- this.parent = parent;
7
+ this.p = parent;
8
8
  }
9
- takeHostNode() {
9
+ take() {
10
10
  return null;
11
11
  }
12
- takeMatchingHeadElement() {
12
+ head() {
13
13
  return null;
14
14
  }
15
- remaining() {
16
- return [];
15
+ has() {
16
+ return false;
17
17
  }
18
18
  };
19
19
  function beginHydration(_root) {
@@ -48,8 +48,21 @@ function installHydrationScrollGuard() {
48
48
  }
49
49
  function drainReplayQueue() {
50
50
  }
51
+ function isHydrationBailout(_error) {
52
+ return false;
53
+ }
54
+ function abortHydration(cause, fiber = null) {
55
+ const error = cause instanceof Error ? cause : new Error("Hydration mismatch.");
56
+ error.f = fiber;
57
+ throw error;
58
+ }
59
+ function hydrateRootImpl() {
60
+ beginHydration(null);
61
+ throw new Error("`hydrateRoot` requires the `hydration` feature.");
62
+ }
51
63
  export {
52
64
  HydrationCursor,
65
+ abortHydration,
53
66
  adoptHostDom,
54
67
  adoptTextDom,
55
68
  advanceCursorPast,
@@ -59,7 +72,9 @@ export {
59
72
  endHydration,
60
73
  findHostParent,
61
74
  getHydrationCursor,
75
+ hydrateRootImpl,
62
76
  installHydrationScrollGuard,
77
+ isHydrationBailout,
63
78
  setHydrationCursor,
64
79
  tryConsumeBoundary
65
80
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/dom/features/hydration/stub.ts"],
4
- "sourcesContent": ["import type { Fiber, FiberRoot } from '../../../core'\n\n// Stub: Hydration feature disabled. Every adoption attempt returns \"no match\",\n// all cursor operations no-op, and `beginHydration` throws so `hydrateRoot`\n// fails loudly \u2014 apps that opt out of hydration should use `createRoot`.\n// The SSR walk-the-DOM machinery, streaming-boundary coordination, head\n// element matching, and the WeakMap of cursors per fiber are all stripped.\n\nexport class HydrationCursor {\n next: ChildNode | null = null\n parent: Node\n endBefore: ChildNode | null = null\n constructor(parent?: Node, _s?: ChildNode | null, _e?: ChildNode | null) {\n this.parent = parent as Node\n }\n takeHostNode(): ChildNode | null {\n return null\n }\n takeMatchingHeadElement(): ChildNode | null {\n return null\n }\n remaining(): ChildNode[] {\n return []\n }\n}\n\nexport interface BoundaryInfo {\n kind: 'pending' | 'resolved'\n id: number\n startMark: Comment\n endMark: Comment\n}\n\nexport function beginHydration(_root: FiberRoot): void {\n throw new Error(\n '`hydrateRoot` requires the `hydration` feature. ' +\n 'Enable it via @tanstack/redact/vite `features.hydration = true`, ' +\n 'or use `createRoot` for a SPA (no SSR hydration).',\n )\n}\n\nexport function endHydration(_root: FiberRoot): void {}\n\nexport function tryConsumeBoundary(_parent: Fiber): BoundaryInfo | null {\n return null\n}\n\nexport function advanceCursorPast(_parent: Fiber, _node: Node): void {}\n\nexport function getHydrationCursor(_hostFiber: Fiber): HydrationCursor | undefined {\n return undefined\n}\n\nexport function setHydrationCursor(_hostFiber: Fiber, _cursor: HydrationCursor): void {}\n\nexport function clearHydrationCursor(_hostFiber: Fiber): void {}\n\nexport function adoptHostDom(_fiber: Fiber, _parent: Fiber): boolean {\n return false\n}\n\nexport function adoptTextDom(_fiber: Fiber, _parent: Fiber, _text: string): boolean {\n return false\n}\n\nexport function findHostParent(fiber: Fiber): Fiber {\n return fiber\n}\n\nexport function installHydrationScrollGuard(): void {}\n\nexport function drainReplayQueue(): void {}\n"],
5
- "mappings": ";AAQO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,OAAyB;AAAA,EACzB;AAAA,EACA,YAA8B;AAAA,EAC9B,YAAY,QAAe,IAAuB,IAAuB;AACvE,SAAK,SAAS;AAAA,EAChB;AAAA,EACA,eAAiC;AAC/B,WAAO;AAAA,EACT;AAAA,EACA,0BAA4C;AAC1C,WAAO;AAAA,EACT;AAAA,EACA,YAAyB;AACvB,WAAO,CAAC;AAAA,EACV;AACF;AASO,SAAS,eAAe,OAAwB;AACrD,QAAM,IAAI;AAAA,IACR;AAAA,EAGF;AACF;AAEO,SAAS,aAAa,OAAwB;AAAC;AAE/C,SAAS,mBAAmB,SAAqC;AACtE,SAAO;AACT;AAEO,SAAS,kBAAkB,SAAgB,OAAmB;AAAC;AAE/D,SAAS,mBAAmB,YAAgD;AACjF,SAAO;AACT;AAEO,SAAS,mBAAmB,YAAmB,SAAgC;AAAC;AAEhF,SAAS,qBAAqB,YAAyB;AAAC;AAExD,SAAS,aAAa,QAAe,SAAyB;AACnE,SAAO;AACT;AAEO,SAAS,aAAa,QAAe,SAAgB,OAAwB;AAClF,SAAO;AACT;AAEO,SAAS,eAAe,OAAqB;AAClD,SAAO;AACT;AAEO,SAAS,8BAAoC;AAAC;AAE9C,SAAS,mBAAyB;AAAC;",
4
+ "sourcesContent": ["import type { Fiber, FiberRoot } from '../../../core'\n\n// Stub: Hydration feature disabled. Every adoption attempt returns \"no match\",\n// all cursor operations no-op, and `beginHydration` throws so `hydrateRoot`\n// fails loudly \u2014 apps that opt out of hydration should use `createRoot`.\n// The SSR walk-the-DOM machinery, streaming-boundary coordination, head\n// element matching, and the WeakMap of cursors per fiber are all stripped.\n\nexport class HydrationCursor {\n n: ChildNode | null = null\n p: Node\n e: ChildNode | null = null\n constructor(parent?: Node, _s?: ChildNode | null, _e?: ChildNode | null) {\n this.p = parent as Node\n }\n take(): ChildNode | null {\n return null\n }\n head(): ChildNode | null {\n return null\n }\n has(): boolean {\n return false\n }\n}\n\nexport type BoundaryInfo = [0 | 1, number, Comment, Comment]\n\nexport function beginHydration(_root: FiberRoot): void {\n throw new Error(\n '`hydrateRoot` requires the `hydration` feature. ' +\n 'Enable it via @tanstack/redact/vite `features.hydration = true`, ' +\n 'or use `createRoot` for a SPA (no SSR hydration).',\n )\n}\n\nexport function endHydration(_root: FiberRoot): void {}\n\nexport function tryConsumeBoundary(_parent: Fiber): BoundaryInfo | null {\n return null\n}\n\nexport function advanceCursorPast(_parent: Fiber, _node: Node): void {}\n\nexport function getHydrationCursor(_hostFiber: Fiber): HydrationCursor | undefined {\n return undefined\n}\n\nexport function setHydrationCursor(_hostFiber: Fiber, _cursor: HydrationCursor): void {}\n\nexport function clearHydrationCursor(_hostFiber: Fiber): void {}\n\nexport function adoptHostDom(_fiber: Fiber, _parent: Fiber): boolean {\n return false\n}\n\nexport function adoptTextDom(_fiber: Fiber, _parent: Fiber, _text: string): boolean {\n return false\n}\n\nexport function findHostParent(fiber: Fiber): Fiber {\n return fiber\n}\n\nexport function installHydrationScrollGuard(): void {}\n\nexport function drainReplayQueue(): void {}\n\nexport interface HydrationBailoutError extends Error {\n f: Fiber | null\n}\n\nexport function isHydrationBailout(_error: unknown): _error is HydrationBailoutError {\n return false\n}\n\nexport function abortHydration(cause: unknown, fiber: Fiber | null = null): never {\n const error = (cause instanceof Error ? cause : new Error('Hydration mismatch.')) as HydrationBailoutError\n ;(error as any).f = fiber\n throw error\n}\n\nexport function hydrateRootImpl(): never {\n beginHydration(null as any)\n throw new Error('`hydrateRoot` requires the `hydration` feature.')\n}\n"],
5
+ "mappings": ";AAQO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,IAAsB;AAAA,EACtB;AAAA,EACA,IAAsB;AAAA,EACtB,YAAY,QAAe,IAAuB,IAAuB;AACvE,SAAK,IAAI;AAAA,EACX;AAAA,EACA,OAAyB;AACvB,WAAO;AAAA,EACT;AAAA,EACA,OAAyB;AACvB,WAAO;AAAA,EACT;AAAA,EACA,MAAe;AACb,WAAO;AAAA,EACT;AACF;AAIO,SAAS,eAAe,OAAwB;AACrD,QAAM,IAAI;AAAA,IACR;AAAA,EAGF;AACF;AAEO,SAAS,aAAa,OAAwB;AAAC;AAE/C,SAAS,mBAAmB,SAAqC;AACtE,SAAO;AACT;AAEO,SAAS,kBAAkB,SAAgB,OAAmB;AAAC;AAE/D,SAAS,mBAAmB,YAAgD;AACjF,SAAO;AACT;AAEO,SAAS,mBAAmB,YAAmB,SAAgC;AAAC;AAEhF,SAAS,qBAAqB,YAAyB;AAAC;AAExD,SAAS,aAAa,QAAe,SAAyB;AACnE,SAAO;AACT;AAEO,SAAS,aAAa,QAAe,SAAgB,OAAwB;AAClF,SAAO;AACT;AAEO,SAAS,eAAe,OAAqB;AAClD,SAAO;AACT;AAEO,SAAS,8BAAoC;AAAC;AAE9C,SAAS,mBAAyB;AAAC;AAMnC,SAAS,mBAAmB,QAAkD;AACnF,SAAO;AACT;AAEO,SAAS,eAAe,OAAgB,QAAsB,MAAa;AAChF,QAAM,QAAS,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,qBAAqB;AAC9E,EAAC,MAAc,IAAI;AACpB,QAAM;AACR;AAEO,SAAS,kBAAyB;AACvC,iBAAe,IAAW;AAC1B,QAAM,IAAI,MAAM,iDAAiD;AACnE;",
6
6
  "names": []
7
7
  }
@@ -5,16 +5,10 @@ import {
5
5
  registerRenderer,
6
6
  registerTypeMatcher,
7
7
  renderFiber,
8
- scheduleUpdate,
9
8
  isThenable,
10
9
  handleSuspended,
11
- getCurrentRoot
10
+ deferHydration
12
11
  } from "../../reconcile";
13
- import {
14
- getHydrationCursor,
15
- setHydrationCursor,
16
- findHostParent as findHydrationHost
17
- } from "../hydration";
18
12
  function renderLazy(fiber, domParent, anchor) {
19
13
  const { _payload, _init } = fiber.type;
20
14
  let resolved;
@@ -22,41 +16,7 @@ function renderLazy(fiber, domParent, anchor) {
22
16
  resolved = _init(_payload);
23
17
  } catch (thenable) {
24
18
  if (isThenable(thenable)) {
25
- const root = getCurrentRoot();
26
- if (root?.hydrating) {
27
- const hostParent = findHydrationHost(fiber);
28
- const inheritedCursor = getHydrationCursor(hostParent);
29
- if (inheritedCursor) {
30
- setHydrationCursor(fiber, inheritedCursor);
31
- }
32
- fiber.memoizedState = {
33
- ...fiber.memoizedState ?? {},
34
- _pendingHydration: true
35
- };
36
- let sus = fiber.parent;
37
- while (sus && sus.tag !== FiberTag.Suspense) sus = sus.parent;
38
- if (sus && sus.memoizedState) {
39
- ;
40
- sus.memoizedState._awaitingLazyHydration = true;
41
- }
42
- thenable.then(
43
- () => {
44
- if (sus && sus.memoizedState) {
45
- ;
46
- sus.memoizedState._awaitingLazyHydration = false;
47
- }
48
- scheduleUpdate(fiber);
49
- },
50
- () => {
51
- if (sus && sus.memoizedState) {
52
- ;
53
- sus.memoizedState._awaitingLazyHydration = false;
54
- }
55
- scheduleUpdate(fiber);
56
- }
57
- );
58
- return;
59
- }
19
+ if (deferHydration(fiber, thenable)) return;
60
20
  handleSuspended(fiber, thenable);
61
21
  return;
62
22
  }
@@ -65,7 +25,7 @@ function renderLazy(fiber, domParent, anchor) {
65
25
  const savedTag = fiber.tag;
66
26
  const savedType = fiber.type;
67
27
  fiber.type = resolved;
68
- fiber.tag = typeof resolved === "function" ? resolved.prototype?.isReactComponent ? FiberTag.Class : FiberTag.Function : FiberTag.Fragment;
28
+ fiber.tag = typeof resolved == "function" ? resolved.prototype?.isReactComponent ? FiberTag.Class : FiberTag.Function : FiberTag.Fragment;
69
29
  try {
70
30
  renderFiber(fiber, domParent, anchor);
71
31
  } finally {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/dom/features/lazy/full.ts"],
4
- "sourcesContent": ["import { FiberTag, type Fiber } from '../../../core'\nimport { REACT_LAZY_TYPE } from '../../../react'\nimport {\n registerRenderer,\n registerTypeMatcher,\n renderFiber,\n scheduleUpdate,\n isThenable,\n handleSuspended,\n getCurrentRoot,\n} from '../../reconcile'\nimport {\n getHydrationCursor,\n setHydrationCursor,\n findHostParent as findHydrationHost,\n} from '../hydration'\n\nfunction renderLazy(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const { _payload, _init } = fiber.type as any\n let resolved: any\n try {\n resolved = _init(_payload)\n } catch (thenable: any) {\n if (isThenable(thenable)) {\n // During initial hydration, a lazy component inside an SSR-resolved\n // Suspense boundary needs special handling: the SSR DOM for its\n // resolved content is already in the page and our cursor is pointing\n // at it. A normal `handleSuspended` would schedule the lazy's later\n // re-render WITHOUT the hydration cursor \u2014 so when it eventually\n // resolves, we'd create a fresh DOM copy next to the SSR one (visible\n // as duplicate logos / buttons / sections inside the Suspense). Mirror\n // the pattern in renderFunction: preserve the in-scope cursor on this\n // fiber and flag it for deferred re-hydration, so rerenderFiber\n // restores `root.hydrating = true` and the resolved render adopts the\n // existing DOM instead of mounting a duplicate.\n const root = getCurrentRoot()\n if (root?.hydrating) {\n const hostParent = findHydrationHost(fiber)\n const inheritedCursor = getHydrationCursor(hostParent)\n if (inheritedCursor) {\n setHydrationCursor(fiber, inheritedCursor)\n }\n fiber.memoizedState = {\n ...(fiber.memoizedState ?? {}),\n _pendingHydration: true,\n }\n // Mark the nearest ancestor Suspense as \"awaiting hydration-resume\"\n // so a post-hydration re-render of that Suspense doesn't accidentally\n // flip into suspended+pending and mount a fallback atop the SSR\n // content. Match-by-tag-name works whether Suspense is the full\n // feature or stubbed to Fragment (the walk just never finds one).\n let sus: Fiber | null = fiber.parent\n while (sus && sus.tag !== FiberTag.Suspense) sus = sus.parent\n if (sus && sus.memoizedState) {\n ;(sus.memoizedState as any)._awaitingLazyHydration = true\n }\n thenable.then(\n () => {\n if (sus && sus.memoizedState) {\n ;(sus.memoizedState as any)._awaitingLazyHydration = false\n }\n scheduleUpdate(fiber)\n },\n () => {\n if (sus && sus.memoizedState) {\n ;(sus.memoizedState as any)._awaitingLazyHydration = false\n }\n scheduleUpdate(fiber)\n },\n )\n return\n }\n handleSuspended(fiber, thenable)\n // reconcileChildren would be called here if we were rendering children,\n // but Lazy delegates and has no children of its own.\n return\n }\n throw thenable\n }\n const savedTag = fiber.tag\n const savedType = fiber.type\n fiber.type = resolved\n fiber.tag =\n typeof resolved === 'function'\n ? resolved.prototype?.isReactComponent\n ? FiberTag.Class\n : FiberTag.Function\n : FiberTag.Fragment\n try {\n renderFiber(fiber, domParent, anchor)\n } finally {\n fiber.tag = savedTag\n fiber.type = savedType\n }\n}\n\nregisterTypeMatcher((_type, marker) => (marker === REACT_LAZY_TYPE ? FiberTag.Lazy : null))\nregisterRenderer(FiberTag.Lazy, renderLazy)\n"],
5
- "mappings": ";AAAA,SAAS,gBAA4B;AACrC,SAAS,uBAAuB;AAChC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,OACb;AAEP,SAAS,WAAW,OAAc,WAAiB,QAA2B;AAC5E,QAAM,EAAE,UAAU,MAAM,IAAI,MAAM;AAClC,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,QAAQ;AAAA,EAC3B,SAAS,UAAe;AACtB,QAAI,WAAW,QAAQ,GAAG;AAYxB,YAAM,OAAO,eAAe;AAC5B,UAAI,MAAM,WAAW;AACnB,cAAM,aAAa,kBAAkB,KAAK;AAC1C,cAAM,kBAAkB,mBAAmB,UAAU;AACrD,YAAI,iBAAiB;AACnB,6BAAmB,OAAO,eAAe;AAAA,QAC3C;AACA,cAAM,gBAAgB;AAAA,UACpB,GAAI,MAAM,iBAAiB,CAAC;AAAA,UAC5B,mBAAmB;AAAA,QACrB;AAMA,YAAI,MAAoB,MAAM;AAC9B,eAAO,OAAO,IAAI,QAAQ,SAAS,SAAU,OAAM,IAAI;AACvD,YAAI,OAAO,IAAI,eAAe;AAC5B;AAAC,UAAC,IAAI,cAAsB,yBAAyB;AAAA,QACvD;AACA,iBAAS;AAAA,UACP,MAAM;AACJ,gBAAI,OAAO,IAAI,eAAe;AAC5B;AAAC,cAAC,IAAI,cAAsB,yBAAyB;AAAA,YACvD;AACA,2BAAe,KAAK;AAAA,UACtB;AAAA,UACA,MAAM;AACJ,gBAAI,OAAO,IAAI,eAAe;AAC5B;AAAC,cAAC,IAAI,cAAsB,yBAAyB;AAAA,YACvD;AACA,2BAAe,KAAK;AAAA,UACtB;AAAA,QACF;AACA;AAAA,MACF;AACA,sBAAgB,OAAO,QAAQ;AAG/B;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACA,QAAM,WAAW,MAAM;AACvB,QAAM,YAAY,MAAM;AACxB,QAAM,OAAO;AACb,QAAM,MACJ,OAAO,aAAa,aAChB,SAAS,WAAW,mBAClB,SAAS,QACT,SAAS,WACX,SAAS;AACf,MAAI;AACF,gBAAY,OAAO,WAAW,MAAM;AAAA,EACtC,UAAE;AACA,UAAM,MAAM;AACZ,UAAM,OAAO;AAAA,EACf;AACF;AAEA,oBAAoB,CAAC,OAAO,WAAY,WAAW,kBAAkB,SAAS,OAAO,IAAK;AAC1F,iBAAiB,SAAS,MAAM,UAAU;",
4
+ "sourcesContent": ["import { FiberTag, type Fiber } from '../../../core'\nimport { REACT_LAZY_TYPE } from '../../../react'\nimport {\n registerRenderer,\n registerTypeMatcher,\n renderFiber,\n isThenable,\n handleSuspended,\n deferHydration,\n} from '../../reconcile'\n\nfunction renderLazy(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const { _payload, _init } = fiber.type as any\n let resolved: any\n try {\n resolved = _init(_payload)\n } catch (thenable: any) {\n if (isThenable(thenable)) {\n if (deferHydration(fiber, thenable)) return\n handleSuspended(fiber, thenable)\n // reconcileChildren would be called here if we were rendering children,\n // but Lazy delegates and has no children of its own.\n return\n }\n throw thenable\n }\n const savedTag = fiber.tag\n const savedType = fiber.type\n fiber.type = resolved\n fiber.tag =\n typeof resolved == 'function'\n ? resolved.prototype?.isReactComponent\n ? FiberTag.Class\n : FiberTag.Function\n : FiberTag.Fragment\n try {\n renderFiber(fiber, domParent, anchor)\n } finally {\n fiber.tag = savedTag\n fiber.type = savedType\n }\n}\n\nregisterTypeMatcher((_type, marker) => (marker === REACT_LAZY_TYPE ? FiberTag.Lazy : null))\nregisterRenderer(FiberTag.Lazy, renderLazy)\n"],
5
+ "mappings": ";AAAA,SAAS,gBAA4B;AACrC,SAAS,uBAAuB;AAChC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,WAAW,OAAc,WAAiB,QAA2B;AAC5E,QAAM,EAAE,UAAU,MAAM,IAAI,MAAM;AAClC,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,QAAQ;AAAA,EAC3B,SAAS,UAAe;AACtB,QAAI,WAAW,QAAQ,GAAG;AACxB,UAAI,eAAe,OAAO,QAAQ,EAAG;AACrC,sBAAgB,OAAO,QAAQ;AAG/B;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACA,QAAM,WAAW,MAAM;AACvB,QAAM,YAAY,MAAM;AACxB,QAAM,OAAO;AACb,QAAM,MACJ,OAAO,YAAY,aACf,SAAS,WAAW,mBAClB,SAAS,QACT,SAAS,WACX,SAAS;AACf,MAAI;AACF,gBAAY,OAAO,WAAW,MAAM;AAAA,EACtC,UAAE;AACA,UAAM,MAAM;AACZ,UAAM,OAAO;AAAA,EACf;AACF;AAEA,oBAAoB,CAAC,OAAO,WAAY,WAAW,kBAAkB,SAAS,OAAO,IAAK;AAC1F,iBAAiB,SAAS,MAAM,UAAU;",
6
6
  "names": []
7
7
  }
@@ -23,7 +23,7 @@ function renderLazyStub(fiber, domParent, anchor) {
23
23
  const savedTag = fiber.tag;
24
24
  const savedType = fiber.type;
25
25
  fiber.type = resolved;
26
- fiber.tag = typeof resolved === "function" ? resolved.prototype?.isReactComponent ? FiberTag.Class : FiberTag.Function : FiberTag.Fragment;
26
+ fiber.tag = typeof resolved == "function" ? resolved.prototype?.isReactComponent ? FiberTag.Class : FiberTag.Function : FiberTag.Fragment;
27
27
  try {
28
28
  renderFiber(fiber, domParent, anchor);
29
29
  } finally {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/dom/features/lazy/stub.ts"],
4
- "sourcesContent": ["import { FiberTag, type Fiber } from '../../../core'\nimport { REACT_LAZY_TYPE } from '../../../react'\nimport {\n registerRenderer,\n registerTypeMatcher,\n renderFiber,\n isThenable,\n handleSuspended,\n} from '../../reconcile'\n\n// Stub: Lazy feature disabled. Lazy elements still resolve \u2014 sync if the\n// payload is ready, otherwise the thrown thenable goes through the default\n// `handleSuspended` capability (retry-on-settle). What's stripped: the\n// hydration-deferred-reveal pathway and the Suspense-awaiting coordination.\nfunction renderLazyStub(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const { _payload, _init } = fiber.type as any\n let resolved: any\n try {\n resolved = _init(_payload)\n } catch (thrown: any) {\n if (isThenable(thrown)) {\n handleSuspended(fiber, thrown)\n return\n }\n throw thrown\n }\n const savedTag = fiber.tag\n const savedType = fiber.type\n fiber.type = resolved\n fiber.tag =\n typeof resolved === 'function'\n ? resolved.prototype?.isReactComponent\n ? FiberTag.Class\n : FiberTag.Function\n : FiberTag.Fragment\n try {\n renderFiber(fiber, domParent, anchor)\n } finally {\n fiber.tag = savedTag\n fiber.type = savedType\n }\n}\n\nregisterTypeMatcher((_type, marker) => (marker === REACT_LAZY_TYPE ? FiberTag.Lazy : null))\nregisterRenderer(FiberTag.Lazy, renderLazyStub)\n"],
5
- "mappings": ";AAAA,SAAS,gBAA4B;AACrC,SAAS,uBAAuB;AAChC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAMP,SAAS,eAAe,OAAc,WAAiB,QAA2B;AAChF,QAAM,EAAE,UAAU,MAAM,IAAI,MAAM;AAClC,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,QAAQ;AAAA,EAC3B,SAAS,QAAa;AACpB,QAAI,WAAW,MAAM,GAAG;AACtB,sBAAgB,OAAO,MAAM;AAC7B;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACA,QAAM,WAAW,MAAM;AACvB,QAAM,YAAY,MAAM;AACxB,QAAM,OAAO;AACb,QAAM,MACJ,OAAO,aAAa,aAChB,SAAS,WAAW,mBAClB,SAAS,QACT,SAAS,WACX,SAAS;AACf,MAAI;AACF,gBAAY,OAAO,WAAW,MAAM;AAAA,EACtC,UAAE;AACA,UAAM,MAAM;AACZ,UAAM,OAAO;AAAA,EACf;AACF;AAEA,oBAAoB,CAAC,OAAO,WAAY,WAAW,kBAAkB,SAAS,OAAO,IAAK;AAC1F,iBAAiB,SAAS,MAAM,cAAc;",
4
+ "sourcesContent": ["import { FiberTag, type Fiber } from '../../../core'\nimport { REACT_LAZY_TYPE } from '../../../react'\nimport {\n registerRenderer,\n registerTypeMatcher,\n renderFiber,\n isThenable,\n handleSuspended,\n} from '../../reconcile'\n\n// Stub: Lazy feature disabled. Lazy elements still resolve \u2014 sync if the\n// payload is ready, otherwise the thrown thenable goes through the default\n// `handleSuspended` capability (retry-on-settle). What's stripped: the\n// hydration-deferred-reveal pathway and the Suspense-awaiting coordination.\nfunction renderLazyStub(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const { _payload, _init } = fiber.type as any\n let resolved: any\n try {\n resolved = _init(_payload)\n } catch (thrown: any) {\n if (isThenable(thrown)) {\n handleSuspended(fiber, thrown)\n return\n }\n throw thrown\n }\n const savedTag = fiber.tag\n const savedType = fiber.type\n fiber.type = resolved\n fiber.tag =\n typeof resolved == 'function'\n ? resolved.prototype?.isReactComponent\n ? FiberTag.Class\n : FiberTag.Function\n : FiberTag.Fragment\n try {\n renderFiber(fiber, domParent, anchor)\n } finally {\n fiber.tag = savedTag\n fiber.type = savedType\n }\n}\n\nregisterTypeMatcher((_type, marker) => (marker === REACT_LAZY_TYPE ? FiberTag.Lazy : null))\nregisterRenderer(FiberTag.Lazy, renderLazyStub)\n"],
5
+ "mappings": ";AAAA,SAAS,gBAA4B;AACrC,SAAS,uBAAuB;AAChC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAMP,SAAS,eAAe,OAAc,WAAiB,QAA2B;AAChF,QAAM,EAAE,UAAU,MAAM,IAAI,MAAM;AAClC,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,QAAQ;AAAA,EAC3B,SAAS,QAAa;AACpB,QAAI,WAAW,MAAM,GAAG;AACtB,sBAAgB,OAAO,MAAM;AAC7B;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACA,QAAM,WAAW,MAAM;AACvB,QAAM,YAAY,MAAM;AACxB,QAAM,OAAO;AACb,QAAM,MACJ,OAAO,YAAY,aACf,SAAS,WAAW,mBAClB,SAAS,QACT,SAAS,WACX,SAAS;AACf,MAAI;AACF,gBAAY,OAAO,WAAW,MAAM;AAAA,EACtC,UAAE;AACA,UAAM,MAAM;AACZ,UAAM,OAAO;AAAA,EACf;AACF;AAEA,oBAAoB,CAAC,OAAO,WAAY,WAAW,kBAAkB,SAAS,OAAO,IAAK;AAC1F,iBAAiB,SAAS,MAAM,cAAc;",
6
6
  "names": []
7
7
  }
@@ -24,15 +24,15 @@ function shallowEqual(a, b) {
24
24
  }
25
25
  function renderMemo(fiber, domParent, anchor) {
26
26
  const { type, compare } = fiber.type;
27
- const props = fiber.pendingProps ?? {};
28
- const prev = fiber.memoizedProps;
27
+ const props = fiber.pp ?? {};
28
+ const prev = fiber.mp;
29
29
  const bypassMemo = fiber === getForceRerenderingFiber();
30
30
  const eq = !bypassMemo && prev && (compare ? compare(prev, props) : shallowEqual(prev, props));
31
31
  if (eq) {
32
32
  return;
33
33
  }
34
34
  let innerTag;
35
- if (typeof type === "function") {
35
+ if (typeof type == "function") {
36
36
  innerTag = type.prototype?.isReactComponent ? FiberTag.Class : FiberTag.Function;
37
37
  } else if (type && typeof type === "object") {
38
38
  const m = type.$$typeof;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/dom/features/memo/full.ts"],
4
- "sourcesContent": ["import { FiberTag, type Fiber } from '../../../core'\nimport {\n REACT_FORWARD_REF_TYPE,\n REACT_MEMO_TYPE,\n REACT_LAZY_TYPE,\n} from '../../../react'\nimport {\n registerRenderer,\n registerTypeMatcher,\n renderFiber,\n getForceRerenderingFiber,\n} from '../../reconcile'\n\nfunction shallowEqual(a: any, b: any): boolean {\n if (a === b) return true\n if (!a || !b) return false\n const ak = Object.keys(a)\n const bk = Object.keys(b)\n if (ak.length !== bk.length) return false\n for (const k of ak) {\n if (a[k] !== b[k]) return false\n }\n return true\n}\n\nfunction renderMemo(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const { type, compare } = fiber.type as any\n const props = fiber.pendingProps ?? {}\n const prev = fiber.memoizedProps\n\n // Memo's prop-equality gate guards PARENT-triggered rerenders. If this\n // render is a STATE-triggered rerender of this exact fiber (hook update,\n // useSyncExternalStore notification), props haven't changed by definition \u2014\n // bailing would swallow the state change and the subscriber never re-runs.\n // rerenderFiber tags the fiber so we skip the gate here.\n const bypassMemo = fiber === getForceRerenderingFiber()\n const eq = !bypassMemo && prev && (compare ? compare(prev, props) : shallowEqual(prev, props))\n if (eq) {\n // Re-render children with previous output (already in tree)\n return\n }\n\n // Determine the delegated tag based on the memoized type. `React.memo` can\n // wrap plain functions, class components, OR other special types like\n // `forwardRef`. Without the marker-based branch we'd mistreat\n // `memo(forwardRef(...))` as a Fragment and render nothing.\n let innerTag: FiberTag\n if (typeof type === 'function') {\n innerTag = type.prototype?.isReactComponent ? FiberTag.Class : FiberTag.Function\n } else if (type && typeof type === 'object') {\n const m = (type as any).$$typeof\n if (m === REACT_FORWARD_REF_TYPE) innerTag = FiberTag.ForwardRef\n else if (m === REACT_MEMO_TYPE) innerTag = FiberTag.Memo\n else if (m === REACT_LAZY_TYPE) innerTag = FiberTag.Lazy\n else innerTag = FiberTag.Fragment\n } else {\n innerTag = FiberTag.Fragment\n }\n\n // Swap tag and type for this render pass; this is a \"delegating\" render\n const savedTag = fiber.tag\n const savedType = fiber.type\n fiber.tag = innerTag\n fiber.type = type\n try {\n renderFiber(fiber, domParent, anchor)\n } finally {\n fiber.tag = savedTag\n fiber.type = savedType\n }\n}\n\nregisterTypeMatcher((_type, marker) => (marker === REACT_MEMO_TYPE ? FiberTag.Memo : null))\nregisterRenderer(FiberTag.Memo, renderMemo)\n"],
5
- "mappings": ";AAAA,SAAS,gBAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,aAAa,GAAQ,GAAiB;AAC7C,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,CAAC,KAAK,CAAC,EAAG,QAAO;AACrB,QAAM,KAAK,OAAO,KAAK,CAAC;AACxB,QAAM,KAAK,OAAO,KAAK,CAAC;AACxB,MAAI,GAAG,WAAW,GAAG,OAAQ,QAAO;AACpC,aAAW,KAAK,IAAI;AAClB,QAAI,EAAE,CAAC,MAAM,EAAE,CAAC,EAAG,QAAO;AAAA,EAC5B;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAc,WAAiB,QAA2B;AAC5E,QAAM,EAAE,MAAM,QAAQ,IAAI,MAAM;AAChC,QAAM,QAAQ,MAAM,gBAAgB,CAAC;AACrC,QAAM,OAAO,MAAM;AAOnB,QAAM,aAAa,UAAU,yBAAyB;AACtD,QAAM,KAAK,CAAC,cAAc,SAAS,UAAU,QAAQ,MAAM,KAAK,IAAI,aAAa,MAAM,KAAK;AAC5F,MAAI,IAAI;AAEN;AAAA,EACF;AAMA,MAAI;AACJ,MAAI,OAAO,SAAS,YAAY;AAC9B,eAAW,KAAK,WAAW,mBAAmB,SAAS,QAAQ,SAAS;AAAA,EAC1E,WAAW,QAAQ,OAAO,SAAS,UAAU;AAC3C,UAAM,IAAK,KAAa;AACxB,QAAI,MAAM,uBAAwB,YAAW,SAAS;AAAA,aAC7C,MAAM,gBAAiB,YAAW,SAAS;AAAA,aAC3C,MAAM,gBAAiB,YAAW,SAAS;AAAA,QAC/C,YAAW,SAAS;AAAA,EAC3B,OAAO;AACL,eAAW,SAAS;AAAA,EACtB;AAGA,QAAM,WAAW,MAAM;AACvB,QAAM,YAAY,MAAM;AACxB,QAAM,MAAM;AACZ,QAAM,OAAO;AACb,MAAI;AACF,gBAAY,OAAO,WAAW,MAAM;AAAA,EACtC,UAAE;AACA,UAAM,MAAM;AACZ,UAAM,OAAO;AAAA,EACf;AACF;AAEA,oBAAoB,CAAC,OAAO,WAAY,WAAW,kBAAkB,SAAS,OAAO,IAAK;AAC1F,iBAAiB,SAAS,MAAM,UAAU;",
4
+ "sourcesContent": ["import { FiberTag, type Fiber } from '../../../core'\nimport {\n REACT_FORWARD_REF_TYPE,\n REACT_MEMO_TYPE,\n REACT_LAZY_TYPE,\n} from '../../../react'\nimport {\n registerRenderer,\n registerTypeMatcher,\n renderFiber,\n getForceRerenderingFiber,\n} from '../../reconcile'\n\nfunction shallowEqual(a: any, b: any): boolean {\n if (a === b) return true\n if (!a || !b) return false\n const ak = Object.keys(a)\n const bk = Object.keys(b)\n if (ak.length !== bk.length) return false\n for (const k of ak) {\n if (a[k] !== b[k]) return false\n }\n return true\n}\n\nfunction renderMemo(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const { type, compare } = fiber.type as any\n const props = fiber.pp ?? {}\n const prev = fiber.mp\n\n // Memo's prop-equality gate guards PARENT-triggered rerenders. If this\n // render is a STATE-triggered rerender of this exact fiber (hook update,\n // useSyncExternalStore notification), props haven't changed by definition \u2014\n // bailing would swallow the state change and the subscriber never re-runs.\n // rerenderFiber tags the fiber so we skip the gate here.\n const bypassMemo = fiber === getForceRerenderingFiber()\n const eq = !bypassMemo && prev && (compare ? compare(prev, props) : shallowEqual(prev, props))\n if (eq) {\n // Re-render children with previous output (already in tree)\n return\n }\n\n // Determine the delegated tag based on the memoized type. `React.memo` can\n // wrap plain functions, class components, OR other special types like\n // `forwardRef`. Without the marker-based branch we'd mistreat\n // `memo(forwardRef(...))` as a Fragment and render nothing.\n let innerTag: FiberTag\n if (typeof type == 'function') {\n innerTag = type.prototype?.isReactComponent ? FiberTag.Class : FiberTag.Function\n } else if (type && typeof type === 'object') {\n const m = (type as any).$$typeof\n if (m === REACT_FORWARD_REF_TYPE) innerTag = FiberTag.ForwardRef\n else if (m === REACT_MEMO_TYPE) innerTag = FiberTag.Memo\n else if (m === REACT_LAZY_TYPE) innerTag = FiberTag.Lazy\n else innerTag = FiberTag.Fragment\n } else {\n innerTag = FiberTag.Fragment\n }\n\n // Swap tag and type for this render pass; this is a \"delegating\" render\n const savedTag = fiber.tag\n const savedType = fiber.type\n fiber.tag = innerTag\n fiber.type = type\n try {\n renderFiber(fiber, domParent, anchor)\n } finally {\n fiber.tag = savedTag\n fiber.type = savedType\n }\n}\n\nregisterTypeMatcher((_type, marker) => (marker === REACT_MEMO_TYPE ? FiberTag.Memo : null))\nregisterRenderer(FiberTag.Memo, renderMemo)\n"],
5
+ "mappings": ";AAAA,SAAS,gBAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,aAAa,GAAQ,GAAiB;AAC7C,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,CAAC,KAAK,CAAC,EAAG,QAAO;AACrB,QAAM,KAAK,OAAO,KAAK,CAAC;AACxB,QAAM,KAAK,OAAO,KAAK,CAAC;AACxB,MAAI,GAAG,WAAW,GAAG,OAAQ,QAAO;AACpC,aAAW,KAAK,IAAI;AAClB,QAAI,EAAE,CAAC,MAAM,EAAE,CAAC,EAAG,QAAO;AAAA,EAC5B;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAc,WAAiB,QAA2B;AAC5E,QAAM,EAAE,MAAM,QAAQ,IAAI,MAAM;AAChC,QAAM,QAAQ,MAAM,MAAM,CAAC;AAC3B,QAAM,OAAO,MAAM;AAOnB,QAAM,aAAa,UAAU,yBAAyB;AACtD,QAAM,KAAK,CAAC,cAAc,SAAS,UAAU,QAAQ,MAAM,KAAK,IAAI,aAAa,MAAM,KAAK;AAC5F,MAAI,IAAI;AAEN;AAAA,EACF;AAMA,MAAI;AACJ,MAAI,OAAO,QAAQ,YAAY;AAC7B,eAAW,KAAK,WAAW,mBAAmB,SAAS,QAAQ,SAAS;AAAA,EAC1E,WAAW,QAAQ,OAAO,SAAS,UAAU;AAC3C,UAAM,IAAK,KAAa;AACxB,QAAI,MAAM,uBAAwB,YAAW,SAAS;AAAA,aAC7C,MAAM,gBAAiB,YAAW,SAAS;AAAA,aAC3C,MAAM,gBAAiB,YAAW,SAAS;AAAA,QAC/C,YAAW,SAAS;AAAA,EAC3B,OAAO;AACL,eAAW,SAAS;AAAA,EACtB;AAGA,QAAM,WAAW,MAAM;AACvB,QAAM,YAAY,MAAM;AACxB,QAAM,MAAM;AACZ,QAAM,OAAO;AACb,MAAI;AACF,gBAAY,OAAO,WAAW,MAAM;AAAA,EACtC,UAAE;AACA,UAAM,MAAM;AACZ,UAAM,OAAO;AAAA,EACf;AACF;AAEA,oBAAoB,CAAC,OAAO,WAAY,WAAW,kBAAkB,SAAS,OAAO,IAAK;AAC1F,iBAAiB,SAAS,MAAM,UAAU;",
6
6
  "names": []
7
7
  }
@@ -9,7 +9,7 @@ import { registerRenderer, registerTypeMatcher, renderFiber } from "../../reconc
9
9
  function renderMemoStub(fiber, domParent, anchor) {
10
10
  const { type } = fiber.type;
11
11
  let innerTag;
12
- if (typeof type === "function") {
12
+ if (typeof type == "function") {
13
13
  innerTag = type.prototype?.isReactComponent ? FiberTag.Class : FiberTag.Function;
14
14
  } else if (type && typeof type === "object") {
15
15
  const m = type.$$typeof;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/dom/features/memo/stub.ts"],
4
- "sourcesContent": ["import { FiberTag, type Fiber } from '../../../core'\nimport {\n REACT_FORWARD_REF_TYPE,\n REACT_MEMO_TYPE,\n REACT_LAZY_TYPE,\n} from '../../../react'\nimport { registerRenderer, registerTypeMatcher, renderFiber } from '../../reconcile'\n\n// Stub: Memo feature disabled. `memo(Component)` still works \u2014 the element\n// renders \u2014 but without the prop-equality gate, so every parent rerender\n// passes through to the inner component. `shallowEqual` and the\n// forceRerenderingFiber read are stripped.\nfunction renderMemoStub(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const { type } = fiber.type as any\n\n let innerTag: FiberTag\n if (typeof type === 'function') {\n innerTag = type.prototype?.isReactComponent ? FiberTag.Class : FiberTag.Function\n } else if (type && typeof type === 'object') {\n const m = (type as any).$$typeof\n if (m === REACT_FORWARD_REF_TYPE) innerTag = FiberTag.ForwardRef\n else if (m === REACT_MEMO_TYPE) innerTag = FiberTag.Memo\n else if (m === REACT_LAZY_TYPE) innerTag = FiberTag.Lazy\n else innerTag = FiberTag.Fragment\n } else {\n innerTag = FiberTag.Fragment\n }\n\n const savedTag = fiber.tag\n const savedType = fiber.type\n fiber.tag = innerTag\n fiber.type = type\n try {\n renderFiber(fiber, domParent, anchor)\n } finally {\n fiber.tag = savedTag\n fiber.type = savedType\n }\n}\n\nregisterTypeMatcher((_type, marker) => (marker === REACT_MEMO_TYPE ? FiberTag.Memo : null))\nregisterRenderer(FiberTag.Memo, renderMemoStub)\n"],
5
- "mappings": ";AAAA,SAAS,gBAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAkB,qBAAqB,mBAAmB;AAMnE,SAAS,eAAe,OAAc,WAAiB,QAA2B;AAChF,QAAM,EAAE,KAAK,IAAI,MAAM;AAEvB,MAAI;AACJ,MAAI,OAAO,SAAS,YAAY;AAC9B,eAAW,KAAK,WAAW,mBAAmB,SAAS,QAAQ,SAAS;AAAA,EAC1E,WAAW,QAAQ,OAAO,SAAS,UAAU;AAC3C,UAAM,IAAK,KAAa;AACxB,QAAI,MAAM,uBAAwB,YAAW,SAAS;AAAA,aAC7C,MAAM,gBAAiB,YAAW,SAAS;AAAA,aAC3C,MAAM,gBAAiB,YAAW,SAAS;AAAA,QAC/C,YAAW,SAAS;AAAA,EAC3B,OAAO;AACL,eAAW,SAAS;AAAA,EACtB;AAEA,QAAM,WAAW,MAAM;AACvB,QAAM,YAAY,MAAM;AACxB,QAAM,MAAM;AACZ,QAAM,OAAO;AACb,MAAI;AACF,gBAAY,OAAO,WAAW,MAAM;AAAA,EACtC,UAAE;AACA,UAAM,MAAM;AACZ,UAAM,OAAO;AAAA,EACf;AACF;AAEA,oBAAoB,CAAC,OAAO,WAAY,WAAW,kBAAkB,SAAS,OAAO,IAAK;AAC1F,iBAAiB,SAAS,MAAM,cAAc;",
4
+ "sourcesContent": ["import { FiberTag, type Fiber } from '../../../core'\nimport {\n REACT_FORWARD_REF_TYPE,\n REACT_MEMO_TYPE,\n REACT_LAZY_TYPE,\n} from '../../../react'\nimport { registerRenderer, registerTypeMatcher, renderFiber } from '../../reconcile'\n\n// Stub: Memo feature disabled. `memo(Component)` still works \u2014 the element\n// renders \u2014 but without the prop-equality gate, so every parent rerender\n// passes through to the inner component. `shallowEqual` and the\n// forceRerenderingFiber read are stripped.\nfunction renderMemoStub(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const { type } = fiber.type as any\n\n let innerTag: FiberTag\n if (typeof type == 'function') {\n innerTag = type.prototype?.isReactComponent ? FiberTag.Class : FiberTag.Function\n } else if (type && typeof type === 'object') {\n const m = (type as any).$$typeof\n if (m === REACT_FORWARD_REF_TYPE) innerTag = FiberTag.ForwardRef\n else if (m === REACT_MEMO_TYPE) innerTag = FiberTag.Memo\n else if (m === REACT_LAZY_TYPE) innerTag = FiberTag.Lazy\n else innerTag = FiberTag.Fragment\n } else {\n innerTag = FiberTag.Fragment\n }\n\n const savedTag = fiber.tag\n const savedType = fiber.type\n fiber.tag = innerTag\n fiber.type = type\n try {\n renderFiber(fiber, domParent, anchor)\n } finally {\n fiber.tag = savedTag\n fiber.type = savedType\n }\n}\n\nregisterTypeMatcher((_type, marker) => (marker === REACT_MEMO_TYPE ? FiberTag.Memo : null))\nregisterRenderer(FiberTag.Memo, renderMemoStub)\n"],
5
+ "mappings": ";AAAA,SAAS,gBAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAkB,qBAAqB,mBAAmB;AAMnE,SAAS,eAAe,OAAc,WAAiB,QAA2B;AAChF,QAAM,EAAE,KAAK,IAAI,MAAM;AAEvB,MAAI;AACJ,MAAI,OAAO,QAAQ,YAAY;AAC7B,eAAW,KAAK,WAAW,mBAAmB,SAAS,QAAQ,SAAS;AAAA,EAC1E,WAAW,QAAQ,OAAO,SAAS,UAAU;AAC3C,UAAM,IAAK,KAAa;AACxB,QAAI,MAAM,uBAAwB,YAAW,SAAS;AAAA,aAC7C,MAAM,gBAAiB,YAAW,SAAS;AAAA,aAC3C,MAAM,gBAAiB,YAAW,SAAS;AAAA,QAC/C,YAAW,SAAS;AAAA,EAC3B,OAAO;AACL,eAAW,SAAS;AAAA,EACtB;AAEA,QAAM,WAAW,MAAM;AACvB,QAAM,YAAY,MAAM;AACxB,QAAM,MAAM;AACZ,QAAM,OAAO;AACb,MAAI;AACF,gBAAY,OAAO,WAAW,MAAM;AAAA,EACtC,UAAE;AACA,UAAM,MAAM;AACZ,UAAM,OAAO;AAAA,EACf;AACF;AAEA,oBAAoB,CAAC,OAAO,WAAY,WAAW,kBAAkB,SAAS,OAAO,IAAK;AAC1F,iBAAiB,SAAS,MAAM,cAAc;",
6
6
  "names": []
7
7
  }
@@ -9,9 +9,9 @@ import {
9
9
  childrenToArray
10
10
  } from "../../reconcile";
11
11
  function renderPortal(fiber, _domParent, _anchor) {
12
- const { children, container } = fiber.pendingProps;
12
+ const { children, container } = fiber.pp;
13
13
  reconcileChildren(fiber, childrenToArray(children), container, null);
14
- fiber.memoizedProps = fiber.pendingProps;
14
+ fiber.mp = fiber.pp;
15
15
  }
16
16
  registerElementMarker(REACT_PORTAL_TYPE);
17
17
  registerTypeMatcher((type) => type === REACT_PORTAL_TYPE ? FiberTag.Portal : null);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/dom/features/portal/full.ts"],
4
- "sourcesContent": ["import { FiberTag, type Fiber, type ReactNode } from '../../../core'\nimport { REACT_PORTAL_TYPE } from '../../../react'\nimport {\n registerRenderer,\n registerTypeMatcher,\n registerElementMarker,\n reconcileChildren,\n childrenToArray,\n} from '../../reconcile'\n\nfunction renderPortal(fiber: Fiber, _domParent: Node, _anchor: Node | null): void {\n const { children, container } = fiber.pendingProps as {\n children: ReactNode\n container: Element\n }\n reconcileChildren(fiber, childrenToArray(children), container, null)\n fiber.memoizedProps = fiber.pendingProps\n}\n\nregisterElementMarker(REACT_PORTAL_TYPE)\nregisterTypeMatcher((type) => (type === REACT_PORTAL_TYPE ? FiberTag.Portal : null))\nregisterRenderer(FiberTag.Portal, renderPortal)\n"],
5
- "mappings": ";AAAA,SAAS,gBAA4C;AACrD,SAAS,yBAAyB;AAClC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,aAAa,OAAc,YAAkB,SAA4B;AAChF,QAAM,EAAE,UAAU,UAAU,IAAI,MAAM;AAItC,oBAAkB,OAAO,gBAAgB,QAAQ,GAAG,WAAW,IAAI;AACnE,QAAM,gBAAgB,MAAM;AAC9B;AAEA,sBAAsB,iBAAiB;AACvC,oBAAoB,CAAC,SAAU,SAAS,oBAAoB,SAAS,SAAS,IAAK;AACnF,iBAAiB,SAAS,QAAQ,YAAY;",
4
+ "sourcesContent": ["import { FiberTag, type Fiber, type ReactNode } from '../../../core'\nimport { REACT_PORTAL_TYPE } from '../../../react'\nimport {\n registerRenderer,\n registerTypeMatcher,\n registerElementMarker,\n reconcileChildren,\n childrenToArray,\n} from '../../reconcile'\n\nfunction renderPortal(fiber: Fiber, _domParent: Node, _anchor: Node | null): void {\n const { children, container } = fiber.pp as {\n children: ReactNode\n container: Element\n }\n reconcileChildren(fiber, childrenToArray(children), container, null)\n fiber.mp = fiber.pp\n}\n\nregisterElementMarker(REACT_PORTAL_TYPE)\nregisterTypeMatcher((type) => (type === REACT_PORTAL_TYPE ? FiberTag.Portal : null))\nregisterRenderer(FiberTag.Portal, renderPortal)\n"],
5
+ "mappings": ";AAAA,SAAS,gBAA4C;AACrD,SAAS,yBAAyB;AAClC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,aAAa,OAAc,YAAkB,SAA4B;AAChF,QAAM,EAAE,UAAU,UAAU,IAAI,MAAM;AAItC,oBAAkB,OAAO,gBAAgB,QAAQ,GAAG,WAAW,IAAI;AACnE,QAAM,KAAK,MAAM;AACnB;AAEA,sBAAsB,iBAAiB;AACvC,oBAAoB,CAAC,SAAU,SAAS,oBAAoB,SAAS,SAAS,IAAK;AACnF,iBAAiB,SAAS,QAAQ,YAAY;",
6
6
  "names": []
7
7
  }