@fictjs/runtime 0.0.2 → 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/dist/index.d.cts CHANGED
@@ -995,6 +995,12 @@ declare function isReactive(value: unknown): value is () => unknown;
995
995
  * Unwrap a potentially reactive value to get the actual value
996
996
  */
997
997
  declare function unwrap<T>(value: MaybeReactive<T>): T;
998
+ /**
999
+ * Invoke an event handler or handler accessor in a safe way.
1000
+ * Supports handlers that return another handler and handlers that expect an
1001
+ * optional data payload followed by the event.
1002
+ */
1003
+ declare function callEventHandler(handler: EventListenerOrEventListenerObject | null | undefined, event: Event, node?: EventTarget | null, data?: unknown): void;
998
1004
  /**
999
1005
  * Unwrap a primitive proxy value to get the raw primitive value.
1000
1006
  * This is primarily useful for advanced scenarios where you need the actual
@@ -1569,4 +1575,4 @@ declare function isNodeBetweenMarkers(node: Node, startMarker: Comment, endMarke
1569
1575
  */
1570
1576
  declare function createKeyedList<T>(getItems: () => T[], keyFn: (item: T, index: number) => string | number, renderItem: FineGrainedRenderItem<T>, needsIndex?: boolean): KeyedListBinding;
1571
1577
 
1572
- export { $effect, $memo, $state, Aliases, type AttributeSetter, type BaseProps, type BindingHandle, BooleanAttributes, ChildProperties, type ClassProp, type Cleanup, type Component, type CreateElementFn, type DOMElement, DelegatedEvents, type Effect, ErrorBoundary, type ErrorInfo, type EventHandler, type FictDevtoolsHook, type FictNode, type FictVNode, Fragment, JSX, type KeyFn, type KeyedBlock, type KeyedListBinding, type KeyedListContainer, type MarkerBlock, type MaybeReactive, type Memo, Properties, type PropsWithChildren, type Ref, type RefCallback, type RefObject, SVGElements, SVGNamespace, type SignalAccessor as Signal, type Store, type StyleProp, Suspense, type SuspenseToken, UnitlessStyles, type VersionedSignal, type VersionedSignalOptions, __fictPopContext, __fictProp, __fictPropsRest, __fictPushContext, __fictRender, __fictResetContext, __fictUseContext, __fictUseEffect, __fictUseMemo, __fictUseSignal, addEventListener, assign, batch, bindAttribute, bindClass, bindEvent, bindProperty, bindRef, bindStyle, bindText, classList, clearDelegatedEvents, createAttributeBinding, createChildBinding, createClassBinding, createConditional, createEffect, createElement, createKeyedBlock, createKeyedList, createKeyedListContainer, createList, createMemo, createPortal, createPropsProxy, createRef, createRenderEffect, createRoot, createSelector, createShow, signal as createSignal, createStore, createStyleBinding, createSuspenseToken, createTextBinding, createVersionedSignal, delegateEvents, destroyMarkerBlock, getDevtoolsHook, getFirstNodeAfter, getPropAlias, insert, insertNodesBefore, isNodeBetweenMarkers, isReactive, mergeProps, moveMarkerBlock, moveNodesBefore, onCleanup, onDestroy, onMount, __fictProp as prop, reconcileArrays, removeNodes, render, setCycleProtectionOptions, spread, startTransition, template, toNodeArray, untrack, unwrap, unwrapPrimitive, useDeferredValue, useProp, useTransition };
1578
+ export { $effect, $memo, $state, Aliases, type AttributeSetter, type BaseProps, type BindingHandle, BooleanAttributes, ChildProperties, type ClassProp, type Cleanup, type Component, type CreateElementFn, type DOMElement, DelegatedEvents, type Effect, ErrorBoundary, type ErrorInfo, type EventHandler, type FictDevtoolsHook, type FictNode, type FictVNode, Fragment, JSX, type KeyFn, type KeyedBlock, type KeyedListBinding, type KeyedListContainer, type MarkerBlock, type MaybeReactive, type Memo, Properties, type PropsWithChildren, type Ref, type RefCallback, type RefObject, SVGElements, SVGNamespace, type SignalAccessor as Signal, type Store, type StyleProp, Suspense, type SuspenseToken, UnitlessStyles, type VersionedSignal, type VersionedSignalOptions, __fictPopContext, __fictProp, __fictPropsRest, __fictPushContext, __fictRender, __fictResetContext, __fictUseContext, __fictUseEffect, __fictUseMemo, __fictUseSignal, addEventListener, assign, batch, bindAttribute, bindClass, bindEvent, bindProperty, bindRef, bindStyle, bindText, callEventHandler, classList, clearDelegatedEvents, createAttributeBinding, createChildBinding, createClassBinding, createConditional, createEffect, createElement, createKeyedBlock, createKeyedList, createKeyedListContainer, createList, createMemo, createPortal, createPropsProxy, createRef, createRenderEffect, createRoot, createSelector, createShow, signal as createSignal, createStore, createStyleBinding, createSuspenseToken, createTextBinding, createVersionedSignal, delegateEvents, destroyMarkerBlock, getDevtoolsHook, getFirstNodeAfter, getPropAlias, insert, insertNodesBefore, isNodeBetweenMarkers, isReactive, mergeProps, moveMarkerBlock, moveNodesBefore, onCleanup, onDestroy, onMount, __fictProp as prop, reconcileArrays, removeNodes, render, setCycleProtectionOptions, spread, startTransition, template, toNodeArray, untrack, unwrap, unwrapPrimitive, useDeferredValue, useProp, useTransition };
package/dist/index.d.ts CHANGED
@@ -995,6 +995,12 @@ declare function isReactive(value: unknown): value is () => unknown;
995
995
  * Unwrap a potentially reactive value to get the actual value
