@effect-app/vue 4.0.0-beta.98 → 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.
Files changed (128) hide show
  1. package/CHANGELOG.md +2707 -0
  2. package/dist/atomQuery.d.ts +120 -0
  3. package/dist/atomQuery.d.ts.map +1 -0
  4. package/dist/atomQuery.js +434 -0
  5. package/dist/commander.d.ts +318 -43
  6. package/dist/commander.d.ts.map +1 -1
  7. package/dist/commander.js +593 -81
  8. package/dist/confirm.d.ts +5 -3
  9. package/dist/confirm.d.ts.map +1 -1
  10. package/dist/confirm.js +12 -14
  11. package/dist/dependencyMetadata.d.ts +18 -0
  12. package/dist/dependencyMetadata.d.ts.map +1 -0
  13. package/dist/dependencyMetadata.js +67 -0
  14. package/dist/errorReporter.d.ts +6 -4
  15. package/dist/errorReporter.d.ts.map +1 -1
  16. package/dist/errorReporter.js +14 -19
  17. package/dist/form.d.ts +5 -5
  18. package/dist/form.d.ts.map +1 -1
  19. package/dist/form.js +16 -10
  20. package/dist/internal/tanstackQuery.d.ts +9 -0
  21. package/dist/internal/tanstackQuery.d.ts.map +1 -0
  22. package/dist/internal/tanstackQuery.js +204 -0
  23. package/dist/intl.d.ts +4 -4
  24. package/dist/intl.d.ts.map +1 -1
  25. package/dist/intl.js +2 -2
  26. package/dist/lib.d.ts +8 -10
  27. package/dist/lib.d.ts.map +1 -1
  28. package/dist/lib.js +37 -12
  29. package/dist/liveQueryInvalidation.d.ts +16 -0
  30. package/dist/liveQueryInvalidation.d.ts.map +1 -0
  31. package/dist/liveQueryInvalidation.js +115 -0
  32. package/dist/makeClient.d.ts +232 -109
  33. package/dist/makeClient.d.ts.map +1 -1
  34. package/dist/makeClient.js +416 -84
  35. package/dist/makeContext.d.ts.map +1 -1
  36. package/dist/makeIntl.d.ts.map +1 -1
  37. package/dist/makeUseCommand.d.ts +3 -2
  38. package/dist/makeUseCommand.d.ts.map +1 -1
  39. package/dist/makeUseCommand.js +2 -2
  40. package/dist/mutate.d.ts +110 -41
  41. package/dist/mutate.d.ts.map +1 -1
  42. package/dist/mutate.js +236 -59
  43. package/dist/query.d.ts +161 -44
  44. package/dist/query.d.ts.map +1 -1
  45. package/dist/query.js +382 -113
  46. package/dist/queryLifetime.d.ts +25 -0
  47. package/dist/queryLifetime.d.ts.map +1 -0
  48. package/dist/queryLifetime.js +54 -0
  49. package/dist/routeParams.d.ts +4 -4
  50. package/dist/routeParams.d.ts.map +1 -1
  51. package/dist/routeParams.js +4 -3
  52. package/dist/runtime.d.ts +1 -17
  53. package/dist/runtime.d.ts.map +1 -1
  54. package/dist/runtime.js +2 -38
  55. package/dist/suspense.d.ts +19 -0
  56. package/dist/suspense.d.ts.map +1 -0
  57. package/dist/suspense.js +38 -0
  58. package/dist/toast.d.ts +1 -45
  59. package/dist/toast.d.ts.map +1 -1
  60. package/dist/toast.js +2 -32
  61. package/dist/withToast.d.ts +1 -24
  62. package/dist/withToast.d.ts.map +1 -1
  63. package/dist/withToast.js +2 -45
  64. package/docs/atom-query-api-redesign.md +207 -0
  65. package/docs/mutation-command-atoms.md +40 -0
  66. package/docs/query-key-invalidation.md +107 -0
  67. package/examples/streamMutation.ts +72 -0
  68. package/package.json +35 -94
  69. package/src/atomQuery.ts +600 -0
  70. package/src/commander.ts +1064 -116
  71. package/src/confirm.ts +12 -14
  72. package/src/dependencyMetadata.ts +84 -0
  73. package/src/errorReporter.ts +65 -75
  74. package/src/form.ts +22 -15
  75. package/src/index.ts +7 -7
  76. package/src/internal/tanstackQuery.ts +308 -0
  77. package/src/intl.ts +2 -2
  78. package/src/lib.ts +51 -23
  79. package/src/liveQueryInvalidation.ts +138 -0
  80. package/src/makeClient.ts +972 -263
  81. package/src/makeIntl.ts +2 -2
  82. package/src/makeUseCommand.ts +8 -5
  83. package/src/mutate.ts +407 -154
  84. package/src/query.ts +758 -242
  85. package/src/queryLifetime.ts +74 -0
  86. package/src/routeParams.ts +7 -7
  87. package/src/runtime.ts +1 -54
  88. package/src/suspense.ts +43 -0
  89. package/src/toast.ts +1 -52
  90. package/src/withToast.ts +1 -99
  91. package/test/Mutation.test.ts +104 -17
  92. package/test/dependencyInvalidation.test.ts +444 -0
  93. package/test/dist/dependencyInvalidation.test.d.ts.map +1 -0
  94. package/test/dist/form.test.d.ts.map +1 -1
  95. package/test/dist/inactiveInvalidation.test.d.ts.map +1 -0
  96. package/test/dist/interrupt-refetch-repro.test.d.ts.map +1 -0
  97. package/test/dist/lib.test.d.ts.map +1 -0
  98. package/test/dist/liveQueryInvalidation.test.d.ts.map +1 -0
  99. package/test/dist/query-span.test.d.ts.map +1 -0
  100. package/test/dist/queryOptions.test.d.ts.map +1 -0
  101. package/test/dist/streamFinal.test.d.ts.map +1 -0
  102. package/test/dist/streamFn.test.d.ts.map +1 -0
  103. package/test/dist/stubs.d.ts +3681 -256
  104. package/test/dist/stubs.d.ts.map +1 -1
  105. package/test/dist/stubs.js +166 -25
  106. package/test/dist/suspense-regression.test.d.ts.map +1 -0
  107. package/test/dist/suspense.test.d.ts.map +1 -0
  108. package/test/form-validation-errors.test.ts +2 -1
  109. package/test/form.test.ts +2 -1
  110. package/test/inactiveInvalidation.test.ts +172 -0
  111. package/test/interrupt-refetch-repro.test.ts +625 -0
  112. package/test/lib.test.ts +240 -0
  113. package/test/liveQueryInvalidation.test.ts +108 -0
  114. package/test/makeClient.test.ts +414 -32
  115. package/test/query-span.test.ts +92 -0
  116. package/test/queryOptions.test.ts +88 -0
  117. package/test/streamFinal.test.ts +64 -0
  118. package/test/streamFn.test.ts +457 -0
  119. package/test/stubs.ts +194 -36
  120. package/test/suspense-regression.test.ts +168 -0
  121. package/test/suspense.test.ts +160 -0
  122. package/tsconfig.examples.json +20 -0
  123. package/tsconfig.json +9 -1
  124. package/tsconfig.src.json +34 -34
  125. package/tsconfig.test.json +2 -2
  126. package/vitest.config.ts +5 -5
  127. package/eslint.config.mjs +0 -24
  128. 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 { useQueryClient } from "@tanstack/vue-query";
