@tanstack/redact 0.0.21 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/dist/core/attributes.js +2 -1
  2. package/dist/core/attributes.js.map +2 -2
  3. package/dist/core/browser.d.ts +9 -0
  4. package/dist/core/browser.js +35 -0
  5. package/dist/core/browser.js.map +7 -0
  6. package/dist/core/index.d.ts +2 -2
  7. package/dist/core/index.js +3 -3
  8. package/dist/core/internal.d.ts +31 -8
  9. package/dist/core/internal.js +3 -1
  10. package/dist/core/internal.js.map +2 -2
  11. package/dist/core/resource-hints.d.ts +7 -0
  12. package/dist/core/resource-hints.js +19 -0
  13. package/dist/core/resource-hints.js.map +7 -0
  14. package/dist/core/types.js +1 -1
  15. package/dist/dom/_all.d.ts +11 -16
  16. package/dist/dom/_all.js +9 -20
  17. package/dist/dom/_all.js.map +2 -2
  18. package/dist/dom/client.d.ts +4 -4
  19. package/dist/dom/client.js +4 -4
  20. package/dist/dom/commit.d.ts +23 -0
  21. package/dist/dom/commit.js +191 -0
  22. package/dist/dom/commit.js.map +7 -0
  23. package/dist/dom/dispatcher.d.ts +4 -22
  24. package/dist/dom/dispatcher.js +184 -126
  25. package/dist/dom/dispatcher.js.map +3 -3
  26. package/dist/dom/dom.d.ts +2 -0
  27. package/dist/dom/dom.js +72 -52
  28. package/dist/dom/dom.js.map +2 -2
  29. package/dist/dom/error-info.d.ts +2 -0
  30. package/dist/dom/error-info.js +16 -0
  31. package/dist/dom/error-info.js.map +7 -0
  32. package/dist/dom/event-replay.js +1 -1
  33. package/dist/dom/features/activity/full.d.ts +1 -0
  34. package/dist/dom/features/activity/full.js +162 -0
  35. package/dist/dom/features/activity/full.js.map +7 -0
  36. package/dist/dom/features/activity/index.d.ts +1 -0
  37. package/dist/dom/features/activity/index.js +3 -0
  38. package/dist/dom/features/activity/index.js.map +7 -0
  39. package/dist/dom/features/activity/stub.d.ts +1 -0
  40. package/dist/dom/features/activity/stub.js +12 -0
  41. package/dist/dom/features/activity/stub.js.map +7 -0
  42. package/dist/dom/features/class/full.js +87 -27
  43. package/dist/dom/features/class/full.js.map +2 -2
  44. package/dist/dom/features/class/index.d.ts +1 -1
  45. package/dist/dom/features/class/index.js +2 -2
  46. package/dist/dom/features/class/stub.js +3 -3
  47. package/dist/dom/features/context/full.d.ts +4 -1
  48. package/dist/dom/features/context/full.js +69 -9
  49. package/dist/dom/features/context/full.js.map +2 -2
  50. package/dist/dom/features/context/index.d.ts +1 -1
  51. package/dist/dom/features/context/index.js +2 -2
  52. package/dist/dom/features/context/stub.d.ts +4 -1
  53. package/dist/dom/features/context/stub.js +15 -4
  54. package/dist/dom/features/context/stub.js.map +2 -2
  55. package/dist/dom/features/forward-ref/full.js +12 -21
  56. package/dist/dom/features/forward-ref/full.js.map +2 -2
  57. package/dist/dom/features/forward-ref/index.d.ts +1 -1
  58. package/dist/dom/features/forward-ref/index.js +2 -2
  59. package/dist/dom/features/forward-ref/stub.js +4 -4
  60. package/dist/dom/features/fragment-refs/index.d.ts +1 -0
  61. package/dist/dom/features/fragment-refs/index.js +8 -0
  62. package/dist/dom/features/fragment-refs/index.js.map +7 -0
  63. package/dist/dom/features/fragment-refs/stub.d.ts +3 -0
  64. package/dist/dom/features/fragment-refs/stub.js +14 -0
  65. package/dist/dom/features/fragment-refs/stub.js.map +7 -0
  66. package/dist/dom/features/hydration/full.d.ts +11 -6
  67. package/dist/dom/features/hydration/full.js +76 -77
  68. package/dist/dom/features/hydration/full.js.map +2 -2
  69. package/dist/dom/features/hydration/index.d.ts +1 -1
  70. package/dist/dom/features/hydration/index.js +2 -2
  71. package/dist/dom/features/hydration/stub.d.ts +7 -2
  72. package/dist/dom/features/hydration/stub.js +1 -1
  73. package/dist/dom/features/hydration/stub.js.map +1 -1
  74. package/dist/dom/features/index.d.ts +8 -7
  75. package/dist/dom/features/index.js +9 -8
  76. package/dist/dom/features/index.js.map +2 -2
  77. package/dist/dom/features/lazy/full.js +4 -4
  78. package/dist/dom/features/lazy/index.d.ts +1 -1
  79. package/dist/dom/features/lazy/index.js +2 -2
  80. package/dist/dom/features/lazy/stub.js +4 -4
  81. package/dist/dom/features/memo/full.js +8 -6
  82. package/dist/dom/features/memo/full.js.map +2 -2
  83. package/dist/dom/features/memo/index.d.ts +1 -1
  84. package/dist/dom/features/memo/index.js +2 -2
  85. package/dist/dom/features/memo/stub.js +4 -4
  86. package/dist/dom/features/portal/full.js +4 -4
  87. package/dist/dom/features/portal/index.d.ts +1 -1
  88. package/dist/dom/features/portal/index.js +2 -2
  89. package/dist/dom/features/portal/stub.js +4 -4
  90. package/dist/dom/features/suspense/full.js +197 -52
  91. package/dist/dom/features/suspense/full.js.map +2 -2
  92. package/dist/dom/features/suspense/index.d.ts +1 -1
  93. package/dist/dom/features/suspense/index.js +2 -2
  94. package/dist/dom/features/suspense/stub.js +4 -4
  95. package/dist/dom/features/view-transition/full.d.ts +6 -0
  96. package/dist/dom/features/view-transition/full.js +280 -0
  97. package/dist/dom/features/view-transition/full.js.map +7 -0
  98. package/dist/dom/features/view-transition/index.d.ts +1 -0
  99. package/dist/dom/features/view-transition/index.js +3 -0
  100. package/dist/dom/features/view-transition/index.js.map +7 -0
  101. package/dist/dom/features/view-transition/resources.d.ts +11 -0
  102. package/dist/dom/features/view-transition/resources.js +108 -0
  103. package/dist/dom/features/view-transition/resources.js.map +7 -0
  104. package/dist/dom/features/view-transition/stub.d.ts +6 -0
  105. package/dist/dom/features/view-transition/stub.js +22 -0
  106. package/dist/dom/features/view-transition/stub.js.map +7 -0
  107. package/dist/dom/features/view-transition/visual.d.ts +14 -0
  108. package/dist/dom/features/view-transition/visual.js +356 -0
  109. package/dist/dom/features/view-transition/visual.js.map +7 -0
  110. package/dist/dom/fragment-instance.d.ts +40 -0
  111. package/dist/dom/fragment-instance.js +324 -0
  112. package/dist/dom/fragment-instance.js.map +7 -0
  113. package/dist/dom/index.d.ts +11 -11
  114. package/dist/dom/index.js +11 -18
  115. package/dist/dom/index.js.map +3 -3
  116. package/dist/dom/portal.d.ts +2 -2
  117. package/dist/dom/portal.js +2 -2
  118. package/dist/dom/portal.js.map +1 -1
  119. package/dist/dom/reconcile.d.ts +32 -3
  120. package/dist/dom/reconcile.js +689 -221
  121. package/dist/dom/reconcile.js.map +2 -2
  122. package/dist/dom/resource-hints.d.ts +6 -0
  123. package/dist/dom/resource-hints.js +115 -0
  124. package/dist/dom/resource-hints.js.map +7 -0
  125. package/dist/dom/resource-store.d.ts +13 -0
  126. package/dist/dom/resource-store.js +43 -0
  127. package/dist/dom/resource-store.js.map +7 -0
  128. package/dist/dom/resources.d.ts +1 -0
  129. package/dist/dom/resources.js +44 -0
  130. package/dist/dom/resources.js.map +7 -0
  131. package/dist/dom/retained-effects.d.ts +6 -0
  132. package/dist/dom/retained-effects.js +49 -0
  133. package/dist/dom/retained-effects.js.map +7 -0
  134. package/dist/dom/root-internal.d.ts +4 -4
  135. package/dist/dom/root-internal.js +2 -2
  136. package/dist/dom/root-internal.js.map +2 -2
  137. package/dist/dom/root.d.ts +5 -5
  138. package/dist/dom/root.js +11 -11
  139. package/dist/dom/root.js.map +2 -2
  140. package/dist/dom/test-utils.js +1 -1
  141. package/dist/react/activity.d.ts +7 -0
  142. package/dist/react/activity.js +8 -0
  143. package/dist/react/activity.js.map +7 -0
  144. package/dist/react/children.d.ts +1 -1
  145. package/dist/react/children.js +3 -3
  146. package/dist/react/children.js.map +1 -1
  147. package/dist/react/class.d.ts +1 -1
  148. package/dist/react/class.js +3 -3
  149. package/dist/react/class.js.map +1 -1
  150. package/dist/react/compiler-runtime.js +2 -2
  151. package/dist/react/context.d.ts +1 -1
  152. package/dist/react/context.js +3 -3
  153. package/dist/react/context.js.map +1 -1
  154. package/dist/react/element.d.ts +6 -3
  155. package/dist/react/element.js +2 -2
  156. package/dist/react/element.js.map +2 -2
  157. package/dist/react/hooks.d.ts +26 -7
  158. package/dist/react/hooks.js +13 -3
  159. package/dist/react/hooks.js.map +2 -2
  160. package/dist/react/index.d.ts +39 -24
  161. package/dist/react/index.js +39 -19
  162. package/dist/react/index.js.map +3 -3
  163. package/dist/react/jsx-runtime.d.ts +2 -2
  164. package/dist/react/jsx-runtime.js +3 -3
  165. package/dist/react/memo.d.ts +1 -1
  166. package/dist/react/memo.js +1 -1
  167. package/dist/react/portal.js +1 -1
  168. package/dist/react/shared-internals.d.ts +15 -5
  169. package/dist/react/shared-internals.js +2 -3
  170. package/dist/react/shared-internals.js.map +2 -2
  171. package/dist/react/suspense.js +1 -1
  172. package/dist/react/view-transition.d.ts +32 -0
  173. package/dist/react/view-transition.js +13 -0
  174. package/dist/react/view-transition.js.map +7 -0
  175. package/dist/scheduler/index.js +1 -1
  176. package/dist/server/bootstrap-script.d.ts +1 -23
  177. package/dist/server/bootstrap-script.js +7 -6
  178. package/dist/server/bootstrap-script.js.map +2 -2
  179. package/dist/server/dispatcher.d.ts +28 -6
  180. package/dist/server/dispatcher.js +33 -15
  181. package/dist/server/dispatcher.js.map +2 -2
  182. package/dist/server/escape.js +16 -15
  183. package/dist/server/escape.js.map +2 -2
  184. package/dist/server/index.d.ts +6 -6
  185. package/dist/server/index.js +7 -7
  186. package/dist/server/renderToString.d.ts +1 -1
  187. package/dist/server/renderToString.js +12 -8
  188. package/dist/server/renderToString.js.map +2 -2
  189. package/dist/server/resource-hints.d.ts +22 -0
  190. package/dist/server/resource-hints.js +148 -0
  191. package/dist/server/resource-hints.js.map +7 -0
  192. package/dist/server/stream.d.ts +15 -2
  193. package/dist/server/stream.js +155 -63
  194. package/dist/server/stream.js.map +2 -2
  195. package/dist/server/walk.d.ts +15 -2
  196. package/dist/server/walk.js +143 -96
  197. package/dist/server/walk.js.map +2 -2
  198. package/dist/vite/index.d.ts +6 -0
  199. package/dist/vite/index.js +22 -6
  200. package/dist/vite/index.js.map +2 -2
  201. package/package.json +1 -1
  202. package/src/core/attributes.ts +1 -0
  203. package/src/core/browser.ts +33 -0
  204. package/src/core/internal.ts +24 -6
  205. package/src/core/resource-hints.ts +36 -0
  206. package/src/dom/_all.ts +1 -7
  207. package/src/dom/commit.ts +186 -0
  208. package/src/dom/dispatcher.ts +190 -134
  209. package/src/dom/dom.ts +70 -54
  210. package/src/dom/error-info.ts +15 -0
  211. package/src/dom/features/activity/full.ts +166 -0
  212. package/src/dom/features/activity/index.ts +1 -0
  213. package/src/dom/features/activity/stub.ts +14 -0
  214. package/src/dom/features/class/full.ts +72 -28
  215. package/src/dom/features/context/full.ts +66 -4
  216. package/src/dom/features/context/stub.ts +6 -0
  217. package/src/dom/features/forward-ref/full.ts +9 -19
  218. package/src/dom/features/fragment-refs/index.ts +1 -0
  219. package/src/dom/features/fragment-refs/stub.ts +3 -0
  220. package/src/dom/features/hydration/full.ts +84 -85
  221. package/src/dom/features/hydration/stub.ts +1 -1
  222. package/src/dom/features/index.ts +1 -0
  223. package/src/dom/features/memo/full.ts +4 -3
  224. package/src/dom/features/suspense/full.ts +192 -55
  225. package/src/dom/features/view-transition/full.ts +288 -0
  226. package/src/dom/features/view-transition/index.ts +1 -0
  227. package/src/dom/features/view-transition/resources.ts +107 -0
  228. package/src/dom/features/view-transition/stub.ts +7 -0
  229. package/src/dom/features/view-transition/visual.ts +406 -0
  230. package/src/dom/fragment-instance.ts +337 -0
  231. package/src/dom/index.ts +6 -7
  232. package/src/dom/portal.ts +1 -1
  233. package/src/dom/reconcile.ts +695 -242
  234. package/src/dom/resource-hints.ts +115 -0
  235. package/src/dom/resource-store.ts +52 -0
  236. package/src/dom/resources.ts +39 -0
  237. package/src/dom/retained-effects.ts +38 -0
  238. package/src/dom/root-internal.ts +4 -4
  239. package/src/dom/root.ts +12 -14
  240. package/src/react/activity.ts +10 -0
  241. package/src/react/element.ts +6 -2
  242. package/src/react/hooks.ts +12 -3
  243. package/src/react/index.ts +18 -0
  244. package/src/react/shared-internals.ts +3 -3
  245. package/src/react/view-transition.ts +41 -0
  246. package/src/server/bootstrap-script.ts +36 -5
  247. package/src/server/dispatcher.ts +35 -13
  248. package/src/server/escape.ts +15 -12
  249. package/src/server/renderToString.ts +7 -5
  250. package/src/server/resource-hints.ts +165 -0
  251. package/src/server/stream.ts +154 -62
  252. package/src/server/walk.ts +72 -11
  253. package/src/vite/index.ts +30 -13
