@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/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, reportRuntimeError } from "./lib.js";
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 = (...args) => Effect
62
- .sync(() => {
63
- state.value = Result.initial(true);
64
- })
65
- .pipe(Effect.zipRight(Effect.suspend(() => handler(...args))), Effect.onExit((exit) => Effect.sync(() => (state.value = Result.fromExit(exit)))));
66
- return tuple(state, act);
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 useSafeMutation = (self, options) => {
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 [state, handle_] = asResult((self, i = void 0) => mapHandler(Effect.tapBoth(self, { onFailure: () => invalidateCache, onSuccess: () => invalidateCache }), i));
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 = tuple(state, Effect.isEffect(handler) ? handle(handler, self.name) : (i) => handle(handler(i), self.name, i));
102
+ const r = Effect.isEffect(handler) ? handle(handler) : (i) => handle(handler(i), i);
98
103
  return r;
99
104
  };
100
- return useSafeMutation;
105
+ return useMutation;
101
106
  };
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXV0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL211dGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxLQUFLLE1BQU0sTUFBTSxzQkFBc0IsQ0FBQTtBQUU5QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFFcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFFM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBRTNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sS0FBSyxDQUFBO0FBQzFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFFM0QsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBbUIsRUFBRSxFQUFFO0lBQ2pELE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMzQixNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDL0MsNkZBQTZGO0lBQzdGLG9GQUFvRjtJQUNwRixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7SUFDakYsSUFBSSxDQUFDLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FB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
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.32.0",
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.66.11",
10
- "@vueuse/core": "^12.7.0",
9
+ "@tanstack/vue-query": "^5.67.1",
10
+ "@vueuse/core": "^12.8.2",
11
11
  "query-string": "^9.1.1",
12
- "effect-app": "2.32.2"
12
+ "effect-app": "2.33.0"
13
13
  },
14
14
  "peerDependencies": {
15
- "@effect/platform": "^0.77.4",
16
- "@effect/platform-browser": "^0.56.4",
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.3.0",
20
- "effect": "^3.13.4",
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.8",
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",
@@ -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, ErrorReported, tryToJson, tryToReport } from "effect-app/client/errors"
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.tapErrorCause((cause) =>
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
- const _useSafeMutation = makeMutation()
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, Readonly<Ref<Result<A2, E2>, Result<A2, E2>>>>
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, Readonly<Ref<Result<A2, E2>, Result<A2, E2>>>>
388
- } = (
389
- self: any,
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 [a, b] = _useSafeMutation({
432
+ const handler = self.handler
433
+ const [a, b] = asResult(_useUnsafeMutation({
395
434
  ...self,
396
- handler: Effect.isEffect(self.handler)
435
+ handler: Effect.isEffect(handler)
397
436
  ? (pipe(
398
437
  Effect.annotateCurrentSpan({ action }),
399
- Effect.andThen(self.handler)
438
+ Effect.zipRight(handler)
400
439
  ) as any)
401
- : (...args: any[]) =>
440
+ : (...args: [any]) =>
402
441
  pipe(
403
442
  Effect.annotateCurrentSpan({ action }),
404
- Effect.andThen(self.handler(...args))
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] = _useSafeMutation({
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
- function _makeUseAndHandleMutation(
592
- defaultOptions?: Opts<any, any, any, any, any, any, any, any, any>
593
- ) {
594
- return ((self: any, action: any, options: any) => {
595
- return _useAndHandleMutation(
596
- self,
597
- action,
598
- { ...defaultOptions, ...options }
599
- )
600
- }) as unknown as {
601
- <
602
- I,
603
- E extends ResponseErrors,
604
- A,
605
- R,
606
- Request extends TaggedRequestClassAny,
607
- A2 = A,
608
- E2 extends ResponseErrors = E,
609
- R2 = R,
610
- ESuccess = never,
611
- RSuccess = never,
612
- EError = never,
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
  }