aoye 0.0.51 → 0.0.53

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.ts CHANGED
@@ -132,6 +132,10 @@ declare class Signal<T = any> {
132
132
 
133
133
  declare const batchStart: () => number;
134
134
  declare const batchEnd: () => void;
135
+ /** effect、computed 回调执行的唯一 id
136
+ * 用于判断重复依赖属于同一 effect、effect、computed
137
+ */
138
+ declare const batchDeep: () => number;
135
139
  declare function clean(onClean: OnClean): void;
136
140
 
137
141
  declare const execIdInc: () => number;
@@ -229,5 +233,5 @@ declare function effectUt(callback: (...args: ValueDiff[]) => void, depOrOpt?: a
229
233
  declare function effect(callback: (...args: ValueDiff[]) => void, depOrOpt?: any[] | CustomEffectOpt, opt?: CustomEffectOpt): Effect;
230
234
  declare function scope(...args: any[]): any;
231
235
 
232
- export { $, Computed, Effect, EffectStrType2Enum, IsStore, Keys, NoopEffect, ScheduleStatus, ScheduleType, Scope, Signal, Store, StoreIgnoreKeys, batchEnd, batchStart, clean, deepSignal, effect, effectUt, execId, execIdInc, getPulling, ide, macro, micro, noopEffect, now, runWithPulling, scope, setExecId, setPulling, shareSignal, toRaw };
236
+ export { $, Computed, Effect, EffectStrType2Enum, IsStore, Keys, NoopEffect, ScheduleStatus, ScheduleType, Scope, Signal, Store, StoreIgnoreKeys, batchDeep, batchEnd, batchStart, clean, deepSignal, effect, effectUt, execId, execIdInc, getPulling, ide, macro, micro, noopEffect, now, runWithPulling, scope, setExecId, setPulling, shareSignal, toRaw };
233
237
  export type { CreateScope, CreateTaskProps, CustomEffectOpt, DeepOmitPath, DeepPath, DeepValue, Dispose, Key, Link, MatchValue, Mix, OnClean, OutLink, PRecord, ScheduleTypeStr, SideEffect, SignalNode, SignalType, Task, TaskControlReturn, ValueDiff };
package/dist/index.umd.js CHANGED
@@ -486,7 +486,11 @@
486
486
  }
487
487
  up.emitTail = line;
488
488
  if (recHead) {
489
- recTail.nextRecLine = line;
489
+ if (recTail) {
490
+ recTail.nextRecLine = line;
491
+ } else {
492
+ down.recHead = line;
493
+ }
490
494
  } else {
491
495
  down.recHead = line;
492
496
  }
@@ -549,7 +553,11 @@
549
553
  }
550
554
  up.emitTail = line;
551
555
  if (recHead) {
552
- recTail.nextRecLine = line;
556
+ if (recTail) {
557
+ recTail.nextRecLine = line;
558
+ } else {
559
+ down.recHead = line;
560
+ }
553
561
  } else {
554
562
  down.recHead = line;
555
563
  }
@@ -752,11 +760,195 @@
752
760
  State.ScopeReady | State.ScopeAbort;
753
761
  State.ScopeAbort;
754
762
 
