sia-reactor 0.0.41 → 0.0.42

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.
Files changed (33) hide show
  1. package/dist/{TimeTravelConsole-BjDL0JjZ.d.ts → TimeTravelConsole-Bo83b1S5.d.ts} +2 -2
  2. package/dist/{TimeTravelConsole-Dt8txKnt.d.cts → TimeTravelConsole-DPJf_Ee7.d.cts} +2 -2
  3. package/dist/adapters/react.cjs +28 -22
  4. package/dist/adapters/react.d.cts +3 -3
  5. package/dist/adapters/react.d.ts +3 -3
  6. package/dist/adapters/react.js +4 -4
  7. package/dist/adapters/vanilla.cjs +28 -22
  8. package/dist/adapters/vanilla.d.cts +4 -4
  9. package/dist/adapters/vanilla.d.ts +4 -4
  10. package/dist/adapters/vanilla.js +4 -4
  11. package/dist/{chunk-PJTPFVEG.js → chunk-4SGW3Y6X.js} +15 -9
  12. package/dist/{chunk-A2SOELR6.js → chunk-4U7VB3JS.js} +3 -3
  13. package/dist/{chunk-AW22CQWE.js → chunk-BOBAOEKS.js} +2 -2
  14. package/dist/{chunk-LZJYX2LE.js → chunk-GH5QAGIC.js} +16 -16
  15. package/dist/{index-C_djeddc.d.cts → index-B55979dE.d.cts} +1 -1
  16. package/dist/{index-BtHNGnRR.d.cts → index-C4Z3aveO.d.cts} +10 -10
  17. package/dist/{index-BtHNGnRR.d.ts → index-C4Z3aveO.d.ts} +10 -10
  18. package/dist/{index-CKHoDs6x.d.ts → index-DN85zmt_.d.ts} +1 -1
  19. package/dist/index.cjs +13 -13
  20. package/dist/index.d.cts +1 -1
  21. package/dist/index.d.ts +1 -1
  22. package/dist/index.js +1 -1
  23. package/dist/modules.cjs +14 -14
  24. package/dist/modules.d.cts +4 -4
  25. package/dist/modules.d.ts +4 -4
  26. package/dist/modules.js +3 -3
  27. package/dist/super.d.ts +15 -12
  28. package/dist/super.global.js +31 -25
  29. package/dist/utils.cjs +31 -25
  30. package/dist/utils.d.cts +6 -3
  31. package/dist/utils.d.ts +6 -3
  32. package/dist/utils.js +2 -2
  33. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
- import { R as Reactive } from './index-BtHNGnRR.js';
2
- import { T as TimeTravelModule } from './index-CKHoDs6x.js';
1
+ import { R as Reactive } from './index-C4Z3aveO.js';
2
+ import { T as TimeTravelModule } from './index-DN85zmt_.js';
3
3
 
4
4
  /** Reactive options for the TimeTravel overlay instance. */
