@effect-app/vue 4.0.0-beta.271 → 4.0.0-beta.273

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/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @effect-app/vue
2
2
 
3
+ ## 4.0.0-beta.273
4
+
5
+ ### Patch Changes
6
+
7
+ - 664e83d: Add Atom-native Vue query APIs, stream query pull atoms, and a TanStack-backed legacy query engine toggle.
8
+ - Updated dependencies [664e83d]
9
+ - Updated dependencies [e4ff9a6]
10
+ - effect-app@4.0.0-beta.273
11
+
12
+ ## 4.0.0-beta.272
13
+
14
+ ### Patch Changes
15
+
16
+ - Updated dependencies [21ac90a]
17
+ - effect-app@4.0.0-beta.272
18
+
3
19
  ## 4.0.0-beta.271
4
20
 
5
21
  ### Patch Changes
@@ -0,0 +1,90 @@
1
+ import type { ClientForOptions } from "effect-app/client/clientFor";
2
+ import * as Effect from "effect-app/Effect";
3
+ import * as Duration from "effect/Duration";
4
+ import type * as Layer from "effect/Layer";
5
+ import * as Stream from "effect/Stream";
6
+ import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
7
+ import * as Atom from "effect/unstable/reactivity/Atom";
8
+ import * as AtomRegistry from "effect/unstable/reactivity/AtomRegistry";
9
+ import * as Reactivity from "effect/unstable/reactivity/Reactivity";
10
+ /**
11
+ * Invalidate the given keys and AWAIT the result. The invalidation (refetch trigger) goes through
12
+ * the built-in `Reactivity` service — the same one query atoms register against via
13
+ * `factory.withReactivity`, shared via the runtime memoMap. The await uses our own `keyAtoms`
14
+ * tracking + `awaitAtomResult`, since `Reactivity.invalidate` returns void and can't be awaited.
15
+ *
16
+ * Resolves once the affected queries have settled, so a mutation can `yield*` this and know the
17
+ * affected queries are fresh. (The await reads via the module-global default registry — the one the
18
+ * vue composables resolve via `injectRegistry`'s fallback.)
19
+ */
20
+ export declare const invalidateAndAwait: (keys: ReadonlyArray<unknown>) => Effect.Effect<void, never, Reactivity.Reactivity>;
21
+ export interface AtomClientRuntime {
22
+ readonly runtime: Atom.AtomRuntime<any, never>;
23
+ readonly factory: Atom.RuntimeFactory;
24
+ }
25
+ /**
26
+ * Build one AtomRuntime (and its factory) from an already-built app context.
27
+ * Shares the ManagedRuntime's `memoMap` so layers are not built twice, and so
28
+ * query-registration and mutation-invalidation resolve the SAME `Reactivity`.
29
+ */
30
+ export declare const makeAtomClientRuntime: (getContext: () => Layer.Layer<any, never, never>, memoMap: Layer.MemoMap) => AtomClientRuntime;
31
+ export interface AtomQueryOptions {
32
+ /** background-refresh threshold (TanStack staleTime; default 5s) */
33
+ readonly staleTime?: Duration.Input;
34
+ /** dispose-when-idle (TanStack gcTime; default 5min). "infinity" => keepAlive */
35
+ readonly gcTime?: Duration.Input | "infinity";
36
+ /**
37
+ * Revalidate a stale query on window focus AND on network reconnect (default on, matching
38
+ * tanstack refetchOnWindowFocus + refetchOnReconnect).
39
+ */
40
+ readonly revalidateOnFocus?: boolean;
41
+ /**
42
+ * Reuse references of unchanged sub-trees across refetches (default on, matching tanstack
43
+ * structuralSharing). Uses Effect `Equal` so decoded Schema instances share too — more effective
44
+ * than tanstack's `===`, but a deep compare per refetch (O(rows·fields)). Set `false` for very
45
+ * large or mostly-changing result sets where the compare costs more than the saved re-renders.
46
+ */
47
+ readonly structuralSharing?: boolean;
48
+ /** poll: re-fetch every N ms (tanstack refetchInterval). */
49
+ readonly refetchInterval?: number;
50
+ }
51
+ /** Exported so the vue hook can do refetch-on-mount-per-observer with the same rule as swr. */
52
+ export declare const isStaleResult: (r: AsyncResult.AsyncResult<any, any>, staleTimeMs: number) => boolean;
53
+ export declare const staleTimeMsOf: (opts: AtomQueryOptions) => number;
54
+ export declare const withQueryOptions: <A, E>(self: Atom.Atom<AsyncResult.AsyncResult<A, E>>, opts?: AtomQueryOptions) => Atom.Atom<AsyncResult.AsyncResult<A, E>>;
55
+ /** Constant atom for disabled / `mode:"optional"`-None queries: stays Initial, never fetches. */
56
+ export declare const disabledQueryAtom: Atom.Atom<AsyncResult.AsyncResult<any, any>>;
57
+ /**
58
+ * Build the per-input atom family for a request handler — the query CACHE IDENTITY.
59
+ *
60
+ * This is the TanStack `queryKey = [handler, input]` equivalent and the piece that makes
61
+ * caching cross-component: `Atom.family` memoizes one atom per structurally-distinct input
62
+ * (v4 hashes the input via Hash/Equal), so every component querying the same handler+input
63
+ * reads the SAME atom instance => one fetch, one shared result in the global registry,
64
+ * ref-counted and GC'd on idle ttl. (The registry + ttl give lifetime; reactivity keys give
65
+ * invalidation; the family gives identity/sharing — all three are needed.)
66
+ *
67
+ * The family is created once per handler (see query.ts's per-handler cache), so it is shared
68
+ * process-wide via the registry.
69
+ *
70
+ * Invalidation is hierarchical: each atom registers under EVERY prefix of its full key
71
+ * `[...makeQueryKey(self), input]`. Since reactivity matches keys by exact hash, registering
72
+ * all prefixes means `invalidate(P)` refreshes every atom whose key starts with `P` — e.g.
73
+ * `["$X"]` refreshes all inputs, `["$X","$List",input]` only that input. (`makeQueryKey`'s
74
+ * collapsed form `getQueryKey` — what mutations invalidate by default — is one of the prefixes.)
75
+ */
76
+ export declare const buildQueryFamily: <I, A, E>(rt: AtomClientRuntime, self: {
77
+ readonly id: string;
78
+ readonly handler: (i: I) => Effect.Effect<A, E, any>;
79
+ readonly options?: ClientForOptions;
80
+ readonly queryKeyProjectionHash?: string;
81
+ }) => (arg: I) => Atom.Atom<AsyncResult.AsyncResult<A, E>>;
82
+ export declare const buildStreamQueryFamily: <I, A, E>(rt: AtomClientRuntime, self: {
83
+ readonly id: string;
84
+ readonly handler: (i: I) => Stream.Stream<A, E, any>;
85
+ readonly options?: ClientForOptions;
86
+ readonly queryKeyProjectionHash?: string;
87
+ }) => (arg: I) => Atom.Writable<Atom.PullResult<A, E>, void>;
88
+ /** Await the first resolved (non-Waiting) result of an atom. Failing query results fail the Effect. */
89
+ export declare const awaitAtomResult: <A, E>(registry: AtomRegistry.AtomRegistry, atom: Atom.Atom<AsyncResult.AsyncResult<A, E>>) => Effect.Effect<A, E, never>;
90
+ //# sourceMappingURL=atomQuery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomQuery.d.ts","sourceRoot":"","sources":["../src/atomQuery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,275 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /**
3
+ * Shared atom core for the query/mutation engine (used by query.ts + mutate.ts).
4
+ *
5
+ * Replaces the @tanstack/vue-query engine with Effect `Atom`, keeping the public
6
+ * `.query()/.suspense()/.mutate()` contract unchanged:
7
+ * - cache identity = the atom reference (one per [handler, input], via Atom.family)
8
+ * - invalidation key = reactivity keys (= the app's existing namespace query keys)
9
+ * - SWR + focus = Atom.swr (+ windowFocusSignal)
10
+ * - gcTime = Atom.setIdleTTL / Atom.keepAlive
11
+ * - retry = Effect.retry inside the atom effect
12
+ *
13
+ * Built over the app's RPC client through the existing `RequestHandlerWithInput`
14
+ * abstraction (mirrors AtomRpc's recipe; see docs/atom-query-plan.md).
15
+ */
16
+ import { defaultRegistry } from "@effect/atom-vue";
17
+ import { makeQueryKey } from "effect-app/client";
18
+ import { ServiceUnavailableError } from "effect-app/client/errors";
19
+ import * as Effect from "effect-app/Effect";
20
+ import * as Option from "effect-app/Option";
21
+ import * as S from "effect-app/Schema";
22
+ import * as Cause from "effect/Cause";
23
+ import * as Duration from "effect/Duration";
24
+ import * as Equal from "effect/Equal";
25
+ import * as Hash from "effect/Hash";
26
+ import * as Stream from "effect/Stream";
27
+ import { isHttpClientError } from "effect/unstable/http/HttpClientError";
28
+ import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
29
+ import * as Atom from "effect/unstable/reactivity/Atom";
30
+ import * as AtomRegistry from "effect/unstable/reactivity/AtomRegistry";
31
+ import * as Reactivity from "effect/unstable/reactivity/Reactivity";
32
+ import { reportRuntimeError } from "./lib.js";
33
+ /** All non-empty prefixes of a key, longest last. `[a,b,c]` -> `[[a],[a,b],[a,b,c]]`. */
34
+ const prefixesOf = (key) => key.map((_, i) => key.slice(0, i + 1));
35
+ const uniqueKeys = (keys) => {
36
+ const out = [];
37
+ const seen = new Set();
38
+ for (const key of keys) {
39
+ const hash = Hash.hash(key);
40
+ if (seen.has(hash))
41
+ continue;
42
+ seen.add(hash);
43
+ out.push(key);
44
+ }
45
+ return out;
46
+ };
47
+ // --- awaitable invalidation -------------------------------------------------------------------
48
+ // keyHash -> live query atoms registered under that key. A query atom is tracked while it is alive
49
+ // in the registry (mounted OR cached within idle-ttl) and removed on GC, so invalidation reaches
50
+ // cached-but-unmounted queries too (e.g. a list you navigated away from).
51
+ const keyAtoms = new Map();
52
+ const trackByKeys = (keys) => (atom) => Atom.transform(atom, (get) => {
53
+ for (const key of keys) {
54
+ const h = Hash.hash(key);
55
+ let set = keyAtoms.get(h);
56
+ if (!set)
57
+ keyAtoms.set(h, set = new Set());
58
+ set.add(atom);
59
+ get.addFinalizer(() => {
60
+ set.delete(atom);
61
+ if (set.size === 0)
62
+ keyAtoms.delete(h);
63
+ });
64
+ }
65
+ return get(atom);
66
+ }, { initialValueTarget: atom });
67
+ const trackWritableByKeys = (keys) => (atom) => {
68
+ const tracked = trackByKeys(keys)(atom);
69
+ return Atom.writable((get) => get(tracked), (ctx, value) => ctx.set(atom, value), (refresh) => refresh(tracked));
70
+ };
71
+ const atomsForKeys = (keys) => {
72
+ const atoms = new Set();
73
+ for (const key of keys) {
74
+ const set = keyAtoms.get(Hash.hash(key));
75
+ if (set) {
76
+ for (const a of set)
77
+ atoms.add(a);
78
+ }
79
+ }
80
+ return [...atoms];
81
+ };
82
+ /**
83
+ * Invalidate the given keys and AWAIT the result. The invalidation (refetch trigger) goes through
84
+ * the built-in `Reactivity` service — the same one query atoms register against via
85
+ * `factory.withReactivity`, shared via the runtime memoMap. The await uses our own `keyAtoms`
86
+ * tracking + `awaitAtomResult`, since `Reactivity.invalidate` returns void and can't be awaited.
87
+ *
88
+ * Resolves once the affected queries have settled, so a mutation can `yield*` this and know the
89
+ * affected queries are fresh. (The await reads via the module-global default registry — the one the
90
+ * vue composables resolve via `injectRegistry`'s fallback.)
91
+ */
92
+ export const invalidateAndAwait = (keys) => Effect.gen(function* () {
93
+ yield* Reactivity.invalidate(keys); // invalidates everything but only refreshes what's mounted
94
+ const atoms = atomsForKeys(keys);
95
+ // for (const a of atoms) defaultRegistry.refresh(a) // refreshes everything even when not mounted
96
+ if (atoms.length === 0)
97
+ return;
98
+ yield* Effect.forEach(atoms, (a) => awaitAtomResult(defaultRegistry, a).pipe(Effect.exit));
99
+ });
100
+ const isPlainObject = (o) => {
101
+ if (typeof o !== "object" || o === null)
102
+ return false;
103
+ const proto = Object.getPrototypeOf(o);
104
+ return proto === Object.prototype || proto === null;
105
+ };
106
+ /**
107
+ * Structural sharing (tanstack `replaceEqualDeep`): walk `next` against `prev` and reuse `prev`'s
108
+ * reference for any unchanged array/object sub-tree, so unchanged data keeps referential identity
109
+ * (Vue skips re-rendering it). Leaves — including decoded Schema CLASS INSTANCES — are compared with
110
+ * Effect `Equal.equals` (structural), which reuses equal instances that tanstack's `===` could not.
111
+ */
112
+ const replaceEqualDeep = (prev, next) => {
113
+ if (prev === next)
114
+ return prev;
115
+ const bothArrays = Array.isArray(prev) && Array.isArray(next);
116
+ if (bothArrays || (isPlainObject(prev) && isPlainObject(next))) {
117
+ const a = prev;
118
+ const b = next;
119
+ const copy = bothArrays ? [] : {};
120
+ const nextKeys = bothArrays ? b.map((_, i) => i) : Object.keys(b);
121
+ const nextSize = nextKeys.length;
122
+ const prevSize = bothArrays ? a.length : Object.keys(a).length;
123
+ let equalItems = 0;
124
+ for (let i = 0; i < nextSize; i++) {
125
+ const key = nextKeys[i];
126
+ copy[key] = replaceEqualDeep(a[key], b[key]);
127
+ if (copy[key] === a[key] && a[key] !== undefined)
128
+ equalItems++;
129
+ }
130
+ return prevSize === nextSize && equalItems === prevSize ? prev : copy;
131
+ }
132
+ return Equal.equals(prev, next) ? prev : next;
133
+ };
134
+ /** Atom combinator: share each new `Success` value structurally against the previous one. */
135
+ const structuralShare = (self) => Atom.transform(self, (get) => {
136
+ const next = get(self);
137
+ if (next._tag !== "Success")
138
+ return next;
139
+ const prev = Option.flatMap(get.self(), AsyncResult.value);
140
+ if (Option.isNone(prev))
141
+ return next;
142
+ const shared = replaceEqualDeep(prev.value, next.value);
143
+ return shared === next.value
144
+ ? next
145
+ : AsyncResult.success(shared, { waiting: next.waiting, timestamp: next.timestamp });
146
+ }, { initialValueTarget: self });
147
+ /**
148
+ * Build one AtomRuntime (and its factory) from an already-built app context.
149
+ * Shares the ManagedRuntime's `memoMap` so layers are not built twice, and so
150
+ * query-registration and mutation-invalidation resolve the SAME `Reactivity`.
151
+ */
152
+ export const makeAtomClientRuntime = (getContext, memoMap) => {
153
+ const factory = Atom.context({ memoMap });
154
+ const runtime = factory((_get) => getContext());
155
+ return { runtime, factory };
156
+ };
157
+ const isRetryable = (e) => isHttpClientError(e)
158
+ || S.is(ServiceUnavailableError)(e)
159
+ || (typeof e === "object" && e !== null && e._tag === "RpcClientError");
160
+ const defaults = { staleTime: Duration.seconds(5), gcTime: Duration.minutes(5) };
161
+ /** Exported so the vue hook can do refetch-on-mount-per-observer with the same rule as swr. */
162
+ export const isStaleResult = (r, staleTimeMs) => {
163
+ if (r.waiting)
164
+ return false;
165
+ const ts = r._tag === "Success"
166
+ ? r.timestamp
167
+ : r._tag === "Failure"
168
+ ? Option.getOrUndefined(Option.map(r.previousSuccess, (s) => s.timestamp))
169
+ : undefined;
170
+ if (ts === undefined)
171
+ return r._tag !== "Initial";
172
+ return Date.now() - ts >= staleTimeMs;
173
+ };
174
+ export const staleTimeMsOf = (opts) => Duration.toMillis(Duration.fromInputUnsafe(opts.staleTime ?? defaults.staleTime));
175
+ export const withQueryOptions = (self, opts = {}) => {
176
+ const staleTime = opts.staleTime ?? defaults.staleTime;
177
+ const gcTime = opts.gcTime === "infinity"
178
+ ? "infinity"
179
+ : Duration.fromInputUnsafe(opts.gcTime ?? defaults.gcTime);
180
+ let atom = self;
181
+ const revalidateOnFocus = opts.revalidateOnFocus ?? true;
182
+ atom = Atom.swr({
183
+ staleTime,
184
+ revalidateOnFocus,
185
+ focusSignal: revalidateOnFocus ? focusOrReconnectSignal : undefined
186
+ })(atom);
187
+ if (opts.refetchInterval)
188
+ atom = Atom.withRefresh(Duration.millis(opts.refetchInterval))(atom);
189
+ if (opts.structuralSharing ?? true)
190
+ atom = structuralShare(atom);
191
+ return gcTime === "infinity" ? Atom.keepAlive(atom) : Atom.setIdleTTL(atom, gcTime);
192
+ };
193
+ /** Constant atom for disabled / `mode:"optional"`-None queries: stays Initial, never fetches. */
194
+ export const disabledQueryAtom = Atom.readable(() => AsyncResult.initial(false));
195
+ /**
196
+ * Bumps when the browser regains connectivity (the `online` event) — the tanstack
197
+ * `refetchOnReconnect` trigger. One shared listener (module-level). SSR-guarded.
198
+ */
199
+ const onlineSignal = Atom.readable((get) => {
200
+ let count = 0;
201
+ if (typeof window === "undefined")
202
+ return count;
203
+ const update = () => {
204
+ if (navigator.onLine)
205
+ get.setSelf(++count);
206
+ };
207
+ window.addEventListener("online", update);
208
+ get.addFinalizer(() => window.removeEventListener("online", update));
209
+ return count;
210
+ });
211
+ /**
212
+ * Focus OR reconnect, as a single signal for `swr` — both should stale-revalidate a query.
213
+ * swr takes one `focusSignal`, so we fold window-focus + reconnect into one derived atom;
214
+ * a bump from either triggers swr's stale check.
215
+ */
216
+ const focusOrReconnectSignal = Atom.make((get) => get(Atom.windowFocusSignal) + get(onlineSignal));
217
+ /**
218
+ * Build the per-input atom family for a request handler — the query CACHE IDENTITY.
219
+ *
220
+ * This is the TanStack `queryKey = [handler, input]` equivalent and the piece that makes
221
+ * caching cross-component: `Atom.family` memoizes one atom per structurally-distinct input
222
+ * (v4 hashes the input via Hash/Equal), so every component querying the same handler+input
223
+ * reads the SAME atom instance => one fetch, one shared result in the global registry,
224
+ * ref-counted and GC'd on idle ttl. (The registry + ttl give lifetime; reactivity keys give
225
+ * invalidation; the family gives identity/sharing — all three are needed.)
226
+ *
227
+ * The family is created once per handler (see query.ts's per-handler cache), so it is shared
228
+ * process-wide via the registry.
229
+ *
230
+ * Invalidation is hierarchical: each atom registers under EVERY prefix of its full key
231
+ * `[...makeQueryKey(self), input]`. Since reactivity matches keys by exact hash, registering
232
+ * all prefixes means `invalidate(P)` refreshes every atom whose key starts with `P` — e.g.
233
+ * `["$X"]` refreshes all inputs, `["$X","$List",input]` only that input. (`makeQueryKey`'s
234
+ * collapsed form `getQueryKey` — what mutations invalidate by default — is one of the prefixes.)
235
+ */
236
+ export const buildQueryFamily = (rt, self) => {
237
+ const baseKey = makeQueryKey(self); // hierarchical, input-independent
238
+ return Atom.family((input) => {
239
+ let atom = rt.runtime.atom(self
240
+ .handler(input)
241
+ .pipe(Effect.retry({ times: 5, while: isRetryable }), Effect.tapCauseIf(Cause.hasDies, (cause) => reportRuntimeError(cause)), Effect.withSpan(`query ${self.id}`, {}, { captureStackTrace: false })));
242
+ // Register under every prefix of the full key => hierarchical (prefix) invalidation. Two roles:
243
+ // - withReactivity: `Reactivity.invalidate(key)` refreshes this atom (the actual refetch).
244
+ // - trackByKeys: records the atom in `keyAtoms` so the mutation can AWAIT its settle.
245
+ const fullKey = [...baseKey, input];
246
+ const projectedFullKey = self.queryKeyProjectionHash === undefined
247
+ ? fullKey
248
+ : [...baseKey, self.queryKeyProjectionHash, input];
249
+ const reactivityKeys = uniqueKeys([...prefixesOf(fullKey), ...prefixesOf(projectedFullKey)]);
250
+ atom = rt.factory.withReactivity(reactivityKeys)(atom);
251
+ atom = trackByKeys(reactivityKeys)(atom);
252
+ // gcTime LAST so the whole chain (incl. the registration + tracking) stays alive through the
253
+ // idle window, letting invalidation reach a cached-but-unmounted query.
254
+ atom = Atom.setIdleTTL(atom, defaults.gcTime);
255
+ return Atom.withLabel(`query:${self.id}`)(atom);
256
+ });
257
+ };
258
+ export const buildStreamQueryFamily = (rt, self) => {
259
+ const baseKey = makeQueryKey(self);
260
+ return Atom.family((input) => {
261
+ let atom = rt.runtime.pull(self.handler(input).pipe(Stream.tapCause((cause) => Cause.hasDies(cause) ? reportRuntimeError(cause) : Effect.void)));
262
+ const fullKey = [...baseKey, input];
263
+ const projectedFullKey = self.queryKeyProjectionHash === undefined
264
+ ? fullKey
265
+ : [...baseKey, self.queryKeyProjectionHash, input];
266
+ const reactivityKeys = uniqueKeys([...prefixesOf(fullKey), ...prefixesOf(projectedFullKey)]);
267
+ atom = rt.factory.withReactivity(reactivityKeys)(atom);
268
+ atom = trackWritableByKeys(reactivityKeys)(atom);
269
+ atom = Atom.setIdleTTL(atom, defaults.gcTime);
270
+ return Atom.withLabel(`stream-query:${self.id}`)(atom);
271
+ });
272
+ };
273
+ /** Await the first resolved (non-Waiting) result of an atom. Failing query results fail the Effect. */
274
+ export const awaitAtomResult = (registry, atom) => AtomRegistry.getResult(registry, atom, { suspendOnWaiting: true });
275
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbVF1ZXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2F0b21RdWVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFaEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDbEUsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssTUFBTSxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sS0FBSyxDQUFDLE1BQU0sbUJBQW1CLENBQUE7QUFDdEMsT0FBTyxLQUFLLEtBQUssTUFBTSxjQUFjLENBQUE7QUFDckMsT0FBTyxLQUFLLFFBQVEsTUFBTSxpQkFBaUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssS0FBSyxNQUFNLGNBQWMsQ0FBQTtBQUNyQyxPQUFPLEtBQUssSUFBSSxNQUFNLGFBQWEsQ0FBQTtBQUVuQyxPQUFPLEtBQUssTUFBTSxNQUFNLGVBQWUsQ0FBQTtBQUN2QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUN4RSxPQUFPLEtBQUssV0FBVyxNQUFNLHdDQUF3QyxDQUFBO0FBQ3JFLE9BQU8sS0FBSyxJQUFJLE1BQU0saUNBQWlDLENBQUE7QUFDdkQsT0FBTyxLQUFLLFlBQVksTUFBTSx5Q0FBeUMsQ0FBQTtBQUN2RSxPQUFPLEtBQUssVUFBVSxNQUFNLHVDQUF1QyxDQUFBO0FBQ25FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUU3Qyx5RkFBeUY7QUFDekYsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUEyQixFQUF5QyxFQUFFLENBQ3hGLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFD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
@@ -0,0 +1,8 @@
1
+ import { QueryClient } from "@tanstack/vue-query";
2
+ import type * as Context from "effect-app/Context";
3
+ import type { QueryInvalidator } from "../mutate.js";
4
+ import type { MakeQuery2 } from "../query.js";
5
+ export declare const makeTanstackQueryClient: () => QueryClient;
6
+ export declare const makeTanstackQueryInvalidator: (queryClient: QueryClient) => QueryInvalidator;
7
+ export declare const makeTanstackQuery: <R>(getRuntime: () => Context.Context<R>, queryClient: QueryClient) => MakeQuery2<R>;
8
+ //# sourceMappingURL=tanstackQuery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tanstackQuery.d.ts","sourceRoot":"","sources":["../../src/internal/tanstackQuery.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAgC,MAAM,qBAAqB,CAAA;AAI/E,OAAO,KAAK,KAAK,OAAO,MAAM,oBAAoB,CAAA;AAUlD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,KAAK,EAAqI,UAAU,EAAoD,MAAM,aAAa,CAAA;AA+ElO,eAAO,MAAM,uBAAuB,mBAA0B,CAAA;AAE9D,eAAO,MAAM,4BAA4B,gBAAiB,WAAW,KAAG,gBAOtE,CAAA;AAEF,eAAO,MAAM,iBAAiB,GAAI,CAAC,cACrB,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,eACvB,WAAW,KACvB,UAAU,CAAC,CAAC,CA+Gd,CAAA"}
@@ -0,0 +1,145 @@
1
+ import { injectRegistry } from "@effect/atom-vue";
2
+ import { QueryClient, useQuery as useTanstackQuery } from "@tanstack/vue-query";
3
+ import { makeQueryKey } from "effect-app/client";
4
+ import { CauseException, ServiceUnavailableError } from "effect-app/client/errors";
5
+ import * as Effect from "effect-app/Effect";
6
+ import * as Option from "effect-app/Option";
7
+ import * as S from "effect-app/Schema";
8
+ import * as Cause from "effect/Cause";
9
+ import { isHttpClientError } from "effect/unstable/http/HttpClientError";
10
+ import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
11
+ import * as Atom from "effect/unstable/reactivity/Atom";
12
+ import { computed, shallowRef, toValue, watch } from "vue";
13
+ import { reportRuntimeError } from "../lib.js";
14
+ import { makeRunPromise } from "../runtime.js";
15
+ const swrToQuery = (r) => {
16
+ if (r.error !== undefined && r.error !== null) {
17
+ return AsyncResult.failureWithPrevious(r.error.originalCause, {
18
+ previous: r.data === undefined ? Option.none() : Option.some(AsyncResult.success(r.data)),
19
+ waiting: r.isValidating
20
+ });
21
+ }
22
+ if (r.data !== undefined) {
23
+ return AsyncResult.success(r.data, { waiting: r.isValidating });
24
+ }
25
+ return AsyncResult.initial(r.isValidating);
26
+ };
27
+ const recoverCauseException = (error) => error instanceof CauseException
28
+ ? Effect.failCause(error.originalCause)
29
+ : Effect.die(error);
30
+ const isRetryable = (error) => {
31
+ if (error instanceof CauseException) {
32
+ return isHttpClientError(error.cause) || S.is(ServiceUnavailableError)(error.cause);
33
+ }
34
+ return false;
35
+ };
36
+ const isInputOption = (value) => Option.isOption(value);
37
+ const resolveInput = (arg, mode) => {
38
+ if (mode === "optional") {
39
+ const option = toValue(arg);
40
+ return isInputOption(option) && Option.isSome(option) ? option.value : undefined;
41
+ }
42
+ const value = toValue(arg);
43
+ return isInputOption(value) ? undefined : value;
44
+ };
45
+ const resolveEnabled = (arg, options) => {
46
+ if (options?.mode === "optional") {
47
+ return computed(() => {
48
+ const option = toValue(arg);
49
+ return Option.isSome(option);
50
+ });
51
+ }
52
+ return computed(() => {
53
+ const enabled = options?.enabled;
54
+ if (enabled === undefined)
55
+ return true;
56
+ return !!toValue(enabled);
57
+ });
58
+ };
59
+ export const makeTanstackQueryClient = () => new QueryClient();
60
+ export const makeTanstackQueryInvalidator = (queryClient) => ({
61
+ invalidateAndAwait: (keys) => Effect.forEach(keys, (queryKey) => Effect.promise(() => queryClient.invalidateQueries({ queryKey })), { discard: true, concurrency: "inherit" })
62
+ });
63
+ export const makeTanstackQuery = (getRuntime, queryClient) => {
64
+ const useQuery = (q) => (arg, options) => {
65
+ const runPromise = makeRunPromise(getRuntime());
66
+ const queryKey = makeQueryKey(q);
67
+ const projectionHash = q.queryKeyProjectionHash;
68
+ const enabled = resolveEnabled(arg, options);
69
+ const tanstackOptions = {
70
+ ...(options?.staleTime !== undefined ? { staleTime: options.staleTime } : {}),
71
+ ...(typeof options?.gcTime === "number" ? { gcTime: options.gcTime } : {}),
72
+ ...(options?.refetchOnWindowFocus !== undefined ? { refetchOnWindowFocus: options.refetchOnWindowFocus } : {}),
73
+ ...(options?.structuralSharing !== undefined ? { structuralSharing: options.structuralSharing } : {}),
74
+ ...(options?.refetchInterval !== undefined ? { refetchInterval: options.refetchInterval } : {}),
75
+ ...(options?.select !== undefined ? { select: options.select } : {})
76
+ };
77
+ const tanstack = useTanstackQuery({
78
+ ...tanstackOptions,
79
+ enabled,
80
+ throwOnError: false,
81
+ retry: (retryCount, error) => isRetryable(error) && retryCount < 5,
82
+ queryKey: computed(() => {
83
+ const input = resolveInput(arg, options?.mode);
84
+ return projectionHash === undefined ? [...queryKey, input] : [...queryKey, projectionHash, input];
85
+ }),
86
+ queryFn: ({ signal }) => runPromise(q
87
+ .handler(resolveInput(arg, options?.mode))
88
+ .pipe(Effect.tapCauseIf(Cause.hasDies, (cause) => reportRuntimeError(cause)), Effect.withSpan(`query ${q.id}`, {}, { captureStackTrace: false })), { signal })
89
+ }, queryClient);
90
+ const latestSuccess = shallowRef();
91
+ const result = computed(() => swrToQuery({
92
+ error: tanstack.error.value,
93
+ data: tanstack.data.value === undefined ? latestSuccess.value : tanstack.data.value,
94
+ isValidating: tanstack.isFetching.value
95
+ }));
96
+ watch(result, (value) => latestSuccess.value = Option.getOrUndefined(AsyncResult.value(value)), { immediate: true });
97
+ const registry = injectRegistry();
98
+ const latestSuccessRef = computed(() => latestSuccess.value);
99
+ const atom = computed(() => Atom.readable(() => result.value));
100
+ const awaitResult = () => Effect
101
+ .tryPromise({
102
+ try: async () => {
103
+ const queryResult = await tanstack.suspense();
104
+ const data = queryResult.data;
105
+ if (data === undefined) {
106
+ throw new Error("TanStack query resolved without data");
107
+ }
108
+ return data;
109
+ },
110
+ catch: (error) => error
111
+ })
112
+ .pipe(Effect.catch((error) => recoverCauseException(error)));
113
+ const refetch = () => Effect
114
+ .tryPromise({
115
+ try: async () => {
116
+ const queryResult = await tanstack.refetch({ throwOnError: true });
117
+ const data = queryResult.data;
118
+ if (data === undefined) {
119
+ throw new Error("TanStack query refetched without data");
120
+ }
121
+ return data;
122
+ },
123
+ catch: (error) => error
124
+ })
125
+ .pipe(Effect.catch((error) => recoverCauseException(error)));
126
+ const handle = {
127
+ awaitResult,
128
+ refetch,
129
+ refresh: () => {
130
+ void tanstack.refetch();
131
+ },
132
+ registry,
133
+ atom
134
+ };
135
+ const fetch = (_options) => refetch().pipe(Effect.exit, Effect.map(AsyncResult.fromExit));
136
+ return [
137
+ result,
138
+ latestSuccessRef,
139
+ fetch,
140
+ handle
141
+ ];
142
+ };
143
+ return useQuery;
144
+ };
145
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFuc3RhY2tRdWVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbnRlcm5hbC90YW5zdGFja1F1ZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsSUFBSSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQy9FLE9BQU8sRUFBRSxZQUFZLEVBQVksTUFBTSxtQkFBbUIsQ0FBQTtBQUUxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFFbEYsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssTUFBTSxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sS0FBSyxDQUFDLE1BQU0sbUJBQW1CLENBQUE7QUFDdEMsT0FBTyxLQUFLLEtBQUssTUFBTSxjQUFjLENBQUE7QUFDckMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0NBQXNDLENBQUE7QUFDeEUsT0FBTyxLQUFLLFdBQVcsTUFBTSx3Q0FBd0MsQ0FBQTtBQUNyRSxPQUFPLEtBQUssSUFBSSxNQUFNLGlDQUFpQyxDQUFBO0FBQ3ZELE9BQU8sRUFBRSxRQUFRLEVBQXlCLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFvQixNQUFNLEtBQUssQ0FBQTtBQUNuRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFHOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUU5QyxNQUFNLFVBQVUsR0FBRyxDQUFPLENBSXpCLEVBQWlDLEVBQUU7SUFDbEMsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzlDLE9BQU8sV0FBVyxDQUFD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