763
+ const trackIterator = (cells, scope) => {
764
+ let iter = cells.get(Keys.Iterator);
765
+ if (!iter) {
766
+ iter = new Signal(0);
767
+ iter.scope = scope;
768
+ cells.set(Keys.Iterator, iter);
769
+ }
770
+ iter.get();
771
+ };
772
+ const triggerIterator = (cells, raw) => {
773
+ const iter = cells.get(Keys.Iterator);
774
+ if (iter) {
775
+ iter.set((raw[Keys.Iterator] || 0) + 1);
776
+ }
777
+ };
778
+ const trackKey = (cells, scope, key) => {
779
+ let cell = cells.get(key);
780
+ if (!cell) {
781
+ cell = new Signal(undefined);
782
+ cell.scope = scope;
783
+ cells.set(key, cell);
784
+ }
785
+ cell.get();
786
+ };
787
+ const triggerKey = (cells, key) => {
788
+ const cell = cells.get(key);
789
+ if (cell) {
790
+ cell.set((cell.value === undefined ? 0 : cell.value) + 1);
791
+ }
792
+ };
793
+ const createSharedHandler = (cells, scope, deep, targetIsMap) => {
794
+ const iterate = (rawTarget, iteratorFn) => {
795
+ trackIterator(cells, scope);
796
+ const rawIter = rawTarget[iteratorFn]();
797
+ if (!deep) return rawIter;
798
+ const rawNext = rawIter.next.bind(rawIter);
799
+ rawIter.next = () => {
800
+ const result = rawNext();
801
+ if (!result.done) {
802
+ if (iteratorFn === 'entries') {
803
+ result.value[0] = deepSignal(result.value[0], scope);
804
+ result.value[1] = deepSignal(result.value[1], scope);
805
+ } else {
806
+ result.value = deepSignal(result.value, scope);
807
+ }
808
+ }
809
+ return result;
810
+ };
811
+ return rawIter;
812
+ };
813
+ return {
814
+ has(key) {
815
+ const target = this[Keys.Raw];
816
+ trackKey(cells, scope, key);
817
+ return target.has(key);
818
+ },
819
+ delete(key) {
820
+ const target = this[Keys.Raw];
821
+ batchStart();
822
+ const had = target.has(key);
823
+ const result = target.delete(key);
824
+ if (had) {
825
+ triggerKey(cells, key);
826
+ cells.delete(key);
827
+ triggerIterator(cells, target);
828
+ }
829
+ batchEnd();
830
+ return result;
831
+ },
832
+ clear() {
833
+ const target = this[Keys.Raw];
834
+ batchStart();
835
+ const hadItems = target.size > 0;
836
+ target.clear();
837
+ const iterCell = cells.get(Keys.Iterator);
838
+ cells.clear();
839
+ if (iterCell) cells.set(Keys.Iterator, iterCell);
840
+ if (hadItems) {
841
+ triggerIterator(cells, target);
842
+ }
843
+ batchEnd();
844
+ },
845
+ forEach(callback, thisArg) {
846
+ const target = this[Keys.Raw];
847
+ trackIterator(cells, scope);
848
+ const wrap = val => deep ? deepSignal(val, scope) : val;
849
+ target.forEach((v, k) => {
850
+ callback.call(thisArg, wrap(v), wrap(k), this);
851
+ });
852
+ },
853
+ keys() {
854
+ return iterate(this[Keys.Raw], 'keys');
855
+ },
856
+ values() {
857
+ return iterate(this[Keys.Raw], 'values');
858
+ },
859
+ entries() {
860
+ return iterate(this[Keys.Raw], 'entries');
861
+ },
862
+ [Symbol.iterator]() {
863
+ return iterate(this[Keys.Raw], targetIsMap ? 'entries' : 'values');
864
+ }
865
+ };
866
+ };
867
+ const createMapHandler = (cells, scope, deep) => ({
868
+ get(key) {
869
+ const target = this[Keys.Raw];
870
+ trackKey(cells, scope, key);
871
+ const value = target.get(key);
872
+ return deep ? deepSignal(value, scope) : value;
873
+ },
874
+ set(key, value) {
875
+ const target = this[Keys.Raw];
876
+ batchStart();
877
+ target.set(key, value);
878
+ let cell = cells.get(key);
879
+ if (!cell) {
880
+ cell = new Signal(value);
881
+ cell.scope = scope;
882
+ cells.set(key, cell);
883
+ } else {
884
+ cell.set(value);
885
+ }
886
+ triggerIterator(cells, target);
887
+ batchEnd();
888
+ return this;
889
+ }
890
+ });
891
+ const createSetHandler = (cells, scope, _deep) => ({
892
+ add(value) {
893
+ const target = this[Keys.Raw];
894
+ batchStart();
895
+ const had = target.has(value);
896
+ target.add(value);
897
+ let cell = cells.get(value);
898
+ if (!cell) {
899
+ cell = new Signal(value);
900
+ cell.scope = scope;
901
+ cells.set(value, cell);
902
+ } else {
903
+ cell.set(value);
904
+ }
905
+ if (!had) {
906
+ triggerIterator(cells, target);
907
+ }
908
+ batchEnd();
909
+ return this;
910
+ }
911
+ });
912
+ const mergeHandlers = (...handlers) => Object.assign({}, ...handlers);
913
+
755
914
  const deepSignal = (target, scope, deep = true) => {
756
915
  const isObj = typeof target === 'object' && target !== null;
757
916
  if (!isObj || target[Keys.Raw] || target[Keys.ProxyFreeObject]) return target;
758
917
  const p = rawToProxy.get(target);
759
918
  if (p) return p;
919
+ const targetIsMap = target instanceof Map;
920
+ const targetIsSet = target instanceof Set;
921
+ if (targetIsMap || targetIsSet) {
922
+ const cells = new Map();
923
+ const meta = {
924
+ deep,
925
+ scope,
926
+ cells
927
+ };
928
+ const shared = createSharedHandler(cells, scope, deep, targetIsMap);
929
+ const specific = targetIsMap ? createMapHandler(cells, scope, deep) : createSetHandler(cells, scope);
930
+ const instrumentations = mergeHandlers(shared, specific);
931
+ const proxy = new Proxy(target, {
932
+ get(_obj, prop, receiver) {
933
+ if (prop === Keys.Raw) return target;
934
+ if (prop === Keys.Meta) return meta;
935
+ if (prop === Symbol.toStringTag) return targetIsMap ? 'Map' : 'Set';
936
+ if (prop === 'size') {
937
+ trackIterator(cells, scope);
938
+ return Reflect.get(target, 'size', target);
939
+ }
940
+ if (prop in instrumentations) {
941
+ const fn = instrumentations[prop];
942
+ return typeof fn === 'function' ? fn.bind(receiver) : fn;
943
+ }
944
+ const value = Reflect.get(target, prop, receiver);
945
+ if (typeof value === 'function') return value;
946
+ return deep ? deepSignal(value, scope) : value;
947
+ }
948
+ });
949
+ rawToProxy.set(target, proxy);
950
+ return proxy;
951
+ }
760
952
  const cells = new Map();
761
953
  const targetIsArray = Array.isArray(target);
762
954
  const targetIsStore = Boolean(target.constructor?.[IsStore]);
@@ -805,6 +997,7 @@
805
997
  if (targetIsStore && isIgnoreKey(obj.constructor[StoreIgnoreKeys], prop) || typeof value === 'function') {
806
998
  return Reflect.set(obj, prop, value, receiver);
807
999
  }
1000
+ const isNewKey = !Reflect.has(obj, prop);
808
1001
  batchStart();
809
1002
  const success = Reflect.set(obj, prop, value, receiver);
810
1003
  const cell = cells.get(prop);
@@ -813,8 +1006,8 @@
813
1006
  }
