signalium 2.2.1 → 2.2.3

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 (47) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/cjs/development/{core-api-BLfPllpC.js → core-api-C6HCIyL3.js} +2 -2
  3. package/dist/cjs/development/{core-api-BLfPllpC.js.map → core-api-C6HCIyL3.js.map} +1 -1
  4. package/dist/cjs/development/{debug-C4VkJKKv.js → debug-3nd-6Gnf.js} +82 -51
  5. package/dist/cjs/development/debug-3nd-6Gnf.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-D9PmMMc5.js → contexts-DoZWv_3I.js} +82 -51
  11. package/dist/cjs/production/contexts-DoZWv_3I.js.map +1 -0
  12. package/dist/cjs/production/{core-api-nNbd4L7C.js → core-api-CUviCxtM.js} +2 -2
  13. package/dist/cjs/production/{core-api-nNbd4L7C.js.map → core-api-CUviCxtM.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-BKTJuFkJ.js → core-api-CjsScNn1.js} +2 -2
  19. package/dist/esm/development/{core-api-BKTJuFkJ.js.map → core-api-CjsScNn1.js.map} +1 -1
  20. package/dist/esm/development/{debug-qm_Izoi_.js → debug-BfudYKc4.js} +82 -51
  21. package/dist/esm/development/debug-BfudYKc4.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.map +1 -1
  27. package/dist/esm/internals/reactive.d.ts +14 -4
  28. package/dist/esm/internals/reactive.d.ts.map +1 -1
  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-BLI-Vgt4.js → contexts-CilfS6eG.js} +82 -51
  34. package/dist/esm/production/contexts-CilfS6eG.js.map +1 -0
  35. package/dist/esm/production/{core-api-Ckj2uqeX.js → core-api-tTQttL8R.js} +2 -2
  36. package/dist/esm/production/{core-api-Ckj2uqeX.js.map → core-api-tTQttL8R.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/dist/esm/types.d.ts +5 -1
  42. package/dist/esm/types.d.ts.map +1 -1
  43. package/package.json +1 -1
  44. package/dist/cjs/development/debug-C4VkJKKv.js.map +0 -1
  45. package/dist/cjs/production/contexts-D9PmMMc5.js.map +0 -1
  46. package/dist/esm/development/debug-qm_Izoi_.js.map +0 -1
  47. package/dist/esm/production/contexts-BLI-Vgt4.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const contexts = require("./contexts-D9PmMMc5.js");
3
+ const contexts = require("./contexts-DoZWv_3I.js");
4
4
  let TRACER;
5
5
  const getTracerProxy = () => {
6
6
  return TRACER;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const coreApi = require("./core-api-nNbd4L7C.js");
4
- const contexts = require("./contexts-D9PmMMc5.js");
3
+ const coreApi = require("./core-api-CUviCxtM.js");
4
+ const contexts = require("./contexts-DoZWv_3I.js");
5
5
  const utils = require("./utils.js");
6
6
  exports.reactive = coreApi.reactive;
7
7
  exports.reactiveMethod = coreApi.reactiveMethod;
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
- const contexts = require("../contexts-D9PmMMc5.js");
6
- const coreApi = require("../core-api-nNbd4L7C.js");
5
+ const contexts = require("../contexts-DoZWv_3I.js");
6
+ const coreApi = require("../core-api-CUviCxtM.js");
7
7
  const ScopeContext = react.createContext(void 0);
8
8
  function useScope() {
9
9
  return react.useContext(ScopeContext);
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const coreApi = require("./core-api-nNbd4L7C.js");
4
- const contexts = require("./contexts-D9PmMMc5.js");
3
+ const coreApi = require("./core-api-CUviCxtM.js");
4
+ const contexts = require("./contexts-DoZWv_3I.js");
5
5
  function watchOnce(fn) {
6
6
  const signal = coreApi.watcher(fn);
7
7
  try {
@@ -1,4 +1,4 @@
1
- import { c as createReactiveDefinition, S as SignalScope, g as getCurrentScope, a as createReactiveSignal, b as createTask, d as createRelay, e as getScopeOwner } from "./debug-qm_Izoi_.js";
1
+ import { c as createReactiveDefinition, S as SignalScope, g as getCurrentScope, a as createReactiveSignal, b as createTask, d as createRelay, e as getScopeOwner } from "./debug-BfudYKc4.js";
2
2
  const DERIVED_DEFINITION_MAP = /* @__PURE__ */ new Map();
3
3
  function getReactiveFnAndDefinition(fn, opts) {
4
4
  let fnAndDef = DERIVED_DEFINITION_MAP.get(fn);
@@ -53,4 +53,4 @@ export {
53
53
  task as t,
54
54
  watcher as w
55
55
  };
56
- //# sourceMappingURL=core-api-BKTJuFkJ.js.map
56
+ //# sourceMappingURL=core-api-CjsScNn1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"core-api-BKTJuFkJ.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":[],"mappings":";AAqBO,MAAM,6CAA6B,IAAA;AAEnC,SAAS,2BACd,IACA,MACoE;AACpE,MAAI,WAAW,uBAAuB,IAAI,EAAE;AAE5C,MAAI,CAAC,UAAU;AACb,UAAM,MAAM,yBAAyB,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,QAAQ,OAAO,MAAM,UAAU,MAAS;AAE7G,UAAM,WAAW,gBAAA;AAEjB,UAAM,aAAkC,IAAI,SAAS;AACnD,YAAM,QAAQ,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,MAAM,yBAAyB,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,QAAQ,OAAO,MAAM,UAAU,MAAS;AAE7G,QAAM,aAAkC,IAAI,SAAS;AACnD,WAAO,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,QAAQ,gBAAA;AAEd,SAAO,YAAY,UAAU,OAAO,IAAI;AAC1C;AAEO,MAAM,OAAO,CAClB,IACA,SAC0B;AAC1B,QAAM,QAAQ,gBAAA;AAEd,SAAO,WAAW,IAAI,OAAO,IAAI;AACnC;AAEO,SAAS,QAAW,IAAa,MAA8E;AACpH,QAAM,MAAM,yBAAyB,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,QAAQ,OAAO,QAAW,MAAM,MAAM;AAE3G,QAAM,QAAQ,MAAM,UAAU,IAAI,YAAY,CAAA,CAAE,IAAI,gBAAA;AAEpD,SAAO,qBAAqB,KAAK,QAAW,QAAW,KAAK;AAC9D;AAUO,MAAM,iBAAiB,CAC5B,SACA,SACsB;AACtB,QAAM,MAAM,yBAAyB,MAAM,IAAI,MAAM,MAAM,SAAS,MAAM,QAAQ,OAAO,QAAW,MAAS;AAE7G,QAAM,QAAQ,MAAM,UAAU,IAAI,YAAY,CAAA,CAAE,IAAI,gBAAA;AAEpD,SAAO,qBAAqB,KAAK,QAAW,QAAW,KAAK;AAC9D;"}
1
+ {"version":3,"file":"core-api-CjsScNn1.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":[],"mappings":";AAqBO,MAAM,6CAA6B,IAAA;AAEnC,SAAS,2BACd,IACA,MACoE;AACpE,MAAI,WAAW,uBAAuB,IAAI,EAAE;AAE5C,MAAI,CAAC,UAAU;AACb,UAAM,MAAM,yBAAyB,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,QAAQ,OAAO,MAAM,UAAU,MAAS;AAE7G,UAAM,WAAW,gBAAA;AAEjB,UAAM,aAAkC,IAAI,SAAS;AACnD,YAAM,QAAQ,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,MAAM,yBAAyB,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,QAAQ,OAAO,MAAM,UAAU,MAAS;AAE7G,QAAM,aAAkC,IAAI,SAAS;AACnD,WAAO,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,QAAQ,gBAAA;AAEd,SAAO,YAAY,UAAU,OAAO,IAAI;AAC1C;AAEO,MAAM,OAAO,CAClB,IACA,SAC0B;AAC1B,QAAM,QAAQ,gBAAA;AAEd,SAAO,WAAW,IAAI,OAAO,IAAI;AACnC;AAEO,SAAS,QAAW,IAAa,MAA8E;AACpH,QAAM,MAAM,yBAAyB,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,QAAQ,OAAO,QAAW,MAAM,MAAM;AAE3G,QAAM,QAAQ,MAAM,UAAU,IAAI,YAAY,CAAA,CAAE,IAAI,gBAAA;AAEpD,SAAO,qBAAqB,KAAK,QAAW,QAAW,KAAK;AAC9D;AAUO,MAAM,iBAAiB,CAC5B,SACA,SACsB;AACtB,QAAM,MAAM,yBAAyB,MAAM,IAAI,MAAM,MAAM,SAAS,MAAM,QAAQ,OAAO,QAAW,MAAS;AAE7G,QAAM,QAAQ,MAAM,UAAU,IAAI,YAAY,CAAA,CAAE,IAAI,gBAAA;AAEpD,SAAO,qBAAqB,KAAK,QAAW,QAAW,KAAK;AAC9D;"}
@@ -431,6 +431,7 @@ function watchActiveSignal(signal2) {
431
431
  const { watchCount } = signal2;
432
432
  const newWatchCount = watchCount + 1;
433
433
  signal2.watchCount = newWatchCount;
434
+ cancelDeactivate(signal2);
434
435
  if (signal2._isActive) {
435
436
  return;
436
437
  }
@@ -453,7 +454,6 @@ function watchSuspendedSignal(signal2) {
453
454
  const newSuspendCount = suspendCount + 1;
454
455
  signal2.watchCount = newWatchCount;
455
456
  signal2.suspendCount = newSuspendCount;
456
- signal2.scope?.removeFromGc(signal2);
457
457
  cancelDeactivate(signal2);
458
458
  if (watchCount === 0) {
459
459
  for (const dep of signal2.deps.keys()) {
@@ -475,6 +475,7 @@ function resumeSignal(signal2) {
475
475
  const { watchCount, suspendCount } = signal2;
476
476
  const newSuspendCount = Math.max(suspendCount - 1, 0);
477
477
  signal2.suspendCount = newSuspendCount;
478
+ cancelDeactivate(signal2);
478
479
  if (watchCount > 0 && !signal2._isActive) {
479
480
  for (const dep of signal2.deps.keys()) {
480
481
  resumeSignal(dep);
@@ -556,6 +557,7 @@ const scheduleDeactivate = (signal2) => {
556
557
  scheduleFlush();
557
558
  };
558
559
  const cancelDeactivate = (signal2) => {
560
+ signal2.scope?.removeFromGc(signal2);
559
561
  PENDING_DEACTIVE.delete(signal2);
560
562
  };
561
563
  const scheduleListeners = (signal2) => {
@@ -1140,10 +1142,10 @@ class ReactivePromiseImpl {
1140
1142
  this._promise = promise;
1141
1143
  const flags = this._flags;
1142
1144
  let awaitSubs = this._awaitSubs;
1143
- if ((flags & 1) === 0) {
1144
- awaitSubs = this._setPending();
1145
- }
1146
1145
  try {
1146
+ if ((flags & 1) === 0) {
1147
+ awaitSubs = this._setPending();
1148
+ }
1147
1149
  const nextValue = await promise;
1148
1150
  if (promise !== this._promise) {
1149
1151
  return;
@@ -1386,6 +1388,9 @@ function createRelay(activate, scope, opts) {
1386
1388
  currentSub = void 0;
1387
1389
  };
1388
1390
  const state = {
1391
+ get isPending() {
1392
+ return (p["_flags"] & 1) !== 0;
1393
+ },
1389
1394
  get value() {
1390
1395
  return p["_value"];
1391
1396
  },
@@ -1435,7 +1440,11 @@ function createTask(task, scope, opts) {
1435
1440
  64
1436
1441
  /* isRunnable */
1437
1442
  );
1443
+ const throwIfRunning = opts?.throwIfRunning === true;
1438
1444
  p["run"] = ((...args) => {
1445
+ if (throwIfRunning && (p["_flags"] & 1) !== 0) {
1446
+ throw new Error("Task is already running");
1447
+ }
1439
1448
  p._setPromise(fn(...args));
1440
1449
  return p;
1441
1450
  });
@@ -1610,30 +1619,22 @@ function hashStr(key, seed = 0) {
1610
1619
  const c1 = 3432918353;
1611
1620
  const c2 = 461845907;
1612
1621
  let i = 0;
1613
- while (i + 4 <= key.length) {
1614
- let k2 = key.charCodeAt(i) & 255 | (key.charCodeAt(i + 1) & 255) << 8 | (key.charCodeAt(i + 2) & 255) << 16 | (key.charCodeAt(i + 3) & 255) << 24;
1615
- k2 = imul(k2, c1);
1616
- k2 = k2 << 15 | k2 >>> 17;
1617
- k2 = imul(k2, c2);
1618
- h ^= k2;
1622
+ while (i + 2 <= key.length) {
1623
+ let k = key.charCodeAt(i) & 65535 | (key.charCodeAt(i + 1) & 65535) << 16;
1624
+ k = imul(k, c1);
1625
+ k = k << 15 | k >>> 17;
1626
+ k = imul(k, c2);
1627
+ h ^= k;
1619
1628
  h = h << 13 | h >>> 19;
1620
1629
  h = imul(h, 5) + 3864292196;
1621
- i += 4;
1622
- }
1623
- let k = 0;
1624
- switch (key.length & 3) {
1625
- case 3:
1626
- k ^= (key.charCodeAt(i + 2) & 255) << 16;
1627
- // eslint-disable-next-line no-fallthrough
1628
- case 2:
1629
- k ^= (key.charCodeAt(i + 1) & 255) << 8;
1630
- // eslint-disable-next-line no-fallthrough
1631
- case 1:
1632
- k ^= key.charCodeAt(i) & 255;
1633
- k = imul(k, c1);
1634
- k = k << 15 | k >>> 17;
1635
- k = imul(k, c2);
1636
- h ^= k;
1630
+ i += 2;
1631
+ }
1632
+ if (key.length & 1) {
1633
+ let k = key.charCodeAt(i) & 65535;
1634
+ k = imul(k, c1);
1635
+ k = k << 15 | k >>> 17;
1636
+ k = imul(k, c2);
1637
+ h ^= k;
1637
1638
  }
1638
1639
  h ^= key.length;
1639
1640
  h ^= h >>> 16;
@@ -1644,8 +1645,9 @@ function hashStr(key, seed = 0) {
1644
1645
  return h >>> 0;
1645
1646
  }
1646
1647
  function hashNumber(num, seed = 0) {
1648
+ let h = num < 0 ? seed ^ 2147483648 : seed;
1647
1649
  num = abs(num);
1648
- let h = seed;
1650
+ const origNum = num;
1649
1651
  const c1 = 3432918353;
1650
1652
  const c2 = 461845907;
1651
1653
  while (num >= 4294967295) {
@@ -1665,7 +1667,7 @@ function hashNumber(num, seed = 0) {
1665
1667
  k = imul(k, c2);
1666
1668
  h ^= k;
1667
1669
  }
1668
- const numBytes = num === 0 ? 1 : floor(log(num) / log(256)) + 1;
1670
+ const numBytes = origNum === 0 ? 1 : floor(log(origNum) / log(256)) + 1;
1669
1671
  h ^= numBytes;
1670
1672
  h ^= h >>> 16;
1671
1673
  h = imul(h, 2246822507);
@@ -1674,12 +1676,12 @@ function hashNumber(num, seed = 0) {
1674
1676
  h ^= h >>> 16;
1675
1677
  return h >>> 0;
1676
1678
  }
1677
- function hashArray(arr) {
1678
- let h = 7;
1679
+ function hashArray(arr, seen) {
1680
+ let h = ARRAY;
1679
1681
  const c1 = 3432918353;
1680
1682
  const c2 = 461845907;
1681
1683
  for (const item of arr) {
1682
- let k = hashValue(item);
1684
+ let k = hashValue(item, seen);
1683
1685
  k = imul(k, c1);
1684
1686
  k = k << 15 | k >>> 17;
1685
1687
  k = imul(k, c2);
@@ -1695,36 +1697,36 @@ function hashArray(arr) {
1695
1697
  h ^= h >>> 16;
1696
1698
  return h >>> 0;
1697
1699
  }
1698
- function hashObject(obj) {
1700
+ function hashObject(obj, seen) {
1699
1701
  let sum = OBJECT;
1700
1702
  const keys = Object.keys(obj);
1701
1703
  for (const key of keys) {
1702
- sum += hashValue(key) ^ hashValue(obj[key]);
1704
+ sum += imul(hashValue(key, seen), 2654435769) ^ hashValue(obj[key], seen);
1703
1705
  }
1704
1706
  return sum >>> 0;
1705
1707
  }
1706
- function hashSet(set) {
1707
- let sum = 13;
1708
+ function hashSet(set, seen) {
1709
+ let sum = SET;
1708
1710
  for (const value of set) {
1709
- sum += hashValue(value);
1711
+ sum += hashValue(value, seen);
1710
1712
  }
1711
1713
  return sum >>> 0;
1712
1714
  }
1713
- function hashMap(map) {
1714
- let sum = 12;
1715
+ function hashMap(map, seen) {
1716
+ let sum = MAP;
1715
1717
  for (const [key, value] of map) {
1716
- sum += hashValue(key) ^ hashValue(value);
1718
+ sum += imul(hashValue(key, seen), 2654435769) ^ hashValue(value, seen);
1717
1719
  }
1718
1720
  return sum >>> 0;
1719
1721
  }
1720
- function hashDate(date) {
1722
+ function hashDate(date, _seen) {
1721
1723
  return hashNumber(
1722
1724
  date.getTime(),
1723
1725
  14
1724
1726
  /* DATE */
1725
1727
  );
1726
1728
  }
1727
- function hashRegExp(regexp) {
1729
+ function hashRegExp(regexp, _seen) {
1728
1730
  const h = hashStr(
1729
1731
  regexp.source + regexp.flags,
1730
1732
  15
@@ -1752,7 +1754,7 @@ const FALSE = hashStr(
1752
1754
  3
1753
1755
  /* FALSE */
1754
1756
  );
1755
- hashStr(
1757
+ const ARRAY = hashStr(
1756
1758
  "array",
1757
1759
  7
1758
1760
  /* ARRAY */
@@ -1762,6 +1764,16 @@ const OBJECT = hashStr(
1762
1764
  8
1763
1765
  /* OBJECT */
1764
1766
  );
1767
+ const SET = hashStr(
1768
+ "set",
1769
+ 13
1770
+ /* SET */
1771
+ );
1772
+ const MAP = hashStr(
1773
+ "map",
1774
+ 12
1775
+ /* MAP */
1776
+ );
1765
1777
  const getObjectProto = Object.getPrototypeOf;
1766
1778
  const PROTO_TO_HASH = /* @__PURE__ */ new Map([
1767
1779
  [Object.prototype, hashObject],
@@ -1772,7 +1784,7 @@ const PROTO_TO_HASH = /* @__PURE__ */ new Map([
1772
1784
  [RegExp.prototype, hashRegExp]
1773
1785
  ]);
1774
1786
  const registerCustomHash = (ctor, hashFn) => {
1775
- PROTO_TO_HASH.set(ctor.prototype, hashFn);
1787
+ PROTO_TO_HASH.set(ctor.prototype, (obj, _seen) => hashFn(obj));
1776
1788
  };
1777
1789
  function hashValue(node, seen = []) {
1778
1790
  switch (typeof node) {
@@ -1813,7 +1825,7 @@ function hashValue(node, seen = []) {
1813
1825
  const hashFn = PROTO_TO_HASH.get(getObjectProto(node));
1814
1826
  if (hashFn) {
1815
1827
  seen.push(node);
1816
- const hash = hashFn(node);
1828
+ const hash = hashFn(node, seen);
1817
1829
  seen.pop();
1818
1830
  return hash;
1819
1831
  }
@@ -1843,9 +1855,16 @@ function getObjectHash(obj) {
1843
1855
  }
1844
1856
  return id;
1845
1857
  }
1846
- const EMPTY_ARRAY_HASH = hashArray([]);
1858
+ const EMPTY_ARRAY_HASH = hashArray([], []);
1847
1859
  function hashReactiveFn(fn, args) {
1848
- return getObjectHash(fn) ^ (args.length > 0 ? hashArray(args) : EMPTY_ARRAY_HASH);
1860
+ const argsHash = args.length > 0 ? hashArray(args, []) : EMPTY_ARRAY_HASH;
1861
+ let k = imul(argsHash, 3432918353);
1862
+ k = k << 15 | k >>> 17;
1863
+ k = imul(k, 461845907);
1864
+ let h = getObjectHash(fn);
1865
+ h ^= k;
1866
+ h = h << 13 | h >>> 19;
1867
+ return imul(h, 5) + 3864292196 >>> 0;
1849
1868
  }
1850
1869
  const objectToIdMap = /* @__PURE__ */ new WeakMap();
1851
1870
  let nextId = 1;
@@ -1992,22 +2011,33 @@ class ReactiveSignal {
1992
2011
  get listeners() {
1993
2012
  return this._listeners ?? (this._listeners = {
1994
2013
  updatedAt: 0,
1995
- current: /* @__PURE__ */ new Set(),
2014
+ current: /* @__PURE__ */ new Map(),
1996
2015
  cachedBoundAdd: this.addListener.bind(this)
1997
2016
  });
1998
2017
  }
1999
2018
  get value() {
2000
2019
  return getSignal(this);
2001
2020
  }
2002
- addListener(listener) {
2021
+ addListener(listener, opts) {
2003
2022
  const { current } = this.listeners;
2004
2023
  if (!current.has(listener)) {
2024
+ let effective = listener;
2025
+ if (opts?.skipInitial) {
2026
+ let initial = true;
2027
+ effective = () => {
2028
+ if (initial) {
2029
+ initial = false;
2030
+ return;
2031
+ }
2032
+ listener();
2033
+ };
2034
+ }
2005
2035
  if (!this._isListener) {
2006
2036
  watchSignal(this, this._isSuspended);
2007
2037
  this.flags |= 16;
2008
2038
  }
2009
2039
  schedulePull(this);
2010
- current.add(listener);
2040
+ current.set(listener, effective);
2011
2041
  }
2012
2042
  return () => {
2013
2043
  if (current.has(listener)) {
@@ -2016,6 +2046,7 @@ class ReactiveSignal {
2016
2046
  cancelPull(this);
2017
2047
  unwatchSignal(this, this._isSuspended);
2018
2048
  this.flags &= -17;
2049
+ this.listeners.updatedAt = 0;
2019
2050
  }
2020
2051
  }
2021
2052
  };
@@ -2063,7 +2094,7 @@ const runListeners = (signal2) => {
2063
2094
  return;
2064
2095
  }
2065
2096
  const { current } = listeners;
2066
- for (const listener of current) {
2097
+ for (const listener of current.values()) {
2067
2098
  listener();
2068
2099
  }
2069
2100
  };
@@ -2260,4 +2291,4 @@ export {
2260
2291
  withContexts as y,
2261
2292
  setGlobalContexts as z
2262
2293
  };
2263
- //# sourceMappingURL=debug-qm_Izoi_.js.map
2294
+ //# sourceMappingURL=debug-BfudYKc4.js.map