@faiwer/react 0.8.4 → 19.0.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.
Files changed (234) hide show
  1. package/README.md +43 -21
  2. package/dist/core/actions/applyAction.d.ts.map +1 -1
  3. package/dist/core/actions/applyAction.js +6 -0
  4. package/dist/core/actions/applyAction.js.map +1 -1
  5. package/dist/core/actions/catchError.action.d.ts +10 -0
  6. package/dist/core/actions/catchError.action.d.ts.map +1 -0
  7. package/dist/core/actions/catchError.action.js +51 -0
  8. package/dist/core/actions/catchError.action.js.map +1 -0
  9. package/dist/core/actions/createComment.action.d.ts +2 -2
  10. package/dist/core/actions/createComment.action.d.ts.map +1 -1
  11. package/dist/core/actions/createComment.action.js +1 -8
  12. package/dist/core/actions/createComment.action.js.map +1 -1
  13. package/dist/core/actions/createContainer.action.d.ts +7 -0
  14. package/dist/core/actions/createContainer.action.d.ts.map +1 -0
  15. package/dist/core/actions/createContainer.action.js +28 -0
  16. package/dist/core/actions/createContainer.action.js.map +1 -0
  17. package/dist/core/actions/createTag.action.d.ts +2 -1
  18. package/dist/core/actions/createTag.action.d.ts.map +1 -1
  19. package/dist/core/actions/createTag.action.js +22 -4
  20. package/dist/core/actions/createTag.action.js.map +1 -1
  21. package/dist/core/actions/createText.action.d.ts.map +1 -1
  22. package/dist/core/actions/createText.action.js +2 -5
  23. package/dist/core/actions/createText.action.js.map +1 -1
  24. package/dist/core/actions/dom/attributes.d.ts.map +1 -1
  25. package/dist/core/actions/dom/attributes.js +4 -1
  26. package/dist/core/actions/dom/attributes.js.map +1 -1
  27. package/dist/core/actions/dom/css.d.ts.map +1 -1
  28. package/dist/core/actions/dom/css.js +2 -1
  29. package/dist/core/actions/dom/css.js.map +1 -1
  30. package/dist/core/actions/dom/events.d.ts.map +1 -1
  31. package/dist/core/actions/dom/events.js +15 -3
  32. package/dist/core/actions/dom/events.js.map +1 -1
  33. package/dist/core/actions/dom/value.d.ts +18 -0
  34. package/dist/core/actions/dom/value.d.ts.map +1 -0
  35. package/dist/core/actions/dom/value.js +211 -0
  36. package/dist/core/actions/dom/value.js.map +1 -0
  37. package/dist/core/actions/helpers.d.ts +17 -10
  38. package/dist/core/actions/helpers.d.ts.map +1 -1
  39. package/dist/core/actions/helpers.js +64 -70
  40. package/dist/core/actions/helpers.js.map +1 -1
  41. package/dist/core/actions/relayout.action.d.ts +2 -1
  42. package/dist/core/actions/relayout.action.d.ts.map +1 -1
  43. package/dist/core/actions/relayout.action.js +119 -30
  44. package/dist/core/actions/relayout.action.js.map +1 -1
  45. package/dist/core/actions/remove.action.d.ts +2 -2
  46. package/dist/core/actions/remove.action.d.ts.map +1 -1
  47. package/dist/core/actions/remove.action.js +20 -17
  48. package/dist/core/actions/remove.action.js.map +1 -1
  49. package/dist/core/actions/replace.action.d.ts +1 -1
  50. package/dist/core/actions/replace.action.d.ts.map +1 -1
  51. package/dist/core/actions/replace.action.js +34 -23
  52. package/dist/core/actions/replace.action.js.map +1 -1
  53. package/dist/core/actions/scheduleEffect.action.d.ts +7 -0
  54. package/dist/core/actions/scheduleEffect.action.d.ts.map +1 -0
  55. package/dist/core/actions/scheduleEffect.action.js +8 -0
  56. package/dist/core/actions/scheduleEffect.action.js.map +1 -0
  57. package/dist/core/actions/setAttr.action.d.ts +1 -1
  58. package/dist/core/actions/setAttr.action.d.ts.map +1 -1
  59. package/dist/core/actions/setAttr.action.js +47 -6
  60. package/dist/core/actions/setAttr.action.js.map +1 -1
  61. package/dist/core/actions/setProps.action.d.ts.map +1 -1
  62. package/dist/core/actions/setProps.action.js +2 -1
  63. package/dist/core/actions/setProps.action.js.map +1 -1
  64. package/dist/core/actions/setRef.action.d.ts +1 -1
  65. package/dist/core/actions/setRef.action.d.ts.map +1 -1
  66. package/dist/core/actions/setRef.action.js +5 -6
  67. package/dist/core/actions/setRef.action.js.map +1 -1
  68. package/dist/core/actions/setText.action.d.ts.map +1 -1
  69. package/dist/core/actions/setText.action.js +3 -3
  70. package/dist/core/actions/setText.action.js.map +1 -1
  71. package/dist/core/classComponent.d.ts +2 -1
  72. package/dist/core/classComponent.d.ts.map +1 -1
  73. package/dist/core/classComponent.js +20 -12
  74. package/dist/core/classComponent.js.map +1 -1
  75. package/dist/core/compact.d.ts +10 -29
  76. package/dist/core/compact.d.ts.map +1 -1
  77. package/dist/core/compact.js +12 -100
  78. package/dist/core/compact.js.map +1 -1
  79. package/dist/core/components.d.ts +6 -4
  80. package/dist/core/components.d.ts.map +1 -1
  81. package/dist/core/components.js +26 -8
  82. package/dist/core/components.js.map +1 -1
  83. package/dist/core/createElement.d.ts +2 -8
  84. package/dist/core/createElement.d.ts.map +1 -1
  85. package/dist/core/createElement.js +3 -1
  86. package/dist/core/createElement.js.map +1 -1
  87. package/dist/core/reactNodeToFiberNode.d.ts +3 -1
  88. package/dist/core/reactNodeToFiberNode.d.ts.map +1 -1
  89. package/dist/core/reactNodeToFiberNode.js +80 -17
  90. package/dist/core/reactNodeToFiberNode.js.map +1 -1
  91. package/dist/core/reconciliation/app.js +3 -3
  92. package/dist/core/reconciliation/app.js.map +1 -1
  93. package/dist/core/reconciliation/collect/fromApp.d.ts +2 -1
  94. package/dist/core/reconciliation/collect/fromApp.d.ts.map +1 -1
  95. package/dist/core/reconciliation/collect/fromApp.js +7 -26
  96. package/dist/core/reconciliation/collect/fromApp.js.map +1 -1
  97. package/dist/core/reconciliation/collect/fromChildrenPair.d.ts +2 -1
  98. package/dist/core/reconciliation/collect/fromChildrenPair.d.ts.map +1 -1
  99. package/dist/core/reconciliation/collect/fromChildrenPair.js +37 -10
  100. package/dist/core/reconciliation/collect/fromChildrenPair.js.map +1 -1
  101. package/dist/core/reconciliation/collect/fromComponent.d.ts +3 -2
  102. package/dist/core/reconciliation/collect/fromComponent.d.ts.map +1 -1
  103. package/dist/core/reconciliation/collect/fromComponent.js +27 -9
  104. package/dist/core/reconciliation/collect/fromComponent.js.map +1 -1
  105. package/dist/core/reconciliation/collect/fromFiberPair.d.ts +2 -1
  106. package/dist/core/reconciliation/collect/fromFiberPair.d.ts.map +1 -1
  107. package/dist/core/reconciliation/collect/fromFiberPair.js +8 -5
  108. package/dist/core/reconciliation/collect/fromFiberPair.js.map +1 -1
  109. package/dist/core/reconciliation/collect/fromNewFiber.d.ts.map +1 -1
  110. package/dist/core/reconciliation/collect/fromNewFiber.js +7 -15
  111. package/dist/core/reconciliation/collect/fromNewFiber.js.map +1 -1
  112. package/dist/core/reconciliation/effects.d.ts +2 -2
  113. package/dist/core/reconciliation/effects.d.ts.map +1 -1
  114. package/dist/core/reconciliation/effects.js +52 -4
  115. package/dist/core/reconciliation/effects.js.map +1 -1
  116. package/dist/core/reconciliation/errors/ReactError.d.ts +15 -0
  117. package/dist/core/reconciliation/errors/ReactError.d.ts.map +1 -0
  118. package/dist/core/reconciliation/errors/ReactError.js +56 -0
  119. package/dist/core/reconciliation/errors/ReactError.js.map +1 -0
  120. package/dist/core/reconciliation/errors/stack.d.ts +8 -2
  121. package/dist/core/reconciliation/errors/stack.d.ts.map +1 -1
  122. package/dist/core/reconciliation/errors/stack.js +65 -8
  123. package/dist/core/reconciliation/errors/stack.js.map +1 -1
  124. package/dist/core/reconciliation/fibers.d.ts +1 -0
  125. package/dist/core/reconciliation/fibers.d.ts.map +1 -1
  126. package/dist/core/reconciliation/fibers.js +3 -2
  127. package/dist/core/reconciliation/fibers.js.map +1 -1
  128. package/dist/core/reconciliation/heap.d.ts +18 -0
  129. package/dist/core/reconciliation/heap.d.ts.map +1 -0
  130. package/dist/core/reconciliation/heap.js +81 -0
  131. package/dist/core/reconciliation/heap.js.map +1 -0
  132. package/dist/core/reconciliation/invalidateFiber.d.ts.map +1 -1
  133. package/dist/core/reconciliation/invalidateFiber.js +6 -5
  134. package/dist/core/reconciliation/invalidateFiber.js.map +1 -1
  135. package/dist/core/reconciliation/mount.d.ts.map +1 -1
  136. package/dist/core/reconciliation/mount.js +24 -6
  137. package/dist/core/reconciliation/mount.js.map +1 -1
  138. package/dist/core/reconciliation/postCommit.d.ts +1 -1
  139. package/dist/core/reconciliation/postCommit.d.ts.map +1 -1
  140. package/dist/core/reconciliation/postCommit.js +17 -4
  141. package/dist/core/reconciliation/postCommit.js.map +1 -1
  142. package/dist/core/reconciliation/queue.d.ts +21 -0
  143. package/dist/core/reconciliation/queue.d.ts.map +1 -0
  144. package/dist/core/reconciliation/queue.js +55 -0
  145. package/dist/core/reconciliation/queue.js.map +1 -0
  146. package/dist/core/reconciliation/render.d.ts.map +1 -1
  147. package/dist/core/reconciliation/render.js +9 -3
  148. package/dist/core/reconciliation/render.js.map +1 -1
  149. package/dist/core/reconciliation/runFiberComponents.d.ts +3 -1
  150. package/dist/core/reconciliation/runFiberComponents.d.ts.map +1 -1
  151. package/dist/core/reconciliation/runFiberComponents.js +33 -5
  152. package/dist/core/reconciliation/runFiberComponents.js.map +1 -1
  153. package/dist/core/reconciliation/typeGuards.d.ts +3 -0
  154. package/dist/core/reconciliation/typeGuards.d.ts.map +1 -1
  155. package/dist/core/reconciliation/typeGuards.js +13 -0
  156. package/dist/core/reconciliation/typeGuards.js.map +1 -1
  157. package/dist/core/reconciliation/validateApp.d.ts +1 -1
  158. package/dist/core/reconciliation/validateApp.d.ts.map +1 -1
  159. package/dist/core/reconciliation/validateApp.js +28 -21
  160. package/dist/core/reconciliation/validateApp.js.map +1 -1
  161. package/dist/hooks/helpers.d.ts +3 -3
  162. package/dist/hooks/helpers.d.ts.map +1 -1
  163. package/dist/hooks/helpers.js +3 -2
  164. package/dist/hooks/helpers.js.map +1 -1
  165. package/dist/hooks/index.d.ts +2 -1
  166. package/dist/hooks/index.d.ts.map +1 -1
  167. package/dist/hooks/index.js +2 -1
  168. package/dist/hooks/index.js.map +1 -1
  169. package/dist/hooks/useContext.d.ts.map +1 -1
  170. package/dist/hooks/useContext.js +6 -6
  171. package/dist/hooks/useContext.js.map +1 -1
  172. package/dist/hooks/useEffect.d.ts +2 -1
  173. package/dist/hooks/useEffect.d.ts.map +1 -1
  174. package/dist/hooks/useEffect.js +21 -7
  175. package/dist/hooks/useEffect.js.map +1 -1
  176. package/dist/hooks/useError.d.ts +5 -0
  177. package/dist/hooks/useError.d.ts.map +1 -0
  178. package/dist/hooks/useError.js +19 -0
  179. package/dist/hooks/useError.js.map +1 -0
  180. package/dist/hooks/useReducer.d.ts +7 -0
  181. package/dist/hooks/useReducer.d.ts.map +1 -0
  182. package/dist/hooks/useReducer.js +10 -0
  183. package/dist/hooks/useReducer.js.map +1 -0
  184. package/dist/hooks/useRef.d.ts +8 -3
  185. package/dist/hooks/useRef.d.ts.map +1 -1
  186. package/dist/hooks/useRef.js +27 -0
  187. package/dist/hooks/useRef.js.map +1 -1
  188. package/dist/hooks/useState.d.ts +1 -1
  189. package/dist/hooks/useState.d.ts.map +1 -1
  190. package/dist/hooks/useState.js +3 -6
  191. package/dist/hooks/useState.js.map +1 -1
  192. package/dist/index.d.ts +3 -0
  193. package/dist/index.d.ts.map +1 -1
  194. package/dist/index.js +1 -0
  195. package/dist/index.js.map +1 -1
  196. package/dist/jsx.d.ts +159 -44
  197. package/dist/mocks.d.ts +0 -7
  198. package/dist/mocks.d.ts.map +1 -1
  199. package/dist/mocks.js +0 -6
  200. package/dist/mocks.js.map +1 -1
  201. package/dist/react.d.ts +46 -0
  202. package/dist/types/actions.d.ts +23 -5
  203. package/dist/types/actions.d.ts.map +1 -1
  204. package/dist/types/app.d.ts +17 -3
  205. package/dist/types/app.d.ts.map +1 -1
  206. package/dist/types/attributes.d.ts +42 -0
  207. package/dist/types/attributes.d.ts.map +1 -0
  208. package/dist/types/attributes.js +2 -0
  209. package/dist/types/attributes.js.map +1 -0
  210. package/dist/types/common.d.ts +10 -1
  211. package/dist/types/common.d.ts.map +1 -1
  212. package/dist/types/component.d.ts +11 -2
  213. package/dist/types/component.d.ts.map +1 -1
  214. package/dist/types/context.d.ts +3 -2
  215. package/dist/types/context.d.ts.map +1 -1
  216. package/dist/types/core.d.ts +17 -13
  217. package/dist/types/core.d.ts.map +1 -1
  218. package/dist/types/dom.d.ts +23 -22
  219. package/dist/types/dom.d.ts.map +1 -1
  220. package/dist/types/events.d.ts +18 -11
  221. package/dist/types/events.d.ts.map +1 -1
  222. package/dist/types/fiber.d.ts +30 -12
  223. package/dist/types/fiber.d.ts.map +1 -1
  224. package/dist/types/fiber.js +5 -1
  225. package/dist/types/fiber.js.map +1 -1
  226. package/dist/types/hooks.d.ts +16 -6
  227. package/dist/types/hooks.d.ts.map +1 -1
  228. package/dist/types/react.d.ts +31 -0
  229. package/dist/types/react.d.ts.map +1 -0
  230. package/dist/types/react.js +2 -0
  231. package/dist/types/react.js.map +1 -0
  232. package/dist/types/refs.d.ts +5 -8
  233. package/dist/types/refs.d.ts.map +1 -1
  234. package/package.json +11 -3
