@effect-app/vue 4.0.0-beta.99 → 4.0.0
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 +2701 -0
- package/dist/atomQuery.d.ts +120 -0
- package/dist/atomQuery.d.ts.map +1 -0
- package/dist/atomQuery.js +434 -0
- package/dist/commander.d.ts +318 -43
- package/dist/commander.d.ts.map +1 -1
- package/dist/commander.js +593 -81
- package/dist/confirm.d.ts +5 -3
- package/dist/confirm.d.ts.map +1 -1
- package/dist/confirm.js +12 -14
- package/dist/dependencyMetadata.d.ts +18 -0
- package/dist/dependencyMetadata.d.ts.map +1 -0
- package/dist/dependencyMetadata.js +67 -0
- package/dist/errorReporter.d.ts +6 -4
- package/dist/errorReporter.d.ts.map +1 -1
- package/dist/errorReporter.js +14 -19
- package/dist/form.d.ts +5 -5
- package/dist/form.d.ts.map +1 -1
- package/dist/form.js +16 -10
- package/dist/internal/tanstackQuery.d.ts +9 -0
- package/dist/internal/tanstackQuery.d.ts.map +1 -0
- package/dist/internal/tanstackQuery.js +204 -0
- package/dist/intl.d.ts +4 -4
- package/dist/intl.d.ts.map +1 -1
- package/dist/intl.js +2 -2
- package/dist/lib.d.ts +8 -10
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +37 -12
- package/dist/liveQueryInvalidation.d.ts +16 -0
- package/dist/liveQueryInvalidation.d.ts.map +1 -0
- package/dist/liveQueryInvalidation.js +115 -0
- package/dist/makeClient.d.ts +232 -109
- package/dist/makeClient.d.ts.map +1 -1
- package/dist/makeClient.js +416 -84
- package/dist/makeContext.d.ts.map +1 -1
- package/dist/makeIntl.d.ts.map +1 -1
- package/dist/makeUseCommand.d.ts +3 -2
- package/dist/makeUseCommand.d.ts.map +1 -1
- package/dist/makeUseCommand.js +2 -2
- package/dist/mutate.d.ts +110 -41
- package/dist/mutate.d.ts.map +1 -1
- package/dist/mutate.js +236 -59
- package/dist/query.d.ts +161 -44
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +382 -113
- package/dist/queryLifetime.d.ts +25 -0
- package/dist/queryLifetime.d.ts.map +1 -0
- package/dist/queryLifetime.js +54 -0
- package/dist/routeParams.d.ts +4 -4
- package/dist/routeParams.d.ts.map +1 -1
- package/dist/routeParams.js +4 -3
- package/dist/runtime.d.ts +1 -17
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +2 -38
- package/dist/suspense.d.ts +19 -0
- package/dist/suspense.d.ts.map +1 -0
- package/dist/suspense.js +38 -0
- package/dist/toast.d.ts +1 -45
- package/dist/toast.d.ts.map +1 -1
- package/dist/toast.js +2 -32
- package/dist/withToast.d.ts +1 -24
- package/dist/withToast.d.ts.map +1 -1
- package/dist/withToast.js +2 -45
- package/docs/atom-query-api-redesign.md +207 -0
- package/docs/mutation-command-atoms.md +40 -0
- package/docs/query-key-invalidation.md +107 -0
- package/examples/streamMutation.ts +72 -0
- package/package.json +35 -94
- package/src/atomQuery.ts +600 -0
- package/src/commander.ts +1064 -116
- package/src/confirm.ts +12 -14
- package/src/dependencyMetadata.ts +84 -0
- package/src/errorReporter.ts +65 -75
- package/src/form.ts +22 -15
- package/src/index.ts +7 -7
- package/src/internal/tanstackQuery.ts +308 -0
- package/src/intl.ts +2 -2
- package/src/lib.ts +51 -23
- package/src/liveQueryInvalidation.ts +138 -0
- package/src/makeClient.ts +972 -263
- package/src/makeIntl.ts +2 -2
- package/src/makeUseCommand.ts +8 -5
- package/src/mutate.ts +407 -154
- package/src/query.ts +758 -242
- package/src/queryLifetime.ts +74 -0
- package/src/routeParams.ts +7 -7
- package/src/runtime.ts +1 -54
- package/src/suspense.ts +43 -0
- package/src/toast.ts +1 -52
- package/src/withToast.ts +1 -99
- package/test/Mutation.test.ts +104 -17
- package/test/dependencyInvalidation.test.ts +444 -0
- package/test/dist/dependencyInvalidation.test.d.ts.map +1 -0
- package/test/dist/form.test.d.ts.map +1 -1
- package/test/dist/inactiveInvalidation.test.d.ts.map +1 -0
- package/test/dist/interrupt-refetch-repro.test.d.ts.map +1 -0
- package/test/dist/lib.test.d.ts.map +1 -0
- package/test/dist/liveQueryInvalidation.test.d.ts.map +1 -0
- package/test/dist/query-span.test.d.ts.map +1 -0
- package/test/dist/queryOptions.test.d.ts.map +1 -0
- package/test/dist/streamFinal.test.d.ts.map +1 -0
- package/test/dist/streamFn.test.d.ts.map +1 -0
- package/test/dist/stubs.d.ts +3681 -256
- package/test/dist/stubs.d.ts.map +1 -1
- package/test/dist/stubs.js +166 -25
- package/test/dist/suspense-regression.test.d.ts.map +1 -0
- package/test/dist/suspense.test.d.ts.map +1 -0
- package/test/form-validation-errors.test.ts +2 -1
- package/test/form.test.ts +2 -1
- package/test/inactiveInvalidation.test.ts +172 -0
- package/test/interrupt-refetch-repro.test.ts +625 -0
- package/test/lib.test.ts +240 -0
- package/test/liveQueryInvalidation.test.ts +108 -0
- package/test/makeClient.test.ts +414 -32
- package/test/query-span.test.ts +92 -0
- package/test/queryOptions.test.ts +88 -0
- package/test/streamFinal.test.ts +64 -0
- package/test/streamFn.test.ts +457 -0
- package/test/stubs.ts +194 -36
- package/test/suspense-regression.test.ts +168 -0
- package/test/suspense.test.ts +160 -0
- package/tsconfig.examples.json +20 -0
- package/tsconfig.json +9 -1
- package/tsconfig.src.json +34 -34
- package/tsconfig.test.json +2 -2
- package/vitest.config.ts +5 -5
- package/eslint.config.mjs +0 -24
- package/tsconfig.json.bak +0 -12
package/dist/mutate.js
CHANGED
|
@@ -1,20 +1,51 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
2
|
+
import { DataDependencies, InvalidationKeysFromServer, makeInvalidationKeysService, makeQueryKey } from "effect-app/client";
|
|
3
|
+
import * as Effect from "effect-app/Effect";
|
|
4
4
|
import { tuple } from "effect-app/Function";
|
|
5
|
-
import * as
|
|
5
|
+
import * as Option from "effect-app/Option";
|
|
6
|
+
import { isReadonlyArrayNonEmpty } from "effect/Array";
|
|
7
|
+
import * as Exit from "effect/Exit";
|
|
8
|
+
import * as AsyncResult from "effect/reactivity/AsyncResult";
|
|
9
|
+
import * as Ref from "effect/Ref";
|
|
10
|
+
import * as Stream from "effect/Stream";
|
|
6
11
|
import { computed, shallowRef } from "vue";
|
|
7
|
-
import {
|
|
8
|
-
|
|
12
|
+
import { invalidateAndAwait, invalidateSoft } from "./atomQuery.js";
|
|
13
|
+
import { getDerivedInvalidationKeys, partitionInvalidationKeys } from "./dependencyMetadata.js";
|
|
14
|
+
import { reportRuntimeError } from "./lib.js";
|
|
15
|
+
/**
|
|
16
|
+
* Default heuristic: invalidate the parent namespace of the action.
|
|
17
|
+
* e.g. `$project/$configuration.get` -> `["$project"]`
|
|
18
|
+
* e.g. `$project/$configuration/$something.get` -> `["$project","$configuration"]`
|
|
19
|
+
*/
|
|
20
|
+
export const defaultGetQueryKey = (h) => {
|
|
9
21
|
const key = makeQueryKey(h);
|
|
10
22
|
const ns = key.filter((_) => _.startsWith("$"));
|
|
11
|
-
// we invalidate the parent namespace e.g $project/$configuration.get, we invalidate $project
|
|
12
|
-
// for $project/$configuration/$something.get, we invalidate $project/$configuration
|
|
13
23
|
const k = ns.length ? ns.length > 1 ? ns.slice(0, ns.length - 1) : ns : undefined;
|
|
14
24
|
if (!k)
|
|
15
25
|
throw new Error("empty query key for: " + h.id);
|
|
16
26
|
return k;
|
|
17
27
|
};
|
|
28
|
+
let activeGetQueryKey = defaultGetQueryKey;
|
|
29
|
+
/**
|
|
30
|
+
* Override the default query-key heuristic used by mutations for cache
|
|
31
|
+
* invalidation. Call once at app bootstrap. Pass `undefined` to restore the
|
|
32
|
+
* built-in default.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* // invalidate the full namespace of the action (no parent collapse)
|
|
37
|
+
* setDefaultGetQueryKey((h) => {
|
|
38
|
+
* const key = makeQueryKey(h)
|
|
39
|
+
* const ns = key.filter((_) => _.startsWith("$"))
|
|
40
|
+
* if (!ns.length) throw new Error("empty query key for: " + h.id)
|
|
41
|
+
* return ns
|
|
42
|
+
* })
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export const setDefaultGetQueryKey = (fn) => {
|
|
46
|
+
activeGetQueryKey = fn ?? defaultGetQueryKey;
|
|
47
|
+
};
|
|
48
|
+
export const getQueryKey = (h) => activeGetQueryKey(h);
|
|
18
49
|
export function mutationResultToVue(mutationResult) {
|
|
19
50
|
switch (mutationResult._tag) {
|
|
20
51
|
case "Initial": {
|
|
@@ -46,75 +77,221 @@ export function make(self) {
|
|
|
46
77
|
const latestSuccess = computed(() => Option.getOrUndefined(AsyncResult.value(result.value)));
|
|
47
78
|
return tuple(result, latestSuccess, execute);
|
|
48
79
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
80
|
+
export const atomQueryInvalidator = {
|
|
81
|
+
invalidateAndAwait,
|
|
82
|
+
invalidateSoft
|
|
83
|
+
};
|
|
84
|
+
export const combineQueryInvalidators = (...invalidators) => ({
|
|
85
|
+
invalidateAndAwait: (keys) => Effect.forEach(invalidators, (invalidator) => invalidator.invalidateAndAwait(keys), { discard: true, concurrency: "unbounded" }),
|
|
86
|
+
invalidateSoft: (keys) => Effect.forEach(invalidators, (invalidator) => invalidator.invalidateSoft?.(keys) ?? Effect.void, { discard: true, concurrency: "unbounded" })
|
|
87
|
+
});
|
|
88
|
+
const isRecord = (value) => typeof value === "object" && value !== null;
|
|
89
|
+
const isQueryKey = (entry) => Array.isArray(entry);
|
|
90
|
+
const queryKeyFromFilters = (entry) => {
|
|
91
|
+
if (!("filters" in entry))
|
|
92
|
+
return undefined;
|
|
93
|
+
const filters = entry.filters;
|
|
94
|
+
if (!isRecord(filters))
|
|
95
|
+
return undefined;
|
|
96
|
+
const queryKey = filters["queryKey"];
|
|
97
|
+
return Array.isArray(queryKey) ? queryKey : undefined;
|
|
98
|
+
};
|
|
59
99
|
export const asResult = (handler) => {
|
|
60
100
|
const state = shallowRef(AsyncResult.initial());
|
|
61
|
-
const act =
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
.pipe(Effect.andThen(Effect.suspend(() => handler.pipe(Effect.exit, Effect.tap((exit) => Effect.sync(() => (state.value = AsyncResult.fromExit(exit))))))))
|
|
67
|
-
: (...args) => Effect
|
|
68
|
-
.sync(() => {
|
|
69
|
-
state.value = AsyncResult.initial(true);
|
|
70
|
-
})
|
|
71
|
-
.pipe(Effect.andThen(Effect.suspend(() => handler(...args).pipe(Effect.exit, Effect.tap((exit) => Effect.sync(() => (state.value = AsyncResult.fromExit(exit))))))));
|
|
101
|
+
const act = (...args) => Effect
|
|
102
|
+
.sync(() => {
|
|
103
|
+
state.value = AsyncResult.initial(true);
|
|
104
|
+
})
|
|
105
|
+
.pipe(Effect.andThen(Effect.suspend(() => handler(...args).pipe(Effect.exit, Effect.tap((exit) => Effect.sync(() => (state.value = AsyncResult.fromExit(exit))))))));
|
|
72
106
|
return tuple(computed(() => state.value), act);
|
|
73
107
|
};
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
108
|
+
/**
|
|
109
|
+
* Like `asResult`, but for streams. The ref is updated with each emitted value
|
|
110
|
+
* (keeping `waiting: true`) and is finalised (with `waiting: false`) once the
|
|
111
|
+
* stream terminates successfully. Errors are surfaced as `AsyncResult.failure`.
|
|
112
|
+
*/
|
|
113
|
+
export const asStreamResult = (handler) => {
|
|
114
|
+
const state = shallowRef(AsyncResult.initial());
|
|
115
|
+
const runStream = (stream) => Effect
|
|
116
|
+
.sync(() => {
|
|
117
|
+
state.value = AsyncResult.initial(true);
|
|
118
|
+
})
|
|
119
|
+
.pipe(Effect.andThen(stream.pipe(Stream.runForEach((value) => Effect.sync(() => {
|
|
120
|
+
state.value = AsyncResult.success(value, { waiting: true });
|
|
121
|
+
})), Effect.exit, Effect.flatMap((exit) => Effect.sync(() => {
|
|
122
|
+
if (exit._tag === "Success") {
|
|
123
|
+
const current = state.value;
|
|
124
|
+
if (AsyncResult.isSuccess(current)) {
|
|
125
|
+
state.value = AsyncResult.success(current.value, { waiting: false });
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
state.value = AsyncResult.initial(false);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
state.value = AsyncResult.failure(exit.cause);
|
|
133
|
+
}
|
|
134
|
+
})))));
|
|
135
|
+
const act = (...args) => runStream(handler(...args));
|
|
136
|
+
return tuple(computed(() => state.value), act);
|
|
137
|
+
};
|
|
138
|
+
const buildInvalidateCache = (self, queryInvalidation, queryInvalidator) => {
|
|
139
|
+
// Concrete reactivity keys to invalidate: a raw query key, one derived from an `{ id }`
|
|
140
|
+
// entry, or a compatibility `{ filters: { queryKey } }` entry.
|
|
141
|
+
// Predicate-only `{ filters }` entries have no exact-key reactivity equivalent and throw.
|
|
142
|
+
const getClientInvalidationKeys = (input, output) => {
|
|
77
143
|
const queryKey = getQueryKey(self);
|
|
78
|
-
if (
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
144
|
+
if (queryInvalidation) {
|
|
145
|
+
const keys = [];
|
|
146
|
+
for (const entry of queryInvalidation(queryKey, self.id, input, output)) {
|
|
147
|
+
if (isQueryKey(entry)) {
|
|
148
|
+
keys.push(entry);
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if ("id" in entry) {
|
|
152
|
+
keys.push(makeQueryKey(entry.options ? { id: entry.id, options: entry.options } : { id: entry.id }));
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const filterQueryKey = queryKeyFromFilters(entry);
|
|
156
|
+
if (filterQueryKey !== undefined) {
|
|
157
|
+
keys.push(filterQueryKey);
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
throw new Error("Unsupported query invalidation filter: only filters.queryKey is supported");
|
|
82
161
|
}
|
|
83
|
-
return
|
|
84
|
-
.andThen(Effect.annotateCurrentSpan({ queryKey, opts }), Effect.forEach(opts, (_) => invalidateQueries(_.filters, _.options), { concurrency: "inherit" }))
|
|
85
|
-
.pipe(Effect.withSpan("client.query.invalidation", {}, { captureStackTrace: false }));
|
|
162
|
+
return keys;
|
|
86
163
|
}
|
|
87
|
-
|
|
164
|
+
// No manual `invalidatesQueries`: contribute nothing. Invalidation rides entirely on the
|
|
165
|
+
// repository-derived write-dependencies (plus any server-provided keys) — there is no default
|
|
166
|
+
// namespace invalidation of the command's own resource.
|
|
167
|
+
return [];
|
|
168
|
+
};
|
|
169
|
+
const invalidateCache = (input, output, serverKeys, writeDependencies = DataDependencies.empty()) => Effect.suspend(() => {
|
|
170
|
+
if (self.disableQueryInvalidation)
|
|
88
171
|
return Effect.void;
|
|
172
|
+
const clientKeys = getClientInvalidationKeys(input, output);
|
|
173
|
+
// Derive extra reactivity keys from repository write-dependencies: every live query whose
|
|
174
|
+
// recorded read-dependencies intersect this mutation's writes must be refreshed.
|
|
175
|
+
const derivedKeys = getDerivedInvalidationKeys(writeDependencies);
|
|
176
|
+
// Invalidate exact reactivity keys (= the prefixes query atoms register under). Each key
|
|
177
|
+
// array is hashed structurally, matching the query-side registration.
|
|
178
|
+
const keys = [...clientKeys, ...serverKeys, ...derivedKeys];
|
|
179
|
+
if (!isReadonlyArrayNonEmpty(keys))
|
|
180
|
+
return Effect.void;
|
|
181
|
+
const { awaitKeys, softKeys } = partitionInvalidationKeys(keys);
|
|
89
182
|
return Effect
|
|
90
|
-
.andThen(Effect.annotateCurrentSpan({
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
183
|
+
.andThen(Effect.annotateCurrentSpan({
|
|
184
|
+
keys,
|
|
185
|
+
awaitKeys,
|
|
186
|
+
softKeys,
|
|
187
|
+
clientKeys,
|
|
188
|
+
serverKeys,
|
|
189
|
+
derivedKeys,
|
|
190
|
+
writeDependencies: [...writeDependencies]
|
|
191
|
+
}),
|
|
192
|
+
// refetch + AWAIT every live query registered under these keys, so by the time the
|
|
193
|
+
// mutation resolves the affected queries are fresh.
|
|
194
|
+
Effect.gen(function* () {
|
|
195
|
+
if (softKeys.length > 0) {
|
|
196
|
+
yield* (queryInvalidator.invalidateSoft?.(softKeys) ?? Effect.void).pipe(Effect.catchCause((cause) => reportRuntimeError(cause, { invalidation: "soft", keys: softKeys }).pipe(Effect.asVoid)), Effect.forkDetach({ startImmediately: true }));
|
|
197
|
+
}
|
|
198
|
+
if (awaitKeys.length > 0) {
|
|
199
|
+
yield* queryInvalidator.invalidateAndAwait(awaitKeys);
|
|
200
|
+
}
|
|
201
|
+
}))
|
|
202
|
+
.pipe(Effect.tap(Effect.sleep(0.1)), // allow for refs to update etc
|
|
203
|
+
Effect.withSpan("client.query.invalidation", {}, { captureStackTrace: false }));
|
|
204
|
+
});
|
|
205
|
+
return invalidateCache;
|
|
206
|
+
};
|
|
207
|
+
export const invalidateQueries = (self, options, queryInvalidator) => {
|
|
208
|
+
const invalidateCache = buildInvalidateCache(self, options?.queryInvalidation, queryInvalidator);
|
|
209
|
+
const select = options?.select;
|
|
210
|
+
const handle = (eff, input) => Effect.gen(function* () {
|
|
211
|
+
const keysRef = yield* Ref.make([]);
|
|
212
|
+
const readsRef = yield* Ref.make(DataDependencies.empty());
|
|
213
|
+
const writesRef = yield* Ref.make(DataDependencies.empty());
|
|
214
|
+
const dependencyRecorder = DataDependencies.makeDataDependencyRecorder(readsRef, writesRef);
|
|
215
|
+
const result = yield* eff.pipe(Effect.provideService(InvalidationKeysFromServer, makeInvalidationKeysService(keysRef)), Effect.provideService(DataDependencies.DataDependencyRecorder, dependencyRecorder), Effect.onExit((exit) => Effect.gen(function* () {
|
|
216
|
+
const serverKeys = yield* Ref.get(keysRef);
|
|
217
|
+
const writeDependencies = yield* Ref.get(writesRef);
|
|
218
|
+
yield* invalidateCache(input, exit, serverKeys, writeDependencies);
|
|
219
|
+
})));
|
|
220
|
+
if (select) {
|
|
221
|
+
return yield* select(result).pipe(Effect.onExit((exit) => Effect.gen(function* () {
|
|
222
|
+
const serverKeys = yield* Ref.get(keysRef);
|
|
223
|
+
const writeDependencies = yield* Ref.get(writesRef);
|
|
224
|
+
yield* invalidateCache(input, exit, serverKeys, writeDependencies);
|
|
225
|
+
})));
|
|
226
|
+
}
|
|
227
|
+
return result;
|
|
95
228
|
});
|
|
96
|
-
const handle = (self) => Effect.ensuring(self, invalidateCache);
|
|
97
229
|
return handle;
|
|
98
230
|
};
|
|
99
|
-
export const makeMutation = () => {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
231
|
+
export const makeMutation = (queryInvalidator) => {
|
|
232
|
+
/**
|
|
233
|
+
* Pass a function that returns an Effect, e.g from a client action.
|
|
234
|
+
* Executes query cache invalidation based on default rules or provided option.
|
|
235
|
+
* When `I = void` the input argument may be omitted.
|
|
236
|
+
*/
|
|
237
|
+
const useMutation = (self) => {
|
|
238
|
+
const r = (i, options) => invalidateQueries(self, options, queryInvalidator)(self.handler(i), i);
|
|
105
239
|
return Object.assign(r, { id: self.id });
|
|
106
240
|
};
|
|
107
241
|
return useMutation;
|
|
108
242
|
};
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
243
|
+
export const useMakeMutation = (queryInvalidator) => {
|
|
244
|
+
/**
|
|
245
|
+
* Pass a function that returns an Effect, e.g from a client action.
|
|
246
|
+
* Executes query cache invalidation based on default rules or provided option.
|
|
247
|
+
* When `I = void` the input argument may be omitted.
|
|
248
|
+
*/
|
|
249
|
+
const useMutation = (self) => {
|
|
250
|
+
const r = (i, options) => invalidateQueries(self, options, queryInvalidator)(self.handler(i), i);
|
|
116
251
|
return Object.assign(r, { id: self.id });
|
|
117
252
|
};
|
|
118
253
|
return useMutation;
|
|
119
254
|
};
|
|
120
|
-
|
|
255
|
+
/**
|
|
256
|
+
* Returns a stream-based mutation factory for use with `streamFn`.
|
|
257
|
+
* The outer Effect sets up per-invocation invalidation scaffolding
|
|
258
|
+
* and returns a stream that triggers query invalidation via `Stream.ensuring` when it completes.
|
|
259
|
+
*
|
|
260
|
+
* Use with `streamFn` / `Command.streamFn(id)(mutateHandler, ...combinators)` so that
|
|
261
|
+
* the command manages its own reactive state internally.
|
|
262
|
+
*/
|
|
263
|
+
export const makeStreamMutation2 = (queryInvalidator) => {
|
|
264
|
+
return (self, mergedInvalidation) => {
|
|
265
|
+
const invCache = buildInvalidateCache(self, mergedInvalidation, queryInvalidator);
|
|
266
|
+
const makeInvocationEffect = (input, source) => Effect.gen(function* () {
|
|
267
|
+
const keysRef = yield* Ref.make([]);
|
|
268
|
+
// Server invalidation keys stay settlement-only: flushing them from `add` refetched
|
|
269
|
+
// live queries once per chunk (One-Pick List storms). Write-deps flush once when the
|
|
270
|
+
// first write arrives (job create → GetActiveJob) and again from `ensuring`.
|
|
271
|
+
const invKeys = makeInvalidationKeysService(keysRef);
|
|
272
|
+
const readsRef = yield* Ref.make(DataDependencies.empty());
|
|
273
|
+
const writesRef = yield* Ref.make(DataDependencies.empty());
|
|
274
|
+
const dependencyRecorder = DataDependencies.makeDataDependencyRecorder(readsRef, writesRef);
|
|
275
|
+
const lastRef = yield* Ref.make(undefined);
|
|
276
|
+
let flushedFirstWrites = false;
|
|
277
|
+
const flushFirstWrites = Effect.gen(function* () {
|
|
278
|
+
if (flushedFirstWrites)
|
|
279
|
+
return;
|
|
280
|
+
const writeDependencies = yield* Ref.get(writesRef);
|
|
281
|
+
if (!DataDependencies.isNonEmpty(writeDependencies))
|
|
282
|
+
return;
|
|
283
|
+
flushedFirstWrites = true;
|
|
284
|
+
const lastValue = yield* Ref.get(lastRef);
|
|
285
|
+
yield* invCache(input, Exit.succeed(lastValue), [], writeDependencies);
|
|
286
|
+
});
|
|
287
|
+
return source.pipe(Stream.provideService(InvalidationKeysFromServer, invKeys), Stream.provideService(DataDependencies.DataDependencyRecorder, dependencyRecorder), Stream.tap((v) => Ref.set(lastRef, v)), Stream.tap(() => flushFirstWrites), Stream.ensuring(Effect.gen(function* () {
|
|
288
|
+
const lastValue = yield* Ref.get(lastRef);
|
|
289
|
+
const serverKeys = yield* Ref.get(keysRef);
|
|
290
|
+
const writeDependencies = yield* Ref.get(writesRef);
|
|
291
|
+
yield* invCache(input, Exit.succeed(lastValue), serverKeys, writeDependencies);
|
|
292
|
+
})));
|
|
293
|
+
});
|
|
294
|
+
return (i) => Stream.unwrap(makeInvocationEffect(i, self.handler(i)));
|
|
295
|
+
};
|
|
296
|
+
};
|
|
297
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXV0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL211dGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUF3QiwwQkFBMEIsRUFBRSwyQkFBMkIsRUFBRSxZQUFZLEVBQVksTUFBTSxtQkFBbUIsQ0FBQTtBQUczSixPQUFPLEtBQUssTUFBTSxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssTUFBTSxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUV0RCxPQUFPLEtBQUssSUFBSSxNQUFNLGFBQWEsQ0FBQTtBQUNuQyxPQUFPLEtBQUssV0FBVyxNQUFNLCtCQUErQixDQUFBO0FBRTVELE9BQU8sS0FBSyxHQUFHLE1BQU0sWUFBWSxDQUFBO0FBQ2pDLE9BQU8sS0FBSyxNQUFNLE1BQU0sZUFBZSxDQUFBO0FBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQW9CLFVBQVUsRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUM1RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDbkUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHlCQUF5QixFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDL0YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sVUFBVSxDQUFBO0FBSTdDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUNuRCxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDM0IsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVB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
|
package/dist/query.d.ts
CHANGED
|
@@ -1,63 +1,180 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { type Context, Effect } from "effect-app";
|
|
1
|
+
import { injectRegistry } from "@effect/atom-vue";
|
|
3
2
|
import { type Req } from "effect-app/client";
|
|
4
|
-
import type {
|
|
5
|
-
import { CauseException } from "effect-app/client/errors";
|
|
6
|
-
import * as
|
|
3
|
+
import type { RequestHandlerWithInput, RequestStreamHandlerWithInput } from "effect-app/client/clientFor";
|
|
4
|
+
import { type CauseException } from "effect-app/client/errors";
|
|
5
|
+
import type * as Context from "effect-app/Context";
|
|
6
|
+
import * as Effect from "effect-app/Effect";
|
|
7
|
+
import * as Option from "effect-app/Option";
|
|
8
|
+
import type * as Cause from "effect/Cause";
|
|
9
|
+
import * as AsyncResult from "effect/reactivity/AsyncResult";
|
|
10
|
+
import * as Atom from "effect/reactivity/Atom";
|
|
7
11
|
import { type ComputedRef, type MaybeRefOrGetter, type WatchSource } from "vue";
|
|
8
|
-
|
|
9
|
-
|
|
12
|
+
import { type AtomClientRuntime } from "./atomQuery.js";
|
|
13
|
+
import type { QueryInvalidationMode } from "./dependencyMetadata.js";
|
|
14
|
+
import type { LiveQueryOptions } from "./liveQueryInvalidation.js";
|
|
15
|
+
type DefaultError = Error;
|
|
16
|
+
type QueryKey = ReadonlyArray<unknown>;
|
|
17
|
+
/** Options accepted by `refetch()` — kept for source compatibility; the atom path ignores them. */
|
|
18
|
+
export interface RefetchOptions {
|
|
19
|
+
readonly cancelRefetch?: boolean;
|
|
20
|
+
readonly throwOnError?: boolean;
|
|
21
|
+
}
|
|
22
|
+
/** The 4th tuple element: private atom/registry handle for client helpers. */
|
|
23
|
+
export interface QueryHandle<A = unknown, E = unknown> {
|
|
24
|
+
readonly awaitResult: () => Effect.Effect<A, E, never>;
|
|
25
|
+
readonly refetch: () => Effect.Effect<A, E, never>;
|
|
26
|
+
readonly refresh: () => void;
|
|
27
|
+
readonly registry: ReturnType<typeof injectRegistry>;
|
|
28
|
+
readonly atom: ComputedRef<Atom.Atom<AsyncResult.AsyncResult<A, E>>>;
|
|
29
|
+
}
|
|
30
|
+
export interface QueryView<A, E> extends QueryHandle<A, E> {
|
|
31
|
+
readonly result: ComputedRef<AsyncResult.AsyncResult<A, E>>;
|
|
32
|
+
readonly data: ComputedRef<A | undefined>;
|
|
33
|
+
}
|
|
34
|
+
export interface QueryCacheUpdater {
|
|
35
|
+
readonly update: <I, A, E, R, Request extends Req, Name extends string>(registry: ReturnType<typeof injectRegistry>, query: RequestHandlerWithInput<I, A, E, R, Request, Name>, input: I, updater: (data: NoInfer<A>) => NoInfer<A>) => void;
|
|
36
|
+
}
|
|
37
|
+
export type UseQueryReturnType<A = any, E = any> = QueryHandle<A, E>;
|
|
38
|
+
export type UseQueryDefinedReturnType<A = any, E = any> = QueryHandle<A, E>;
|
|
39
|
+
export type QueryObserverResult<A = any, _E = any> = AsyncResult.AsyncResult<A, any>;
|
|
40
|
+
export type SuspenseQueryTuple<A, E> = readonly [
|
|
41
|
+
ComputedRef<AsyncResult.AsyncResult<A, E>>,
|
|
42
|
+
ComputedRef<A>,
|
|
43
|
+
(options?: RefetchOptions) => Effect.Effect<A, E, never>,
|
|
44
|
+
QueryHandle<A, E>
|
|
45
|
+
];
|
|
46
|
+
export type SuspenseQueryView<A, E> = Omit<QueryView<A, E>, "data"> & {
|
|
47
|
+
readonly data: ComputedRef<A>;
|
|
48
|
+
} & SuspenseQueryTuple<A, E>;
|
|
49
|
+
export type QueryAtomFamily<I, A, E> = (input: I) => Atom.Writable<AsyncResult.AsyncResult<A, E>, AsyncResult.AsyncResult<A, E>>;
|
|
50
|
+
export type StreamQueryAtomFamily<I, A, E> = (input: I) => Atom.Writable<Atom.PullResult<A, E>, void>;
|
|
51
|
+
export declare const atomQueryCacheUpdater: QueryCacheUpdater;
|
|
52
|
+
export declare const optionalAtomQueryCacheUpdater: QueryCacheUpdater;
|
|
53
|
+
export declare const combineQueryCacheUpdaters: (first: QueryCacheUpdater, second: QueryCacheUpdater) => QueryCacheUpdater;
|
|
54
|
+
export declare const setQueryCacheUpdater: (updater: QueryCacheUpdater) => void;
|
|
55
|
+
export interface CustomUseQueryOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> {
|
|
56
|
+
readonly enabled?: MaybeRefOrGetter<boolean | undefined>;
|
|
57
|
+
/** stale threshold in ms (or a Duration input) */
|
|
58
|
+
readonly staleTime?: number;
|
|
59
|
+
/** garbage-collect after idle, ms (or "infinity") */
|
|
60
|
+
readonly gcTime?: number | "infinity";
|
|
61
|
+
readonly refetchOnWindowFocus?: boolean;
|
|
62
|
+
readonly structuralSharing?: boolean;
|
|
63
|
+
/** poll: re-fetch every N ms (tanstack refetchInterval) */
|
|
64
|
+
readonly refetchInterval?: number;
|
|
65
|
+
readonly live?: boolean | LiveQueryOptions;
|
|
66
|
+
readonly invalidation?: QueryInvalidationMode;
|
|
67
|
+
readonly select?: (data: TQueryFnData) => TData;
|
|
68
|
+
/** accepted for source compatibility; not used by the atom engine */
|
|
69
|
+
readonly retry?: boolean | number;
|
|
70
|
+
readonly meta?: Record<string, unknown>;
|
|
71
|
+
readonly _phantom?: [TQueryData, TQueryKey, TError];
|
|
10
72
|
}
|
|
11
73
|
type NonFunctionGuard<T> = T extends Function ? never : T;
|
|
12
74
|
export interface CustomUndefinedInitialQueryOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> extends CustomUseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey> {
|
|
13
|
-
initialData?:
|
|
14
|
-
placeholderData?:
|
|
75
|
+
readonly initialData?: TQueryFnData | (() => TQueryFnData) | undefined;
|
|
76
|
+
readonly placeholderData?: NonFunctionGuard<TQueryData> | ((prev: TQueryData | undefined) => TQueryData) | undefined;
|
|
15
77
|
}
|
|
16
78
|
export interface CustomDefinedInitialQueryOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> extends CustomUseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey> {
|
|
17
|
-
initialData:
|
|
18
|
-
placeholderData?:
|
|
79
|
+
readonly initialData: TQueryFnData | (() => TQueryFnData);
|
|
80
|
+
readonly placeholderData?: NonFunctionGuard<TQueryData> | ((prev: TQueryData | undefined) => TQueryData) | undefined;
|
|
19
81
|
}
|
|
20
82
|
export interface CustomDefinedPlaceholderQueryOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> extends CustomUseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey> {
|
|
21
|
-
initialData?:
|
|
22
|
-
placeholderData: NonFunctionGuard<TQueryData> |
|
|
23
|
-
}
|
|
24
|
-
export
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
83
|
+
readonly initialData?: TQueryFnData | (() => TQueryFnData) | undefined;
|
|
84
|
+
readonly placeholderData: NonFunctionGuard<TQueryData> | ((prev: TQueryData | undefined) => TQueryData);
|
|
85
|
+
}
|
|
86
|
+
export interface AtomQueryNewOptions<TQueryFnData = unknown, TData = TQueryFnData> {
|
|
87
|
+
readonly enabled?: MaybeRefOrGetter<boolean | undefined>;
|
|
88
|
+
readonly staleTime?: number;
|
|
89
|
+
readonly idleTTL?: number | "infinity";
|
|
90
|
+
readonly gcTime?: number | "infinity";
|
|
91
|
+
readonly revalidateOnFocus?: boolean;
|
|
92
|
+
readonly refetchOnWindowFocus?: boolean;
|
|
93
|
+
readonly structuralSharing?: boolean;
|
|
94
|
+
readonly refreshEvery?: number;
|
|
95
|
+
readonly refetchInterval?: number;
|
|
96
|
+
readonly live?: boolean | LiveQueryOptions;
|
|
97
|
+
readonly invalidation?: QueryInvalidationMode;
|
|
98
|
+
readonly select?: (data: TQueryFnData) => TData;
|
|
99
|
+
}
|
|
100
|
+
export interface AtomStreamQueryOptions {
|
|
101
|
+
readonly staleTime?: number;
|
|
102
|
+
readonly idleTTL?: number | "infinity";
|
|
103
|
+
readonly gcTime?: number | "infinity";
|
|
104
|
+
readonly revalidateOnFocus?: boolean;
|
|
105
|
+
readonly refetchOnWindowFocus?: boolean;
|
|
106
|
+
readonly refreshEvery?: number;
|
|
107
|
+
readonly live?: boolean | LiveQueryOptions;
|
|
108
|
+
readonly refetchInterval?: number;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Layer TanStack `initialData` / `placeholderData` over a raw query result as a DISPLAY fallback.
|
|
112
|
+
* Only while the result is still `Initial` (pending, never settled): show `initialData` as resolved
|
|
113
|
+
* data, or `placeholderData` as provisional (`waiting: true`). Once real data exists the seed is
|
|
114
|
+
* dropped. Failures are never masked — including failures without `previousSuccess` (where
|
|
115
|
+
* `AsyncResult.value` is empty). `placeholderData` in function form receives the last seen concrete
|
|
116
|
+
* value for basic keep-previous across input changes. Returns the raw ref untouched when neither
|
|
117
|
+
* option is set. Neither value is written to the atom cache.
|
|
118
|
+
*/
|
|
119
|
+
export declare const withDataFallback: <A, E>(rawResult: {
|
|
120
|
+
readonly value: AsyncResult.AsyncResult<A, E>;
|
|
121
|
+
}, options?: unknown) => ComputedRef<AsyncResult.AsyncResult<A, E>>;
|
|
122
|
+
export declare const useAtomQuery: <A, E>(atom: () => Atom.Atom<AsyncResult.AsyncResult<A, E>>) => QueryView<A, E>;
|
|
123
|
+
export declare const useAtomSuspense: <A, E>(atom: () => Atom.Atom<AsyncResult.AsyncResult<A, E>>) => Promise<SuspenseQueryView<A, E>>;
|
|
124
|
+
export type StreamQueryPullValue<A> = {
|
|
125
|
+
readonly done: boolean;
|
|
126
|
+
readonly items: ReadonlyArray<A>;
|
|
127
|
+
};
|
|
128
|
+
export interface StreamQueryView<A, E> {
|
|
129
|
+
readonly result: ComputedRef<Atom.PullResult<A, E>>;
|
|
130
|
+
readonly items: ComputedRef<ReadonlyArray<A>>;
|
|
131
|
+
readonly latest: ComputedRef<A | undefined>;
|
|
132
|
+
readonly done: ComputedRef<boolean>;
|
|
133
|
+
readonly awaitResult: () => Effect.Effect<StreamQueryPullValue<A>, E | Cause.NoSuchElementError, never>;
|
|
134
|
+
readonly pull: () => void;
|
|
135
|
+
readonly pullAndAwait: () => Effect.Effect<StreamQueryPullValue<A>, E | Cause.NoSuchElementError, never>;
|
|
136
|
+
readonly refresh: () => void;
|
|
137
|
+
readonly registry: ReturnType<typeof injectRegistry>;
|
|
138
|
+
readonly atom: ComputedRef<Atom.Writable<Atom.PullResult<A, E>, void>>;
|
|
139
|
+
}
|
|
140
|
+
export declare const useAtomStreamQuery: <A, E>(atom: () => Atom.Writable<Atom.PullResult<A, E>, void>) => StreamQueryView<A, E>;
|
|
141
|
+
export declare const makeQueryFamily: <R>(_getRuntime: () => Context.Context<R>, getAtomRt: () => AtomClientRuntime) => <I, E, A, Request extends Req, Name extends string>(q: RequestHandlerWithInput<I, A, E, R, Request, Name>) => QueryAtomFamily<I, A, E>;
|
|
142
|
+
export declare const makeQueryAtom: <R>(_getRuntime: () => Context.Context<R>, getAtomRt: () => AtomClientRuntime) => <I, E, A, Request extends Req, Name extends string>(q: RequestHandlerWithInput<I, A, E, R, Request, Name>) => {
|
|
143
|
+
<TData = A>(arg: I, options?: Omit<AtomQueryNewOptions<A, TData>, "select">): Atom.Atom<AsyncResult.AsyncResult<A, E>>;
|
|
144
|
+
};
|
|
145
|
+
export declare const makeQueryNew: <R>(_getRuntime: () => Context.Context<R>, getAtomRt: () => AtomClientRuntime) => <I, E, A, Request extends Req, Name extends string>(q: RequestHandlerWithInput<I, A, E, R, Request, Name>) => {
|
|
146
|
+
<TData = A>(arg: WatchSource<Option.Option<I>>, options: Omit<AtomQueryNewOptions<A, TData>, "enabled"> & {
|
|
147
|
+
mode: "optional";
|
|
148
|
+
}): QueryView<TData, E>;
|
|
149
|
+
<TData = A>(arg: I | WatchSource<I> | undefined, options?: AtomQueryNewOptions<A, TData>): QueryView<TData, E>;
|
|
150
|
+
};
|
|
151
|
+
export declare const makeQuery: <R>(_getRuntime: () => Context.Context<R>, getAtomRt: () => AtomClientRuntime) => <I, E, A, Request extends Req, Name extends string>(self: RequestHandlerWithInput<I, A, E, R, Request, Name>) => {
|
|
152
|
+
<TData = A>(arg: WatchSource<Option.Option<I>>, options: Omit<CustomUndefinedInitialQueryOptions<A, CauseException<E>, TData>, "enabled"> & {
|
|
153
|
+
mode: "optional";
|
|
154
|
+
}): readonly [ComputedRef<AsyncResult.AsyncResult<TData, E>>, ComputedRef<TData | undefined>, (options?: RefetchOptions) => Effect.Effect<QueryObserverResult<TData, CauseException<E>>>, UseQueryReturnType<any, any>];
|
|
155
|
+
<TData = A>(arg: I | WatchSource<I>, options: CustomDefinedInitialQueryOptions<A, CauseException<E>, TData>): readonly [ComputedRef<AsyncResult.AsyncResult<TData, E>>, ComputedRef<TData>, (options?: RefetchOptions) => Effect.Effect<QueryObserverResult<TData, CauseException<E>>>, UseQueryReturnType<any, any>];
|
|
156
|
+
<TData = A>(arg: I | WatchSource<I>, options: CustomDefinedPlaceholderQueryOptions<A, CauseException<E>, TData>): readonly [ComputedRef<AsyncResult.AsyncResult<TData, E>>, ComputedRef<TData>, (options?: RefetchOptions) => Effect.Effect<QueryObserverResult<TData, CauseException<E>>>, UseQueryReturnType<any, any>];
|
|
157
|
+
<TData = A>(arg: I | WatchSource<I>, options?: CustomUndefinedInitialQueryOptions<A, CauseException<E>, TData>): readonly [ComputedRef<AsyncResult.AsyncResult<TData, E>>, ComputedRef<TData | undefined>, (options?: RefetchOptions) => Effect.Effect<QueryObserverResult<TData, CauseException<E>>>, UseQueryReturnType<any, any>];
|
|
50
158
|
};
|
|
51
159
|
export interface MakeQuery2<R> extends ReturnType<typeof makeQuery<R>> {
|
|
52
160
|
}
|
|
161
|
+
export declare const makeStreamQueryFamily: <R>(_getRuntime: () => Context.Context<R>, getAtomRt: () => AtomClientRuntime) => <I, E, A, Request extends Req, Name extends string>(q: RequestStreamHandlerWithInput<I, A, E, R, Request, Name>) => StreamQueryAtomFamily<I, A, E>;
|
|
162
|
+
export declare const makeStreamQueryAtom: <R>(_getRuntime: () => Context.Context<R>, getAtomRt: () => AtomClientRuntime) => <I, E, A, Request extends Req, Name extends string>(q: RequestStreamHandlerWithInput<I, A, E, R, Request, Name>) => (arg: I, options?: AtomStreamQueryOptions) => Atom.Writable<Atom.PullResult<A, E>, void>;
|
|
163
|
+
export declare const makeStreamQueryNew: <R>(_getRuntime: () => Context.Context<R>, getAtomRt: () => AtomClientRuntime) => <I, E, A, Request extends Req, Name extends string>(q: RequestStreamHandlerWithInput<I, A, E, R, Request, Name>) => (arg: MaybeRefOrGetter<I>, options?: AtomStreamQueryOptions) => StreamQueryView<A, E>;
|
|
164
|
+
type StreamQueryResult<A, E> = readonly [
|
|
165
|
+
ComputedRef<AsyncResult.AsyncResult<A[], E>>,
|
|
166
|
+
ComputedRef<A[] | undefined>,
|
|
167
|
+
(options?: RefetchOptions) => Effect.Effect<QueryObserverResult<A[], CauseException<E>>>,
|
|
168
|
+
UseQueryReturnType<any, any>
|
|
169
|
+
];
|
|
170
|
+
export declare const makeStreamQuery: <R>(getRuntime: () => Context.Context<R>, getAtomRt: () => AtomClientRuntime) => <I, E, A, Request extends Req, Name extends string>(q: RequestStreamHandlerWithInput<I, A, E, R, Request, Name>) => (arg: I | WatchSource<I>) => StreamQueryResult<A, E>;
|
|
171
|
+
export interface MakeStreamQuery2<R> extends ReturnType<typeof makeStreamQuery<R>> {
|
|
172
|
+
}
|
|
53
173
|
export declare function composeQueries<R extends Record<string, AsyncResult.AsyncResult<any, any>>>(results: R, renderPreviousOnFailure?: boolean): AsyncResult.AsyncResult<{
|
|
54
174
|
[Property in keyof R]: R[Property] extends AsyncResult.AsyncResult<infer A, any> ? A : never;
|
|
55
175
|
}, {
|
|
56
176
|
[Property in keyof R]: R[Property] extends AsyncResult.AsyncResult<any, infer E> ? E : never;
|
|
57
177
|
}[keyof R]>;
|
|
58
|
-
export declare const useUpdateQuery: () =>
|
|
59
|
-
<A>(query: RequestHandler<A, any, any, any, any>, updater: (data: NoInfer<A>) => NoInfer<A>): void;
|
|
60
|
-
<I, A>(query: RequestHandlerWithInput<I, A, any, any, any, any>, input: I, updater: (data: NoInfer<A>) => NoInfer<A>): void;
|
|
61
|
-
};
|
|
178
|
+
export declare const useUpdateQuery: () => <I, A, E, R, Request extends Req, Name extends string>(query: RequestHandlerWithInput<I, A, E, R, Request, Name>, input: I, updater: (data: NoInfer<A>) => NoInfer<A>) => void;
|
|
62
179
|
export {};
|
|
63
180
|
//# sourceMappingURL=query.d.ts.map
|