814
1007
  if (targetIsArray) {
815
1008
  handleArraySet(obj, prop, value, receiver);
816
- } else {
817
- triggerIter(obj, prop, value, receiver);
1009
+ } else if (isNewKey) {
1010
+ receiver[Keys.Iterator] = (receiver[Keys.Raw][Keys.Iterator] || 0) + 1;
818
1011
  }
819
1012
  batchEnd();
820
1013
  return success;
@@ -824,8 +1017,11 @@
824
1017
  return Reflect.deleteProperty(obj, prop);
825
1018
  }
826
1019
  cells.delete(prop);
827
- triggerIter(obj, prop, undefined, proxy);
828
- return Reflect.deleteProperty(obj, prop);
1020
+ const result = Reflect.deleteProperty(obj, prop);
1021
+ if (!targetIsArray) {
1022
+ proxy[Keys.Iterator] = (obj[Keys.Iterator] || 0) + 1;
1023
+ }
1024
+ return result;
829
1025
  },
830
1026
  ownKeys(obj) {
831
1027
  if (targetIsArray) {
@@ -833,7 +1029,7 @@
833
1029
  } else {
834
1030
  proxy[Keys.Iterator];
835
1031
  }
836
- return Reflect.ownKeys(obj);
1032
+ return Reflect.ownKeys(obj).filter(key => key !== Keys.Iterator);
837
1033
  }
838
1034
  });
839
1035
  rawToProxy.set(target, proxy);
@@ -1378,6 +1574,7 @@
1378
1574
  exports.Signal = Signal;
1379
1575
  exports.Store = Store;
1380
1576
  exports.StoreIgnoreKeys = StoreIgnoreKeys;
1577
+ exports.batchDeep = batchDeep;
1381
1578
  exports.batchEnd = batchEnd;
1382
1579
  exports.batchStart = batchStart;
1383
1580
  exports.clean = clean;