canvasengine 2.0.0-rc.3 → 2.0.0-rc.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "canvasengine",
3
- "version": "2.0.0-rc.3",
3
+ "version": "2.0.0-rc.4",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -30,6 +30,28 @@ export let currentSubscriptionsTracker: ((subscription: Subscription) => void) |
30
30
  export let currentDefinePropsTracker: ((signals: Record<string, any>) => void) | null = null;
31
31
  export let mountTracker: MountFunction | null = null;
32
32
 
33
+ const readSignalValue = (value: any) => {
34
+ const callableValueSignal = value?.__canvasEngineCallableSignalValue;
35
+ if (callableValueSignal) return callableValueSignal();
36
+ return isSignal(value) ? value() : value;
37
+ };
38
+
39
+ const patchDefinePropsSignals = (target: Element, source: Element) => {
40
+ const targetSignals = (target as any)[DEFINE_PROPS_SIGNALS];
41
+ const sourceSignals = (source as any)[DEFINE_PROPS_SIGNALS];
42
+
43
+ if (!targetSignals || !sourceSignals) {
44
+ return;
45
+ }
46
+
47
+ Object.entries(sourceSignals as Record<string, any>).forEach(([key, sourceSignal]) => {
48
+ const targetSignal = targetSignals[key];
49
+ if (targetSignal && typeof targetSignal.set === "function") {
50
+ targetSignal.set(readSignalValue(sourceSignal));
51
+ }
52
+ });
53
+ };
54
+
33
55
  const getHotComponentRegistry = (): Map<string, HotComponentRecord> => {
34
56
  const hotGlobal = globalThis as any;
35
57
  if (!hotGlobal.__CANVAS_ENGINE_HOT_COMPONENTS__) {
@@ -274,6 +296,8 @@ export function createHotComponent<P>(
274
296
  nextProps.children = target.props.children;
275
297
  }
276
298
 
299
+ patchDefinePropsSignals(target, source);
300
+
277
301
  target.props = nextProps;
278
302
  target.propObservables = source.propObservables;
279
303
  target.componentInstance.onUpdate?.(nextProps);
@@ -1,6 +1,7 @@
1
1
  import { isSignal, signal } from "@signe/reactive"
2
2
  import { isPrimitive } from "../engine/reactive"
3
3
  import { currentDefinePropsTracker } from "../engine/signal"
4
+ import { isTrigger } from "../engine/trigger"
4
5
 
5
6
  /**
6
7
  * Converts props into reactive signals if they are primitive values.
@@ -47,7 +48,36 @@ type PropSchema = {
47
48
  [key: string]: PropType | PropType[] | PropConfig;
48
49
  }
49
50
 
50
- const toPropSignal = (value: any) => isSignal(value) ? value : signal(value)
51
+ const DEFINE_PROPS_CALLABLE_SIGNAL_VALUE = "__canvasEngineCallableSignalValue"
52
+
53
+ const createCallablePropSignal = (value: (...args: any[]) => any) => {
54
+ const valueSignal: any = signal(value)
55
+ const callable: any = (...args: any[]) => valueSignal()(...args)
56
+
57
+ callable[DEFINE_PROPS_CALLABLE_SIGNAL_VALUE] = valueSignal
58
+ callable.set = valueSignal.set
59
+ callable.freeze = valueSignal.freeze
60
+ callable.unfreeze = valueSignal.unfreeze
61
+ callable.mutate = valueSignal.mutate
62
+ callable.update = valueSignal.update
63
+ callable.observable = valueSignal.observable
64
+ callable._subject = valueSignal._subject
65
+
66
+ Object.defineProperty(callable, "_isFrozen", {
67
+ get: () => valueSignal._isFrozen,
68
+ set: (value) => {
69
+ valueSignal._isFrozen = value
70
+ }
71
+ })
72
+
73
+ return callable
74
+ }
75
+
76
+ const toPropSignal = (value: any) => {
77
+ if (isSignal(value) || isTrigger(value)) return value
78
+ if (typeof value === 'function') return createCallablePropSignal(value)
79
+ return signal(value)
80
+ }
51
81
 
52
82
  const definePropSignals = (props: any): any => {
53
83
  const obj: any = {}