@@ -1,6 +1,8 @@
1
- import { isCompactNone, isCompactSingleChild, tryToCompactNode, unwrapCompactFiber, } from '../compact';
2
- import { getAnchor, getFiberDomNodes } from './helpers';
3
- import { nullthrows } from '../../utils';
1
+ import { containerSym } from '../../types';
2
+ import { isEmptyContainer, isSingleChildContainer, isAutoContainer, } from '../compact';
3
+ import { asElement, getFiberDomNodes, getFirstContainerElement, } from './helpers';
4
+ import { nullthrowsForFiber, ReactError, } from '../reconciliation/errors/ReactError';
5
+ import { isFiberDead } from '../reconciliation/fibers';
4
6
  /**
5
7
  * Handles fiber tree layout updates when children have been modified. This
6
8
  * action is triggered when:
@@ -18,9 +20,11 @@ import { nullthrows } from '../../utils';
18
20
  * must be completed before this action runs.
19
21
  */
20
22
  export function relayoutAction(fiber, { before, after }) {
21
- if (after.size > 0) {
22
- // If `fiber` is in compact mode we may need to unwrap it.
23
- expandFiberWhenNeeded(fiber, after);
23
+ if (isSingleChildContainer(fiber)) {
24
+ // Fiber couldn't come here remaing a true single-child container:
25
+ // - Its only child is removed
26
+ // - … or now has a neighbor
27
+ fiber.element = containerSym;
24
28
  }
25
29
  if (after.size > 0) {
26
30
  // Determine what can be used as a starting point for inserting new children.
@@ -46,38 +50,29 @@ export function relayoutAction(fiber, { before, after }) {
46
50
  // Skip any nodes whose keys exist in `before`, since those are either
47
51
  // unchanged or already updated (their `after` entries served only as
48
52
  // references for the update process).
49
- fiber.children = [...after.keys()].map((key) => nullthrows(before.get(key) ?? after.get(key)).fiber);
50
- // If `fiber` has 0 or 1 DOM children, we can remove <!--begin|end--> brackets.
51
- tryToCompactNode(fiber);
52
- }
53
- /**
54
- * If the given fiber (a container) is in the compact mode we might need to
55
- * unwrap it.
56
- */
57
- const expandFiberWhenNeeded = (fiber, after) => {
58
- if (isCompactNone(fiber)) {
59
- // Case 1: it's <!--empty-->. It can't have children, so fix it.
60
- unwrapCompactFiber(fiber);
53
+ fiber.children = [...after.keys()].map((key) => nullthrowsForFiber(fiber, before.get(key) ?? after.get(key)).fiber);
54
+ if (after.size > 0 && isEmptyContainer(fiber)) {
55
+ // Convert !-- to auto-container, 'cause now it has children.
56
+ fiber.element.remove();
57
+ fiber.element = containerSym;
61
58
  }
62
- else if (isCompactSingleChild(fiber)) {
63
- if (after.size > 1) {
64
- // Case 2: It's in "single child" mode. Fix it to support multiple children.
65
- unwrapCompactFiber(fiber);
66
- }
67
- else {
68
- throw new Error(`Invalid state: "remove" action didn't unwrap the parent container node during deletion of the only child`);
69
- }
59
+ if (fiber.type !== 'tag') {
60
+ tryFixContainerType(fiber);
70
61
  }
71
- };
62
+ }
72
63
  /**
73
64
  * Puts the given `child` DOM nodes into the `parent`'s DOM area at the anchor
74
65
  * position (`container` + `prev`). Updates the `child`'s parent node.
75
66
  */
76
67
  const insertNewFiber = (parent, container, prev, child) => {
77
- const newChildren = [...child.parent.element.childNodes];
68
+ const parentElement = child.parent.element;
69
+ if (!(parentElement instanceof Element)) {
70
+ throw new ReactError(child.parent, `Wrong temporary container`);
71
+ }
72
+ const newChildren = [...parentElement.childNodes];
78
73
  if (!prev) {
79
74
  container.prepend(...newChildren);
80
- prev = nullthrows(newChildren.at(-1));
75
+ prev = nullthrowsForFiber(parent, newChildren.at(-1));
81
76
  }
82
77
  else {
83
78
  for (const n of newChildren) {
@@ -108,6 +103,100 @@ const repositionFiberWhenNeeded = (fiber, container, prev) => {
108
103
  prev = n;
109
104
  }
110
105
  }
111
- return nullthrows(fiber.element);
106
+ return nodes.at(-1);
107
+ };
108
+ /**
109
+ * Finds the anchor DOM node for attaching other nodes. There are two scenarios:
110
+ * 1) [element, null] - the new node should be added to the beginning of the
111
+ * element;
112
+ * 2) [element, child] - the new node should be added right after `child`.
113
+ */
114
+ const getAnchor = (fiber) => {
115
+ if (fiber.type === 'tag') {
116
+ return [
117
+ asElement(fiber.data instanceof HTMLElement
118
+ ? fiber.data // Portal's `element` is !--r:portal
119
+ : fiber.element),
120
+ null,
121
+ ];
122
+ }
123
+ if (fiber.type === 'component' || fiber.type === 'fragment') {
124
+ if (isEmptyContainer(fiber)) {
125
+ // Put other nodes right after !--empty. The !--empty will be removed
126
+ // afterwards, but for now it'll be anchor.
127
+ return [fiber.element.parentElement, fiber.element];
128
+ }
129
+ if (isSingleChildContainer(fiber)) {
130
+ // The node has only one node. This node was not removed in this render
131
+ // (otherwise `fiber` would be converted into !--empty). Put other nodes
132
+ // right after this one. It can temporarily violate the right order, but
133
+ // it'll be automatically healed in the same for-cycle.
134
+ return [fiber.element.parentElement, fiber.element];
135
+ }
136
+ if (isAutoContainer(fiber)) {
137
+ // Find any child fiber that wasn't removed in this render. Use it's as an
138
+ // anchor. It's not necessarily the 1st node, but relyout will recover the
139
+ // right order anyway.
140
+ const survivedChild = nullthrowsForFiber(fiber, fiber.children.find((f) => !isFiberDead(f)));
141
+ const element = getFirstContainerElement(fiber, [survivedChild]);
142
+ return [element.parentElement, element];
143
+ }
144
+ }
145
+ // "text" & "null" types cannot contain children.
146
+ throw new ReactError(fiber, `Unsupported anchor type: ${fiber.type}`);
147
+ };
148
+ export const tryFixContainerType = (fiber) => {
149
+ // Handle the node itself.
150
+ switch (fiber.children.length) {
151
+ case 0: {
152
+ if (!isEmptyContainer(fiber)) {
153
+ throw new ReactError(fiber, `Can't recover !--empty fiber container`);
154
+ }
155
+ break;
156
+ }
157
+ case 1: {
158
+ if (isEmptyContainer(fiber)) {
159
+ throw new ReactError(fiber, `!--empty fibers can't have child nodes`);
160
+ }
161
+ if (isAutoContainer(fiber) && !isAutoContainer(fiber.children[0])) {
162
+ fiber.element = getFirstContainerElement(fiber);
163
+ }
164
+ break;
165
+ }
166
+ default: {
167
+ if (isEmptyContainer(fiber)) {
168
+ throw new ReactError(fiber, `Incorrect !--empty fiber`);
169
+ }
170
+ if (isSingleChildContainer(fiber)) {
171
+ fiber.element = containerSym;
172
+ }
173
+ }
174
+ }
175
+ if (fiber.parent.type === 'tag') {
176
+ return;
177
+ }
178
+ // Handle its parent.
179
+ switch (fiber.parent.children.length) {
180
+ case 0: {
181
+ throw new ReactError(fiber.parent, 'This fiber cannot be empty');
182
+ }
183
+ case 1: {
184
+ if (fiber.parent.element !== fiber.element) {
185
+ // Two scenarios:
186
+ // 1. fiber is a single-child node or a !--empty node. In such a case
187
+ // its parent should refer to the same DOM node.
188
+ // 2. fiber is an auto-container. Then the parent node must be an auto-
189
+ // container too.
190
+ tryFixContainerType(fiber.parent);
191
+ }
192
+ break;
193
+ }
194
+ default: {
195
+ if (!isAutoContainer(fiber.parent)) {
196
+ // Only auto-containers may contain 2+ nodes.
197
+ tryFixContainerType(fiber.parent);
198
+ }
199
+ }
200
+ }
112
201
  };
113
202
  //# sourceMappingURL=relayout.action.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"relayout.action.js","sourceRoot":"","sources":["../../../src/core/actions/relayout.action.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"relayout.action.js","sourceRoot":"","sources":["../../../src/core/actions/relayout.action.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import type { FiberNode } from '../../types';
1
+ import { type FiberNode } from '../../types';
2
2
  import type { RemoveAction } from '../../types/actions';
3
3
  /**
4
4
  * This action can be called directly (<div/> -> []), or indirectly (<div/> ->
5
5
  * false) from the replace action. `replaced` is `true` in the 2nd scenario.
6
6
  */
7
- export declare function removeAction(fiber: FiberNode, { immediate }: RemoveAction): void;
7
+ export declare function removeAction(fiber: FiberNode, { immediate, last }?: Pick<RemoveAction, 'immediate' | 'last'>): void;
8
8
  //# sourceMappingURL=remove.action.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"remove.action.d.ts","sourceRoot":"","sources":["../../../src/core/actions/remove.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,SAAS,EAEV,MAAM,oBAAoB,CAAC;AAI5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,EAAE,YAAY,QAkCzE"}
1
+ {"version":3,"file":"remove.action.d.ts","sourceRoot":"","sources":["../../../src/core/actions/remove.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EAEf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAI/D;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,EAChB,EAAE,SAAS,EAAE,IAAI,EAAE,GAAE,IAAI,CAAC,YAAY,EAAE,WAAW,GAAG,MAAM,CAAM,QA0CnE"}
@@ -1,37 +1,40 @@
1
- import { isCompactSingleChild, unwrapCompactFiber } from '../compact';
2
- import { emptyFiberNode, getFiberDomNodes, unsetRef } from './helpers';
3
- import { applyAction } from './applyAction';
1
+ import { emptyFiberNode, unsetRef } from './helpers';
2
+ import { ReactError } from '../reconciliation/errors/ReactError';
3
+ import { buildComment } from '../reconciliation/comments';
4
4
  /**
5
5
  * This action can be called directly (<div/> -> []), or indirectly (<div/> ->
6
6
  * false) from the replace action. `replaced` is `true` in the 2nd scenario.
7
7
  */
8
- export function removeAction(fiber, { immediate }) {
9
- for (const child of fiber.children) {
8
+ export function removeAction(fiber, { immediate, last } = {}) {
9
+ for (const [idx, child] of fiber.children.entries()) {
10
10
  // Recursively remove all children before removing the parent node. This is
11
11
  // critical for components with effects - we must run cleanup effects
12
12
  // before removing their parent nodes.
13
- applyAction({ type: 'Remove', fiber: child, immediate });
13
+ removeAction(child, { immediate, last: idx === fiber.children.length - 1 });
14
14
  }
15
15
  if (fiber.type === 'component') {
16
16
  destroyHooks(fiber);
17
17
  }
18
18
  else if (fiber.role === 'context' && fiber.data.consumers.size > 0) {
19
- throw new Error(`One of the context consumers wasn't unmounted`);
19
+ throw new ReactError(fiber, `One of the context consumers wasn't unmounted`);
20
20
  }
21
21
  else if (fiber.type === 'tag' && fiber.role !== 'portal') {
22
22
  unlistenTagEvents(fiber);
23
23
  }
24
- if (isCompactSingleChild(fiber.parent)) {
25
- // Can't remove `fiber` when its parent lacks its own direct DOM node.
26
- // We need to unwrap the compact-fiber (create <!--begin|end--> wrappers).
27
- unwrapCompactFiber(fiber.parent);
24
+ if (last && fiber.parent.type !== 'tag') {
25
+ // At this point if `fiber` is a component or a fragment its element is a
26
+ // !--empty comment. It was converted to !--empty on the last child removal.
27
+ const anchor = fiber.element;
28
+ // Do the same for the parent fragment|component fiber node:
29
+ const empty = buildComment('empty', fiber.parent.id);
30
+ anchor.parentElement.insertBefore(empty, anchor);
31
+ fiber.parent.element = empty;
28
32
  }
29
- for (const n of getFiberDomNodes(fiber)) {
30
- if (n.childNodes.length > 0) {
31
- throw new Error(`Remove: Node is not empty`);
32
- }
33
- n.remove();
33
+ if (!(fiber.element instanceof Node)) {
34
+ throw new ReactError(fiber, `Couldn't remove a fiber without DOM element`);
34
35
  }
36
+ // Text, tag, !--null or !--empty
37
+ fiber.element.remove();
35
38
  if (fiber.ref) {
36
39
  unsetRef(fiber, !!immediate);
37
40
  }
@@ -46,7 +49,7 @@ export function removeAction(fiber, { immediate }) {
46
49
  const unlistenTagEvents = (fiber) => {
47
50
  for (const record of Object.values(fiber.data.events)) {
48
51
  if (record?.wrapper) {
49
- fiber.element.removeEventListener(record.name, record.wrapper);
52
+ fiber.element.removeEventListener(record.name, record.wrapper, { capture: record.capture });
50
53
  }
51
54
  }
52
55
  };
@@ -1 +1 @@
1
- {"version":3,"file":"remove.action.js","sourceRoot":"","sources":["../../../src/core/actions/remove.action.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAAgB,EAAE,EAAE,SAAS,EAAgB,EAAE;IAC1E,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnC,2EAA2E;QAC3E,qEAAqE;QACrE,sCAAsC;QACtC,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC/B,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3D,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACvC,sEAAsE;QACtE,0EAA0E;QAC1E,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;QACD,CAAC,CAAC,MAAM,EAAE,CAAC;IACb,CAAC;IAED,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAED,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,gCAAgC;AAAjC,CACvB;AAED;;;;;GAKG;AACH,MAAM,iBAAiB,GAAG,CAAC,KAAmB,EAAQ,EAAE,CAAC;IACvD,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtD,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACnB,KAAK,CAAC,OAAuB,CAAC,mBAAmB,CAChD,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,OAAO,CACf,CAAC;QACJ,CAAC;IACH,CAAC;AAAA,CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,YAAY,GAAG,CAAC,KAAyB,EAAQ,EAAE,CAAC;IACxD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;QACvC,IAAI,YAAY,IAAI,IAAI,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;AAAA,CACJ,CAAC"}
1
+ {"version":3,"file":"remove.action.js","sourceRoot":"","sources":["../../../src/core/actions/remove.action.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { FiberNode } from '../../types';
1
+ import { type FiberNode } from '../../types';
2
2
  import type { ReplaceAction } from '../../types/actions';
3
3
  /**
4
4
  * Handles fiber replacement when a component with the same key renders a
@@ -1 +1 @@
1
- {"version":3,"file":"replace.action.d.ts","sourceRoot":"","sources":["../../../src/core/actions/replace.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,SAAS,EAEV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAMhE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,aAAa,QAuB1E"}
1
+ {"version":3,"file":"replace.action.d.ts","sourceRoot":"","sources":["../../../src/core/actions/replace.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,SAAS,EAEf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAMhE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,aAAa,QAgB1E"}
@@ -1,7 +1,7 @@
1
1
  import { getFiberDomNodes } from './helpers';
2
- import { isCompactSingleChild, unwrapCompactFiber } from '../compact';
3
- import { nullthrows } from '../../utils';
4
- import { applyAction } from './applyAction';
2
+ import { removeAction } from './remove.action';
3
+ import { nullthrowsForFiber } from '../reconciliation/errors/ReactError';
4
+ import { updateValueStore } from './dom/value';
5
5
  /**
6
6
  * Handles fiber replacement when a component with the same key renders a
7
7
  * completely different node. This happens when the `type`, `tag`, or
@@ -18,21 +18,15 @@ import { applyAction } from './applyAction';
18
18
  */
19
19
  export function replaceAction(fiber, { newFiber }) {
20
20
  const { parent } = fiber;
21
- if (isCompactSingleChild(parent)) {
22
- // The node we're replacing is the only child of its parent, so the parent
23
- // is in compact mode. We should unwrap it before removing this node,
24
- // otherwise it will be disconnected from the DOM tree.
25
- unwrapCompactFiber(parent);
26
- }
27
21
  // Add new nodes right after the previous nodes.
28
22
  const nodesBefore = getFiberDomNodes(fiber);
29
- let prev = nullthrows(nodesBefore.at(-1));
23
+ let prev = nullthrowsForFiber(fiber, nodesBefore.at(-1));
30
24
  const nodesAfter = getFiberDomNodes(newFiber);
31
25
  for (const n of nodesAfter) {
32
26
  prev.parentElement.insertBefore(n, prev.nextSibling);
33
27
  prev = n;
34
28
  }
35
- applyAction({ type: 'Remove', fiber });
29
+ removeAction(fiber);
36
30
  fiber.parent = parent; // undo `parent = null` (done in "Remove").
37
31
  displaceFiber(fiber, newFiber);
38
32
  }
@@ -54,22 +48,39 @@ const displaceFiber = (before, after) => {
54
48
  before.props = after.props;
55
49
  before.ref = after.ref;
56
50
  if (after.type === 'component') {
57
- for (const h of after.data.hooks) {
58
- if ('move' in h) {
59
- h.move(before);
60
- }
51
+ moveHooks(before, after);
52
+ }
53
+ else if (after.role === 'context') {
54
+ updateContext(before, after);
55
+ }
56
+ else if (after.type === 'tag') {
57
+ updateValueStore(before);
58
+ }
59
+ // For debug purposes mark dead nodes with a negative number.
60
+ after.id = -after.id;
61
+ };
62
+ const moveHooks = (before, after) => {
63
+ for (const hook of after.data.hooks) {
64
+ if ('move' in hook) {
65
+ // Update internal fiber links
66
+ hook.move(before);
67
+ // TODO: add a test ^.
61
68
  }
62
69
  }
63
- if (after.role === 'context') {
64
- for (const f of after.data.consumers) {
65
- if (f.id < 0) {
66
- throw 'what?';
67
- }
68
- const hook = f.data.hooks.find((h) => h.type === 'context' && h.ctx === after.data.ctx);
70
+ };
71
+ /**
72
+ * ContextFiberNode's `data.consumers` is a Set of components whose `useContext`
73
+ * target the given `data.ctx`. At the same time the `useContext` state
74
+ * preserves a link to the closest parent context provider of the given context
75
+ * type. That means once we `displace` the context provider we must update the
76
+ * hook states.
77
+ */
78
+ const updateContext = (before, after) => {
79
+ for (const consumer of after.data.consumers) {
80
+ const useConextItems = consumer.data.hooks.filter((hook) => hook.type === 'context' && hook.ctx === after.data.ctx);
81
+ for (const hook of useConextItems) {
69
82
  hook.providerFiber = before;
70
83
  }
71
84
  }
72
- // For debug purposes mark dead nodes with a negative number.
73
- after.id = -after.id;
74
85
  };
75
86
  //# sourceMappingURL=replace.action.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"replace.action.js","sourceRoot":"","sources":["../../../src/core/actions/replace.action.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"replace.action.js","sourceRoot":"","sources":["../../../src/core/actions/replace.action.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type FiberNode } from '../../types';
2
+ import type { ScheduleEffectAction } from '../../types/actions';
3
+ /**
4
+ * Adds the given effect to the appropriate effect queue.
5
+ */
6
+ export declare function scheduleEffectAction(fiber: FiberNode, { fn, mode }: Pick<ScheduleEffectAction, 'fn' | 'mode'>): void;
7
+ //# sourceMappingURL=scheduleEffect.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduleEffect.action.d.ts","sourceRoot":"","sources":["../../../src/core/actions/scheduleEffect.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAGvE;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,EAChB,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,oBAAoB,EAAE,IAAI,GAAG,MAAM,CAAC,QAGxD"}
@@ -0,0 +1,8 @@
1
+ import { scheduleEffect } from '../reconciliation/effects';
2
+ /**
3
+ * Adds the given effect to the appropriate effect queue.
4
+ */
5
+ export function scheduleEffectAction(fiber, { fn, mode }) {
6
+ scheduleEffect(fiber, fn, mode);
7
+ }
8
+ //# sourceMappingURL=scheduleEffect.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduleEffect.action.js","sourceRoot":"","sources":["../../../src/core/actions/scheduleEffect.action.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAgB,EAChB,EAAE,EAAE,EAAE,IAAI,EAA6C,EACvD;IACA,cAAc,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;AAAA,CACjC"}
@@ -5,5 +5,5 @@ import type { SetAttrAction } from '../../types/actions';
5
5
  * - Removing, adding or updating an attribute
6
6
  * - Removing, adding or replacing an event handler
7
7
  */
8
- export declare function setAttrAction(fiber: FiberNode, { name, value }: SetAttrAction): void;
8
+ export declare function setAttrAction(fiber: FiberNode, { name, value, creation }: Pick<SetAttrAction, 'name' | 'value' | 'creation'>): void;
9
9
  //# sourceMappingURL=setAttr.action.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"setAttr.action.d.ts","sourceRoot":"","sources":["../../../src/core/actions/setAttr.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAQhE;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,EAChB,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,aAAa,QA8B/B"}
1
+ {"version":3,"file":"setAttr.action.d.ts","sourceRoot":"","sources":["../../../src/core/actions/setAttr.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAahE;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,EAChB,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC,QA+C9E"}
@@ -1,28 +1,49 @@
1
- import { nullthrows } from '../../utils';
2
1
  import { isEventName } from './helpers';
3
2
  import { setSvgAttribute } from './dom/svg';
4
3
  import { setTagStyles } from './dom/css';
5
4
  import { setEventHandler } from './dom/events';
6
5
  import { setHtmlAttribute } from './dom/attributes';
6
+ import { changeControlValue, setValueAttr } from './dom/value';
7
+ import { nullthrowsForFiber, ReactError, } from '../reconciliation/errors/ReactError';
8
+ import { isSetHtml } from '../reconciliation/typeGuards';
7
9
  /**
8
10
  * Applicable only to DOM tag nodes and handles the following scenarios:
9
11
  * - Removing, adding or updating an attribute
10
12
  * - Removing, adding or replacing an event handler
11
13
  */
12
- export function setAttrAction(fiber, { name, value }) {
14
+ export function setAttrAction(fiber, { name, value, creation }) {
13
15
  if (fiber.type !== 'tag') {
14
- throw new Error(`Can't apply SetAttr to a ${fiber.type} node`);
16
+ throw new ReactError(fiber, `Can't apply SetAttr to a ${fiber.type} node`);
15
17
  }
16
18
  if (fiber.role === 'portal') {
17
- throw new Error(`Can't apply SetAttr to a portal node`);
19
+ throw new ReactError(fiber, `Can't apply SetAttr to a portal node`);
18
20
  }
19
- const element = nullthrows(fiber.element);
20
- if (isEventName(name) || name in fiber.data.events) {
21
+ const element = nullthrowsForFiber(fiber, fiber.element);
22
+ if (isControllableAttrValue(fiber.element, name)) {
23
+ setValueAttr(fiber, name, value);
24
+ }
25
+ else if (name === 'defaultChecked' && element instanceof HTMLInputElement) {
26
+ if (creation) {
27
+ changeControlValue(fiber, element, 'checked', value);
28
+ }
29
+ }
30
+ else if (name === 'defaultValue' &&
31
+ (element instanceof HTMLInputElement ||
32
+ element instanceof HTMLTextAreaElement ||
33
+ element instanceof HTMLSelectElement)) {
34
+ if (creation) {
35
+ changeControlValue(fiber, element, 'value', value);
36
+ }
37
+ }
38
+ else if (isEventName(name) || name in fiber.data.events) {
21
39
  setEventHandler(fiber, element, name, value);
22
40
  }
23
41
  else if (name === 'style') {
24
42
  setTagStyles(fiber, value);
25
43
  }
44
+ else if (name === 'dangerouslySetInnerHTML' && isSetHtml(value)) {
45
+ element.innerHTML = value.__html;
46
+ }
26
47
  else if (value == null) {
27
48
  element.removeAttribute(name);
28
49
  }
@@ -40,4 +61,24 @@ export function setAttrAction(fiber, { name, value }) {
40
61
  }
41
62
  }
42
63
  }
64
+ /**
65
+ * Returns true if the given attribute is the controllable (by React) value of
66
+ * the given HTML control. E.g.:
67
+ * - for input[type=text] the value attributes is "value"
68
+ * - but for input[type="radio"] it's "checked", whereas "value" is just a
69
+ * optional string attribute.
70
+ */
71
+ const isControllableAttrValue = (element, name) => {
72
+ if (element instanceof HTMLInputElement) {
73
+ const { type } = element;
74
+ return type === 'radio' || type === 'checkbox'
75
+ ? name === 'checked'
76
+ : name === 'value';
77
+ }
78
+ if (element instanceof HTMLTextAreaElement ||
79
+ element instanceof HTMLSelectElement) {
80
+ return name === 'value';
81
+ }
82
+ return false;
83
+ };
43
84
  //# sourceMappingURL=setAttr.action.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"setAttr.action.js","sourceRoot":"","sources":["../../../src/core/actions/setAttr.action.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAgB,EAChB,EAAE,IAAI,EAAE,KAAK,EAAiB,EAC9B;IACA,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAE1C,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACnD,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;SAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;SAAM,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,kEAAkE;QAClE,mCAAmC;QACnC,IAAI,QAAQ,KAAK,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,IAAI,OAAO,YAAY,UAAU,EAAE,CAAC;gBAClC,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,gBAAgB,CAAC,OAAsB,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;IACH,CAAC;AAAA,CACF"}
1
+ {"version":3,"file":"setAttr.action.js","sourceRoot":"","sources":["../../../src/core/actions/setAttr.action.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"setProps.action.d.ts","sourceRoot":"","sources":["../../../src/core/actions/setProps.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,cAAc,QASzE"}
1
+ {"version":3,"file":"setProps.action.d.ts","sourceRoot":"","sources":["../../../src/core/actions/setProps.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAGjE;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,cAAc,QAYzE"}
@@ -1,3 +1,4 @@
1
+ import { ReactError } from '../reconciliation/errors/ReactError';
1
2
  /**
2
3
  * Updates the set of props for the given fiber node. This doesn't make any
3
4
  * DOM changes or run components.
@@ -6,7 +7,7 @@ export function setPropsAction(fiber, { props }) {
6
7
  if (fiber.type !== 'component' &&
7
8
  fiber.type !== 'tag' &&
8
9
  fiber.role !== 'context') {
9
- throw new Error(`setProps action is not applicable to this fiber node`);
10
+ throw new ReactError(fiber, `setProps action is not applicable to this fiber node`);
10
11
  }
11
12
  fiber.props = props;
12
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"setProps.action.js","sourceRoot":"","sources":["../../../src/core/actions/setProps.action.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAgB,EAAE,EAAE,KAAK,EAAkB,EAAE;IAC1E,IACE,KAAK,CAAC,IAAI,KAAK,WAAW;QAC1B,KAAK,CAAC,IAAI,KAAK,KAAK;QACpB,KAAK,CAAC,IAAI,KAAK,SAAS,EACxB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AAAA,CACrB"}
1
+ {"version":3,"file":"setProps.action.js","sourceRoot":"","sources":["../../../src/core/actions/setProps.action.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAEjE;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAgB,EAAE,EAAE,KAAK,EAAkB,EAAE;IAC1E,IACE,KAAK,CAAC,IAAI,KAAK,WAAW;QAC1B,KAAK,CAAC,IAAI,KAAK,KAAK;QACpB,KAAK,CAAC,IAAI,KAAK,SAAS,EACxB,CAAC;QACD,MAAM,IAAI,UAAU,CAClB,KAAK,EACL,sDAAsD,CACvD,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AAAA,CACrB"}
@@ -7,5 +7,5 @@ import type { SetRefAction } from '../../types/actions';
7
7
  *
8
8
  * Removing nodes with ref handlers is handled in remove and replace actions.
9
9
  */
10
- export declare function setRefAction(fiber: FiberNode, { ref, dontUnsetRef }: SetRefAction): void;
10
+ export declare function setRefAction(fiber: FiberNode, { ref, dontUnsetRef }: Pick<SetRefAction, 'ref' | 'dontUnsetRef'>): void;
11
11
  //# sourceMappingURL=setRef.action.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"setRef.action.d.ts","sourceRoot":"","sources":["../../../src/core/actions/setRef.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAK/D;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,EAChB,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,YAAY,QAgCpC"}
1
+ {"version":3,"file":"setRef.action.d.ts","sourceRoot":"","sources":["../../../src/core/actions/setRef.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAQ/D;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,EAChB,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,cAAc,CAAC,QAmClE"}