996
996
  */
997
997
  declare function unwrap<T>(value: MaybeReactive<T>): T;
998
+ /**
999
+ * Invoke an event handler or handler accessor in a safe way.
1000
+ * Supports handlers that return another handler and handlers that expect an
1001
+ * optional data payload followed by the event.
1002
+ */
1003
+ declare function callEventHandler(handler: EventListenerOrEventListenerObject | null | undefined, event: Event, node?: EventTarget | null, data?: unknown): void;
998
1004
  /**
999
1005
  * Unwrap a primitive proxy value to get the raw primitive value.
1000
1006
  * This is primarily useful for advanced scenarios where you need the actual
@@ -1569,4 +1575,4 @@ declare function isNodeBetweenMarkers(node: Node, startMarker: Comment, endMarke
1569
1575
  */
1570
1576
  declare function createKeyedList<T>(getItems: () => T[], keyFn: (item: T, index: number) => string | number, renderItem: FineGrainedRenderItem<T>, needsIndex?: boolean): KeyedListBinding;
1571
1577
 
1572
- export { $effect, $memo, $state, Aliases, type AttributeSetter, type BaseProps, type BindingHandle, BooleanAttributes, ChildProperties, type ClassProp, type Cleanup, type Component, type CreateElementFn, type DOMElement, DelegatedEvents, type Effect, ErrorBoundary, type ErrorInfo, type EventHandler, type FictDevtoolsHook, type FictNode, type FictVNode, Fragment, JSX, type KeyFn, type KeyedBlock, type KeyedListBinding, type KeyedListContainer, type MarkerBlock, type MaybeReactive, type Memo, Properties, type PropsWithChildren, type Ref, type RefCallback, type RefObject, SVGElements, SVGNamespace, type SignalAccessor as Signal, type Store, type StyleProp, Suspense, type SuspenseToken, UnitlessStyles, type VersionedSignal, type VersionedSignalOptions, __fictPopContext, __fictProp, __fictPropsRest, __fictPushContext, __fictRender, __fictResetContext, __fictUseContext, __fictUseEffect, __fictUseMemo, __fictUseSignal, addEventListener, assign, batch, bindAttribute, bindClass, bindEvent, bindProperty, bindRef, bindStyle, bindText, classList, clearDelegatedEvents, createAttributeBinding, createChildBinding, createClassBinding, createConditional, createEffect, createElement, createKeyedBlock, createKeyedList, createKeyedListContainer, createList, createMemo, createPortal, createPropsProxy, createRef, createRenderEffect, createRoot, createSelector, createShow, signal as createSignal, createStore, createStyleBinding, createSuspenseToken, createTextBinding, createVersionedSignal, delegateEvents, destroyMarkerBlock, getDevtoolsHook, getFirstNodeAfter, getPropAlias, insert, insertNodesBefore, isNodeBetweenMarkers, isReactive, mergeProps, moveMarkerBlock, moveNodesBefore, onCleanup, onDestroy, onMount, __fictProp as prop, reconcileArrays, removeNodes, render, setCycleProtectionOptions, spread, startTransition, template, toNodeArray, untrack, unwrap, unwrapPrimitive, useDeferredValue, useProp, useTransition };
1578
+ export { $effect, $memo, $state, Aliases, type AttributeSetter, type BaseProps, type BindingHandle, BooleanAttributes, ChildProperties, type ClassProp, type Cleanup, type Component, type CreateElementFn, type DOMElement, DelegatedEvents, type Effect, ErrorBoundary, type ErrorInfo, type EventHandler, type FictDevtoolsHook, type FictNode, type FictVNode, Fragment, JSX, type KeyFn, type KeyedBlock, type KeyedListBinding, type KeyedListContainer, type MarkerBlock, type MaybeReactive, type Memo, Properties, type PropsWithChildren, type Ref, type RefCallback, type RefObject, SVGElements, SVGNamespace, type SignalAccessor as Signal, type Store, type StyleProp, Suspense, type SuspenseToken, UnitlessStyles, type VersionedSignal, type VersionedSignalOptions, __fictPopContext, __fictProp, __fictPropsRest, __fictPushContext, __fictRender, __fictResetContext, __fictUseContext, __fictUseEffect, __fictUseMemo, __fictUseSignal, addEventListener, assign, batch, bindAttribute, bindClass, bindEvent, bindProperty, bindRef, bindStyle, bindText, callEventHandler, classList, clearDelegatedEvents, createAttributeBinding, createChildBinding, createClassBinding, createConditional, createEffect, createElement, createKeyedBlock, createKeyedList, createKeyedListContainer, createList, createMemo, createPortal, createPropsProxy, createRef, createRenderEffect, createRoot, createSelector, createShow, signal as createSignal, createStore, createStyleBinding, createSuspenseToken, createTextBinding, createVersionedSignal, delegateEvents, destroyMarkerBlock, getDevtoolsHook, getFirstNodeAfter, getPropAlias, insert, insertNodesBefore, isNodeBetweenMarkers, isReactive, mergeProps, moveMarkerBlock, moveNodesBefore, onCleanup, onDestroy, onMount, __fictProp as prop, reconcileArrays, removeNodes, render, setCycleProtectionOptions, spread, startTransition, template, toNodeArray, untrack, unwrap, unwrapPrimitive, useDeferredValue, useProp, useTransition };
package/dist/index.dev.js CHANGED
@@ -1840,6 +1840,30 @@ function isReactive(value) {
1840
1840
  function unwrap2(value) {
1841
1841
  return isReactive(value) ? value() : value;
1842
1842
  }
1843
+ function callEventHandler(handler, event, node, data) {
1844
+ if (!handler) return;
1845
+ const context = node ?? event.currentTarget ?? void 0;
1846
+ const invoke = (fn) => {
1847
+ if (typeof fn === "function") {
1848
+ const result = data === void 0 ? fn.call(context, event) : fn.call(context, data, event);
1849
+ if (typeof result === "function" && result !== fn) {
1850
+ if (data === void 0) {
1851
+ ;
1852
+ result.call(context, event);
1853
+ } else {
1854
+ ;
1855
+ result.call(context, data, event);
1856
+ }
1857
+ } else if (result && typeof result.handleEvent === "function") {
1858
+ ;
1859
+ result.handleEvent.call(result, event);
1860
+ }
1861
+ } else if (fn && typeof fn.handleEvent === "function") {
1862
+ fn.handleEvent.call(fn, event);
1863
+ }
1864
+ };
1865
+ invoke(handler);
1866
+ }
1843
1867
  var PRIMITIVE_PROXY = Symbol("fict:primitive-proxy");
1844
1868
  var PRIMITIVE_PROXY_RAW_VALUE = Symbol("fict:primitive-proxy:raw-value");
1845
1869
  function unwrapPrimitive(value) {
@@ -2353,16 +2377,10 @@ function globalEventHandler(e) {
2353
2377
  const hasData = rawData !== void 0;
2354
2378
  const resolvedNodeData = hasData ? resolveData(rawData) : void 0;
2355
2379
  if (typeof handler === "function") {
2356
- if (hasData) {
2357
- ;
2358
- handler.call(node, resolvedNodeData, e);
2359
- } else {
2360
- ;
2361
- handler.call(node, e);
2362
- }
2380
+ callEventHandler(handler, e, node, hasData ? resolvedNodeData : void 0);
2363
2381
  } else if (Array.isArray(handler)) {
2364
2382
  const tupleData = resolveData(handler[1]);
2365
- handler[0].call(node, tupleData, e);
2383
+ callEventHandler(handler[0], e, node, tupleData);
2366
2384
  }
2367
2385
  if (e.cancelBubble) return false;
2368
2386
  }
@@ -2428,23 +2446,15 @@ function bindEvent(el, eventName, handler, options2) {
2428
2446
  if (DelegatedEvents.has(eventName) && !options2) {
2429
2447
  const key = `$$${eventName}`;
2430
2448
  delegateEvents([eventName]);
2431
- const createWrapped = (resolve) => {
2432
- const wrapped2 = function(...args) {
2433
- try {
2434
- const fn = resolve();
2435
- if (typeof fn === "function") {
2436
- return fn.apply(this, args);
2437
- } else if (fn && typeof fn.handleEvent === "function") {
2438
- return fn.handleEvent.apply(fn, args);
2439
- }
2440
- } catch (err) {
2441
- handleError(err, { source: "event", eventName }, rootRef);
2442
- }
2443
- };
2444
- return wrapped2;
2445
- };
2446
2449
  const resolveHandler = isReactive(handler) ? handler : () => handler;
2447
- el[key] = createWrapped(resolveHandler);
2450
+ el[key] = function(...args) {
2451
+ try {
2452
+ const fn = resolveHandler();
2453
+ callEventHandler(fn, args[0], el);
2454
+ } catch (err) {
2455
+ handleError(err, { source: "event", eventName }, rootRef);
2456
+ }
2457
+ };
2448
2458
  return () => {
2449
2459
  el[key] = void 0;
2450
2460
  };
@@ -2453,13 +2463,7 @@ function bindEvent(el, eventName, handler, options2) {
2453
2463
  const wrapped = (event) => {
2454
2464
  try {
2455
2465
  const resolved = getHandler();
2456
- if (typeof resolved === "function") {
2457
- ;
2458
- resolved(event);
2459
- } else if (resolved && typeof resolved.handleEvent === "function") {
2460
- ;
2461
- resolved.handleEvent(event);
2462
- }
2466
+ callEventHandler(resolved, event, el);
2463
2467
  } catch (err) {
2464
2468
  if (handleError(err, { source: "event", eventName }, rootRef)) {
2465
2469
  return;
@@ -4180,6 +4184,7 @@ export {
4180
4184
  bindRef,
4181
4185
  bindStyle,
4182
4186
  bindText,
4187
+ callEventHandler,
4183
4188
  classList,
4184
4189
  clearDelegatedEvents,
4185
4190
  createAttributeBinding,