@@ -1,9 +1,9 @@
1
- // packages/redact/src/server/walk.ts
1
+ // src/server/walk.ts
2
2
  import {
3
3
  REACT_ELEMENT_TYPE,
4
4
  REACT_LEGACY_ELEMENT_TYPE,
5
5
  REACT_FRAGMENT_TYPE
6
- } from "../core";
6
+ } from "../core/index.js";
7
7
  import {
8
8
  REACT_SUSPENSE_TYPE,
9
9
  REACT_PROVIDER_TYPE,
@@ -13,20 +13,26 @@ import {
13
13
  REACT_LAZY_TYPE,
14
14
  REACT_STRICT_MODE_TYPE,
15
15
  REACT_PROFILER_TYPE,
16
- REACT_PORTAL_TYPE
17
- } from "../react";
16
+ REACT_PORTAL_TYPE,
17
+ REACT_ACTIVITY_TYPE,
18
+ REACT_VIEW_TRANSITION_TYPE
19
+ } from "../react/index.js";
18
20
  import {
19
21
  attrToHtml,
20
22
  escapeText,
21
23
  escapeScript,
22
24
  VOID_ELEMENTS,
23
25
  RAW_TEXT_ELEMENTS
24
- } from "./escape";
26
+ } from "./escape.js";
25
27
  import {
26
28
  pushContext,
27
29
  popContext,
28
- snapshotContexts
29
- } from "./dispatcher";
30
+ snapshotContexts,
31
+ recordHostResource,
32
+ currentSSRFrame
33
+ } from "./dispatcher.js";
34
+ import { isBrowserError } from "../core/browser.js";
35
+ import { resourceKind } from "../core/resource-hints.js";
30
36
  function walk(node, opts) {
31
37
  if (!opts.textState) opts = { ...opts, textState: { lastWasText: false } };
32
38
  walkNode(node, opts);
@@ -94,6 +100,14 @@ function walkElement(el, opts) {
94
100
  walkSuspense(props, opts);
95
101
  return;
96
102
  }
103
+ if (type === REACT_ACTIVITY_TYPE) {
104
+ if (props.mode !== "hidden") walkNode(props.children, opts);
105
+ return;
106
+ }
107
+ if (type === REACT_VIEW_TRANSITION_TYPE) {
108
+ walkNode(props.children, opts);
109
+ return;
110
+ }
97
111
  if (typeof type === "string") {
98
112
  walkHost(type, props, opts);
99
113
  return;
@@ -124,8 +138,7 @@ function walkElement(el, opts) {
124
138
  const render = type.render;
125
139
  const ref = props.ref ?? null;
126
140
  const { ref: _omit, ...rest } = props;
127
- const rendered = render(rest, ref);
128
- walkNode(rendered, opts);
141
+ walkComponent(render, rest, opts, ref);
129
142
  return;
130
143
  }
131
144
  if (marker === REACT_MEMO_TYPE) {
@@ -153,6 +166,7 @@ function walkElement(el, opts) {
153
166
  }
154
167
  function walkHost(tag, props, opts) {
155
168
  const isSvg = opts.isSvg || tag === "svg";
169
+ if (!isSvg && resourceKind(tag, props) && recordHostResource(tag, props, opts.resourceScope)) return;
156
170
  const isTextarea = tag === "textarea";
157
171
  const textareaValue = isTextarea ? props.value != null ? props.value : props.defaultValue : void 0;
158
172
  const isInput = tag === "input";
@@ -164,76 +178,82 @@ function walkHost(tag, props, opts) {
164
178
  pushSelectContext(val);
165
179
  }
166
180
  const isOption = tag === "option";
167
- if (tag === "html") opts.emit("<!DOCTYPE html>");
168
- opts.emit("<" + tag);
169
- for (const k in props) {
170
- if (isTextarea && (k === "value" || k === "defaultValue")) continue;
171
- if (isInput && (k === "defaultValue" || k === "defaultChecked")) continue;
172
- if (isSelect && (k === "value" || k === "defaultValue")) continue;
173
- if (isOption && k === "selected") continue;
174
- opts.emit(attrToHtml(k, props[k], isSvg));
175
- }
176
- if (inputValueAttr !== void 0) {
177
- opts.emit(attrToHtml("value", inputValueAttr, isSvg));
178
- }
179
- if (inputCheckedAttr !== void 0) {
180
- opts.emit(attrToHtml("checked", inputCheckedAttr, isSvg));
181
- }
182
- if (isOption) {
183
- const selectVal = currentSelectValue();
184
- if (selectVal !== void 0) {
185
- const optionValue = props.value != null ? props.value : optionChildText(props.children);
186
- const matches = Array.isArray(selectVal) ? selectVal.some((v) => "" + v === "" + optionValue) : "" + selectVal === "" + optionValue;
187
- if (matches) opts.emit(' selected=""');
188
- } else if (props.selected) {
189
- opts.emit(' selected=""');
181
+ try {
182
+ if (tag === "html") opts.emit("<!DOCTYPE html>");
183
+ opts.emit("<" + tag);
184
+ for (const k in props) {
185
+ if (isTextarea && (k === "value" || k === "defaultValue")) continue;
186
+ if (isInput && (k === "defaultValue" || k === "defaultChecked")) continue;
187
+ if (isSelect && (k === "value" || k === "defaultValue")) continue;
188
+ if (isOption && k === "selected") continue;
189
+ opts.emit(attrToHtml(k, props[k], isSvg));
190
+ }
191
+ if (inputValueAttr !== void 0) {
192
+ opts.emit(attrToHtml("value", inputValueAttr, isSvg));
193
+ }
194
+ if (inputCheckedAttr !== void 0) {
195
+ opts.emit(attrToHtml("checked", inputCheckedAttr, isSvg));
196
+ }
197
+ if (isOption) {
198
+ const selectVal = currentSelectValue();
199
+ if (selectVal !== void 0) {
200
+ const optionValue = props.value != null ? props.value : optionChildText(props.children);
201
+ const matches = Array.isArray(selectVal) ? selectVal.some((v) => "" + v === "" + optionValue) : "" + selectVal === "" + optionValue;
202
+ if (matches) opts.emit(' selected=""');
203
+ } else if (props.selected) {
204
+ opts.emit(' selected=""');
205
+ }
206
+ }
207
+ if (VOID_ELEMENTS.has(tag)) {
208
+ opts.emit("/>");
209
+ if (opts.textState) opts.textState.lastWasText = false;
210
+ return;
211
+ }
212
+ opts.emit(">");
213
+ if (tag === "head") opts.onHead?.();
214
+ const parentTextState = opts.textState;
215
+ const childOpts = {
216
+ ...opts,
217
+ isSvg: isSvg && tag !== "foreignObject",
218
+ textState: { lastWasText: false }
219
+ };
220
+ if (tag === "html" && !hasHeadChild(props.children)) {
221
+ opts.emit("<head>");
222
+ opts.onHead?.();
223
+ opts.emit("</head>");
224
+ }
225
+ const dangerouslyHtml = props.dangerouslySetInnerHTML?.__html;
226
+ if (isTextarea && textareaValue != null) {
227
+ opts.emit(escapeText(String(textareaValue)));
228
+ opts.emit(`</${tag}>`);
229
+ if (parentTextState) parentTextState.lastWasText = false;
230
+ return;
231
+ }
232
+ if (RAW_TEXT_ELEMENTS.has(tag)) {
233
+ if (dangerouslyHtml != null) {
234
+ opts.emit(escapeScript(String(dangerouslyHtml)));
235
+ } else {
236
+ const children = props.children;
237
+ if (typeof children === "string" || typeof children === "number") {
238
+ opts.emit(escapeScript(String(children)));
239
+ } else if (Array.isArray(children)) {
240
+ opts.emit(escapeScript(children.filter((c) => c != null).join("")));
241
+ }
242
+ }
243
+ opts.emit(`</${tag}>`);
244
+ if (parentTextState) parentTextState.lastWasText = false;
245
+ return;
190
246
  }
191
- }
192
- if (VOID_ELEMENTS.has(tag)) {
193
- opts.emit("/>");
194
- if (opts.textState) opts.textState.lastWasText = false;
195
- return;
196
- }
197
- opts.emit(">");
198
- const parentTextState = opts.textState;
199
- const childOpts = {
200
- ...opts,
201
- isSvg: isSvg && tag !== "foreignObject",
202
- textState: { lastWasText: false }
203
- };
204
- if (tag === "html" && !hasHeadChild(props.children)) {
205
- opts.emit("<head></head>");
206
- }
207
- const dangerouslyHtml = props.dangerouslySetInnerHTML?.__html;
208
- if (isTextarea && textareaValue != null) {
209
- opts.emit(escapeText(String(textareaValue)));
210
- opts.emit(`</${tag}>`);
211
- if (parentTextState) parentTextState.lastWasText = false;
212
- return;
213
- }
214
- if (RAW_TEXT_ELEMENTS.has(tag)) {
215
247
  if (dangerouslyHtml != null) {
216
- opts.emit(escapeScript(String(dangerouslyHtml)));
248
+ opts.emit(String(dangerouslyHtml));
217
249
  } else {
218
- const children = props.children;
219
- if (typeof children === "string" || typeof children === "number") {
220
- opts.emit(escapeScript(String(children)));
221
- } else if (Array.isArray(children)) {
222
- opts.emit(escapeScript(children.filter((c) => c != null).join("")));
223
- }
250
+ walkNode(props.children, childOpts);
224
251
  }
225
252
  opts.emit(`</${tag}>`);
226
253
  if (parentTextState) parentTextState.lastWasText = false;
227
- return;
228
- }
229
- if (dangerouslyHtml != null) {
230
- opts.emit(String(dangerouslyHtml));
231
- } else {
232
- walkNode(props.children, childOpts);
254
+ } finally {
255
+ if (isSelect) popSelectContext();
233
256
  }
234
- opts.emit(`</${tag}>`);
235
- if (isSelect) popSelectContext();
236
- if (parentTextState) parentTextState.lastWasText = false;
237
257
  }
238
258
  function hasHeadChild(children) {
239
259
  if (children == null || typeof children === "boolean") return false;
@@ -253,62 +273,89 @@ function isElementOfType(value, type) {
253
273
  function isIterable(value) {
254
274
  return !!value && typeof value[Symbol.iterator] === "function";
255
275
  }
256
- function walkComponent(fn, props, opts) {
257
- if (fn.prototype?.isReactComponent) {
258
- const ctxType = fn.contextType;
259
- const ctxValue = ctxType ? ctxType._currentValue : void 0;
260
- const instance = new fn(props, ctxValue);
261
- instance.props = props;
262
- instance.context = ctxValue;
263
- if (fn.getDerivedStateFromProps) {
264
- const d = fn.getDerivedStateFromProps(props, instance.state);
265
- if (d) instance.state = { ...instance.state, ...d };
276
+ function walkComponent(fn, props, opts, ref) {
277
+ if (opts.onBrowserBailout) {
278
+ opts = { ...opts, componentStack: `
279
+ at ${fn.displayName || fn.name || "Anonymous"}${opts.componentStack || ""}` };
280
+ }
281
+ try {
282
+ if (fn.prototype?.isReactComponent) {
283
+ const ctxType = fn.contextType;
284
+ const ctxValue = ctxType ? ctxType._currentValue : void 0;
285
+ const instance = new fn(props, ctxValue);
286
+ instance.props = props;
287
+ instance.context = ctxValue;
288
+ if (fn.getDerivedStateFromProps) {
289
+ const d = fn.getDerivedStateFromProps(props, instance.state);
290
+ if (d) instance.state = { ...instance.state, ...d };
291
+ }
292
+ walkNode(instance.render(), opts);
293
+ return;
266
294
  }
267
- walkNode(instance.render(), opts);
268
- return;
295
+ const rendered = fn(props, ref);
296
+ walkNode(rendered, opts);
297
+ } catch (error) {
298
+ if (opts.thrownInfo && !opts.thrownInfo.componentStack) opts.thrownInfo.componentStack = opts.componentStack;
299
+ if (isBrowserError(error) && !error.componentStack) {
300
+ Object.defineProperty(error, "componentStack", { value: opts.componentStack });
301
+ }
302
+ throw error;
269
303
  }
270
- const rendered = fn(props);
271
- walkNode(rendered, opts);
272
304
  }
273
305
  function walkSuspense(props, opts) {
274
306
  const id = opts.nextBoundaryId();
275
307
  const contextSnapshot = snapshotContexts();
276
308
  const childParts = [];
309
+ const nested = [];
310
+ const thrownInfo = {};
277
311
  const childEmit = (s) => childParts.push(s);
312
+ const resourceScope = currentSSRFrame().shellFlushed ? {} : void 0;
278
313
  try {
279
314
  walkNode(props.children, {
315
+ ...opts,
316
+ resourceScope,
317
+ thrownInfo,
280
318
  emit: childEmit,
281
- onSuspend: opts.onSuspend,
319
+ onSuspend: opts.onSuspend ? (boundary) => nested.push(boundary) : void 0,
282
320
  nextBoundaryId: opts.nextBoundaryId
283
321
  });
284
322
  } catch (thenable) {
285
- if (isThenable(thenable)) {
323
+ nested.length = 0;
324
+ if (isThenable(thenable) || isBrowserError(thenable)) {
286
325
  const fallbackParts = [];
287
- try {
288
- walkNode(props.fallback, {
289
- emit: (s) => fallbackParts.push(s),
290
- onSuspend: opts.onSuspend,
291
- nextBoundaryId: opts.nextBoundaryId
292
- });
293
- } catch {
326
+ walkNode(props.fallback, {
327
+ ...opts,
328
+ emit: (s) => fallbackParts.push(s),
329
+ onSuspend: opts.onSuspend ? (boundary) => nested.push(boundary) : void 0,
330
+ nextBoundaryId: opts.nextBoundaryId
331
+ });
332
+ if (isBrowserError(thenable)) {
333
+ opts.onBrowserBailout?.(thenable, { componentStack: thenable.componentStack || opts.componentStack || "" });
334
+ opts.emit(`<!--$!${id}-->${fallbackParts.join("")}<!--/$-->`);
335
+ for (const boundary of nested) opts.onSuspend?.(boundary);
336
+ return;
294
337
  }
295
338
  emitBoundary(opts, id, fallbackParts.join(""));
339
+ for (const boundary of nested) opts.onSuspend?.(boundary);
296
340
  if (opts.onSuspend) {
297
341
  opts.onSuspend({
298
342
  id,
299
343
  fallbackHTML: fallbackParts.join(""),
300
344
  children: props.children,
301
345
  thenable,
302
- contextSnapshot
346
+ contextSnapshot,
347
+ componentStack: thrownInfo.componentStack || opts.componentStack || ""
303
348
  });
304
349
  }
305
350
  return;
306
351
  }
307
352
  throw thenable;
308
353
  }
354
+ if (resourceScope) currentSSRFrame().resources?.mergeScope(resourceScope, opts.resourceScope);
309
355
  opts.emit(`<!--$${id}-->`);
310
356
  opts.emit(childParts.join(""));
311
357
  opts.emit(`<!--/$-->`);
358
+ for (const boundary of nested) opts.onSuspend?.(boundary);
312
359
  }
313
360
  function emitBoundary(opts, id, fallbackHTML) {
314
361
  opts.emit(`<!--$?${id}--><div id="B:${id}">`);
@@ -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} 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 type ContextSnapshot,\n} from './dispatcher'\n\nexport interface SuspendedBoundary {\n id: number\n fallbackHTML: string\n children: ReactNode\n thenable: Promise<any>\n contextSnapshot: ContextSnapshot\n}\n\nexport interface WalkOptions {\n emit: (chunk: string) => void\n onSuspend?: ((boundary: SuspendedBoundary) => void) | undefined\n nextBoundaryId: () => number\n bootstrapped?: boolean | undefined\n isBoundaryResolution?: boolean | undefined\n isSvg?: boolean | 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 (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 const rendered = render(rest, ref)\n walkNode(rendered, opts)\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 // <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\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 // 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></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 if (isSelect) popSelectContext()\n // Host element closing resets outer flow \u2014 next sibling text starts fresh.\n if (parentTextState) parentTextState.lastWasText = false\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): void {\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)\n walkNode(rendered, opts)\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 childEmit = (s: string) => childParts.push(s)\n try {\n walkNode(props.children, {\n emit: childEmit,\n onSuspend: opts.onSuspend,\n nextBoundaryId: opts.nextBoundaryId,\n })\n } catch (thenable: any) {\n if (isThenable(thenable)) {\n const fallbackParts: string[] = []\n try {\n walkNode(props.fallback, {\n emit: (s) => fallbackParts.push(s),\n onSuspend: opts.onSuspend,\n nextBoundaryId: opts.nextBoundaryId,\n })\n } catch {\n // Fallback suspending is unsupported; emit nothing\n }\n emitBoundary(opts, id, fallbackParts.join(''))\n\n if (opts.onSuspend) {\n opts.onSuspend({\n id,\n fallbackHTML: fallbackParts.join(''),\n children: props.children,\n thenable,\n contextSnapshot,\n })\n }\n return\n }\n throw thenable\n }\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}\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": ";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAiCA,SAAS,KAAK,MAAiB,MAAyB;AAG7D,MAAI,CAAC,KAAK,UAAW,QAAO,EAAE,GAAG,MAAM,WAAW,EAAE,aAAa,MAAM,EAAE;AACzE,WAAS,MAAM,IAAI;AACrB;AAMA,IAAM,mBAA8B,CAAC;AACrC,SAAS,kBAAkB,OAAsB;AAC/C,mBAAiB,KAAK,KAAK;AAC7B;AACA,SAAS,mBAAyB;AAChC,mBAAiB,IAAI;AACvB;AACA,SAAS,qBAA8B;AACrC,SAAO,iBAAiB,SAAS,iBAAiB,iBAAiB,SAAS,CAAC,IAAI;AACnF;AAEA,SAAS,gBAAgB,UAA2B;AAIlD,MAAI,YAAY,KAAM,QAAO;AAC7B,MAAI,OAAO,aAAa,YAAY,OAAO,aAAa,SAAU,QAAO,KAAK;AAC9E,MAAI,MAAM,QAAQ,QAAQ,EAAG,QAAO,SAAS,IAAI,eAAe,EAAE,KAAK,EAAE;AACzE,SAAO;AACT;AAEA,SAAS,SAAS,MAAc,MAAyB;AAGvD,MAAI,SAAS,GAAI;AACjB,MAAI,KAAK,WAAW,YAAa,MAAK,KAAK,UAAU;AACrD,OAAK,KAAK,WAAW,IAAI,CAAC;AAC1B,MAAI,KAAK,UAAW,MAAK,UAAU,cAAc;AACnD;AAEA,SAAS,SAAS,MAAiB,MAAyB;AAC1D,MAAI,QAAQ,QAAQ,SAAS,SAAS,SAAS,KAAM;AAErD,MAAI,OAAO,SAAS,UAAU;AAC5B,aAAS,MAAM,IAAI;AACnB;AAAA,EACF;AACA,MAAI,OAAO,SAAS,UAAU;AAC5B,aAAS,OAAO,IAAI,GAAG,IAAI;AAC3B;AAAA,EACF;AACA,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,eAAW,KAAK,KAAM,UAAS,GAAG,IAAI;AACtC;AAAA,EACF;AACA,MAAI,OAAQ,KAAa,OAAO,QAAQ,MAAM,YAAY;AACxD,eAAW,QAAQ,KAA6B,UAAS,MAAM,IAAI;AACnE;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,SAAU;AAC9B,QAAM,IAAK,KAAa;AAUxB,MAAI,MAAM,iBAAiB;AACzB,UAAM,OAAO;AACb,UAAM,WAAW,KAAK,MAAM,KAAK,QAAQ;AACzC,aAAS,UAAU,IAAI;AACvB;AAAA,EACF;AAEA,MAAI,MAAM,sBAAsB,MAAM,0BAA2B;AAEjE,QAAM,KAAK;AACX,cAAY,IAAI,IAAI;AACtB;AAEA,SAAS,YAAY,IAAkB,MAAyB;AAC9D,QAAM,OAAO,GAAG;AAChB,QAAM,QAAQ,GAAG,SAAS,CAAC;AAE3B,MAAI,SAAS,uBAAuB,SAAS,0BAA0B,SAAS,qBAAqB;AACnG,aAAS,MAAM,UAAU,IAAI;AAC7B;AAAA,EACF;AAEA,MAAI,SAAS,qBAAqB;AAChC,iBAAa,OAAO,IAAI;AACxB;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,UAAU;AAC5B,aAAS,MAAM,OAAO,IAAI;AAC1B;AAAA,EACF;AAEA,QAAM,SAAU,MAAc;AAE9B,MAAI,WAAW,mBAAmB;AAEhC;AAAA,EACF;AAEA,MAAI,WAAW,qBAAqB;AAClC,UAAM,MAAO,KAAa;AAC1B,gBAAY,KAAK,MAAM,KAAK;AAC5B,QAAI;AACF,eAAS,MAAM,UAAU,IAAI;AAAA,IAC/B,UAAE;AACA,iBAAW,GAAG;AAAA,IAChB;AACA;AAAA,EACF;AAEA,MAAI,WAAW,qBAAqB;AAClC,UAAM,MAAO,KAAa;AAC1B,UAAM,SAAS,MAAM;AACrB,QAAI,OAAO,WAAW,YAAY;AAChC,eAAS,OAAO,IAAI,aAAa,GAAG,IAAI;AAAA,IAC1C;AACA;AAAA,EACF;AAEA,MAAI,WAAW,wBAAwB;AACrC,UAAM,SAAU,KAAa;AAC7B,UAAM,MAAO,MAAc,OAAO;AAClC,UAAM,EAAE,KAAK,OAAO,GAAG,KAAK,IAAI;AAChC,UAAM,WAAW,OAAO,MAAM,GAAG;AACjC,aAAS,UAAU,IAAI;AACvB;AAAA,EACF;AAEA,MAAI,WAAW,iBAAiB;AAC9B,UAAM,QAAS,KAAa;AAC5B,gBAAY,EAAE,GAAG,IAAI,MAAM,MAAM,GAAmB,IAAI;AACxD;AAAA,EACF;AAEA,MAAI,WAAW,iBAAiB;AAC9B,UAAM,EAAE,UAAU,MAAM,IAAI;AAC5B,QAAI;AACF,YAAM,WAAW,MAAM,QAAQ;AAC/B,kBAAY,EAAE,GAAG,IAAI,MAAM,SAAS,GAAmB,IAAI;AAAA,IAC7D,SAAS,UAAe;AACtB,UAAI,WAAW,QAAQ,GAAG;AAExB,cAAM;AAAA,MACR;AACA,YAAM;AAAA,IACR;AACA;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,YAAY;AAC9B,kBAAc,MAAM,OAAO,IAAI;AAC/B;AAAA,EACF;AACF;AAEA,SAAS,SACP,KACA,OACA,MACM;AACN,QAAM,QAAQ,KAAK,SAAS,QAAQ;AAKpC,QAAM,aAAa,QAAQ;AAC3B,QAAM,gBAAgB,aAClB,MAAM,SAAS,OACb,MAAM,QACN,MAAM,eACR;AAOJ,QAAM,UAAU,QAAQ;AACxB,QAAM,iBACJ,WAAW,MAAM,SAAS,QAAQ,MAAM,gBAAgB,OACpD,MAAM,eACN;AACN,QAAM,mBACJ,WAAW,MAAM,WAAW,QAAQ,MAAM,kBAAkB,OACxD,MAAM,iBACN;AAMN,QAAM,WAAW,QAAQ;AACzB,MAAI,UAAU;AACZ,UAAM,MAAM,MAAM,SAAS,OAAO,MAAM,QAAQ,MAAM;AACtD,sBAAkB,GAAG;AAAA,EACvB;AACA,QAAM,WAAW,QAAQ;AAOzB,MAAI,QAAQ,OAAQ,MAAK,KAAK,iBAAiB;AAE/C,OAAK,KAAK,MAAM,GAAG;AACnB,aAAW,KAAK,OAAO;AACrB,QAAI,eAAe,MAAM,WAAW,MAAM,gBAAiB;AAC3D,QAAI,YAAY,MAAM,kBAAkB,MAAM,kBAAmB;AACjE,QAAI,aAAa,MAAM,WAAW,MAAM,gBAAiB;AACzD,QAAI,YAAY,MAAM,WAAY;AAClC,SAAK,KAAK,WAAW,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC;AAAA,EAC1C;AACA,MAAI,mBAAmB,QAAW;AAChC,SAAK,KAAK,WAAW,SAAS,gBAAgB,KAAK,CAAC;AAAA,EACtD;AACA,MAAI,qBAAqB,QAAW;AAClC,SAAK,KAAK,WAAW,WAAW,kBAAkB,KAAK,CAAC;AAAA,EAC1D;AACA,MAAI,UAAU;AACZ,UAAM,YAAY,mBAAmB;AACrC,QAAI,cAAc,QAAW;AAC3B,YAAM,cACJ,MAAM,SAAS,OAAO,MAAM,QAAQ,gBAAgB,MAAM,QAAQ;AACpE,YAAM,UAAU,MAAM,QAAQ,SAAS,IACnC,UAAU,KAAK,CAAC,MAAM,KAAK,MAAM,KAAK,WAAW,IACjD,KAAK,cAAc,KAAK;AAC5B,UAAI,QAAS,MAAK,KAAK,cAAc;AAAA,IACvC,WAAW,MAAM,UAAU;AACzB,WAAK,KAAK,cAAc;AAAA,IAC1B;AAAA,EACF;AAEA,MAAI,cAAc,IAAI,GAAG,GAAG;AAC1B,SAAK,KAAK,IAAI;AACd,QAAI,KAAK,UAAW,MAAK,UAAU,cAAc;AACjD;AAAA,EACF;AACA,OAAK,KAAK,GAAG;AAGb,QAAM,kBAAkB,KAAK;AAC7B,QAAM,YAAyB;AAAA,IAC7B,GAAG;AAAA,IACH,OAAO,SAAS,QAAQ;AAAA,IACxB,WAAW,EAAE,aAAa,MAAM;AAAA,EAClC;AAEA,MAAI,QAAQ,UAAU,CAAC,aAAa,MAAM,QAAQ,GAAG;AACnD,SAAK,KAAK,eAAe;AAAA,EAC3B;AAEA,QAAM,kBAAkB,MAAM,yBAAyB;AAEvD,MAAI,cAAc,iBAAiB,MAAM;AACvC,SAAK,KAAK,WAAW,OAAO,aAAa,CAAC,CAAC;AAC3C,SAAK,KAAK,KAAK,GAAG,GAAG;AACrB,QAAI,gBAAiB,iBAAgB,cAAc;AACnD;AAAA,EACF;AAEA,MAAI,kBAAkB,IAAI,GAAG,GAAG;AAG9B,QAAI,mBAAmB,MAAM;AAC3B,WAAK,KAAK,aAAa,OAAO,eAAe,CAAC,CAAC;AAAA,IACjD,OAAO;AACL,YAAM,WAAW,MAAM;AACvB,UAAI,OAAO,aAAa,YAAY,OAAO,aAAa,UAAU;AAChE,aAAK,KAAK,aAAa,OAAO,QAAQ,CAAC,CAAC;AAAA,MAC1C,WAAW,MAAM,QAAQ,QAAQ,GAAG;AAClC,aAAK,KAAK,aAAa,SAAS,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAAA,MACpE;AAAA,IACF;AACA,SAAK,KAAK,KAAK,GAAG,GAAG;AACrB,QAAI,gBAAiB,iBAAgB,cAAc;AACnD;AAAA,EACF;AAEA,MAAI,mBAAmB,MAAM;AAC3B,SAAK,KAAK,OAAO,eAAe,CAAC;AAAA,EACnC,OAAO;AACL,aAAS,MAAM,UAAU,SAAS;AAAA,EACpC;AACA,OAAK,KAAK,KAAK,GAAG,GAAG;AACrB,MAAI,SAAU,kBAAiB;AAE/B,MAAI,gBAAiB,iBAAgB,cAAc;AACrD;AAEA,SAAS,aAAa,UAA4B;AAChD,MAAI,YAAY,QAAQ,OAAO,aAAa,UAAW,QAAO;AAC9D,MAAI,MAAM,QAAQ,QAAQ,EAAG,QAAO,SAAS,KAAK,YAAY;AAC9D,MAAI,OAAO,aAAa,YAAY,WAAW,QAAQ,GAAG;AACxD,eAAW,SAAS,UAA+B;AACjD,UAAI,aAAa,KAAK,EAAG,QAAO;AAAA,IAClC;AACA,WAAO;AAAA,EACT;AACA,SAAO,gBAAgB,UAAU,MAAM;AACzC;AAEA,SAAS,gBAAgB,OAAgB,MAAqC;AAC5E,QAAM,SAAU,OAA+B;AAC/C,SACE,CAAC,CAAC,SACF,OAAO,UAAU,aAChB,WAAW,sBAAsB,WAAW,8BAC5C,MAAuB,SAAS;AAErC;AAEA,SAAS,WAAW,OAA4C;AAC9D,SAAO,CAAC,CAAC,SAAS,OAAQ,MAA0C,OAAO,QAAQ,MAAM;AAC3F;AAEA,SAAS,cACP,IACA,OACA,MACM;AACN,MAAK,GAAW,WAAW,kBAAkB;AAC3C,UAAM,UAAW,GAAW;AAC5B,UAAM,WAAW,UAAU,QAAQ,gBAAgB;AACnD,UAAM,WAAW,IAAK,GAAW,OAAO,QAAQ;AAChD,aAAS,QAAQ;AACjB,aAAS,UAAU;AACnB,QAAK,GAAW,0BAA0B;AACxC,YAAM,IAAK,GAAW,yBAAyB,OAAO,SAAS,KAAK;AACpE,UAAI,EAAG,UAAS,QAAQ,EAAE,GAAG,SAAS,OAAO,GAAG,EAAE;AAAA,IACpD;AACA,aAAS,SAAS,OAAO,GAAG,IAAI;AAChC;AAAA,EACF;AACA,QAAM,WAAY,GAAW,KAAK;AAClC,WAAS,UAAU,IAAI;AACzB;AAEA,SAAS,aACP,OACA,MACM;AACN,QAAM,KAAK,KAAK,eAAe;AAG/B,QAAM,kBAAkB,iBAAiB;AAIzC,QAAM,aAAuB,CAAC;AAC9B,QAAM,YAAY,CAAC,MAAc,WAAW,KAAK,CAAC;AAClD,MAAI;AACF,aAAS,MAAM,UAAU;AAAA,MACvB,MAAM;AAAA,MACN,WAAW,KAAK;AAAA,MAChB,gBAAgB,KAAK;AAAA,IACvB,CAAC;AAAA,EACH,SAAS,UAAe;AACtB,QAAI,WAAW,QAAQ,GAAG;AACxB,YAAM,gBAA0B,CAAC;AACjC,UAAI;AACF,iBAAS,MAAM,UAAU;AAAA,UACvB,MAAM,CAAC,MAAM,cAAc,KAAK,CAAC;AAAA,UACjC,WAAW,KAAK;AAAA,UAChB,gBAAgB,KAAK;AAAA,QACvB,CAAC;AAAA,MACH,QAAQ;AAAA,MAER;AACA,mBAAa,MAAM,IAAI,cAAc,KAAK,EAAE,CAAC;AAE7C,UAAI,KAAK,WAAW;AAClB,aAAK,UAAU;AAAA,UACb;AAAA,UACA,cAAc,cAAc,KAAK,EAAE;AAAA,UACnC,UAAU,MAAM;AAAA,UAChB;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AACA;AAAA,IACF;AACA,UAAM;AAAA,EACR;AASA,OAAK,KAAK,QAAQ,EAAE,KAAK;AACzB,OAAK,KAAK,WAAW,KAAK,EAAE,CAAC;AAC7B,OAAK,KAAK,WAAW;AACvB;AAEA,SAAS,aAAa,MAAmB,IAAY,cAA4B;AAI/E,OAAK,KAAK,SAAS,EAAE,iBAAiB,EAAE,IAAI;AAC5C,OAAK,KAAK,YAAY;AACtB,OAAK,KAAK,iBAAiB;AAC7B;AAEA,SAAS,WAAW,GAA2B;AAC7C,SAAO,KAAK,QAAQ,OAAO,EAAE,SAAS;AACxC;",
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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",
6
6
  "names": []
7
7
  }
@@ -7,6 +7,12 @@ export type RedactPreset = 'nano' | 'full';
7
7
  * configs as autocompleted options.
8
8
  */
9
9
  export interface RedactFeatures {
10
+ /** Activity visibility, retained state and disconnected effects. */
11
+ activity?: boolean;
12
+ /** DOM instances, events, focus, layout and observers for Fragment refs. */
13
+ fragmentRefs?: boolean;
14
+ /** Experimental native ViewTransition animations. Opt-in until snapshot parity is complete. */
15
+ viewTransitions?: boolean;
10
16
  /**
11
17
  * `createPortal`. When `false`, portal elements render in place as a
12
18
  * Fragment (the `container` prop is ignored). `renderPortal` and its
@@ -1,10 +1,13 @@
1
- // packages/redact/src/vite/index.ts
1
+ // src/vite/index.ts
2
2
  import { existsSync, readFileSync, realpathSync } from "node:fs";
3
3
  import { dirname, resolve as resolvePath } from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
5
  var PRESET_DEFAULTS = {
6
6
  // Opt-in: everything off. Turn individual features on via `features`.
7
7
  nano: {
8
+ activity: false,
9
+ fragmentRefs: false,
10
+ viewTransitions: false,
8
11
  portal: false,
9
12
  context: false,
10
13
  suspense: false,
@@ -16,6 +19,9 @@ var PRESET_DEFAULTS = {
16
19
  },
17
20
  // Opt-out: everything on (drop-in React parity). Turn features off via `features`.
18
21
  full: {
22
+ activity: true,
23
+ fragmentRefs: true,
24
+ viewTransitions: false,
19
25
  portal: true,
20
26
  context: true,
21
27
  suspense: true,
@@ -29,6 +35,9 @@ var PRESET_DEFAULTS = {
29
35
  function resolveFeatures(preset, overrides) {
30
36
  const p = PRESET_DEFAULTS[preset];
31
37
  return {
38
+ activity: overrides.activity ?? p.activity,
39
+ fragmentRefs: overrides.fragmentRefs ?? p.fragmentRefs,
40
+ viewTransitions: overrides.viewTransitions ?? p.viewTransitions,
32
41
  portal: overrides.portal ?? p.portal,
33
42
  context: overrides.context ?? p.context,
34
43
  suspense: overrides.suspense ?? p.suspense,
@@ -52,7 +61,10 @@ var ALIASES = {
52
61
  "react/jsx-dev-runtime": "@tanstack/redact/jsx-dev-runtime",
53
62
  "react/compiler-runtime": "@tanstack/redact/compiler-runtime",
54
63
  "react-dom/client": "@tanstack/redact/dom-client",
64
+ "react-dom/server.browser": "@tanstack/redact/server",
65
+ "react-dom/server.bun": "@tanstack/redact/server",
55
66
  "react-dom/server.edge": "@tanstack/redact/server",
67
+ "react-dom/server.node": "@tanstack/redact/server",
56
68
  "react-dom/static.edge": "@tanstack/redact/server",
57
69
  "react-dom/server": "@tanstack/redact/server",
58
70
  "react-dom/test-utils": "@tanstack/redact/dom-test-utils",
@@ -196,11 +208,12 @@ function redact(options = {}) {
196
208
  const envName = this?.environment?.name;
197
209
  if (envName === "rsc") return null;
198
210
  if (importer && /[\\/]features[\\/]index\.[jt]sx?$/.test(importer)) {
199
- const m = id.match(/^\.\/([a-z-]+)$/);
211
+ const m = id.match(/^\.\/([a-z-]+)(\/index\.js)?$/);
200
212
  if (m) {
201
- const name = m[1];
213
+ const dir = m[1];
214
+ const name = dir === "forward-ref" ? "forwardRef" : dir === "fragment-refs" ? "fragmentRefs" : dir === "view-transition" ? "viewTransitions" : dir === "class" ? "classComponents" : dir;
202
215
  if (name in features && !features[name]) {
203
- const r = await this.resolve(`./${name}/stub`, importer, {
216
+ const r = await this.resolve(`./${dir}/stub${m[2] ? ".js" : ""}`, importer, {
204
217
  ...opts,
205
218
  skipSelf: true
206
219
  });
@@ -208,9 +221,12 @@ function redact(options = {}) {
208
221
  }
209
222
  }
210
223
  }
211
- if (!features.hydration && importer && /[\\/]hydration$/.test(id)) {
224
+ const peer = id.match(/[\\/](context|hydration|fragment-refs|view-transition)(?:[\\/]index\.js)?$/);
225
+ const peerKey = peer?.[1] === "fragment-refs" ? "fragmentRefs" : peer?.[1] === "view-transition" ? "viewTransitions" : peer?.[1];
226
+ if (importer && peer && peerKey && !features[peerKey]) {
212
227
  const r = await this.resolve(id, importer, { ...opts, skipSelf: true });
213
- if (r && /features[\\/]hydration[\\/]index\.(ts|js)$/.test(r.id)) {
228
+ const resolvedFeature = r?.id.match(/features[\\/](context|hydration|fragment-refs|view-transition)[\\/]index\.(ts|js)$/);
229
+ if (resolvedFeature?.[1] === peer[1]) {
214
230
  return r.id.replace(/index\.(ts|js)$/, "stub.$1");
215
231
  }
216
232
  }