@effect-app/vue 4.0.0-beta.0 → 4.0.0-beta.2
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 +20 -0
- package/dist/experimental/commander.d.ts +3 -3
- package/dist/experimental/commander.d.ts.map +1 -1
- package/dist/form.d.ts +2 -3
- package/dist/form.d.ts.map +1 -1
- package/dist/form.js +1 -1
- package/dist/lib.d.ts +1 -1
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +2 -2
- package/dist/makeClient.d.ts +8 -8
- package/dist/makeClient.d.ts.map +1 -1
- package/dist/makeClient.js +4 -4
- package/dist/mutate.d.ts +5 -5
- package/dist/mutate.d.ts.map +1 -1
- package/dist/mutate.js +11 -11
- package/dist/query.d.ts +10 -10
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +13 -13
- package/package.json +4 -5
- package/src/experimental/commander.ts +2 -2
- package/src/form.ts +6 -7
- package/src/lib.ts +1 -1
- package/src/makeClient.ts +11 -11
- package/src/mutate.ts +13 -13
- package/src/query.ts +28 -28
- package/test/Mutation.test.ts +13 -13
- package/test/dist/stubs.d.ts +18 -14
- package/test/dist/stubs.d.ts.map +1 -1
package/dist/query.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
|
3
3
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
4
4
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
5
|
-
import * as
|
|
5
|
+
import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
|
|
6
6
|
import { useQuery as useTanstackQuery, useQueryClient } from "@tanstack/vue-query";
|
|
7
7
|
import { Array, Cause, Effect, Exit, flow, Option, S } from "effect-app";
|
|
8
8
|
import { ServiceUnavailableError } from "effect-app/client/errors";
|
|
@@ -77,7 +77,7 @@ export const makeQuery = (getRuntime) => {
|
|
|
77
77
|
isValidating: r.isFetching.value
|
|
78
78
|
}));
|
|
79
79
|
// not using `computed` here as we have a circular dependency
|
|
80
|
-
watch(result, (value) => latestSuccess.value = Option.getOrUndefined(
|
|
80
|
+
watch(result, (value) => latestSuccess.value = Option.getOrUndefined(AsyncResult.value(value)), { immediate: true });
|
|
81
81
|
return [
|
|
82
82
|
result,
|
|
83
83
|
computed(() => latestSuccess.value),
|
|
@@ -90,15 +90,15 @@ export const makeQuery = (getRuntime) => {
|
|
|
90
90
|
};
|
|
91
91
|
function swrToQuery(r) {
|
|
92
92
|
if (r.error !== undefined) {
|
|
93
|
-
return
|
|
94
|
-
previous: r.data === undefined ? Option.none() : Option.some(
|
|
93
|
+
return AsyncResult.failureWithPrevious(r.error.effectCause, {
|
|
94
|
+
previous: r.data === undefined ? Option.none() : Option.some(AsyncResult.success(r.data)),
|
|
95
95
|
waiting: r.isValidating
|
|
96
96
|
});
|
|
97
97
|
}
|
|
98
98
|
if (r.data !== undefined) {
|
|
99
|
-
return
|
|
99
|
+
return AsyncResult.success(r.data, { waiting: r.isValidating });
|
|
100
100
|
}
|
|
101
|
-
return
|
|
101
|
+
return AsyncResult.initial(r.isValidating);
|
|
102
102
|
}
|
|
103
103
|
const useQuery = (self) => {
|
|
104
104
|
const q = useQuery_(self);
|
|
@@ -109,15 +109,15 @@ export const makeQuery = (getRuntime) => {
|
|
|
109
109
|
return useQuery;
|
|
110
110
|
};
|
|
111
111
|
function orPrevious(result) {
|
|
112
|
-
return
|
|
113
|
-
?
|
|
112
|
+
return AsyncResult.isFailure(result) && Option.isSome(result.previousSuccess)
|
|
113
|
+
? AsyncResult.success(result.previousSuccess.value, { waiting: result.waiting })
|
|
114
114
|
: result;
|
|
115
115
|
}
|
|
116
116
|
export function composeQueries(results, renderPreviousOnFailure) {
|
|
117
117
|
const values = renderPreviousOnFailure
|
|
118
118
|
? Object.values(results).map(orPrevious)
|
|
119
119
|
: Object.values(results);
|
|
120
|
-
const error = values.find(
|
|
120
|
+
const error = values.find(AsyncResult.isFailure);
|
|
121
121
|
if (error) {
|
|
122
122
|
return error;
|
|
123
123
|
}
|
|
@@ -125,16 +125,16 @@ export function composeQueries(results, renderPreviousOnFailure) {
|
|
|
125
125
|
if (initial.value !== undefined) {
|
|
126
126
|
return initial.value;
|
|
127
127
|
}
|
|
128
|
-
const loading = Array.findFirst(values, (x) =>
|
|
128
|
+
const loading = Array.findFirst(values, (x) => AsyncResult.isInitial(x) && x.waiting ? Option.some(x) : Option.none());
|
|
129
129
|
if (loading.value !== undefined) {
|
|
130
130
|
return loading.value;
|
|
131
131
|
}
|
|
132
132
|
const isRefreshing = values.some((x) => x.waiting);
|
|
133
133
|
const r = Object.entries(results).reduce((prev, [key, value]) => {
|
|
134
|
-
prev[key] =
|
|
134
|
+
prev[key] = AsyncResult.value(value).value;
|
|
135
135
|
return prev;
|
|
136
136
|
}, {});
|
|
137
|
-
return
|
|
137
|
+
return AsyncResult.success(r, { waiting: isRefreshing });
|
|
138
138
|
}
|
|
139
139
|
export const useUpdateQuery = () => {
|
|
140
140
|
const queryClient = useQueryClient();
|
|
@@ -153,4 +153,4 @@ export const useUpdateQuery = () => {
|
|
|
153
153
|
};
|
|
154
154
|
return f;
|
|
155
155
|
};
|
|
156
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
156
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELHNEQUFzRDtBQUN0RCx3REFBd0Q7QUFDeEQsNERBQTREO0FBQzVELE9BQU8sS0FBSyxXQUFXLE1BQU0sd0NBQXdDLENBQUE7QUFDckUsT0FBTyxFQUE0TSxRQUFRLElBQUksZ0JBQWdCLEVBQUUsY0FBYyxFQUEyRCxNQUFNLHFCQUFxQixDQUFBO0FBQ3JWLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQW1CLE1BQU0sWUFBWSxDQUFBO0FBR3pGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBRWxFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBQ3hFLE9BQU8sRUFBRSxRQUFRLEVBQTJDLEdBQUcsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFvQixNQUFNLEtBQUssQ0FBQTtBQUNqSCxPQUFPLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sVUFBVSxDQUFBO0FBK0QzRCxNQUFNLE9BQU8saUJBQXFCLFNBQVEsS0FBSztJQUUxQjtJQURWLEtBQUssQ0FBUztJQUN2QixZQUFtQixXQUEyQjtRQUM1QyxLQUFLLENBQUMsMkJBQTJCLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO1FBRDdDLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUU1QyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDeEMsQ0FBQztDQUNGO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUksVUFBMEMsRUFBRSxFQUFFO0lBQ3pFLE1BQU0sU0FBUyxHQW9DWCxDQUNGLENB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-app/vue",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.2",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"homepage": "https://github.com/effect-ts-app/libs/tree/main/packages/vue",
|
|
@@ -11,11 +11,10 @@
|
|
|
11
11
|
"@vueuse/core": "^14.2.1",
|
|
12
12
|
"change-case": "^5.4.4",
|
|
13
13
|
"query-string": "^9.3.1",
|
|
14
|
-
"effect-app": "4.0.0-beta.
|
|
14
|
+
"effect-app": "4.0.0-beta.2"
|
|
15
15
|
},
|
|
16
16
|
"peerDependencies": {
|
|
17
|
-
"@effect
|
|
18
|
-
"@effect-atom/atom-vue": "^0.5.0",
|
|
17
|
+
"@effect/atom-vue": "^4.0.0-beta.25",
|
|
19
18
|
"@effect/platform-browser": "^4.0.0-beta.25",
|
|
20
19
|
"@sentry/browser": "^10.40.0",
|
|
21
20
|
"effect": "^4.0.0-beta.25",
|
|
@@ -31,7 +30,7 @@
|
|
|
31
30
|
"typescript": "~5.9.3",
|
|
32
31
|
"vite": "^7.3.1",
|
|
33
32
|
"vitest": "^4.0.18",
|
|
34
|
-
"@effect-app/eslint-shared-config": "0.5.7-beta.
|
|
33
|
+
"@effect-app/eslint-shared-config": "0.5.7-beta.1"
|
|
35
34
|
},
|
|
36
35
|
"typesVersions": {
|
|
37
36
|
"*": {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
2
|
import { asResult, type MissingDependencies, reportRuntimeError } from "@effect-app/vue"
|
|
3
3
|
import { reportMessage } from "@effect-app/vue/errorReporter"
|
|
4
|
-
import { type
|
|
4
|
+
import { type AsyncResult } from "effect/unstable/reactivity/AsyncResult"
|
|
5
5
|
import { Cause, Effect, type Exit, type Fiber, flow, Layer, Match, MutableHashMap, Option, S, ServiceMap } from "effect-app"
|
|
6
6
|
import { SupportedErrors } from "effect-app/client"
|
|
7
7
|
import { OperationFailure, OperationSuccess } from "effect-app/Operations"
|
|
@@ -139,7 +139,7 @@ export declare namespace Commander {
|
|
|
139
139
|
/** reactive */
|
|
140
140
|
label: string
|
|
141
141
|
/** reactive */
|
|
142
|
-
result:
|
|
142
|
+
result: AsyncResult<A, E>
|
|
143
143
|
/** reactive */
|
|
144
144
|
waiting: boolean
|
|
145
145
|
/** reactive */
|
package/src/form.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { createIntl, type IntlFormatters } from "@formatjs/intl"
|
|
2
2
|
import type {} from "intl-messageformat"
|
|
3
3
|
import { Cause, Exit, Option, pipe, S } from "effect-app"
|
|
4
|
-
import type { Schema } from "effect-app/Schema"
|
|
5
4
|
import type { Unbranded } from "effect-app/Schema/brand"
|
|
6
5
|
import type { IsUnion } from "effect-app/utils"
|
|
7
6
|
import { capitalize, ref } from "vue"
|
|
@@ -122,7 +121,7 @@ function handlePropertySignature(
|
|
|
122
121
|
switch (schema.ast._tag) {
|
|
123
122
|
case "Objects": {
|
|
124
123
|
return buildFieldInfoFromFieldsRoot(
|
|
125
|
-
schema as S.
|
|
124
|
+
schema as S.Codec<Record<PropertyKey, any>>
|
|
126
125
|
)
|
|
127
126
|
}
|
|
128
127
|
case "Union": {
|
|
@@ -194,7 +193,7 @@ export function buildFieldInfoFromFields<
|
|
|
194
193
|
From extends Record<PropertyKey, any>,
|
|
195
194
|
To extends Record<PropertyKey, any>
|
|
196
195
|
>(
|
|
197
|
-
schema: (
|
|
196
|
+
schema: (S.Codec<To, From>) & { fields?: S.Struct.Fields }
|
|
198
197
|
) {
|
|
199
198
|
return buildFieldInfoFromFieldsRoot(schema).fields
|
|
200
199
|
}
|
|
@@ -204,7 +203,7 @@ export function buildFieldInfoFromFieldsRoot<
|
|
|
204
203
|
To extends Record<PropertyKey, any>,
|
|
205
204
|
R
|
|
206
205
|
>(
|
|
207
|
-
schema: (
|
|
206
|
+
schema: (S.Codec<To, From, R>) & { fields?: S.Struct.Fields }
|
|
208
207
|
): NestedFieldInfo<To> {
|
|
209
208
|
const ast = getObjectsAST(schema.ast)
|
|
210
209
|
|
|
@@ -245,9 +244,9 @@ function buildFieldInfo(
|
|
|
245
244
|
property: S.AST.PropertySignature
|
|
246
245
|
): FieldInfo<any> {
|
|
247
246
|
const propertyKey = property.name
|
|
248
|
-
const schema = S.make<S.
|
|
247
|
+
const schema = S.make<S.Codec<unknown>>(property.type)
|
|
249
248
|
const metadata = getMetadataFromSchema(property.type)
|
|
250
|
-
const parse = S.decodeUnknownExit(schema as S.
|
|
249
|
+
const parse = S.decodeUnknownExit(schema as S.Codec<unknown> & { readonly DecodingServices: never })
|
|
251
250
|
|
|
252
251
|
const nullableOrUndefined = S.AST.isUnion(property.type)
|
|
253
252
|
&& (property.type.types.includes(S.Null.ast) || property.type.types.some((_) => _._tag === "Undefined"))
|
|
@@ -419,7 +418,7 @@ export function getMetadataFromSchema(
|
|
|
419
418
|
|
|
420
419
|
let jschema: any
|
|
421
420
|
try {
|
|
422
|
-
const doc = S.toJsonSchemaDocument(S.make<S.
|
|
421
|
+
const doc = S.toJsonSchemaDocument(S.make<S.Codec<unknown>>(realSelf))
|
|
423
422
|
jschema = doc.schema as any
|
|
424
423
|
const defs = doc.definitions as Record<string, any>
|
|
425
424
|
// resolve $ref against definitions
|
package/src/lib.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { isHttpClientError } from "effect/unstable/http/HttpClientError"
|
|
|
6
6
|
import type { MaybeRefOrGetter } from "vue"
|
|
7
7
|
import { reportError } from "./errorReporter.js"
|
|
8
8
|
|
|
9
|
-
export * as
|
|
9
|
+
export * as AsyncResult from "effect/unstable/reactivity/AsyncResult"
|
|
10
10
|
|
|
11
11
|
const reportRuntimeError_ = reportError("Runtime")
|
|
12
12
|
|
package/src/makeClient.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import * as
|
|
2
|
+
import * as AsyncResult from "effect/unstable/reactivity/AsyncResult"
|
|
3
3
|
import { type InvalidateOptions, type InvalidateQueryFilters, isCancelledError, type QueryObserverResult, type RefetchOptions, type UseQueryReturnType } from "@tanstack/vue-query"
|
|
4
4
|
import { camelCase } from "change-case"
|
|
5
5
|
import { Cause, Data, Effect, Exit, Layer, type ManagedRuntime, Match, Option, S, ServiceMap, Struct } from "effect-app"
|
|
@@ -411,7 +411,7 @@ export class LegacyMutationImpl<RT> {
|
|
|
411
411
|
self: RequestHandlerWithInput<I, A, E, R, Request, Name>,
|
|
412
412
|
options?: MutationOptions<A, E, R, A2, E2, R2, I>
|
|
413
413
|
): readonly [
|
|
414
|
-
ComputedRef<
|
|
414
|
+
ComputedRef<AsyncResult.AsyncResult<A2, E2>>,
|
|
415
415
|
(i: I) => Effect.Effect<Exit.Exit<A2, E2>, never, R2>
|
|
416
416
|
]
|
|
417
417
|
/**
|
|
@@ -423,7 +423,7 @@ export class LegacyMutationImpl<RT> {
|
|
|
423
423
|
self: RequestHandler<A, E, R, Request, Name>,
|
|
424
424
|
options?: MutationOptions<A, E, R, A2, E2, R2>
|
|
425
425
|
): readonly [
|
|
426
|
-
ComputedRef<
|
|
426
|
+
ComputedRef<AsyncResult.AsyncResult<A2, E2>>,
|
|
427
427
|
Effect.Effect<Exit.Exit<A2, E2>, never, R2>
|
|
428
428
|
]
|
|
429
429
|
} = <I, E, A, R, Request extends Req, Name extends string, A2 = A, E2 = E, R2 = R>(
|
|
@@ -617,7 +617,7 @@ export class LegacyMutationImpl<RT> {
|
|
|
617
617
|
self: RequestHandlerWithInput<I, A, E, R, Request, Name>,
|
|
618
618
|
action: string,
|
|
619
619
|
options?: Opts<A, E, R, I, A2, E2, R2, ESuccess, RSuccess, EError, RError, EDefect, RDefect>
|
|
620
|
-
): Resp<I, A2, E2, R2, ComputedRef<
|
|
620
|
+
): Resp<I, A2, E2, R2, ComputedRef<AsyncResult.AsyncResult<A2, E2>>>
|
|
621
621
|
/**
|
|
622
622
|
* Pass a function that returns an Effect, e.g from a client action, give it a name.
|
|
623
623
|
* Returns a tuple with raw Result and execution function which reports success and errors as Toast.
|
|
@@ -642,7 +642,7 @@ export class LegacyMutationImpl<RT> {
|
|
|
642
642
|
self: RequestHandler<A, E, R, Request, Name>,
|
|
643
643
|
action: string,
|
|
644
644
|
options?: Opts<A, E, R, void, A2, E2, R2, ESuccess, RSuccess, EError, RError, EDefect, RDefect>
|
|
645
|
-
): ActResp<A2, E2, R2, ComputedRef<
|
|
645
|
+
): ActResp<A2, E2, R2, ComputedRef<AsyncResult.AsyncResult<A2, E2>>>
|
|
646
646
|
} = <E extends ResponseErrors, A, R, Request extends Req, Name extends string, I>(
|
|
647
647
|
self: RequestHandlerWithInput<I, A, E, R, Request, Name> | RequestHandler<A, E, R, Request, Name>,
|
|
648
648
|
action: any,
|
|
@@ -1010,13 +1010,13 @@ export class LegacyMutationImpl<RT> {
|
|
|
1010
1010
|
OnSubmitA
|
|
1011
1011
|
>(
|
|
1012
1012
|
s:
|
|
1013
|
-
& S.
|
|
1013
|
+
& S.Codec<To>
|
|
1014
1014
|
& { new(c: C): any; extend: any; fields: S.Struct.Fields },
|
|
1015
1015
|
state: Ref<Omit<From, "_tag">>,
|
|
1016
1016
|
onSubmit: (a: To) => Effect.Effect<OnSubmitA, never, RT>
|
|
1017
1017
|
) => {
|
|
1018
1018
|
const fields = buildFieldInfoFromFieldsRoot(s).fields
|
|
1019
|
-
const schema = S.Struct(Struct.omit(s.fields, ["_tag"])) as unknown as S.
|
|
1019
|
+
const schema = S.Struct(Struct.omit(s.fields, ["_tag"])) as unknown as S.Codec<any> & {
|
|
1020
1020
|
readonly DecodingServices: never
|
|
1021
1021
|
}
|
|
1022
1022
|
const parse = S.decodeUnknownSync(schema)
|
|
@@ -1121,7 +1121,7 @@ export class QueryImpl<R> {
|
|
|
1121
1121
|
*/
|
|
1122
1122
|
<TData = A>(options?: CustomUndefinedInitialQueryOptions<A, E, TData>): Promise<
|
|
1123
1123
|
readonly [
|
|
1124
|
-
ComputedRef<
|
|
1124
|
+
ComputedRef<AsyncResult.AsyncResult<TData, E>>,
|
|
1125
1125
|
ComputedRef<TData>,
|
|
1126
1126
|
(
|
|
1127
1127
|
options?: RefetchOptions
|
|
@@ -1151,7 +1151,7 @@ export class QueryImpl<R> {
|
|
|
1151
1151
|
*/
|
|
1152
1152
|
<TData = A>(arg: Arg | WatchSource<Arg>, options?: CustomUndefinedInitialQueryOptions<A, E, TData>): Promise<
|
|
1153
1153
|
readonly [
|
|
1154
|
-
ComputedRef<
|
|
1154
|
+
ComputedRef<AsyncResult.AsyncResult<TData, E>>,
|
|
1155
1155
|
ComputedRef<TData>,
|
|
1156
1156
|
(
|
|
1157
1157
|
options?: RefetchOptions
|
|
@@ -1189,7 +1189,7 @@ export class QueryImpl<R> {
|
|
|
1189
1189
|
return yield* Effect.interrupt
|
|
1190
1190
|
}
|
|
1191
1191
|
const result = resultRef.value
|
|
1192
|
-
if (
|
|
1192
|
+
if (AsyncResult.isInitial(result)) {
|
|
1193
1193
|
console.error("Internal Error: Promise should be resolved already", {
|
|
1194
1194
|
self,
|
|
1195
1195
|
argOrOptions,
|
|
@@ -1201,7 +1201,7 @@ export class QueryImpl<R> {
|
|
|
1201
1201
|
"Internal Error: Promise should be resolved already"
|
|
1202
1202
|
)
|
|
1203
1203
|
}
|
|
1204
|
-
if (
|
|
1204
|
+
if (AsyncResult.isFailure(result)) {
|
|
1205
1205
|
return yield* Exit.failCause(result.cause)
|
|
1206
1206
|
}
|
|
1207
1207
|
|
package/src/mutate.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import * as
|
|
2
|
+
import * as AsyncResult from "effect/unstable/reactivity/AsyncResult"
|
|
3
3
|
import { type InvalidateOptions, type InvalidateQueryFilters, type QueryClient, useQueryClient } from "@tanstack/vue-query"
|
|
4
4
|
import { type Cause, Effect, type Exit, Option } from "effect-app"
|
|
5
5
|
import { type Req } from "effect-app/client"
|
|
@@ -19,7 +19,7 @@ export const getQueryKey = (h: { id: string; options?: ClientForOptions }) => {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
export function mutationResultToVue<A, E>(
|
|
22
|
-
mutationResult:
|
|
22
|
+
mutationResult: AsyncResult.AsyncResult<A, E>
|
|
23
23
|
): Res<A, E> {
|
|
24
24
|
switch (mutationResult._tag) {
|
|
25
25
|
case "Initial": {
|
|
@@ -49,20 +49,20 @@ export interface Res<A, E> {
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
export function make<A, E, R>(self: Effect.Effect<A, E, R>) {
|
|
52
|
-
const result = shallowRef(
|
|
52
|
+
const result = shallowRef(AsyncResult.initial() as AsyncResult.AsyncResult<A, E>)
|
|
53
53
|
|
|
54
54
|
const execute = Effect
|
|
55
55
|
.sync(() => {
|
|
56
|
-
result.value =
|
|
56
|
+
result.value = AsyncResult.waiting(result.value)
|
|
57
57
|
})
|
|
58
58
|
.pipe(
|
|
59
59
|
Effect.andThen(self),
|
|
60
60
|
Effect.exit,
|
|
61
|
-
Effect.map(
|
|
61
|
+
Effect.map(AsyncResult.fromExit),
|
|
62
62
|
Effect.flatMap((r) => Effect.sync(() => result.value = r))
|
|
63
63
|
)
|
|
64
64
|
|
|
65
|
-
const latestSuccess = computed(() => Option.getOrUndefined(
|
|
65
|
+
const latestSuccess = computed(() => Option.getOrUndefined(AsyncResult.value(result.value)))
|
|
66
66
|
|
|
67
67
|
return tuple(result, latestSuccess, execute)
|
|
68
68
|
}
|
|
@@ -103,38 +103,38 @@ export interface MutationOptions<A, E, R, A2 = A, E2 = E, R2 = R, I = void> exte
|
|
|
103
103
|
export const asResult: {
|
|
104
104
|
<A, E, R>(
|
|
105
105
|
handler: Effect.Effect<A, E, R>
|
|
106
|
-
): readonly [ComputedRef<
|
|
106
|
+
): readonly [ComputedRef<AsyncResult.AsyncResult<A, E>>, Effect.Effect<Exit.Exit<A, E>, never, R>]
|
|
107
107
|
<Args extends readonly any[], A, E, R>(
|
|
108
108
|
handler: (...args: Args) => Effect.Effect<A, E, R>
|
|
109
|
-
): readonly [ComputedRef<
|
|
109
|
+
): readonly [ComputedRef<AsyncResult.AsyncResult<A, E>>, (...args: Args) => Effect.Effect<Exit.Exit<A, E>, never, R>]
|
|
110
110
|
} = <Args extends readonly any[], A, E, R>(
|
|
111
111
|
handler: Effect.Effect<A, E, R> | ((...args: Args) => Effect.Effect<A, E, R>)
|
|
112
112
|
) => {
|
|
113
|
-
const state = shallowRef<
|
|
113
|
+
const state = shallowRef<AsyncResult.AsyncResult<A, E>>(AsyncResult.initial())
|
|
114
114
|
|
|
115
115
|
const act = Effect.isEffect(handler)
|
|
116
116
|
? Effect
|
|
117
117
|
.sync(() => {
|
|
118
|
-
state.value =
|
|
118
|
+
state.value = AsyncResult.initial(true)
|
|
119
119
|
})
|
|
120
120
|
.pipe(
|
|
121
121
|
Effect.andThen(Effect.suspend(() =>
|
|
122
122
|
handler.pipe(
|
|
123
123
|
Effect.exit,
|
|
124
|
-
Effect.tap((exit) => Effect.sync(() => (state.value =
|
|
124
|
+
Effect.tap((exit) => Effect.sync(() => (state.value = AsyncResult.fromExit(exit))))
|
|
125
125
|
)
|
|
126
126
|
))
|
|
127
127
|
)
|
|
128
128
|
: (...args: Args) =>
|
|
129
129
|
Effect
|
|
130
130
|
.sync(() => {
|
|
131
|
-
state.value =
|
|
131
|
+
state.value = AsyncResult.initial(true)
|
|
132
132
|
})
|
|
133
133
|
.pipe(
|
|
134
134
|
Effect.andThen(Effect.suspend(() =>
|
|
135
135
|
handler(...args).pipe(
|
|
136
136
|
Effect.exit,
|
|
137
|
-
Effect.tap((exit) => Effect.sync(() => (state.value =
|
|
137
|
+
Effect.tap((exit) => Effect.sync(() => (state.value = AsyncResult.fromExit(exit))))
|
|
138
138
|
)
|
|
139
139
|
))
|
|
140
140
|
)
|
package/src/query.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
|
3
3
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
4
4
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
5
|
-
import * as
|
|
5
|
+
import * as AsyncResult from "effect/unstable/reactivity/AsyncResult"
|
|
6
6
|
import { type DefaultError, type Enabled, type InitialDataFunction, type NonUndefinedGuard, type PlaceholderDataFunction, type QueryKey, type QueryObserverOptions, type QueryObserverResult, type RefetchOptions, useQuery as useTanstackQuery, useQueryClient, type UseQueryDefinedReturnType, type UseQueryReturnType } from "@tanstack/vue-query"
|
|
7
7
|
import { Array, Cause, Effect, Exit, flow, Option, S, type ServiceMap } from "effect-app"
|
|
8
8
|
import { type Req } from "effect-app/client"
|
|
@@ -93,7 +93,7 @@ export const makeQuery = <R>(getRuntime: () => ServiceMap.ServiceMap<R>) => {
|
|
|
93
93
|
arg: I | WatchSource<I> | undefined,
|
|
94
94
|
options?: CustomUndefinedInitialQueryOptions<A, E, TData>
|
|
95
95
|
): readonly [
|
|
96
|
-
ComputedRef<
|
|
96
|
+
ComputedRef<AsyncResult.AsyncResult<TData, E>>,
|
|
97
97
|
ComputedRef<TData | undefined>,
|
|
98
98
|
(options?: RefetchOptions) => Effect.Effect<QueryObserverResult<TData, KnownFiberFailure<E>>, never, never>,
|
|
99
99
|
UseQueryDefinedReturnType<TData, KnownFiberFailure<E>>
|
|
@@ -103,7 +103,7 @@ export const makeQuery = <R>(getRuntime: () => ServiceMap.ServiceMap<R>) => {
|
|
|
103
103
|
arg: I | WatchSource<I> | undefined,
|
|
104
104
|
options: CustomDefinedInitialQueryOptions<A, E, TData>
|
|
105
105
|
): readonly [
|
|
106
|
-
ComputedRef<
|
|
106
|
+
ComputedRef<AsyncResult.AsyncResult<TData, E>>,
|
|
107
107
|
ComputedRef<TData>,
|
|
108
108
|
(options?: RefetchOptions) => Effect.Effect<QueryObserverResult<TData, KnownFiberFailure<E>>, never, never>,
|
|
109
109
|
UseQueryDefinedReturnType<TData, KnownFiberFailure<E>>
|
|
@@ -113,7 +113,7 @@ export const makeQuery = <R>(getRuntime: () => ServiceMap.ServiceMap<R>) => {
|
|
|
113
113
|
arg: I | WatchSource<I> | undefined,
|
|
114
114
|
options: CustomDefinedPlaceholderQueryOptions<A, E, TData>
|
|
115
115
|
): readonly [
|
|
116
|
-
ComputedRef<
|
|
116
|
+
ComputedRef<AsyncResult.AsyncResult<TData, E>>,
|
|
117
117
|
ComputedRef<TData>,
|
|
118
118
|
(options?: RefetchOptions) => Effect.Effect<QueryObserverResult<TData, KnownFiberFailure<E>>, never, never>,
|
|
119
119
|
UseQueryDefinedReturnType<TData, KnownFiberFailure<E>>
|
|
@@ -202,7 +202,7 @@ export const makeQuery = <R>(getRuntime: () => ServiceMap.ServiceMap<R>) => {
|
|
|
202
202
|
)
|
|
203
203
|
|
|
204
204
|
const latestSuccess = shallowRef<TData>()
|
|
205
|
-
const result = computed(():
|
|
205
|
+
const result = computed((): AsyncResult.AsyncResult<TData, E> =>
|
|
206
206
|
swrToQuery({
|
|
207
207
|
error: r.error.value ?? undefined,
|
|
208
208
|
data: r.data.value === undefined ? latestSuccess.value : r.data.value, // we fall back to existing data, as tanstack query might loose it when the key changes
|
|
@@ -210,7 +210,7 @@ export const makeQuery = <R>(getRuntime: () => ServiceMap.ServiceMap<R>) => {
|
|
|
210
210
|
})
|
|
211
211
|
)
|
|
212
212
|
// not using `computed` here as we have a circular dependency
|
|
213
|
-
watch(result, (value) => latestSuccess.value = Option.getOrUndefined(
|
|
213
|
+
watch(result, (value) => latestSuccess.value = Option.getOrUndefined(AsyncResult.value(value)), { immediate: true })
|
|
214
214
|
|
|
215
215
|
return [
|
|
216
216
|
result,
|
|
@@ -231,21 +231,21 @@ export const makeQuery = <R>(getRuntime: () => ServiceMap.ServiceMap<R>) => {
|
|
|
231
231
|
error: KnownFiberFailure<E> | undefined
|
|
232
232
|
data: A | undefined
|
|
233
233
|
isValidating: boolean
|
|
234
|
-
}):
|
|
234
|
+
}): AsyncResult.AsyncResult<A, E> {
|
|
235
235
|
if (r.error !== undefined) {
|
|
236
|
-
return
|
|
236
|
+
return AsyncResult.failureWithPrevious(
|
|
237
237
|
r.error.effectCause,
|
|
238
238
|
{
|
|
239
|
-
previous: r.data === undefined ? Option.none() : Option.some(
|
|
239
|
+
previous: r.data === undefined ? Option.none() : Option.some(AsyncResult.success(r.data)),
|
|
240
240
|
waiting: r.isValidating
|
|
241
241
|
}
|
|
242
242
|
)
|
|
243
243
|
}
|
|
244
244
|
if (r.data !== undefined) {
|
|
245
|
-
return
|
|
245
|
+
return AsyncResult.success<A, E>(r.data, { waiting: r.isValidating })
|
|
246
246
|
}
|
|
247
247
|
|
|
248
|
-
return
|
|
248
|
+
return AsyncResult.initial(r.isValidating)
|
|
249
249
|
}
|
|
250
250
|
|
|
251
251
|
const useQuery: {
|
|
@@ -263,7 +263,7 @@ export const makeQuery = <R>(getRuntime: () => ServiceMap.ServiceMap<R>) => {
|
|
|
263
263
|
<TData = A>(
|
|
264
264
|
options: CustomDefinedInitialQueryOptions<A, KnownFiberFailure<E>, TData>
|
|
265
265
|
): readonly [
|
|
266
|
-
ComputedRef<
|
|
266
|
+
ComputedRef<AsyncResult.AsyncResult<TData, E>>,
|
|
267
267
|
ComputedRef<TData>,
|
|
268
268
|
(options?: RefetchOptions) => Effect.Effect<QueryObserverResult<TData, KnownFiberFailure<E>>>,
|
|
269
269
|
UseQueryReturnType<any, any>
|
|
@@ -271,7 +271,7 @@ export const makeQuery = <R>(getRuntime: () => ServiceMap.ServiceMap<R>) => {
|
|
|
271
271
|
<TData = A>(
|
|
272
272
|
options: CustomDefinedPlaceholderQueryOptions<A, E, TData>
|
|
273
273
|
): readonly [
|
|
274
|
-
ComputedRef<
|
|
274
|
+
ComputedRef<AsyncResult.AsyncResult<TData, E>>,
|
|
275
275
|
ComputedRef<TData>,
|
|
276
276
|
(options?: RefetchOptions) => Effect.Effect<QueryObserverResult<TData, KnownFiberFailure<E>>, never, never>,
|
|
277
277
|
UseQueryDefinedReturnType<TData, KnownFiberFailure<E>>
|
|
@@ -281,7 +281,7 @@ export const makeQuery = <R>(getRuntime: () => ServiceMap.ServiceMap<R>) => {
|
|
|
281
281
|
* Effect results are passed to the caller, including errors.
|
|
282
282
|
*/
|
|
283
283
|
<TData = A>(options?: CustomUndefinedInitialQueryOptions<A, KnownFiberFailure<E>, TData>): readonly [
|
|
284
|
-
ComputedRef<
|
|
284
|
+
ComputedRef<AsyncResult.AsyncResult<A, E>>,
|
|
285
285
|
ComputedRef<A | undefined>,
|
|
286
286
|
(options?: RefetchOptions) => Effect.Effect<QueryObserverResult<TData, KnownFiberFailure<E>>>,
|
|
287
287
|
UseQueryReturnType<any, any>
|
|
@@ -302,7 +302,7 @@ export const makeQuery = <R>(getRuntime: () => ServiceMap.ServiceMap<R>) => {
|
|
|
302
302
|
arg: Arg | WatchSource<Arg>,
|
|
303
303
|
options: CustomDefinedInitialQueryOptions<A, KnownFiberFailure<E>, TData>
|
|
304
304
|
): readonly [
|
|
305
|
-
ComputedRef<
|
|
305
|
+
ComputedRef<AsyncResult.AsyncResult<TData, E>>,
|
|
306
306
|
ComputedRef<TData>,
|
|
307
307
|
(options?: RefetchOptions) => Effect.Effect<QueryObserverResult<TData, KnownFiberFailure<E>>>,
|
|
308
308
|
UseQueryReturnType<any, any>
|
|
@@ -315,7 +315,7 @@ export const makeQuery = <R>(getRuntime: () => ServiceMap.ServiceMap<R>) => {
|
|
|
315
315
|
arg: Arg | WatchSource<Arg>,
|
|
316
316
|
options: CustomDefinedPlaceholderQueryOptions<A, KnownFiberFailure<E>, TData>
|
|
317
317
|
): readonly [
|
|
318
|
-
ComputedRef<
|
|
318
|
+
ComputedRef<AsyncResult.AsyncResult<TData, E>>,
|
|
319
319
|
ComputedRef<TData>,
|
|
320
320
|
(options?: RefetchOptions) => Effect.Effect<QueryObserverResult<TData, KnownFiberFailure<E>>>,
|
|
321
321
|
UseQueryReturnType<any, any>
|
|
@@ -328,7 +328,7 @@ export const makeQuery = <R>(getRuntime: () => ServiceMap.ServiceMap<R>) => {
|
|
|
328
328
|
arg: Arg | WatchSource<Arg>,
|
|
329
329
|
options?: CustomUndefinedInitialQueryOptions<A, KnownFiberFailure<E>, TData>
|
|
330
330
|
): readonly [
|
|
331
|
-
ComputedRef<
|
|
331
|
+
ComputedRef<AsyncResult.AsyncResult<TData, E>>,
|
|
332
332
|
ComputedRef<TData | undefined>,
|
|
333
333
|
(options?: RefetchOptions) => Effect.Effect<QueryObserverResult<TData, KnownFiberFailure<E>>>,
|
|
334
334
|
UseQueryReturnType<any, any>
|
|
@@ -350,31 +350,31 @@ export const makeQuery = <R>(getRuntime: () => ServiceMap.ServiceMap<R>) => {
|
|
|
350
350
|
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
351
351
|
export interface MakeQuery2<R> extends ReturnType<typeof makeQuery<R>> {}
|
|
352
352
|
|
|
353
|
-
function orPrevious<E, A>(result:
|
|
354
|
-
return
|
|
355
|
-
?
|
|
353
|
+
function orPrevious<E, A>(result: AsyncResult.AsyncResult<A, E>) {
|
|
354
|
+
return AsyncResult.isFailure(result) && Option.isSome(result.previousSuccess)
|
|
355
|
+
? AsyncResult.success(result.previousSuccess.value, { waiting: result.waiting })
|
|
356
356
|
: result
|
|
357
357
|
}
|
|
358
358
|
|
|
359
359
|
export function composeQueries<
|
|
360
|
-
R extends Record<string,
|
|
360
|
+
R extends Record<string, AsyncResult.AsyncResult<any, any>>
|
|
361
361
|
>(
|
|
362
362
|
results: R,
|
|
363
363
|
renderPreviousOnFailure?: boolean
|
|
364
|
-
):
|
|
364
|
+
): AsyncResult.AsyncResult<
|
|
365
365
|
{
|
|
366
|
-
[Property in keyof R]: R[Property] extends
|
|
366
|
+
[Property in keyof R]: R[Property] extends AsyncResult.AsyncResult<infer A, any> ? A
|
|
367
367
|
: never
|
|
368
368
|
},
|
|
369
369
|
{
|
|
370
|
-
[Property in keyof R]: R[Property] extends
|
|
370
|
+
[Property in keyof R]: R[Property] extends AsyncResult.AsyncResult<any, infer E> ? E
|
|
371
371
|
: never
|
|
372
372
|
}[keyof R]
|
|
373
373
|
> {
|
|
374
374
|
const values = renderPreviousOnFailure
|
|
375
375
|
? Object.values(results).map(orPrevious)
|
|
376
376
|
: Object.values(results)
|
|
377
|
-
const error = values.find(
|
|
377
|
+
const error = values.find(AsyncResult.isFailure)
|
|
378
378
|
if (error) {
|
|
379
379
|
return error
|
|
380
380
|
}
|
|
@@ -382,7 +382,7 @@ export function composeQueries<
|
|
|
382
382
|
if (initial.value !== undefined) {
|
|
383
383
|
return initial.value
|
|
384
384
|
}
|
|
385
|
-
const loading = Array.findFirst(values, (x) =>
|
|
385
|
+
const loading = Array.findFirst(values, (x) => AsyncResult.isInitial(x) && x.waiting ? Option.some(x) : Option.none())
|
|
386
386
|
if (loading.value !== undefined) {
|
|
387
387
|
return loading.value
|
|
388
388
|
}
|
|
@@ -390,10 +390,10 @@ export function composeQueries<
|
|
|
390
390
|
const isRefreshing = values.some((x) => x.waiting)
|
|
391
391
|
|
|
392
392
|
const r = Object.entries(results).reduce((prev, [key, value]) => {
|
|
393
|
-
prev[key] =
|
|
393
|
+
prev[key] = AsyncResult.value(value).value
|
|
394
394
|
return prev
|
|
395
395
|
}, {} as any)
|
|
396
|
-
return
|
|
396
|
+
return AsyncResult.success(r, { waiting: isRefreshing })
|
|
397
397
|
}
|
|
398
398
|
|
|
399
399
|
export const useUpdateQuery = () => {
|