@effect-app/vue 4.0.0-beta.28 → 4.0.0-beta.281
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 +2073 -0
- package/dist/atomQuery.d.ts +105 -0
- package/dist/atomQuery.d.ts.map +1 -0
- package/dist/atomQuery.js +283 -0
- package/dist/commander.d.ts +634 -0
- package/dist/commander.d.ts.map +1 -0
- package/dist/commander.js +1070 -0
- package/dist/{experimental/confirm.d.ts → confirm.d.ts} +6 -4
- package/dist/confirm.d.ts.map +1 -0
- package/dist/confirm.js +26 -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 +14 -5
- package/dist/form.d.ts.map +1 -1
- package/dist/form.js +46 -13
- package/dist/internal/tanstackQuery.d.ts +9 -0
- package/dist/internal/tanstackQuery.d.ts.map +1 -0
- package/dist/internal/tanstackQuery.js +163 -0
- package/dist/intl.d.ts +15 -0
- package/dist/intl.d.ts.map +1 -0
- package/dist/intl.js +9 -0
- package/dist/lib.d.ts +7 -9
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +35 -10
- package/dist/makeClient.d.ts +212 -336
- package/dist/makeClient.d.ts.map +1 -1
- package/dist/makeClient.js +399 -411
- package/dist/makeContext.d.ts.map +1 -1
- package/dist/makeIntl.d.ts.map +1 -1
- package/dist/{experimental/makeUseCommand.d.ts → makeUseCommand.d.ts} +4 -3
- package/dist/makeUseCommand.d.ts.map +1 -0
- package/dist/makeUseCommand.js +13 -0
- package/dist/mutate.d.ts +106 -40
- package/dist/mutate.d.ts.map +1 -1
- package/dist/mutate.js +187 -58
- package/dist/query.d.ts +139 -45
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +330 -122
- 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 -14
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +2 -26
- package/dist/suspense.d.ts +5 -0
- package/dist/suspense.d.ts.map +1 -0
- package/dist/suspense.js +12 -0
- package/dist/toast.d.ts +2 -0
- package/dist/toast.d.ts.map +1 -0
- package/dist/toast.js +2 -0
- package/dist/withToast.d.ts +2 -0
- package/dist/withToast.d.ts.map +1 -0
- package/dist/withToast.js +2 -0
- package/docs/atom-query-api-redesign.md +207 -0
- package/examples/streamMutation.ts +72 -0
- package/package.json +30 -94
- package/src/atomQuery.ts +381 -0
- package/src/commander.ts +3413 -0
- package/src/{experimental/confirm.ts → confirm.ts} +13 -15
- package/src/errorReporter.ts +65 -75
- package/src/form.ts +61 -18
- package/src/index.ts +7 -7
- package/src/internal/tanstackQuery.ts +250 -0
- package/src/intl.ts +12 -0
- package/src/lib.ts +49 -21
- package/src/makeClient.ts +941 -1159
- package/src/makeIntl.ts +2 -2
- package/src/{experimental/makeUseCommand.ts → makeUseCommand.ts} +9 -6
- package/src/mutate.ts +343 -151
- package/src/query.ts +688 -260
- package/src/routeParams.ts +7 -7
- package/src/runtime.ts +1 -31
- package/src/suspense.ts +17 -0
- package/src/toast.ts +1 -0
- package/src/withToast.ts +1 -0
- package/test/Mutation.test.ts +181 -24
- package/test/dist/form.test.d.ts.map +1 -1
- package/test/dist/lib.test.d.ts.map +1 -0
- package/test/dist/patchableQueryAtom.test.d.ts.map +1 -0
- package/test/dist/queryOptions.test.d.ts.map +1 -0
- package/test/dist/retrySchedule.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 +3697 -122
- package/test/dist/stubs.d.ts.map +1 -1
- package/test/dist/stubs.js +192 -32
- 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 +25 -20
- package/test/form.test.ts +22 -3
- package/test/lib.test.ts +240 -0
- package/test/makeClient.test.ts +437 -38
- package/test/streamFinal.test.ts +64 -0
- package/test/streamFn.test.ts +457 -0
- package/test/stubs.ts +228 -43
- package/test/suspense-regression.test.ts +115 -0
- package/test/suspense.test.ts +160 -0
- package/tsconfig.examples.json +20 -0
- package/tsconfig.json +3 -1
- package/tsconfig.src.json +34 -34
- package/tsconfig.test.json +2 -2
- package/vitest.config.ts +5 -5
- package/dist/experimental/commander.d.ts +0 -359
- package/dist/experimental/commander.d.ts.map +0 -1
- package/dist/experimental/commander.js +0 -557
- package/dist/experimental/confirm.d.ts.map +0 -1
- package/dist/experimental/confirm.js +0 -28
- package/dist/experimental/intl.d.ts +0 -16
- package/dist/experimental/intl.d.ts.map +0 -1
- package/dist/experimental/intl.js +0 -5
- package/dist/experimental/makeUseCommand.d.ts.map +0 -1
- package/dist/experimental/makeUseCommand.js +0 -13
- package/dist/experimental/toast.d.ts +0 -47
- package/dist/experimental/toast.d.ts.map +0 -1
- package/dist/experimental/toast.js +0 -41
- package/dist/experimental/withToast.d.ts +0 -25
- package/dist/experimental/withToast.d.ts.map +0 -1
- package/dist/experimental/withToast.js +0 -45
- package/eslint.config.mjs +0 -24
- package/src/experimental/commander.ts +0 -1835
- package/src/experimental/intl.ts +0 -9
- package/src/experimental/toast.ts +0 -66
- package/src/experimental/withToast.ts +0 -99
- package/tsconfig.json.bak +0 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"makeContext.d.ts","sourceRoot":"","sources":["../src/makeContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,YAAY,EAAW,MAAM,KAAK,CAAA;AAExD,eAAO,MAAM,WAAW,EAAE;IACxB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG;QACX,GAAG,EAAE,MAAM,CAAC,CAAA;QACZ,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAA;KAC7B,CAAA;IACD,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG;QACZ,GAAG,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;QACxB,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAA;KAC7B,CAAA;CAOF,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"makeContext.d.ts","sourceRoot":"","sources":["../src/makeContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,YAAY,EAAW,MAAM,KAAK,CAAA;AAExD,eAAO,MAAM,WAAW,EAAE;IACxB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG;QACX,GAAG,EAAE,MAAM,CAAC,CAAA;QACZ,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAA;KAC7B,CAAA;IACD,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG;QACZ,GAAG,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;QACxB,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAA;KAC7B,CAAA;CAOF,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,oBAMpD,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,CAAC;IAGhC,GAAG;IACH,OAAO,WAAW,CAAC;CAEtB,CAAA"}
|
package/dist/makeIntl.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"makeIntl.d.ts","sourceRoot":"","sources":["../src/makeIntl.ts"],"names":[],"mappings":"AACA,OAAO,EAA+B,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAEnJ,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,OAAO,IAAI,wBAAwB,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAC1H,OAAO,EAAE,KAAK,GAAG,EAAS,MAAM,KAAK,CAAA;AAIrC,MAAM,WAAW,cAAc,CAAC,MAAM,SAAS,MAAM,CAAE,SAAQ,UAAU,CAAC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;CAAG;AAGrG,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,MAAM,CAAE,SAAQ,kBAAkB,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;IACrF,UAAU,EAAE,UAAU,CAAA;CACvB;AAED,eAAO,MAAM,QAAQ,GAAI,MAAM,SAAS,MAAM,
|
|
1
|
+
{"version":3,"file":"makeIntl.d.ts","sourceRoot":"","sources":["../src/makeIntl.ts"],"names":[],"mappings":"AACA,OAAO,EAA+B,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAEnJ,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,OAAO,IAAI,wBAAwB,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAC1H,OAAO,EAAE,KAAK,GAAG,EAAS,MAAM,KAAK,CAAA;AAIrC,MAAM,WAAW,cAAc,CAAC,MAAM,SAAS,MAAM,CAAE,SAAQ,UAAU,CAAC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;CAAG;AAGrG,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,MAAM,CAAE,SAAQ,kBAAkB,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;IACrF,UAAU,EAAE,UAAU,CAAA;CACvB;AAED,eAAO,MAAM,QAAQ,GAAI,MAAM,SAAS,MAAM,YAClC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,aAErC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;;;oBAyBvB,MAAM,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,WAC1B,MAAM,CACb,MAAM,EACN,aAAa,GAAG,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CACnD;gCAgBoB,CACnB,UAAU,EAAE,iBAAiB,EAC7B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC3E,IAAI,CAAC,EAAE,wBAAwB,KAC5B,MAAM;uBAIqB,SAAS,CAAC,MAAM,CAAC;;;;;;CAKtD,CAAA"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as Effect from "effect-app/Effect";
|
|
2
|
+
import type * as Layer from "effect-app/Layer";
|
|
2
3
|
import { Commander, type CommanderImpl, CommanderStatic } from "./commander.js";
|
|
3
4
|
type X<X> = X;
|
|
4
|
-
export interface CommanderResolved<RT, RTHooks> extends X<typeof CommanderStatic>, Pick<CommanderImpl<RT, RTHooks>, "fn" | "wrap" | "alt" | "alt2"> {
|
|
5
|
+
export interface CommanderResolved<RT, RTHooks> extends X<typeof CommanderStatic>, Pick<CommanderImpl<RT, RTHooks>, "fn" | "wrap" | "streamWrap" | "streamFn" | "alt" | "alt2"> {
|
|
5
6
|
}
|
|
6
|
-
export declare const makeUseCommand: <R = never, RTHooks = never>(rtHooks: Layer.Layer<RTHooks, never, R>) => Effect.Effect<CommanderResolved<R, RTHooks>, never,
|
|
7
|
+
export declare const makeUseCommand: <R = never, RTHooks = never>(rtHooks: Layer.Layer<RTHooks, never, R>) => Effect.Effect<CommanderResolved<R, RTHooks>, never, R | Commander>;
|
|
7
8
|
export {};
|
|
8
9
|
//# sourceMappingURL=makeUseCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"makeUseCommand.d.ts","sourceRoot":"","sources":["../src/makeUseCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,KAAK,KAAK,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAE/E,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AAGb,MAAM,WAAW,iBAAiB,CAAC,EAAE,EAAE,OAAO,CAC5C,SACE,CAAC,CAAC,OAAO,eAAe,CAAC,EACzB,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,YAAY,GAAG,UAAU,GAAG,KAAK,GAAG,MAAM,CAAC;CAE/F;AAED,eAAO,MAAM,cAAc,GACf,CAAC,UAAU,OAAO,wHAa7B,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as Effect from "effect-app/Effect";
|
|
2
|
+
import { Commander, CommanderStatic } from "./commander.js";
|
|
3
|
+
export const makeUseCommand = Effect.fnUntraced(function* (rtHooks) {
|
|
4
|
+
const cmndr = yield* Commander;
|
|
5
|
+
const runtime = yield* Effect.context();
|
|
6
|
+
const comm = cmndr(runtime, rtHooks);
|
|
7
|
+
const command = {
|
|
8
|
+
...comm,
|
|
9
|
+
...CommanderStatic
|
|
10
|
+
};
|
|
11
|
+
return command;
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZVVzZUNvbW1hbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbWFrZVVzZUNvbW1hbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQTtBQUUzQyxPQUFPLEVBQUUsU0FBUyxFQUFzQixlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQVkvRSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FDN0MsUUFBUSxDQUFDLEVBQTZCLE9BQXVDO0lBQzNFLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUM5QixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFLLENBQUE7SUFFMUMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUVwQyxNQUFNLE9BQU8sR0FBa0M7UUFDN0MsR0FBRyxJQUFJO1FBQ1AsR0FBRyxlQUFlO0tBQ25CLENBQUE7SUFFRCxPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDLENBQ0YsQ0FBQSJ9
|
package/dist/mutate.d.ts
CHANGED
|
@@ -1,62 +1,128 @@
|
|
|
1
|
-
import { type InvalidateOptions, type InvalidateQueryFilters, type QueryClient } from "@tanstack/vue-query";
|
|
2
|
-
import { type Cause, Effect, type Exit } from "effect-app";
|
|
3
1
|
import { type Req } from "effect-app/client";
|
|
4
|
-
import type { ClientForOptions,
|
|
2
|
+
import type { ClientForOptions, RequestHandlerWithInput } from "effect-app/client/clientFor";
|
|
3
|
+
import type { InvalidateQueryInstruction } from "effect-app/client/makeClient";
|
|
4
|
+
import * as Effect from "effect-app/Effect";
|
|
5
|
+
import type * as Cause from "effect/Cause";
|
|
6
|
+
import * as Exit from "effect/Exit";
|
|
7
|
+
import * as Stream from "effect/Stream";
|
|
5
8
|
import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
|
|
9
|
+
import type * as Reactivity from "effect/unstable/reactivity/Reactivity";
|
|
6
10
|
import { type ComputedRef } from "vue";
|
|
7
|
-
export
|
|
11
|
+
export type GetQueryKey = (h: {
|
|
8
12
|
id: string;
|
|
9
13
|
options?: ClientForOptions;
|
|
10
14
|
}) => string[];
|
|
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 declare const defaultGetQueryKey: GetQueryKey;
|
|
21
|
+
/**
|
|
22
|
+
* Override the default query-key heuristic used by mutations for cache
|
|
23
|
+
* invalidation. Call once at app bootstrap. Pass `undefined` to restore the
|
|
24
|
+
* built-in default.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* // invalidate the full namespace of the action (no parent collapse)
|
|
29
|
+
* setDefaultGetQueryKey((h) => {
|
|
30
|
+
* const key = makeQueryKey(h)
|
|
31
|
+
* const ns = key.filter((_) => _.startsWith("$"))
|
|
32
|
+
* if (!ns.length) throw new Error("empty query key for: " + h.id)
|
|
33
|
+
* return ns
|
|
34
|
+
* })
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare const setDefaultGetQueryKey: (fn: GetQueryKey | undefined) => void;
|
|
38
|
+
export declare const getQueryKey: GetQueryKey;
|
|
11
39
|
export declare function mutationResultToVue<A, E>(mutationResult: AsyncResult.AsyncResult<A, E>): Res<A, E>;
|
|
12
40
|
export interface Res<A, E> {
|
|
13
41
|
readonly loading: boolean;
|
|
14
42
|
readonly data: A | undefined;
|
|
15
43
|
readonly error: Cause.Cause<E> | undefined;
|
|
16
44
|
}
|
|
17
|
-
export declare function make<A, E, R>(self: Effect.Effect<A, E, R>): readonly [import("vue").ShallowRef<AsyncResult.AsyncResult<A, E>, AsyncResult.AsyncResult<A, E>>, ComputedRef<A | undefined>, Effect.Effect<AsyncResult.
|
|
18
|
-
|
|
45
|
+
export declare function make<A, E, R>(self: Effect.Effect<A, E, R>): readonly [import("vue").ShallowRef<AsyncResult.AsyncResult<A, E>, AsyncResult.AsyncResult<A, E>>, ComputedRef<A | undefined>, Effect.Effect<AsyncResult.Failure<A, E> | AsyncResult.Success<A, E>, never, R>];
|
|
46
|
+
/**
|
|
47
|
+
* An entry for `queryInvalidation`: a raw query key, an `{ id }` handler ref, or a
|
|
48
|
+
* `{ filters }` shape. The atom engine acts on entries that carry a concrete query
|
|
49
|
+
* key: raw arrays, handler refs, or `{ filters: { queryKey } }`. Predicate-only
|
|
50
|
+
* filters have no exact-key reactivity equivalent and fail fast.
|
|
51
|
+
*/
|
|
52
|
+
export type QueryKeyInvalidationFilters = {
|
|
53
|
+
readonly queryKey: ReadonlyArray<unknown>;
|
|
54
|
+
};
|
|
55
|
+
export type InvalidationEntry = InvalidateQueryInstruction<QueryKeyInvalidationFilters>;
|
|
56
|
+
export type QueryInvalidationEffect<R = never> = (keys: ReadonlyArray<ReadonlyArray<unknown>>) => Effect.Effect<void, never, R>;
|
|
57
|
+
export interface QueryInvalidator<R = never> {
|
|
58
|
+
readonly invalidateAndAwait: QueryInvalidationEffect<R>;
|
|
59
|
+
}
|
|
60
|
+
export declare const atomQueryInvalidator: QueryInvalidator<Reactivity.Reactivity>;
|
|
61
|
+
export declare const combineQueryInvalidators: <R>(...invalidators: ReadonlyArray<QueryInvalidator<R>>) => QueryInvalidator<R>;
|
|
62
|
+
export interface MutationOptionsBase<A = unknown, B = A, E2 = never, R2 = never> {
|
|
19
63
|
/**
|
|
20
64
|
* By default we invalidate one level of the query key, e.g $project/$configuration.get, we invalidate $project.
|
|
21
|
-
* This can be overridden by providing a function that returns an array of filters and options
|
|
65
|
+
* This can be overridden by providing a function that returns an array of filters and options,
|
|
66
|
+
* or RPC handlers directly (their query keys are derived automatically).
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* queryInvalidation: (queryKey) => [
|
|
71
|
+
* { filters: { queryKey } },
|
|
72
|
+
* GetMe,
|
|
73
|
+
* PackListIndex
|
|
74
|
+
* ]
|
|
75
|
+
* ```
|
|
22
76
|
*/
|
|
23
|
-
queryInvalidation?: (defaultKey: string[], name: string) =>
|
|
24
|
-
filters?: InvalidateQueryFilters | undefined;
|
|
25
|
-
options?: InvalidateOptions | undefined;
|
|
26
|
-
}[];
|
|
27
|
-
}
|
|
28
|
-
/** @deprecated prefer more basic @see MutationOptionsBase and separate useMutation from Command.fn */
|
|
29
|
-
export interface MutationOptions<A, E, R, A2 = A, E2 = E, R2 = R, I = void> extends MutationOptionsBase {
|
|
77
|
+
queryInvalidation?: (defaultKey: string[], name: string, input?: unknown, output?: Exit.Exit<unknown, unknown>) => InvalidationEntry[];
|
|
30
78
|
/**
|
|
31
|
-
*
|
|
32
|
-
*
|
|
79
|
+
* Run an additional Effect after the mutation succeeds. Its output becomes the
|
|
80
|
+
* final result returned to the caller. Query cache is invalidated once on
|
|
81
|
+
* mutation exit and again after this Effect completes. Useful for long-running
|
|
82
|
+
* operations (e.g. polling a background job) where you want the caller to
|
|
83
|
+
* receive the downstream result and the cache to refresh once it is ready.
|
|
33
84
|
*
|
|
34
|
-
* @
|
|
85
|
+
* @example
|
|
86
|
+
* ```ts
|
|
87
|
+
* useMutation(startExportCommand, {
|
|
88
|
+
* select: (result) => pollUntilDone(result.jobId)
|
|
89
|
+
* // caller receives the pollUntilDone output, not the original result
|
|
90
|
+
* })
|
|
91
|
+
* ```
|
|
35
92
|
*/
|
|
36
|
-
|
|
93
|
+
select?: (result: A) => Effect.Effect<B, E2, R2>;
|
|
37
94
|
}
|
|
38
|
-
export declare const asResult:
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
95
|
+
export declare const asResult: <Args extends readonly any[], A, E, R>(handler: (...args: Args) => Effect.Effect<A, E, R>) => readonly [ComputedRef<AsyncResult.AsyncResult<A, E>>, (...args: Args) => Effect.Effect<Exit.Exit<A, E>, never, R>];
|
|
96
|
+
/**
|
|
97
|
+
* Like `asResult`, but for streams. The ref is updated with each emitted value
|
|
98
|
+
* (keeping `waiting: true`) and is finalised (with `waiting: false`) once the
|
|
99
|
+
* stream terminates successfully. Errors are surfaced as `AsyncResult.failure`.
|
|
100
|
+
*/
|
|
101
|
+
export declare const asStreamResult: <Args extends readonly any[], A, E, R>(handler: (...args: Args) => Stream.Stream<A, E, R>) => readonly [ComputedRef<AsyncResult.AsyncResult<A, E>>, (...args: Args) => Effect.Effect<void, never, R>];
|
|
102
|
+
export declare const invalidateQueries: <RInvalidator>(self: {
|
|
43
103
|
id: string;
|
|
44
104
|
options?: ClientForOptions;
|
|
45
|
-
}, options
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
<
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
export declare const useMakeMutation: () =>
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
105
|
+
}, options: MutationOptionsBase | undefined, queryInvalidator: QueryInvalidator<RInvalidator>) => <A, E, R>(eff: Effect.Effect<A, E, R>, input?: unknown) => Effect.Effect<unknown, E, Exclude<R, never> | Exclude<RInvalidator, import("effect/Tracer").ParentSpan>>;
|
|
106
|
+
/**
|
|
107
|
+
* A callable mutation result. When `I = void` the input argument may be omitted.
|
|
108
|
+
*/
|
|
109
|
+
export interface MutationFn<I, A, E, R, Id extends string> {
|
|
110
|
+
<B = A, E2 = never, R2 = never>(input: I, options?: MutationOptionsBase<A, B, E2, R2>): Effect.Effect<B, E | E2, R | R2>;
|
|
111
|
+
readonly id: Id;
|
|
112
|
+
}
|
|
113
|
+
export declare const makeMutation: <RInvalidator>(queryInvalidator: QueryInvalidator<RInvalidator>) => <I, E, A, R, Request extends Req, Id extends string>(self: RequestHandlerWithInput<I, A, E, R, Request, Id>) => MutationFn<I, A, E, R, Id>;
|
|
114
|
+
export declare const useMakeMutation: <RInvalidator>(queryInvalidator: QueryInvalidator<RInvalidator>) => <I, E, A, R, Request extends Req, Id extends string>(self: RequestHandlerWithInput<I, A, E, R, Request, Id>) => MutationFn<I, A, E, R, Id>;
|
|
115
|
+
/**
|
|
116
|
+
* Returns a stream-based mutation factory for use with `streamFn`.
|
|
117
|
+
* The outer Effect sets up per-invocation invalidation scaffolding
|
|
118
|
+
* and returns a stream that triggers query invalidation via `Stream.ensuring` when it completes.
|
|
119
|
+
*
|
|
120
|
+
* Use with `streamFn` / `Command.streamFn(id)(mutateHandler, ...combinators)` so that
|
|
121
|
+
* the command manages its own reactive state internally.
|
|
122
|
+
*/
|
|
123
|
+
export declare const makeStreamMutation2: <RInvalidator>(queryInvalidator: QueryInvalidator<RInvalidator>) => (self: {
|
|
124
|
+
id: string;
|
|
125
|
+
options?: ClientForOptions;
|
|
126
|
+
handler: (i: any) => Stream.Stream<any, any, any>;
|
|
127
|
+
}, mergedInvalidation?: MutationOptionsBase["queryInvalidation"]) => (i: any) => Stream.Stream<any, any, any>;
|
|
62
128
|
//# sourceMappingURL=mutate.d.ts.map
|
package/dist/mutate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutate.d.ts","sourceRoot":"","sources":["../src/mutate.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"mutate.d.ts","sourceRoot":"","sources":["../src/mutate.ts"],"names":[],"mappings":"AACA,OAAO,EAA+F,KAAK,GAAG,EAAE,MAAM,mBAAmB,CAAA;AACzI,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AAC5F,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAA;AAC9E,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAI3C,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AAEnC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,WAAW,MAAM,wCAAwC,CAAA;AACrE,OAAO,KAAK,KAAK,UAAU,MAAM,uCAAuC,CAAA;AACxE,OAAO,EAAY,KAAK,WAAW,EAAc,MAAM,KAAK,CAAA;AAG5D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,gBAAgB,CAAA;CAAE,KAAK,MAAM,EAAE,CAAA;AAErF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAMhC,CAAA;AAID;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,qBAAqB,OAAQ,WAAW,GAAG,SAAS,SAEhE,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,WAAyC,CAAA;AAEnE,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,CAAC,EACtC,cAAc,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GAC5C,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAoBX;AAED,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;CAC3C;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,iNAiBzD;AAED;;;;;GAKG;AACH,MAAM,MAAM,2BAA2B,GAAG;IACxC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;CAC1C,CAAA;AACD,MAAM,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,2BAA2B,CAAC,CAAA;AACvF,MAAM,MAAM,uBAAuB,CAAC,CAAC,GAAG,KAAK,IAAI,CAC/C,IAAI,EAAE,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,KACxC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;AAClC,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,KAAK;IACzC,QAAQ,CAAC,kBAAkB,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAA;CACxD;AAED,eAAO,MAAM,oBAAoB,EAAE,gBAAgB,CAAC,UAAU,CAAC,UAAU,CAExE,CAAA;AAED,eAAO,MAAM,wBAAwB,GAAI,CAAC,mBACvB,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAClD,gBAAgB,CAAC,CAAC,CAOnB,CAAA;AAiBF,MAAM,WAAW,mBAAmB,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAK;IAC7E;;;;;;;;;;;;;OAaG;IACH,iBAAiB,CAAC,EAAE,CAClB,UAAU,EAAE,MAAM,EAAE,EACpB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,OAAO,EACf,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,KACjC,iBAAiB,EAAE,CAAA;IACxB;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;CACjD;AAED,eAAO,MAAM,QAAQ,GAAI,IAAI,SAAS,SAAS,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAClD,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KACjD,SAAS,CACV,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAC1C,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAmB5D,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAI,IAAI,SAAS,SAAS,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WACxD,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KACjD,SAAS,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAsCxG,CAAA;AAqED,eAAO,MAAM,iBAAiB,GAAI,YAAY,QACtC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,gBAAgB,CAAA;CAAE,WACvC,mBAAmB,GAAG,SAAS,oBACtB,gBAAgB,CAAC,YAAY,CAAC,MAMhC,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,UAAU,OAAO,6GA0BtE,CAAA;AAED;;GAEG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,MAAM;IACvD,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAK,EAC5B,KAAK,EAAE,CAAC,EACR,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,GAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAA;IACnC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAA;CAChB;AAED,eAAO,MAAM,YAAY,GAAI,YAAY,oBAAoB,gBAAgB,CAAC,YAAY,CAAC,MAMpE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,SAAS,GAAG,EAAE,EAAE,SAAS,MAAM,QAC/D,uBAAuB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,KACrD,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAM7B,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,YAAY,oBAAoB,gBAAgB,CAAC,YAAY,CAAC,MAMvE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,SAAS,GAAG,EAAE,EAAE,SAAS,MAAM,QAC/D,uBAAuB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,KACrD,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAM7B,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,GAAI,YAAY,oBAAoB,gBAAgB,CAAC,YAAY,CAAC,YAExF;IACJ,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,CAAC,EAAE,gBAAgB,CAAA;IAC1B,OAAO,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;CAClD,uBACoB,mBAAmB,CAAC,mBAAmB,CAAC,SA2BlD,GAAG,iCAEjB,CAAA"}
|
package/dist/mutate.js
CHANGED
|
@@ -1,20 +1,49 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
2
|
+
import { 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 Option from "effect-app/Option";
|
|
6
|
+
import { isReadonlyArrayNonEmpty } from "effect/Array";
|
|
7
|
+
import * as Exit from "effect/Exit";
|
|
8
|
+
import * as Ref from "effect/Ref";
|
|
9
|
+
import * as Stream from "effect/Stream";
|
|
5
10
|
import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
|
|
6
11
|
import { computed, shallowRef } from "vue";
|
|
7
|
-
import {
|
|
8
|
-
|
|
12
|
+
import { invalidateAndAwait } from "./atomQuery.js";
|
|
13
|
+
/**
|
|
14
|
+
* Default heuristic: invalidate the parent namespace of the action.
|
|
15
|
+
* e.g. `$project/$configuration.get` -> `["$project"]`
|
|
16
|
+
* e.g. `$project/$configuration/$something.get` -> `["$project","$configuration"]`
|
|
17
|
+
*/
|
|
18
|
+
export const defaultGetQueryKey = (h) => {
|
|
9
19
|
const key = makeQueryKey(h);
|
|
10
20
|
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
21
|
const k = ns.length ? ns.length > 1 ? ns.slice(0, ns.length - 1) : ns : undefined;
|
|
14
22
|
if (!k)
|
|
15
23
|
throw new Error("empty query key for: " + h.id);
|
|
16
24
|
return k;
|
|
17
25
|
};
|
|
26
|
+
let activeGetQueryKey = defaultGetQueryKey;
|
|
27
|
+
/**
|
|
28
|
+
* Override the default query-key heuristic used by mutations for cache
|
|
29
|
+
* invalidation. Call once at app bootstrap. Pass `undefined` to restore the
|
|
30
|
+
* built-in default.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* // invalidate the full namespace of the action (no parent collapse)
|
|
35
|
+
* setDefaultGetQueryKey((h) => {
|
|
36
|
+
* const key = makeQueryKey(h)
|
|
37
|
+
* const ns = key.filter((_) => _.startsWith("$"))
|
|
38
|
+
* if (!ns.length) throw new Error("empty query key for: " + h.id)
|
|
39
|
+
* return ns
|
|
40
|
+
* })
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export const setDefaultGetQueryKey = (fn) => {
|
|
44
|
+
activeGetQueryKey = fn ?? defaultGetQueryKey;
|
|
45
|
+
};
|
|
46
|
+
export const getQueryKey = (h) => activeGetQueryKey(h);
|
|
18
47
|
export function mutationResultToVue(mutationResult) {
|
|
19
48
|
switch (mutationResult._tag) {
|
|
20
49
|
case "Initial": {
|
|
@@ -46,75 +75,175 @@ export function make(self) {
|
|
|
46
75
|
const latestSuccess = computed(() => Option.getOrUndefined(AsyncResult.value(result.value)));
|
|
47
76
|
return tuple(result, latestSuccess, execute);
|
|
48
77
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
78
|
+
export const atomQueryInvalidator = {
|
|
79
|
+
invalidateAndAwait
|
|
80
|
+
};
|
|
81
|
+
export const combineQueryInvalidators = (...invalidators) => ({
|
|
82
|
+
invalidateAndAwait: (keys) => Effect.forEach(invalidators, (invalidator) => invalidator.invalidateAndAwait(keys), { discard: true, concurrency: "inherit" })
|
|
83
|
+
});
|
|
84
|
+
const isRecord = (value) => typeof value === "object" && value !== null;
|
|
85
|
+
const isQueryKey = (entry) => Array.isArray(entry);
|
|
86
|
+
const queryKeyFromFilters = (entry) => {
|
|
87
|
+
if (!("filters" in entry))
|
|
88
|
+
return undefined;
|
|
89
|
+
const filters = entry.filters;
|
|
90
|
+
if (!isRecord(filters))
|
|
91
|
+
return undefined;
|
|
92
|
+
const queryKey = filters["queryKey"];
|
|
93
|
+
return Array.isArray(queryKey) ? queryKey : undefined;
|
|
94
|
+
};
|
|
59
95
|
export const asResult = (handler) => {
|
|
60
96
|
const state = shallowRef(AsyncResult.initial());
|
|
61
|
-
const act =
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
97
|
+
const act = (...args) => Effect
|
|
98
|
+
.sync(() => {
|
|
99
|
+
state.value = AsyncResult.initial(true);
|
|
100
|
+
})
|
|
101
|
+
.pipe(Effect.andThen(Effect.suspend(() => handler(...args).pipe(Effect.exit, Effect.tap((exit) => Effect.sync(() => (state.value = AsyncResult.fromExit(exit))))))));
|
|
102
|
+
return tuple(computed(() => state.value), act);
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Like `asResult`, but for streams. The ref is updated with each emitted value
|
|
106
|
+
* (keeping `waiting: true`) and is finalised (with `waiting: false`) once the
|
|
107
|
+
* stream terminates successfully. Errors are surfaced as `AsyncResult.failure`.
|
|
108
|
+
*/
|
|
109
|
+
export const asStreamResult = (handler) => {
|
|
110
|
+
const state = shallowRef(AsyncResult.initial());
|
|
111
|
+
const runStream = (stream) => Effect
|
|
112
|
+
.sync(() => {
|
|
113
|
+
state.value = AsyncResult.initial(true);
|
|
114
|
+
})
|
|
115
|
+
.pipe(Effect.andThen(stream.pipe(Stream.runForEach((value) => Effect.sync(() => {
|
|
116
|
+
state.value = AsyncResult.success(value, { waiting: true });
|
|
117
|
+
})), Effect.exit, Effect.flatMap((exit) => Effect.sync(() => {
|
|
118
|
+
if (exit._tag === "Success") {
|
|
119
|
+
const current = state.value;
|
|
120
|
+
if (AsyncResult.isSuccess(current)) {
|
|
121
|
+
state.value = AsyncResult.success(current.value, { waiting: false });
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
state.value = AsyncResult.initial(false);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
state.value = AsyncResult.failure(exit.cause);
|
|
129
|
+
}
|
|
130
|
+
})))));
|
|
131
|
+
const act = (...args) => runStream(handler(...args));
|
|
72
132
|
return tuple(computed(() => state.value), act);
|
|
73
133
|
};
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
134
|
+
const buildInvalidateCache = (self, queryInvalidation, queryInvalidator) => {
|
|
135
|
+
// Concrete reactivity keys to invalidate: a raw query key, one derived from an `{ id }`
|
|
136
|
+
// entry, or a compatibility `{ filters: { queryKey } }` entry.
|
|
137
|
+
// Predicate-only `{ filters }` entries have no exact-key reactivity equivalent and throw.
|
|
138
|
+
const getClientInvalidationKeys = (input, output) => {
|
|
77
139
|
const queryKey = getQueryKey(self);
|
|
78
|
-
if (
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
140
|
+
if (queryInvalidation) {
|
|
141
|
+
const keys = [];
|
|
142
|
+
for (const entry of queryInvalidation(queryKey, self.id, input, output)) {
|
|
143
|
+
if (isQueryKey(entry)) {
|
|
144
|
+
keys.push(entry);
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if ("id" in entry) {
|
|
148
|
+
keys.push(makeQueryKey(entry.options ? { id: entry.id, options: entry.options } : { id: entry.id }));
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
const filterQueryKey = queryKeyFromFilters(entry);
|
|
152
|
+
if (filterQueryKey !== undefined) {
|
|
153
|
+
keys.push(filterQueryKey);
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
throw new Error("Unsupported query invalidation filter: only filters.queryKey is supported");
|
|
82
157
|
}
|
|
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 }));
|
|
158
|
+
return keys;
|
|
86
159
|
}
|
|
87
|
-
|
|
160
|
+
return queryKey ? [queryKey] : [];
|
|
161
|
+
};
|
|
162
|
+
const invalidateCache = (input, output, serverKeys) => Effect.suspend(() => {
|
|
163
|
+
const clientKeys = getClientInvalidationKeys(input, output);
|
|
164
|
+
// Invalidate exact reactivity keys (= the prefixes query atoms register under). Each key
|
|
165
|
+
// array is hashed structurally, matching the query-side registration.
|
|
166
|
+
const keys = [...clientKeys, ...serverKeys];
|
|
167
|
+
if (!isReadonlyArrayNonEmpty(keys))
|
|
88
168
|
return Effect.void;
|
|
89
169
|
return Effect
|
|
90
|
-
.andThen(Effect.annotateCurrentSpan({
|
|
91
|
-
|
|
92
|
-
//
|
|
93
|
-
|
|
94
|
-
|
|
170
|
+
.andThen(Effect.annotateCurrentSpan({ clientKeys, serverKeys }),
|
|
171
|
+
// refetch + AWAIT every live query registered under these keys, so by the time the
|
|
172
|
+
// mutation resolves the affected queries are fresh.
|
|
173
|
+
queryInvalidator.invalidateAndAwait(keys))
|
|
174
|
+
.pipe(Effect.tap(Effect.sleep(0.1)), // allow for refs to update etc
|
|
175
|
+
Effect.withSpan("client.query.invalidation", {}, { captureStackTrace: false }));
|
|
176
|
+
});
|
|
177
|
+
return invalidateCache;
|
|
178
|
+
};
|
|
179
|
+
export const invalidateQueries = (self, options, queryInvalidator) => {
|
|
180
|
+
const invalidateCache = buildInvalidateCache(self, options?.queryInvalidation, queryInvalidator);
|
|
181
|
+
const select = options?.select;
|
|
182
|
+
const handle = (eff, input) => Effect.gen(function* () {
|
|
183
|
+
const keysRef = yield* Ref.make([]);
|
|
184
|
+
const result = yield* eff.pipe(Effect.provideService(InvalidationKeysFromServer, makeInvalidationKeysService(keysRef)), Effect.onExit((exit) => Effect.gen(function* () {
|
|
185
|
+
const serverKeys = yield* Ref.get(keysRef);
|
|
186
|
+
yield* invalidateCache(input, exit, serverKeys);
|
|
187
|
+
})));
|
|
188
|
+
if (select) {
|
|
189
|
+
return yield* select(result).pipe(Effect.onExit((exit) => Effect.gen(function* () {
|
|
190
|
+
const serverKeys = yield* Ref.get(keysRef);
|
|
191
|
+
yield* invalidateCache(input, exit, serverKeys);
|
|
192
|
+
})));
|
|
193
|
+
}
|
|
194
|
+
return result;
|
|
95
195
|
});
|
|
96
|
-
const handle = (self) => Effect.ensuring(self, invalidateCache);
|
|
97
196
|
return handle;
|
|
98
197
|
};
|
|
99
|
-
export const makeMutation = () => {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
198
|
+
export const makeMutation = (queryInvalidator) => {
|
|
199
|
+
/**
|
|
200
|
+
* Pass a function that returns an Effect, e.g from a client action.
|
|
201
|
+
* Executes query cache invalidation based on default rules or provided option.
|
|
202
|
+
* When `I = void` the input argument may be omitted.
|
|
203
|
+
*/
|
|
204
|
+
const useMutation = (self) => {
|
|
205
|
+
const r = (i, options) => invalidateQueries(self, options, queryInvalidator)(self.handler(i), i);
|
|
105
206
|
return Object.assign(r, { id: self.id });
|
|
106
207
|
};
|
|
107
208
|
return useMutation;
|
|
108
209
|
};
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
210
|
+
export const useMakeMutation = (queryInvalidator) => {
|
|
211
|
+
/**
|
|
212
|
+
* Pass a function that returns an Effect, e.g from a client action.
|
|
213
|
+
* Executes query cache invalidation based on default rules or provided option.
|
|
214
|
+
* When `I = void` the input argument may be omitted.
|
|
215
|
+
*/
|
|
216
|
+
const useMutation = (self) => {
|
|
217
|
+
const r = (i, options) => invalidateQueries(self, options, queryInvalidator)(self.handler(i), i);
|
|
116
218
|
return Object.assign(r, { id: self.id });
|
|
117
219
|
};
|
|
118
220
|
return useMutation;
|
|
119
221
|
};
|
|
120
|
-
|
|
222
|
+
/**
|
|
223
|
+
* Returns a stream-based mutation factory for use with `streamFn`.
|
|
224
|
+
* The outer Effect sets up per-invocation invalidation scaffolding
|
|
225
|
+
* and returns a stream that triggers query invalidation via `Stream.ensuring` when it completes.
|
|
226
|
+
*
|
|
227
|
+
* Use with `streamFn` / `Command.streamFn(id)(mutateHandler, ...combinators)` so that
|
|
228
|
+
* the command manages its own reactive state internally.
|
|
229
|
+
*/
|
|
230
|
+
export const makeStreamMutation2 = (queryInvalidator) => {
|
|
231
|
+
return (self, mergedInvalidation) => {
|
|
232
|
+
const invCache = buildInvalidateCache(self, mergedInvalidation, queryInvalidator);
|
|
233
|
+
const makeInvocationEffect = (input, source) => Effect.gen(function* () {
|
|
234
|
+
const keysRef = yield* Ref.make([]);
|
|
235
|
+
const invKeys = makeInvalidationKeysService(keysRef,
|
|
236
|
+
// Stream invalidation is sequenced by the injected query invalidator; this callback
|
|
237
|
+
// returns void to keep the server-side invalidation service effect-free.
|
|
238
|
+
(key) => invCache(input, Exit.succeed(undefined), [key]));
|
|
239
|
+
const lastRef = yield* Ref.make(undefined);
|
|
240
|
+
return source.pipe(Stream.provideService(InvalidationKeysFromServer, invKeys), Stream.tap((v) => Ref.set(lastRef, v)), Stream.ensuring(Effect.gen(function* () {
|
|
241
|
+
const lastValue = yield* Ref.get(lastRef);
|
|
242
|
+
const serverKeys = yield* Ref.get(keysRef);
|
|
243
|
+
yield* invCache(input, Exit.succeed(lastValue), serverKeys);
|
|
244
|
+
})));
|
|
245
|
+
});
|
|
246
|
+
return (i) => Stream.unwrap(makeInvocationEffect(i, self.handler(i)));
|
|
247
|
+
};
|
|
248
|
+
};
|
|
249
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXV0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL211dGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUF3QiwwQkFBMEIsRUFBRSwyQkFBMkIsRUFBRSxZQUFZLEVBQVksTUFBTSxtQkFBbUIsQ0FBQTtBQUd6SSxPQUFPLEtBQUssTUFBTSxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssTUFBTSxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUV0RCxPQUFPLEtBQUssSUFBSSxNQUFNLGFBQWEsQ0FBQTtBQUNuQyxPQUFPLEtBQUssR0FBRyxNQUFNLFlBQVksQ0FBQTtBQUNqQyxPQUFPLEtBQUssTUFBTSxNQUFNLGVBQWUsQ0FBQTtBQUN2QyxPQUFPLEtBQUssV0FBVyxNQUFNLHdDQUF3QyxDQUFBO0FBRXJFLE9BQU8sRUFBRSxRQUFRLEVBQW9CLFVBQVUsRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUM1RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUluRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDbkQsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzNCLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUMvQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFB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
|