valdres 1.0.0-beta.15 → 1.0.0-beta.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -749,7 +749,7 @@ var evaluateSelector = (selector, data, initializedAtomsSet, circularDependencyS
749
749
  const prevCtx = latestEvalContext.get(selector);
750
750
  if (prevCtx)
751
751
  prevCtx.revoked = true;
752
- const evalCtx = { revoked: false };
752
+ const evalCtx = { revoked: false, preserveSignalOnRevoke: false };
753
753
  latestEvalContext.set(selector, evalCtx);
754
754
  if (circularDependencySet.has(selector)) {
755
755
  throw new SelectorCircularDependencyError;
@@ -774,7 +774,9 @@ var evaluateSelector = (selector, data, initializedAtomsSet, circularDependencyS
774
774
  if (!controller) {
775
775
  controller = new AbortController;
776
776
  if (myEvalCtx.revoked) {
777
- controller.abort();
777
+ if (!myEvalCtx.preserveSignalOnRevoke) {
778
+ controller.abort();
779
+ }
778
780
  } else {
779
781
  data.abortControllers.set(selector, controller);
780
782
  }
@@ -878,7 +880,10 @@ var handleSelectorResult = (value, selector, data) => {
878
880
  if (value instanceof SuspendAndWaitForResolveError) {
879
881
  data.abortControllers.delete(selector);
880
882
  const promise = value.promise;
883
+ const evaluationContext = data.latestEvalContext.get(selector);
881
884
  promise.then(() => {
885
+ if (!evaluationContext || evaluationContext.revoked || data.latestEvalContext.get(selector) !== evaluationContext)
886
+ return;
882
887
  if (!data.stateDependencies.has(selector))
883
888
  return;
884
889
  if (data.values.has(selector) && data.values.get(selector) !== promise)
@@ -896,7 +901,12 @@ var handleSelectorResult = (value, selector, data) => {
896
901
  });
897
902
  return promise;
898
903
  } else if (isPromiseLike(value)) {
904
+ const evaluationContext = data.latestEvalContext.get(selector);
899
905
  value.then((resolved) => {
906
+ if (!evaluationContext || evaluationContext.revoked || data.latestEvalContext.get(selector) !== evaluationContext) {
907
+ pendingAsyncDeps.delete(value);
908
+ return;
909
+ }
900
910
  if (!data.stateDependencies.has(selector)) {
901
911
  pendingAsyncDeps.delete(value);
902
912
  return;
@@ -2131,6 +2141,13 @@ var cleanupOrphanedDeps = (state, data) => {
2131
2141
  const dependents = data.stateDependents.get(current);
2132
2142
  const deps = data.stateDependencies.get(current);
2133
2143
  if (deps) {
2144
+ const selector = current;
2145
+ const evaluationContext = data.latestEvalContext.get(selector);
2146
+ if (evaluationContext) {
2147
+ evaluationContext.preserveSignalOnRevoke = true;
2148
+ evaluationContext.revoked = true;
2149
+ }
2150
+ data.latestEvalContext.delete(selector);
2134
2151
  for (const dep of deps) {
2135
2152
  data.stateDependents.get(dep)?.delete(current);
2136
2153
  }
@@ -4220,9 +4237,9 @@ var isFamilySelector = (state) => isFamilyState(state) && isSelector(state);
4220
4237
  // src/index.ts
4221
4238
  var slot = valdresGlobal();
4222
4239
  if (slot.version) {
4223
- throw new Error(`Error! An instance of valdres is already loaded. Loaded: ${slot.version}. Attempted to load: ${"1.0.0-beta.15"}`);
4240
+ throw new Error(`Error! An instance of valdres is already loaded. Loaded: ${slot.version}. Attempted to load: ${"1.0.0-beta.16"}`);
4224
4241
  } else {
4225
- slot.version = "1.0.0-beta.15";
4242
+ slot.version = "1.0.0-beta.16";
4226
4243
  }
4227
4244
  export {
4228
4245
  store,
@@ -120,6 +120,7 @@ export type StoreData = {
120
120
  * registration from store1's in-flight async eval. */
121
121
  latestEvalContext: WeakMap<Selector, {
122
122
  revoked: boolean;
123
+ preserveSignalOnRevoke: boolean;
123
124
  }>;
124
125
  /** Per-atom timestamp of the last value write, used for lazy
125
126
  * maxAge revalidation when the atom is unmounted (no active timer
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "valdres",
3
3
  "description": "Fast atom-based state management for JavaScript. Inspired by Recoil and Jotai.",
4
- "version": "1.0.0-beta.15",
4
+ "version": "1.0.0-beta.16",
5
5
  "license": "MIT",
6
6
  "author": {
7
7
  "name": "Eigil Sagafos"