3
- import { Effect, Option } from "effect-app";
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 AsyncResult from "effect/unstable/reactivity/AsyncResult";
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 { makeQueryKey } from "./lib.js";
8
- export const getQueryKey = (h) => {
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
- // TODO: more efficient invalidation, including args etc
50
- // return Effect.promise(() => queryClient.invalidateQueries({
51
- // predicate: (_) => nses.includes(_.queryKey.filter((_) => _.startsWith("$")).join("/"))
52
- // }))
53
- /*
54
- // const nses: string[] = []`
55
- // for (let i = 0; i < ns.length; i++) {
56
- // nses.push(ns.slice(0, i + 1).join("/"))
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 = Effect.isEffect(handler)
62
- ? Effect
63
- .sync(() => {
64
- state.value = AsyncResult.initial(true);
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
- export const invalidateQueries = (queryClient, self, options) => {
75
- const invalidateQueries = (filters, options) => Effect.currentSpan.pipe(Effect.orElseSucceed(() => null), Effect.flatMap((span) => Effect.promise(() => queryClient.invalidateQueries(filters, { ...options, updateMeta: { span } }))));
76
- const invalidateCache = Effect.suspend(() => {
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 (options) {
79
- const opts = options(queryKey, self.id);
80
- if (!opts.length) {
81
- return Effect.void;
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 Effect
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
- if (!queryKey)
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({ queryKey }), invalidateQueries({ queryKey }))
91
- .pipe(Effect.tap(
92
- // hand over control back to the event loop so that state can be updated..
93
- // TODO: should we do this in general on any mutation, regardless of invalidation?
94
- Effect.sleep(0)), Effect.withSpan("client.query.invalidation", {}, { captureStackTrace: false }));
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
- const useMutation = (self, options) => {
101
- const queryClient = useQueryClient();
102
- const handle = invalidateQueries(queryClient, self, options?.queryInvalidation);
103
- const handler = self.handler;
104
- const r = Effect.isEffect(handler) ? handle(handler) : (i) => handle(handler(i));
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
- // calling hooks in the body
110
- export const useMakeMutation = () => {
111
- const queryClient = useQueryClient();
112
- const useMutation = (self, options) => {
113
- const handle = invalidateQueries(queryClient, self, options?.queryInvalidation);
114
- const handler = self.handler;
115
- const r = Effect.isEffect(handler) ? handle(handler) : (i) => handle(handler(i));
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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXV0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL211dGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUF5RSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUMzSCxPQUFPLEVBQWMsTUFBTSxFQUFhLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUdsRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDM0MsT0FBTyxLQUFLLFdBQVcsTUFBTSx3Q0FBd0MsQ0FBQTtBQUNyRSxPQUFPLEVBQUUsUUFBUSxFQUFvQixVQUFVLEVBQUUsTUFBTSxLQUFLLENBQUE7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUV2QyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUE2QyxFQUFFLEVBQUU7SUFDM0UsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzNCLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUMvQyw2RkFBNkY7SUFDN0Ysb0ZBQW9GO0lBQ3BGLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNqRixJQUFJLENBQUMsQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZELE9B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
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXV0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL211dGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUF3QiwwQkFBMEIsRUFBRSwyQkFBMkIsRUFBRSxZQUFZLEVBQVksTUFBTSxtQkFBbUIsQ0FBQTtBQUczSixPQUFPLEtBQUssTUFBTSxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssTUFBTSxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUV0RCxPQUFPLEtBQUssSUFBSSxNQUFNLGFBQWEsQ0FBQTtBQUNuQyxPQUFPLEtBQUssV0FBVyxNQUFNLCtCQUErQixDQUFBO0FBRTVELE9BQU8sS0FBSyxHQUFHLE1BQU0sWUFBWSxDQUFBO0FBQ2pDLE9BQU8sS0FBSyxNQUFNLE1BQU0sZUFBZSxDQUFBO0FBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQW9CLFVBQVUsRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUM1RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDbkUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHlCQUF5QixFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDL0YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sVUFBVSxDQUFBO0FBSTdDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUNuRCxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDM0IsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQy9DLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNqRixJQUFJLENBQUMsQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZELE9BQU8sQ0FBQyxDQUFBO0FBQ1YsQ0FBQyxDQUFBO0FBRUQsSUFBSSxpQkFBaUIsR0FBZ0Isa0JBQWtCLENBQUE7QUFFdkQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxFQUEyQixFQUFFLEVBQUU7SUFDbkUsaUJBQWlCLEdBQUcsRUFBRSxJQUFJLGtCQUFrQixDQUFBO0FBQzlDLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFBO0FBRW5FLE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsY0FBNkM7SUFFN0MsUUFBUSxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNmLE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQTtRQUMvRSxDQUFDO1FBQ0QsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNmLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsSUFBSSxFQUFFLGNBQWMsQ0FBQyxLQUFLO2dCQUMxQixLQUFLLEVBQUUsU0FBUzthQUNqQixDQUFBO1FBQ0gsQ0FBQztRQUNELEtBQUssU0FBUyxFQUFFLENBQUM7WUFDZixPQUFPO2dCQUNMLE9BQU8sRUFBRSxLQUFLO2dCQUNkLElBQUksRUFBRSxTQUFTO2dCQUNmLEtBQUssRUFBRSxjQUFjLENBQUMsS0FBSzthQUM1QixDQUFBO1FBQ0gsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBUUQsTUFBTSxVQUFVLElBQUksQ0FBVSxJQUE0QjtJQUN4RCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBbUMsQ0FBQyxDQUFBO0lBRWpGLE1BQU0sT0FBTyxHQUFHLE1BQU07U0FDbkIsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNULE1BQU0sQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDbEQsQ0FBQyxDQUFDO1NBQ0QsSUFBSSxDQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQ3BCLE1BQU0sQ0FBQyxJQUFJLEVBQ1gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQ2hDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUMzRCxDQUFBO0lBRUgsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRTVGLE9BQU8sS0FBSyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUE7QUFDOUMsQ0FBQztBQW9CRCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBNEM7SUFDM0Usa0JBQWtCO0lBQ2xCLGNBQWM7Q0FDZixDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsQ0FDdEMsR0FBRyxZQUFnRCxFQUM5QixFQUFFLENBQUMsQ0FBQztJQUN6QixrQkFBa0IsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQzNCLE1BQU0sQ0FBQyxPQUFPLENBQ1osWUFBWSxFQUNaLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQ3JELEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQzVDO0lBQ0gsY0FBYyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDdkIsTUFBTSxDQUFDLE9BQU8sQ0FDWixZQUFZLEVBQ1osQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUNsRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxDQUM1QztDQUNKLENBQUMsQ0FBQTtBQUVGLE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBYyxFQUFnRCxFQUFFLENBQ2hGLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFBO0FBRTdDLE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBd0IsRUFBa0MsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7QUFFckcsTUFBTSxtQkFBbUIsR0FBRyxDQUMxQixLQUF3RCxFQUNwQixFQUFFO0lBQ3RDLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQTtJQUMzQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFBO0lBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUE7SUFDeEMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ3BDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7QUFDdkQsQ0FBQyxDQUFBO0FBeUNELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUN0QixPQUFrRCxFQUlsRCxFQUFFO0lBQ0YsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFnQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtJQUU5RSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBVSxFQUFFLEVBQUUsQ0FDNUIsTUFBTTtTQUNILElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDVCxLQUFLLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDekMsQ0FBQyxDQUFDO1NBQ0QsSUFBSSxDQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FDakMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUNuQixNQUFNLENBQUMsSUFBSSxFQUNYLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3BGLENBQ0YsQ0FBQyxDQUNILENBQUE7SUFFTCxPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFBO0FBQ2hELENBQUMsQ0FBQTtBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FDNUIsT0FBa0QsRUFDdUQsRUFBRTtJQUMzRyxNQUFNLEtBQUssR0FBRyxVQUFVLENBQWdDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBRTlFLE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBOEIsRUFBaUMsRUFBRSxDQUNsRixNQUFNO1NBQ0gsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNULEtBQUssQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN6QyxDQUFDLENBQUM7U0FDRCxJQUFJLENBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FDWixNQUFNLENBQUMsSUFBSSxDQUNULE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNmLEtBQUssQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUM3RCxDQUFDLENBQUMsQ0FDSCxFQUNELE1BQU0sQ0FBQyxJQUFJLEVBQ1gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ3RCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ2YsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUE7WUFDM0IsSUFBSSxXQUFXLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ25DLEtBQUssQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7WUFDdEUsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEtBQUssQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUMxQyxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixLQUFLLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQy9DLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FDSCxDQUNGLENBQ0YsQ0FDRixDQUFBO0lBRUwsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQVUsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUE7SUFFMUQsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtBQUNoRCxDQUFDLENBQUE7QUFFRCxNQUFNLG9CQUFvQixHQUFHLENBQzNCLElBQW9GLEVBQ3BGLGlCQUF1RSxFQUN2RSxnQkFBZ0QsRUFDaEQsRUFBRTtJQUNGLHdGQUF3RjtJQUN4RiwrREFBK0Q7SUFDL0QsMEZBQTBGO0lBQzFGLE1BQU0seUJBQXlCLEdBQUcsQ0FDaEMsS0FBYyxFQUNkLE1BQW1DLEVBQ0ksRUFBRTtRQUN6QyxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFbEMsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxHQUFrQyxFQUFFLENBQUE7WUFDOUMsS0FBSyxNQUFNLEtBQUssSUFBSSxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDeEUsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtvQkFDaEIsU0FBUTtnQkFDVixDQUFDO2dCQUNELElBQUksSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUE7b0JBQ3BHLFNBQVE7Z0JBQ1YsQ0FBQztnQkFDRCxNQUFNLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFDakQsSUFBSSxjQUFjLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7b0JBQ3pCLFNBQVE7Z0JBQ1YsQ0FBQztnQkFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDJFQUEyRSxDQUFDLENBQUE7WUFDOUYsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFBO1FBQ2IsQ0FBQztRQUVELHlGQUF5RjtRQUN6Riw4RkFBOEY7UUFDOUYsd0RBQXdEO1FBQ3hELE9BQU8sRUFBRSxDQUFBO0lBQ1gsQ0FBQyxDQUFBO0lBRUQsTUFBTSxlQUFlLEdBQUcsQ0FDdEIsS0FBYyxFQUNkLE1BQW1DLEVBQ25DLFVBQTBDLEVBQzFDLGlCQUFpQixHQUFzQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsRUFDL0UsRUFBRSxDQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO1FBQ2xCLElBQUksSUFBSSxDQUFDLHdCQUF3QjtZQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQTtRQUVyRCxNQUFNLFVBQVUsR0FBRyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDM0QsMEZBQTBGO1FBQzFGLGlGQUFpRjtRQUNqRixNQUFNLFdBQVcsR0FBRywwQkFBMEIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBQ2pFLHlGQUF5RjtRQUN6RixzRUFBc0U7UUFDdEUsTUFBTSxJQUFJLEdBQTBDLENBQUMsR0FBRyxVQUFVLEVBQUUsR0FBRyxVQUFVLEVBQUUsR0FBRyxXQUFXLENBQUMsQ0FBQTtRQUVsRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDO1lBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFBO1FBRXRELE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEdBQUcseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFL0QsT0FBTyxNQUFNO2FBQ1YsT0FBTyxDQUNOLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztZQUN6QixJQUFJO1lBQ0osU0FBUztZQUNULFFBQVE7WUFDUixVQUFVO1lBQ1YsVUFBVTtZQUNWLFdBQVc7WUFDWCxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLENBQUM7U0FDMUMsQ0FBQztRQUNGLG1GQUFtRjtRQUNuRixvREFBb0Q7UUFDcEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDbEIsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4QixLQUFLLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQ3RFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUMxQixrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQ3hGLEVBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUFDLENBQzlDLENBQUE7WUFDSCxDQUFDO1lBQ0QsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN6QixLQUFLLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUN2RCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQ0g7YUFDQSxJQUFJLENBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsK0JBQStCO1FBQzlELE1BQU0sQ0FBQyxRQUFRLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FDL0UsQ0FBQTtJQUNMLENBQUMsQ0FBQyxDQUFBO0lBRUosT0FBTyxlQUFlLENBQUE7QUFDeEIsQ0FBQyxDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FDL0IsSUFBb0YsRUFDcEYsT0FBd0MsRUFDeEMsZ0JBQWdELEVBQ2hELEVBQUU7SUFDRixNQUFNLGVBQWUsR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixDQUFDLENBQUE7SUFFaEcsTUFBTSxNQUFNLEdBQUcsT0FBTyxFQUFFLE1BQU0sQ0FBQTtJQUU5QixNQUFNLE1BQU0sR0FBRyxDQUFVLEdBQTJCLEVBQUUsS0FBZSxFQUFFLEVBQUUsQ0FDdkUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDbEIsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBaUMsRUFBRSxDQUFDLENBQUE7UUFDbkUsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQzFELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUMzRCxNQUFNLGtCQUFrQixHQUFHLGdCQUFnQixDQUFDLDBCQUEwQixDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUMzRixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUM1QixNQUFNLENBQUMsY0FBYyxDQUFDLDBCQUEwQixFQUFFLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQ3ZGLE1BQU0sQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQUUsa0JBQWtCLENBQUMsRUFDbEYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ3JCLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1lBQ2xCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDMUMsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQ25ELEtBQUssQ0FBQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFBO1FBQ3BFLENBQUMsQ0FBQyxDQUNILENBQ0YsQ0FBQTtRQUNELElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxPQUFPLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQy9CLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNyQixNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztnQkFDbEIsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtnQkFDMUMsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFBO2dCQUNuRCxLQUFLLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtZQUNwRSxDQUFDLENBQUMsQ0FDSCxDQUNGLENBQUE7UUFDSCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUE7SUFDZixDQUFDLENBQUMsQ0FBQTtJQUVKLE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQyxDQUFBO0FBYUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQWUsZ0JBQWdELEVBQUUsRUFBRTtJQUM3Rjs7OztPQUlHO0lBQ0gsTUFBTSxXQUFXLEdBQUcsQ0FDbEIsSUFBc0QsRUFDMUIsRUFBRTtRQUM5QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUksRUFBRSxPQUE2QixFQUFFLEVBQUUsQ0FDaEQsaUJBQWlCLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDeEUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQVEsQ0FBQTtJQUNqRCxDQUFDLENBQUE7SUFDRCxPQUFPLFdBQVcsQ0FBQTtBQUNwQixDQUFDLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBZSxnQkFBZ0QsRUFBRSxFQUFFO0lBQ2hHOzs7O09BSUc7SUFDSCxNQUFNLFdBQVcsR0FBRyxDQUNsQixJQUFzRCxFQUMxQixFQUFFO1FBQzlCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBSSxFQUFFLE9BQTZCLEVBQUUsRUFBRSxDQUNoRCxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUN4RSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBUSxDQUFBO0lBQ2pELENBQUMsQ0FBQTtJQUNELE9BQU8sV0FBVyxDQUFBO0FBQ3BCLENBQUMsQ0FBQTtBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFlLGdCQUFnRCxFQUFFLEVBQUU7SUFDcEcsT0FBTyxDQUNMLElBS0MsRUFDRCxrQkFBNkQsRUFDN0QsRUFBRTtRQUNGLE1BQU0sUUFBUSxHQUFHLG9CQUFvQixDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO1FBRWpGLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxLQUFjLEVBQUUsTUFBb0MsRUFBRSxFQUFFLENBQ3BGLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1lBQ2xCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQWlDLEVBQUUsQ0FBQyxDQUFBO1lBQ25FLG9GQUFvRjtZQUNwRixxRkFBcUY7WUFDckYsNkVBQTZFO1lBQzdFLE1BQU0sT0FBTyxHQUFHLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3BELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtZQUMxRCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7WUFDM0QsTUFBTSxrQkFBa0IsR0FBRyxnQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUE7WUFDM0YsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBTSxTQUFTLENBQUMsQ0FBQTtZQUMvQyxJQUFJLGtCQUFrQixHQUFHLEtBQUssQ0FBQTtZQUM5QixNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO2dCQUMzQyxJQUFJLGtCQUFrQjtvQkFBRSxPQUFNO2dCQUM5QixNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUE7Z0JBQ25ELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUM7b0JBQUUsT0FBTTtnQkFDM0Qsa0JBQWtCLEdBQUcsSUFBSSxDQUFBO2dCQUN6QixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUN6QyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxFQUFFLGlCQUFpQixDQUFDLENBQUE7WUFDeEUsQ0FBQyxDQUFDLENBQUE7WUFDRixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQ2hCLE1BQU0sQ0FBQyxjQUFjLENBQUMsMEJBQTBCLEVBQUUsT0FBTyxDQUFDLEVBQzFELE1BQU0sQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQUUsa0JBQWtCLENBQUMsRUFDbEYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFDdEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUNsQyxNQUFNLENBQUMsUUFBUSxDQUNiLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO2dCQUNsQixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUN6QyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUMxQyxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUE7Z0JBQ25ELEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtZQUNoRixDQUFDLENBQUMsQ0FDSCxDQUNGLENBQUE7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUVKLE9BQU8sQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzVFLENBQUMsQ0FBQTtBQUNILENBQUMsQ0FBQSJ9
package/dist/query.d.ts CHANGED
@@ -1,63 +1,180 @@
1
- import { type DefaultError, type Enabled, type InitialDataFunction, type NonUndefinedGuard, type PlaceholderDataFunction, type QueryKey, type QueryObserverOptions, type QueryObserverResult, type RefetchOptions, type UseQueryDefinedReturnType, type UseQueryReturnType } from "@tanstack/vue-query";
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 { RequestHandler, RequestHandlerWithInput } from "effect-app/client/clientFor";
5
- import { CauseException } from "effect-app/client/errors";
6
- import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
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
- export interface CustomUseQueryOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> extends Omit<QueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>, "queryKey" | "queryFn" | "initialData" | "enabled" | "placeholderData"> {
9
- enabled?: MaybeRefOrGetter<boolean | undefined> | (() => Enabled<TQueryFnData, TError, TQueryData, TQueryKey>);
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?: undefined | InitialDataFunction<NonUndefinedGuard<TQueryFnData>> | NonUndefinedGuard<TQueryFnData>;
14
- placeholderData?: undefined | NonFunctionGuard<TQueryData> | PlaceholderDataFunction<NonFunctionGuard<TQueryData>, TError, NonFunctionGuard<TQueryData>, TQueryKey>;
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: NonUndefinedGuard<TQueryFnData> | (() => NonUndefinedGuard<TQueryFnData>);
18
- placeholderData?: undefined | NonFunctionGuard<TQueryData> | PlaceholderDataFunction<NonFunctionGuard<TQueryData>, TError, NonFunctionGuard<TQueryData>, TQueryKey>;
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?: NonUndefinedGuard<TQueryFnData> | (() => NonUndefinedGuard<TQueryFnData>) | undefined;
22
- placeholderData: NonFunctionGuard<TQueryData> | PlaceholderDataFunction<NonFunctionGuard<TQueryData>, TError, NonFunctionGuard<TQueryData>, TQueryKey>;
23
- }
24
- export declare const makeQuery: <R>(getRuntime: () => Context.Context<R>) => {
25
- <E, A, Request extends Req, Name extends string>(self: RequestHandler<A, E, R, Request, Name>): {
26
- /**
27
- * Effect results are passed to the caller, including errors.
28
- */
29
- <TData = A>(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>];
30
- <TData = A>(options: CustomDefinedPlaceholderQueryOptions<A, E, TData>): readonly [ComputedRef<AsyncResult.AsyncResult<TData, E>>, ComputedRef<TData>, (options?: RefetchOptions) => Effect.Effect<QueryObserverResult<TData, CauseException<E>>, never, never>, UseQueryDefinedReturnType<TData, CauseException<E>>];
31
- /**
32
- * Effect results are passed to the caller, including errors.
33
- */
34
- <TData = A>(options?: CustomUndefinedInitialQueryOptions<A, CauseException<E>, TData>): readonly [ComputedRef<AsyncResult.AsyncResult<A, E>>, ComputedRef<A | undefined>, (options?: RefetchOptions) => Effect.Effect<QueryObserverResult<TData, CauseException<E>>>, UseQueryReturnType<any, any>];
35
- };
36
- <Arg, E, A_1, Request_1 extends Req, Name_1 extends string>(self: RequestHandlerWithInput<Arg, A_1, E, R, Request_1, Name_1>): {
37
- /**
38
- * Effect results are passed to the caller, including errors.
39
- */
40
- <TData = A_1>(arg: Arg | WatchSource<Arg>, options: CustomDefinedInitialQueryOptions<A_1, CauseException<E>, TData>): readonly [ComputedRef<AsyncResult.AsyncResult<TData, E>>, ComputedRef<TData>, (options?: RefetchOptions) => Effect.Effect<QueryObserverResult<TData, CauseException<E>>>, UseQueryReturnType<any, any>];
41
- /**
42
- * Effect results are passed to the caller, including errors.
43
- */
44
- <TData = A_1>(arg: Arg | WatchSource<Arg>, options: CustomDefinedPlaceholderQueryOptions<A_1, CauseException<E>, TData>): readonly [ComputedRef<AsyncResult.AsyncResult<TData, E>>, ComputedRef<TData>, (options?: RefetchOptions) => Effect.Effect<QueryObserverResult<TData, CauseException<E>>>, UseQueryReturnType<any, any>];
45
- /**
46
- * Effect results are passed to the caller, including errors.
47
- */
48
- <TData = A_1>(arg: Arg | WatchSource<Arg>, options?: CustomUndefinedInitialQueryOptions<A_1, CauseException<E>, TData>): readonly [ComputedRef<AsyncResult.AsyncResult<TData, E>>, ComputedRef<TData | undefined>, (options?: RefetchOptions) => Effect.Effect<QueryObserverResult<TData, CauseException<E>>>, UseQueryReturnType<any, any>];
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