aoye 0.0.52 → 0.0.54

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/aoye.esm.js CHANGED
@@ -482,7 +482,11 @@ function link(up = null, down = null) {
482
482
  }
483
483
  up.emitTail = line;
484
484
  if (recHead) {
485
- recTail.nextRecLine = line;
485
+ if (recTail) {
486
+ recTail.nextRecLine = line;
487
+ } else {
488
+ down.recHead = line;
489
+ }
486
490
  } else {
487
491
  down.recHead = line;
488
492
  }
@@ -545,7 +549,11 @@ function outLink(up = null, down = null) {
545
549
  }
546
550
  up.emitTail = line;
547
551
  if (recHead) {
548
- recTail.nextRecLine = line;
552
+ if (recTail) {
553
+ recTail.nextRecLine = line;
554
+ } else {
555
+ down.recHead = line;
556
+ }
549
557
  } else {
550
558
  down.recHead = line;
551
559
  }
@@ -748,11 +756,195 @@ State.Unknown | State.Dirty;
748
756
  State.ScopeReady | State.ScopeAbort;
749
757
  State.ScopeAbort;
750
758
 
759
+ const trackIterator = (cells, scope) => {
760
+ let iter = cells.get(Keys.Iterator);
761
+ if (!iter) {
762
+ iter = new Signal(0);
763
+ iter.scope = scope;
764
+ cells.set(Keys.Iterator, iter);
765
+ }
766
+ iter.get();
767
+ };
768
+ const triggerIterator = cells => {
769
+ const iter = cells.get(Keys.Iterator);
770
+ if (iter) {
771
+ iter.set((iter.value || 0) + 1);
772
+ }
773
+ };
774
+ const trackKey = (cells, scope, key) => {
775
+ let cell = cells.get(key);
776
+ if (!cell) {
777
+ cell = new Signal(undefined);
778
+ cell.scope = scope;
779
+ cells.set(key, cell);
780
+ }
781
+ cell.get();
782
+ };
783
+ const triggerKey = (cells, key) => {
784
+ const cell = cells.get(key);
785
+ if (cell) {
786
+ cell.set((cell.value === undefined ? 0 : cell.value) + 1);
787
+ }
788
+ };
789
+ const createSharedHandler = (cells, scope, deep, targetIsMap) => {
790
+ const iterate = (rawTarget, iteratorFn) => {
791
+ trackIterator(cells, scope);
792
+ const rawIter = rawTarget[iteratorFn]();
793
+ if (!deep) return rawIter;
794
+ const rawNext = rawIter.next.bind(rawIter);
795
+ rawIter.next = () => {
796
+ const result = rawNext();
797
+ if (!result.done) {
798
+ if (iteratorFn === 'entries') {
799
+ result.value[0] = deepSignal(result.value[0], scope);
800
+ result.value[1] = deepSignal(result.value[1], scope);
801
+ } else {
802
+ result.value = deepSignal(result.value, scope);
803
+ }
804
+ }
805
+ return result;
806
+ };
807
+ return rawIter;
808
+ };
809
+ return {
810
+ has(key) {
811
+ const target = this[Keys.Raw];
812
+ trackKey(cells, scope, key);
813
+ return target.has(key);
814
+ },
815
+ delete(key) {
816
+ const target = this[Keys.Raw];
817
+ batchStart();
818
+ const had = target.has(key);
819
+ const result = target.delete(key);
820
+ if (had) {
821
+ triggerKey(cells, key);
822
+ cells.delete(key);
823
+ triggerIterator(cells);
824
+ }
825
+ batchEnd();
826
+ return result;
827
+ },
828
+ clear() {
829
+ const target = this[Keys.Raw];
830
+ batchStart();
831
+ const hadItems = target.size > 0;
832
+ target.clear();
833
+ const iterCell = cells.get(Keys.Iterator);
834
+ cells.clear();
835
+ if (iterCell) cells.set(Keys.Iterator, iterCell);
836
+ if (hadItems) {
837
+ triggerIterator(cells);
838
+ }
839
+ batchEnd();
840
+ },
841
+ forEach(callback, thisArg) {
842
+ const target = this[Keys.Raw];
843
+ trackIterator(cells, scope);
844
+ const wrap = val => deep ? deepSignal(val, scope) : val;
845
+ target.forEach((v, k) => {
846
+ callback.call(thisArg, wrap(v), wrap(k), this);
847
+ });
848
+ },
849
+ keys() {
850
+ return iterate(this[Keys.Raw], 'keys');
851
+ },
852
+ values() {
853
+ return iterate(this[Keys.Raw], 'values');
854
+ },
855
+ entries() {
856
+ return iterate(this[Keys.Raw], 'entries');
857
+ },
858
+ [Symbol.iterator]() {
859
+ return iterate(this[Keys.Raw], targetIsMap ? 'entries' : 'values');
860
+ }
861
+ };
862
+ };
863
+ const createMapHandler = (cells, scope, deep) => ({
864
+ get(key) {
865
+ const target = this[Keys.Raw];
866
+ trackKey(cells, scope, key);
867
+ const value = target.get(key);
868
+ return deep ? deepSignal(value, scope) : value;
869
+ },
870
+ set(key, value) {
871
+ const target = this[Keys.Raw];
872
+ batchStart();
873
+ target.set(key, value);
874
+ let cell = cells.get(key);
875
+ if (!cell) {
876
+ cell = new Signal(value);
877
+ cell.scope = scope;
878
+ cells.set(key, cell);
879
+ } else {
880
+ cell.set(value);
881
+ }
882
+ triggerIterator(cells);
883
+ batchEnd();
884
+ return this;
885
+ }
886
+ });
887
+ const createSetHandler = (cells, scope, _deep) => ({
888
+ add(value) {
889
+ const target = this[Keys.Raw];
890
+ batchStart();
891
+ const had = target.has(value);
892
+ target.add(value);
893
+ let cell = cells.get(value);
894
+ if (!cell) {
895
+ cell = new Signal(value);
896
+ cell.scope = scope;
897
+ cells.set(value, cell);
898
+ } else {
899
+ cell.set(value);
900
+ }
901
+ if (!had) {
902
+ triggerIterator(cells);
903
+ }
904
+ batchEnd();
905
+ return this;
906
+ }
907
+ });
908
+ const mergeHandlers = (...handlers) => Object.assign({}, ...handlers);
909
+
751
910
  const deepSignal = (target, scope, deep = true) => {
752
911
  const isObj = typeof target === 'object' && target !== null;
753
912
  if (!isObj || target[Keys.Raw] || target[Keys.ProxyFreeObject]) return target;
754
913
  const p = rawToProxy.get(target);
755
914
  if (p) return p;
915
+ const targetIsMap = target instanceof Map;
916
+ const targetIsSet = target instanceof Set;
917
+ if (targetIsMap || targetIsSet) {
918
+ const cells = new Map();
919
+ const meta = {
920
+ deep,
921
+ scope,
922
+ cells
923
+ };
924
+ const shared = createSharedHandler(cells, scope, deep, targetIsMap);
925
+ const specific = targetIsMap ? createMapHandler(cells, scope, deep) : createSetHandler(cells, scope);
926
+ const instrumentations = mergeHandlers(shared, specific);
927
+ const proxy = new Proxy(target, {
928
+ get(_obj, prop, receiver) {
929
+ if (prop === Keys.Raw) return target;
930
+ if (prop === Keys.Meta) return meta;
931
+ if (prop === Symbol.toStringTag) return targetIsMap ? 'Map' : 'Set';
932
+ if (prop === 'size') {
933
+ trackIterator(cells, scope);
934
+ return Reflect.get(target, 'size', target);
935
+ }
936
+ if (prop in instrumentations) {
937
+ const fn = instrumentations[prop];
938
+ return typeof fn === 'function' ? fn.bind(receiver) : fn;
939
+ }
940
+ const value = Reflect.get(target, prop, receiver);
941
+ if (typeof value === 'function') return value;
942
+ return deep ? deepSignal(value, scope) : value;
943
+ }
944
+ });
945
+ rawToProxy.set(target, proxy);
946
+ return proxy;
947
+ }
756
948
  const cells = new Map();
757
949
  const targetIsArray = Array.isArray(target);
758
950
  const targetIsStore = Boolean(target.constructor?.[IsStore]);
@@ -801,6 +993,7 @@ const deepSignal = (target, scope, deep = true) => {
801
993
  if (targetIsStore && isIgnoreKey(obj.constructor[StoreIgnoreKeys], prop) || typeof value === 'function') {
802
994
  return Reflect.set(obj, prop, value, receiver);
803
995
  }
996
+ const isNewKey = !Reflect.has(obj, prop);
804
997
  batchStart();
805
998
  const success = Reflect.set(obj, prop, value, receiver);
806
999
  const cell = cells.get(prop);
@@ -809,8 +1002,8 @@ const deepSignal = (target, scope, deep = true) => {
809
1002
  }
810
1003
  if (targetIsArray) {
811
1004
  handleArraySet(obj, prop, value, receiver);
812
- } else {
813
- triggerIter(obj, prop, value, receiver);
1005
+ } else if (isNewKey) {
1006
+ receiver[Keys.Iterator] = (receiver[Keys.Raw][Keys.Iterator] || 0) + 1;
814
1007
  }
815
1008
  batchEnd();
816
1009
  return success;
@@ -820,8 +1013,11 @@ const deepSignal = (target, scope, deep = true) => {
820
1013
  return Reflect.deleteProperty(obj, prop);
821
1014
  }
822
1015
  cells.delete(prop);
823
- triggerIter(obj, prop, undefined, proxy);
824
- return Reflect.deleteProperty(obj, prop);
1016
+ const result = Reflect.deleteProperty(obj, prop);
1017
+ if (!targetIsArray) {
1018
+ proxy[Keys.Iterator] = (obj[Keys.Iterator] || 0) + 1;
1019
+ }
1020
+ return result;
825
1021
  },
826
1022
  ownKeys(obj) {
827
1023
  if (targetIsArray) {
@@ -829,7 +1025,7 @@ const deepSignal = (target, scope, deep = true) => {
829
1025
  } else {
830
1026
  proxy[Keys.Iterator];
831
1027
  }
832
- return Reflect.ownKeys(obj);
1028
+ return Reflect.ownKeys(obj).filter(key => key !== Keys.Iterator);
833
1029
  }
834
1030
  });
