@flexsurfer/reflex 0.1.19 → 0.1.21

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.cjs CHANGED
@@ -48,6 +48,7 @@ __export(src_exports, {
48
48
  enableTracePrint: () => enableTracePrint,
49
49
  enableTracing: () => enableTracing,
50
50
  getAppDb: () => getAppDb,
51
+ getGlobalEqualityCheck: () => getGlobalEqualityCheck,
51
52
  getGlobalInterceptors: () => getGlobalInterceptors,
52
53
  getHandler: () => getHandler,
53
54
  getHandlers: () => getHandlers,
@@ -64,6 +65,7 @@ __export(src_exports, {
64
65
  registerHotReloadCallback: () => registerHotReloadCallback,
65
66
  registerTraceCb: () => registerTraceCb,
66
67
  removeTraceCb: () => removeTraceCb,
68
+ setGlobalEqualityCheck: () => setGlobalEqualityCheck,
67
69
  setupSubsHotReload: () => setupSubsHotReload,
68
70
  throttleAndDispatch: () => throttleAndDispatch,
69
71
  triggerHotReload: () => triggerHotReload,
@@ -162,6 +164,7 @@ function clearSubs() {
162
164
  clearReactions();
163
165
  clearHandlers("sub");
164
166
  clearHandlers("subDeps");
167
+ clearSubConfigs();
165
168
  }
166
169
  var interceptorsRegistry = /* @__PURE__ */ new Map();
167
170
  function getInterceptors(eventId) {
@@ -170,6 +173,20 @@ function getInterceptors(eventId) {
170
173
  function setInterceptors(eventId, interceptors) {
171
174
  interceptorsRegistry.set(eventId, interceptors);
172
175
  }
176
+ var subConfigRegistry = /* @__PURE__ */ new Map();
177
+ function getSubConfig(subId) {
178
+ return subConfigRegistry.get(subId);
179
+ }
180
+ function setSubConfig(subId, config) {
181
+ subConfigRegistry.set(subId, config);
182
+ }
183
+ function clearSubConfigs(subId) {
184
+ if (subId == null) {
185
+ subConfigRegistry.clear();
186
+ } else {
187
+ subConfigRegistry.delete(subId);
188
+ }
189
+ }
173
190
 
174
191
  // src/schedule.ts
175
192
  function scheduleAfterRender(f) {
@@ -584,8 +601,10 @@ regEffect(DISPATCH, (value) => {
584
601
  var import_immer2 = require("immer");
585
602
 
586
603
  // src/settings.ts
604
+ var import_fast_deep_equal = __toESM(require("fast-deep-equal"), 1);
587
605
  var store = {
588
- globalInterceptors: []
606
+ globalInterceptors: [],
607
+ globalEqualityCheck: import_fast_deep_equal.default
589
608
  };
590
609
  function replaceGlobalInterceptor(globalInterceptors, interceptor) {
591
610
  return globalInterceptors.reduce((ret, existingInterceptor) => {
@@ -615,6 +634,12 @@ function clearGlobalInterceptors(id) {
615
634
  store.globalInterceptors = store.globalInterceptors.filter((interceptor) => interceptor.id !== id);
616
635
  }
617
636
  }
637
+ function setGlobalEqualityCheck(equalityCheck) {
638
+ store.globalEqualityCheck = equalityCheck;
639
+ }
640
+ function getGlobalEqualityCheck() {
641
+ return store.globalEqualityCheck;
642
+ }
618
643
 
619
644
  // src/trace.ts
620
645
  var nextId = 1;
@@ -850,7 +875,7 @@ function defaultErrorHandler(originalError, reflexError) {
850
875
  regEventErrorHandler(defaultErrorHandler);
851
876
 
852
877
  // src/reaction.ts
853
- var import_fast_deep_equal = __toESM(require("fast-deep-equal"), 1);
878
+ var import_fast_deep_equal2 = __toESM(require("fast-deep-equal"), 1);
854
879
  var Reaction = class _Reaction {
855
880
  id = "";
856
881
  computeFn;
@@ -863,12 +888,14 @@ var Reaction = class _Reaction {
863
888
  version = 0;
864
889
  depsVersions = [];
865
890
  subVector;
866
- constructor(computeFn, deps) {
891
+ equalityCheck;
892
+ constructor(computeFn, deps, equalityCheck) {
867
893
  this.computeFn = computeFn;
868
894
  this.deps = deps;
895
+ this.equalityCheck = equalityCheck || import_fast_deep_equal2.default;
869
896
  }
870
- static create(fn, deps) {
871
- return new _Reaction(fn, deps);
897
+ static create(fn, deps, equalityCheck) {
898
+ return new _Reaction(fn, deps, equalityCheck);
872
899
  }
873
900
  computeValue() {
874
901
  this.ensureDirty();
@@ -934,10 +961,10 @@ var Reaction = class _Reaction {
934
961
  const depValues = this.deps?.map((d) => d.getDepValue(notifyWatchers)) ?? [];
935
962
  const values = depValues.map(([value]) => value);
936
963
  const currentVersions = depValues.map(([, version]) => version);
937
- const versionsChanged = !(0, import_fast_deep_equal.default)(currentVersions, this.depsVersions);
964
+ const versionsChanged = !(0, import_fast_deep_equal2.default)(currentVersions, this.depsVersions);
938
965
  if (this.value === void 0 || versionsChanged) {
939
966
  let newVal = this.computeFn(...values);
940
- changed = !(0, import_fast_deep_equal.default)(newVal, this.value);
967
+ changed = !this.equalityCheck(newVal, this.value);
941
968
  if (changed) {
942
969
  this.value = newVal;
943
970
  }
@@ -1051,13 +1078,16 @@ var Reaction = class _Reaction {
1051
1078
  // src/subs.ts
1052
1079
  var KIND4 = "sub";
1053
1080
  var KIND_DEPS = "subDeps";
1054
- function regSub(id, computeFn, depsFn) {
1081
+ function regSub(id, computeFn, depsFn, config) {
1055
1082
  if (hasHandler(KIND4, id)) {
1056
1083
  consoleLog("warn", `[reflex] Overriding. Subscription '${id}' already registered.`);
1057
1084
  }
1058
1085
  if (!computeFn) {
1059
1086
  registerHandler(KIND4, id, () => getAppDb()[id]);
1060
1087
  registerHandler(KIND_DEPS, id, () => []);
1088
+ } else if (typeof computeFn === "string") {
1089
+ registerHandler(KIND4, id, () => getAppDb()[computeFn]);
1090
+ registerHandler(KIND_DEPS, id, () => []);
1061
1091
  } else {
1062
1092
  if (!depsFn) {
1063
1093
  consoleLog("error", `[reflex] Subscription '${id}' has computeFn but missing depsFn. Computed subscriptions must specify their dependencies.`);
@@ -1066,6 +1096,9 @@ function regSub(id, computeFn, depsFn) {
1066
1096
  registerHandler(KIND4, id, computeFn);
1067
1097
  registerHandler(KIND_DEPS, id, depsFn);
1068
1098
  }
1099
+ if (config) {
1100
+ setSubConfig(id, config);
1101
+ }
1069
1102
  }
1070
1103
  function getOrCreateReaction(subVector) {
1071
1104
  const subId = subVector[0];
@@ -1088,6 +1121,8 @@ function getOrCreateReaction(subVector) {
1088
1121
  const depsReactions = depsVectors.map((depVector) => {
1089
1122
  return getOrCreateReaction(depVector);
1090
1123
  });
1124
+ const subConfig = getSubConfig(subId);
1125
+ const equalityCheck = subConfig?.equalityCheck || getGlobalEqualityCheck();
1091
1126
  const reaction = Reaction.create(
1092
1127
  (...depValues) => {
1093
1128
  if (params.length > 0) {
@@ -1096,7 +1131,8 @@ function getOrCreateReaction(subVector) {
1096
1131
  return computeFn(...depValues);
1097
1132
  }
1098
1133
  },
1099
- depsReactions
1134
+ depsReactions,
1135
+ equalityCheck
1100
1136
  );
1101
1137
  reaction.setId(subVectorKey);
1102
1138
  reaction.setSubVector(subVector);
@@ -1246,6 +1282,7 @@ function HotReloadWrapper({ children }) {
1246
1282
  enableTracePrint,
1247
1283
  enableTracing,
1248
1284
  getAppDb,
1285
+ getGlobalEqualityCheck,
1249
1286
  getGlobalInterceptors,
1250
1287
  getHandler,
1251
1288
  getHandlers,
@@ -1262,6 +1299,7 @@ function HotReloadWrapper({ children }) {
1262
1299
  registerHotReloadCallback,
1263
1300
  registerTraceCb,
1264
1301
  removeTraceCb,
1302
+ setGlobalEqualityCheck,
1265
1303
  setupSubsHotReload,
1266
1304
  throttleAndDispatch,
1267
1305
  triggerHotReload,
package/dist/index.d.cts CHANGED
@@ -13,6 +13,9 @@ type ErrorHandler = (originalError: Error, reflexError: Error & {
13
13
  type SubVector = [Id, ...any[]];
14
14
  type SubHandler = (...values: any[]) => any;
15
15
  type SubDepsHandler = (...params: any[]) => SubVector[];
16
+ interface SubConfig {
17
+ equalityCheck?: EqualityCheckFn;
18
+ }
16
19
  type Effects = [string, any?][];
17
20
  interface DispatchLaterEffect {
18
21
  ms: number;
@@ -38,6 +41,7 @@ interface Interceptor<T = Record<string, any>> {
38
41
  after?: (context: Context<T>) => Context<T>;
39
42
  comment?: string;
40
43
  }
44
+ type EqualityCheckFn = (a: any, b: any) => boolean;
41
45
 
42
46
  declare function initAppDb<T = Record<string, any>>(value: Db<T>): void;
43
47
  declare function getAppDb<T = Record<string, any>>(): Db<T>;
@@ -110,8 +114,9 @@ declare class Reaction<T> {
110
114
  private version;
111
115
  private depsVersions;
112
116
  private subVector;
113
- constructor(computeFn: (...depValues: any[]) => T, deps?: Reaction<any>[]);
114
- static create<R>(fn: (...values: any[]) => R, deps?: Reaction<any>[]): Reaction<R>;
117
+ private equalityCheck;
118
+ constructor(computeFn: (...depValues: any[]) => T, deps?: Reaction<any>[], equalityCheck?: EqualityCheckFn);
119
+ static create<R>(fn: (...values: any[]) => R, deps?: Reaction<any>[], equalityCheck?: EqualityCheckFn): Reaction<R>;
115
120
  computeValue(): T;
116
121
  getValue(): T;
117
122
  getDepValue(notifyWatchers?: boolean): [T, number];
@@ -135,7 +140,7 @@ declare class Reaction<T> {
135
140
  get isRoot(): boolean;
136
141
  }
137
142
 
138
- declare function regSub<R>(id: Id, computeFn?: (...values: any[]) => R, depsFn?: (...params: any[]) => SubVector[]): void;
143
+ declare function regSub<R>(id: Id, computeFn?: ((...values: any[]) => R) | string, depsFn?: (...params: any[]) => SubVector[], config?: SubConfig): void;
139
144
  declare function getSubscriptionValue<T>(subVector: SubVector): T;
140
145
 
141
146
  declare function regEffect(id: string, handler: EffectHandler): void;
@@ -159,6 +164,14 @@ declare function getGlobalInterceptors(): Interceptor[];
159
164
  */
160
165
  declare function clearGlobalInterceptors(): void;
161
166
  declare function clearGlobalInterceptors(id: string): void;
167
+ /**
168
+ * Set the global equality check function used for reaction value comparisons
169
+ */
170
+ declare function setGlobalEqualityCheck(equalityCheck: EqualityCheckFn): void;
171
+ /**
172
+ * Get the current global equality check function
173
+ */
174
+ declare function getGlobalEqualityCheck(): EqualityCheckFn;
162
175
 
163
176
  type Kind = 'event' | 'fx' | 'cofx' | 'sub' | 'subDeps' | 'error';
164
177
  type RegistryHandler = EventHandler | EffectHandler | CoEffectHandler | ErrorHandler | SubHandler | SubDepsHandler;
@@ -255,4 +268,4 @@ declare function registerTraceCb(key: string, cb: TraceCallback): void;
255
268
  declare function removeTraceCb(key: string): void;
256
269
  declare function enableTracePrint(): void;
257
270
 
258
- export { CoEffectHandler, CoEffects, Context, DISPATCH, DISPATCH_LATER, Db, DispatchLaterEffect, EffectHandler, Effects, ErrorHandler, EventHandler, EventVector, HotReloadWrapper, Id, Interceptor, NOW, RANDOM, SubVector, clearGlobalInterceptors, clearHandlers, clearHotReloadCallbacks, clearReactions, clearSubs, current, debounceAndDispatch, defaultErrorHandler, disableTracing, dispatch, enableTracePrint, enableTracing, getAppDb, getGlobalInterceptors, getHandler, getHandlers, getReactions, getSubscriptionValue, initAppDb, original, regCoeffect, regEffect, regEvent, regEventErrorHandler, regGlobalInterceptor, regSub, registerHotReloadCallback, registerTraceCb, removeTraceCb, setupSubsHotReload, throttleAndDispatch, triggerHotReload, useHotReload, useHotReloadKey, useSubscription };
271
+ export { CoEffectHandler, CoEffects, Context, DISPATCH, DISPATCH_LATER, Db, DispatchLaterEffect, EffectHandler, Effects, EqualityCheckFn, ErrorHandler, EventHandler, EventVector, HotReloadWrapper, Id, Interceptor, NOW, RANDOM, SubConfig, SubVector, clearGlobalInterceptors, clearHandlers, clearHotReloadCallbacks, clearReactions, clearSubs, current, debounceAndDispatch, defaultErrorHandler, disableTracing, dispatch, enableTracePrint, enableTracing, getAppDb, getGlobalEqualityCheck, getGlobalInterceptors, getHandler, getHandlers, getReactions, getSubscriptionValue, initAppDb, original, regCoeffect, regEffect, regEvent, regEventErrorHandler, regGlobalInterceptor, regSub, registerHotReloadCallback, registerTraceCb, removeTraceCb, setGlobalEqualityCheck, setupSubsHotReload, throttleAndDispatch, triggerHotReload, useHotReload, useHotReloadKey, useSubscription };
package/dist/index.d.ts CHANGED
@@ -13,6 +13,9 @@ type ErrorHandler = (originalError: Error, reflexError: Error & {
13
13
  type SubVector = [Id, ...any[]];
14
14
  type SubHandler = (...values: any[]) => any;
15
15
  type SubDepsHandler = (...params: any[]) => SubVector[];
16
+ interface SubConfig {
17
+ equalityCheck?: EqualityCheckFn;
18
+ }
16
19
  type Effects = [string, any?][];
17
20
  interface DispatchLaterEffect {
18
21
  ms: number;
@@ -38,6 +41,7 @@ interface Interceptor<T = Record<string, any>> {
38
41
  after?: (context: Context<T>) => Context<T>;
39
42
  comment?: string;
40
43
  }
44
+ type EqualityCheckFn = (a: any, b: any) => boolean;
41
45
 
42
46
  declare function initAppDb<T = Record<string, any>>(value: Db<T>): void;
43
47
  declare function getAppDb<T = Record<string, any>>(): Db<T>;
@@ -110,8 +114,9 @@ declare class Reaction<T> {
110
114
  private version;
111
115
  private depsVersions;
112
116
  private subVector;
113
- constructor(computeFn: (...depValues: any[]) => T, deps?: Reaction<any>[]);
114
- static create<R>(fn: (...values: any[]) => R, deps?: Reaction<any>[]): Reaction<R>;
117
+ private equalityCheck;
118
+ constructor(computeFn: (...depValues: any[]) => T, deps?: Reaction<any>[], equalityCheck?: EqualityCheckFn);
119
+ static create<R>(fn: (...values: any[]) => R, deps?: Reaction<any>[], equalityCheck?: EqualityCheckFn): Reaction<R>;
115
120
  computeValue(): T;
116
121
  getValue(): T;
117
122
  getDepValue(notifyWatchers?: boolean): [T, number];
@@ -135,7 +140,7 @@ declare class Reaction<T> {
135
140
  get isRoot(): boolean;
136
141
  }
137
142
 
138
- declare function regSub<R>(id: Id, computeFn?: (...values: any[]) => R, depsFn?: (...params: any[]) => SubVector[]): void;
143
+ declare function regSub<R>(id: Id, computeFn?: ((...values: any[]) => R) | string, depsFn?: (...params: any[]) => SubVector[], config?: SubConfig): void;
139
144
  declare function getSubscriptionValue<T>(subVector: SubVector): T;
140
145
 
141
146
  declare function regEffect(id: string, handler: EffectHandler): void;
@@ -159,6 +164,14 @@ declare function getGlobalInterceptors(): Interceptor[];
159
164
  */
160
165
  declare function clearGlobalInterceptors(): void;
161
166
  declare function clearGlobalInterceptors(id: string): void;
167
+ /**
168
+ * Set the global equality check function used for reaction value comparisons
169
+ */
170
+ declare function setGlobalEqualityCheck(equalityCheck: EqualityCheckFn): void;
171
+ /**
172
+ * Get the current global equality check function
173
+ */
174
+ declare function getGlobalEqualityCheck(): EqualityCheckFn;
162
175
 
163
176
  type Kind = 'event' | 'fx' | 'cofx' | 'sub' | 'subDeps' | 'error';
164
177
  type RegistryHandler = EventHandler | EffectHandler | CoEffectHandler | ErrorHandler | SubHandler | SubDepsHandler;
@@ -255,4 +268,4 @@ declare function registerTraceCb(key: string, cb: TraceCallback): void;
255
268
  declare function removeTraceCb(key: string): void;
256
269
  declare function enableTracePrint(): void;
257
270
 
258
- export { CoEffectHandler, CoEffects, Context, DISPATCH, DISPATCH_LATER, Db, DispatchLaterEffect, EffectHandler, Effects, ErrorHandler, EventHandler, EventVector, HotReloadWrapper, Id, Interceptor, NOW, RANDOM, SubVector, clearGlobalInterceptors, clearHandlers, clearHotReloadCallbacks, clearReactions, clearSubs, current, debounceAndDispatch, defaultErrorHandler, disableTracing, dispatch, enableTracePrint, enableTracing, getAppDb, getGlobalInterceptors, getHandler, getHandlers, getReactions, getSubscriptionValue, initAppDb, original, regCoeffect, regEffect, regEvent, regEventErrorHandler, regGlobalInterceptor, regSub, registerHotReloadCallback, registerTraceCb, removeTraceCb, setupSubsHotReload, throttleAndDispatch, triggerHotReload, useHotReload, useHotReloadKey, useSubscription };
271
+ export { CoEffectHandler, CoEffects, Context, DISPATCH, DISPATCH_LATER, Db, DispatchLaterEffect, EffectHandler, Effects, EqualityCheckFn, ErrorHandler, EventHandler, EventVector, HotReloadWrapper, Id, Interceptor, NOW, RANDOM, SubConfig, SubVector, clearGlobalInterceptors, clearHandlers, clearHotReloadCallbacks, clearReactions, clearSubs, current, debounceAndDispatch, defaultErrorHandler, disableTracing, dispatch, enableTracePrint, enableTracing, getAppDb, getGlobalEqualityCheck, getGlobalInterceptors, getHandler, getHandlers, getReactions, getSubscriptionValue, initAppDb, original, regCoeffect, regEffect, regEvent, regEventErrorHandler, regGlobalInterceptor, regSub, registerHotReloadCallback, registerTraceCb, removeTraceCb, setGlobalEqualityCheck, setupSubsHotReload, throttleAndDispatch, triggerHotReload, useHotReload, useHotReloadKey, useSubscription };
package/dist/index.mjs CHANGED
@@ -87,6 +87,7 @@ function clearSubs() {
87
87
  clearReactions();
88
88
  clearHandlers("sub");
89
89
  clearHandlers("subDeps");
90
+ clearSubConfigs();
90
91
  }
91
92
  var interceptorsRegistry = /* @__PURE__ */ new Map();
92
93
  function getInterceptors(eventId) {
@@ -95,6 +96,20 @@ function getInterceptors(eventId) {
95
96
  function setInterceptors(eventId, interceptors) {
96
97
  interceptorsRegistry.set(eventId, interceptors);
97
98
  }
99
+ var subConfigRegistry = /* @__PURE__ */ new Map();
100
+ function getSubConfig(subId) {
101
+ return subConfigRegistry.get(subId);
102
+ }
103
+ function setSubConfig(subId, config) {
104
+ subConfigRegistry.set(subId, config);
105
+ }
106
+ function clearSubConfigs(subId) {
107
+ if (subId == null) {
108
+ subConfigRegistry.clear();
109
+ } else {
110
+ subConfigRegistry.delete(subId);
111
+ }
112
+ }
98
113
 
99
114
  // src/schedule.ts
100
115
  function scheduleAfterRender(f) {
@@ -509,8 +524,10 @@ regEffect(DISPATCH, (value) => {
509
524
  import { enablePatches, produceWithPatches } from "immer";
510
525
 
511
526
  // src/settings.ts
527
+ import isEqual from "fast-deep-equal";
512
528
  var store = {
513
- globalInterceptors: []
529
+ globalInterceptors: [],
530
+ globalEqualityCheck: isEqual
514
531
  };
515
532
  function replaceGlobalInterceptor(globalInterceptors, interceptor) {
516
533
  return globalInterceptors.reduce((ret, existingInterceptor) => {
@@ -540,6 +557,12 @@ function clearGlobalInterceptors(id) {
540
557
  store.globalInterceptors = store.globalInterceptors.filter((interceptor) => interceptor.id !== id);
541
558
  }
542
559
  }
560
+ function setGlobalEqualityCheck(equalityCheck) {
561
+ store.globalEqualityCheck = equalityCheck;
562
+ }
563
+ function getGlobalEqualityCheck() {
564
+ return store.globalEqualityCheck;
565
+ }
543
566
 
544
567
  // src/trace.ts
545
568
  var nextId = 1;
@@ -775,7 +798,7 @@ function defaultErrorHandler(originalError, reflexError) {
775
798
  regEventErrorHandler(defaultErrorHandler);
776
799
 
777
800
  // src/reaction.ts
778
- import isEqual from "fast-deep-equal";
801
+ import isEqual2 from "fast-deep-equal";
779
802
  var Reaction = class _Reaction {
780
803
  id = "";
781
804
  computeFn;
@@ -788,12 +811,14 @@ var Reaction = class _Reaction {
788
811
  version = 0;
789
812
  depsVersions = [];
790
813
  subVector;
791
- constructor(computeFn, deps) {
814
+ equalityCheck;
815
+ constructor(computeFn, deps, equalityCheck) {
792
816
  this.computeFn = computeFn;
793
817
  this.deps = deps;
818
+ this.equalityCheck = equalityCheck || isEqual2;
794
819
  }
795
- static create(fn, deps) {
796
- return new _Reaction(fn, deps);
820
+ static create(fn, deps, equalityCheck) {
821
+ return new _Reaction(fn, deps, equalityCheck);
797
822
  }
798
823
  computeValue() {
799
824
  this.ensureDirty();
@@ -859,10 +884,10 @@ var Reaction = class _Reaction {
859
884
  const depValues = this.deps?.map((d) => d.getDepValue(notifyWatchers)) ?? [];
860
885
  const values = depValues.map(([value]) => value);
861
886
  const currentVersions = depValues.map(([, version]) => version);
862
- const versionsChanged = !isEqual(currentVersions, this.depsVersions);
887
+ const versionsChanged = !isEqual2(currentVersions, this.depsVersions);
863
888
  if (this.value === void 0 || versionsChanged) {
864
889
  let newVal = this.computeFn(...values);
865
- changed = !isEqual(newVal, this.value);
890
+ changed = !this.equalityCheck(newVal, this.value);
866
891
  if (changed) {
867
892
  this.value = newVal;
868
893
  }
@@ -976,13 +1001,16 @@ var Reaction = class _Reaction {
976
1001
  // src/subs.ts
977
1002
  var KIND4 = "sub";
978
1003
  var KIND_DEPS = "subDeps";
979
- function regSub(id, computeFn, depsFn) {
1004
+ function regSub(id, computeFn, depsFn, config) {
980
1005
  if (hasHandler(KIND4, id)) {
981
1006
  consoleLog("warn", `[reflex] Overriding. Subscription '${id}' already registered.`);
982
1007
  }
983
1008
  if (!computeFn) {
984
1009
  registerHandler(KIND4, id, () => getAppDb()[id]);
985
1010
  registerHandler(KIND_DEPS, id, () => []);
1011
+ } else if (typeof computeFn === "string") {
1012
+ registerHandler(KIND4, id, () => getAppDb()[computeFn]);
1013
+ registerHandler(KIND_DEPS, id, () => []);
986
1014
  } else {
987
1015
  if (!depsFn) {
988
1016
  consoleLog("error", `[reflex] Subscription '${id}' has computeFn but missing depsFn. Computed subscriptions must specify their dependencies.`);
@@ -991,6 +1019,9 @@ function regSub(id, computeFn, depsFn) {
991
1019
  registerHandler(KIND4, id, computeFn);
992
1020
  registerHandler(KIND_DEPS, id, depsFn);
993
1021
  }
1022
+ if (config) {
1023
+ setSubConfig(id, config);
1024
+ }
994
1025
  }
995
1026
  function getOrCreateReaction(subVector) {
996
1027
  const subId = subVector[0];
@@ -1013,6 +1044,8 @@ function getOrCreateReaction(subVector) {
1013
1044
  const depsReactions = depsVectors.map((depVector) => {
1014
1045
  return getOrCreateReaction(depVector);
1015
1046
  });
1047
+ const subConfig = getSubConfig(subId);
1048
+ const equalityCheck = subConfig?.equalityCheck || getGlobalEqualityCheck();
1016
1049
  const reaction = Reaction.create(
1017
1050
  (...depValues) => {
1018
1051
  if (params.length > 0) {
@@ -1021,7 +1054,8 @@ function getOrCreateReaction(subVector) {
1021
1054
  return computeFn(...depValues);
1022
1055
  }
1023
1056
  },
1024
- depsReactions
1057
+ depsReactions,
1058
+ equalityCheck
1025
1059
  );
1026
1060
  reaction.setId(subVectorKey);
1027
1061
  reaction.setSubVector(subVector);
@@ -1170,6 +1204,7 @@ export {
1170
1204
  enableTracePrint,
1171
1205
  enableTracing,
1172
1206
  getAppDb,
1207
+ getGlobalEqualityCheck,
1173
1208
  getGlobalInterceptors,
1174
1209
  getHandler,
1175
1210
  getHandlers,
@@ -1186,6 +1221,7 @@ export {
1186
1221
  registerHotReloadCallback,
1187
1222
  registerTraceCb,
1188
1223
  removeTraceCb,
1224
+ setGlobalEqualityCheck,
1189
1225
  setupSubsHotReload,
1190
1226
  throttleAndDispatch,
1191
1227
  triggerHotReload,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flexsurfer/reflex",
3
- "version": "0.1.19",
3
+ "version": "0.1.21",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",