signalium 2.2.0 → 2.2.2

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 (45) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/development/{core-api-BO_W1aEw.js → core-api-C8J7lYBC.js} +2 -2
  3. package/dist/cjs/development/{core-api-BO_W1aEw.js.map → core-api-C8J7lYBC.js.map} +1 -1
  4. package/dist/cjs/development/{debug-DW86yXJK.js → debug-DuXQhd5q.js} +62 -51
  5. package/dist/cjs/development/debug-DuXQhd5q.js.map +1 -0
  6. package/dist/cjs/development/debug.js +1 -1
  7. package/dist/cjs/development/index.js +2 -2
  8. package/dist/cjs/development/react/index.js +2 -2
  9. package/dist/cjs/development/utils.js +2 -2
  10. package/dist/cjs/production/{contexts-BAkp5KrR.js → contexts-DOH1tHd8.js} +62 -51
  11. package/dist/cjs/production/contexts-DOH1tHd8.js.map +1 -0
  12. package/dist/cjs/production/{core-api-B2d0JjB_.js → core-api-Cx2_AumW.js} +2 -2
  13. package/dist/cjs/production/{core-api-B2d0JjB_.js.map → core-api-Cx2_AumW.js.map} +1 -1
  14. package/dist/cjs/production/debug.js +1 -1
  15. package/dist/cjs/production/index.js +2 -2
  16. package/dist/cjs/production/react/index.js +2 -2
  17. package/dist/cjs/production/utils.js +2 -2
  18. package/dist/esm/development/{core-api-CotzAQ5V.js → core-api-CF5aK2Lx.js} +2 -2
  19. package/dist/esm/development/{core-api-CotzAQ5V.js.map → core-api-CF5aK2Lx.js.map} +1 -1
  20. package/dist/esm/development/{debug-DoBIh4Lm.js → debug-E2E1pZe5.js} +62 -51
  21. package/dist/esm/development/debug-E2E1pZe5.js.map +1 -0
  22. package/dist/esm/development/debug.js +1 -1
  23. package/dist/esm/development/index.js +2 -2
  24. package/dist/esm/development/react/index.js +2 -2
  25. package/dist/esm/development/utils.js +3 -3
  26. package/dist/esm/internals/async.d.ts +1 -0
  27. package/dist/esm/internals/async.d.ts.map +1 -1
  28. package/dist/esm/internals/scheduling.d.ts +3 -0
  29. package/dist/esm/internals/scheduling.d.ts.map +1 -1
  30. package/dist/esm/internals/utils/hash.d.ts +1 -3
  31. package/dist/esm/internals/utils/hash.d.ts.map +1 -1
  32. package/dist/esm/internals/watch.d.ts.map +1 -1
  33. package/dist/esm/production/{contexts-CYAwBumI.js → contexts-Dj9Y86xW.js} +62 -51
  34. package/dist/esm/production/contexts-Dj9Y86xW.js.map +1 -0
  35. package/dist/esm/production/{core-api-BY3r_t3J.js → core-api-D_uw3umM.js} +2 -2
  36. package/dist/esm/production/{core-api-BY3r_t3J.js.map → core-api-D_uw3umM.js.map} +1 -1
  37. package/dist/esm/production/debug.js +1 -1
  38. package/dist/esm/production/index.js +2 -2
  39. package/dist/esm/production/react/index.js +2 -2
  40. package/dist/esm/production/utils.js +3 -3
  41. package/package.json +1 -1
  42. package/dist/cjs/development/debug-DW86yXJK.js.map +0 -1
  43. package/dist/cjs/production/contexts-BAkp5KrR.js.map +0 -1
  44. package/dist/esm/development/debug-DoBIh4Lm.js.map +0 -1
  45. package/dist/esm/production/contexts-CYAwBumI.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # signalium
2
2
 
3
+ ## 2.2.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 0aedc29: Fix bugs with async reactive functions never resolving
8
+ - 5f0aafc: Add better tests for the hash function, fix some minor edge cases
9
+
10
+ ## 2.2.1
11
+
12
+ ### Patch Changes
13
+
14
+ - 5378406: Fix async and add chaos tests
15
+
3
16
  ## 2.2.0
4
17
 