835
1031
  rawToProxy.set(target, proxy);
@@ -1206,6 +1402,7 @@ function warpCallbackArgs(isDeep, args, scope, wrapArgs = 0b01) {
1206
1402
  args[0] = wrapCb;
1207
1403
  }
1208
1404
 
1405
+ const isParentKey = (parentStore, expr) => expr in parentStore[Keys.Raw];
1209
1406
  class Store {
1210
1407
  static [IsStore] = true;
1211
1408
  static [StoreIgnoreKeys] = ['ui', 'raw'];
@@ -1216,18 +1413,31 @@ class Store {
1216
1413
  return proxy;
1217
1414
  }
1218
1415
  parent = () => null;
1219
- static new(keyMap = {}, staticMap = {}) {
1416
+ static new(keyMap, staticMap) {
1220
1417
  const parentStore = Store.Current;
1221
1418
  const child = new this();
1222
- if (parentStore) {
1419
+ if (parentStore && keyMap) {
1420
+ const cells = child[Keys.Meta].cells;
1223
1421
  for (const childKey in keyMap) {
1224
- const parentKey = keyMap[childKey];
1225
- shareSignal(parentStore, parentKey, child, childKey);
1422
+ const expr = keyMap[childKey];
1423
+ if (typeof expr === 'function') {
1424
+ cells.set(childKey, new Computed(() => expr(parentStore)));
1425
+ child[Keys.Raw][childKey] = undefined;
1426
+ } else if (typeof expr === 'string') {
1427
+ if (isParentKey(parentStore, expr)) {
1428
+ shareSignal(parentStore, expr, child, childKey);
1429
+ } else {
1430
+ const fn = new Function('data', `let v;with(data){v=${expr};}return v;`);
1431
+ cells.set(childKey, new Computed(() => fn(parentStore)));
1432
+ child[Keys.Raw][childKey] = undefined;
1433
+ }
1434
+ } else {
1435
+ shareSignal(parentStore, expr, child, childKey);
1436
+ }
1226
1437
  }
1227
1438
  }
1228
1439
  for (const key in staticMap) {
1229
- const value = staticMap[key];
1230
- child[key] = value;
1440
+ child[key] = staticMap[key];
1231
1441
  }
1232
1442
  child.parent = () => parentStore;
1233
1443
  Store.Current = parentStore;
@@ -1361,5 +1571,5 @@ function scope(...args) {
1361
1571
  return run;
1362
1572
  }
1363
1573
 
1364
- 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 };
1574
+ 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 };
1365
1575
  //# sourceMappingURL=aoye.esm.js.map