@simpreact/simpreact 0.0.5 → 0.0.6
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/LICENSE.txt +1 -1
- package/compat/context.d.ts +4 -4
- package/compat/context.js +3 -2
- package/compat/core.d.ts +4 -0
- package/compat/core.js +9 -5
- package/compat/dom.d.ts +4 -5
- package/compat/dom.js +3 -2
- package/compat/hooks.d.ts +16 -13
- package/compat/hooks.js +19 -15
- package/compat/index.d.ts +10 -9
- package/compat/renderRuntime.d.ts +2 -0
- package/compat/renderRuntime.js +14 -0
- package/component/index.d.ts +16 -0
- package/component/index.js +164 -0
- package/context/index.d.ts +12 -5
- package/context/index.js +62 -57
- package/core/createElement.d.ts +29 -20
- package/core/createElement.js +159 -133
- package/core/hostAdapter.d.ts +8 -12
- package/core/hostAdapter.js +1 -4
- package/core/hostOperations.d.ts +5 -0
- package/core/hostOperations.js +15 -0
- package/core/index.d.ts +29 -6
- package/core/internal.d.ts +3 -0
- package/core/internal.js +3 -0
- package/core/lifecycleEventBus.d.ts +15 -6
- package/core/lifecycleEventBus.js +16 -2
- package/core/memo.d.ts +0 -2
- package/core/memo.js +1 -3
- package/core/mounting.d.ts +7 -9
- package/core/mounting.js +221 -79
- package/core/patching.d.ts +7 -8
- package/core/patching.js +235 -252
- package/core/patchingChildren.d.ts +6 -0
- package/core/patchingChildren.js +330 -0
- package/core/portal.d.ts +1 -1
- package/core/portal.js +17 -7
- package/core/processStack.d.ts +69 -0
- package/core/processStack.js +63 -0
- package/core/ref.d.ts +4 -3
- package/core/rerender.d.ts +4 -14
- package/core/rerender.js +67 -112
- package/core/runtime.d.ts +17 -0
- package/core/runtime.js +2 -0
- package/core/unmounting.d.ts +11 -6
- package/core/unmounting.js +81 -40
- package/core/utils.d.ts +10 -0
- package/core/utils.js +143 -0
- package/dom/attach-element-to-dom.d.ts +4 -3
- package/dom/attach-element-to-dom.js +12 -7
- package/dom/domAdapter.js +22 -25
- package/dom/events.d.ts +5 -5
- package/dom/events.js +33 -16
- package/dom/index.d.ts +16 -5
- package/dom/index.js +4 -3
- package/dom/props/controlled/index.d.ts +3 -3
- package/dom/props/controlled/index.js +8 -8
- package/dom/props/controlled/input.d.ts +3 -3
- package/dom/props/controlled/input.js +57 -34
- package/dom/props/controlled/select.d.ts +3 -3
- package/dom/props/controlled/select.js +39 -26
- package/dom/props/controlled/textarea.d.ts +3 -3
- package/dom/props/controlled/textarea.js +57 -34
- package/dom/props/dangerInnerHTML.d.ts +2 -2
- package/dom/props/dangerInnerHTML.js +3 -2
- package/dom/props/props.d.ts +4 -4
- package/dom/props/props.js +24 -21
- package/dom/render.d.ts +4 -5
- package/dom/render.js +38 -34
- package/hooks/index.d.ts +15 -13
- package/hooks/index.js +153 -157
- package/jsx-runtime/index.d.ts +2 -1
- package/package.json +9 -1
- package/shared/index.d.ts +10 -0
- package/shared/index.js +4 -7
- package/shared/utils.js +4 -4
- package/shared/EventBus.d.ts +0 -18
- package/shared/EventBus.js +0 -28
package/dom/events.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { type SimpRenderRuntime } from '../core/internal.js';
|
|
1
2
|
import type { Nullable } from '../shared/index.js';
|
|
2
|
-
type DelegatedEventType = 'click' | 'dblclick' | 'mousedown' | 'mouseup' | 'mousemove' | 'pointerdown' | 'pointerup' | 'pointermove' | 'touchstart' | 'touchmove' | 'touchend' | 'keydown' | 'keyup' | 'focusin' | 'focusout';
|
|
3
|
+
export type DelegatedEventType = 'click' | 'dblclick' | 'mousedown' | 'mouseup' | 'mousemove' | 'pointerdown' | 'pointerup' | 'pointermove' | 'touchstart' | 'touchmove' | 'touchend' | 'keydown' | 'keyup' | 'focusin' | 'focusout';
|
|
3
4
|
export declare class SyntheticEvent {
|
|
4
5
|
nativeEvent: Event;
|
|
5
6
|
currentTarget: Nullable<EventTarget>;
|
|
@@ -19,9 +20,8 @@ export declare class SyntheticEvent {
|
|
|
19
20
|
preventDefault(): void;
|
|
20
21
|
isDefaultPrevented(): boolean;
|
|
21
22
|
}
|
|
22
|
-
export declare function dispatchDelegatedEvent(event: Event): void;
|
|
23
|
-
export declare function patchEvent(name: string, prevValue: any, nextValue: any, dom: Element): void;
|
|
24
|
-
export declare function patchDelegatedEvent(eventType: DelegatedEventType,
|
|
23
|
+
export declare function dispatchDelegatedEvent(event: Event, renderRuntime: SimpRenderRuntime): void;
|
|
24
|
+
export declare function patchEvent(name: string, prevValue: any, nextValue: any, dom: Element, renderRuntime: SimpRenderRuntime): void;
|
|
25
|
+
export declare function patchDelegatedEvent(eventType: DelegatedEventType, prevHandler: any, nextHandler: any, eventHandlerCounts: Record<DelegatedEventType, number>, renderRuntime: SimpRenderRuntime): void;
|
|
25
26
|
export declare function patchNormalEvent(eventType: string, prevValue: any, nextValue: any, dom: Element, capture: boolean): void;
|
|
26
27
|
export declare function isPropNameEventName(name: string): boolean;
|
|
27
|
-
export {};
|
package/dom/events.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getElementFromDom } from './attach-element-to-dom.js';
|
|
1
|
+
import { SIMP_ELEMENT_FLAG_HOST } from '../core/internal.js';
|
|
3
2
|
const eventNameByTypes = {
|
|
4
3
|
click: 'onClick',
|
|
5
4
|
dblclick: 'onDblClick',
|
|
@@ -18,7 +17,7 @@ const eventNameByTypes = {
|
|
|
18
17
|
focusout: 'onFocusOut',
|
|
19
18
|
};
|
|
20
19
|
const delegatedEventTypes = new Set(Object.keys(eventNameByTypes));
|
|
21
|
-
const
|
|
20
|
+
const createEventHandlerCounts = () => ({
|
|
22
21
|
click: 0,
|
|
23
22
|
dblclick: 0,
|
|
24
23
|
mousedown: 0,
|
|
@@ -34,7 +33,25 @@ const eventHandlerCounts = {
|
|
|
34
33
|
keyup: 0,
|
|
35
34
|
focusin: 0,
|
|
36
35
|
focusout: 0,
|
|
37
|
-
};
|
|
36
|
+
});
|
|
37
|
+
const eventHandlerCountsByRuntime = new WeakMap();
|
|
38
|
+
const delegatedEventDispatchersByRuntime = new WeakMap();
|
|
39
|
+
function getEventHandlerCounts(renderRuntime) {
|
|
40
|
+
let eventHandlerCounts = eventHandlerCountsByRuntime.get(renderRuntime);
|
|
41
|
+
if (!eventHandlerCounts) {
|
|
42
|
+
eventHandlerCounts = createEventHandlerCounts();
|
|
43
|
+
eventHandlerCountsByRuntime.set(renderRuntime, eventHandlerCounts);
|
|
44
|
+
}
|
|
45
|
+
return eventHandlerCounts;
|
|
46
|
+
}
|
|
47
|
+
function getDelegatedEventDispatcher(renderRuntime) {
|
|
48
|
+
let dispatcher = delegatedEventDispatchersByRuntime.get(renderRuntime);
|
|
49
|
+
if (!dispatcher) {
|
|
50
|
+
dispatcher = event => dispatchDelegatedEvent(event, renderRuntime);
|
|
51
|
+
delegatedEventDispatchersByRuntime.set(renderRuntime, dispatcher);
|
|
52
|
+
}
|
|
53
|
+
return dispatcher;
|
|
54
|
+
}
|
|
38
55
|
export class SyntheticEvent {
|
|
39
56
|
nativeEvent;
|
|
40
57
|
currentTarget = null;
|
|
@@ -74,14 +91,13 @@ export class SyntheticEvent {
|
|
|
74
91
|
return this._isDefaultPrevented;
|
|
75
92
|
}
|
|
76
93
|
}
|
|
77
|
-
export function dispatchDelegatedEvent(event) {
|
|
78
|
-
batchingRerenderLocker.lock();
|
|
94
|
+
export function dispatchDelegatedEvent(event, renderRuntime) {
|
|
79
95
|
const syntheticEvent = new SyntheticEvent(event);
|
|
80
96
|
const captureHandlers = [];
|
|
81
97
|
const bubbleHandlers = [];
|
|
82
|
-
let element =
|
|
98
|
+
let element = renderRuntime.hostAdapter.getElementFromReference(event.target, renderRuntime);
|
|
83
99
|
while (element) {
|
|
84
|
-
if (element.flag
|
|
100
|
+
if ((element.flag & SIMP_ELEMENT_FLAG_HOST) !== 0) {
|
|
85
101
|
const captureHandler = element.props?.[eventNameByTypes[event.type] + 'Capture'];
|
|
86
102
|
const bubbleHandler = element.props?.[eventNameByTypes[event.type]];
|
|
87
103
|
if (captureHandler) {
|
|
@@ -107,28 +123,29 @@ export function dispatchDelegatedEvent(event) {
|
|
|
107
123
|
return;
|
|
108
124
|
}
|
|
109
125
|
}
|
|
110
|
-
batchingRerenderLocker.flush();
|
|
111
126
|
}
|
|
112
127
|
const captureRegex = /Capture/;
|
|
113
|
-
export function patchEvent(name, prevValue, nextValue, dom) {
|
|
128
|
+
export function patchEvent(name, prevValue, nextValue, dom, renderRuntime) {
|
|
114
129
|
const isCapture = captureRegex.test(name);
|
|
115
130
|
name = name.replace(captureRegex, '').substring(2).toLowerCase();
|
|
116
131
|
if (delegatedEventTypes.has(name)) {
|
|
117
|
-
patchDelegatedEvent(name, nextValue,
|
|
132
|
+
patchDelegatedEvent(name, prevValue, nextValue, getEventHandlerCounts(renderRuntime), renderRuntime);
|
|
118
133
|
}
|
|
119
134
|
else {
|
|
120
135
|
patchNormalEvent(name, prevValue, nextValue, dom, isCapture);
|
|
121
136
|
}
|
|
122
137
|
}
|
|
123
|
-
export function patchDelegatedEvent(eventType,
|
|
124
|
-
|
|
138
|
+
export function patchDelegatedEvent(eventType, prevHandler, nextHandler, eventHandlerCounts, renderRuntime) {
|
|
139
|
+
const dispatcher = getDelegatedEventDispatcher(renderRuntime);
|
|
140
|
+
if (typeof prevHandler !== 'function' && typeof nextHandler === 'function') {
|
|
125
141
|
if (++eventHandlerCounts[eventType] === 1) {
|
|
126
|
-
document.addEventListener(eventType,
|
|
142
|
+
document.addEventListener(eventType, dispatcher);
|
|
127
143
|
}
|
|
144
|
+
return;
|
|
128
145
|
}
|
|
129
|
-
|
|
146
|
+
if (typeof prevHandler === 'function' && typeof nextHandler !== 'function') {
|
|
130
147
|
if (eventHandlerCounts[eventType] !== 0 && --eventHandlerCounts[eventType] === 0) {
|
|
131
|
-
document.removeEventListener(eventType,
|
|
148
|
+
document.removeEventListener(eventType, dispatcher);
|
|
132
149
|
}
|
|
133
150
|
}
|
|
134
151
|
}
|
package/dom/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { RefAttributes, SimpElement, SimpNode } from '../core/index.js';
|
|
1
|
+
import type { RefAttributes, SimpElement, SimpNode, SimpRenderRuntime } from '../core/index.js';
|
|
2
|
+
import type { HostAdapter } from '../core/internal.js';
|
|
2
3
|
import type { Nullable } from '../shared/index.js';
|
|
3
4
|
|
|
4
5
|
import type { PropertiesHyphen } from 'csstype';
|
|
@@ -16,9 +17,15 @@ export interface SimpRoot {
|
|
|
16
17
|
unmount(): void;
|
|
17
18
|
}
|
|
18
19
|
|
|
19
|
-
declare function
|
|
20
|
+
declare function createCreateRoot(
|
|
21
|
+
renderRuntime: SimpRenderRuntime
|
|
22
|
+
): (container: Element | DocumentFragment) => SimpRoot;
|
|
20
23
|
|
|
21
|
-
declare function
|
|
24
|
+
declare function createRenderer(
|
|
25
|
+
renderRuntime: SimpRenderRuntime
|
|
26
|
+
): (element: SimpElement, parentReference: Nullable<HTMLElement>) => void;
|
|
27
|
+
|
|
28
|
+
declare const domAdapter: HostAdapter;
|
|
22
29
|
|
|
23
30
|
export interface SimpReactHTMLElement<T extends HTMLElement>
|
|
24
31
|
extends DetailedSimpReactHTMLElement<AllHTMLAttributes<T>, T> {}
|
|
@@ -227,8 +234,12 @@ export interface SyntheticEvent<C = Element, E = Event> {
|
|
|
227
234
|
stopPropagation(): void;
|
|
228
235
|
}
|
|
229
236
|
|
|
230
|
-
export type EventHandler<E extends SyntheticEvent<any>> = {
|
|
231
|
-
|
|
237
|
+
export type EventHandler<E extends SyntheticEvent<any>> = {
|
|
238
|
+
bivarianceHack(event: E): void;
|
|
239
|
+
}['bivarianceHack'];
|
|
240
|
+
export type NativeEventHandler<E extends Event = Event> = {
|
|
241
|
+
bivarianceHack(event: E): void;
|
|
242
|
+
}['bivarianceHack'];
|
|
232
243
|
|
|
233
244
|
export type ClipboardEventHandler = NativeEventHandler<ClipboardEvent>;
|
|
234
245
|
export type CompositionEventHandler = NativeEventHandler<CompositionEvent>;
|
package/dom/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
export
|
|
1
|
+
import { domAdapter } from './domAdapter.js';
|
|
2
|
+
import { createCreateRoot, createRenderer } from './render.js';
|
|
3
|
+
export { createCreateRoot, createRenderer, domAdapter };
|
|
4
|
+
export default { createCreateRoot, createRenderer, domAdapter };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { SimpElement } from '../../../core/internal.js';
|
|
1
|
+
import type { SimpElement, SimpRenderRuntime } from '../../../core/internal.js';
|
|
2
2
|
import type { Dict } from '../../../shared/index.js';
|
|
3
3
|
export declare function isEventNameIgnored(element: SimpElement, eventName: string): boolean;
|
|
4
4
|
export declare function isFormElementControlled(props: Dict): boolean;
|
|
5
|
-
export declare function addControlledFormElementEventHandlers(element: SimpElement): void;
|
|
6
|
-
export declare function removeControlledFormElementEventHandlers(element: SimpElement): void;
|
|
5
|
+
export declare function addControlledFormElementEventHandlers(element: SimpElement, renderRuntime: SimpRenderRuntime): void;
|
|
6
|
+
export declare function removeControlledFormElementEventHandlers(element: SimpElement, renderRuntime: SimpRenderRuntime): void;
|
|
7
7
|
export declare function syncControlledFormElementPropsWithAttrs(element: SimpElement, props: Dict, mounting?: boolean): void;
|
|
@@ -16,26 +16,26 @@ export function isEventNameIgnored(element, eventName) {
|
|
|
16
16
|
export function isFormElementControlled(props) {
|
|
17
17
|
return props.value != null || props.checked != null;
|
|
18
18
|
}
|
|
19
|
-
export function addControlledFormElementEventHandlers(element) {
|
|
19
|
+
export function addControlledFormElementEventHandlers(element, renderRuntime) {
|
|
20
20
|
if (element.type === 'input') {
|
|
21
|
-
addControlledInputEventHandlers(element.reference);
|
|
21
|
+
addControlledInputEventHandlers(element.reference, renderRuntime);
|
|
22
22
|
}
|
|
23
23
|
else if (element.type === 'select') {
|
|
24
|
-
addControlledSelectEventHandlers(element.reference);
|
|
24
|
+
addControlledSelectEventHandlers(element.reference, renderRuntime);
|
|
25
25
|
}
|
|
26
26
|
else if (element.type === 'textarea') {
|
|
27
|
-
addControlledTextareaEventHandlers(element.reference);
|
|
27
|
+
addControlledTextareaEventHandlers(element.reference, renderRuntime);
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
-
export function removeControlledFormElementEventHandlers(element) {
|
|
30
|
+
export function removeControlledFormElementEventHandlers(element, renderRuntime) {
|
|
31
31
|
if (element.type === 'input') {
|
|
32
|
-
removeControlledInputEventHandlers(element.reference);
|
|
32
|
+
removeControlledInputEventHandlers(element.reference, renderRuntime);
|
|
33
33
|
}
|
|
34
34
|
else if (element.type === 'select') {
|
|
35
|
-
removeControlledSelectEventHandlers(element.reference);
|
|
35
|
+
removeControlledSelectEventHandlers(element.reference, renderRuntime);
|
|
36
36
|
}
|
|
37
37
|
else if (element.type === 'textarea') {
|
|
38
|
-
removeControlledTextareaEventHandlers(element.reference);
|
|
38
|
+
removeControlledTextareaEventHandlers(element.reference, renderRuntime);
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
export function syncControlledFormElementPropsWithAttrs(element, props, mounting = false) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { SimpElement } from '../../../core/internal.js';
|
|
1
|
+
import type { SimpElement, SimpRenderRuntime } from '../../../core/internal.js';
|
|
2
2
|
import type { Dict } from '../../../shared/index.js';
|
|
3
3
|
export declare function isCheckedType(type: string): boolean;
|
|
4
4
|
export declare function isEventNameIgnored(props: Dict, eventName: string): boolean;
|
|
5
|
-
export declare function addControlledInputEventHandlers(dom: HTMLInputElement): void;
|
|
6
|
-
export declare function removeControlledInputEventHandlers(dom: HTMLInputElement): void;
|
|
5
|
+
export declare function addControlledInputEventHandlers(dom: HTMLInputElement, renderRuntime: SimpRenderRuntime): void;
|
|
6
|
+
export declare function removeControlledInputEventHandlers(dom: HTMLInputElement, renderRuntime: SimpRenderRuntime): void;
|
|
7
7
|
export declare function syncControlledInputProps(element: SimpElement, props: Dict): void;
|
|
@@ -1,55 +1,78 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getElementFromDom } from '../../attach-element-to-dom.js';
|
|
1
|
+
import { withSyncRerender } from '../../../core/internal.js';
|
|
3
2
|
export function isCheckedType(type) {
|
|
4
3
|
return type === 'checkbox' || type === 'radio';
|
|
5
4
|
}
|
|
6
5
|
export function isEventNameIgnored(props, eventName) {
|
|
7
6
|
return isCheckedType(props.type) ? eventName === 'onChange' : eventName === 'onInput';
|
|
8
7
|
}
|
|
9
|
-
function
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
8
|
+
function createControlledInputInputHandler(renderRuntime) {
|
|
9
|
+
return event => {
|
|
10
|
+
let element = renderRuntime.hostAdapter.getElementFromReference(event.target, renderRuntime);
|
|
11
|
+
if (!element || !element.props) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const onInput = element.props['onInput'];
|
|
15
|
+
if (onInput) {
|
|
16
|
+
withSyncRerender(renderRuntime, () => {
|
|
17
|
+
onInput(event);
|
|
18
|
+
});
|
|
19
|
+
element = renderRuntime.hostAdapter.getElementFromReference(event.target, renderRuntime);
|
|
20
|
+
}
|
|
21
|
+
if (element) {
|
|
22
|
+
syncControlledInputProps(element, element.props);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
23
25
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
const controlledInputInputHandlersByRuntime = new WeakMap();
|
|
27
|
+
function getControlledInputInputHandler(renderRuntime) {
|
|
28
|
+
let handler = controlledInputInputHandlersByRuntime.get(renderRuntime);
|
|
29
|
+
if (!handler) {
|
|
30
|
+
handler = createControlledInputInputHandler(renderRuntime);
|
|
31
|
+
controlledInputInputHandlersByRuntime.set(renderRuntime, handler);
|
|
28
32
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
element =
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
return handler;
|
|
34
|
+
}
|
|
35
|
+
function createControlledInputChangeHandler(renderRuntime) {
|
|
36
|
+
return event => {
|
|
37
|
+
let element = renderRuntime.hostAdapter.getElementFromReference(event.target, renderRuntime);
|
|
38
|
+
if (!element || !element.props) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const onChange = element.props['onChange'];
|
|
42
|
+
if (onChange) {
|
|
43
|
+
withSyncRerender(renderRuntime, () => {
|
|
44
|
+
onChange(event);
|
|
45
|
+
});
|
|
46
|
+
element = renderRuntime.hostAdapter.getElementFromReference(event.target, renderRuntime);
|
|
47
|
+
}
|
|
48
|
+
if (element) {
|
|
49
|
+
syncControlledInputProps(element, element.props);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const controlledInputChangeHandlersByRuntime = new WeakMap();
|
|
54
|
+
function getControlledInputChangeHandler(renderRuntime) {
|
|
55
|
+
let handler = controlledInputChangeHandlersByRuntime.get(renderRuntime);
|
|
56
|
+
if (!handler) {
|
|
57
|
+
handler = createControlledInputChangeHandler(renderRuntime);
|
|
58
|
+
controlledInputChangeHandlersByRuntime.set(renderRuntime, handler);
|
|
37
59
|
}
|
|
60
|
+
return handler;
|
|
38
61
|
}
|
|
39
|
-
export function addControlledInputEventHandlers(dom) {
|
|
62
|
+
export function addControlledInputEventHandlers(dom, renderRuntime) {
|
|
40
63
|
if (isCheckedType(dom.type)) {
|
|
41
|
-
dom.addEventListener('change',
|
|
64
|
+
dom.addEventListener('change', getControlledInputChangeHandler(renderRuntime));
|
|
42
65
|
}
|
|
43
66
|
else {
|
|
44
|
-
dom.addEventListener('input',
|
|
67
|
+
dom.addEventListener('input', getControlledInputInputHandler(renderRuntime));
|
|
45
68
|
}
|
|
46
69
|
}
|
|
47
|
-
export function removeControlledInputEventHandlers(dom) {
|
|
70
|
+
export function removeControlledInputEventHandlers(dom, renderRuntime) {
|
|
48
71
|
if (isCheckedType(dom.type)) {
|
|
49
|
-
dom.removeEventListener('change',
|
|
72
|
+
dom.removeEventListener('change', getControlledInputChangeHandler(renderRuntime));
|
|
50
73
|
}
|
|
51
74
|
else {
|
|
52
|
-
dom.removeEventListener('input',
|
|
75
|
+
dom.removeEventListener('input', getControlledInputInputHandler(renderRuntime));
|
|
53
76
|
}
|
|
54
77
|
}
|
|
55
78
|
export function syncControlledInputProps(element, props) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { SimpElement } from '../../../core/internal.js';
|
|
1
|
+
import type { SimpElement, SimpRenderRuntime } from '../../../core/internal.js';
|
|
2
2
|
import type { Dict } from '../../../shared/index.js';
|
|
3
3
|
export declare function isEventNameIgnored(eventName: string): boolean;
|
|
4
|
-
export declare function addControlledSelectEventHandlers(dom: HTMLSelectElement): void;
|
|
5
|
-
export declare function removeControlledSelectEventHandlers(dom: HTMLSelectElement): void;
|
|
4
|
+
export declare function addControlledSelectEventHandlers(dom: HTMLSelectElement, renderRuntime: SimpRenderRuntime): void;
|
|
5
|
+
export declare function removeControlledSelectEventHandlers(dom: HTMLSelectElement, renderRuntime: SimpRenderRuntime): void;
|
|
6
6
|
export declare function syncControlledSelectProps(element: SimpElement, props: Dict, mounting?: boolean): void;
|
|
@@ -1,29 +1,40 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SIMP_ELEMENT_CHILD_FLAG_ELEMENT, SIMP_ELEMENT_CHILD_FLAG_LIST, withSyncRerender } from '../../../core/internal.js';
|
|
2
2
|
import { emptyObject } from '../../../shared/index.js';
|
|
3
|
-
import { getElementFromDom } from '../../attach-element-to-dom.js';
|
|
4
3
|
export function isEventNameIgnored(eventName) {
|
|
5
4
|
return eventName === 'onChange';
|
|
6
5
|
}
|
|
7
|
-
function
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
6
|
+
function createControlledInputChangeHandler(renderRuntime) {
|
|
7
|
+
return (event) => {
|
|
8
|
+
let element = renderRuntime.hostAdapter.getElementFromReference(event.target, renderRuntime);
|
|
9
|
+
if (!element || !element.props) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const onChange = element.props['onChange'];
|
|
13
|
+
if (onChange) {
|
|
14
|
+
withSyncRerender(renderRuntime, () => {
|
|
15
|
+
onChange(event);
|
|
16
|
+
});
|
|
17
|
+
element = renderRuntime.hostAdapter.getElementFromReference(event.target, renderRuntime);
|
|
18
|
+
}
|
|
19
|
+
if (element) {
|
|
20
|
+
syncControlledSelectProps(element, element.props);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
const controlledSelectChangeHandlersByRuntime = new WeakMap();
|
|
25
|
+
function getControlledSelectChangeHandler(renderRuntime) {
|
|
26
|
+
let handler = controlledSelectChangeHandlersByRuntime.get(renderRuntime);
|
|
27
|
+
if (!handler) {
|
|
28
|
+
handler = createControlledInputChangeHandler(renderRuntime);
|
|
29
|
+
controlledSelectChangeHandlersByRuntime.set(renderRuntime, handler);
|
|
20
30
|
}
|
|
31
|
+
return handler;
|
|
21
32
|
}
|
|
22
|
-
export function addControlledSelectEventHandlers(dom) {
|
|
23
|
-
dom.addEventListener('change',
|
|
33
|
+
export function addControlledSelectEventHandlers(dom, renderRuntime) {
|
|
34
|
+
dom.addEventListener('change', getControlledSelectChangeHandler(renderRuntime));
|
|
24
35
|
}
|
|
25
|
-
export function removeControlledSelectEventHandlers(dom) {
|
|
26
|
-
dom.removeEventListener('change',
|
|
36
|
+
export function removeControlledSelectEventHandlers(dom, renderRuntime) {
|
|
37
|
+
dom.removeEventListener('change', getControlledSelectChangeHandler(renderRuntime));
|
|
27
38
|
}
|
|
28
39
|
export function syncControlledSelectProps(element, props, mounting = false) {
|
|
29
40
|
const multiple = Boolean(props.multiple);
|
|
@@ -50,13 +61,15 @@ function updateOptions(element, value) {
|
|
|
50
61
|
return;
|
|
51
62
|
}
|
|
52
63
|
const children = element.children;
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
64
|
+
const childFlag = element.childFlag;
|
|
65
|
+
switch (childFlag) {
|
|
66
|
+
case SIMP_ELEMENT_CHILD_FLAG_LIST:
|
|
67
|
+
for (let i = 0, len = children.length; i < len; ++i) {
|
|
68
|
+
updateOptions(children[i], value);
|
|
69
|
+
}
|
|
70
|
+
break;
|
|
71
|
+
case SIMP_ELEMENT_CHILD_FLAG_ELEMENT:
|
|
72
|
+
updateOptions(children, value);
|
|
60
73
|
}
|
|
61
74
|
}
|
|
62
75
|
function updateOption(element, value) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { SimpElement } from '../../../core/internal.js';
|
|
1
|
+
import type { SimpElement, SimpRenderRuntime } from '../../../core/internal.js';
|
|
2
2
|
import type { Dict } from '../../../shared/index.js';
|
|
3
3
|
export declare function isEventNameIgnored(eventName: string): boolean;
|
|
4
|
-
export declare function addControlledTextareaEventHandlers(dom: HTMLTextAreaElement): void;
|
|
5
|
-
export declare function removeControlledTextareaEventHandlers(dom: HTMLTextAreaElement): void;
|
|
4
|
+
export declare function addControlledTextareaEventHandlers(dom: HTMLTextAreaElement, renderRuntime: SimpRenderRuntime): void;
|
|
5
|
+
export declare function removeControlledTextareaEventHandlers(dom: HTMLTextAreaElement, renderRuntime: SimpRenderRuntime): void;
|
|
6
6
|
export declare function syncControlledTextareaProps(element: SimpElement, props: Dict, mounting?: boolean): void;
|
|
@@ -1,45 +1,68 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getElementFromDom } from '../../attach-element-to-dom.js';
|
|
1
|
+
import { withSyncRerender } from '../../../core/internal.js';
|
|
3
2
|
export function isEventNameIgnored(eventName) {
|
|
4
3
|
return eventName === 'onChange' || eventName === 'onInput';
|
|
5
4
|
}
|
|
6
|
-
function
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
5
|
+
function createControlledTextareaChangeHandler(renderRuntime) {
|
|
6
|
+
return (event) => {
|
|
7
|
+
let element = renderRuntime.hostAdapter.getElementFromReference(event.target, renderRuntime);
|
|
8
|
+
if (!element || !element.props) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const onChange = element.props['onChange'];
|
|
12
|
+
if (onChange) {
|
|
13
|
+
withSyncRerender(renderRuntime, () => {
|
|
14
|
+
onChange(event);
|
|
15
|
+
});
|
|
16
|
+
element = renderRuntime.hostAdapter.getElementFromReference(event.target, renderRuntime);
|
|
17
|
+
}
|
|
18
|
+
if (element) {
|
|
19
|
+
syncControlledTextareaProps(element, element.props);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
20
22
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
const controlledTextareaChangeHandlersByRuntime = new WeakMap();
|
|
24
|
+
function getControlledTextareaChangeHandler(renderRuntime) {
|
|
25
|
+
let handler = controlledTextareaChangeHandlersByRuntime.get(renderRuntime);
|
|
26
|
+
if (!handler) {
|
|
27
|
+
handler = createControlledTextareaChangeHandler(renderRuntime);
|
|
28
|
+
controlledTextareaChangeHandlersByRuntime.set(renderRuntime, handler);
|
|
25
29
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
element =
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
return handler;
|
|
31
|
+
}
|
|
32
|
+
function createControlledTextareaInputHandler(renderRuntime) {
|
|
33
|
+
return event => {
|
|
34
|
+
let element = renderRuntime.hostAdapter.getElementFromReference(event.target, renderRuntime);
|
|
35
|
+
if (!element || !element.props) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const onInput = element.props['onInput'];
|
|
39
|
+
if (onInput) {
|
|
40
|
+
withSyncRerender(renderRuntime, () => {
|
|
41
|
+
onInput(event);
|
|
42
|
+
});
|
|
43
|
+
element = renderRuntime.hostAdapter.getElementFromReference(event.target, renderRuntime);
|
|
44
|
+
}
|
|
45
|
+
if (element) {
|
|
46
|
+
syncControlledTextareaProps(element, element.props);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const controlledTextareaInputHandlersByRuntime = new WeakMap();
|
|
51
|
+
function getControlledTextareaInputHandler(renderRuntime) {
|
|
52
|
+
let handler = controlledTextareaInputHandlersByRuntime.get(renderRuntime);
|
|
53
|
+
if (!handler) {
|
|
54
|
+
handler = createControlledTextareaInputHandler(renderRuntime);
|
|
55
|
+
controlledTextareaInputHandlersByRuntime.set(renderRuntime, handler);
|
|
34
56
|
}
|
|
57
|
+
return handler;
|
|
35
58
|
}
|
|
36
|
-
export function addControlledTextareaEventHandlers(dom) {
|
|
37
|
-
dom.addEventListener('input',
|
|
38
|
-
dom.addEventListener('change',
|
|
59
|
+
export function addControlledTextareaEventHandlers(dom, renderRuntime) {
|
|
60
|
+
dom.addEventListener('input', getControlledTextareaInputHandler(renderRuntime));
|
|
61
|
+
dom.addEventListener('change', getControlledTextareaChangeHandler(renderRuntime));
|
|
39
62
|
}
|
|
40
|
-
export function removeControlledTextareaEventHandlers(dom) {
|
|
41
|
-
dom.removeEventListener('input',
|
|
42
|
-
dom.removeEventListener('change',
|
|
63
|
+
export function removeControlledTextareaEventHandlers(dom, renderRuntime) {
|
|
64
|
+
dom.removeEventListener('input', getControlledTextareaInputHandler(renderRuntime));
|
|
65
|
+
dom.removeEventListener('change', getControlledTextareaChangeHandler(renderRuntime));
|
|
43
66
|
}
|
|
44
67
|
export function syncControlledTextareaProps(element, props, mounting = false) {
|
|
45
68
|
const dom = element.reference;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import type { SimpElement, SimpRenderRuntime } from '../../core/internal.js';
|
|
1
2
|
import type { Maybe } from '../../shared/index.js';
|
|
2
|
-
import type { SimpElement } from '../../core/internal.js';
|
|
3
3
|
export declare function patchDangerInnerHTML(prevValue: Maybe<{
|
|
4
4
|
__html: string;
|
|
5
5
|
}>, nextValue: Maybe<{
|
|
6
6
|
__html: string;
|
|
7
|
-
}>, prevElement: Maybe<SimpElement>, nextElement: SimpElement, dom: Element): void;
|
|
7
|
+
}>, prevElement: Maybe<SimpElement>, nextElement: SimpElement, dom: Element, renderRuntime: SimpRenderRuntime): void;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { unmount } from '../../core/internal.js';
|
|
2
|
-
export function patchDangerInnerHTML(prevValue, nextValue, prevElement, nextElement, dom) {
|
|
2
|
+
export function patchDangerInnerHTML(prevValue, nextValue, prevElement, nextElement, dom, renderRuntime) {
|
|
3
3
|
const prevHTML = prevValue?.__html || '';
|
|
4
4
|
const nextHTML = nextValue?.__html || '';
|
|
5
5
|
if (nextElement.children) {
|
|
@@ -9,7 +9,8 @@ export function patchDangerInnerHTML(prevValue, nextValue, prevElement, nextElem
|
|
|
9
9
|
if (nextHTML != null && !isSameInnerHTML(dom, nextHTML)) {
|
|
10
10
|
if (prevElement != null) {
|
|
11
11
|
if (prevElement.children) {
|
|
12
|
-
|
|
12
|
+
// TODO: the HOST element can hold several children.
|
|
13
|
+
unmount(prevElement.children, renderRuntime);
|
|
13
14
|
prevElement.children = undefined;
|
|
14
15
|
}
|
|
15
16
|
}
|
package/dom/props/props.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { SimpElement } from '../../core/internal.js';
|
|
1
|
+
import type { SimpElement, SimpRenderRuntime } from '../../core/internal.js';
|
|
2
2
|
import type { Namespace } from '../namespace.js';
|
|
3
|
-
export declare function mountProps(dom: HTMLElement | SVGElement, element: SimpElement, namespace: Namespace): void;
|
|
4
|
-
export declare function unmountProps(dom: HTMLElement | SVGElement, element: SimpElement): void;
|
|
5
|
-
export declare function patchProps(dom: HTMLElement | SVGElement, prevElement: SimpElement, nextElement: SimpElement, namespace: Namespace): void;
|
|
3
|
+
export declare function mountProps(dom: HTMLElement | SVGElement, element: SimpElement, namespace: Namespace, renderRuntime: SimpRenderRuntime): void;
|
|
4
|
+
export declare function unmountProps(dom: HTMLElement | SVGElement, element: SimpElement, renderRuntime: SimpRenderRuntime): void;
|
|
5
|
+
export declare function patchProps(dom: HTMLElement | SVGElement, prevElement: SimpElement, nextElement: SimpElement, namespace: Namespace, renderRuntime: SimpRenderRuntime): void;
|