@effect-app/vue 2.32.0 → 2.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/dist/errorReporter.d.ts.map +1 -1
- package/dist/errorReporter.js +2 -3
- package/dist/lib.d.ts +1 -1
- package/dist/makeClient.d.ts +31 -23
- package/dist/makeClient.d.ts.map +1 -1
- package/dist/makeClient.js +50 -31
- package/dist/mutate.d.ts +9 -11
- package/dist/mutate.d.ts.map +1 -1
- package/dist/mutate.js +18 -13
- package/package.json +9 -9
- package/src/errorReporter.ts +1 -2
- package/src/makeClient.ts +148 -87
- package/src/mutate.ts +44 -44
package/dist/mutate.js
CHANGED
|
@@ -4,7 +4,7 @@ import { useQueryClient } from "@tanstack/vue-query";
|
|
|
4
4
|
import { Effect, Option } from "effect-app";
|
|
5
5
|
import { tuple } from "effect-app/Function";
|
|
6
6
|
import { computed, shallowRef } from "vue";
|
|
7
|
-
import { makeQueryKey
|
|
7
|
+
import { makeQueryKey } from "./lib.js";
|
|
8
8
|
export const getQueryKey = (h) => {
|
|
9
9
|
const key = makeQueryKey(h);
|
|
10
10
|
const ns = key.filter((_) => _.startsWith("$"));
|
|
@@ -58,19 +58,25 @@ export function make(self) {
|
|
|
58
58
|
*/
|
|
59
59
|
export const asResult = (handler) => {
|
|
60
60
|
const state = shallowRef(Result.initial());
|
|
61
|
-
const act = (
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
61
|
+
const act = Effect.isEffect(handler)
|
|
62
|
+
? Effect
|
|
63
|
+
.sync(() => {
|
|
64
|
+
state.value = Result.initial(true);
|
|
65
|
+
})
|
|
66
|
+
.pipe(Effect.zipRight(Effect.suspend(() => handler.pipe(Effect.exit, Effect.tap((exit) => Effect.sync(() => (state.value = Result.fromExit(exit))))))))
|
|
67
|
+
: (...args) => Effect
|
|
68
|
+
.sync(() => {
|
|
69
|
+
state.value = Result.initial(true);
|
|
70
|
+
})
|
|
71
|
+
.pipe(Effect.zipRight(Effect.suspend(() => handler(...args).pipe(Effect.exit, Effect.tap((exit) => Effect.sync(() => (state.value = Result.fromExit(exit))))))));
|
|
72
|
+
return tuple(computed(() => state.value), act);
|
|
67
73
|
};
|
|
68
74
|
export const makeMutation = () => {
|
|
69
75
|
/**
|
|
70
76
|
* Pass a function that returns an Effect, e.g from a client action, or an Effect
|
|
71
77
|
* Returns a tuple with state ref and execution function which reports errors as Toast.
|
|
72
78
|
*/
|
|
73
|
-
const
|
|
79
|
+
const useMutation = (self, options) => {
|
|
74
80
|
const queryClient = useQueryClient();
|
|
75
81
|
const invalidateQueries = (filters, options) => Effect.promise(() => queryClient.invalidateQueries(filters, options));
|
|
76
82
|
const invalidateCache = Effect.suspend(() => {
|
|
@@ -91,12 +97,11 @@ export const makeMutation = () => {
|
|
|
91
97
|
.pipe(Effect.withSpan("client.query.invalidation", { captureStackTrace: false }));
|
|
92
98
|
});
|
|
93
99
|
const mapHandler = options?.mapHandler ?? ((_) => _);
|
|
94
|
-
const
|
|
95
|
-
const handle = (self, name, i = void 0) => handle_(self, i).pipe(Effect.tapDefect(reportRuntimeError), Effect.withSpan(`mutation ${name}`, { captureStackTrace: false }));
|
|
100
|
+
const handle = (self, i = void 0) => mapHandler(Effect.tapBoth(self, { onFailure: () => invalidateCache, onSuccess: () => invalidateCache }), i);
|
|
96
101
|
const handler = self.handler;
|
|
97
|
-
const r =
|
|
102
|
+
const r = Effect.isEffect(handler) ? handle(handler) : (i) => handle(handler(i), i);
|
|
98
103
|
return r;
|
|
99
104
|
};
|
|
100
|
-
return
|
|
105
|
+
return useMutation;
|
|
101
106
|
};
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXV0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL211dGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxLQUFLLE1BQU0sTUFBTSxzQkFBc0IsQ0FBQTtBQUU5QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFFcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFFM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBRTNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sS0FBSyxDQUFBO0FBQzFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFFdkMsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBbUIsRUFBRSxFQUFFO0lBQ2pELE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMzQixNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDL0MsNkZBQTZGO0lBQzdGLG9GQUFvRjtJQUNwRixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7SUFDakYsSUFBSSxDQUFDLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN6RCxPQUFP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
|
package/package.json
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-app/vue",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.34.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"homepage": "https://github.com/effect-ts-app/libs/tree/main/packages/vue",
|
|
7
7
|
"dependencies": {
|
|
8
8
|
"@formatjs/intl": "^3.1.4",
|
|
9
|
-
"@tanstack/vue-query": "^5.
|
|
10
|
-
"@vueuse/core": "^12.
|
|
9
|
+
"@tanstack/vue-query": "^5.67.1",
|
|
10
|
+
"@vueuse/core": "^12.8.2",
|
|
11
11
|
"query-string": "^9.1.1",
|
|
12
|
-
"effect-app": "2.
|
|
12
|
+
"effect-app": "2.33.0"
|
|
13
13
|
},
|
|
14
14
|
"peerDependencies": {
|
|
15
|
-
"@effect/platform": "^0.77.
|
|
16
|
-
"@effect/platform-browser": "^0.56.
|
|
15
|
+
"@effect/platform": "^0.77.6",
|
|
16
|
+
"@effect/platform-browser": "^0.56.6",
|
|
17
17
|
"@effect-rx/rx": "^0.34.7",
|
|
18
18
|
"@effect-rx/rx-vue": "^0.11.7",
|
|
19
|
-
"@sentry/browser": "^9.
|
|
20
|
-
"effect": "^3.13.
|
|
19
|
+
"@sentry/browser": "^9.4.0",
|
|
20
|
+
"effect": "^3.13.6",
|
|
21
21
|
"vue": "^3.5.13"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"@babel/plugin-transform-modules-commonjs": "^7.26.3",
|
|
29
29
|
"babel-plugin-replace-import-extension": "^1.1.5",
|
|
30
30
|
"@rollup/pluginutils": "^5.1.4",
|
|
31
|
-
"@types/node": "~22.13.
|
|
31
|
+
"@types/node": "~22.13.9",
|
|
32
32
|
"intl-messageformat": "^10.7.15",
|
|
33
33
|
"json5": "^2.2.3",
|
|
34
34
|
"typescript": "^5.8.2",
|
package/src/errorReporter.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
3
3
|
import * as Sentry from "@sentry/browser"
|
|
4
4
|
import { Cause, Effect, LogLevel } from "effect-app"
|
|
5
|
-
import { CauseException,
|
|
5
|
+
import { CauseException, tryToJson, tryToReport } from "effect-app/client/errors"
|
|
6
6
|
import { dropUndefined, LogLevelToSentry } from "effect-app/utils"
|
|
7
7
|
|
|
8
8
|
export const tryCauseException = <E>(cause: Cause<E>, name: string): CauseException<E> => {
|
|
@@ -43,7 +43,6 @@ export function reportError(
|
|
|
43
43
|
Effect.catchAllCause(() => Effect.logFatal("Failed to log error cause"))
|
|
44
44
|
)
|
|
45
45
|
|
|
46
|
-
error[ErrorReported] = true
|
|
47
46
|
return error
|
|
48
47
|
})
|
|
49
48
|
.pipe(
|
package/src/makeClient.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import type { Result } from "@effect-rx/rx/Result"
|
|
3
3
|
import { Cause, Effect, Exit, Match, Option, Runtime, S, Struct } from "effect-app"
|
|
4
4
|
import type { RequestHandler, RequestHandlerWithInput, TaggedRequestClassAny } from "effect-app/client/clientFor"
|
|
5
|
-
import { type SupportedErrors } from "effect-app/client/errors"
|
|
5
|
+
import { ErrorSilenced, type SupportedErrors } from "effect-app/client/errors"
|
|
6
6
|
import { constant, pipe, tuple } from "effect-app/Function"
|
|
7
7
|
import type { OperationFailure } from "effect-app/Operations"
|
|
8
8
|
import { OperationSuccess } from "effect-app/Operations"
|
|
@@ -14,15 +14,21 @@ import { reportMessage } from "./errorReporter.js"
|
|
|
14
14
|
import { buildFieldInfoFromFieldsRoot } from "./form.js"
|
|
15
15
|
import { getRuntime, reportRuntimeError } from "./lib.js"
|
|
16
16
|
import type { MakeIntlReturn } from "./makeIntl.js"
|
|
17
|
-
import { makeMutation, mutationResultToVue } from "./mutate.js"
|
|
17
|
+
import { asResult, makeMutation, mutationResultToVue } from "./mutate.js"
|
|
18
18
|
import type { MutationOptions, Res } from "./mutate.js"
|
|
19
19
|
import { makeQuery } from "./query.js"
|
|
20
20
|
|
|
21
|
+
const tapHandler = <A, E, R, I>(
|
|
22
|
+
handler: Effect<A, E, R> | ((i: I) => Effect<A, E, R>),
|
|
23
|
+
map: (self: Effect<A, E, R>) => Effect<A, E, R>
|
|
24
|
+
) => Effect.isEffect(handler) ? map(handler) : (i: I) => map(handler(i))
|
|
25
|
+
|
|
21
26
|
/**
|
|
22
27
|
* Use this after handling an error yourself, still continueing on the Error track, but the error will not be reported.
|
|
23
28
|
*/
|
|
24
29
|
export class SuppressErrors extends Cause.YieldableError {
|
|
25
30
|
readonly _tag = "SuppressErrors"
|
|
31
|
+
readonly [ErrorSilenced] = true
|
|
26
32
|
}
|
|
27
33
|
|
|
28
34
|
export type ResponseErrors = S.ParseResult.ParseError | SupportedErrors | SuppressErrors | OperationFailure
|
|
@@ -117,7 +123,8 @@ export function handleRequest<
|
|
|
117
123
|
EDefect = never,
|
|
118
124
|
RDefect = never
|
|
119
125
|
>(
|
|
120
|
-
f: Effect<A, E, R> | ((i: I) => Effect<A, E, R>),
|
|
126
|
+
f: Effect<Exit<A, E>, never, R> | ((i: I) => Effect<Exit<A, E>, never, R>),
|
|
127
|
+
name: string,
|
|
121
128
|
action: string,
|
|
122
129
|
options: {
|
|
123
130
|
onSuccess: (a: A, i: I) => Effect<void, ESuccess, RSuccess>
|
|
@@ -125,9 +132,8 @@ export function handleRequest<
|
|
|
125
132
|
onDefect: (e: Cause.Cause<E>, i: I) => Effect<void, EDefect, RDefect>
|
|
126
133
|
}
|
|
127
134
|
) {
|
|
128
|
-
const handleEffect = (i: any) => (self: Effect<A, E, R>) =>
|
|
135
|
+
const handleEffect = (i: any) => (self: Effect<Exit<A, E>, never, R>) =>
|
|
129
136
|
self.pipe(
|
|
130
|
-
Effect.exit,
|
|
131
137
|
Effect.tap(
|
|
132
138
|
Exit.matchEffect({
|
|
133
139
|
onSuccess: (r) => options.onSuccess(r, i),
|
|
@@ -160,15 +166,7 @@ export function handleRequest<
|
|
|
160
166
|
})
|
|
161
167
|
})
|
|
162
168
|
),
|
|
163
|
-
Effect.
|
|
164
|
-
Effect.gen(function*() {
|
|
165
|
-
const extra = {
|
|
166
|
-
action,
|
|
167
|
-
message: `Unexpected Error trying to handle errors for ${action}`
|
|
168
|
-
}
|
|
169
|
-
yield* reportRuntimeError(cause, extra)
|
|
170
|
-
})
|
|
171
|
-
)
|
|
169
|
+
Effect.withSpan(`mutation ${name}`, { captureStackTrace: false })
|
|
172
170
|
)
|
|
173
171
|
return Object.assign(
|
|
174
172
|
Effect.isEffect(f)
|
|
@@ -196,8 +194,47 @@ export const makeClient = <Locale extends string, R>(
|
|
|
196
194
|
messages: Record<string, string | undefined> = {}
|
|
197
195
|
) => {
|
|
198
196
|
// making sure names do not collide with auto exports in nuxt apps, please do not rename..
|
|
199
|
-
|
|
197
|
+
/**
|
|
198
|
+
* Effect results are passed to the caller, including errors.
|
|
199
|
+
*/
|
|
200
|
+
const _useUnsafeMutation = makeMutation()
|
|
200
201
|
const _useSafeQuery = makeQuery(runtime)
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Effect results are converted to Exit, so errors are ignored by default.
|
|
205
|
+
* you should use the result ref to render errors!
|
|
206
|
+
*/
|
|
207
|
+
const _useSafeMutation: {
|
|
208
|
+
<I, E, A, R, Request extends TaggedRequestClassAny, A2 = A, E2 = E, R2 = R>(
|
|
209
|
+
self: RequestHandlerWithInput<I, A, E, R, Request>,
|
|
210
|
+
options?: MutationOptions<A, E, R, A2, E2, R2, I>
|
|
211
|
+
): readonly [
|
|
212
|
+
ComputedRef<Result<A2, E2>>,
|
|
213
|
+
(i: I) => Effect<Exit<A2, E2>, never, R2>
|
|
214
|
+
]
|
|
215
|
+
<E, A, R, Request extends TaggedRequestClassAny, A2 = A, E2 = E, R2 = R>(
|
|
216
|
+
self: RequestHandler<A, E, R, Request>,
|
|
217
|
+
options?: MutationOptions<A, E, R, A2, E2, R2>
|
|
218
|
+
): readonly [
|
|
219
|
+
ComputedRef<Result<A2, E2>>,
|
|
220
|
+
Effect<Exit<A2, E2>, never, R2>
|
|
221
|
+
]
|
|
222
|
+
} = <I, E, A, R, Request extends TaggedRequestClassAny, A2 = A, E2 = E, R2 = R>(
|
|
223
|
+
self: RequestHandlerWithInput<I, A, E, R, Request> | RequestHandler<A, E, R, Request>,
|
|
224
|
+
options?: MutationOptions<A, E, R, A2, E2, R2, I>
|
|
225
|
+
) => {
|
|
226
|
+
const unsafe = _useUnsafeMutation(self as any, options)
|
|
227
|
+
|
|
228
|
+
const [a, b] = asResult(tapHandler(unsafe, Effect.tapDefect(reportRuntimeError)) as any)
|
|
229
|
+
return [
|
|
230
|
+
a,
|
|
231
|
+
tapHandler(
|
|
232
|
+
b,
|
|
233
|
+
Effect.withSpan(`mutation ${self.name}`, { captureStackTrace: false })
|
|
234
|
+
)
|
|
235
|
+
] as const as any
|
|
236
|
+
}
|
|
237
|
+
|
|
201
238
|
const _useHandleRequestWithToast = () => {
|
|
202
239
|
const toast = useToast()
|
|
203
240
|
const { intl } = useIntl()
|
|
@@ -222,7 +259,8 @@ export const makeClient = <Locale extends string, R>(
|
|
|
222
259
|
EDefect = never,
|
|
223
260
|
RDefect = never
|
|
224
261
|
>(
|
|
225
|
-
f: Effect<A2, E2, R2> | ((i: I) => Effect<A2, E2, R2>),
|
|
262
|
+
f: Effect<Exit<A2, E2>, never, R2> | ((i: I) => Effect<Exit<A2, E2>, never, R2>),
|
|
263
|
+
name: string,
|
|
226
264
|
action: string,
|
|
227
265
|
options: Opts<A, E, R, I, A2, E2, R2, ESuccess, RSuccess, EError, RError, EDefect, RDefect> = {}
|
|
228
266
|
) {
|
|
@@ -240,7 +278,7 @@ export const makeClient = <Locale extends string, R>(
|
|
|
240
278
|
{ action: actionMessage }
|
|
241
279
|
)
|
|
242
280
|
|
|
243
|
-
return handleRequest<E2, A2, R2, any, ESuccess, RSuccess, EError, RError, EDefect, RDefect>(f, action, {
|
|
281
|
+
return handleRequest<E2, A2, R2, any, ESuccess, RSuccess, EError, RError, EDefect, RDefect>(f, name, action, {
|
|
244
282
|
onSuccess: (a, i) =>
|
|
245
283
|
Effect.gen(function*() {
|
|
246
284
|
const message = options.successMessage ? yield* options.successMessage(a, i) : defaultSuccessMessage
|
|
@@ -365,7 +403,7 @@ export const makeClient = <Locale extends string, R>(
|
|
|
365
403
|
self: RequestHandlerWithInput<I, A, E, R, Request>,
|
|
366
404
|
action: string,
|
|
367
405
|
options?: Opts<A, E, R, I, A2, E2, R2, ESuccess, RSuccess, EError, RError, EDefect, RDefect>
|
|
368
|
-
): Resp<I, A2, E2, R2,
|
|
406
|
+
): Resp<I, A2, E2, R2, ComputedRef<Result<A2, E2>>>
|
|
369
407
|
<
|
|
370
408
|
E extends ResponseErrors,
|
|
371
409
|
A,
|
|
@@ -384,32 +422,34 @@ export const makeClient = <Locale extends string, R>(
|
|
|
384
422
|
self: RequestHandler<A, E, R, Request>,
|
|
385
423
|
action: string,
|
|
386
424
|
options?: Opts<A, E, R, void, A2, E2, R2, ESuccess, RSuccess, EError, RError, EDefect, RDefect>
|
|
387
|
-
): ActResp<A2, E2, R2,
|
|
388
|
-
} = (
|
|
389
|
-
self:
|
|
425
|
+
): ActResp<A2, E2, R2, ComputedRef<Result<A2, E2>>>
|
|
426
|
+
} = <E extends ResponseErrors, A, R, Request extends TaggedRequestClassAny, I>(
|
|
427
|
+
self: RequestHandlerWithInput<I, A, E, R, Request> | RequestHandler<A, E, R, Request>,
|
|
390
428
|
action: any,
|
|
391
429
|
options?: Opts<any, any, any, any, any, any, any, any, any, any, any, any, any>
|
|
392
430
|
): any => {
|
|
393
431
|
const handleRequestWithToast = _useHandleRequestWithToast()
|
|
394
|
-
const
|
|
432
|
+
const handler = self.handler
|
|
433
|
+
const [a, b] = asResult(_useUnsafeMutation({
|
|
395
434
|
...self,
|
|
396
|
-
handler: Effect.isEffect(
|
|
435
|
+
handler: Effect.isEffect(handler)
|
|
397
436
|
? (pipe(
|
|
398
437
|
Effect.annotateCurrentSpan({ action }),
|
|
399
|
-
Effect.
|
|
438
|
+
Effect.zipRight(handler)
|
|
400
439
|
) as any)
|
|
401
|
-
: (...args: any
|
|
440
|
+
: (...args: [any]) =>
|
|
402
441
|
pipe(
|
|
403
442
|
Effect.annotateCurrentSpan({ action }),
|
|
404
|
-
Effect.
|
|
443
|
+
Effect.zipRight(handler(...args))
|
|
405
444
|
)
|
|
406
|
-
}, options ? dropUndefinedT(options) : undefined)
|
|
445
|
+
}, options ? dropUndefinedT(options) : undefined))
|
|
407
446
|
|
|
408
447
|
return tuple(
|
|
409
448
|
a,
|
|
410
|
-
handleRequestWithToast(b as any, action, options)
|
|
449
|
+
handleRequestWithToast(b as any, self.name, action, options)
|
|
411
450
|
)
|
|
412
451
|
}
|
|
452
|
+
//
|
|
413
453
|
|
|
414
454
|
/**
|
|
415
455
|
* Pass a function that returns an Effect, e.g from a client action, give it a name.
|
|
@@ -468,6 +508,57 @@ export const makeClient = <Locale extends string, R>(
|
|
|
468
508
|
)
|
|
469
509
|
}
|
|
470
510
|
|
|
511
|
+
function _makeUseAndHandleMutation(
|
|
512
|
+
defaultOptions?: Opts<any, any, any, any, any, any, any, any, any>
|
|
513
|
+
) {
|
|
514
|
+
return ((self: any, action: any, options: any) => {
|
|
515
|
+
return _useAndHandleMutation(
|
|
516
|
+
self,
|
|
517
|
+
action,
|
|
518
|
+
{ ...defaultOptions, ...options }
|
|
519
|
+
)
|
|
520
|
+
}) as unknown as {
|
|
521
|
+
<
|
|
522
|
+
I,
|
|
523
|
+
E extends ResponseErrors,
|
|
524
|
+
A,
|
|
525
|
+
R,
|
|
526
|
+
Request extends TaggedRequestClassAny,
|
|
527
|
+
A2 = A,
|
|
528
|
+
E2 extends ResponseErrors = E,
|
|
529
|
+
R2 = R,
|
|
530
|
+
ESuccess = never,
|
|
531
|
+
RSuccess = never,
|
|
532
|
+
EError = never,
|
|
533
|
+
RError = never,
|
|
534
|
+
EDefect = never,
|
|
535
|
+
RDefect = never
|
|
536
|
+
>(
|
|
537
|
+
self: RequestHandlerWithInput<I, A, E, R, Request>,
|
|
538
|
+
action: string,
|
|
539
|
+
options?: Opts<A, E, R, I, A2, E2, R2, ESuccess, RSuccess, EError, RError, EDefect, RDefect>
|
|
540
|
+
): Resp<I, A2, E2, R2>
|
|
541
|
+
<
|
|
542
|
+
E extends ResponseErrors,
|
|
543
|
+
A,
|
|
544
|
+
Request extends TaggedRequestClassAny,
|
|
545
|
+
A2 = A,
|
|
546
|
+
E2 extends ResponseErrors = E,
|
|
547
|
+
R2 = R,
|
|
548
|
+
ESuccess = never,
|
|
549
|
+
RSuccess = never,
|
|
550
|
+
EError = never,
|
|
551
|
+
RError = never,
|
|
552
|
+
EDefect = never,
|
|
553
|
+
RDefect = never
|
|
554
|
+
>(
|
|
555
|
+
self: RequestHandler<A, E, R, Request>,
|
|
556
|
+
action: string,
|
|
557
|
+
options?: Opts<A, E, R, void, A2, E2, R2, ESuccess, RSuccess, EError, RError, EDefect, RDefect>
|
|
558
|
+
): ActResp<A2, E2, R2>
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
|
|
471
562
|
/**
|
|
472
563
|
* The same as @see useAndHandleMutation, but does not display any toasts by default.
|
|
473
564
|
* Messages for success, error and defect toasts can be provided in the Options.
|
|
@@ -563,7 +654,7 @@ export const makeClient = <Locale extends string, R>(
|
|
|
563
654
|
options?: LowOptsOptional<A, E, R, void, A2, E2, R2, ESuccess, RSuccess, EError, RError, EDefect, RDefect>
|
|
564
655
|
): ActResp<A2, E2, R2>
|
|
565
656
|
} = (self: any, action: string, options: any) => {
|
|
566
|
-
const [a, b] =
|
|
657
|
+
const [a, b] = asResult(_useUnsafeMutation({
|
|
567
658
|
...self,
|
|
568
659
|
handler: Effect.isEffect(self.handler)
|
|
569
660
|
? (pipe(
|
|
@@ -575,11 +666,11 @@ export const makeClient = <Locale extends string, R>(
|
|
|
575
666
|
Effect.annotateCurrentSpan({ action }),
|
|
576
667
|
Effect.andThen(self.handler(...args))
|
|
577
668
|
)
|
|
578
|
-
}, options ? dropUndefinedT(options) : undefined)
|
|
669
|
+
}, options ? dropUndefinedT(options) : undefined))
|
|
579
670
|
|
|
580
671
|
return tuple(
|
|
581
672
|
computed(() => mutationResultToVue(a.value)),
|
|
582
|
-
handleRequest(b as any, action, {
|
|
673
|
+
handleRequest(b as any, self.name, action, {
|
|
583
674
|
onSuccess: suppressToast,
|
|
584
675
|
onDefect: suppressToast,
|
|
585
676
|
onFail: suppressToast,
|
|
@@ -588,66 +679,35 @@ export const makeClient = <Locale extends string, R>(
|
|
|
588
679
|
) as any
|
|
589
680
|
}
|
|
590
681
|
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
<
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
RError = never,
|
|
614
|
-
EDefect = never,
|
|
615
|
-
RDefect = never
|
|
616
|
-
>(
|
|
617
|
-
self: RequestHandlerWithInput<I, A, E, R, Request>,
|
|
618
|
-
action: string,
|
|
619
|
-
options?: Opts<A, E, R, I, A2, E2, R2, ESuccess, RSuccess, EError, RError, EDefect, RDefect>
|
|
620
|
-
): Resp<I, A2, E2, R2>
|
|
621
|
-
<
|
|
622
|
-
E extends ResponseErrors,
|
|
623
|
-
A,
|
|
624
|
-
Request extends TaggedRequestClassAny,
|
|
625
|
-
A2 = A,
|
|
626
|
-
E2 extends ResponseErrors = E,
|
|
627
|
-
R2 = R,
|
|
628
|
-
ESuccess = never,
|
|
629
|
-
RSuccess = never,
|
|
630
|
-
EError = never,
|
|
631
|
-
RError = never,
|
|
632
|
-
EDefect = never,
|
|
633
|
-
RDefect = never
|
|
634
|
-
>(
|
|
635
|
-
self: RequestHandler<A, E, R, Request>,
|
|
636
|
-
action: string,
|
|
637
|
-
options?: Opts<A, E, R, void, A2, E2, R2, ESuccess, RSuccess, EError, RError, EDefect, RDefect>
|
|
638
|
-
): ActResp<A2, E2, R2>
|
|
639
|
-
}
|
|
640
|
-
}
|
|
641
|
-
|
|
642
|
-
const _useSafeMutationWithState = <I, E, A, Request extends TaggedRequestClassAny>(
|
|
643
|
-
self: RequestHandlerWithInput<I, A, E, R, Request>
|
|
682
|
+
/**
|
|
683
|
+
* Effect results are converted to Exit, so errors are ignored by default.
|
|
684
|
+
* you should use the result ref to render errors!
|
|
685
|
+
*/
|
|
686
|
+
const _useSafeMutationWithState: {
|
|
687
|
+
<I, E, A, R, Request extends TaggedRequestClassAny, A2 = A, E2 = E, R2 = R>(
|
|
688
|
+
self: RequestHandlerWithInput<I, A, E, R, Request>,
|
|
689
|
+
options?: MutationOptions<A, E, R, A2, E2, R2, I>
|
|
690
|
+
): readonly [
|
|
691
|
+
ComputedRef<Res<A, E>>,
|
|
692
|
+
(i: I) => Effect<Exit<A2, E2>, never, R2>
|
|
693
|
+
]
|
|
694
|
+
<E, A, R, Request extends TaggedRequestClassAny, A2 = A, E2 = E, R2 = R>(
|
|
695
|
+
self: RequestHandler<A, E, R, Request>,
|
|
696
|
+
options?: MutationOptions<A, E, R, A2, E2, R2>
|
|
697
|
+
): readonly [
|
|
698
|
+
ComputedRef<Res<A, E>>,
|
|
699
|
+
Effect<Exit<A2, E2>, never, R2>
|
|
700
|
+
]
|
|
701
|
+
} = <I, E, A, R, Request extends TaggedRequestClassAny, A2 = A, E2 = E, R2 = R>(
|
|
702
|
+
self: RequestHandlerWithInput<I, A, E, R, Request> | RequestHandler<A, E, R, Request>,
|
|
703
|
+
options?: MutationOptions<A, E, R, A2, E2, R2, I>
|
|
644
704
|
) => {
|
|
645
|
-
const [a, b] = _useSafeMutation(self)
|
|
705
|
+
const [a, b] = _useSafeMutation(self as any, options)
|
|
646
706
|
|
|
647
707
|
return tuple(
|
|
648
708
|
computed(() => mutationResultToVue(a.value)),
|
|
649
709
|
b
|
|
650
|
-
)
|
|
710
|
+
) as any
|
|
651
711
|
}
|
|
652
712
|
|
|
653
713
|
const _buildFormFromSchema = <
|
|
@@ -722,6 +782,7 @@ export const makeClient = <Locale extends string, R>(
|
|
|
722
782
|
useHandleRequestWithToast: _useHandleRequestWithToast,
|
|
723
783
|
buildFormFromSchema: _buildFormFromSchema,
|
|
724
784
|
useSafeQuery: _useSafeQuery,
|
|
725
|
-
useSafeMutation: _useSafeMutation
|
|
785
|
+
useSafeMutation: _useSafeMutation,
|
|
786
|
+
useUnsafeMutation: _useUnsafeMutation
|
|
726
787
|
}
|
|
727
788
|
}
|