@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.
- package/README.md +43 -21
- package/dist/core/actions/applyAction.d.ts.map +1 -1
- package/dist/core/actions/applyAction.js +6 -0
- package/dist/core/actions/applyAction.js.map +1 -1
- package/dist/core/actions/catchError.action.d.ts +10 -0
- package/dist/core/actions/catchError.action.d.ts.map +1 -0
- package/dist/core/actions/catchError.action.js +51 -0
- package/dist/core/actions/catchError.action.js.map +1 -0
- package/dist/core/actions/createComment.action.d.ts +2 -2
- package/dist/core/actions/createComment.action.d.ts.map +1 -1
- package/dist/core/actions/createComment.action.js +1 -8
- package/dist/core/actions/createComment.action.js.map +1 -1
- package/dist/core/actions/createContainer.action.d.ts +7 -0
- package/dist/core/actions/createContainer.action.d.ts.map +1 -0
- package/dist/core/actions/createContainer.action.js +28 -0
- package/dist/core/actions/createContainer.action.js.map +1 -0
- package/dist/core/actions/createTag.action.d.ts +2 -1
- package/dist/core/actions/createTag.action.d.ts.map +1 -1
- package/dist/core/actions/createTag.action.js +22 -4
- package/dist/core/actions/createTag.action.js.map +1 -1
- package/dist/core/actions/createText.action.d.ts.map +1 -1
- package/dist/core/actions/createText.action.js +2 -5
- package/dist/core/actions/createText.action.js.map +1 -1
- package/dist/core/actions/dom/attributes.d.ts.map +1 -1
- package/dist/core/actions/dom/attributes.js +4 -1
- package/dist/core/actions/dom/attributes.js.map +1 -1
- package/dist/core/actions/dom/css.d.ts.map +1 -1
- package/dist/core/actions/dom/css.js +2 -1
- package/dist/core/actions/dom/css.js.map +1 -1
- package/dist/core/actions/dom/events.d.ts.map +1 -1
- package/dist/core/actions/dom/events.js +15 -3
- package/dist/core/actions/dom/events.js.map +1 -1
- package/dist/core/actions/dom/value.d.ts +18 -0
- package/dist/core/actions/dom/value.d.ts.map +1 -0
- package/dist/core/actions/dom/value.js +211 -0
- package/dist/core/actions/dom/value.js.map +1 -0
- package/dist/core/actions/helpers.d.ts +17 -10
- package/dist/core/actions/helpers.d.ts.map +1 -1
- package/dist/core/actions/helpers.js +64 -70
- package/dist/core/actions/helpers.js.map +1 -1
- package/dist/core/actions/relayout.action.d.ts +2 -1
- package/dist/core/actions/relayout.action.d.ts.map +1 -1
- package/dist/core/actions/relayout.action.js +119 -30
- package/dist/core/actions/relayout.action.js.map +1 -1
- package/dist/core/actions/remove.action.d.ts +2 -2
- package/dist/core/actions/remove.action.d.ts.map +1 -1
- package/dist/core/actions/remove.action.js +20 -17
- package/dist/core/actions/remove.action.js.map +1 -1
- package/dist/core/actions/replace.action.d.ts +1 -1
- package/dist/core/actions/replace.action.d.ts.map +1 -1
- package/dist/core/actions/replace.action.js +34 -23
- package/dist/core/actions/replace.action.js.map +1 -1
- package/dist/core/actions/scheduleEffect.action.d.ts +7 -0
- package/dist/core/actions/scheduleEffect.action.d.ts.map +1 -0
- package/dist/core/actions/scheduleEffect.action.js +8 -0
- package/dist/core/actions/scheduleEffect.action.js.map +1 -0
- package/dist/core/actions/setAttr.action.d.ts +1 -1
- package/dist/core/actions/setAttr.action.d.ts.map +1 -1
- package/dist/core/actions/setAttr.action.js +47 -6
- package/dist/core/actions/setAttr.action.js.map +1 -1
- package/dist/core/actions/setProps.action.d.ts.map +1 -1
- package/dist/core/actions/setProps.action.js +2 -1
- package/dist/core/actions/setProps.action.js.map +1 -1
- package/dist/core/actions/setRef.action.d.ts +1 -1
- package/dist/core/actions/setRef.action.d.ts.map +1 -1
- package/dist/core/actions/setRef.action.js +5 -6
- package/dist/core/actions/setRef.action.js.map +1 -1
- package/dist/core/actions/setText.action.d.ts.map +1 -1
- package/dist/core/actions/setText.action.js +3 -3
- package/dist/core/actions/setText.action.js.map +1 -1
- package/dist/core/classComponent.d.ts +2 -1
- package/dist/core/classComponent.d.ts.map +1 -1
- package/dist/core/classComponent.js +20 -12
- package/dist/core/classComponent.js.map +1 -1
- package/dist/core/compact.d.ts +10 -29
- package/dist/core/compact.d.ts.map +1 -1
- package/dist/core/compact.js +12 -100
- package/dist/core/compact.js.map +1 -1
- package/dist/core/components.d.ts +6 -4
- package/dist/core/components.d.ts.map +1 -1
- package/dist/core/components.js +26 -8
- package/dist/core/components.js.map +1 -1
- package/dist/core/createElement.d.ts +2 -8
- package/dist/core/createElement.d.ts.map +1 -1
- package/dist/core/createElement.js +3 -1
- package/dist/core/createElement.js.map +1 -1
- package/dist/core/reactNodeToFiberNode.d.ts +3 -1
- package/dist/core/reactNodeToFiberNode.d.ts.map +1 -1
- package/dist/core/reactNodeToFiberNode.js +80 -17
- package/dist/core/reactNodeToFiberNode.js.map +1 -1
- package/dist/core/reconciliation/app.js +3 -3
- package/dist/core/reconciliation/app.js.map +1 -1
- package/dist/core/reconciliation/collect/fromApp.d.ts +2 -1
- package/dist/core/reconciliation/collect/fromApp.d.ts.map +1 -1
- package/dist/core/reconciliation/collect/fromApp.js +7 -26
- package/dist/core/reconciliation/collect/fromApp.js.map +1 -1
- package/dist/core/reconciliation/collect/fromChildrenPair.d.ts +2 -1
- package/dist/core/reconciliation/collect/fromChildrenPair.d.ts.map +1 -1
- package/dist/core/reconciliation/collect/fromChildrenPair.js +37 -10
- package/dist/core/reconciliation/collect/fromChildrenPair.js.map +1 -1
- package/dist/core/reconciliation/collect/fromComponent.d.ts +3 -2
- package/dist/core/reconciliation/collect/fromComponent.d.ts.map +1 -1
- package/dist/core/reconciliation/collect/fromComponent.js +27 -9
- package/dist/core/reconciliation/collect/fromComponent.js.map +1 -1
- package/dist/core/reconciliation/collect/fromFiberPair.d.ts +2 -1
- package/dist/core/reconciliation/collect/fromFiberPair.d.ts.map +1 -1
- package/dist/core/reconciliation/collect/fromFiberPair.js +8 -5
- package/dist/core/reconciliation/collect/fromFiberPair.js.map +1 -1
- package/dist/core/reconciliation/collect/fromNewFiber.d.ts.map +1 -1
- package/dist/core/reconciliation/collect/fromNewFiber.js +7 -15
- package/dist/core/reconciliation/collect/fromNewFiber.js.map +1 -1
- package/dist/core/reconciliation/effects.d.ts +2 -2
- package/dist/core/reconciliation/effects.d.ts.map +1 -1
- package/dist/core/reconciliation/effects.js +52 -4
- package/dist/core/reconciliation/effects.js.map +1 -1
- package/dist/core/reconciliation/errors/ReactError.d.ts +15 -0
- package/dist/core/reconciliation/errors/ReactError.d.ts.map +1 -0
- package/dist/core/reconciliation/errors/ReactError.js +56 -0
- package/dist/core/reconciliation/errors/ReactError.js.map +1 -0
- package/dist/core/reconciliation/errors/stack.d.ts +8 -2
- package/dist/core/reconciliation/errors/stack.d.ts.map +1 -1
- package/dist/core/reconciliation/errors/stack.js +65 -8
- package/dist/core/reconciliation/errors/stack.js.map +1 -1
- package/dist/core/reconciliation/fibers.d.ts +1 -0
- package/dist/core/reconciliation/fibers.d.ts.map +1 -1
- package/dist/core/reconciliation/fibers.js +3 -2
- package/dist/core/reconciliation/fibers.js.map +1 -1
- package/dist/core/reconciliation/heap.d.ts +18 -0
- package/dist/core/reconciliation/heap.d.ts.map +1 -0
- package/dist/core/reconciliation/heap.js +81 -0
- package/dist/core/reconciliation/heap.js.map +1 -0
- package/dist/core/reconciliation/invalidateFiber.d.ts.map +1 -1
- package/dist/core/reconciliation/invalidateFiber.js +6 -5
- package/dist/core/reconciliation/invalidateFiber.js.map +1 -1
- package/dist/core/reconciliation/mount.d.ts.map +1 -1
- package/dist/core/reconciliation/mount.js +24 -6
- package/dist/core/reconciliation/mount.js.map +1 -1
- package/dist/core/reconciliation/postCommit.d.ts +1 -1
- package/dist/core/reconciliation/postCommit.d.ts.map +1 -1
- package/dist/core/reconciliation/postCommit.js +17 -4
- package/dist/core/reconciliation/postCommit.js.map +1 -1
- package/dist/core/reconciliation/queue.d.ts +21 -0
- package/dist/core/reconciliation/queue.d.ts.map +1 -0
- package/dist/core/reconciliation/queue.js +55 -0
- package/dist/core/reconciliation/queue.js.map +1 -0
- package/dist/core/reconciliation/render.d.ts.map +1 -1
- package/dist/core/reconciliation/render.js +9 -3
- package/dist/core/reconciliation/render.js.map +1 -1
- package/dist/core/reconciliation/runFiberComponents.d.ts +3 -1
- package/dist/core/reconciliation/runFiberComponents.d.ts.map +1 -1
- package/dist/core/reconciliation/runFiberComponents.js +33 -5
- package/dist/core/reconciliation/runFiberComponents.js.map +1 -1
- package/dist/core/reconciliation/typeGuards.d.ts +3 -0
- package/dist/core/reconciliation/typeGuards.d.ts.map +1 -1
- package/dist/core/reconciliation/typeGuards.js +13 -0
- package/dist/core/reconciliation/typeGuards.js.map +1 -1
- package/dist/core/reconciliation/validateApp.d.ts +1 -1
- package/dist/core/reconciliation/validateApp.d.ts.map +1 -1
- package/dist/core/reconciliation/validateApp.js +28 -21
- package/dist/core/reconciliation/validateApp.js.map +1 -1
- package/dist/hooks/helpers.d.ts +3 -3
- package/dist/hooks/helpers.d.ts.map +1 -1
- package/dist/hooks/helpers.js +3 -2
- package/dist/hooks/helpers.js.map +1 -1
- package/dist/hooks/index.d.ts +2 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useContext.d.ts.map +1 -1
- package/dist/hooks/useContext.js +6 -6
- package/dist/hooks/useContext.js.map +1 -1
- package/dist/hooks/useEffect.d.ts +2 -1
- package/dist/hooks/useEffect.d.ts.map +1 -1
- package/dist/hooks/useEffect.js +21 -7
- package/dist/hooks/useEffect.js.map +1 -1
- package/dist/hooks/useError.d.ts +5 -0
- package/dist/hooks/useError.d.ts.map +1 -0
- package/dist/hooks/useError.js +19 -0
- package/dist/hooks/useError.js.map +1 -0
- package/dist/hooks/useReducer.d.ts +7 -0
- package/dist/hooks/useReducer.d.ts.map +1 -0
- package/dist/hooks/useReducer.js +10 -0
- package/dist/hooks/useReducer.js.map +1 -0
- package/dist/hooks/useRef.d.ts +8 -3
- package/dist/hooks/useRef.d.ts.map +1 -1
- package/dist/hooks/useRef.js +27 -0
- package/dist/hooks/useRef.js.map +1 -1
- package/dist/hooks/useState.d.ts +1 -1
- package/dist/hooks/useState.d.ts.map +1 -1
- package/dist/hooks/useState.js +3 -6
- package/dist/hooks/useState.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/jsx.d.ts +159 -44
- package/dist/mocks.d.ts +0 -7
- package/dist/mocks.d.ts.map +1 -1
- package/dist/mocks.js +0 -6
- package/dist/mocks.js.map +1 -1
- package/dist/react.d.ts +46 -0
- package/dist/types/actions.d.ts +23 -5
- package/dist/types/actions.d.ts.map +1 -1
- package/dist/types/app.d.ts +17 -3
- package/dist/types/app.d.ts.map +1 -1
- package/dist/types/attributes.d.ts +42 -0
- package/dist/types/attributes.d.ts.map +1 -0
- package/dist/types/attributes.js +2 -0
- package/dist/types/attributes.js.map +1 -0
- package/dist/types/common.d.ts +10 -1
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/component.d.ts +11 -2
- package/dist/types/component.d.ts.map +1 -1
- package/dist/types/context.d.ts +3 -2
- package/dist/types/context.d.ts.map +1 -1
- package/dist/types/core.d.ts +17 -13
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/dom.d.ts +23 -22
- package/dist/types/dom.d.ts.map +1 -1
- package/dist/types/events.d.ts +18 -11
- package/dist/types/events.d.ts.map +1 -1
- package/dist/types/fiber.d.ts +30 -12
- package/dist/types/fiber.d.ts.map +1 -1
- package/dist/types/fiber.js +5 -1
- package/dist/types/fiber.js.map +1 -1
- package/dist/types/hooks.d.ts +16 -6
- package/dist/types/hooks.d.ts.map +1 -1
- package/dist/types/react.d.ts +31 -0
- package/dist/types/react.d.ts.map +1 -0
- package/dist/types/react.js +2 -0
- package/dist/types/react.js.map +1 -0
- package/dist/types/refs.d.ts +5 -8
- package/dist/types/refs.d.ts.map +1 -1
- package/package.json +11 -3
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { getAppByFiber } from '../../../core/reconciliation/app';
|
|
2
|
+
import { scheduleEffect } from '../../../core/reconciliation/effects';
|
|
3
|
+
import { nullthrowsForFiber } from '../../../core/reconciliation/errors/ReactError';
|
|
4
|
+
const stores = new WeakMap();
|
|
5
|
+
/**
|
|
6
|
+
* Original React has a very special behavior for the "onChange" event:
|
|
7
|
+
* - It treats "onChange" as an "onInput" event for form controls
|
|
8
|
+
* - If the "value" prop is provided and is not `null` or `undefined`, React
|
|
9
|
+
* treats the input as "controlled" and ignores user changes by restoring the
|
|
10
|
+
* original value after each input event
|
|
11
|
+
* - Even for controlled inputs, React still calls the "onChange" handler with
|
|
12
|
+
* the updated event.target.value before restoring the previous value
|
|
13
|
+
* - React overrides the property descriptor of the "value" property on the DOM
|
|
14
|
+
* element to intercept and track all value changes
|
|
15
|
+
*/
|
|
16
|
+
export const setValueAttr = (fiber, attrName, attrValue) => {
|
|
17
|
+
const element = fiber.element;
|
|
18
|
+
const app = getAppByFiber(fiber);
|
|
19
|
+
// We continue to reference the same `events` object even after calling
|
|
20
|
+
// `displaceFiber`, so this assumption should hold
|
|
21
|
+
const { events } = fiber.data;
|
|
22
|
+
if (!events[VALUE_EVENT]) {
|
|
23
|
+
const store = setUpStore(fiber, element, attrName);
|
|
24
|
+
const onInput = createOnInputHandler(app, element, attrName, store);
|
|
25
|
+
events[VALUE_EVENT] = {
|
|
26
|
+
name: 'input',
|
|
27
|
+
handler: null,
|
|
28
|
+
capture: false,
|
|
29
|
+
wrapper: onInput,
|
|
30
|
+
};
|
|
31
|
+
element.addEventListener('input', onInput, {
|
|
32
|
+
capture: events[VALUE_EVENT].capture,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const store = nullthrowsForFiber(fiber, stores.get(element));
|
|
36
|
+
store.prev = attrValue;
|
|
37
|
+
if (attrValue != null) {
|
|
38
|
+
store.set(attrValue, true);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
const VALUE_EVENT = 'x:input';
|
|
42
|
+
const setUpStore = (fiber, element, attrName) => {
|
|
43
|
+
const store = {
|
|
44
|
+
fiber,
|
|
45
|
+
prev: null,
|
|
46
|
+
cursor: null,
|
|
47
|
+
set: (valueRaw, restoreCursor) => changeControlValue(store.fiber, element, attrName, valueRaw, restoreCursor),
|
|
48
|
+
};
|
|
49
|
+
stores.set(element, store);
|
|
50
|
+
return store;
|
|
51
|
+
};
|
|
52
|
+
export const changeControlValue = (fiber, element, attrName, valueRaw, restoreCursor = false) => {
|
|
53
|
+
const value = toNativeValue(attrName, valueRaw);
|
|
54
|
+
if (element instanceof HTMLSelectElement) {
|
|
55
|
+
setSelectValue(fiber, element, value);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (element[attrName] === value) {
|
|
59
|
+
// Don't touch the value to avoid moving the cursor.
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
// Non-reactively update the native value.
|
|
63
|
+
element[attrName] = value;
|
|
64
|
+
if ((element instanceof HTMLInputElement ||
|
|
65
|
+
element instanceof HTMLTextAreaElement) &&
|
|
66
|
+
attrName === 'value' &&
|
|
67
|
+
restoreCursor) {
|
|
68
|
+
const store = stores.get(element);
|
|
69
|
+
if (store.cursor != null) {
|
|
70
|
+
element.selectionStart = element.selectionEnd = store.cursor;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
const createOnInputHandler = (app, element, attrName, store) => {
|
|
75
|
+
return function onInput() {
|
|
76
|
+
if (element instanceof HTMLInputElement &&
|
|
77
|
+
element.type === 'radio' &&
|
|
78
|
+
element.name) {
|
|
79
|
+
// Radio buttons require special group-based handling
|
|
80
|
+
onRadioClick(app, store.fiber, element);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const newValue = element[attrName];
|
|
84
|
+
if (store.prev == null)
|
|
85
|
+
return; // Uncontrolled component - allow changes
|
|
86
|
+
if (store.prev === newValue)
|
|
87
|
+
return; // No actual change occurred
|
|
88
|
+
scheduleResetValueEffect(store.fiber, () => {
|
|
89
|
+
// The following render could make the control uncontrolled. In such a
|
|
90
|
+
// case we shouldn't restore the value. Now it's in free flight.
|
|
91
|
+
if (store.prev == null)
|
|
92
|
+
return;
|
|
93
|
+
if ((element instanceof HTMLInputElement ||
|
|
94
|
+
element instanceof HTMLTextAreaElement) &&
|
|
95
|
+
attrName === 'value') {
|
|
96
|
+
store.cursor = element.selectionStart;
|
|
97
|
+
}
|
|
98
|
+
// Restore the previous value since this is a controlled element
|
|
99
|
+
store.set(store.prev);
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Radio button group handling:
|
|
105
|
+
*
|
|
106
|
+
* - Browsers don't emit "change" or "input" events for radio buttons that lose
|
|
107
|
+
* their "checked" state when another radio in the group is selected. The
|
|
108
|
+
* state change happens silently.
|
|
109
|
+
* - When a user selects a different radio button, the browser only emits an
|
|
110
|
+
* "input" event for the newly selected button. The event provides no
|
|
111
|
+
* information about which radio button was previously active.
|
|
112
|
+
* - Radio buttons form a group when they share the same "name" attribute within
|
|
113
|
+
* their containing <form> (or document if no form exists).
|
|
114
|
+
*
|
|
115
|
+
* This function enforces React's "controlled component" behavior for radio
|
|
116
|
+
* button groups. If any radio button in the group has "checked=true", all other
|
|
117
|
+
* radio buttons in the group must have "checked=false", even if they don't
|
|
118
|
+
* explicitly define a "checked" attribute (React assumes they do).
|
|
119
|
+
*/
|
|
120
|
+
const onRadioClick = (app, fiber, element) => {
|
|
121
|
+
scheduleResetValueEffect(fiber, () => {
|
|
122
|
+
// Find all radio buttons in the same group (same name within the form)
|
|
123
|
+
const form = element.closest('form') ?? app.root.element;
|
|
124
|
+
const radios = form.querySelectorAll(`input[type="radio"]`);
|
|
125
|
+
// Look for a radio button that was previously controlled with checked=true
|
|
126
|
+
for (let i = 0; i < radios.length; ++i) {
|
|
127
|
+
const radio = radios[i];
|
|
128
|
+
if (radio.name === element.name && stores.get(radio)?.prev === true) {
|
|
129
|
+
// Restore the previously checked radio button's state, which will
|
|
130
|
+
// automatically uncheck the currently selected one. The correct state
|
|
131
|
+
// will be updated in the next render if setState was called from the
|
|
132
|
+
// user's onChange handler
|
|
133
|
+
stores.get(radio).set(true);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const store = stores.get(element);
|
|
138
|
+
if (typeof store?.prev === 'boolean') {
|
|
139
|
+
// A single uncontrolled radio button with checked="false".
|
|
140
|
+
store.set(store.prev);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
/**
|
|
145
|
+
* Converts React prop values to native DOM values:
|
|
146
|
+
* - value: null | undefined → '' (empty string, not "null")
|
|
147
|
+
* - checked: any value → boolean conversion
|
|
148
|
+
*/
|
|
149
|
+
const toNativeValue = (attrName, newValue) => attrName === 'checked'
|
|
150
|
+
? !!newValue
|
|
151
|
+
: newValue == null
|
|
152
|
+
? '' // not "null"
|
|
153
|
+
: Array.isArray(newValue)
|
|
154
|
+
? newValue.map((v) => String(v))
|
|
155
|
+
: String(newValue);
|
|
156
|
+
/**
|
|
157
|
+
* Schedules value restoration for controlled form elements.
|
|
158
|
+
*
|
|
159
|
+
* React maintains the value attribute for "controlled" HTML form controls,
|
|
160
|
+
* where only setState and subsequent renders can update their value. However,
|
|
161
|
+
* there's a brief window between the "onInput" event and the DOM/React render
|
|
162
|
+
* where the new value hasn't been reset yet. This function ensures the callback
|
|
163
|
+
* runs at the appropriate time to restore the controlled value.
|
|
164
|
+
*/
|
|
165
|
+
const scheduleResetValueEffect = (fiber, fn) => {
|
|
166
|
+
let executed = false;
|
|
167
|
+
requestAnimationFrame(() => {
|
|
168
|
+
if (!executed) {
|
|
169
|
+
executed = true;
|
|
170
|
+
fn();
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
scheduleEffect(fiber, () => {
|
|
174
|
+
if (!executed) {
|
|
175
|
+
executed = true;
|
|
176
|
+
fn();
|
|
177
|
+
}
|
|
178
|
+
}, 'afterActions');
|
|
179
|
+
};
|
|
180
|
+
/**
|
|
181
|
+
* <select/> & <select multiple/> are very special cases.
|
|
182
|
+
* - When it has only one item selected its behavior is similar to single-mode
|
|
183
|
+
* selects. `value` reflects the only selected option's value.
|
|
184
|
+
* - When there is a multiple selection `value` reflects only the name of the
|
|
185
|
+
* 1st selected option, completely ignoring the rest of them.
|
|
186
|
+
*
|
|
187
|
+
* So, how do we handle it without `value`? We just need to update `selected`
|
|
188
|
+
* for each of the <option/>s.
|
|
189
|
+
*/
|
|
190
|
+
const setSelectValue = (fiber, element, value) => {
|
|
191
|
+
// Unfortunately, we can't do it right away, because:
|
|
192
|
+
// 1. on the 1st render we have no inner options here yet
|
|
193
|
+
// 2. on subsequent render the inner options may not be fully updated yet.
|
|
194
|
+
scheduleResetValueEffect(fiber, () => {
|
|
195
|
+
const arr = Array.isArray(value) ? value : [value];
|
|
196
|
+
const set = new Set(arr.map((v) => String(v)));
|
|
197
|
+
for (const option of element.options) {
|
|
198
|
+
const selected = set.has(option.value);
|
|
199
|
+
if (option.selected !== selected) {
|
|
200
|
+
option.selected = selected;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
};
|
|
205
|
+
export const updateValueStore = (fiber) => {
|
|
206
|
+
const store = stores.get(fiber.element);
|
|
207
|
+
if (store) {
|
|
208
|
+
store.fiber = fiber;
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
//# sourceMappingURL=value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"value.js","sourceRoot":"","sources":["../../../../src/core/actions/dom/value.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type DomNode, type FiberNode, type TagFiberNode } from '../../types';
|
|
2
2
|
/**
|
|
3
3
|
* Determines if a prop name represents an event handler by checking if it
|
|
4
4
|
* starts with "on". This follows React's convention where any prop beginning
|
|
@@ -13,21 +13,23 @@ import type { DomNode, FiberNode, TagFiberNode } from '../../types';
|
|
|
13
13
|
export declare const isEventName: (name: string) => boolean;
|
|
14
14
|
/**
|
|
15
15
|
* Returns the DOM container for the given fiber node. This isn't always the
|
|
16
|
-
* direct parent's element since the parent might be a
|
|
17
|
-
*
|
|
16
|
+
* direct parent's element since the parent might be a component, a fragment, or
|
|
17
|
+
* a portal node.
|
|
18
18
|
*/
|
|
19
19
|
export declare const getParentElement: (fiber: FiberNode) => Element;
|
|
20
|
+
export declare const asElement: (node: Node | null) => Element;
|
|
20
21
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* element;
|
|
24
|
-
* 2) [element, child] - the new node should be added right after `child`.
|
|
22
|
+
* Returns the 1st DOM-node of the given auto-container fiber. Pass custom
|
|
23
|
+
* `children` if `fiber`'s children are incorrect.
|
|
25
24
|
*/
|
|
26
|
-
export declare const
|
|
25
|
+
export declare const getFirstContainerElement: (fiber: FiberNode, children?: FiberNode[]) => DomNode;
|
|
26
|
+
/** Returns the last DOM-node of the given auto-container fiber */
|
|
27
|
+
export declare const getLastContainerElement: (fiber: FiberNode) => DomNode;
|
|
27
28
|
/**
|
|
28
29
|
* Returns all direct DOM nodes associated with the given fiber. This isn't
|
|
29
|
-
* always a single node since components and fragments may be in
|
|
30
|
-
*
|
|
30
|
+
* always a single node since components and fragments may be in the
|
|
31
|
+
* auto-container mode. That means they contain more then one direct DOM-nodes
|
|
32
|
+
* that are inlined into the `fiber`'s DOM container.
|
|
31
33
|
*/
|
|
32
34
|
export declare const getFiberDomNodes: (fiber: FiberNode) => DomNode[];
|
|
33
35
|
/**
|
|
@@ -40,4 +42,9 @@ export declare const unsetRef: (fiber: TagFiberNode, immediate: boolean) => void
|
|
|
40
42
|
* can hold references to other objects.
|
|
41
43
|
*/
|
|
42
44
|
export declare const emptyFiberNode: (fiber: FiberNode) => void;
|
|
45
|
+
/**
|
|
46
|
+
* Calls the given fn against every single child in the fiben fiber tree.
|
|
47
|
+
* Return `false` to stop traversing right away.
|
|
48
|
+
*/
|
|
49
|
+
export declare const traverseFiberTree: (fiber: FiberNode, fn: (fiber: FiberNode) => void | boolean) => boolean;
|
|
43
50
|
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/core/actions/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/core/actions/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAa5B;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW,2BAAmD,CAAC;AAE5E;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,+BAa5B,CAAC;AAEF,eAAO,MAAM,SAAS,gCAMrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,uDAUpC,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,uBAAuB,+BAOnC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,iCAuC5B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,QAAQ,mDAsBpB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,4BAW1B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,yEAe7B,CAAC"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { NULL_FIBER } from '../reconciliation/fibers';
|
|
4
|
-
import { buildCommentText } from '../reconciliation/comments';
|
|
1
|
+
import { isEmptyContainer, isSingleChildContainer, isAutoContainer, } from '../compact';
|
|
2
|
+
import { isFiberDead, NULL_FIBER } from '../reconciliation/fibers';
|
|
5
3
|
import { scheduleEffect } from '../reconciliation/effects';
|
|
6
|
-
import {
|
|
4
|
+
import { nullthrowsForFiber, ReactError, } from '../reconciliation/errors/ReactError';
|
|
7
5
|
/**
|
|
8
6
|
* Determines if a prop name represents an event handler by checking if it
|
|
9
7
|
* starts with "on". This follows React's convention where any prop beginning
|
|
@@ -18,8 +16,8 @@ import { getAppByFiber } from '../reconciliation/app';
|
|
|
18
16
|
export const isEventName = (name) => name.startsWith('on');
|
|
19
17
|
/**
|
|
20
18
|
* Returns the DOM container for the given fiber node. This isn't always the
|
|
21
|
-
* direct parent's element since the parent might be a
|
|
22
|
-
*
|
|
19
|
+
* direct parent's element since the parent might be a component, a fragment, or
|
|
20
|
+
* a portal node.
|
|
23
21
|
*/
|
|
24
22
|
export const getParentElement = (fiber) => {
|
|
25
23
|
while (fiber.parent.type === 'component' ||
|
|
@@ -29,90 +27,70 @@ export const getParentElement = (fiber) => {
|
|
|
29
27
|
if (fiber.parent.data instanceof HTMLElement) {
|
|
30
28
|
return fiber.parent.data; // Portal.
|
|
31
29
|
}
|
|
32
|
-
return
|
|
30
|
+
return nullthrowsForFiber(fiber, fiber.parent?.element);
|
|
33
31
|
};
|
|
34
|
-
|
|
35
|
-
* Finds the !--begin comment for the given !--end comment.
|
|
36
|
-
*/
|
|
37
|
-
const getBeginComment = (fiber) => {
|
|
38
|
-
let node = asComment(fiber.element).previousSibling;
|
|
39
|
-
const text = buildCommentText('begin', fiber.id);
|
|
40
|
-
while (!(node instanceof Comment) || node.textContent !== text)
|
|
41
|
-
node = nullthrows(node.previousSibling);
|
|
42
|
-
return node;
|
|
43
|
-
};
|
|
44
|
-
const asElement = (node) => {
|
|
32
|
+
export const asElement = (node) => {
|
|
45
33
|
if (!(node instanceof Element)) {
|
|
46
34
|
throw new Error(`node is not element`);
|
|
47
35
|
}
|
|
48
36
|
return node;
|
|
49
37
|
};
|
|
50
|
-
const asComment = (node) => {
|
|
51
|
-
if (!(node instanceof Comment)) {
|
|
52
|
-
throw new Error(`node is not comment`);
|
|
53
|
-
}
|
|
54
|
-
return node;
|
|
55
|
-
};
|
|
56
38
|
/**
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* element;
|
|
60
|
-
* 2) [element, child] - the new node should be added right after `child`.
|
|
39
|
+
* Returns the 1st DOM-node of the given auto-container fiber. Pass custom
|
|
40
|
+
* `children` if `fiber`'s children are incorrect.
|
|
61
41
|
*/
|
|
62
|
-
export const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
? fiber.data // Portal's `element` is !--r:portal
|
|
67
|
-
: fiber.element),
|
|
68
|
-
null,
|
|
69
|
-
];
|
|
42
|
+
export const getFirstContainerElement = (fiber, children = fiber.children) => {
|
|
43
|
+
let [firstNode] = children;
|
|
44
|
+
while (!(firstNode.element instanceof Node)) {
|
|
45
|
+
[firstNode] = firstNode.children;
|
|
70
46
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
// E.g.
|
|
79
|
-
// <div>
|
|
80
|
-
// <something/>
|
|
81
|
-
// <!--r:begin:1--> // a component or a fragment
|
|
82
|
-
// … // the content of the `fiber`
|
|
83
|
-
// <!--r:end:1-->
|
|
84
|
-
// <something/>
|
|
85
|
-
return [getParentElement(fiber), getBeginComment(fiber)];
|
|
47
|
+
return firstNode.element;
|
|
48
|
+
};
|
|
49
|
+
/** Returns the last DOM-node of the given auto-container fiber */
|
|
50
|
+
export const getLastContainerElement = (fiber) => {
|
|
51
|
+
let lastNode = fiber.children.at(-1);
|
|
52
|
+
while (!(lastNode.element instanceof Node)) {
|
|
53
|
+
lastNode = lastNode.children.at(-1);
|
|
86
54
|
}
|
|
87
|
-
|
|
88
|
-
throw new Error(`Unsupported anchor type: ${fiber.type}`);
|
|
55
|
+
return lastNode.element;
|
|
89
56
|
};
|
|
90
57
|
/**
|
|
91
58
|
* Returns all direct DOM nodes associated with the given fiber. This isn't
|
|
92
|
-
* always a single node since components and fragments may be in
|
|
93
|
-
*
|
|
59
|
+
* always a single node since components and fragments may be in the
|
|
60
|
+
* auto-container mode. That means they contain more then one direct DOM-nodes
|
|
61
|
+
* that are inlined into the `fiber`'s DOM container.
|
|
94
62
|
*/
|
|
95
63
|
export const getFiberDomNodes = (fiber) => {
|
|
64
|
+
if (isFiberDead(fiber)) {
|
|
65
|
+
throw new ReactError(fiber, `Can't get fiber children for a dead fiber`);
|
|
66
|
+
}
|
|
96
67
|
switch (fiber.type) {
|
|
97
68
|
case 'component':
|
|
98
69
|
case 'fragment': {
|
|
99
|
-
if (
|
|
100
|
-
|
|
70
|
+
if (isAutoContainer(fiber)) {
|
|
71
|
+
const first = getFirstContainerElement(fiber);
|
|
72
|
+
const last = getLastContainerElement(fiber);
|
|
73
|
+
const result = [first];
|
|
74
|
+
let domNode = first.nextSibling;
|
|
75
|
+
while (domNode !== last) {
|
|
76
|
+
result.push(domNode);
|
|
77
|
+
domNode = domNode.nextSibling;
|
|
78
|
+
}
|
|
79
|
+
result.push(last);
|
|
80
|
+
return result;
|
|
101
81
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
let prev = nullthrows(list[0].previousSibling);
|
|
105
|
-
while (prev && !isBeginOf(prev, fiber)) {
|
|
106
|
-
list.push(prev);
|
|
107
|
-
prev = nullthrows(prev.previousSibling);
|
|
82
|
+
if (isSingleChildContainer(fiber)) {
|
|
83
|
+
return getFiberDomNodes(fiber.children[0]);
|
|
108
84
|
}
|
|
109
|
-
|
|
110
|
-
|
|
85
|
+
if (isEmptyContainer(fiber)) {
|
|
86
|
+
return [fiber.element];
|
|
87
|
+
}
|
|
88
|
+
throw new ReactError(fiber, `Unknown kind of fiber`);
|
|
111
89
|
}
|
|
112
90
|
case 'null':
|
|
113
91
|
case 'tag':
|
|
114
92
|
case 'text':
|
|
115
|
-
return [
|
|
93
|
+
return [nullthrowsForFiber(fiber, fiber.element)];
|
|
116
94
|
}
|
|
117
95
|
};
|
|
118
96
|
/**
|
|
@@ -123,15 +101,16 @@ export const unsetRef = (fiber, immediate) => {
|
|
|
123
101
|
const { ref } = fiber;
|
|
124
102
|
if (typeof ref === 'function') {
|
|
125
103
|
if (immediate) {
|
|
126
|
-
ref(null);
|
|
104
|
+
ref(null);
|
|
105
|
+
// TODO: add a test ^.
|
|
127
106
|
}
|
|
128
107
|
else {
|
|
129
108
|
// It can be a setter (e.g., <div onRef={setContainer}/>). Since we
|
|
130
109
|
// shouldn't allow invalidating components during commit phase we need
|
|
131
110
|
// to schedule an async update.
|
|
132
|
-
scheduleEffect(
|
|
111
|
+
scheduleEffect(fiber, () => {
|
|
133
112
|
ref(null);
|
|
134
|
-
}, '
|
|
113
|
+
}, 'refsUnmount');
|
|
135
114
|
}
|
|
136
115
|
}
|
|
137
116
|
else {
|
|
@@ -153,4 +132,19 @@ export const emptyFiberNode = (fiber) => {
|
|
|
153
132
|
fiber.ref = null;
|
|
154
133
|
fiber.parent = NULL_FIBER;
|
|
155
134
|
};
|
|
135
|
+
/**
|
|
136
|
+
* Calls the given fn against every single child in the fiben fiber tree.
|
|
137
|
+
* Return `false` to stop traversing right away.
|
|
138
|
+
*/
|
|
139
|
+
export const traverseFiberTree = (fiber, fn) => {
|
|
140
|
+
if (fn(fiber) === false) {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
for (const child of fiber.children) {
|
|
144
|
+
if (traverseFiberTree(child, fn) === false) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return true;
|
|
149
|
+
};
|
|
156
150
|
//# sourceMappingURL=helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/core/actions/helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/core/actions/helpers.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EACL,kBAAkB,EAClB,UAAU,GACX,MAAM,qCAAqC,CAAC;AAE7C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAE5E;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAgB,EAAW,EAAE,CAAC;IAC7D,OACE,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW;QACjC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,EAChC,CAAC;QACD,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,mBAAmB;IAC3C,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,YAAY,WAAW,EAAE,CAAC;QAC7C,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU;IACtC,CAAC;IAED,OAAO,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAY,CAAC;AAAA,CACpE,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAiB,EAAW,EAAE,CAAC;IACvD,IAAI,CAAC,CAAC,IAAI,YAAY,OAAO,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,IAAI,CAAC;AAAA,CACb,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,KAAgB,EAChB,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAChB,EAAE,CAAC;IACZ,IAAI,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC;IAC3B,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,YAAY,IAAI,CAAC,EAAE,CAAC;QAC5C,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC;IACnC,CAAC;IAED,OAAO,SAAS,CAAC,OAAkB,CAAC;AAAA,CACrC,CAAC;AAEF,kEAAkE;AAClE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,KAAgB,EAAW,EAAE,CAAC;IACpE,IAAI,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;IACtC,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,YAAY,IAAI,CAAC,EAAE,CAAC;QAC3C,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;IACvC,CAAC;IAED,OAAO,QAAQ,CAAC,OAAkB,CAAC;AAAA,CACpC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAgB,EAAa,EAAE,CAAC;IAC/D,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,UAAU,CAAC,KAAK,EAAE,2CAA2C,CAAC,CAAC;IAC3E,CAAC;IAED,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,WAAW,CAAC;QACjB,KAAK,UAAU,EAAE,CAAC;YAChB,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM,KAAK,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;gBAC9C,MAAM,IAAI,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;gBAC5C,MAAM,MAAM,GAAc,CAAC,KAAK,CAAC,CAAC;gBAElC,IAAI,OAAO,GAAG,KAAK,CAAC,WAAY,CAAC;gBACjC,OAAO,OAAO,KAAK,IAAI,EAAE,CAAC;oBACxB,MAAM,CAAC,IAAI,CAAC,OAAkB,CAAC,CAAC;oBAChC,OAAO,GAAG,OAAO,CAAC,WAAY,CAAC;gBACjC,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAElB,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,IAAI,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClC,OAAO,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,CAAC;YAED,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;YAED,MAAM,IAAI,UAAU,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;QACvD,CAAC;QAED,KAAK,MAAM,CAAC;QACZ,KAAK,KAAK,CAAC;QACX,KAAK,MAAM;YACT,OAAO,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,CAAC;AAAA,CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAmB,EAAE,SAAkB,EAAQ,EAAE,CAAC;IACzE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IAEtB,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;QAC9B,IAAI,SAAS,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,CAAC;YACV,sBAAsB;QACxB,CAAC;aAAM,CAAC;YACN,mEAAmE;YACnE,sEAAsE;YACtE,+BAA+B;YAC/B,cAAc,CACZ,KAAK,EACL,GAAG,EAAE,CAAC;gBACJ,GAAG,CAAC,IAAI,CAAC,CAAC;YAAA,CACX,EACD,aAAa,CACd,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,GAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;AAAA,CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAgB,EAAQ,EAAE,CAAC;IACxD,6DAA6D;IAC7D,KAAK,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;IAErB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;IACvB,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;IACpB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;IACnB,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC;IACjB,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC;AAAA,CAC3B,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,KAAgB,EAChB,EAAwC,EAC/B,EAAE,CAAC;IACZ,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnC,IAAI,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC;YAC3C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AAAA,CACb,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type FiberNode } from '../../types';
|
|
2
2
|
import type { RelayoutAction } from '../../types/actions';
|
|
3
3
|
/**
|
|
4
4
|
* Handles fiber tree layout updates when children have been modified. This
|
|
@@ -17,4 +17,5 @@ import type { RelayoutAction } from '../../types/actions';
|
|
|
17
17
|
* must be completed before this action runs.
|
|
18
18
|
*/
|
|
19
19
|
export declare function relayoutAction(fiber: FiberNode, { before, after }: RelayoutAction): void;
|
|
20
|
+
export declare const tryFixContainerType: (fiber: FiberNode) => void;
|
|
20
21
|
//# sourceMappingURL=relayout.action.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relayout.action.d.ts","sourceRoot":"","sources":["../../../src/core/actions/relayout.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"relayout.action.d.ts","sourceRoot":"","sources":["../../../src/core/actions/relayout.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAiBjE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,EAChB,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,cAAc,QAgDlC;AA6GD,eAAO,MAAM,mBAAmB,4BA8D/B,CAAC"}
|