@fictjs/runtime 0.0.3 → 0.0.4
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 +1 -1
- package/dist/index.cjs +33 -29
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.dev.js +36 -31
- package/dist/index.dev.js.map +1 -1
- package/dist/index.js +33 -30
- package/dist/index.js.map +1 -1
- package/dist/jsx-dev-runtime.d.cts +671 -0
- package/dist/jsx-dev-runtime.d.ts +671 -0
- package/dist/slim.cjs +32 -29
- package/dist/slim.cjs.map +1 -1
- package/dist/slim.js +32 -29
- package/dist/slim.js.map +1 -1
- package/package.json +2 -2
- package/src/binding.ts +49 -31
- package/src/index.ts +1 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fictjs/runtime",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"description": "Fict reactive runtime",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"src"
|
|
51
51
|
],
|
|
52
52
|
"devDependencies": {
|
|
53
|
-
"jsdom": "^27.
|
|
53
|
+
"jsdom": "^27.4.0",
|
|
54
54
|
"tsup": "^8.5.1"
|
|
55
55
|
},
|
|
56
56
|
"scripts": {
|
package/src/binding.ts
CHANGED
|
@@ -92,6 +92,44 @@ export function unwrap<T>(value: MaybeReactive<T>): T {
|
|
|
92
92
|
return isReactive(value) ? (value as () => T)() : value
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
+
/**
|
|
96
|
+
* Invoke an event handler or handler accessor in a safe way.
|
|
97
|
+
* Supports handlers that return another handler and handlers that expect an
|
|
98
|
+
* optional data payload followed by the event.
|
|
99
|
+
*/
|
|
100
|
+
export function callEventHandler(
|
|
101
|
+
handler: EventListenerOrEventListenerObject | null | undefined,
|
|
102
|
+
event: Event,
|
|
103
|
+
node?: EventTarget | null,
|
|
104
|
+
data?: unknown,
|
|
105
|
+
): void {
|
|
106
|
+
if (!handler) return
|
|
107
|
+
|
|
108
|
+
const context = (node ?? event.currentTarget ?? undefined) as EventTarget | undefined
|
|
109
|
+
const invoke = (fn: EventListenerOrEventListenerObject | null | undefined): void => {
|
|
110
|
+
if (typeof fn === 'function') {
|
|
111
|
+
const result =
|
|
112
|
+
data === undefined
|
|
113
|
+
? (fn as EventListener).call(context, event)
|
|
114
|
+
: (fn as (data: unknown, e: Event) => unknown).call(context, data, event)
|
|
115
|
+
|
|
116
|
+
if (typeof result === 'function' && result !== fn) {
|
|
117
|
+
if (data === undefined) {
|
|
118
|
+
;(result as EventListener).call(context, event)
|
|
119
|
+
} else {
|
|
120
|
+
;(result as (data: unknown, e: Event) => unknown).call(context, data, event)
|
|
121
|
+
}
|
|
122
|
+
} else if (result && typeof (result as EventListenerObject).handleEvent === 'function') {
|
|
123
|
+
;(result as EventListenerObject).handleEvent.call(result as EventListenerObject, event)
|
|
124
|
+
}
|
|
125
|
+
} else if (fn && typeof fn.handleEvent === 'function') {
|
|
126
|
+
fn.handleEvent.call(fn, event)
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
invoke(handler)
|
|
131
|
+
}
|
|
132
|
+
|
|
95
133
|
export const PRIMITIVE_PROXY = Symbol('fict:primitive-proxy')
|
|
96
134
|
const PRIMITIVE_PROXY_RAW_VALUE = Symbol('fict:primitive-proxy:raw-value')
|
|
97
135
|
|
|
@@ -908,15 +946,10 @@ function globalEventHandler(e: Event): void {
|
|
|
908
946
|
const hasData = rawData !== undefined
|
|
909
947
|
const resolvedNodeData = hasData ? resolveData(rawData) : undefined
|
|
910
948
|
if (typeof handler === 'function') {
|
|
911
|
-
|
|
912
|
-
if (hasData) {
|
|
913
|
-
;(handler as (data: unknown, e: Event) => void).call(node, resolvedNodeData, e)
|
|
914
|
-
} else {
|
|
915
|
-
;(handler as EventListener).call(node, e)
|
|
916
|
-
}
|
|
949
|
+
callEventHandler(handler, e, node, hasData ? resolvedNodeData : undefined)
|
|
917
950
|
} else if (Array.isArray(handler)) {
|
|
918
951
|
const tupleData = resolveData(handler[1])
|
|
919
|
-
|
|
952
|
+
callEventHandler(handler[0], e, node, tupleData)
|
|
920
953
|
}
|
|
921
954
|
if (e.cancelBubble) return false
|
|
922
955
|
}
|
|
@@ -1050,31 +1083,20 @@ export function bindEvent(
|
|
|
1050
1083
|
// Ensure global delegation is active for this event
|
|
1051
1084
|
delegateEvents([eventName])
|
|
1052
1085
|
|
|
1053
|
-
const createWrapped = (
|
|
1054
|
-
resolve: () => EventListenerOrEventListenerObject | null | undefined,
|
|
1055
|
-
) => {
|
|
1056
|
-
const wrapped = function (this: any, ...args: any[]) {
|
|
1057
|
-
try {
|
|
1058
|
-
const fn = resolve()
|
|
1059
|
-
if (typeof fn === 'function') {
|
|
1060
|
-
return (fn as EventListener).apply(this, args as [Event])
|
|
1061
|
-
} else if (fn && typeof fn.handleEvent === 'function') {
|
|
1062
|
-
return fn.handleEvent.apply(fn, args as [Event])
|
|
1063
|
-
}
|
|
1064
|
-
} catch (err) {
|
|
1065
|
-
handleError(err, { source: 'event', eventName }, rootRef)
|
|
1066
|
-
}
|
|
1067
|
-
}
|
|
1068
|
-
return wrapped
|
|
1069
|
-
}
|
|
1070
|
-
|
|
1071
1086
|
const resolveHandler = isReactive(handler)
|
|
1072
1087
|
? (handler as () => EventListenerOrEventListenerObject | null | undefined)
|
|
1073
1088
|
: () => handler
|
|
1074
1089
|
|
|
1075
1090
|
// Cache a single wrapper that resolves the latest handler when invoked
|
|
1076
1091
|
// @ts-expect-error - using dynamic property for delegation
|
|
1077
|
-
el[key] =
|
|
1092
|
+
el[key] = function (this: any, ...args: any[]) {
|
|
1093
|
+
try {
|
|
1094
|
+
const fn = resolveHandler()
|
|
1095
|
+
callEventHandler(fn as EventListenerOrEventListenerObject, args[0] as Event, el)
|
|
1096
|
+
} catch (err) {
|
|
1097
|
+
handleError(err, { source: 'event', eventName }, rootRef)
|
|
1098
|
+
}
|
|
1099
|
+
}
|
|
1078
1100
|
|
|
1079
1101
|
// Cleanup: remove property (no effect needed for static or reactive)
|
|
1080
1102
|
return () => {
|
|
@@ -1091,11 +1113,7 @@ export function bindEvent(
|
|
|
1091
1113
|
const wrapped: EventListener = event => {
|
|
1092
1114
|
try {
|
|
1093
1115
|
const resolved = getHandler()
|
|
1094
|
-
|
|
1095
|
-
;(resolved as EventListener)(event)
|
|
1096
|
-
} else if (resolved && typeof (resolved as EventListenerObject).handleEvent === 'function') {
|
|
1097
|
-
;(resolved as EventListenerObject).handleEvent(event)
|
|
1098
|
-
}
|
|
1116
|
+
callEventHandler(resolved as EventListenerOrEventListenerObject, event, el)
|
|
1099
1117
|
} catch (err) {
|
|
1100
1118
|
if (handleError(err, { source: 'event', eventName }, rootRef)) {
|
|
1101
1119
|
return
|