5
18
  ### Minor Changes
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- const debug = require("./debug-DW86yXJK.js");
2
+ const debug = require("./debug-DuXQhd5q.js");
3
3
  const DERIVED_DEFINITION_MAP = /* @__PURE__ */ new Map();
4
4
  function getReactiveFnAndDefinition(fn, opts) {
5
5
  let fnAndDef = DERIVED_DEFINITION_MAP.get(fn);
@@ -52,4 +52,4 @@ exports.reactiveSignal = reactiveSignal;
52
52
  exports.relay = relay;
53
53
  exports.task = task;
54
54
  exports.watcher = watcher;
55
- //# sourceMappingURL=core-api-BO_W1aEw.js.map
55
+ //# sourceMappingURL=core-api-C8J7lYBC.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"core-api-BO_W1aEw.js","sources":["../../../src/internals/core-api.ts"],"sourcesContent":["import {\n ReactiveTask,\n ReactiveValue,\n Watcher,\n ReactiveOptions,\n RelayActivate,\n type DiscriminatedReactivePromise,\n SignalOptions,\n ReactiveFn,\n ReadonlySignal,\n} from '../types.js';\nimport { getCurrentScope, getScopeOwner, SignalScope } from './contexts.js';\nimport {\n createReactiveDefinition,\n createReactiveSignal,\n ReactiveDefinition as ReactiveDefinition,\n} from './reactive.js';\nimport { createRelay, createTask } from './async.js';\nimport { Tracer } from './trace.js';\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const DERIVED_DEFINITION_MAP = new Map<Function, [(...args: any) => any, ReactiveDefinition<any, any>]>();\n\nexport function getReactiveFnAndDefinition<T, Args extends unknown[]>(\n fn: (...args: Args) => T,\n opts?: ReactiveOptions<T, Args>,\n): [(...args: Args) => ReactiveValue<T>, ReactiveDefinition<T, Args>] {\n let fnAndDef = DERIVED_DEFINITION_MAP.get(fn);\n\n if (!fnAndDef) {\n const def = createReactiveDefinition(opts?.id, opts?.desc, fn, opts?.equals, false, opts?.paramKey, undefined);\n\n const defScope = getCurrentScope();\n\n const reactiveFn: ReactiveFn<T, Args> = (...args) => {\n const scope = getCurrentScope(defScope);\n const signal = scope.get(def, args as any);\n\n return signal.value;\n };\n\n fnAndDef = [reactiveFn, def];\n\n DERIVED_DEFINITION_MAP.set(fn, fnAndDef);\n }\n\n return fnAndDef;\n}\n\nexport function reactive<T, Args extends unknown[]>(\n fn: (...args: Args) => T,\n opts?: ReactiveOptions<T, Args>,\n): ReactiveFn<T, Args> {\n return getReactiveFnAndDefinition(fn, opts)[0];\n}\n\nexport const reactiveMethod = <T, Args extends unknown[]>(\n owner: object,\n fn: (...args: Args) => T,\n opts?: ReactiveOptions<T, Args>,\n): ReactiveFn<T, Args> => {\n const def = createReactiveDefinition(opts?.id, opts?.desc, fn, opts?.equals, false, opts?.paramKey, undefined);\n\n const reactiveFn: ReactiveFn<T, Args> = (...args) => {\n return getScopeOwner(owner).get(def, args as any).value;\n };\n\n DERIVED_DEFINITION_MAP.set(reactiveFn, [reactiveFn, def]);\n\n return reactiveFn;\n};\n\nexport function relay<T>(activate: RelayActivate<T>, opts?: SignalOptions<T>): DiscriminatedReactivePromise<T> {\n const scope = getCurrentScope();\n\n return createRelay(activate, scope, opts) as DiscriminatedReactivePromise<T>;\n}\n\nexport const task = <T, Args extends unknown[]>(\n fn: (...args: Args) => Promise<T>,\n opts?: SignalOptions<T>,\n): ReactiveTask<T, Args> => {\n const scope = getCurrentScope();\n\n return createTask(fn, scope, opts);\n};\n\nexport function watcher<T>(fn: () => T, opts?: SignalOptions<T> & { isolate?: boolean; tracer?: Tracer }): Watcher<T> {\n const def = createReactiveDefinition(opts?.id, opts?.desc, fn, opts?.equals, false, undefined, opts?.tracer);\n\n const scope = opts?.isolate ? new SignalScope([]) : getCurrentScope();\n\n return createReactiveSignal(def, undefined, undefined, scope);\n}\n\n/**\n * Creates a reactive signal from a compute function. This is useful for when you\n * want to create a signal that does not receive parameters, but is still reactive.\n *\n * @param compute\n * @param opts\n * @returns\n */\nexport const reactiveSignal = <T>(\n compute: () => T,\n opts?: SignalOptions<T> & { isolate?: boolean },\n): ReadonlySignal<T> => {\n const def = createReactiveDefinition(opts?.id, opts?.desc, compute, opts?.equals, false, undefined, undefined);\n\n const scope = opts?.isolate ? new SignalScope([]) : getCurrentScope();\n\n return createReactiveSignal(def, undefined, undefined, scope);\n};\n"],"names":["createReactiveDefinition","getCurrentScope","getScopeOwner","createRelay","createTask","SignalScope","createReactiveSignal"],"mappings":";;AAqBO,MAAM,6CAA6B,IAAA;AAEnC,SAAS,2BACd,IACA,MACoE;AACpE,MAAI,WAAW,uBAAuB,IAAI,EAAE;AAE5C,MAAI,CAAC,UAAU;AACb,UAAM,MAAMA,MAAAA,yBAAyB,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,QAAQ,OAAO,MAAM,UAAU,MAAS;AAE7G,UAAM,WAAWC,MAAAA,gBAAA;AAEjB,UAAM,aAAkC,IAAI,SAAS;AACnD,YAAM,QAAQA,MAAAA,gBAAgB,QAAQ;AACtC,YAAM,SAAS,MAAM,IAAI,KAAK,IAAW;AAEzC,aAAO,OAAO;AAAA,IAChB;AAEA,eAAW,CAAC,YAAY,GAAG;AAE3B,2BAAuB,IAAI,IAAI,QAAQ;AAAA,EACzC;AAEA,SAAO;AACT;AAEO,SAAS,SACd,IACA,MACqB;AACrB,SAAO,2BAA2B,IAAI,IAAI,EAAE,CAAC;AAC/C;AAEO,MAAM,iBAAiB,CAC5B,OACA,IACA,SACwB;AACxB,QAAM,MAAMD,MAAAA,yBAAyB,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,QAAQ,OAAO,MAAM,UAAU,MAAS;AAE7G,QAAM,aAAkC,IAAI,SAAS;AACnD,WAAOE,MAAAA,cAAc,KAAK,EAAE,IAAI,KAAK,IAAW,EAAE;AAAA,EACpD;AAEA,yBAAuB,IAAI,YAAY,CAAC,YAAY,GAAG,CAAC;AAExD,SAAO;AACT;AAEO,SAAS,MAAS,UAA4B,MAA0D;AAC7G,QAAM,QAAQD,MAAAA,gBAAA;AAEd,SAAOE,kBAAY,UAAU,OAAO,IAAI;AAC1C;AAEO,MAAM,OAAO,CAClB,IACA,SAC0B;AAC1B,QAAM,QAAQF,MAAAA,gBAAA;AAEd,SAAOG,iBAAW,IAAI,OAAO,IAAI;AACnC;AAEO,SAAS,QAAW,IAAa,MAA8E;AACpH,QAAM,MAAMJ,MAAAA,yBAAyB,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,QAAQ,OAAO,QAAW,MAAM,MAAM;AAE3G,QAAM,QAAQ,MAAM,UAAU,IAAIK,MAAAA,YAAY,CAAA,CAAE,IAAIJ,sBAAA;AAEpD,SAAOK,MAAAA,qBAAqB,KAAK,QAAW,QAAW,KAAK;AAC9D;AAUO,MAAM,iBAAiB,CAC5B,SACA,SACsB;AACtB,QAAM,MAAMN,MAAAA,yBAAyB,MAAM,IAAI,MAAM,MAAM,SAAS,MAAM,QAAQ,OAAO,QAAW,MAAS;AAE7G,QAAM,QAAQ,MAAM,UAAU,IAAIK,MAAAA,YAAY,CAAA,CAAE,IAAIJ,sBAAA;AAEpD,SAAOK,MAAAA,qBAAqB,KAAK,QAAW,QAAW,KAAK;AAC9D;;;;;;;;"}
1
+ {"version":3,"file":"core-api-C8J7lYBC.js","sources":["../../../src/internals/core-api.ts"],"sourcesContent":["import {\n ReactiveTask,\n ReactiveValue,\n Watcher,\n ReactiveOptions,\n RelayActivate,\n type DiscriminatedReactivePromise,\n SignalOptions,\n ReactiveFn,\n ReadonlySignal,\n} from '../types.js';\nimport { getCurrentScope, getScopeOwner, SignalScope } from './contexts.js';\nimport {\n createReactiveDefinition,\n createReactiveSignal,\n ReactiveDefinition as ReactiveDefinition,\n} from './reactive.js';\nimport { createRelay, createTask } from './async.js';\nimport { Tracer } from './trace.js';\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const DERIVED_DEFINITION_MAP = new Map<Function, [(...args: any) => any, ReactiveDefinition<any, any>]>();\n\nexport function getReactiveFnAndDefinition<T, Args extends unknown[]>(\n fn: (...args: Args) => T,\n opts?: ReactiveOptions<T, Args>,\n): [(...args: Args) => ReactiveValue<T>, ReactiveDefinition<T, Args>] {\n let fnAndDef = DERIVED_DEFINITION_MAP.get(fn);\n\n if (!fnAndDef) {\n const def = createReactiveDefinition(opts?.id, opts?.desc, fn, opts?.equals, false, opts?.paramKey, undefined);\n\n const defScope = getCurrentScope();\n\n const reactiveFn: ReactiveFn<T, Args> = (...args) => {\n const scope = getCurrentScope(defScope);\n const signal = scope.get(def, args as any);\n\n return signal.value;\n };\n\n fnAndDef = [reactiveFn, def];\n\n DERIVED_DEFINITION_MAP.set(fn, fnAndDef);\n }\n\n return fnAndDef;\n}\n\nexport function reactive<T, Args extends unknown[]>(\n fn: (...args: Args) => T,\n opts?: ReactiveOptions<T, Args>,\n): ReactiveFn<T, Args> {\n return getReactiveFnAndDefinition(fn, opts)[0];\n}\n\nexport const reactiveMethod = <T, Args extends unknown[]>(\n owner: object,\n fn: (...args: Args) => T,\n opts?: ReactiveOptions<T, Args>,\n): ReactiveFn<T, Args> => {\n const def = createReactiveDefinition(opts?.id, opts?.desc, fn, opts?.equals, false, opts?.paramKey, undefined);\n\n const reactiveFn: ReactiveFn<T, Args> = (...args) => {\n return getScopeOwner(owner).get(def, args as any).value;\n };\n\n DERIVED_DEFINITION_MAP.set(reactiveFn, [reactiveFn, def]);\n\n return reactiveFn;\n};\n\nexport function relay<T>(activate: RelayActivate<T>, opts?: SignalOptions<T>): DiscriminatedReactivePromise<T> {\n const scope = getCurrentScope();\n\n return createRelay(activate, scope, opts) as DiscriminatedReactivePromise<T>;\n}\n\nexport const task = <T, Args extends unknown[]>(\n fn: (...args: Args) => Promise<T>,\n opts?: SignalOptions<T>,\n): ReactiveTask<T, Args> => {\n const scope = getCurrentScope();\n\n return createTask(fn, scope, opts);\n};\n\nexport function watcher<T>(fn: () => T, opts?: SignalOptions<T> & { isolate?: boolean; tracer?: Tracer }): Watcher<T> {\n const def = createReactiveDefinition(opts?.id, opts?.desc, fn, opts?.equals, false, undefined, opts?.tracer);\n\n const scope = opts?.isolate ? new SignalScope([]) : getCurrentScope();\n\n return createReactiveSignal(def, undefined, undefined, scope);\n}\n\n/**\n * Creates a reactive signal from a compute function. This is useful for when you\n * want to create a signal that does not receive parameters, but is still reactive.\n *\n * @param compute\n * @param opts\n * @returns\n */\nexport const reactiveSignal = <T>(\n compute: () => T,\n opts?: SignalOptions<T> & { isolate?: boolean },\n): ReadonlySignal<T> => {\n const def = createReactiveDefinition(opts?.id, opts?.desc, compute, opts?.equals, false, undefined, undefined);\n\n const scope = opts?.isolate ? new SignalScope([]) : getCurrentScope();\n\n return createReactiveSignal(def, undefined, undefined, scope);\n};\n"],"names":["createReactiveDefinition","getCurrentScope","getScopeOwner","createRelay","createTask","SignalScope","createReactiveSignal"],"mappings":";;AAqBO,MAAM,6CAA6B,IAAA;AAEnC,SAAS,2BACd,IACA,MACoE;AACpE,MAAI,WAAW,uBAAuB,IAAI,EAAE;AAE5C,MAAI,CAAC,UAAU;AACb,UAAM,MAAMA,MAAAA,yBAAyB,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,QAAQ,OAAO,MAAM,UAAU,MAAS;AAE7G,UAAM,WAAWC,MAAAA,gBAAA;AAEjB,UAAM,aAAkC,IAAI,SAAS;AACnD,YAAM,QAAQA,MAAAA,gBAAgB,QAAQ;AACtC,YAAM,SAAS,MAAM,IAAI,KAAK,IAAW;AAEzC,aAAO,OAAO;AAAA,IAChB;AAEA,eAAW,CAAC,YAAY,GAAG;AAE3B,2BAAuB,IAAI,IAAI,QAAQ;AAAA,EACzC;AAEA,SAAO;AACT;AAEO,SAAS,SACd,IACA,MACqB;AACrB,SAAO,2BAA2B,IAAI,IAAI,EAAE,CAAC;AAC/C;AAEO,MAAM,iBAAiB,CAC5B,OACA,IACA,SACwB;AACxB,QAAM,MAAMD,MAAAA,yBAAyB,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,QAAQ,OAAO,MAAM,UAAU,MAAS;AAE7G,QAAM,aAAkC,IAAI,SAAS;AACnD,WAAOE,MAAAA,cAAc,KAAK,EAAE,IAAI,KAAK,IAAW,EAAE;AAAA,EACpD;AAEA,yBAAuB,IAAI,YAAY,CAAC,YAAY,GAAG,CAAC;AAExD,SAAO;AACT;AAEO,SAAS,MAAS,UAA4B,MAA0D;AAC7G,QAAM,QAAQD,MAAAA,gBAAA;AAEd,SAAOE,kBAAY,UAAU,OAAO,IAAI;AAC1C;AAEO,MAAM,OAAO,CAClB,IACA,SAC0B;AAC1B,QAAM,QAAQF,MAAAA,gBAAA;AAEd,SAAOG,iBAAW,IAAI,OAAO,IAAI;AACnC;AAEO,SAAS,QAAW,IAAa,MAA8E;AACpH,QAAM,MAAMJ,MAAAA,yBAAyB,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,QAAQ,OAAO,QAAW,MAAM,MAAM;AAE3G,QAAM,QAAQ,MAAM,UAAU,IAAIK,MAAAA,YAAY,CAAA,CAAE,IAAIJ,sBAAA;AAEpD,SAAOK,MAAAA,qBAAqB,KAAK,QAAW,QAAW,KAAK;AAC9D;AAUO,MAAM,iBAAiB,CAC5B,SACA,SACsB;AACtB,QAAM,MAAMN,MAAAA,yBAAyB,MAAM,IAAI,MAAM,MAAM,SAAS,MAAM,QAAQ,OAAO,QAAW,MAAS;AAE7G,QAAM,QAAQ,MAAM,UAAU,IAAIK,MAAAA,YAAY,CAAA,CAAE,IAAIJ,sBAAA;AAEpD,SAAOK,MAAAA,qBAAqB,KAAK,QAAW,QAAW,KAAK;AAC9D;;;;;;;;"}
@@ -432,6 +432,7 @@ function watchActiveSignal(signal2) {
432
432
  const { watchCount } = signal2;
433
433
  const newWatchCount = watchCount + 1;
434
434
  signal2.watchCount = newWatchCount;
435
+ cancelDeactivate(signal2);
435
436
  if (signal2._isActive) {
436
437
  return;
437
438
  }
@@ -454,7 +455,6 @@ function watchSuspendedSignal(signal2) {
454
455
  const newSuspendCount = suspendCount + 1;
455
456
  signal2.watchCount = newWatchCount;
456
457
  signal2.suspendCount = newSuspendCount;
457
- signal2.scope?.removeFromGc(signal2);
458
458
  cancelDeactivate(signal2);
459
459
  if (watchCount === 0) {
460
460
  for (const dep of signal2.deps.keys()) {
@@ -476,6 +476,7 @@ function resumeSignal(signal2) {
476
476
  const { watchCount, suspendCount } = signal2;
477
477
  const newSuspendCount = Math.max(suspendCount - 1, 0);
478
478
  signal2.suspendCount = newSuspendCount;
479
+ cancelDeactivate(signal2);
479
480
  if (watchCount > 0 && !signal2._isActive) {
480
481
  for (const dep of signal2.deps.keys()) {
481
482
  resumeSignal(dep);
@@ -557,6 +558,7 @@ const scheduleDeactivate = (signal2) => {
557
558
  scheduleFlush();
558
559
  };
559
560
  const cancelDeactivate = (signal2) => {
561
+ signal2.scope?.removeFromGc(signal2);
560
562
  PENDING_DEACTIVE.delete(signal2);
561
563
  };
562
564
  const scheduleListeners = (signal2) => {
@@ -1120,8 +1122,11 @@ class ReactivePromiseImpl {
1120
1122
  }
1121
1123
  }
1122
1124
  }
1125
+ _getPending() {
1126
+ return (this._flags & 1) !== 0;
1127
+ }
1123
1128
  _setPending() {
1124
- if ((this._flags & 1) !== 0) {
1129
+ if (this._getPending()) {
1125
1130
  return this._awaitSubs;
1126
1131
  }
1127
1132
  this._setFlags(
@@ -1132,11 +1137,7 @@ class ReactivePromiseImpl {
1132
1137
  return this._awaitSubs = /* @__PURE__ */ new Map();
1133
1138
  }
1134
1139
  _clearPending() {
1135
- this._setFlags(
1136
- 0,
1137
- 1
1138
- /* Pending */
1139
- );
1140
+ this._setValue(this._value);
1140
1141
  }
1141
1142
  async _setPromise(promise) {
1142
1143
  this._promise = promise;
@@ -1491,7 +1492,7 @@ function checkSignal(signal2) {
1491
1492
  while (edge !== void 0) {
1492
1493
  if (edge.type === EdgeType.Promise) {
1493
1494
  const dep2 = edge.dep;
1494
- if (dep2.isPending) {
1495
+ if (dep2._getPending()) {
1495
1496
  const value = signal2._value;
1496
1497
  dep2["_awaitSubs"].set(ref, edge);
1497
1498
  value._setPending();
@@ -1612,30 +1613,22 @@ function hashStr(key, seed = 0) {
1612
1613
  const c1 = 3432918353;
1613
1614
  const c2 = 461845907;
1614
1615
  let i = 0;
1615
- while (i + 4 <= key.length) {
1616
- let k2 = key.charCodeAt(i) & 255 | (key.charCodeAt(i + 1) & 255) << 8 | (key.charCodeAt(i + 2) & 255) << 16 | (key.charCodeAt(i + 3) & 255) << 24;
1617
- k2 = imul(k2, c1);
1618
- k2 = k2 << 15 | k2 >>> 17;
1619
- k2 = imul(k2, c2);
1620
- h ^= k2;
1616
+ while (i + 2 <= key.length) {
1617
+ let k = key.charCodeAt(i) & 65535 | (key.charCodeAt(i + 1) & 65535) << 16;
1618
+ k = imul(k, c1);
1619
+ k = k << 15 | k >>> 17;
1620
+ k = imul(k, c2);
1621
+ h ^= k;
1621
1622
  h = h << 13 | h >>> 19;
1622
1623
  h = imul(h, 5) + 3864292196;
1623
- i += 4;
1624
- }
1625
- let k = 0;
1626
- switch (key.length & 3) {
1627
- case 3:
1628
- k ^= (key.charCodeAt(i + 2) & 255) << 16;
1629
- // eslint-disable-next-line no-fallthrough
1630
- case 2:
1631
- k ^= (key.charCodeAt(i + 1) & 255) << 8;
1632
- // eslint-disable-next-line no-fallthrough
1633
- case 1:
1634
- k ^= key.charCodeAt(i) & 255;
1635
- k = imul(k, c1);
1636
- k = k << 15 | k >>> 17;
1637
- k = imul(k, c2);
1638
- h ^= k;
1624
+ i += 2;
1625
+ }
1626
+ if (key.length & 1) {
1627
+ let k = key.charCodeAt(i) & 65535;
1628
+ k = imul(k, c1);
1629
+ k = k << 15 | k >>> 17;
1630
+ k = imul(k, c2);
1631
+ h ^= k;
1639
1632
  }
1640
1633
  h ^= key.length;
1641
1634
  h ^= h >>> 16;
@@ -1646,8 +1639,9 @@ function hashStr(key, seed = 0) {
1646
1639
  return h >>> 0;
1647
1640
  }
1648
1641
  function hashNumber(num, seed = 0) {
1642
+ let h = num < 0 ? seed ^ 2147483648 : seed;
1649
1643
  num = abs(num);
1650
- let h = seed;
1644
+ const origNum = num;
1651
1645
  const c1 = 3432918353;
1652
1646
  const c2 = 461845907;
1653
1647
  while (num >= 4294967295) {
@@ -1667,7 +1661,7 @@ function hashNumber(num, seed = 0) {
1667
1661
  k = imul(k, c2);
1668
1662
  h ^= k;
1669
1663
  }
1670
- const numBytes = num === 0 ? 1 : floor(log(num) / log(256)) + 1;
1664
+ const numBytes = origNum === 0 ? 1 : floor(log(origNum) / log(256)) + 1;
1671
1665
  h ^= numBytes;
1672
1666
  h ^= h >>> 16;
1673
1667
  h = imul(h, 2246822507);
@@ -1676,12 +1670,12 @@ function hashNumber(num, seed = 0) {
1676
1670
  h ^= h >>> 16;
1677
1671
  return h >>> 0;
1678
1672
  }
1679
- function hashArray(arr) {
1680
- let h = 7;
1673
+ function hashArray(arr, seen) {
1674
+ let h = ARRAY;
1681
1675
  const c1 = 3432918353;
1682
1676
  const c2 = 461845907;
1683
1677
  for (const item of arr) {
1684
- let k = hashValue(item);
1678
+ let k = hashValue(item, seen);
1685
1679
  k = imul(k, c1);
1686
1680
  k = k << 15 | k >>> 17;
1687
1681
  k = imul(k, c2);
@@ -1697,36 +1691,36 @@ function hashArray(arr) {
1697
1691
  h ^= h >>> 16;
1698
1692
  return h >>> 0;
1699
1693
  }
1700
- function hashObject(obj) {
1694
+ function hashObject(obj, seen) {
1701
1695
  let sum = OBJECT;
1702
1696
  const keys = Object.keys(obj);
1703
1697
  for (const key of keys) {
1704
- sum += hashValue(key) ^ hashValue(obj[key]);
1698
+ sum += imul(hashValue(key, seen), 2654435769) ^ hashValue(obj[key], seen);
1705
1699
  }
1706
1700
  return sum >>> 0;
1707
1701
  }
1708
- function hashSet(set) {
1709
- let sum = 13;
1702
+ function hashSet(set, seen) {
1703
+ let sum = SET;
1710
1704
  for (const value of set) {
1711
- sum += hashValue(value);
1705
+ sum += hashValue(value, seen);
1712
1706
  }
1713
1707
  return sum >>> 0;
1714
1708
  }
1715
- function hashMap(map) {
1716
- let sum = 12;
1709
+ function hashMap(map, seen) {
1710
+ let sum = MAP;
1717
1711
  for (const [key, value] of map) {
1718
- sum += hashValue(key) ^ hashValue(value);
1712
+ sum += imul(hashValue(key, seen), 2654435769) ^ hashValue(value, seen);
1719
1713
  }
1720
1714
  return sum >>> 0;
1721
1715
  }
1722
- function hashDate(date) {
1716
+ function hashDate(date, _seen) {
1723
1717
  return hashNumber(
1724
1718
  date.getTime(),
1725
1719
  14
1726
1720
  /* DATE */
1727
1721
  );
1728
1722
  }
1729
- function hashRegExp(regexp) {
1723
+ function hashRegExp(regexp, _seen) {
1730
1724
  const h = hashStr(
1731
1725
  regexp.source + regexp.flags,
1732
1726
  15
@@ -1754,7 +1748,7 @@ const FALSE = hashStr(
1754
1748
  3
1755
1749
  /* FALSE */
1756
1750
  );
1757
- hashStr(
1751
+ const ARRAY = hashStr(
1758
1752
  "array",
1759
1753
  7
1760
1754
  /* ARRAY */
@@ -1764,6 +1758,16 @@ const OBJECT = hashStr(
1764
1758
  8
1765
1759
  /* OBJECT */
1766
1760
  );
1761
+ const SET = hashStr(
1762
+ "set",
1763
+ 13
1764
+ /* SET */
1765
+ );
1766
+ const MAP = hashStr(
1767
+ "map",
1768
+ 12
1769
+ /* MAP */
1770
+ );
1767
1771
  const getObjectProto = Object.getPrototypeOf;
1768
1772
  const PROTO_TO_HASH = /* @__PURE__ */ new Map([
1769
1773
  [Object.prototype, hashObject],
@@ -1774,7 +1778,7 @@ const PROTO_TO_HASH = /* @__PURE__ */ new Map([
1774
1778
  [RegExp.prototype, hashRegExp]
1775
1779
  ]);
1776
1780
  const registerCustomHash = (ctor, hashFn) => {
1777
- PROTO_TO_HASH.set(ctor.prototype, hashFn);
1781
+ PROTO_TO_HASH.set(ctor.prototype, (obj, _seen) => hashFn(obj));
1778
1782
  };
1779
1783
  function hashValue(node, seen = []) {
1780
1784
  switch (typeof node) {
@@ -1815,7 +1819,7 @@ function hashValue(node, seen = []) {
1815
1819
  const hashFn = PROTO_TO_HASH.get(getObjectProto(node));
1816
1820
  if (hashFn) {
1817
1821
  seen.push(node);
1818
- const hash = hashFn(node);
1822
+ const hash = hashFn(node, seen);
1819
1823
  seen.pop();
1820
1824
  return hash;
1821
1825
  }
@@ -1845,9 +1849,16 @@ function getObjectHash(obj) {
1845
1849
  }
1846
1850
  return id;
1847
1851
  }
1848
- const EMPTY_ARRAY_HASH = hashArray([]);
1852
+ const EMPTY_ARRAY_HASH = hashArray([], []);
1849
1853
  function hashReactiveFn(fn, args) {
1850
- return getObjectHash(fn) ^ (args.length > 0 ? hashArray(args) : EMPTY_ARRAY_HASH);
1854
+ const argsHash = args.length > 0 ? hashArray(args, []) : EMPTY_ARRAY_HASH;
1855
+ let k = imul(argsHash, 3432918353);
1856
+ k = k << 15 | k >>> 17;
1857
+ k = imul(k, 461845907);
1858
+ let h = getObjectHash(fn);
1859
+ h ^= k;
1860
+ h = h << 13 | h >>> 19;
1861
+ return imul(h, 5) + 3864292196 >>> 0;
1851
1862
  }
1852
1863
  const objectToIdMap = /* @__PURE__ */ new WeakMap();
1853
1864
  let nextId = 1;
@@ -2260,4 +2271,4 @@ exports.signal = signal;
2260
2271
  exports.unwatchSignal = unwatchSignal;
2261
2272
  exports.watchSignal = watchSignal;
2262
2273
  exports.withContexts = withContexts;
2263
- //# sourceMappingURL=debug-DW86yXJK.js.map
2274
+ //# sourceMappingURL=debug-DuXQhd5q.js.map