@effect-app/vue 4.0.0-beta.274 → 4.0.0-beta.276

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/query.js CHANGED
@@ -12,8 +12,29 @@ import * as Exit from "effect/Exit";
12
12
  import * as Stream from "effect/Stream";
13
13
  import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
14
14
  import * as Atom from "effect/unstable/reactivity/Atom";
15
- import { computed, onBeforeUnmount, onMounted, ref, toValue } from "vue";
15
+ import { computed, effectScope, onBeforeUnmount, onMounted, onScopeDispose, ref, toValue } from "vue";
16
16
  import { awaitAtomResult, buildQueryFamily, buildStreamQueryFamily, disabledQueryAtom, isStaleResult, staleTimeMsOf, withQueryOptions } from "./atomQuery.js";
17
+ const useScopedSuspenseSetup = (setup) => {
18
+ const scope = effectScope();
19
+ const controller = new AbortController();
20
+ const value = scope.run(setup);
21
+ if (value === undefined) {
22
+ throw new Error("Internal Error: atom suspense setup scope did not initialize");
23
+ }
24
+ const isMounted = ref(true);
25
+ let stopped = false;
26
+ const stop = () => {
27
+ if (stopped)
28
+ return;
29
+ stopped = true;
30
+ isMounted.value = false;
31
+ controller.abort();
32
+ scope.stop();
33
+ };
34
+ onBeforeUnmount(stop);
35
+ onScopeDispose(stop);
36
+ return [value, isMounted, controller.signal];
37
+ };
17
38
  const queryFamilyCacheKey = (q) => `${makeQueryKey(q).join("/")}:${q.queryKeyProjectionHash ?? ""}`;
18
39
  // One atom family per request shape, keyed by the stable query key + projection hash (not the
19
40
  // handler object — `clientFor` returns a fresh proxy per call, so the object isn't shareable).
@@ -103,17 +124,16 @@ export const useAtomQuery = (atom) => {
103
124
  };
104
125
  };
