@tanstack/redact 0.1.0 → 0.1.1

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.
@@ -1,6 +1,6 @@
1
1
  // src/dom/features/context/full.ts
2
2
  import { FiberTag } from "../../../core/index.js";
3
- import { REACT_PROVIDER_TYPE, REACT_CONSUMER_TYPE } from "../../../react/index.js";
3
+ import { REACT_CONTEXT_TYPE, REACT_PROVIDER_TYPE, REACT_CONSUMER_TYPE } from "../../../react/index.js";
4
4
  import {
5
5
  registerRenderer,
6
6
  registerTypeMatcher,
@@ -16,7 +16,7 @@ function contextValue(fiber, ctx) {
16
16
  let p = fiber.parent;
17
17
  while (p) {
18
18
  if (p.tag === FiberTag.Provider && p.type._context === ctx) {
19
- return (p.pp ?? p.mp)?.value;
19
+ return p.pp?.value;
20
20
  }
21
21
  p = p.parent;
22
22
  }
@@ -73,7 +73,6 @@ function renderContextConsumers(fiber) {
73
73
  }
74
74
  }
75
75
  function renderProvider(fiber, domParent, anchor) {
76
- const ctx = fiber.type._context;
77
76
  const props = fiber.pp ?? {};
78
77
  const changed = fiber.mp && !Object.is(fiber.mp.value, props.value);
79
78
  if (changed) changingProviders++;
@@ -82,21 +81,19 @@ function renderProvider(fiber, domParent, anchor) {
82
81
  } finally {
83
82
  if (changed) changingProviders--;
84
83
  }
85
- fiber.ms = props.value;
86
84
  fiber.mp = props;
87
85
  }
88
86
  function renderConsumer(fiber, domParent, anchor) {
89
87
  fiber.cx?.clear();
90
- const ctx = fiber.type._context;
91
88
  const props = fiber.pp ?? {};
92
89
  const children = props.children;
93
- const value = realReadContext(fiber, ctx);
90
+ const value = realReadContext(fiber, fiber.type._context);
94
91
  const rendered = typeof children == "function" ? children(value) : null;
95
92
  reconcileChildren(fiber, childrenToArray(rendered), domParent, anchor);
96
93
  fiber.mp = props;
97
94
  }
98
95
  registerTypeMatcher(
99
- (_type, marker) => marker === REACT_PROVIDER_TYPE ? FiberTag.Provider : marker === REACT_CONSUMER_TYPE ? FiberTag.Consumer : null
96
+ (_type, marker) => marker === REACT_CONTEXT_TYPE || marker === REACT_PROVIDER_TYPE ? FiberTag.Provider : marker === REACT_CONSUMER_TYPE ? FiberTag.Consumer : null
100
97
  );
101
98
  registerRenderer(FiberTag.Provider, renderProvider);
102
99
  registerRenderer(FiberTag.Consumer, renderConsumer);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/dom/features/context/full.ts"],
4
- "sourcesContent": ["import { FiberTag, type Fiber } from '../../../core'\nimport { REACT_PROVIDER_TYPE, REACT_CONSUMER_TYPE } from '../../../react'\nimport {\n registerRenderer,\n registerTypeMatcher,\n installCapability,\n reconcileChildren,\n childrenToArray,\n renderFiber,\n getHostParent,\n getAnchor,\n} from '../../reconcile'\n\nlet changingProviders = 0\n\nfunction contextValue(fiber: Fiber, ctx: any): any {\n let p: Fiber | null = fiber.parent\n while (p) {\n if (p.tag === FiberTag.Provider && (p.type as any)._context === ctx) {\n return (p.pp ?? p.mp)?.value\n }\n p = p.parent\n }\n return ctx._currentValue\n}\n\nfunction remember(fiber: Fiber, ctx: any, value: any): void {\n ;(fiber.cx ??= new Map()).set(ctx, value)\n}\n\nfunction realReadContext(fiber: Fiber, ctx: any): any {\n const value = contextValue(fiber, ctx)\n remember(fiber, ctx, value)\n // Initial suspended attempts are discarded. Keep their external context\n // reads on the boundary so a provider can retry them before a promise settles.\n let child = fiber\n let p = fiber.parent\n while (p) {\n if (p.tag === FiberTag.Provider && p.type._context === ctx) break\n if (p.tag === FiberTag.Suspense && p.ms?.f !== child) remember(p, ctx, value)\n child = p\n p = p.parent\n }\n return value\n}\n\nexport function ownContextChanged(fiber: Fiber): boolean {\n if (!changingProviders) return false\n const reads = fiber.cx\n if (reads) {\n for (const [ctx, value] of reads) {\n if (!Object.is(value, contextValue(fiber, ctx))) return true\n }\n }\n return false\n}\n\nexport function hasContextChanged(fiber: Fiber, includeFallback = true): boolean {\n if (!changingProviders) return false\n if (ownContextChanged(fiber)) return true\n let child = fiber.child\n while (child) {\n if (hasContextChanged(child)) return true\n child = child.sibling\n }\n return includeFallback && fiber.tag === FiberTag.Suspense && !!fiber.ms?.f && hasContextChanged(fiber.ms.f)\n}\n\nexport function renderContextConsumers(fiber: Fiber): void {\n if (!changingProviders) return\n let child = fiber.child\n while (child) {\n if (child.tag === FiberTag.Suspense ? hasContextChanged(child) : ownContextChanged(child)) {\n const domParent = getHostParent(child)\n renderFiber(child, domParent, getAnchor(child, domParent))\n } else {\n renderContextConsumers(child)\n }\n child = child.sibling\n }\n}\n\nfunction renderProvider(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const ctx = (fiber.type as any)._context\n const props = fiber.pp ?? {}\n const changed = fiber.mp && !Object.is(fiber.mp.value, props.value)\n if (changed) changingProviders++\n try {\n reconcileChildren(fiber, childrenToArray(props.children), domParent, anchor)\n } finally {\n if (changed) changingProviders--\n }\n // Also store the value on the fiber so descendants rendering later (via updates)\n // can read through by walking up.\n fiber.ms = props.value\n fiber.mp = props\n}\n\nfunction renderConsumer(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n fiber.cx?.clear()\n const ctx = (fiber.type as any)._context\n const props = fiber.pp ?? {}\n const children = props.children\n const value = realReadContext(fiber, ctx)\n const rendered = typeof children == 'function' ? children(value) : null\n reconcileChildren(fiber, childrenToArray(rendered), domParent, anchor)\n fiber.mp = props\n}\n\nregisterTypeMatcher((_type, marker) =>\n marker === REACT_PROVIDER_TYPE\n ? FiberTag.Provider\n : marker === REACT_CONSUMER_TYPE\n ? FiberTag.Consumer\n : null,\n)\nregisterRenderer(FiberTag.Provider, renderProvider)\nregisterRenderer(FiberTag.Consumer, renderConsumer)\ninstallCapability('readContext', realReadContext)\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { FiberTag, type Fiber } from '../../../core'\nimport { REACT_CONTEXT_TYPE, REACT_PROVIDER_TYPE, REACT_CONSUMER_TYPE } from '../../../react'\nimport {\n registerRenderer,\n registerTypeMatcher,\n installCapability,\n reconcileChildren,\n childrenToArray,\n renderFiber,\n getHostParent,\n getAnchor,\n} from '../../reconcile'\n\nlet changingProviders = 0\n\nfunction contextValue(fiber: Fiber, ctx: any): any {\n let p: Fiber | null = fiber.parent\n while (p) {\n if (p.tag === FiberTag.Provider && (p.type as any)._context === ctx) {\n return p.pp?.value\n }\n p = p.parent\n }\n return ctx._currentValue\n}\n\nfunction remember(fiber: Fiber, ctx: any, value: any): void {\n ;(fiber.cx ??= new Map()).set(ctx, value)\n}\n\nfunction realReadContext(fiber: Fiber, ctx: any): any {\n const value = contextValue(fiber, ctx)\n remember(fiber, ctx, value)\n // Initial suspended attempts are discarded. Keep their external context\n // reads on the boundary so a provider can retry them before a promise settles.\n let child = fiber\n let p = fiber.parent\n while (p) {\n if (p.tag === FiberTag.Provider && p.type._context === ctx) break\n if (p.tag === FiberTag.Suspense && p.ms?.f !== child) remember(p, ctx, value)\n child = p\n p = p.parent\n }\n return value\n}\n\nexport function ownContextChanged(fiber: Fiber): boolean {\n if (!changingProviders) return false\n const reads = fiber.cx\n if (reads) {\n for (const [ctx, value] of reads) {\n if (!Object.is(value, contextValue(fiber, ctx))) return true\n }\n }\n return false\n}\n\nexport function hasContextChanged(fiber: Fiber, includeFallback = true): boolean {\n if (!changingProviders) return false\n if (ownContextChanged(fiber)) return true\n let child = fiber.child\n while (child) {\n if (hasContextChanged(child)) return true\n child = child.sibling\n }\n return includeFallback && fiber.tag === FiberTag.Suspense && !!fiber.ms?.f && hasContextChanged(fiber.ms.f)\n}\n\nexport function renderContextConsumers(fiber: Fiber): void {\n if (!changingProviders) return\n let child = fiber.child\n while (child) {\n if (child.tag === FiberTag.Suspense ? hasContextChanged(child) : ownContextChanged(child)) {\n const domParent = getHostParent(child)\n renderFiber(child, domParent, getAnchor(child, domParent))\n } else {\n renderContextConsumers(child)\n }\n child = child.sibling\n }\n}\n\nfunction renderProvider(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const props = fiber.pp ?? {}\n const changed = fiber.mp && !Object.is(fiber.mp.value, props.value)\n if (changed) changingProviders++\n try {\n reconcileChildren(fiber, childrenToArray(props.children), domParent, anchor)\n } finally {\n if (changed) changingProviders--\n }\n fiber.mp = props\n}\n\nfunction renderConsumer(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n fiber.cx?.clear()\n const props = fiber.pp ?? {}\n const children = props.children\n const value = realReadContext(fiber, (fiber.type as any)._context)\n const rendered = typeof children == 'function' ? children(value) : null\n reconcileChildren(fiber, childrenToArray(rendered), domParent, anchor)\n fiber.mp = props\n}\n\nregisterTypeMatcher((_type, marker) =>\n marker === REACT_CONTEXT_TYPE || marker === REACT_PROVIDER_TYPE\n ? FiberTag.Provider\n : marker === REACT_CONSUMER_TYPE\n ? FiberTag.Consumer\n : null,\n)\nregisterRenderer(FiberTag.Provider, renderProvider)\nregisterRenderer(FiberTag.Consumer, renderConsumer)\ninstallCapability('readContext', realReadContext)\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,6 @@
1
1
  // src/dom/features/context/stub.ts
2
2
  import { FiberTag } from "../../../core/index.js";
3
- import { REACT_PROVIDER_TYPE, REACT_CONSUMER_TYPE } from "../../../react/index.js";
3
+ import { REACT_CONTEXT_TYPE, REACT_PROVIDER_TYPE, REACT_CONSUMER_TYPE } from "../../../react/index.js";
4
4
  import {
5
5
  registerRenderer,
6
6
  registerTypeMatcher,
@@ -14,15 +14,13 @@ var ownContextChanged = hasContextChanged;
14
14
  function renderContextConsumers(_fiber) {
15
15
  }
16
16
  function renderConsumerStub(fiber, domParent, anchor) {
17
- const ctx = fiber.type._context;
18
17
  const props = fiber.pp ?? {};
19
- const value = ctx._currentValue;
20
- const rendered = typeof props.children == "function" ? props.children(value) : null;
18
+ const rendered = typeof props.children == "function" ? props.children(fiber.type._context._currentValue) : null;
21
19
  reconcileChildren(fiber, childrenToArray(rendered), domParent, anchor);
22
20
  fiber.mp = props;
23
21
  }
24
22
  registerTypeMatcher(
25
- (_type, marker) => marker === REACT_PROVIDER_TYPE ? FiberTag.Fragment : marker === REACT_CONSUMER_TYPE ? FiberTag.Consumer : null
23
+ (_type, marker) => marker === REACT_CONTEXT_TYPE || marker === REACT_PROVIDER_TYPE ? FiberTag.Fragment : marker === REACT_CONSUMER_TYPE ? FiberTag.Consumer : null
26
24
  );
27
25
  registerRenderer(FiberTag.Consumer, renderConsumerStub);
28
26
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/dom/features/context/stub.ts"],
4
- "sourcesContent": ["import { FiberTag, type Fiber } from '../../../core'\nimport { REACT_PROVIDER_TYPE, REACT_CONSUMER_TYPE } from '../../../react'\nimport {\n registerRenderer,\n registerTypeMatcher,\n reconcileChildren,\n childrenToArray,\n} from '../../reconcile'\n\nexport function hasContextChanged(_fiber: Fiber, _includeFallback = true): boolean {\n return false\n}\nexport const ownContextChanged = hasContextChanged\nexport function renderContextConsumers(_fiber: Fiber): void {}\n\n// Stub: Context feature disabled. Provider elements render as Fragments\n// (value is never propagated \u2014 descendants see only the Context's default).\n// Consumer elements still invoke their function-children with the default\n// value, so `<Ctx.Consumer>{v => ...}</Ctx.Consumer>` patterns keep working.\n// The default `readContext` capability returns `ctx._currentValue` without\n// walking, which matches the no-Provider-fibers-in-tree reality.\nfunction renderConsumerStub(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const ctx = (fiber.type as any)._context\n const props = fiber.pp ?? {}\n const value = ctx._currentValue\n const rendered = typeof props.children == 'function' ? props.children(value) : null\n reconcileChildren(fiber, childrenToArray(rendered), domParent, anchor)\n fiber.mp = props\n}\n\nregisterTypeMatcher((_type, marker) =>\n marker === REACT_PROVIDER_TYPE\n ? FiberTag.Fragment\n : marker === REACT_CONSUMER_TYPE\n ? FiberTag.Consumer\n : null,\n)\nregisterRenderer(FiberTag.Consumer, renderConsumerStub)\n"],
5
- "mappings": ";AAAA,SAAS,gBAA4B;AACrC,SAAS,qBAAqB,2BAA2B;AACzD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,SAAS,kBAAkB,QAAe,mBAAmB,MAAe;AACjF,SAAO;AACT;AACO,IAAM,oBAAoB;AAC1B,SAAS,uBAAuB,QAAqB;AAAC;AAQ7D,SAAS,mBAAmB,OAAc,WAAiB,QAA2B;AACpF,QAAM,MAAO,MAAM,KAAa;AAChC,QAAM,QAAQ,MAAM,MAAM,CAAC;AAC3B,QAAM,QAAQ,IAAI;AAClB,QAAM,WAAW,OAAO,MAAM,YAAY,aAAa,MAAM,SAAS,KAAK,IAAI;AAC/E,oBAAkB,OAAO,gBAAgB,QAAQ,GAAG,WAAW,MAAM;AACrE,QAAM,KAAK;AACb;AAEA;AAAA,EAAoB,CAAC,OAAO,WAC1B,WAAW,sBACP,SAAS,WACT,WAAW,sBACT,SAAS,WACT;AACR;AACA,iBAAiB,SAAS,UAAU,kBAAkB;",
4
+ "sourcesContent": ["import { FiberTag, type Fiber } from '../../../core'\nimport { REACT_CONTEXT_TYPE, REACT_PROVIDER_TYPE, REACT_CONSUMER_TYPE } from '../../../react'\nimport {\n registerRenderer,\n registerTypeMatcher,\n reconcileChildren,\n childrenToArray,\n} from '../../reconcile'\n\nexport function hasContextChanged(_fiber: Fiber, _includeFallback = true): boolean {\n return false\n}\nexport const ownContextChanged = hasContextChanged\nexport function renderContextConsumers(_fiber: Fiber): void {}\n\n// Stub: Context feature disabled. Provider elements render as Fragments\n// (value is never propagated \u2014 descendants see only the Context's default).\n// Consumer elements still invoke their function-children with the default\n// value, so `<Ctx.Consumer>{v => ...}</Ctx.Consumer>` patterns keep working.\n// The default `readContext` capability returns `ctx._currentValue` without\n// walking, which matches the no-Provider-fibers-in-tree reality.\nfunction renderConsumerStub(fiber: Fiber, domParent: Node, anchor: Node | null): void {\n const props = fiber.pp ?? {}\n const rendered = typeof props.children == 'function'\n ? props.children((fiber.type as any)._context._currentValue) : null\n reconcileChildren(fiber, childrenToArray(rendered), domParent, anchor)\n fiber.mp = props\n}\n\nregisterTypeMatcher((_type, marker) =>\n marker === REACT_CONTEXT_TYPE || marker === REACT_PROVIDER_TYPE\n ? FiberTag.Fragment\n : marker === REACT_CONSUMER_TYPE\n ? FiberTag.Consumer\n : null,\n)\nregisterRenderer(FiberTag.Consumer, renderConsumerStub)\n"],
5
+ "mappings": ";AAAA,SAAS,gBAA4B;AACrC,SAAS,oBAAoB,qBAAqB,2BAA2B;AAC7E;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,SAAS,kBAAkB,QAAe,mBAAmB,MAAe;AACjF,SAAO;AACT;AACO,IAAM,oBAAoB;AAC1B,SAAS,uBAAuB,QAAqB;AAAC;AAQ7D,SAAS,mBAAmB,OAAc,WAAiB,QAA2B;AACpF,QAAM,QAAQ,MAAM,MAAM,CAAC;AAC3B,QAAM,WAAW,OAAO,MAAM,YAAY,aACtC,MAAM,SAAU,MAAM,KAAa,SAAS,aAAa,IAAI;AACjE,oBAAkB,OAAO,gBAAgB,QAAQ,GAAG,WAAW,MAAM;AACrE,QAAM,KAAK;AACb;AAEA;AAAA,EAAoB,CAAC,OAAO,WAC1B,WAAW,sBAAsB,WAAW,sBACxC,SAAS,WACT,WAAW,sBACT,SAAS,WACT;AACR;AACA,iBAAiB,SAAS,UAAU,kBAAkB;",
6
6
  "names": []
7
7
  }
@@ -4,6 +4,7 @@ export declare const REACT_PROVIDER_TYPE: unique symbol;
4
4
  export declare const REACT_CONSUMER_TYPE: unique symbol;
5
5
  export interface Context<T> {
6
6
  $$typeof: typeof REACT_CONTEXT_TYPE;
7
+ _context: Context<T>;
7
8
  _currentValue: T;
8
9
  Provider: ProviderExoticComponent<{
9
10
  value: T;
@@ -11,9 +12,13 @@ export interface Context<T> {
11
12
  }>;
12
13
  Consumer: ConsumerExoticComponent<T>;
13
14
  displayName?: string;
15
+ (props: {
16
+ value: T;
17
+ children?: ReactNode;
18
+ }): ReactElement;
14
19
  }
15
20
  export interface ProviderExoticComponent<P> {
16
- $$typeof: typeof REACT_PROVIDER_TYPE;
21
+ $$typeof: typeof REACT_CONTEXT_TYPE | typeof REACT_PROVIDER_TYPE;
17
22
  _context: Context<any>;
18
23
  (props: P): ReactElement;
19
24
  }
@@ -8,20 +8,12 @@ function createContext(defaultValue) {
8
8
  $$typeof: REACT_CONTEXT_TYPE,
9
9
  _currentValue: defaultValue
10
10
  };
11
- const Provider = function Provider2(_props) {
12
- if (process.env.NODE_ENV !== "production") {
13
- throw new Error("Provider components are handled by the renderer.");
14
- }
15
- throw new Error();
16
- };
17
- Provider.$$typeof = REACT_PROVIDER_TYPE;
18
- Provider._context = context;
19
11
  const Consumer = function Consumer2(props) {
20
12
  return props.children(useContext(context));
21
13
  };
22
14
  Consumer.$$typeof = REACT_CONSUMER_TYPE;
23
15
  Consumer._context = context;
24
- context.Provider = Provider;
16
+ context.Provider = context._context = context;
25
17
  context.Consumer = Consumer;
26
18
  return context;
27
19
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/react/context.ts"],
4
- "sourcesContent": ["import type { ReactElement, ReactNode } from '../core'\nimport { useContext } from './hooks'\n\nexport const REACT_CONTEXT_TYPE = Symbol.for('react.context')\nexport const REACT_PROVIDER_TYPE = Symbol.for('react.provider')\nexport const REACT_CONSUMER_TYPE = Symbol.for('react.consumer')\n\nexport interface Context<T> {\n $$typeof: typeof REACT_CONTEXT_TYPE\n _currentValue: T\n Provider: ProviderExoticComponent<{ value: T; children?: ReactNode }>\n Consumer: ConsumerExoticComponent<T>\n displayName?: string\n}\n\nexport interface ProviderExoticComponent<P> {\n $$typeof: typeof REACT_PROVIDER_TYPE\n _context: Context<any>\n (props: P): ReactElement\n}\n\nexport interface ConsumerExoticComponent<T> {\n $$typeof: typeof REACT_CONSUMER_TYPE\n _context: Context<T>\n (props: { children: (value: T) => ReactNode }): ReactElement\n}\n\nexport function createContext<T>(defaultValue: T): Context<T> {\n const context: Context<T> = {\n $$typeof: REACT_CONTEXT_TYPE,\n _currentValue: defaultValue,\n } as Context<T>\n\n const Provider: any = function Provider(_props: any): any {\n if (process.env.NODE_ENV !== 'production') {\n throw new Error('Provider components are handled by the renderer.')\n }\n throw new Error()\n }\n Provider.$$typeof = REACT_PROVIDER_TYPE\n Provider._context = context\n\n const Consumer: any = function Consumer(props: { children: (v: T) => any }): any {\n return props.children(useContext(context))\n }\n Consumer.$$typeof = REACT_CONSUMER_TYPE\n Consumer._context = context\n\n context.Provider = Provider\n context.Consumer = Consumer\n\n return context\n}\n"],
5
- "mappings": ";AACA,SAAS,kBAAkB;AAEpB,IAAM,qBAAqB,uBAAO,IAAI,eAAe;AACrD,IAAM,sBAAsB,uBAAO,IAAI,gBAAgB;AACvD,IAAM,sBAAsB,uBAAO,IAAI,gBAAgB;AAsBvD,SAAS,cAAiB,cAA6B;AAC5D,QAAM,UAAsB;AAAA,IAC1B,UAAU;AAAA,IACV,eAAe;AAAA,EACjB;AAEA,QAAM,WAAgB,SAASA,UAAS,QAAkB;AACxD,QAAI,yBAAyB,cAAc;AACzC,YAAM,IAAI,MAAM,kDAAkD;AAAA,IACpE;AACA,UAAM,IAAI,MAAM;AAAA,EAClB;AACA,WAAS,WAAW;AACpB,WAAS,WAAW;AAEpB,QAAM,WAAgB,SAASC,UAAS,OAAyC;AAC/E,WAAO,MAAM,SAAS,WAAW,OAAO,CAAC;AAAA,EAC3C;AACA,WAAS,WAAW;AACpB,WAAS,WAAW;AAEpB,UAAQ,WAAW;AACnB,UAAQ,WAAW;AAEnB,SAAO;AACT;",
6
- "names": ["Provider", "Consumer"]
4
+ "sourcesContent": ["import type { ReactElement, ReactNode } from '../core'\nimport { useContext } from './hooks'\n\nexport const REACT_CONTEXT_TYPE = Symbol.for('react.context')\nexport const REACT_PROVIDER_TYPE = Symbol.for('react.provider')\nexport const REACT_CONSUMER_TYPE = Symbol.for('react.consumer')\n\nexport interface Context<T> {\n $$typeof: typeof REACT_CONTEXT_TYPE\n _context: Context<T>\n _currentValue: T\n Provider: ProviderExoticComponent<{ value: T; children?: ReactNode }>\n Consumer: ConsumerExoticComponent<T>\n displayName?: string\n (props: { value: T; children?: ReactNode }): ReactElement\n}\n\nexport interface ProviderExoticComponent<P> {\n $$typeof: typeof REACT_CONTEXT_TYPE | typeof REACT_PROVIDER_TYPE\n _context: Context<any>\n (props: P): ReactElement\n}\n\nexport interface ConsumerExoticComponent<T> {\n $$typeof: typeof REACT_CONSUMER_TYPE\n _context: Context<T>\n (props: { children: (value: T) => ReactNode }): ReactElement\n}\n\nexport function createContext<T>(defaultValue: T): Context<T> {\n const context: Context<T> = {\n $$typeof: REACT_CONTEXT_TYPE,\n _currentValue: defaultValue,\n } as Context<T>\n\n const Consumer: any = function Consumer(props: { children: (v: T) => any }): any {\n return props.children(useContext(context))\n }\n Consumer.$$typeof = REACT_CONSUMER_TYPE\n Consumer._context = context\n\n context.Provider = context._context = context\n context.Consumer = Consumer\n\n return context\n}\n"],
5
+ "mappings": ";AACA,SAAS,kBAAkB;AAEpB,IAAM,qBAAqB,uBAAO,IAAI,eAAe;AACrD,IAAM,sBAAsB,uBAAO,IAAI,gBAAgB;AACvD,IAAM,sBAAsB,uBAAO,IAAI,gBAAgB;AAwBvD,SAAS,cAAiB,cAA6B;AAC5D,QAAM,UAAsB;AAAA,IAC1B,UAAU;AAAA,IACV,eAAe;AAAA,EACjB;AAEA,QAAM,WAAgB,SAASA,UAAS,OAAyC;AAC/E,WAAO,MAAM,SAAS,WAAW,OAAO,CAAC;AAAA,EAC3C;AACA,WAAS,WAAW;AACpB,WAAS,WAAW;AAEpB,UAAQ,WAAW,QAAQ,WAAW;AACtC,UAAQ,WAAW;AAEnB,SAAO;AACT;",
6
+ "names": ["Consumer"]
7
7
  }
@@ -5,16 +5,13 @@ import {
5
5
  REACT_FRAGMENT_TYPE
6
6
  } from "../core/index.js";
7
7
  var Fragment = REACT_FRAGMENT_TYPE;
8
- var RESERVED_PROPS = { key: 1, ref: 1, __self: 1, __source: 1 };
9
8
  function createElement(type, config, ...children) {
10
9
  let key = null;
11
- let ref = null;
12
10
  const props = {};
13
11
  if (config != null) {
14
12
  if (config.key !== void 0 && config.key !== null) key = "" + config.key;
15
- if (config.ref !== void 0) ref = config.ref;
16
13
  for (const k in config) {
17
- if (!RESERVED_PROPS[k] && Object.prototype.hasOwnProperty.call(config, k)) {
14
+ if (k !== "key" && k !== "__self" && k !== "__source" && Object.prototype.hasOwnProperty.call(config, k)) {
18
15
  props[k] = config[k];
19
16
  }
20
17
  }
@@ -27,24 +24,23 @@ function createElement(type, config, ...children) {
27
24
  if (props[k] === void 0) props[k] = dp[k];
28
25
  }
29
26
  }
30
- return { $$typeof: REACT_ELEMENT_TYPE, type, key, ref, props };
27
+ return { $$typeof: REACT_ELEMENT_TYPE, type, key, ref: props.ref ?? null, props };
31
28
  }
32
29
  function cloneElement(element, config, ...children) {
33
30
  let key = element.key;
34
- let ref = element.ref;
35
31
  const props = { ...element.props };
36
32
  if (config != null) {
37
- if (config.ref !== void 0) ref = config.ref;
38
33
  if (config.key !== void 0) key = "" + config.key;
39
34
  const defaultProps = element.type?.defaultProps;
40
35
  for (const k in config) {
41
- if (RESERVED_PROPS[k] || !Object.prototype.hasOwnProperty.call(config, k)) continue;
36
+ if (k === "key" || k === "__self" || k === "__source" || !Object.prototype.hasOwnProperty.call(config, k)) continue;
37
+ if (k === "ref" && config.ref === void 0) continue;
42
38
  props[k] = config[k] === void 0 && defaultProps ? defaultProps[k] : config[k];
43
39
  }
44
40
  }
45
41
  if (children.length === 1) props.children = children[0];
46
42
  else if (children.length > 1) props.children = children;
47
- return { $$typeof: REACT_ELEMENT_TYPE, type: element.type, key, ref, props };
43
+ return { $$typeof: REACT_ELEMENT_TYPE, type: element.type, key, ref: props.ref === void 0 ? element.ref : props.ref, props };
48
44
  }
49
45
  function isValidElement(obj) {
50
46
  if (typeof obj !== "object" || obj === null) return false;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/react/element.ts"],
4
- "sourcesContent": ["import {\n REACT_ELEMENT_TYPE,\n REACT_LEGACY_ELEMENT_TYPE,\n REACT_FRAGMENT_TYPE,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from '../core'\nimport type { FragmentInstance } from '../dom/fragment-instance'\n\nexport const Fragment = REACT_FRAGMENT_TYPE as unknown as (props: {\n children?: ReactNode\n key?: string | number\n ref?: Ref<FragmentInstance>\n}) => ReactElement\n\nconst RESERVED_PROPS: Record<string, 1> = { key: 1, ref: 1, __self: 1, __source: 1 }\n\nexport function createElement(\n type: any,\n config?: Record<string, any> | null,\n ...children: ReactNode[]\n): ReactElement {\n let key: string | null = null\n let ref: any = null\n const props: Record<string, any> = {}\n\n if (config != null) {\n if (config.key !== undefined && config.key !== null) key = '' + config.key\n if (config.ref !== undefined) ref = config.ref\n for (const k in config) {\n if (!RESERVED_PROPS[k] && Object.prototype.hasOwnProperty.call(config, k)) {\n props[k] = config[k]\n }\n }\n }\n\n if (children.length === 1) props.children = children[0]\n else if (children.length > 1) props.children = children\n\n if (type && type.defaultProps) {\n const dp = type.defaultProps\n for (const k in dp) {\n if (props[k] === undefined) props[k] = dp[k]\n }\n }\n\n return { $$typeof: REACT_ELEMENT_TYPE, type, key, ref, props }\n}\n\nexport function cloneElement(\n element: ReactElement,\n config?: Record<string, any> | null,\n ...children: ReactNode[]\n): ReactElement {\n let key = element.key\n let ref = element.ref\n const props = { ...element.props }\n\n if (config != null) {\n if (config.ref !== undefined) ref = config.ref\n if (config.key !== undefined) key = '' + config.key\n const defaultProps = element.type?.defaultProps\n for (const k in config) {\n if (RESERVED_PROPS[k] || !Object.prototype.hasOwnProperty.call(config, k)) continue\n props[k] = config[k] === undefined && defaultProps ? defaultProps[k] : config[k]\n }\n }\n\n if (children.length === 1) props.children = children[0]\n else if (children.length > 1) props.children = children\n\n return { $$typeof: REACT_ELEMENT_TYPE, type: element.type, key, ref, props }\n}\n\nexport function isValidElement(obj: any): obj is ReactElement {\n if (typeof obj !== 'object' || obj === null) return false\n const t = obj.$$typeof\n return t === REACT_ELEMENT_TYPE || t === REACT_LEGACY_ELEMENT_TYPE\n}\n\nexport function createRef<T = any>() {\n return { current: null as T | null }\n}\n"],
5
- "mappings": ";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AAGA,IAAM,WAAW;AAMxB,IAAM,iBAAoC,EAAE,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,UAAU,EAAE;AAE5E,SAAS,cACd,MACA,WACG,UACW;AACd,MAAI,MAAqB;AACzB,MAAI,MAAW;AACf,QAAM,QAA6B,CAAC;AAEpC,MAAI,UAAU,MAAM;AAClB,QAAI,OAAO,QAAQ,UAAa,OAAO,QAAQ,KAAM,OAAM,KAAK,OAAO;AACvE,QAAI,OAAO,QAAQ,OAAW,OAAM,OAAO;AAC3C,eAAW,KAAK,QAAQ;AACtB,UAAI,CAAC,eAAe,CAAC,KAAK,OAAO,UAAU,eAAe,KAAK,QAAQ,CAAC,GAAG;AACzE,cAAM,CAAC,IAAI,OAAO,CAAC;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,EAAG,OAAM,WAAW,SAAS,CAAC;AAAA,WAC7C,SAAS,SAAS,EAAG,OAAM,WAAW;AAE/C,MAAI,QAAQ,KAAK,cAAc;AAC7B,UAAM,KAAK,KAAK;AAChB,eAAW,KAAK,IAAI;AAClB,UAAI,MAAM,CAAC,MAAM,OAAW,OAAM,CAAC,IAAI,GAAG,CAAC;AAAA,IAC7C;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,oBAAoB,MAAM,KAAK,KAAK,MAAM;AAC/D;AAEO,SAAS,aACd,SACA,WACG,UACW;AACd,MAAI,MAAM,QAAQ;AAClB,MAAI,MAAM,QAAQ;AAClB,QAAM,QAAQ,EAAE,GAAG,QAAQ,MAAM;AAEjC,MAAI,UAAU,MAAM;AAClB,QAAI,OAAO,QAAQ,OAAW,OAAM,OAAO;AAC3C,QAAI,OAAO,QAAQ,OAAW,OAAM,KAAK,OAAO;AAChD,UAAM,eAAe,QAAQ,MAAM;AACnC,eAAW,KAAK,QAAQ;AACtB,UAAI,eAAe,CAAC,KAAK,CAAC,OAAO,UAAU,eAAe,KAAK,QAAQ,CAAC,EAAG;AAC3E,YAAM,CAAC,IAAI,OAAO,CAAC,MAAM,UAAa,eAAe,aAAa,CAAC,IAAI,OAAO,CAAC;AAAA,IACjF;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,EAAG,OAAM,WAAW,SAAS,CAAC;AAAA,WAC7C,SAAS,SAAS,EAAG,OAAM,WAAW;AAE/C,SAAO,EAAE,UAAU,oBAAoB,MAAM,QAAQ,MAAM,KAAK,KAAK,MAAM;AAC7E;AAEO,SAAS,eAAe,KAA+B;AAC5D,MAAI,OAAO,QAAQ,YAAY,QAAQ,KAAM,QAAO;AACpD,QAAM,IAAI,IAAI;AACd,SAAO,MAAM,sBAAsB,MAAM;AAC3C;AAEO,SAAS,YAAqB;AACnC,SAAO,EAAE,SAAS,KAAiB;AACrC;",
4
+ "sourcesContent": ["import {\n REACT_ELEMENT_TYPE,\n REACT_LEGACY_ELEMENT_TYPE,\n REACT_FRAGMENT_TYPE,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from '../core'\nimport type { FragmentInstance } from '../dom/fragment-instance'\n\nexport const Fragment = REACT_FRAGMENT_TYPE as unknown as (props: {\n children?: ReactNode\n key?: string | number\n ref?: Ref<FragmentInstance>\n}) => ReactElement\n\nexport function createElement(\n type: any,\n config?: Record<string, any> | null,\n ...children: ReactNode[]\n): ReactElement {\n let key: string | null = null\n const props: Record<string, any> = {}\n\n if (config != null) {\n if (config.key !== undefined && config.key !== null) key = '' + config.key\n for (const k in config) {\n if (k !== 'key' && k !== '__self' && k !== '__source' && Object.prototype.hasOwnProperty.call(config, k)) {\n props[k] = config[k]\n }\n }\n }\n\n if (children.length === 1) props.children = children[0]\n else if (children.length > 1) props.children = children\n\n if (type && type.defaultProps) {\n const dp = type.defaultProps\n for (const k in dp) {\n if (props[k] === undefined) props[k] = dp[k]\n }\n }\n\n return { $$typeof: REACT_ELEMENT_TYPE, type, key, ref: props.ref ?? null, props }\n}\n\nexport function cloneElement(\n element: ReactElement,\n config?: Record<string, any> | null,\n ...children: ReactNode[]\n): ReactElement {\n let key = element.key\n const props = { ...element.props }\n\n if (config != null) {\n if (config.key !== undefined) key = '' + config.key\n const defaultProps = element.type?.defaultProps\n for (const k in config) {\n if (k === 'key' || k === '__self' || k === '__source' || !Object.prototype.hasOwnProperty.call(config, k)) continue\n if (k === 'ref' && config.ref === undefined) continue\n props[k] = config[k] === undefined && defaultProps ? defaultProps[k] : config[k]\n }\n }\n\n if (children.length === 1) props.children = children[0]\n else if (children.length > 1) props.children = children\n\n return { $$typeof: REACT_ELEMENT_TYPE, type: element.type, key, ref: props.ref === undefined ? element.ref : props.ref, props }\n}\n\nexport function isValidElement(obj: any): obj is ReactElement {\n if (typeof obj !== 'object' || obj === null) return false\n const t = obj.$$typeof\n return t === REACT_ELEMENT_TYPE || t === REACT_LEGACY_ELEMENT_TYPE\n}\n\nexport function createRef<T = any>() {\n return { current: null as T | null }\n}\n"],
5
+ "mappings": ";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AAGA,IAAM,WAAW;AAMjB,SAAS,cACd,MACA,WACG,UACW;AACd,MAAI,MAAqB;AACzB,QAAM,QAA6B,CAAC;AAEpC,MAAI,UAAU,MAAM;AAClB,QAAI,OAAO,QAAQ,UAAa,OAAO,QAAQ,KAAM,OAAM,KAAK,OAAO;AACvE,eAAW,KAAK,QAAQ;AACtB,UAAI,MAAM,SAAS,MAAM,YAAY,MAAM,cAAc,OAAO,UAAU,eAAe,KAAK,QAAQ,CAAC,GAAG;AACxG,cAAM,CAAC,IAAI,OAAO,CAAC;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,EAAG,OAAM,WAAW,SAAS,CAAC;AAAA,WAC7C,SAAS,SAAS,EAAG,OAAM,WAAW;AAE/C,MAAI,QAAQ,KAAK,cAAc;AAC7B,UAAM,KAAK,KAAK;AAChB,eAAW,KAAK,IAAI;AAClB,UAAI,MAAM,CAAC,MAAM,OAAW,OAAM,CAAC,IAAI,GAAG,CAAC;AAAA,IAC7C;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,oBAAoB,MAAM,KAAK,KAAK,MAAM,OAAO,MAAM,MAAM;AAClF;AAEO,SAAS,aACd,SACA,WACG,UACW;AACd,MAAI,MAAM,QAAQ;AAClB,QAAM,QAAQ,EAAE,GAAG,QAAQ,MAAM;AAEjC,MAAI,UAAU,MAAM;AAClB,QAAI,OAAO,QAAQ,OAAW,OAAM,KAAK,OAAO;AAChD,UAAM,eAAe,QAAQ,MAAM;AACnC,eAAW,KAAK,QAAQ;AACtB,UAAI,MAAM,SAAS,MAAM,YAAY,MAAM,cAAc,CAAC,OAAO,UAAU,eAAe,KAAK,QAAQ,CAAC,EAAG;AAC3G,UAAI,MAAM,SAAS,OAAO,QAAQ,OAAW;AAC7C,YAAM,CAAC,IAAI,OAAO,CAAC,MAAM,UAAa,eAAe,aAAa,CAAC,IAAI,OAAO,CAAC;AAAA,IACjF;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,EAAG,OAAM,WAAW,SAAS,CAAC;AAAA,WAC7C,SAAS,SAAS,EAAG,OAAM,WAAW;AAE/C,SAAO,EAAE,UAAU,oBAAoB,MAAM,QAAQ,MAAM,KAAK,KAAK,MAAM,QAAQ,SAAY,QAAQ,MAAM,MAAM,KAAK,MAAM;AAChI;AAEO,SAAS,eAAe,KAA+B;AAC5D,MAAI,OAAO,QAAQ,YAAY,QAAQ,KAAM,QAAO;AACpD,QAAM,IAAI,IAAI;AACd,SAAO,MAAM,sBAAsB,MAAM;AAC3C;AAEO,SAAS,YAAqB;AACnC,SAAO,EAAE,SAAS,KAAiB;AACrC;",
6
6
  "names": []
7
7
  }
@@ -6,6 +6,7 @@ import {
6
6
  } from "../core/index.js";
7
7
  import {
8
8
  REACT_SUSPENSE_TYPE,
9
+ REACT_CONTEXT_TYPE,
9
10
  REACT_PROVIDER_TYPE,
10
11
  REACT_CONSUMER_TYPE,
11
12
  REACT_FORWARD_REF_TYPE,
@@ -92,6 +93,10 @@ function walkNode(node, opts) {
92
93
  function walkElement(el, opts) {
93
94
  const type = el.type;
94
95
  const props = el.props ?? {};
96
+ if (typeof type === "string") {
97
+ walkHost(type, props, opts);
98
+ return;
99
+ }
95
100
  if (type === REACT_FRAGMENT_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_PROFILER_TYPE) {
96
101
  walkNode(props.children, opts);
97
102
  return;
@@ -108,15 +113,11 @@ function walkElement(el, opts) {
108
113
  walkNode(props.children, opts);
109
114
  return;
110
115
  }
111
- if (typeof type === "string") {
112
- walkHost(type, props, opts);
113
- return;
114
- }
115
116
  const marker = type?.$$typeof;
116
117
  if (marker === REACT_PORTAL_TYPE) {
117
118
  return;
118
119
  }
119
- if (marker === REACT_PROVIDER_TYPE) {
120
+ if (marker === REACT_CONTEXT_TYPE || marker === REACT_PROVIDER_TYPE) {
120
121
  const ctx = type._context;
121
122
  pushContext(ctx, props.value);
122
123
  try {
@@ -127,10 +128,9 @@ function walkElement(el, opts) {
127
128
  return;
128
129
  }
129
130
  if (marker === REACT_CONSUMER_TYPE) {
130
- const ctx = type._context;
131
131
  const render = props.children;
132
132
  if (typeof render === "function") {
133
- walkNode(render(ctx._currentValue), opts);
133
+ walkNode(render(type._context._currentValue), opts);
134
134
  }
135
135
  return;
136
136
  }
@@ -148,15 +148,8 @@ function walkElement(el, opts) {
148
148
  }
149
149
  if (marker === REACT_LAZY_TYPE) {
150
150
  const { _payload, _init } = type;
151
- try {
152
- const resolved = _init(_payload);
153
- walkElement({ ...el, type: resolved }, opts);
154
- } catch (thenable) {
155
- if (isThenable(thenable)) {
156
- throw thenable;
157
- }
158
- throw thenable;
159
- }
151
+ const resolved = _init(_payload);
152
+ walkElement({ ...el, type: resolved }, opts);
160
153
  return;
161
154
  }
162
155
  if (typeof type === "function") {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/server/walk.ts"],
4
- "sourcesContent": ["import {\n REACT_ELEMENT_TYPE,\n REACT_LEGACY_ELEMENT_TYPE,\n REACT_FRAGMENT_TYPE,\n type ReactNode,\n type ReactElement,\n} from '../core'\nimport {\n REACT_SUSPENSE_TYPE,\n REACT_PROVIDER_TYPE,\n REACT_CONSUMER_TYPE,\n REACT_FORWARD_REF_TYPE,\n REACT_MEMO_TYPE,\n REACT_LAZY_TYPE,\n REACT_STRICT_MODE_TYPE,\n REACT_PROFILER_TYPE,\n REACT_PORTAL_TYPE,\n REACT_ACTIVITY_TYPE,\n REACT_VIEW_TRANSITION_TYPE,\n} from '../react'\nimport {\n attrToHtml,\n escapeText,\n escapeScript,\n VOID_ELEMENTS,\n RAW_TEXT_ELEMENTS,\n} from './escape'\nimport {\n pushContext,\n popContext,\n snapshotContexts,\n recordHostResource,\n currentSSRFrame,\n type ContextSnapshot,\n} from './dispatcher'\nimport { isBrowserError } from '../core/browser'\nimport { resourceKind } from '../core/resource-hints'\nimport type { ResourceScope } from './resource-hints'\n\nexport interface ServerErrorInfo {\n componentStack: string\n}\n\nexport type BrowserBailoutCallback = (error: Error, errorInfo: ServerErrorInfo) => void\n\nexport interface SuspendedBoundary {\n id: number\n fallbackHTML: string\n children: ReactNode\n thenable: Promise<any>\n contextSnapshot: ContextSnapshot\n componentStack: string\n}\n\nexport interface WalkOptions {\n emit: (chunk: string) => void\n onHead?: () => void\n onSuspend?: ((boundary: SuspendedBoundary) => void) | undefined\n onBrowserBailout?: BrowserBailoutCallback | undefined\n componentStack?: string | undefined\n thrownInfo?: { componentStack?: string | undefined }\n nextBoundaryId: () => number\n bootstrapped?: boolean | undefined\n isBoundaryResolution?: boolean | undefined\n isSvg?: boolean | undefined\n resourceScope?: ResourceScope | undefined\n /**\n * Tracks whether the most recent emission within the *current text flow*\n * ended with a text node. When the next emission is also text, we emit a\n * `<!-- -->` separator so the browser's HTML parser doesn't merge them\n * into a single text node \u2014 required for hydration to line up text\n * boundaries with the React tree. Reset to `false` whenever we enter a\n * new host element (`<tag>` opens a fresh text flow).\n */\n textState?: { lastWasText: boolean }\n}\n\n/**\n * Synchronously walk a React node and emit HTML string pieces to `opts.emit`.\n * Suspended boundaries are emitted as fallbacks with marker IDs; if `opts.onSuspend`\n * is provided, the suspension is recorded for later streaming.\n */\nexport function walk(node: ReactNode, opts: WalkOptions): void {\n // Seed a text state if the caller didn't provide one so the separator logic\n // is active for the whole tree.\n if (!opts.textState) opts = { ...opts, textState: { lastWasText: false } }\n walkNode(node, opts)\n}\n\n// --- <select> selection context ----------------------------------------------\n// Stack of active select values (or `undefined` when the current select has\n// no controlled value). `<option>` walks read the top of stack to decide\n// whether to emit `selected=\"\"`.\nconst selectValueStack: unknown[] = []\nfunction pushSelectContext(value: unknown): void {\n selectValueStack.push(value)\n}\nfunction popSelectContext(): void {\n selectValueStack.pop()\n}\nfunction currentSelectValue(): unknown {\n return selectValueStack.length ? selectValueStack[selectValueStack.length - 1] : undefined\n}\n\nfunction optionChildText(children: unknown): string {\n // `<option>Text</option>` \u2014 if no `value` prop, the option's value is its\n // flat string/number child content. Matches DOM semantics (`option.value`\n // defaults to `textContent` when no attribute is set).\n if (children == null) return ''\n if (typeof children === 'string' || typeof children === 'number') return '' + children\n if (Array.isArray(children)) return children.map(optionChildText).join('')\n return ''\n}\n\nfunction emitText(text: string, opts: WalkOptions): void {\n // Empty string renders no text node and doesn't start/extend a text flow \u2014\n // skip entirely so sibling text isn't separated by a stray `<!-- -->`.\n if (text === '') return\n if (opts.textState?.lastWasText) opts.emit('<!-- -->')\n opts.emit(escapeText(text))\n if (opts.textState) opts.textState.lastWasText = true\n}\n\nfunction walkNode(node: ReactNode, opts: WalkOptions): void {\n if (node == null || node === false || node === true) return\n\n if (typeof node === 'string') {\n emitText(node, opts)\n return\n }\n if (typeof node === 'number') {\n emitText(String(node), opts)\n return\n }\n if (Array.isArray(node)) {\n for (const c of node) walkNode(c, opts)\n return\n }\n if (typeof (node as any)[Symbol.iterator] === 'function') {\n for (const item of node as Iterable<ReactNode>) walkNode(item, opts)\n return\n }\n\n if (typeof node !== 'object') return\n const t = (node as any).$$typeof\n\n // Raw React.lazy in the tree (RSC Flight encodes 'use client' components \u2014\n // CodeBlock, CodeExplorer, etc. \u2014 as bare Lazy objects directly in the\n // tree, not wrapped in REACT_ELEMENT_TYPE). SSR previously dropped these\n // here, so code snippets never made it into the server HTML. The RSC\n // decoder server-side awaits payloads before rendering, so status is\n // 'fulfilled' and `_init()` returns the resolved element synchronously.\n // If still pending (shouldn't happen post-awaitLazyElements), throw the\n // thenable so streaming SSR suspends the current boundary and retries.\n if (t === REACT_LAZY_TYPE) {\n const lazy = node as any\n const resolved = lazy._init(lazy._payload)\n walkNode(resolved, opts)\n return\n }\n\n if (t !== REACT_ELEMENT_TYPE && t !== REACT_LEGACY_ELEMENT_TYPE) return\n\n const el = node as ReactElement\n walkElement(el, opts)\n}\n\nfunction walkElement(el: ReactElement, opts: WalkOptions): void {\n const type = el.type\n const props = el.props ?? {}\n\n if (type === REACT_FRAGMENT_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_PROFILER_TYPE) {\n walkNode(props.children, opts)\n return\n }\n\n if (type === REACT_SUSPENSE_TYPE) {\n walkSuspense(props, opts)\n return\n }\n\n if (type === REACT_ACTIVITY_TYPE) {\n if (props.mode !== 'hidden') walkNode(props.children, opts)\n return\n }\n if (type === REACT_VIEW_TRANSITION_TYPE) {\n walkNode(props.children, opts)\n return\n }\n\n if (typeof type === 'string') {\n walkHost(type, props, opts)\n return\n }\n\n const marker = (type as any)?.$$typeof\n\n if (marker === REACT_PORTAL_TYPE) {\n // Portals don't render to the main HTML output on the server.\n return\n }\n\n if (marker === REACT_PROVIDER_TYPE) {\n const ctx = (type as any)._context\n pushContext(ctx, props.value)\n try {\n walkNode(props.children, opts)\n } finally {\n popContext(ctx)\n }\n return\n }\n\n if (marker === REACT_CONSUMER_TYPE) {\n const ctx = (type as any)._context\n const render = props.children\n if (typeof render === 'function') {\n walkNode(render(ctx._currentValue), opts)\n }\n return\n }\n\n if (marker === REACT_FORWARD_REF_TYPE) {\n const render = (type as any).render\n const ref = (props as any).ref ?? null\n const { ref: _omit, ...rest } = props as any\n walkComponent(render, rest, opts, ref)\n return\n }\n\n if (marker === REACT_MEMO_TYPE) {\n const inner = (type as any).type\n walkElement({ ...el, type: inner } as ReactElement, opts)\n return\n }\n\n if (marker === REACT_LAZY_TYPE) {\n const { _payload, _init } = type as any\n try {\n const resolved = _init(_payload)\n walkElement({ ...el, type: resolved } as ReactElement, opts)\n } catch (thenable: any) {\n if (isThenable(thenable)) {\n // Suspend this point\n throw thenable\n }\n throw thenable\n }\n return\n }\n\n if (typeof type === 'function') {\n walkComponent(type, props, opts)\n return\n }\n}\n\nfunction walkHost(\n tag: string,\n props: Record<string, any>,\n opts: WalkOptions,\n): void {\n const isSvg = opts.isSvg || tag === 'svg'\n if (!isSvg && resourceKind(tag, props) && recordHostResource(tag, props, opts.resourceScope)) return\n // <textarea value=\"...\"> serializes its value as a TEXT CHILD, not an\n // attribute. `defaultValue` is the fallback when `value` is absent. This\n // matches React and the HTML spec \u2014 `<textarea value=\"x\">` is not valid\n // HTML; the value is the element's textContent.\n const isTextarea = tag === 'textarea'\n const textareaValue = isTextarea\n ? props.value != null\n ? props.value\n : props.defaultValue\n : undefined\n\n // <input defaultValue=\"...\"> should parse with that value \u2014 emit it as a\n // `value` attribute. Similarly `defaultChecked` becomes `checked`. This\n // keeps hydration consistent: the browser parser sees the initial value,\n // and on client commit our setProp seeds `.defaultValue`/`.defaultChecked`\n // without stomping the user-typed value.\n const isInput = tag === 'input'\n const inputValueAttr =\n isInput && props.value == null && props.defaultValue != null\n ? props.defaultValue\n : undefined\n const inputCheckedAttr =\n isInput && props.checked == null && props.defaultChecked != null\n ? props.defaultChecked\n : undefined\n\n // <select value=\"...\"> does NOT become an attribute on `<select>` \u2014 the\n // HTML spec has no such attribute. React resolves the selection by stamping\n // `selected` on the matching `<option>` children during render. Stash the\n // target value(s) on the walk state and the child `<option>` walk reads it.\n const isSelect = tag === 'select'\n if (isSelect) {\n const val = props.value != null ? props.value : props.defaultValue\n pushSelectContext(val)\n }\n const isOption = tag === 'option'\n try {\n\n // Prepend the HTML5 doctype to the stream when rendering an <html> root.\n // Without it the browser parses the document in quirks mode, which breaks\n // CSS sizing (documentElement.clientHeight returns the content height, not\n // the viewport) \u2014 and Floating-UI-based libraries (Radix dropdowns etc.)\n // then compute off-screen positions for overlays.\n if (tag === 'html') opts.emit('<!DOCTYPE html>')\n\n opts.emit('<' + tag)\n for (const k in props) {\n if (isTextarea && (k === 'value' || k === 'defaultValue')) continue\n if (isInput && (k === 'defaultValue' || k === 'defaultChecked')) continue\n if (isSelect && (k === 'value' || k === 'defaultValue')) continue\n if (isOption && k === 'selected') continue\n opts.emit(attrToHtml(k, props[k], isSvg))\n }\n if (inputValueAttr !== undefined) {\n opts.emit(attrToHtml('value', inputValueAttr, isSvg))\n }\n if (inputCheckedAttr !== undefined) {\n opts.emit(attrToHtml('checked', inputCheckedAttr, isSvg))\n }\n if (isOption) {\n const selectVal = currentSelectValue()\n if (selectVal !== undefined) {\n const optionValue =\n props.value != null ? props.value : optionChildText(props.children)\n const matches = Array.isArray(selectVal)\n ? selectVal.some((v) => '' + v === '' + optionValue)\n : '' + selectVal === '' + optionValue\n if (matches) opts.emit(' selected=\"\"')\n } else if (props.selected) {\n opts.emit(' selected=\"\"')\n }\n }\n\n if (VOID_ELEMENTS.has(tag)) {\n opts.emit('/>')\n if (opts.textState) opts.textState.lastWasText = false\n return\n }\n opts.emit('>')\n if (tag === 'head') opts.onHead?.()\n // Opening a host element starts a fresh text flow context for its children.\n // Children's text separator tracking is independent of the outer context.\n const parentTextState = opts.textState\n const childOpts: WalkOptions = {\n ...opts,\n isSvg: isSvg && tag !== 'foreignObject',\n textState: { lastWasText: false },\n }\n\n if (tag === 'html' && !hasHeadChild(props.children)) {\n opts.emit('<head>')\n opts.onHead?.()\n opts.emit('</head>')\n }\n\n const dangerouslyHtml = props.dangerouslySetInnerHTML?.__html\n\n if (isTextarea && textareaValue != null) {\n opts.emit(escapeText(String(textareaValue)))\n opts.emit(`</${tag}>`)\n if (parentTextState) parentTextState.lastWasText = false\n return\n }\n\n if (RAW_TEXT_ELEMENTS.has(tag)) {\n // script/style: raw-text. React allows either a string/number child or\n // dangerouslySetInnerHTML \u2014 some libs (Start's Scripts) use the latter.\n if (dangerouslyHtml != null) {\n opts.emit(escapeScript(String(dangerouslyHtml)))\n } else {\n const children = props.children\n if (typeof children === 'string' || typeof children === 'number') {\n opts.emit(escapeScript(String(children)))\n } else if (Array.isArray(children)) {\n opts.emit(escapeScript(children.filter((c) => c != null).join('')))\n }\n }\n opts.emit(`</${tag}>`)\n if (parentTextState) parentTextState.lastWasText = false\n return\n }\n\n if (dangerouslyHtml != null) {\n opts.emit(String(dangerouslyHtml))\n } else {\n walkNode(props.children, childOpts)\n }\n opts.emit(`</${tag}>`)\n // Host element closing resets outer flow \u2014 next sibling text starts fresh.\n if (parentTextState) parentTextState.lastWasText = false\n } finally {\n if (isSelect) popSelectContext()\n }\n}\n\nfunction hasHeadChild(children: unknown): boolean {\n if (children == null || typeof children === 'boolean') return false\n if (Array.isArray(children)) return children.some(hasHeadChild)\n if (typeof children !== 'string' && isIterable(children)) {\n for (const child of children as Iterable<unknown>) {\n if (hasHeadChild(child)) return true\n }\n return false\n }\n return isElementOfType(children, 'head')\n}\n\nfunction isElementOfType(value: unknown, type: string): value is ReactElement {\n const marker = (value as ReactElement | null)?.$$typeof as unknown\n return (\n !!value &&\n typeof value === 'object' &&\n (marker === REACT_ELEMENT_TYPE || marker === REACT_LEGACY_ELEMENT_TYPE) &&\n (value as ReactElement).type === type\n )\n}\n\nfunction isIterable(value: unknown): value is Iterable<unknown> {\n return !!value && typeof (value as { [Symbol.iterator]?: unknown })[Symbol.iterator] === 'function'\n}\n\nfunction walkComponent(\n fn: Function,\n props: Record<string, any>,\n opts: WalkOptions,\n ref?: unknown,\n): void {\n if (opts.onBrowserBailout) {\n opts = { ...opts, componentStack: `\\n at ${(fn as any).displayName || fn.name || 'Anonymous'}${opts.componentStack || ''}` }\n }\n try {\n if ((fn as any).prototype?.isReactComponent) {\n const ctxType = (fn as any).contextType\n const ctxValue = ctxType ? ctxType._currentValue : undefined\n const instance = new (fn as any)(props, ctxValue)\n instance.props = props\n instance.context = ctxValue\n if ((fn as any).getDerivedStateFromProps) {\n const d = (fn as any).getDerivedStateFromProps(props, instance.state)\n if (d) instance.state = { ...instance.state, ...d }\n }\n walkNode(instance.render(), opts)\n return\n }\n const rendered = (fn as any)(props, ref)\n walkNode(rendered, opts)\n } catch (error) {\n if (opts.thrownInfo && !opts.thrownInfo.componentStack) opts.thrownInfo.componentStack = opts.componentStack\n if (isBrowserError(error) && !(error as any).componentStack) {\n Object.defineProperty(error, 'componentStack', { value: opts.componentStack })\n }\n throw error\n }\n}\n\nfunction walkSuspense(\n props: Record<string, any>,\n opts: WalkOptions,\n): void {\n const id = opts.nextBoundaryId()\n // Snapshot contexts BEFORE attempting children, so if a descendant suspends\n // we can replay the same provider stack when re-rendering the boundary.\n const contextSnapshot = snapshotContexts()\n\n // Try to render the children synchronously. If a thenable is thrown,\n // record the boundary and emit the fallback.\n const childParts: string[] = []\n const nested: SuspendedBoundary[] = []\n const thrownInfo: { componentStack?: string | undefined } = {}\n const childEmit = (s: string) => childParts.push(s)\n const resourceScope: ResourceScope | undefined = currentSSRFrame().shellFlushed ? {} : undefined\n try {\n walkNode(props.children, {\n ...opts,\n resourceScope,\n thrownInfo,\n emit: childEmit,\n onSuspend: opts.onSuspend ? (boundary) => nested.push(boundary) : undefined,\n nextBoundaryId: opts.nextBoundaryId,\n })\n } catch (thenable: any) {\n nested.length = 0\n if (isThenable(thenable) || isBrowserError(thenable)) {\n const fallbackParts: string[] = []\n walkNode(props.fallback, {\n ...opts,\n emit: (s) => fallbackParts.push(s),\n onSuspend: opts.onSuspend ? (boundary) => nested.push(boundary) : undefined,\n nextBoundaryId: opts.nextBoundaryId,\n })\n if (isBrowserError(thenable)) {\n opts.onBrowserBailout?.(thenable, { componentStack: (thenable as any).componentStack || opts.componentStack || '' })\n opts.emit(`<!--$!${id}-->${fallbackParts.join('')}<!--/$-->`)\n for (const boundary of nested) opts.onSuspend?.(boundary)\n return\n }\n emitBoundary(opts, id, fallbackParts.join(''))\n for (const boundary of nested) opts.onSuspend?.(boundary)\n\n if (opts.onSuspend) {\n opts.onSuspend({\n id,\n fallbackHTML: fallbackParts.join(''),\n children: props.children,\n thenable,\n contextSnapshot,\n componentStack: thrownInfo.componentStack || opts.componentStack || '',\n })\n }\n return\n }\n throw thenable\n }\n\n if (resourceScope) currentSSRFrame().resources?.mergeScope(resourceScope, opts.resourceScope)\n\n // Children rendered fully \u2014 emit them wrapped in resolved-boundary markers\n // (`<!--$N-->` / `<!--/$-->`). Without markers, the client hydrator has no\n // way to know this subtree is inside a Suspense, so if the client version\n // of a descendant (e.g. `React.lazy`) suspends it can't pinpoint which DOM\n // range to adopt on resolve \u2014 it creates fresh DOM next to the SSR content,\n // producing visible duplicates (e.g. double navbar logos). Markers let the\n // client treat this as a resolved boundary and hydrate in-place.\n opts.emit(`<!--$${id}-->`)\n opts.emit(childParts.join(''))\n opts.emit(`<!--/$-->`)\n for (const boundary of nested) opts.onSuspend?.(boundary)\n}\n\nfunction emitBoundary(opts: WalkOptions, id: number, fallbackHTML: string): void {\n // Visible div wrapper so the fallback UI shows; B: id lets $RC locate it on\n // reveal. The leading/trailing comments let hydration detect a pending\n // boundary and register a reveal callback.\n opts.emit(`<!--$?${id}--><div id=\"B:${id}\">`)\n opts.emit(fallbackHTML)\n opts.emit(`</div><!--/$-->`)\n}\n\nfunction isThenable(x: any): x is Promise<any> {\n return x != null && typeof x.then === 'function'\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n REACT_ELEMENT_TYPE,\n REACT_LEGACY_ELEMENT_TYPE,\n REACT_FRAGMENT_TYPE,\n type ReactNode,\n type ReactElement,\n} from '../core'\nimport {\n REACT_SUSPENSE_TYPE,\n REACT_CONTEXT_TYPE,\n REACT_PROVIDER_TYPE,\n REACT_CONSUMER_TYPE,\n REACT_FORWARD_REF_TYPE,\n REACT_MEMO_TYPE,\n REACT_LAZY_TYPE,\n REACT_STRICT_MODE_TYPE,\n REACT_PROFILER_TYPE,\n REACT_PORTAL_TYPE,\n REACT_ACTIVITY_TYPE,\n REACT_VIEW_TRANSITION_TYPE,\n} from '../react'\nimport {\n attrToHtml,\n escapeText,\n escapeScript,\n VOID_ELEMENTS,\n RAW_TEXT_ELEMENTS,\n} from './escape'\nimport {\n pushContext,\n popContext,\n snapshotContexts,\n recordHostResource,\n currentSSRFrame,\n type ContextSnapshot,\n} from './dispatcher'\nimport { isBrowserError } from '../core/browser'\nimport { resourceKind } from '../core/resource-hints'\nimport type { ResourceScope } from './resource-hints'\n\nexport interface ServerErrorInfo {\n componentStack: string\n}\n\nexport type BrowserBailoutCallback = (error: Error, errorInfo: ServerErrorInfo) => void\n\nexport interface SuspendedBoundary {\n id: number\n fallbackHTML: string\n children: ReactNode\n thenable: Promise<any>\n contextSnapshot: ContextSnapshot\n componentStack: string\n}\n\nexport interface WalkOptions {\n emit: (chunk: string) => void\n onHead?: () => void\n onSuspend?: ((boundary: SuspendedBoundary) => void) | undefined\n onBrowserBailout?: BrowserBailoutCallback | undefined\n componentStack?: string | undefined\n thrownInfo?: { componentStack?: string | undefined }\n nextBoundaryId: () => number\n bootstrapped?: boolean | undefined\n isBoundaryResolution?: boolean | undefined\n isSvg?: boolean | undefined\n resourceScope?: ResourceScope | undefined\n /**\n * Tracks whether the most recent emission within the *current text flow*\n * ended with a text node. When the next emission is also text, we emit a\n * `<!-- -->` separator so the browser's HTML parser doesn't merge them\n * into a single text node \u2014 required for hydration to line up text\n * boundaries with the React tree. Reset to `false` whenever we enter a\n * new host element (`<tag>` opens a fresh text flow).\n */\n textState?: { lastWasText: boolean }\n}\n\n/**\n * Synchronously walk a React node and emit HTML string pieces to `opts.emit`.\n * Suspended boundaries are emitted as fallbacks with marker IDs; if `opts.onSuspend`\n * is provided, the suspension is recorded for later streaming.\n */\nexport function walk(node: ReactNode, opts: WalkOptions): void {\n // Seed a text state if the caller didn't provide one so the separator logic\n // is active for the whole tree.\n if (!opts.textState) opts = { ...opts, textState: { lastWasText: false } }\n walkNode(node, opts)\n}\n\n// --- <select> selection context ----------------------------------------------\n// Stack of active select values (or `undefined` when the current select has\n// no controlled value). `<option>` walks read the top of stack to decide\n// whether to emit `selected=\"\"`.\nconst selectValueStack: unknown[] = []\nfunction pushSelectContext(value: unknown): void {\n selectValueStack.push(value)\n}\nfunction popSelectContext(): void {\n selectValueStack.pop()\n}\nfunction currentSelectValue(): unknown {\n return selectValueStack.length ? selectValueStack[selectValueStack.length - 1] : undefined\n}\n\nfunction optionChildText(children: unknown): string {\n // `<option>Text</option>` \u2014 if no `value` prop, the option's value is its\n // flat string/number child content. Matches DOM semantics (`option.value`\n // defaults to `textContent` when no attribute is set).\n if (children == null) return ''\n if (typeof children === 'string' || typeof children === 'number') return '' + children\n if (Array.isArray(children)) return children.map(optionChildText).join('')\n return ''\n}\n\nfunction emitText(text: string, opts: WalkOptions): void {\n // Empty string renders no text node and doesn't start/extend a text flow \u2014\n // skip entirely so sibling text isn't separated by a stray `<!-- -->`.\n if (text === '') return\n if (opts.textState?.lastWasText) opts.emit('<!-- -->')\n opts.emit(escapeText(text))\n if (opts.textState) opts.textState.lastWasText = true\n}\n\nfunction walkNode(node: ReactNode, opts: WalkOptions): void {\n if (node == null || node === false || node === true) return\n\n if (typeof node === 'string') {\n emitText(node, opts)\n return\n }\n if (typeof node === 'number') {\n emitText(String(node), opts)\n return\n }\n if (Array.isArray(node)) {\n for (const c of node) walkNode(c, opts)\n return\n }\n if (typeof (node as any)[Symbol.iterator] === 'function') {\n for (const item of node as Iterable<ReactNode>) walkNode(item, opts)\n return\n }\n\n if (typeof node !== 'object') return\n const t = (node as any).$$typeof\n\n // Raw React.lazy in the tree (RSC Flight encodes 'use client' components \u2014\n // CodeBlock, CodeExplorer, etc. \u2014 as bare Lazy objects directly in the\n // tree, not wrapped in REACT_ELEMENT_TYPE). SSR previously dropped these\n // here, so code snippets never made it into the server HTML. The RSC\n // decoder server-side awaits payloads before rendering, so status is\n // 'fulfilled' and `_init()` returns the resolved element synchronously.\n // If still pending (shouldn't happen post-awaitLazyElements), throw the\n // thenable so streaming SSR suspends the current boundary and retries.\n if (t === REACT_LAZY_TYPE) {\n const lazy = node as any\n const resolved = lazy._init(lazy._payload)\n walkNode(resolved, opts)\n return\n }\n\n if (t !== REACT_ELEMENT_TYPE && t !== REACT_LEGACY_ELEMENT_TYPE) return\n\n const el = node as ReactElement\n walkElement(el, opts)\n}\n\nfunction walkElement(el: ReactElement, opts: WalkOptions): void {\n const type = el.type\n const props = el.props ?? {}\n\n if (typeof type === 'string') {\n walkHost(type, props, opts)\n return\n }\n\n if (type === REACT_FRAGMENT_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_PROFILER_TYPE) {\n walkNode(props.children, opts)\n return\n }\n\n if (type === REACT_SUSPENSE_TYPE) {\n walkSuspense(props, opts)\n return\n }\n\n if (type === REACT_ACTIVITY_TYPE) {\n if (props.mode !== 'hidden') walkNode(props.children, opts)\n return\n }\n if (type === REACT_VIEW_TRANSITION_TYPE) {\n walkNode(props.children, opts)\n return\n }\n\n const marker = (type as any)?.$$typeof\n\n if (marker === REACT_PORTAL_TYPE) {\n // Portals don't render to the main HTML output on the server.\n return\n }\n\n if (marker === REACT_CONTEXT_TYPE || marker === REACT_PROVIDER_TYPE) {\n const ctx = (type as any)._context\n pushContext(ctx, props.value)\n try {\n walkNode(props.children, opts)\n } finally {\n popContext(ctx)\n }\n return\n }\n\n if (marker === REACT_CONSUMER_TYPE) {\n const render = props.children\n if (typeof render === 'function') {\n walkNode(render((type as any)._context._currentValue), opts)\n }\n return\n }\n\n if (marker === REACT_FORWARD_REF_TYPE) {\n const render = (type as any).render\n const ref = (props as any).ref ?? null\n const { ref: _omit, ...rest } = props as any\n walkComponent(render, rest, opts, ref)\n return\n }\n\n if (marker === REACT_MEMO_TYPE) {\n const inner = (type as any).type\n walkElement({ ...el, type: inner } as ReactElement, opts)\n return\n }\n\n if (marker === REACT_LAZY_TYPE) {\n const { _payload, _init } = type as any\n const resolved = _init(_payload)\n walkElement({ ...el, type: resolved } as ReactElement, opts)\n return\n }\n\n if (typeof type === 'function') {\n walkComponent(type, props, opts)\n return\n }\n}\n\nfunction walkHost(\n tag: string,\n props: Record<string, any>,\n opts: WalkOptions,\n): void {\n const isSvg = opts.isSvg || tag === 'svg'\n if (!isSvg && resourceKind(tag, props) && recordHostResource(tag, props, opts.resourceScope)) return\n // <textarea value=\"...\"> serializes its value as a TEXT CHILD, not an\n // attribute. `defaultValue` is the fallback when `value` is absent. This\n // matches React and the HTML spec \u2014 `<textarea value=\"x\">` is not valid\n // HTML; the value is the element's textContent.\n const isTextarea = tag === 'textarea'\n const textareaValue = isTextarea\n ? props.value != null\n ? props.value\n : props.defaultValue\n : undefined\n\n // <input defaultValue=\"...\"> should parse with that value \u2014 emit it as a\n // `value` attribute. Similarly `defaultChecked` becomes `checked`. This\n // keeps hydration consistent: the browser parser sees the initial value,\n // and on client commit our setProp seeds `.defaultValue`/`.defaultChecked`\n // without stomping the user-typed value.\n const isInput = tag === 'input'\n const inputValueAttr =\n isInput && props.value == null && props.defaultValue != null\n ? props.defaultValue\n : undefined\n const inputCheckedAttr =\n isInput && props.checked == null && props.defaultChecked != null\n ? props.defaultChecked\n : undefined\n\n // <select value=\"...\"> does NOT become an attribute on `<select>` \u2014 the\n // HTML spec has no such attribute. React resolves the selection by stamping\n // `selected` on the matching `<option>` children during render. Stash the\n // target value(s) on the walk state and the child `<option>` walk reads it.\n const isSelect = tag === 'select'\n if (isSelect) {\n const val = props.value != null ? props.value : props.defaultValue\n pushSelectContext(val)\n }\n const isOption = tag === 'option'\n try {\n\n // Prepend the HTML5 doctype to the stream when rendering an <html> root.\n // Without it the browser parses the document in quirks mode, which breaks\n // CSS sizing (documentElement.clientHeight returns the content height, not\n // the viewport) \u2014 and Floating-UI-based libraries (Radix dropdowns etc.)\n // then compute off-screen positions for overlays.\n if (tag === 'html') opts.emit('<!DOCTYPE html>')\n\n opts.emit('<' + tag)\n for (const k in props) {\n if (isTextarea && (k === 'value' || k === 'defaultValue')) continue\n if (isInput && (k === 'defaultValue' || k === 'defaultChecked')) continue\n if (isSelect && (k === 'value' || k === 'defaultValue')) continue\n if (isOption && k === 'selected') continue\n opts.emit(attrToHtml(k, props[k], isSvg))\n }\n if (inputValueAttr !== undefined) {\n opts.emit(attrToHtml('value', inputValueAttr, isSvg))\n }\n if (inputCheckedAttr !== undefined) {\n opts.emit(attrToHtml('checked', inputCheckedAttr, isSvg))\n }\n if (isOption) {\n const selectVal = currentSelectValue()\n if (selectVal !== undefined) {\n const optionValue =\n props.value != null ? props.value : optionChildText(props.children)\n const matches = Array.isArray(selectVal)\n ? selectVal.some((v) => '' + v === '' + optionValue)\n : '' + selectVal === '' + optionValue\n if (matches) opts.emit(' selected=\"\"')\n } else if (props.selected) {\n opts.emit(' selected=\"\"')\n }\n }\n\n if (VOID_ELEMENTS.has(tag)) {\n opts.emit('/>')\n if (opts.textState) opts.textState.lastWasText = false\n return\n }\n opts.emit('>')\n if (tag === 'head') opts.onHead?.()\n // Opening a host element starts a fresh text flow context for its children.\n // Children's text separator tracking is independent of the outer context.\n const parentTextState = opts.textState\n const childOpts: WalkOptions = {\n ...opts,\n isSvg: isSvg && tag !== 'foreignObject',\n textState: { lastWasText: false },\n }\n\n if (tag === 'html' && !hasHeadChild(props.children)) {\n opts.emit('<head>')\n opts.onHead?.()\n opts.emit('</head>')\n }\n\n const dangerouslyHtml = props.dangerouslySetInnerHTML?.__html\n\n if (isTextarea && textareaValue != null) {\n opts.emit(escapeText(String(textareaValue)))\n opts.emit(`</${tag}>`)\n if (parentTextState) parentTextState.lastWasText = false\n return\n }\n\n if (RAW_TEXT_ELEMENTS.has(tag)) {\n // script/style: raw-text. React allows either a string/number child or\n // dangerouslySetInnerHTML \u2014 some libs (Start's Scripts) use the latter.\n if (dangerouslyHtml != null) {\n opts.emit(escapeScript(String(dangerouslyHtml)))\n } else {\n const children = props.children\n if (typeof children === 'string' || typeof children === 'number') {\n opts.emit(escapeScript(String(children)))\n } else if (Array.isArray(children)) {\n opts.emit(escapeScript(children.filter((c) => c != null).join('')))\n }\n }\n opts.emit(`</${tag}>`)\n if (parentTextState) parentTextState.lastWasText = false\n return\n }\n\n if (dangerouslyHtml != null) {\n opts.emit(String(dangerouslyHtml))\n } else {\n walkNode(props.children, childOpts)\n }\n opts.emit(`</${tag}>`)\n // Host element closing resets outer flow \u2014 next sibling text starts fresh.\n if (parentTextState) parentTextState.lastWasText = false\n } finally {\n if (isSelect) popSelectContext()\n }\n}\n\nfunction hasHeadChild(children: unknown): boolean {\n if (children == null || typeof children === 'boolean') return false\n if (Array.isArray(children)) return children.some(hasHeadChild)\n if (typeof children !== 'string' && isIterable(children)) {\n for (const child of children as Iterable<unknown>) {\n if (hasHeadChild(child)) return true\n }\n return false\n }\n return isElementOfType(children, 'head')\n}\n\nfunction isElementOfType(value: unknown, type: string): value is ReactElement {\n const marker = (value as ReactElement | null)?.$$typeof as unknown\n return (\n !!value &&\n typeof value === 'object' &&\n (marker === REACT_ELEMENT_TYPE || marker === REACT_LEGACY_ELEMENT_TYPE) &&\n (value as ReactElement).type === type\n )\n}\n\nfunction isIterable(value: unknown): value is Iterable<unknown> {\n return !!value && typeof (value as { [Symbol.iterator]?: unknown })[Symbol.iterator] === 'function'\n}\n\nfunction walkComponent(\n fn: Function,\n props: Record<string, any>,\n opts: WalkOptions,\n ref?: unknown,\n): void {\n if (opts.onBrowserBailout) {\n opts = { ...opts, componentStack: `\\n at ${(fn as any).displayName || fn.name || 'Anonymous'}${opts.componentStack || ''}` }\n }\n try {\n if ((fn as any).prototype?.isReactComponent) {\n const ctxType = (fn as any).contextType\n const ctxValue = ctxType ? ctxType._currentValue : undefined\n const instance = new (fn as any)(props, ctxValue)\n instance.props = props\n instance.context = ctxValue\n if ((fn as any).getDerivedStateFromProps) {\n const d = (fn as any).getDerivedStateFromProps(props, instance.state)\n if (d) instance.state = { ...instance.state, ...d }\n }\n walkNode(instance.render(), opts)\n return\n }\n const rendered = (fn as any)(props, ref)\n walkNode(rendered, opts)\n } catch (error) {\n if (opts.thrownInfo && !opts.thrownInfo.componentStack) opts.thrownInfo.componentStack = opts.componentStack\n if (isBrowserError(error) && !(error as any).componentStack) {\n Object.defineProperty(error, 'componentStack', { value: opts.componentStack })\n }\n throw error\n }\n}\n\nfunction walkSuspense(\n props: Record<string, any>,\n opts: WalkOptions,\n): void {\n const id = opts.nextBoundaryId()\n // Snapshot contexts BEFORE attempting children, so if a descendant suspends\n // we can replay the same provider stack when re-rendering the boundary.\n const contextSnapshot = snapshotContexts()\n\n // Try to render the children synchronously. If a thenable is thrown,\n // record the boundary and emit the fallback.\n const childParts: string[] = []\n const nested: SuspendedBoundary[] = []\n const thrownInfo: { componentStack?: string | undefined } = {}\n const childEmit = (s: string) => childParts.push(s)\n const resourceScope: ResourceScope | undefined = currentSSRFrame().shellFlushed ? {} : undefined\n try {\n walkNode(props.children, {\n ...opts,\n resourceScope,\n thrownInfo,\n emit: childEmit,\n onSuspend: opts.onSuspend ? (boundary) => nested.push(boundary) : undefined,\n nextBoundaryId: opts.nextBoundaryId,\n })\n } catch (thenable: any) {\n nested.length = 0\n if (isThenable(thenable) || isBrowserError(thenable)) {\n const fallbackParts: string[] = []\n walkNode(props.fallback, {\n ...opts,\n emit: (s) => fallbackParts.push(s),\n onSuspend: opts.onSuspend ? (boundary) => nested.push(boundary) : undefined,\n nextBoundaryId: opts.nextBoundaryId,\n })\n if (isBrowserError(thenable)) {\n opts.onBrowserBailout?.(thenable, { componentStack: (thenable as any).componentStack || opts.componentStack || '' })\n opts.emit(`<!--$!${id}-->${fallbackParts.join('')}<!--/$-->`)\n for (const boundary of nested) opts.onSuspend?.(boundary)\n return\n }\n emitBoundary(opts, id, fallbackParts.join(''))\n for (const boundary of nested) opts.onSuspend?.(boundary)\n\n if (opts.onSuspend) {\n opts.onSuspend({\n id,\n fallbackHTML: fallbackParts.join(''),\n children: props.children,\n thenable,\n contextSnapshot,\n componentStack: thrownInfo.componentStack || opts.componentStack || '',\n })\n }\n return\n }\n throw thenable\n }\n\n if (resourceScope) currentSSRFrame().resources?.mergeScope(resourceScope, opts.resourceScope)\n\n // Children rendered fully \u2014 emit them wrapped in resolved-boundary markers\n // (`<!--$N-->` / `<!--/$-->`). Without markers, the client hydrator has no\n // way to know this subtree is inside a Suspense, so if the client version\n // of a descendant (e.g. `React.lazy`) suspends it can't pinpoint which DOM\n // range to adopt on resolve \u2014 it creates fresh DOM next to the SSR content,\n // producing visible duplicates (e.g. double navbar logos). Markers let the\n // client treat this as a resolved boundary and hydrate in-place.\n opts.emit(`<!--$${id}-->`)\n opts.emit(childParts.join(''))\n opts.emit(`<!--/$-->`)\n for (const boundary of nested) opts.onSuspend?.(boundary)\n}\n\nfunction emitBoundary(opts: WalkOptions, id: number, fallbackHTML: string): void {\n // Visible div wrapper so the fallback UI shows; B: id lets $RC locate it on\n // reveal. The leading/trailing comments let hydration detect a pending\n // boundary and register a reveal callback.\n opts.emit(`<!--$?${id}--><div id=\"B:${id}\">`)\n opts.emit(fallbackHTML)\n opts.emit(`</div><!--/$-->`)\n}\n\nfunction isThenable(x: any): x is Promise<any> {\n return x != null && typeof x.then === 'function'\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/redact",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "React, redacted. A minimal React-API-compatible drop-in replacement.",
5
5
  "type": "module",
6
6
  "main": "./dist/react/index.js",
@@ -1,5 +1,5 @@
1
1
  import { FiberTag, type Fiber } from '../../../core'
2
- import { REACT_PROVIDER_TYPE, REACT_CONSUMER_TYPE } from '../../../react'
2
+ import { REACT_CONTEXT_TYPE, REACT_PROVIDER_TYPE, REACT_CONSUMER_TYPE } from '../../../react'
3
3
  import {
4
4
  registerRenderer,
5
5
  registerTypeMatcher,
@@ -17,7 +17,7 @@ function contextValue(fiber: Fiber, ctx: any): any {
17
17
  let p: Fiber | null = fiber.parent
18
18
  while (p) {
19
19
  if (p.tag === FiberTag.Provider && (p.type as any)._context === ctx) {
20
- return (p.pp ?? p.mp)?.value
20
+ return p.pp?.value
21
21
  }
22
22
  p = p.parent
23
23
  }
@@ -81,7 +81,6 @@ export function renderContextConsumers(fiber: Fiber): void {
81
81
  }
82
82
 
83
83
  function renderProvider(fiber: Fiber, domParent: Node, anchor: Node | null): void {
84
- const ctx = (fiber.type as any)._context
85
84
  const props = fiber.pp ?? {}
86
85
  const changed = fiber.mp && !Object.is(fiber.mp.value, props.value)
87
86
  if (changed) changingProviders++
@@ -90,25 +89,21 @@ function renderProvider(fiber: Fiber, domParent: Node, anchor: Node | null): voi
90
89
  } finally {
91
90
  if (changed) changingProviders--
92
91
  }
93
- // Also store the value on the fiber so descendants rendering later (via updates)
94
- // can read through by walking up.
95
- fiber.ms = props.value
96
92
  fiber.mp = props
97
93
  }
98
94
 
99
95
  function renderConsumer(fiber: Fiber, domParent: Node, anchor: Node | null): void {
100
96
  fiber.cx?.clear()
101
- const ctx = (fiber.type as any)._context
102
97
  const props = fiber.pp ?? {}
103
98
  const children = props.children
104
- const value = realReadContext(fiber, ctx)
99
+ const value = realReadContext(fiber, (fiber.type as any)._context)
105
100
  const rendered = typeof children == 'function' ? children(value) : null
106
101
  reconcileChildren(fiber, childrenToArray(rendered), domParent, anchor)
107
102
  fiber.mp = props
108
103
  }
109
104
 
110
105
  registerTypeMatcher((_type, marker) =>
111
- marker === REACT_PROVIDER_TYPE
106
+ marker === REACT_CONTEXT_TYPE || marker === REACT_PROVIDER_TYPE
112
107
  ? FiberTag.Provider
113
108
  : marker === REACT_CONSUMER_TYPE
114
109
  ? FiberTag.Consumer
@@ -1,5 +1,5 @@
1
1
  import { FiberTag, type Fiber } from '../../../core'
2
- import { REACT_PROVIDER_TYPE, REACT_CONSUMER_TYPE } from '../../../react'
2
+ import { REACT_CONTEXT_TYPE, REACT_PROVIDER_TYPE, REACT_CONSUMER_TYPE } from '../../../react'
3
3
  import {
4
4
  registerRenderer,
5
5
  registerTypeMatcher,
@@ -20,16 +20,15 @@ export function renderContextConsumers(_fiber: Fiber): void {}
20
20
  // The default `readContext` capability returns `ctx._currentValue` without
21
21
  // walking, which matches the no-Provider-fibers-in-tree reality.
22
22
  function renderConsumerStub(fiber: Fiber, domParent: Node, anchor: Node | null): void {
23
- const ctx = (fiber.type as any)._context
24
23
  const props = fiber.pp ?? {}
25
- const value = ctx._currentValue
26
- const rendered = typeof props.children == 'function' ? props.children(value) : null
24
+ const rendered = typeof props.children == 'function'
25
+ ? props.children((fiber.type as any)._context._currentValue) : null
27
26
  reconcileChildren(fiber, childrenToArray(rendered), domParent, anchor)
28
27
  fiber.mp = props
29
28
  }
30
29
 
31
30
  registerTypeMatcher((_type, marker) =>
32
- marker === REACT_PROVIDER_TYPE
31
+ marker === REACT_CONTEXT_TYPE || marker === REACT_PROVIDER_TYPE
33
32
  ? FiberTag.Fragment
34
33
  : marker === REACT_CONSUMER_TYPE
35
34
  ? FiberTag.Consumer
@@ -7,14 +7,16 @@ export const REACT_CONSUMER_TYPE = Symbol.for('react.consumer')
7
7
 
8
8
  export interface Context<T> {
9
9
  $$typeof: typeof REACT_CONTEXT_TYPE
10
+ _context: Context<T>
10
11
  _currentValue: T
11
12
  Provider: ProviderExoticComponent<{ value: T; children?: ReactNode }>
12
13
  Consumer: ConsumerExoticComponent<T>
13
14
  displayName?: string
15
+ (props: { value: T; children?: ReactNode }): ReactElement
14
16
  }
15
17
 
16
18
  export interface ProviderExoticComponent<P> {
17
- $$typeof: typeof REACT_PROVIDER_TYPE
19
+ $$typeof: typeof REACT_CONTEXT_TYPE | typeof REACT_PROVIDER_TYPE
18
20
  _context: Context<any>
19
21
  (props: P): ReactElement
20
22
  }
@@ -31,22 +33,13 @@ export function createContext<T>(defaultValue: T): Context<T> {
31
33
  _currentValue: defaultValue,
32
34
  } as Context<T>
33
35
 
34
- const Provider: any = function Provider(_props: any): any {
35
- if (process.env.NODE_ENV !== 'production') {
36
- throw new Error('Provider components are handled by the renderer.')
37
- }
38
- throw new Error()
39
- }
40
- Provider.$$typeof = REACT_PROVIDER_TYPE
41
- Provider._context = context
42
-
43
36
  const Consumer: any = function Consumer(props: { children: (v: T) => any }): any {
44
37
  return props.children(useContext(context))
45
38
  }
46
39
  Consumer.$$typeof = REACT_CONSUMER_TYPE
47
40
  Consumer._context = context
48
41
 
49
- context.Provider = Provider
42
+ context.Provider = context._context = context
50
43
  context.Consumer = Consumer
51
44
 
52
45
  return context
@@ -14,22 +14,18 @@ export const Fragment = REACT_FRAGMENT_TYPE as unknown as (props: {
14
14
  ref?: Ref<FragmentInstance>
15
15
  }) => ReactElement
16
16
 
17
- const RESERVED_PROPS: Record<string, 1> = { key: 1, ref: 1, __self: 1, __source: 1 }
18
-
19
17
  export function createElement(
20
18
  type: any,
21
19
  config?: Record<string, any> | null,
22
20
  ...children: ReactNode[]
23
21
  ): ReactElement {
24
22
  let key: string | null = null
25
- let ref: any = null
26
23
  const props: Record<string, any> = {}
27
24
 
28
25
  if (config != null) {
29
26
  if (config.key !== undefined && config.key !== null) key = '' + config.key
30
- if (config.ref !== undefined) ref = config.ref
31
27
  for (const k in config) {
32
- if (!RESERVED_PROPS[k] && Object.prototype.hasOwnProperty.call(config, k)) {
28
+ if (k !== 'key' && k !== '__self' && k !== '__source' && Object.prototype.hasOwnProperty.call(config, k)) {
33
29
  props[k] = config[k]
34
30
  }
35
31
  }
@@ -45,7 +41,7 @@ export function createElement(
45
41
  }
46
42
  }
47
43
 
48
- return { $$typeof: REACT_ELEMENT_TYPE, type, key, ref, props }
44
+ return { $$typeof: REACT_ELEMENT_TYPE, type, key, ref: props.ref ?? null, props }
49
45
  }
50
46
 
51
47
  export function cloneElement(
@@ -54,15 +50,14 @@ export function cloneElement(
54
50
  ...children: ReactNode[]
55
51
  ): ReactElement {
56
52
  let key = element.key
57
- let ref = element.ref
58
53
  const props = { ...element.props }
59
54
 
60
55
  if (config != null) {
61
- if (config.ref !== undefined) ref = config.ref
62
56
  if (config.key !== undefined) key = '' + config.key
63
57
  const defaultProps = element.type?.defaultProps
64
58
  for (const k in config) {
65
- if (RESERVED_PROPS[k] || !Object.prototype.hasOwnProperty.call(config, k)) continue
59
+ if (k === 'key' || k === '__self' || k === '__source' || !Object.prototype.hasOwnProperty.call(config, k)) continue
60
+ if (k === 'ref' && config.ref === undefined) continue
66
61
  props[k] = config[k] === undefined && defaultProps ? defaultProps[k] : config[k]
67
62
  }
68
63
  }
@@ -70,7 +65,7 @@ export function cloneElement(
70
65
  if (children.length === 1) props.children = children[0]
71
66
  else if (children.length > 1) props.children = children
72
67
 
73
- return { $$typeof: REACT_ELEMENT_TYPE, type: element.type, key, ref, props }
68
+ return { $$typeof: REACT_ELEMENT_TYPE, type: element.type, key, ref: props.ref === undefined ? element.ref : props.ref, props }
74
69
  }
75
70
 
76
71
  export function isValidElement(obj: any): obj is ReactElement {
@@ -7,6 +7,7 @@ import {
7
7
  } from '../core'
8
8
  import {
9
9
  REACT_SUSPENSE_TYPE,
10
+ REACT_CONTEXT_TYPE,
10
11
  REACT_PROVIDER_TYPE,
11
12
  REACT_CONSUMER_TYPE,
12
13
  REACT_FORWARD_REF_TYPE,
@@ -169,6 +170,11 @@ function walkElement(el: ReactElement, opts: WalkOptions): void {
169
170
  const type = el.type
170
171
  const props = el.props ?? {}
171
172
 
173
+ if (typeof type === 'string') {
174
+ walkHost(type, props, opts)
175
+ return
176
+ }
177
+
172
178
  if (type === REACT_FRAGMENT_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_PROFILER_TYPE) {
173
179
  walkNode(props.children, opts)
174
180
  return
@@ -188,11 +194,6 @@ function walkElement(el: ReactElement, opts: WalkOptions): void {
188
194
  return
189
195
  }
190
196
 
191
- if (typeof type === 'string') {
192
- walkHost(type, props, opts)
193
- return
194
- }
195
-
196
197
  const marker = (type as any)?.$$typeof
197
198
 
198
199
  if (marker === REACT_PORTAL_TYPE) {
@@ -200,7 +201,7 @@ function walkElement(el: ReactElement, opts: WalkOptions): void {
200
201
  return
201
202
  }
202
203
 
203
- if (marker === REACT_PROVIDER_TYPE) {
204
+ if (marker === REACT_CONTEXT_TYPE || marker === REACT_PROVIDER_TYPE) {
204
205
  const ctx = (type as any)._context
205
206
  pushContext(ctx, props.value)
206
207
  try {
@@ -212,10 +213,9 @@ function walkElement(el: ReactElement, opts: WalkOptions): void {
212
213
  }
213
214
 
214
215
  if (marker === REACT_CONSUMER_TYPE) {
215
- const ctx = (type as any)._context
216
216
  const render = props.children
217
217
  if (typeof render === 'function') {
218
- walkNode(render(ctx._currentValue), opts)
218
+ walkNode(render((type as any)._context._currentValue), opts)
219
219
  }
220
220
  return
221
221
  }
@@ -236,16 +236,8 @@ function walkElement(el: ReactElement, opts: WalkOptions): void {
236
236
 
237
237
  if (marker === REACT_LAZY_TYPE) {
238
238
  const { _payload, _init } = type as any
239
- try {
240
- const resolved = _init(_payload)
241
- walkElement({ ...el, type: resolved } as ReactElement, opts)
242
- } catch (thenable: any) {
243
- if (isThenable(thenable)) {
244
- // Suspend this point
245
- throw thenable
246
- }
247
- throw thenable
248
- }
239
+ const resolved = _init(_payload)
240
+ walkElement({ ...el, type: resolved } as ReactElement, opts)
249
241
  return
250
242
  }
251
243