5
5
  interface TimeTravelConsoleConfig {
@@ -1,5 +1,5 @@
1
- import { R as Reactive } from './index-BtHNGnRR.cjs';
2
- import { T as TimeTravelModule } from './index-C_djeddc.cjs';
1
+ import { R as Reactive } from './index-C4Z3aveO.cjs';
2
+ import { T as TimeTravelModule } from './index-B55979dE.cjs';
3
3
 
4
4
  /** Reactive options for the TimeTravel overlay instance. */
5
5
  interface TimeTravelConsoleConfig {
@@ -95,12 +95,12 @@ function canHandle(obj, config = CTX.defaults, typecheck = true) {
95
95
  if (config.preserveContext) return !(obj instanceof String) && !(obj instanceof Number) && !(obj instanceof Function) && !(obj instanceof Date) && !(obj instanceof Error) && !(obj instanceof RegExp) && !(obj instanceof Promise) && !(obj instanceof Map) && !(obj instanceof WeakMap) && !(obj instanceof Set) && !(obj instanceof WeakSet) && !(obj instanceof EventTarget);
96
96
  return false;
97
97
  }
98
- function getPath(source, key, separator = ".", keyFunc) {
98
+ function getPath(source, key, separator = ".", keyFn) {
99
99
  if (key === "*") return source;
100
100
  const keys2 = key.split(separator);
101
101
  let currObj = source;
102
102
  for (let i = 0, len = keys2.length; i < len; i++) {
103
- const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
103
+ const key2 = keyFn ? keyFn(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
104
104
  if (match) {
105
105
  const [, key3, iStr] = match;
106
106
  if (!Array.isArray(currObj[key3]) || !(key3 in currObj)) return currObj[key3];
@@ -112,11 +112,11 @@ function getPath(source, key, separator = ".", keyFunc) {
112
112
  }
113
113
  return currObj;
114
114
  }
115
- function setPath(target, key, value, separator = ".", keyFunc) {
115
+ function setPath(target, key, value, separator = ".", keyFn) {
116
116
  if (key === "*") return Object.assign(target, value);
117
117
  const keys2 = key.split(separator);
118
118
  for (let currObj = target, i = 0, len = keys2.length; i < len; i++) {
119
- const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
119
+ const key2 = keyFn ? keyFn(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
120
120
  if (match) {
121
121
  const [, key3, iStr] = match;
122
122
  if (!Array.isArray(currObj[key3])) currObj[key3] = [];
@@ -128,7 +128,7 @@ function setPath(target, key, value, separator = ".", keyFunc) {
128
128
  }
129
129
  }
130
130
  }
131
- function deletePath(target, key, separator = ".", keyFunc) {
131
+ function deletePath(target, key, separator = ".", keyFn) {
132
132
  if (key === "*") {
133
133
  const keys3 = Object.keys(target);
134
134
  for (let i = 0, len = keys3.length; i < len; i++) delete target[keys3[i]];
@@ -136,7 +136,7 @@ function deletePath(target, key, separator = ".", keyFunc) {
136
136
  }
137
137
  const keys2 = key.split(separator);
138
138
  for (let currObj = target, i = 0, len = keys2.length; i < len; i++) {
139
- const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
139
+ const key2 = keyFn ? keyFn(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
140
140
  if (match) {
141
141
  const [, key3, iStr] = match;
142
142
  if (!Array.isArray(currObj[key3]) || !(key3 in currObj)) return;
@@ -149,11 +149,11 @@ function deletePath(target, key, separator = ".", keyFunc) {
149
149
  }
150
150
  }
151
151
  }
152
- function hasPath(source, key, separator = ".", keyFunc) {
152
+ function hasPath(source, key, separator = ".", keyFn) {
153
153
  if (key === "*") return true;
154
154
  const keys2 = key.split(separator);
155
155
  for (let currObj = source, i = 0, len = keys2.length; i < len; i++) {
156
- const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
156
+ const key2 = keyFn ? keyFn(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
157
157
  if (match) {
158
158
  const [, key3, iStr] = match;
159
159
  if (!Array.isArray(currObj[key3]) || !(key3 in currObj)) return false;
@@ -515,7 +515,7 @@ var Reactor = class {
515
515
  if (cord._dead) continue;
516
516
  const response = isGet ? cord.cb(value, payload) : isSet ? cord.cb(value, terminated, payload) : cord.cb(terminated, payload);
517
517
  if (isGet || !(terminated ||= payload.terminated = response === TERMINATOR)) value = response;
518
- if (cord.once) cord._dead = true, killed = true;
518
+ if (cord.once) killed = cord._dead = true;
519
519
  }
520
520
  if (killed) {
521
521
  for (let i = cords.length - 1; i >= 0; i--) if (cords[i]._dead) cords.splice(i, 1), !cords.length && mediators.delete(path);
@@ -531,7 +531,7 @@ var Reactor = class {
531
531
  const cord = scords[i];
532
532
  if (cord._dead) continue;
533
533
  cord.cb(payload.target.value, payload);
534
- if (cord.once) cord._dead = true, killed = true;
534
+ if (cord.once) killed = cord._dead = true;
535
535
  }
536
536
  if (killed) {
537
537
  for (let i = cords.length - 1; i >= 0; i--) if (cords[i]._dead) cords.splice(i, 1), !cords.length && this.watchers.delete(path);
@@ -543,7 +543,7 @@ var Reactor = class {
543
543
  const wildcord = wildscords[i];
544
544
  if (wildcord._dead) continue;
545
545
  wildcord.cb(payload.target.value, payload);
546
- if (wildcord.once) wildcord._dead = true, killed = true;
546
+ if (wildcord.once) killed = wildcord._dead = true;
547
547
  }
548
548
  if (killed) {
549
549
  for (let i = wildcords.length - 1; i >= 0; i--) if (wildcords[i]._dead) wildcords.splice(i, 1), !wildcords.length && this.watchers.delete("*");
@@ -599,7 +599,7 @@ var Reactor = class {
599
599
  if (tDepth > cord.lDepth + cord.depth) continue;
600
600
  }
601
601
  cord.cb(e);
602
- if (cord.once) cord._dead = true, killed = true;
602
+ if (cord.once) killed = cord._dead = true;
603
603
  }
604
604
  if (killed) {
605
605
  for (let i = cords.length - 1; i >= 0; i--) if (cords[i]._dead) cords.splice(i, 1), !cords.length && this.listeners.delete(path);
@@ -607,7 +607,7 @@ var Reactor = class {
607
607
  }
608
608
  /**
609
609
  * Flushes queued listener payloads.
610
- * @param paths Optional path (or paths) to flush.
610
+ * @param paths Optional path(s) to flush.
611
611
  * @example
612
612
  * rtr.tick(); // to flush all paths in batch or pass "*" wildcard
613
613
  * @example
@@ -1185,24 +1185,30 @@ function cleanKeyCombo(combo) {
1185
1185
  };
1186
1186
  return Array.isArray(combo) ? combo.map(clean) : clean(combo);
1187
1187
  }
1188
- function matchKeys(required, actual, strict = false) {
1189
- actual = cleanKeyCombo(actual);
1188
+ function matchKeys(required, actual, strict = false, cleaned = false) {
1189
+ if (!cleaned) actual = cleanKeyCombo(actual);
1190
1190
  const match = (required2, actual2) => {
1191
- required2 = cleanKeyCombo(required2);
1191
+ if (!cleaned) required2 = cleanKeyCombo(required2);
1192
1192
  if (strict) return required2 === actual2;
1193
- const reqKeys = required2.split("+"), actKeys = actual2.split("+");
1194
- return reqKeys.every((k) => actKeys.includes(k));
1193
+ const actualKeys = actual2.split("+");
1194
+ return required2.split("+").every((k) => actualKeys.includes(k));
1195
1195
  };
1196
- return Array.isArray(required) ? required.some((req) => match(req, actual)) : match(required, actual);
1196
+ return Array.isArray(required) ? required.some((required2) => match(required2, actual)) : match(required, actual);
1197
1197
  }
1198
1198
  function getTermsForKey(combo, settings) {
1199
- const terms = { override: false, block: false, whitelisted: false, action: null }, { overrides = [], shortcuts = {}, blocks = [], strictMatches: s = false, whitelist = [] } = settings || {};
1199
+ const terms = { override: false, block: false, whitelisted: false, action: null }, { overrides = [], shortcuts = {}, blocks = [], strictMatch: s = false, rankedMatch = true, whitelist = [] } = settings || {};
1200
1200
  combo = cleanKeyCombo(combo);
1201
1201
  if (matchKeys(overrides, combo, s)) terms.override = true;
1202
1202
  if (matchKeys(blocks, combo, s)) terms.block = true;
1203
1203
  if (matchKeys(whitelist, combo)) terms.whitelisted = true;
1204
- terms.action = Object.keys(shortcuts).find((key) => matchKeys(shortcuts[key], combo, s)) || null;
1205
- return terms;
1204
+ if (!rankedMatch) return terms.action = Object.keys(shortcuts).find((key) => matchKeys(shortcuts[key], combo, s)) || null, terms;
1205
+ let bestA = null, bestE = false, bestL = 0;
1206
+ for (const action of Object.keys(shortcuts))
1207
+ for (const c of Array.isArray(shortcuts[action]) ? shortcuts[action] : [shortcuts[action]]) {
1208
+ const required = cleanKeyCombo(c), isE = required === combo, len = required.split("+").length;
1209
+ if (matchKeys(required, combo, s, true) && (!bestA || isE && !bestE || isE === bestE && len > bestL)) bestA = action, bestE = isE, bestL = len;
1210
+ }
1211
+ return terms.action = bestA, terms;
1206
1212
  }
1207
1213
  function keyEventAllowed(e, settings) {
1208
1214
  if (settings.disabled) return false;
@@ -1,7 +1,7 @@
1
- import { E as EffectOptions, d as Reactor, R as Reactive, J as ReactorBuild, K as DeepReadonly, W as WildPaths, a as PathValue } from '../index-BtHNGnRR.cjs';
1
+ import { E as EffectOptions, d as Reactor, R as Reactive, J as ReactorBuild, K as DeepReadonly, W as WildPaths, a as PathValue } from '../index-C4Z3aveO.cjs';
2
2
  import { useLayoutEffect } from 'react';
3
- import { T as TimeTravelModule } from '../index-C_djeddc.cjs';
4
- import { a as TimeTravelConsoleConfig } from '../TimeTravelConsole-Dt8txKnt.cjs';
3
+ import { T as TimeTravelModule } from '../index-B55979dE.cjs';
4
+ import { a as TimeTravelConsoleConfig } from '../TimeTravelConsole-DPJf_Ee7.cjs';
5
5
 
6
6
  /**
7
7
  * Subscribes a component to desired Reactor state and returns it.
@@ -1,7 +1,7 @@
1
- import { E as EffectOptions, d as Reactor, R as Reactive, J as ReactorBuild, K as DeepReadonly, W as WildPaths, a as PathValue } from '../index-BtHNGnRR.js';
1
+ import { E as EffectOptions, d as Reactor, R as Reactive, J as ReactorBuild, K as DeepReadonly, W as WildPaths, a as PathValue } from '../index-C4Z3aveO.js';
2
2
  import { useLayoutEffect } from 'react';
3
- import { T as TimeTravelModule } from '../index-CKHoDs6x.js';
4
- import { a as TimeTravelConsoleConfig } from '../TimeTravelConsole-BjDL0JjZ.js';
3
+ import { T as TimeTravelModule } from '../index-DN85zmt_.js';
4
+ import { a as TimeTravelConsoleConfig } from '../TimeTravelConsole-Bo83b1S5.js';
5
5
 
6
6
  /**
7
7
  * Subscribes a component to desired Reactor state and returns it.
@@ -2,16 +2,16 @@ import {
2
2
  Autotracker,
3
3
  TimeTravelConsole,
4
4
  withTracker
5
- } from "../chunk-A2SOELR6.js";
6
- import "../chunk-AW22CQWE.js";
7
- import "../chunk-PJTPFVEG.js";
5
+ } from "../chunk-4U7VB3JS.js";
6
+ import "../chunk-BOBAOEKS.js";
7
+ import "../chunk-4SGW3Y6X.js";
8
8
  import {
9
9
  CTX,
10
10
  NIL,
11
11
  NOOP,
12
12
  getPath,
13
13
  getReactor
14
- } from "../chunk-LZJYX2LE.js";
14
+ } from "../chunk-GH5QAGIC.js";
15
15
 
16
16
  // src/ts/adapters/react/hooks/useReactor.ts
17
17
  import { useRef, useCallback, useSyncExternalStore, useMemo } from "react";
@@ -385,7 +385,7 @@ var Reactor = class {
385
385
  if (cord._dead) continue;
386
386
  const response = isGet ? cord.cb(value, payload) : isSet ? cord.cb(value, terminated, payload) : cord.cb(terminated, payload);
387
387
  if (isGet || !(terminated ||= payload.terminated = response === TERMINATOR)) value = response;
388
- if (cord.once) cord._dead = true, killed = true;
388
+ if (cord.once) killed = cord._dead = true;
389
389
  }
390
390
  if (killed) {
391
391
  for (let i = cords.length - 1; i >= 0; i--) if (cords[i]._dead) cords.splice(i, 1), !cords.length && mediators.delete(path);
@@ -401,7 +401,7 @@ var Reactor = class {
401
401
  const cord = scords[i];
402
402
  if (cord._dead) continue;
403
403
  cord.cb(payload.target.value, payload);
404
- if (cord.once) cord._dead = true, killed = true;
404
+ if (cord.once) killed = cord._dead = true;
405
405
  }
406
406
  if (killed) {
407
407
  for (let i = cords.length - 1; i >= 0; i--) if (cords[i]._dead) cords.splice(i, 1), !cords.length && this.watchers.delete(path);
@@ -413,7 +413,7 @@ var Reactor = class {
413
413
  const wildcord = wildscords[i];
414
414
  if (wildcord._dead) continue;
415
415
  wildcord.cb(payload.target.value, payload);
416
- if (wildcord.once) wildcord._dead = true, killed = true;
416
+ if (wildcord.once) killed = wildcord._dead = true;
417
417
  }
418
418
  if (killed) {
419
419
  for (let i = wildcords.length - 1; i >= 0; i--) if (wildcords[i]._dead) wildcords.splice(i, 1), !wildcords.length && this.watchers.delete("*");
@@ -469,7 +469,7 @@ var Reactor = class {
469
469
  if (tDepth > cord.lDepth + cord.depth) continue;
470
470
  }
471
471
  cord.cb(e);
472
- if (cord.once) cord._dead = true, killed = true;
472
+ if (cord.once) killed = cord._dead = true;
473
473
  }
474
474
  if (killed) {
475
475
  for (let i = cords.length - 1; i >= 0; i--) if (cords[i]._dead) cords.splice(i, 1), !cords.length && this.listeners.delete(path);
@@ -477,7 +477,7 @@ var Reactor = class {
477
477
  }
478
478
  /**
479
479
  * Flushes queued listener payloads.
480
- * @param paths Optional path (or paths) to flush.
480
+ * @param paths Optional path(s) to flush.
481
481
  * @example
482
482
  * rtr.tick(); // to flush all paths in batch or pass "*" wildcard
483
483
  * @example
@@ -791,12 +791,12 @@ function canHandle(obj, config = CTX.defaults, typecheck = true) {
791
791
  if (config.preserveContext) return !(obj instanceof String) && !(obj instanceof Number) && !(obj instanceof Function) && !(obj instanceof Date) && !(obj instanceof Error) && !(obj instanceof RegExp) && !(obj instanceof Promise) && !(obj instanceof Map) && !(obj instanceof WeakMap) && !(obj instanceof Set) && !(obj instanceof WeakSet) && !(obj instanceof EventTarget);
792
792
  return false;
793
793
  }
794
- function getPath(source, key, separator = ".", keyFunc) {
794
+ function getPath(source, key, separator = ".", keyFn) {
795
795
  if (key === "*") return source;
796
796
  const keys2 = key.split(separator);
797
797
  let currObj = source;
798
798
  for (let i = 0, len = keys2.length; i < len; i++) {
799
- const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
799
+ const key2 = keyFn ? keyFn(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
800
800
  if (match) {
801
801
  const [, key3, iStr] = match;
802
802
  if (!Array.isArray(currObj[key3]) || !(key3 in currObj)) return currObj[key3];
@@ -808,11 +808,11 @@ function getPath(source, key, separator = ".", keyFunc) {
808
808
  }
809
809
  return currObj;
810
810
  }
811
- function setPath(target, key, value, separator = ".", keyFunc) {
811
+ function setPath(target, key, value, separator = ".", keyFn) {
812
812
  if (key === "*") return Object.assign(target, value);
813
813
  const keys2 = key.split(separator);
814
814
  for (let currObj = target, i = 0, len = keys2.length; i < len; i++) {
815
- const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
815
+ const key2 = keyFn ? keyFn(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
816
816
  if (match) {
817
817
  const [, key3, iStr] = match;
818
818
  if (!Array.isArray(currObj[key3])) currObj[key3] = [];
@@ -824,7 +824,7 @@ function setPath(target, key, value, separator = ".", keyFunc) {
824
824
  }
825
825
  }
826
826
  }
827
- function deletePath(target, key, separator = ".", keyFunc) {
827
+ function deletePath(target, key, separator = ".", keyFn) {
828
828
  if (key === "*") {
829
829
  const keys3 = Object.keys(target);
830
830
  for (let i = 0, len = keys3.length; i < len; i++) delete target[keys3[i]];
@@ -832,7 +832,7 @@ function deletePath(target, key, separator = ".", keyFunc) {
832
832
  }
833
833
  const keys2 = key.split(separator);
834
834
  for (let currObj = target, i = 0, len = keys2.length; i < len; i++) {
835
- const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
835
+ const key2 = keyFn ? keyFn(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
836
836
  if (match) {
837
837
  const [, key3, iStr] = match;
838
838
  if (!Array.isArray(currObj[key3]) || !(key3 in currObj)) return;
@@ -845,11 +845,11 @@ function deletePath(target, key, separator = ".", keyFunc) {
845
845
  }
846
846
  }
847
847
  }
848
- function hasPath(source, key, separator = ".", keyFunc) {
848
+ function hasPath(source, key, separator = ".", keyFn) {
849
849
  if (key === "*") return true;
850
850
  const keys2 = key.split(separator);
851
851
  for (let currObj = source, i = 0, len = keys2.length; i < len; i++) {
852
- const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
852
+ const key2 = keyFn ? keyFn(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
853
853
  if (match) {
854
854
  const [, key3, iStr] = match;
855
855
  if (!Array.isArray(currObj[key3]) || !(key3 in currObj)) return false;
@@ -1105,24 +1105,30 @@ function cleanKeyCombo(combo) {
1105
1105
  };
1106
1106
  return Array.isArray(combo) ? combo.map(clean) : clean(combo);
1107
1107
  }
1108
- function matchKeys(required, actual, strict = false) {
1109
- actual = cleanKeyCombo(actual);
1108
+ function matchKeys(required, actual, strict = false, cleaned = false) {
1109
+ if (!cleaned) actual = cleanKeyCombo(actual);
1110
1110
  const match = (required2, actual2) => {
1111
- required2 = cleanKeyCombo(required2);
1111
+ if (!cleaned) required2 = cleanKeyCombo(required2);
1112
1112
  if (strict) return required2 === actual2;
1113
- const reqKeys = required2.split("+"), actKeys = actual2.split("+");
1114
- return reqKeys.every((k) => actKeys.includes(k));
1113
+ const actualKeys = actual2.split("+");
1114
+ return required2.split("+").every((k) => actualKeys.includes(k));
1115
1115
  };
1116
- return Array.isArray(required) ? required.some((req) => match(req, actual)) : match(required, actual);
1116
+ return Array.isArray(required) ? required.some((required2) => match(required2, actual)) : match(required, actual);
1117
1117
  }
1118
1118
  function getTermsForKey(combo, settings) {
1119
- const terms = { override: false, block: false, whitelisted: false, action: null }, { overrides = [], shortcuts = {}, blocks = [], strictMatches: s = false, whitelist = [] } = settings || {};
1119
+ const terms = { override: false, block: false, whitelisted: false, action: null }, { overrides = [], shortcuts = {}, blocks = [], strictMatch: s = false, rankedMatch = true, whitelist = [] } = settings || {};
1120
1120
  combo = cleanKeyCombo(combo);
1121
1121
  if (matchKeys(overrides, combo, s)) terms.override = true;
1122
1122
  if (matchKeys(blocks, combo, s)) terms.block = true;
1123
1123
  if (matchKeys(whitelist, combo)) terms.whitelisted = true;
1124
- terms.action = Object.keys(shortcuts).find((key) => matchKeys(shortcuts[key], combo, s)) || null;
1125
- return terms;
1124
+ if (!rankedMatch) return terms.action = Object.keys(shortcuts).find((key) => matchKeys(shortcuts[key], combo, s)) || null, terms;
1125
+ let bestA = null, bestE = false, bestL = 0;
1126
+ for (const action of Object.keys(shortcuts))
1127
+ for (const c of Array.isArray(shortcuts[action]) ? shortcuts[action] : [shortcuts[action]]) {
1128
+ const required = cleanKeyCombo(c), isE = required === combo, len = required.split("+").length;
1129
+ if (matchKeys(required, combo, s, true) && (!bestA || isE && !bestE || isE === bestE && len > bestL)) bestA = action, bestE = isE, bestL = len;
1130
+ }
1131
+ return terms.action = bestA, terms;
1126
1132
  }
1127
1133
  function keyEventAllowed(e, settings) {
1128
1134
  if (settings.disabled) return false;
@@ -1,7 +1,7 @@
1
- import { E as EffectOptions } from '../index-BtHNGnRR.cjs';
2
- export { A as Autotracker, w as withTracker } from '../index-BtHNGnRR.cjs';
3
- export { T as TimeTravelConsole, a as TimeTravelConsoleConfig } from '../TimeTravelConsole-Dt8txKnt.cjs';
4
- import '../index-C_djeddc.cjs';
1
+ import { E as EffectOptions } from '../index-C4Z3aveO.cjs';
2
+ export { A as Autotracker, w as withTracker } from '../index-C4Z3aveO.cjs';
3
+ export { T as TimeTravelConsole, a as TimeTravelConsoleConfig } from '../TimeTravelConsole-DPJf_Ee7.cjs';
4
+ import '../index-B55979dE.cjs';
5
5
 
6
6
  /**
7
7
  * Runs a reactive side effect in vanilla JavaScript.
@@ -1,7 +1,7 @@
1
- import { E as EffectOptions } from '../index-BtHNGnRR.js';
2
- export { A as Autotracker, w as withTracker } from '../index-BtHNGnRR.js';
3
- export { T as TimeTravelConsole, a as TimeTravelConsoleConfig } from '../TimeTravelConsole-BjDL0JjZ.js';
4
- import '../index-CKHoDs6x.js';
1
+ import { E as EffectOptions } from '../index-C4Z3aveO.js';
2
+ export { A as Autotracker, w as withTracker } from '../index-C4Z3aveO.js';
3
+ export { T as TimeTravelConsole, a as TimeTravelConsoleConfig } from '../TimeTravelConsole-Bo83b1S5.js';
4
+ import '../index-DN85zmt_.js';
5
5
 
6
6
  /**
7
7
  * Runs a reactive side effect in vanilla JavaScript.
@@ -3,10 +3,10 @@ import {
3
3
  TimeTravelConsole,
4
4
  effect,
5
5
  withTracker
6
- } from "../chunk-A2SOELR6.js";
7
- import "../chunk-AW22CQWE.js";
8
- import "../chunk-PJTPFVEG.js";
9
- import "../chunk-LZJYX2LE.js";
6
+ } from "../chunk-4U7VB3JS.js";
7
+ import "../chunk-BOBAOEKS.js";
8
+ import "../chunk-4SGW3Y6X.js";
9
+ import "../chunk-GH5QAGIC.js";
10
10
  export {
11
11
  Autotracker,
12
12
  TimeTravelConsole,
@@ -84,24 +84,30 @@ function cleanKeyCombo(combo) {
84
84
  };
85
85
  return Array.isArray(combo) ? combo.map(clean) : clean(combo);
86
86
  }
87
- function matchKeys(required, actual, strict = false) {
88
- actual = cleanKeyCombo(actual);
87
+ function matchKeys(required, actual, strict = false, cleaned = false) {
88
+ if (!cleaned) actual = cleanKeyCombo(actual);
89
89
  const match = (required2, actual2) => {
90
- required2 = cleanKeyCombo(required2);
90
+ if (!cleaned) required2 = cleanKeyCombo(required2);
91
91
  if (strict) return required2 === actual2;
92
- const reqKeys = required2.split("+"), actKeys = actual2.split("+");
93
- return reqKeys.every((k) => actKeys.includes(k));
92
+ const actualKeys = actual2.split("+");
93
+ return required2.split("+").every((k) => actualKeys.includes(k));
94
94
  };
95
- return Array.isArray(required) ? required.some((req) => match(req, actual)) : match(required, actual);
95
+ return Array.isArray(required) ? required.some((required2) => match(required2, actual)) : match(required, actual);
96
96
  }
97
97
  function getTermsForKey(combo, settings) {
98
- const terms = { override: false, block: false, whitelisted: false, action: null }, { overrides = [], shortcuts = {}, blocks = [], strictMatches: s = false, whitelist = [] } = settings || {};
98
+ const terms = { override: false, block: false, whitelisted: false, action: null }, { overrides = [], shortcuts = {}, blocks = [], strictMatch: s = false, rankedMatch = true, whitelist = [] } = settings || {};
99
99
  combo = cleanKeyCombo(combo);
100
100
  if (matchKeys(overrides, combo, s)) terms.override = true;
101
101
  if (matchKeys(blocks, combo, s)) terms.block = true;
102
102
  if (matchKeys(whitelist, combo)) terms.whitelisted = true;
103
- terms.action = Object.keys(shortcuts).find((key) => matchKeys(shortcuts[key], combo, s)) || null;
104
- return terms;
103
+ if (!rankedMatch) return terms.action = Object.keys(shortcuts).find((key) => matchKeys(shortcuts[key], combo, s)) || null, terms;
104
+ let bestA = null, bestE = false, bestL = 0;
105
+ for (const action of Object.keys(shortcuts))
106
+ for (const c of Array.isArray(shortcuts[action]) ? shortcuts[action] : [shortcuts[action]]) {
107
+ const required = cleanKeyCombo(c), isE = required === combo, len = required.split("+").length;
108
+ if (matchKeys(required, combo, s, true) && (!bestA || isE && !bestE || isE === bestE && len > bestL)) bestA = action, bestE = isE, bestL = len;
109
+ }
110
+ return terms.action = bestA, terms;
105
111
  }
106
112
  function keyEventAllowed(e, settings) {
107
113
  if (settings.disabled) return false;
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  wpArr
3
- } from "./chunk-AW22CQWE.js";
3
+ } from "./chunk-BOBAOEKS.js";
4
4
  import {
5
5
  KEYS_BLOCKS,
6
6
  createEl,
7
7
  formatKeyForDisplay,
8
8
  keyEventAllowed,
9
9
  parseForARIAKS
10
- } from "./chunk-PJTPFVEG.js";
10
+ } from "./chunk-4SGW3Y6X.js";
11
11
  import {
12
12
  CTX,
13
13
  NIL,
@@ -15,7 +15,7 @@ import {
15
15
  canHandle,
16
16
  nuke,
17
17
  reactive
18
- } from "./chunk-LZJYX2LE.js";
18
+ } from "./chunk-GH5QAGIC.js";
19
19
 
20
20
  // src/ts/adapters/autotracker.ts
21
21
  var Autotracker = class {
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  guardAllMethods,
3
3
  guardMethod
4
- } from "./chunk-PJTPFVEG.js";
4
+ } from "./chunk-4SGW3Y6X.js";
5
5
  import {
6
6
  getPath,
7
7
  getReactor,
@@ -10,7 +10,7 @@ import {
10
10
  nuke,
11
11
  reactive,
12
12
  setPath
13
- } from "./chunk-LZJYX2LE.js";
13
+ } from "./chunk-GH5QAGIC.js";
14
14
 
15
15
  // src/ts/modules/base/index.ts
16
16
  var BaseReactorModule = class {
@@ -77,12 +77,12 @@ function canHandle(obj, config = CTX.defaults, typecheck = true) {
77
77
  if (config.preserveContext) return !(obj instanceof String) && !(obj instanceof Number) && !(obj instanceof Function) && !(obj instanceof Date) && !(obj instanceof Error) && !(obj instanceof RegExp) && !(obj instanceof Promise) && !(obj instanceof Map) && !(obj instanceof WeakMap) && !(obj instanceof Set) && !(obj instanceof WeakSet) && !(obj instanceof EventTarget);
78
78
  return false;
79
79
  }
80
- function getPath(source, key, separator = ".", keyFunc) {
80
+ function getPath(source, key, separator = ".", keyFn) {
81
81
  if (key === "*") return source;
82
82
  const keys = key.split(separator);
83
83
  let currObj = source;
84
84
  for (let i = 0, len = keys.length; i < len; i++) {
85
- const key2 = keyFunc ? keyFunc(keys[i]) : keys[i], match = key2.includes("[") && key2.match(arrRegex);
85
+ const key2 = keyFn ? keyFn(keys[i]) : keys[i], match = key2.includes("[") && key2.match(arrRegex);
86
86
  if (match) {
87
87
  const [, key3, iStr] = match;
88
88
  if (!Array.isArray(currObj[key3]) || !(key3 in currObj)) return currObj[key3];
@@ -94,11 +94,11 @@ function getPath(source, key, separator = ".", keyFunc) {
94
94
  }
95
95
  return currObj;
96
96
  }
97
- function setPath(target, key, value, separator = ".", keyFunc) {
97
+ function setPath(target, key, value, separator = ".", keyFn) {
98
98
  if (key === "*") return Object.assign(target, value);
99
99
  const keys = key.split(separator);
100
100
  for (let currObj = target, i = 0, len = keys.length; i < len; i++) {
101
- const key2 = keyFunc ? keyFunc(keys[i]) : keys[i], match = key2.includes("[") && key2.match(arrRegex);
101
+ const key2 = keyFn ? keyFn(keys[i]) : keys[i], match = key2.includes("[") && key2.match(arrRegex);
102
102
  if (match) {
103
103
  const [, key3, iStr] = match;
104
104
  if (!Array.isArray(currObj[key3])) currObj[key3] = [];
@@ -110,7 +110,7 @@ function setPath(target, key, value, separator = ".", keyFunc) {
110
110
  }
111
111
  }
112
112
  }
113
- function deletePath(target, key, separator = ".", keyFunc) {
113
+ function deletePath(target, key, separator = ".", keyFn) {
114
114
  if (key === "*") {
115
115
  const keys2 = Object.keys(target);
116
116
  for (let i = 0, len = keys2.length; i < len; i++) delete target[keys2[i]];
@@ -118,7 +118,7 @@ function deletePath(target, key, separator = ".", keyFunc) {
118
118
  }
119
119
  const keys = key.split(separator);
120
120
  for (let currObj = target, i = 0, len = keys.length; i < len; i++) {
121
- const key2 = keyFunc ? keyFunc(keys[i]) : keys[i], match = key2.includes("[") && key2.match(arrRegex);
121
+ const key2 = keyFn ? keyFn(keys[i]) : keys[i], match = key2.includes("[") && key2.match(arrRegex);
122
122
  if (match) {
123
123
  const [, key3, iStr] = match;
124
124
  if (!Array.isArray(currObj[key3]) || !(key3 in currObj)) return;
@@ -131,11 +131,11 @@ function deletePath(target, key, separator = ".", keyFunc) {
131
131
  }
132
132
  }
133
133
  }
134
- function hasPath(source, key, separator = ".", keyFunc) {
134
+ function hasPath(source, key, separator = ".", keyFn) {
135
135
  if (key === "*") return true;
136
136
  const keys = key.split(separator);
137
137
  for (let currObj = source, i = 0, len = keys.length; i < len; i++) {
138
- const key2 = keyFunc ? keyFunc(keys[i]) : keys[i], match = key2.includes("[") && key2.match(arrRegex);
138
+ const key2 = keyFn ? keyFn(keys[i]) : keys[i], match = key2.includes("[") && key2.match(arrRegex);
139
139
  if (match) {
140
140
  const [, key3, iStr] = match;
141
141
  if (!Array.isArray(currObj[key3]) || !(key3 in currObj)) return false;
@@ -149,13 +149,13 @@ function hasPath(source, key, separator = ".", keyFunc) {
149
149
  }
150
150
  return true;
151
151
  }
152
- function parsePathObj(obj, separator = ".", keyFunc = (p) => p, seen = /* @__PURE__ */ new WeakSet()) {
152
+ function parsePathObj(obj, separator = ".", keyFn = (p) => p, seen = /* @__PURE__ */ new WeakSet()) {
153
153
  if (!isPOJO(obj) || seen.has(obj)) return obj;
154
154
  seen.add(obj);
155
155
  const result = {}, keys = Object.keys(obj);
156
156
  for (let i = 0, len = keys.length; i < len; i++) {
157
157
  const key = keys[i], val = obj[key];
158
- key === "*" || key.includes(separator) ? setPath(result, key, parsePathObj(val, separator, keyFunc, seen), separator, keyFunc) : result[key] = isPOJO(val) ? parsePathObj(val, separator, keyFunc, seen) : val;
158
+ key === "*" || key.includes(separator) ? setPath(result, key, parsePathObj(val, separator, keyFn, seen), separator, keyFn) : result[key] = isPOJO(val) ? parsePathObj(val, separator, keyFn, seen) : val;
159
159
  }
160
160
  return result;
161
161
  }
@@ -174,7 +174,7 @@ function parseEvtOpts(options, opts, boolOpt = opts[0], result = {}) {
174
174
  return Object.assign(result, "boolean" === typeof options ? { [boolOpt]: options } : options), result;
175
175
  }
176
176
  function fanout(a, b, c, d) {
177
- const isEvPd = !!a?.target, isPath = !isEvPd && "string" === typeof b, [state2, path, olds, news, opts, type] = isEvPd ? [a.root, a.currentTarget.path, a.currentTarget.oldValue, a.currentTarget.value, b || NIL, a.type] : isPath ? [a, b, getPath(a, b), c, d || NIL, void 0] : [void 0, void 0, a, b, c || NIL, void 0], target = isEvPd ? getPath(a.root, a.currentTarget.path) : isPath ? getPath(state2, path) : olds;
177
+ const isEvPd = !!a?.target, isPath = !isEvPd && "string" === typeof b, [state2, path, olds, news, opts, type] = isEvPd ? [a.root, a.currentTarget.path, a.currentTarget.oldValue, a.currentTarget.value, b || NIL, a.type] : isPath ? [a, b, getPath(a, b), c, d || NIL, void 0] : [void 0, void 0, a, b || a, c || NIL, void 0], target = isEvPd ? getPath(a.root, a.currentTarget.path) : isPath ? getPath(state2, path) : olds;
178
178
  if (isEvPd && type !== "set" && type !== "delete" || !target || !canHandle(news, opts)) return;
179
179
  const { merge = false, depth, atomic = true, skipUndef = false, cloneSets = false, txLabel } = opts;
180
180
  const func = () => {
@@ -632,7 +632,7 @@ var Reactor = class {
632
632
  if (cord._dead) continue;
633
633
  const response = isGet ? cord.cb(value, payload) : isSet ? cord.cb(value, terminated, payload) : cord.cb(terminated, payload);
634
634
  if (isGet || !(terminated ||= payload.terminated = response === TERMINATOR)) value = response;
635
- if (cord.once) cord._dead = true, killed = true;
635
+ if (cord.once) killed = cord._dead = true;
636
636
  }
637
637
  if (killed) {
638
638
  for (let i = cords.length - 1; i >= 0; i--) if (cords[i]._dead) cords.splice(i, 1), !cords.length && mediators.delete(path);
@@ -648,7 +648,7 @@ var Reactor = class {
648
648
  const cord = scords[i];
649
649
  if (cord._dead) continue;
650
650
  cord.cb(payload.target.value, payload);
651
- if (cord.once) cord._dead = true, killed = true;
651
+ if (cord.once) killed = cord._dead = true;
652
652
  }
653
653
  if (killed) {
654
654
  for (let i = cords.length - 1; i >= 0; i--) if (cords[i]._dead) cords.splice(i, 1), !cords.length && this.watchers.delete(path);
@@ -660,7 +660,7 @@ var Reactor = class {
660
660
  const wildcord = wildscords[i];
661
661
  if (wildcord._dead) continue;
662
662
  wildcord.cb(payload.target.value, payload);
663
- if (wildcord.once) wildcord._dead = true, killed = true;
663
+ if (wildcord.once) killed = wildcord._dead = true;
664
664
  }
665
665
  if (killed) {
666
666
  for (let i = wildcords.length - 1; i >= 0; i--) if (wildcords[i]._dead) wildcords.splice(i, 1), !wildcords.length && this.watchers.delete("*");
@@ -716,7 +716,7 @@ var Reactor = class {
716
716
  if (tDepth > cord.lDepth + cord.depth) continue;
717
717
  }
718
718
  cord.cb(e);
719
- if (cord.once) cord._dead = true, killed = true;
719
+ if (cord.once) killed = cord._dead = true;
720
720
  }
721
721
  if (killed) {
722
722
  for (let i = cords.length - 1; i >= 0; i--) if (cords[i]._dead) cords.splice(i, 1), !cords.length && this.listeners.delete(path);
@@ -724,7 +724,7 @@ var Reactor = class {
724
724
  }
725
725
  /**
726
726
  * Flushes queued listener payloads.
727
- * @param paths Optional path (or paths) to flush.
727
+ * @param paths Optional path(s) to flush.
728
728
  * @example
729
729
  * rtr.tick(); // to flush all paths in batch or pass "*" wildcard
730
730
  * @example
@@ -1,4 +1,4 @@
1
- import { P as Paths, a as PathValue, b as ReactorModuleId, c as ReactorModulePathConfig, B as BaseReactorModule, T as Transaction, d as Reactor, e as REvent, f as Payload } from './index-BtHNGnRR.cjs';
1
+ import { P as Paths, a as PathValue, b as ReactorModuleId, c as ReactorModulePathConfig, B as BaseReactorModule, T as Transaction, d as Reactor, e as REvent, f as Payload } from './index-C4Z3aveO.cjs';
2
2
 
3
3
  interface StorageAdapterConstructor<Config extends StorageAdapterConfig = StorageAdapterConfig> {
4
4
  new (config?: Partial<Config>): StorageAdapter<any, Config>;