105
126
  export const useAtomSuspense = (atom) => {
106
- const view = useAtomQuery(atom);
107
- const data = computed(() => {
108
- const latest = view.data.value;
109
- if (latest === undefined) {
110
- throw new Error("Internal Error: atom suspense resolved without a latest value");
111
- }
112
- return latest;
113
- });
114
- const isMounted = ref(true);
115
- onBeforeUnmount(() => {
116
- isMounted.value = false;
127
+ const [{ view, data }, isMounted, signal] = useScopedSuspenseSetup(() => {
128
+ const view = useAtomQuery(atom);
129
+ const data = computed(() => {
130
+ const latest = view.data.value;
131
+ if (latest === undefined) {
132
+ throw new Error("Internal Error: atom suspense resolved without a latest value");
133
+ }
134
+ return latest;
135
+ });
136
+ return { view, data };
117
137
  });
118
138
  const eff = Effect.gen(function* () {
119
139
  const exit = yield* view.awaitResult().pipe(Effect.exit);
@@ -141,7 +161,7 @@ export const useAtomSuspense = (atom) => {
141
161
  data
142
162
  });
143
163
  });
144
- return Effect.runPromise(eff);
164
+ return Effect.runPromise(eff, { signal });
145
165
  };
146
166
  export const useAtomStreamQuery = (atom) => {
147
167
  const registry = injectRegistry();
@@ -352,4 +372,4 @@ export const useUpdateQuery = () => {
352
372
  const f = (query, input, updater) => activeQueryCacheUpdater.update(registry, query, input, updater);
353
373
  return f;
354
374
  };
355
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELHNEQUFzRDtBQUN0RCx3REFBd0Q7QUFDeEQsNERBQTREO0FBQzVELCtEQUErRDtBQUMvRCxPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQy9ELE9BQU8sS0FBSyxLQUFLLE1BQU0sa0JBQWtCLENBQUE7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLG1CQUFtQixDQUFBO0FBSTFELE9BQU8sS0FBSyxNQUFNLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQTtBQUUzQyxPQUFPLEtBQUssSUFBSSxNQUFNLGFBQWEsQ0FBQTtBQUNuQyxPQUFPLEtBQUssTUFBTSxNQUFNLGVBQWUsQ0FBQTtBQUN2QyxPQUFPLEtBQUssV0FBVyxNQUFNLHdDQUF3QyxDQUFBO0FBQ3JFLE9BQU8sS0FBSyxJQUFJLE1BQU0saUNBQWlDLENBQUE7QUFDdkQsT0FBTyxFQUFFLFFBQVEsRUFBMkMsZUFBZSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFvQixNQUFNLEtBQUssQ0FBQTtBQUNuSSxPQUFPLEVBQWlELGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFtRTVNLE1BQU0sbUJBQW1CLEdBQUcsQ0FDMUIsQ0FBeUcsRUFDekcsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsc0JBQXNCLElBQUksRUFBRSxFQUFFLENBQUE7QUFFckUsOEZBQThGO0FBQzlGLCtGQUErRjtBQUMvRiw2RkFBNkY7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LENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUN4QyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUMxQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNoRCxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUNyRyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDaEMsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFBO0lBQ3RCLENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUN0SCxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDaEMsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFBO0lBQ3RCLENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUE7SUFFbEQsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtRQUM5RCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUE7UUFDMUMsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDLEVBQUUsRUFBUyxDQUFDLENBQUE7SUFDYixPQUFPLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUE7QUFDMUQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxHQUFHLEVBQUU7SUFDakMsTUFBTSxRQUFRLEdBQUcsY0FBYyxFQUFFLENBQUE7SUFFakMsTUFBTSxDQUFDLEdBTUgsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQzlGLE9BQU8sQ0FBQyxDQUFBO0FBQ1YsQ0FBQyxDQUFBIn0=
375
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELHNEQUFzRDtBQUN0RCx3REFBd0Q7QUFDeEQsNERBQTREO0FBQzVELCtEQUErRDtBQUMvRCxPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQy9ELE9BQU8sS0FBSyxLQUFLLE1BQU0sa0JBQWtCLENBQUE7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLG1CQUFtQixDQUFBO0FBSTFELE9BQU8sS0FBSyxNQUFNLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQTtBQUUzQyxPQUFPLEtBQUssSUFBSSxNQUFNLGFBQWEsQ0FBQTtBQUNuQyxPQUFPLEtBQUssTUFBTSxNQUFNLGVBQWUsQ0FBQTtBQUN2QyxPQUFPLEtBQUssV0FBVyxNQUFNLHdDQUF3QyxDQUFBO0FBQ3JFLE9BQU8sS0FBSyxJQUFJLE1BQU0saUNBQWlDLENBQUE7QUFDdkQsT0FBTyxFQUFFLFFBQVEsRUFBb0IsV0FBVyxFQUF5QixlQUFlLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFvQixNQUFNLEtBQUssQ0FBQTtBQUNoSyxPQUFPLEVBQWlELGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUF1QjVNLE1BQU0sc0JBQXNCLEdBQUcsQ0FBSSxLQUFjLEVBQUUsRUFBRTtJQUNuRCxNQUFNLEtBQUssR0FBRyxXQUFXLEVBQUUsQ0FBQTtJQUMzQixNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFBO0lBQ3hDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMs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
@@ -112,6 +112,22 @@ const viewed = Atom.swr({ staleTime, revalidateOnFocus, focusSignal })(
112
112
 
113
113
  TTL is the awkward option. If TTL is part of the base atom, it should be a client/default policy, not the first observer's option. For old APIs, keep accepting `gcTime`, but normalize it into a base-atom policy that cannot be captured accidentally by the first observer. For new APIs, prefer an atom-native `idleTTL` or `timeToLive` name.
114
114
 
115
+ ## TanStack parity: observers, TTL, and cancellation
116
+
117
+ Observer cleanup and cache lifetime are separate concerns:
118
+
119
+ - Vue observers are registered through `@effect/atom-vue`'s `useAtomValue`, which uses a Vue `watchEffect` cleanup around `registry.subscribe`. Non-suspense component unmounts therefore remove observer subscriptions through normal Vue scope disposal.
120
+ - Suspense helpers still load through native query atoms. The `Promise` returned by `.suspense()` / `.suspenseNew()` is only the Vue Suspense boundary that waits for `AtomRegistry.getResult`. Suspense setup runs in an explicit child `effectScope`; unmount stops that scope, removes the observer subscription, and aborts the waiting Effect so the Suspense Promise does not remain pending after the component is gone.
121
+ - Observer-specific wrappers (`select`, SWR, focus revalidation, polling, structural sharing) must not get their own idle TTL. Otherwise a wrapper can keep source atoms observed after the component unmounts. TTL belongs to the canonical handler+input query atom.
122
+ - The canonical query atom keeps its configured idle TTL after the last observer is gone. This preserves cached data and lets invalidation still reach cached-but-unmounted queries during the idle window.
123
+
124
+ Current difference from TanStack Query:
125
+
126
+ - TanStack creates an `AbortSignal` for each fetch. When the last observer is removed, it cancels the active retryer only if the query function consumed the signal; otherwise it cancels retries and lets the in-flight request finish so the result can populate cache.
127
+ - Atom query currently does not cancel the canonical query atom's in-flight Effect merely because the last observer unmounted, because the canonical atom node can remain alive for `idleTTL`.
128
+ - If canonical fetch cancellation is added later, it must match TanStack's observable state semantics: cancellation is control flow, not query data. Interrupting an in-flight fetch must not store an interrupt cause as the final `AsyncResult`; it should revert to the previous settled state, or to initial/idle when there is no previous result.
129
+ - The desired parity target is: last observer gone -> remove observer subscriptions immediately; if no observers remain, interrupt the active fetch without recording an interrupt failure; keep the previous cached result until `idleTTL` expires.
130
+
115
131
  ## Option names
116
132
 
117
133
  Use atom-native names on the new APIs. Keep old option names on old APIs:
package/package.json CHANGED
@@ -1,17 +1,16 @@
1
1
  {
2
2
  "name": "@effect-app/vue",
3
- "version": "4.0.0-beta.274",
3
+ "version": "4.0.0-beta.276",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "homepage": "https://github.com/effect-ts-app/libs/tree/main/packages/vue",
7
7
  "dependencies": {
8
8
  "@formatjs/intl": "^4.1.12",
9
- "@tanstack/query-core": "5.96.2",
10
9
  "@tanstack/vue-query": "5.96.2",
11
10
  "@vueuse/core": "^14.3.0",
12
11
  "change-case": "^5.4.4",
13
12
  "query-string": "^9.4.0",
14
- "effect-app": "4.0.0-beta.274"
13
+ "effect-app": "4.0.0-beta.276"
15
14
  },
16
15
  "peerDependencies": {
17
16
  "@effect/atom-vue": "^4.0.0-beta.84",
@@ -26,7 +25,6 @@
26
25
  "@types/node": "25.9.1",
27
26
  "@vitejs/plugin-vue": "^6.0.7",
28
27
  "intl-messageformat": "^11.2.7",
29
- "json5": "^2.2.3",
30
28
  "typescript": "~6.0.3",
31
29
  "vite": "^8.0.15",
32
30
  "vitest": "^4.1.7"
package/src/atomQuery.ts CHANGED
@@ -206,6 +206,28 @@ export interface AtomQueryOptions {
206
206
 
207
207
  const defaults = { staleTime: Duration.seconds(5), gcTime: Duration.minutes(5) }
208
208
 
209
+ export interface AtomQueryMetadata {
210
+ readonly staleTimeMs: number
211
+ }
212
+
213
+ const atomQueryMetadata = new WeakMap<Atom.Atom<AsyncResult.AsyncResult<any, any>>, AtomQueryMetadata>()
214
+
215
+ const setAtomQueryMetadata = <A, E>(
216
+ atom: Atom.Atom<AsyncResult.AsyncResult<A, E>>,
217
+ opts: AtomQueryOptions = {}
218
+ ) => {
219
+ const staleTimeMs = staleTimeMsOf(opts)
220
+ const previous = atomQueryMetadata.get(atom)
221
+ atomQueryMetadata.set(atom, {
222
+ staleTimeMs: previous === undefined ? staleTimeMs : Math.min(previous.staleTimeMs, staleTimeMs)
223
+ })
224
+ return atom
225
+ }
226
+
227
+ export const getAtomQueryMetadata = <A, E>(
228
+ atom: Atom.Atom<AsyncResult.AsyncResult<A, E>>
229
+ ): AtomQueryMetadata | undefined => atomQueryMetadata.get(atom)
230
+
209
231
  /** Exported so the vue hook can do refetch-on-mount-per-observer with the same rule as swr. */
210
232
  export const isStaleResult = (r: AsyncResult.AsyncResult<any, any>, staleTimeMs: number): boolean => {
211
233
  if (r.waiting) return false
@@ -225,10 +247,8 @@ export const withQueryOptions = <A, E>(
225
247
  self: Atom.Atom<AsyncResult.AsyncResult<A, E>>,
226
248
  opts: AtomQueryOptions = {}
227
249
  ): Atom.Atom<AsyncResult.AsyncResult<A, E>> => {
250
+ setAtomQueryMetadata(self, opts)
228
251
  const staleTime: Duration.Input = opts.staleTime ?? defaults.staleTime
229
- const gcTime = opts.gcTime === "infinity"
230
- ? "infinity" as const
231
- : Duration.fromInputUnsafe(opts.gcTime ?? defaults.gcTime)
232
252
  let atom = self
233
253
  const revalidateOnFocus = opts.revalidateOnFocus ?? true
234
254
  atom = Atom.swr({
@@ -238,7 +258,7 @@ export const withQueryOptions = <A, E>(
238
258
  })(atom)
239
259
  if (opts.refetchInterval) atom = Atom.withRefresh(Duration.millis(opts.refetchInterval))(atom)
240
260
  if (opts.structuralSharing ?? true) atom = structuralShare(atom)
241
- return gcTime === "infinity" ? Atom.keepAlive(atom) : Atom.setIdleTTL(atom, gcTime)
261
+ return atom
242
262
  }
243
263
 
244
264
  /** Constant atom for disabled / `mode:"optional"`-None queries: stays Initial, never fetches. */
@@ -321,7 +341,7 @@ export const buildQueryFamily = <I, A, E>(
321
341
  // gcTime LAST so the whole chain (incl. the registration + tracking) stays alive through the
322
342
  // idle window, letting invalidation reach a cached-but-unmounted query.
323
343
  atom = Atom.setIdleTTL(atom, defaults.gcTime)
324
- return Atom.withLabel(`query:${self.id}`)(atom)
344
+ return setAtomQueryMetadata(Atom.withLabel(`query:${self.id}`)(atom))
325
345
  })
326
346
  }
327
347
 
@@ -350,7 +370,7 @@ export const buildStreamQueryFamily = <I, A, E>(
350
370
  atom = rt.factory.withReactivity(reactivityKeys)(atom)
351
371
  atom = trackWritableByKeys(reactivityKeys)(atom)
352
372
  atom = Atom.setIdleTTL(atom, defaults.gcTime)
353
- return Atom.withLabel(`stream-query:${self.id}`)(atom)
373
+ return setAtomQueryMetadata(Atom.withLabel(`stream-query:${self.id}`)(atom))
354
374
  })
355
375
  }
356
376
 
package/src/makeClient.ts CHANGED
@@ -16,7 +16,7 @@ import type * as Stream from "effect/Stream"
16
16
  import * as Struct from "effect/Struct"
17
17
  import type * as AsyncResult from "effect/unstable/reactivity/AsyncResult"
18
18
  import * as Reactivity from "effect/unstable/reactivity/Reactivity"
19
- import { computed, type ComputedRef, onBeforeUnmount, ref, type WatchSource } from "vue"
19
+ import { computed, type ComputedRef, effectScope, onBeforeUnmount, onScopeDispose, ref, type WatchSource } from "vue"
20
20
  import { type AtomClientRuntime, invalidateAndAwait, makeAtomClientRuntime } from "./atomQuery.ts"
21
21
  import { type Commander, CommanderStatic, type Progress } from "./commander.ts"
22
22
  import { makeTanstackQuery, makeTanstackQueryCacheUpdater, makeTanstackQueryClient, makeTanstackQueryInvalidator } from "./internal/tanstackQuery.ts"
@@ -29,6 +29,29 @@ import { type Toast } from "./toast.ts"
29
29
 
30
30
  export type { Progress }
31
31
 
32
+ const useScopedSuspenseSetup = <A>(setup: () => A) => {
33
+ const scope = effectScope()
34
+ const controller = new AbortController()
35
+ const value = scope.run(setup)
36
+ if (value === undefined) {
37
+ throw new Error("Internal Error: suspense setup scope did not initialize")
38
+ }
39
+
40
+ const isMounted = ref(true)
41
+ let stopped = false
42
+ const stop = () => {
43
+ if (stopped) return
44
+ stopped = true
45
+ isMounted.value = false
46
+ controller.abort()
47
+ scope.stop()
48
+ }
49
+ onBeforeUnmount(stop)
50
+ onScopeDispose(stop)
51
+
52
+ return [value, isMounted, controller.signal] as const
53
+ }
54
+
32
55
  // TODO: optimize - work from encoded shape directly
33
56
  const projectHandler = <
34
57
  I,
@@ -491,18 +514,20 @@ export class QueryImpl<R> {
491
514
  argOrOptions: I | WatchSource<I>,
492
515
  options?: CustomUndefinedInitialQueryOptions<A, CauseException<E>, TData>
493
516
  ) => {
494
- const [resultRef, latestRef, fetch, uqrt] = q<TData>(argOrOptions, options)
495
- const latestDefinedRef = computed<TData>(() => {
496
- const latest = latestRef.value
497
- if (latest === undefined) {
498
- throw new Error("Internal Error: suspense resolved without a latest value")
499
- }
500
- return latest
501
- })
502
-
503
- const isMounted = ref(true)
504
- onBeforeUnmount(() => {
505
- isMounted.value = false
517
+ const [
518
+ [resultRef, latestDefinedRef, fetch, uqrt],
519
+ isMounted,
520
+ signal
521
+ ] = useScopedSuspenseSetup(() => {
522
+ const [resultRef, latestRef, fetch, uqrt] = q<TData>(argOrOptions, options)
523
+ const latestDefinedRef = computed<TData>(() => {
524
+ const latest = latestRef.value
525
+ if (latest === undefined) {
526
+ throw new Error("Internal Error: suspense resolved without a latest value")
527
+ }
528
+ return latest
529
+ })
530
+ return [resultRef, latestDefinedRef, fetch, uqrt] as const
506
531
  })
507
532
 
508
533
  // @effect-diagnostics effect/missingEffectError:off
@@ -518,7 +543,7 @@ export class QueryImpl<R> {
518
543
  return [resultRef, latestDefinedRef, fetch, uqrt] as const
519
544
  })
520
545
 
521
- return runPromise(eff)
546
+ return runPromise(eff, { signal })
522
547
  }
523
548
  }
524
549
 
@@ -546,18 +571,16 @@ export class QueryImpl<R> {
546
571
  argOrOptions: I | WatchSource<I>,
547
572
  options?: AtomQueryNewOptions<A, TData>
548
573
  ) => {
549
- const view = q<TData>(argOrOptions, options)
550
- const data = computed<TData>(() => {
551
- const latest = view.data.value
552
- if (latest === undefined) {
553
- throw new Error("Internal Error: suspenseNew resolved without a latest value")
554
- }
555
- return latest
556
- })
557
-
558
- const isMounted = ref(true)
559
- onBeforeUnmount(() => {
560
- isMounted.value = false
574
+ const [{ view, data }, isMounted, signal] = useScopedSuspenseSetup(() => {
575
+ const view = q<TData>(argOrOptions, options)
576
+ const data = computed<TData>(() => {
577
+ const latest = view.data.value
578
+ if (latest === undefined) {
579
+ throw new Error("Internal Error: suspenseNew resolved without a latest value")
580
+ }
581
+ return latest
582
+ })
583
+ return { view, data }
561
584
  })
562
585
 
563
586
  // @effect-diagnostics effect/missingEffectError:off
@@ -592,7 +615,7 @@ export class QueryImpl<R> {
592
615
  )
593
616
  })
594
617
 
595
- return runPromise(eff)
618
+ return runPromise(eff, { signal })
596
619
  }
597
620
  }
598
621
  }
package/src/query.ts CHANGED
@@ -16,7 +16,7 @@ import * as Exit from "effect/Exit"
16
16
  import * as Stream from "effect/Stream"
17
17
  import * as AsyncResult from "effect/unstable/reactivity/AsyncResult"
18
18
  import * as Atom from "effect/unstable/reactivity/Atom"
19
- import { computed, type ComputedRef, type MaybeRefOrGetter, onBeforeUnmount, onMounted, ref, toValue, type WatchSource } from "vue"
19
+ import { computed, type ComputedRef, effectScope, type MaybeRefOrGetter, onBeforeUnmount, onMounted, onScopeDispose, ref, toValue, type WatchSource } from "vue"
20
20
  import { type AtomClientRuntime, type AtomQueryOptions, awaitAtomResult, buildQueryFamily, buildStreamQueryFamily, disabledQueryAtom, isStaleResult, staleTimeMsOf, withQueryOptions } from "./atomQuery.ts"
21
21
 
22
22
  // --- minimal local types (replacing the former @tanstack/vue-query type imports) ---
@@ -40,6 +40,29 @@ export interface QueryView<A, E> extends QueryHandle<A, E> {
40
40
  readonly data: ComputedRef<A | undefined>
41
41
  }
42
42
 
43
+ const useScopedSuspenseSetup = <A>(setup: () => A) => {
44
+ const scope = effectScope()
45
+ const controller = new AbortController()
46
+ const value = scope.run(setup)
47
+ if (value === undefined) {
48
+ throw new Error("Internal Error: atom suspense setup scope did not initialize")
49
+ }
50
+
51
+ const isMounted = ref(true)
52
+ let stopped = false
53
+ const stop = () => {
54
+ if (stopped) return
55
+ stopped = true
56
+ isMounted.value = false
57
+ controller.abort()
58
+ scope.stop()
59
+ }
60
+ onBeforeUnmount(stop)
61
+ onScopeDispose(stop)
62
+
63
+ return [value, isMounted, controller.signal] as const
64
+ }
65
+
43
66
  export interface QueryCacheUpdater {
44
67
  readonly update: <I, A, E, R, Request extends Req, Name extends string>(
45
68
  registry: ReturnType<typeof injectRegistry>,
@@ -290,18 +313,16 @@ export const useAtomQuery = <A, E>(
290
313
  export const useAtomSuspense = <A, E>(
291
314
  atom: () => Atom.Atom<AsyncResult.AsyncResult<A, E>>
292
315
  ): Promise<SuspenseQueryView<A, E>> => {
293
- const view = useAtomQuery(atom)
294
- const data = computed<A>(() => {
295
- const latest = view.data.value
296
- if (latest === undefined) {
297
- throw new Error("Internal Error: atom suspense resolved without a latest value")
298
- }
299
- return latest
300
- })
301
-
302
- const isMounted = ref(true)
303
- onBeforeUnmount(() => {
304
- isMounted.value = false
316
+ const [{ view, data }, isMounted, signal] = useScopedSuspenseSetup(() => {
317
+ const view = useAtomQuery(atom)
318
+ const data = computed<A>(() => {
319
+ const latest = view.data.value
320
+ if (latest === undefined) {
321
+ throw new Error("Internal Error: atom suspense resolved without a latest value")
322
+ }
323
+ return latest
324
+ })
325
+ return { view, data }
305
326
  })
306
327
 
307
328
  const eff = Effect.gen(function*() {
@@ -335,7 +356,7 @@ export const useAtomSuspense = <A, E>(
335
356
  )
336
357
  })
337
358
 
338
- return Effect.runPromise(eff)
359
+ return Effect.runPromise(eff, { signal })
339
360
  }
340
361
 
341
362
  export type StreamQueryPullValue<A> = {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patchableQueryAtom.test.d.ts","sourceRoot":"","sources":["../patchableQueryAtom.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryOptions.test.d.ts","sourceRoot":"","sources":["../queryOptions.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retrySchedule.test.d.ts","sourceRoot":"","sources":["../retrySchedule.test.ts"],"names":[],"mappings":""}
@@ -1,8 +1,14 @@
1
+ import { defaultRegistry, registryKey } from "@effect/atom-vue"
1
2
  import { Effect, Option } from "effect-app"
2
3
  import * as AsyncResult from "effect/unstable/reactivity/AsyncResult"
3
- import { computed, ref } from "vue"
4
+ import * as Atom from "effect/unstable/reactivity/Atom"
5
+ import { computed, createApp, nextTick, ref } from "vue"
6
+ import { withQueryOptions } from "../src/atomQuery.js"
7
+ import { useAtomQuery, useAtomSuspense } from "../src/query.js"
4
8
  import { awaitResolvedSuspenseResult } from "../src/suspense.js"
5
9
 
10
+ const listenerCount = (atom: Atom.Atom<unknown>) => defaultRegistry.getNodes().get(atom)?.listeners.size ?? 0
11
+
6
12
  it("waits for the query result ref after suspense resolves", async () => {
7
13
  const result = ref<AsyncResult.AsyncResult<number, never>>(AsyncResult.initial(true))
8
14
  const promise = Effect.runPromise(awaitResolvedSuspenseResult(computed(() => result.value)))
@@ -18,3 +24,137 @@ it("keeps unresolved query results initial", async () => {
18
24
 
19
25
  expect(AsyncResult.isInitial(settled)).toBe(true)
20
26
  })
27
+
28
+ it("stops atom suspense subscriptions when the setup scope is disposed", async () => {
29
+ defaultRegistry.reset()
30
+ const atom = Atom.make(Effect.succeed(123))
31
+ let promise: ReturnType<typeof useAtomSuspense<number, never>> | undefined
32
+ const host = document.createElement("div")
33
+ const app = createApp({
34
+ setup() {
35
+ promise = useAtomSuspense(() => atom)
36
+ return () => null
37
+ }
38
+ })
39
+ app.provide(registryKey, defaultRegistry)
40
+ app.mount(host)
41
+
42
+ if (promise === undefined) {
43
+ throw new Error("suspense setup did not initialize")
44
+ }
45
+
46
+ await promise
47
+ expect(listenerCount(atom)).toBe(1)
48
+
49
+ app.unmount()
50
+ await nextTick()
51
+ await new Promise((resolve) => setTimeout(resolve, 0))
52
+ expect(listenerCount(atom)).toBe(0)
53
+ defaultRegistry.reset()
54
+ })
55
+
56
+ it("does not keep query option wrapper subscriptions after unmount", async () => {
57
+ defaultRegistry.reset()
58
+ const atom = Atom.make(Effect.succeed(123))
59
+ const observed = withQueryOptions(atom)
60
+ let promise: ReturnType<typeof useAtomSuspense<number, never>> | undefined
61
+ const host = document.createElement("div")
62
+ const app = createApp({
63
+ setup() {
64
+ promise = useAtomSuspense(() => observed)
65
+ return () => null
66
+ }
67
+ })
68
+ app.provide(registryKey, defaultRegistry)
69
+ app.mount(host)
70
+
71
+ if (promise === undefined) {
72
+ throw new Error("suspense setup did not initialize")
73
+ }
74
+
75
+ await promise
76
+ expect(listenerCount(atom)).toBe(1)
77
+
78
+ app.unmount()
79
+ await nextTick()
80
+ await new Promise((resolve) => setTimeout(resolve, 0))
81
+ expect(listenerCount(atom)).toBe(0)
82
+ defaultRegistry.reset()
83
+ })
84
+
85
+ it("aborts atom suspense promises when the component unmounts", async () => {
86
+ defaultRegistry.reset()
87
+ const atom = Atom.make(Effect.never)
88
+ let promise: ReturnType<typeof useAtomSuspense<number, never>> | undefined
89
+ const host = document.createElement("div")
90
+ const app = createApp({
91
+ setup() {
92
+ promise = useAtomSuspense(() => atom)
93
+ return () => null
94
+ }
95
+ })
96
+ app.provide(registryKey, defaultRegistry)
97
+ app.mount(host)
98
+
99
+ if (promise === undefined) {
100
+ throw new Error("suspense setup did not initialize")
101
+ }
102
+
103
+ app.unmount()
104
+ await nextTick()
105
+ const settled = await Promise.race([
106
+ promise.then(() => "resolved" as const, () => "rejected" as const),
107
+ new Promise<"pending">((resolve) => setTimeout(() => resolve("pending"), 20))
108
+ ])
109
+ expect(settled).toBe("rejected")
110
+ defaultRegistry.reset()
111
+ })
112
+
113
+ it("stops atom query subscriptions when the component unmounts", async () => {
114
+ defaultRegistry.reset()
115
+ const atom = Atom.make(Effect.succeed(123))
116
+ const host = document.createElement("div")
117
+ const app = createApp({
118
+ setup() {
119
+ useAtomQuery(() => atom)
120
+ return () => null
121
+ }
122
+ })
123
+ app.provide(registryKey, defaultRegistry)
124
+ app.mount(host)
125
+
126
+ await nextTick()
127
+ expect(listenerCount(atom)).toBe(1)
128
+
129
+ app.unmount()
130
+ await nextTick()
131
+ await new Promise((resolve) => setTimeout(resolve, 0))
132
+ expect(listenerCount(atom)).toBe(0)
133
+ defaultRegistry.reset()
134
+ })
135
+
136
+ it("does not keep non-suspense query option wrapper subscriptions after unmount", async () => {
137
+ defaultRegistry.reset()
138
+ const atom = Atom.make(Effect.succeed(123))
139
+ const observed = withQueryOptions(atom)
140
+ const host = document.createElement("div")
141
+ const app = createApp({
142
+ setup() {
143
+ useAtomQuery(() => observed)
144
+ return () => null
145
+ }
146
+ })
147
+ app.provide(registryKey, defaultRegistry)
148
+ app.mount(host)
149
+
150
+ await nextTick()
151
+ expect(listenerCount(observed)).toBe(1)
152
+ expect(listenerCount(atom)).toBe(1)
153
+
154
+ app.unmount()
155
+ await nextTick()
156
+ await new Promise((resolve) => setTimeout(resolve, 0))
157
+ expect(listenerCount(observed)).toBe(0)
158
+ expect(listenerCount(atom)).toBe(0)
159
+ defaultRegistry.reset()
160
+ })