@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 +47 -9
- package/dist/index.d.cts +17 -4
- package/dist/index.d.ts +17 -4
- package/dist/index.mjs +45 -9
- package/package.json +1 -1
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
|
|
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
|
-
|
|
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,
|
|
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 = !
|
|
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
|
-
|
|
114
|
-
|
|
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
|
-
|
|
114
|
-
|
|
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
|
|
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
|
-
|
|
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 = !
|
|
887
|
+
const versionsChanged = !isEqual2(currentVersions, this.depsVersions);
|
|
863
888
|
if (this.value === void 0 || versionsChanged) {
|
|
864
889
|
let newVal = this.computeFn(...values);
|
|
865
|
-
changed = !
|
|
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,
|