effect-query 0.0.1-alpha.2 → 0.0.1-alpha.3

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/index.cjs CHANGED
@@ -21,10 +21,10 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
21
21
  }) : target, mod));
22
22
 
23
23
  //#endregion
24
- let __tanstack_react_query = require("@tanstack/react-query");
25
- __tanstack_react_query = __toESM(__tanstack_react_query);
26
24
  let effect = require("effect");
27
25
  effect = __toESM(effect);
26
+ let __tanstack_react_query = require("@tanstack/react-query");
27
+ __tanstack_react_query = __toESM(__tanstack_react_query);
28
28
 
29
29
  //#region \0@oxc-project+runtime@0.95.0/helpers/typeof.js
30
30
  function _typeof(o) {
@@ -126,46 +126,109 @@ function _objectSpread2(e) {
126
126
  return e;
127
127
  }
128
128
 
129
+ //#endregion
130
+ //#region src/infiniteQueryOptions.ts
131
+ /**
132
+ * @internal
133
+ */
134
+ function effectInfiniteQueryOptions(inputOptions, context) {
135
+ const [spanName] = inputOptions.queryKey;
136
+ const queryFn = async (queryFnContext) => {
137
+ const effect$1 = inputOptions.queryFn(queryFnContext);
138
+ const result = await context.runner.run(effect$1, spanName, { signal: context.signal });
139
+ return effect.Exit.match(result, {
140
+ onSuccess: (value) => value,
141
+ onFailure: (cause) => {
142
+ if (cause._tag === "Fail") {
143
+ const failure = cause.error;
144
+ throw new EffectQueryFailure(effect.Cause.pretty(cause), failure, cause);
145
+ }
146
+ throw new EffectQueryDefect(effect.Cause.pretty(cause), cause);
147
+ }
148
+ });
149
+ };
150
+ return (0, __tanstack_react_query.infiniteQueryOptions)(_objectSpread2(_objectSpread2({}, inputOptions), {}, {
151
+ queryKey: inputOptions.queryKey,
152
+ queryFn
153
+ }));
154
+ }
155
+
156
+ //#endregion
157
+ //#region src/mutationOptions.ts
158
+ /**
159
+ * @internal
160
+ */
161
+ function effectQueryMutationOptions(inputOptions, context) {
162
+ const spanName = inputOptions.mutationKey;
163
+ const mutationFn = async (variables) => {
164
+ const effect$1 = inputOptions.mutationFn(variables);
165
+ const result = await context.runner.run(effect$1, spanName);
166
+ return effect.Exit.match(result, {
167
+ onSuccess: (value) => value,
168
+ onFailure: (cause) => {
169
+ if (cause._tag === "Fail") {
170
+ const failure = cause.error;
171
+ throw new EffectQueryFailure(effect.Cause.pretty(cause), failure, cause);
172
+ }
173
+ throw new EffectQueryDefect(effect.Cause.pretty(cause), cause);
174
+ }
175
+ });
176
+ };
177
+ return (0, __tanstack_react_query.mutationOptions)(_objectSpread2(_objectSpread2({}, inputOptions), {}, { mutationFn }));
178
+ }
179
+
180
+ //#endregion
181
+ //#region src/queryOptions.ts
182
+ /**
183
+ * @internal
184
+ */
185
+ function effectQueryQueryOptions(inputOptions, context) {
186
+ const [spanName] = inputOptions.queryKey;
187
+ const queryFn = async (queryFnContext) => {
188
+ const effect$1 = inputOptions.queryFn(queryFnContext);
189
+ const result = await context.runner.run(effect$1, spanName, { signal: context.signal });
190
+ return effect.Exit.match(result, {
191
+ onSuccess: (value) => value,
192
+ onFailure: (cause) => {
193
+ if (cause._tag === "Fail") {
194
+ const failure = cause.error;
195
+ throw new EffectQueryFailure(effect.Cause.pretty(cause), failure, cause);
196
+ }
197
+ throw new EffectQueryDefect(effect.Cause.pretty(cause), cause);
198
+ }
199
+ });
200
+ };
201
+ return (0, __tanstack_react_query.queryOptions)(_objectSpread2(_objectSpread2({}, inputOptions), {}, {
202
+ queryKey: inputOptions.queryKey,
203
+ queryFn
204
+ }));
205
+ }
206
+
207
+ //#endregion
208
+ //#region src/runner.ts
209
+ var EffectQueryRunner = class {
210
+ constructor(runtime) {
211
+ _defineProperty(this, "runtime", void 0);
212
+ this.runtime = runtime;
213
+ }
214
+ async run(effect$1, span, options = {}) {
215
+ var _this = this;
216
+ const effectToRun = effect$1;
217
+ return await _this.runtime.runPromiseExit(effectToRun.pipe(effect.Effect.withSpan(span), effect.Effect.scoped, effect.Effect.tapErrorCause(effect.Effect.logError)), { signal: options.signal });
218
+ }
219
+ };
220
+
129
221
  //#endregion
130
222
  //#region src/index.ts
131
223
  function createEffectQuery(layer) {
132
- const runtime = effect.ManagedRuntime.make(layer);
133
- const runner = (span, options = {}) => (effect$1) => runtime.runPromiseExit(effect$1.pipe(effect.Effect.withSpan(span), effect.Effect.scoped, effect.Effect.tapErrorCause(effect.Effect.logError)), { signal: options.signal });
224
+ const runner = new EffectQueryRunner(effect.ManagedRuntime.make(layer));
134
225
  return {
135
- queryOptions: (options) => {
136
- const [spanName] = options.queryKey;
137
- const queryFn = async (context) => {
138
- const result = await options.queryFn(context).pipe(runner(spanName, { signal: context.signal }));
139
- return effect.Exit.match(result, {
140
- onSuccess: (value) => value,
141
- onFailure: (cause) => {
142
- if (cause._tag === "Fail") {
143
- const failure = cause.error;
144
- throw new EffectQueryFailure(effect.Cause.pretty(cause), failure, cause);
145
- }
146
- throw new EffectQueryDefect(effect.Cause.pretty(cause), cause);
147
- }
148
- });
149
- };
150
- return (0, __tanstack_react_query.queryOptions)(_objectSpread2(_objectSpread2({}, options), {}, { queryFn }));
151
- },
152
- mutationOptions: (options) => {
153
- const spanName = options.mutationKey;
154
- const mutationFn = async (variables) => {
155
- const result = await options.mutationFn(variables).pipe(runner(spanName));
156
- return effect.Exit.match(result, {
157
- onSuccess: (value) => value,
158
- onFailure: (cause) => {
159
- if (cause._tag === "Fail") {
160
- const failure = cause.error;
161
- throw new EffectQueryFailure(effect.Cause.pretty(cause), failure, cause);
162
- }
163
- throw new EffectQueryDefect(effect.Cause.pretty(cause), cause);
164
- }
165
- });
166
- };
167
- return (0, __tanstack_react_query.mutationOptions)(_objectSpread2(_objectSpread2({}, options), {}, { mutationFn }));
168
- }
226
+ queryOptions: (options) => effectQueryQueryOptions({
227
+ queryKey: options.queryKey,
228
+ queryFn: options.queryFn
229
+ }, { runner }),
230
+ infiniteQueryOptions: (options) => effectInfiniteQueryOptions(options, { runner }),
231
+ mutationOptions: (options) => effectQueryMutationOptions(options, { runner })
169
232
  };
170
233
  }
171
234
 
package/dist/index.d.cts CHANGED
@@ -1,6 +1,6 @@
1
+ import { Cause, Effect, Layer } from "effect";
1
2
  import * as _tanstack_react_query0 from "@tanstack/react-query";
2
- import { UseMutationOptions, UseQueryOptions, skipToken } from "@tanstack/react-query";
3
- import { Cause, Effect, Layer, Scope } from "effect";
3
+ import { DefinedInitialDataInfiniteOptions, DefinedInitialDataOptions, InfiniteData, QueryFunctionContext, UndefinedInitialDataInfiniteOptions, UndefinedInitialDataOptions, UnusedSkipTokenInfiniteOptions, UnusedSkipTokenOptions, UseMutationOptions, skipToken } from "@tanstack/react-query";
4
4
 
5
5
  //#region src/errors.d.ts
6
6
  declare const EffectQueryFailureTag: "EffectQueryFailure";
@@ -32,29 +32,48 @@ declare class EffectQueryDefect<TDefect> extends Error {
32
32
  match<TReturn>(matcher: EffectQueryErrorMatcher<never, TReturn> & Record<string, unknown>): TReturn;
33
33
  }
34
34
  //#endregion
35
+ //#region src/types.d.ts
36
+ type EffectQueryQueryKey = readonly [string, string, Record<string, unknown>?];
37
+ //#endregion
38
+ //#region src/infiniteQueryOptions.d.ts
39
+ type EffectInfiniteQueryQueryFn<TFnResult$1, TFnErrorResult$1, TFnRequirements$1, TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey, TPageParam = never> = (context: QueryFunctionContext<TQueryKey, TPageParam>) => Effect.Effect<TFnResult$1, TFnErrorResult$1, TFnRequirements$1>;
40
+ type EffectInfiniteQueryUndefinedInitialDataOptions<TQueryFnData, TError, TData = InfiniteData<TQueryFnData, unknown>, TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey> = UndefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey>;
41
+ type EffectInfiniteQueryUnusedSkipTokenOptions<TQueryFnData, TError, TData = InfiniteData<TQueryFnData, unknown>, TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey> = UnusedSkipTokenInfiniteOptions<TQueryFnData, TError, TData, TQueryKey>;
42
+ type EffectInfiniteQueryDefinedInitialDataOptions<TQueryFnData, TError, TData = InfiniteData<TQueryFnData, unknown>, TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey> = DefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey>;
43
+ type EffectInfiniteQueryOptionsInput<TFnResult$1, TFnErrorResult$1, TFnRequirements$1, TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey> = Omit<EffectInfiniteQueryUndefinedInitialDataOptions<TFnResult$1, TFnErrorResult$1, TFnResult$1, TQueryKey> | EffectInfiniteQueryDefinedInitialDataOptions<TFnResult$1, TFnErrorResult$1, TFnResult$1, TQueryKey> | EffectInfiniteQueryUnusedSkipTokenOptions<TFnResult$1, TFnErrorResult$1, TFnResult$1, TQueryKey>, "queryFn" | "queryKey"> & {
44
+ queryKey: EffectQueryQueryKey;
45
+ queryFn: EffectInfiniteQueryQueryFn<TFnResult$1, TFnErrorResult$1, TFnRequirements$1, EffectQueryQueryKey>;
46
+ };
47
+ //#endregion
48
+ //#region src/mutationOptions.d.ts
49
+ type EffectfulMutationFunction<TFnResult$1, TFnErrorResult$1, TFnRequirements$1, TVariables$1> = (variables: TVariables$1) => Effect.Effect<TFnResult$1, TFnErrorResult$1, TFnRequirements$1>;
50
+ type EffectQueryMutationOptionsInput<TFnResult$1, TFnErrorResult$1, TFnRequirements$1, TVariables$1> = Omit<UseMutationOptions<TFnResult$1, TFnErrorResult$1, TVariables$1>, "mutationKey" | "mutationFn"> & {
51
+ mutationKey: string;
52
+ mutationFn: EffectfulMutationFunction<TFnResult$1, TFnErrorResult$1, TFnRequirements$1, TVariables$1> | typeof skipToken;
53
+ };
54
+ //#endregion
55
+ //#region src/queryOptions.d.ts
56
+ type EffectQueryQueryFn<TFnResult$1, TFnErrorResult$1, TFnRequirements$1, TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey, TPageParam = never> = (context: QueryFunctionContext<TQueryKey, TPageParam>) => Effect.Effect<TFnResult$1, TFnErrorResult$1, TFnRequirements$1>;
57
+ type EffectQueryUndefinedInitialDataOptions<TQueryFnData, TError, TData = TQueryFnData, TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey> = UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>;
58
+ type EffectQueryUnusedSkipTokenOptions<TQueryFnData, TError, TData = TQueryFnData, TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey> = UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey>;
59
+ type EffectQueryDefinedInitialDataOptions<TQueryFnData, TError, TData = TQueryFnData, TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey> = DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>;
60
+ type EffectQueryOptionsInput<TFnResult$1, TFnErrorResult$1, TFnRequirements$1, TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey> = Omit<EffectQueryUndefinedInitialDataOptions<TFnResult$1, TFnErrorResult$1, TFnResult$1, TQueryKey> | EffectQueryDefinedInitialDataOptions<TFnResult$1, TFnErrorResult$1, TFnResult$1, TQueryKey> | EffectQueryUnusedSkipTokenOptions<TFnResult$1, TFnErrorResult$1, TFnResult$1, TQueryKey>, "queryFn" | "queryKey"> & {
61
+ queryKey: EffectQueryQueryKey;
62
+ queryFn: EffectQueryQueryFn<TFnResult$1, TFnErrorResult$1, TFnRequirements$1, EffectQueryQueryKey>;
63
+ };
64
+ //#endregion
35
65
  //#region src/index.d.ts
36
66
  declare function createEffectQuery<Input>(layer: Layer.Layer<Input, never, never>): {
37
- queryOptions: <TData, E extends {
67
+ queryOptions: <TFnResult, TFnErrorResult extends {
68
+ _tag: string;
69
+ }, TFnRequirements>(options: EffectQueryOptionsInput<TFnResult, TFnErrorResult, TFnRequirements>) => _tanstack_react_query0.UseQueryOptions<TFnResult, [TFnErrorResult] extends [never] ? EffectQueryDefect<unknown> : EffectQueryDefect<unknown> | EffectQueryFailure<TFnErrorResult>, TFnResult, EffectQueryQueryKey>;
70
+ infiniteQueryOptions: <TFnResult, TFnErrorResult extends {
38
71
  _tag: string;
39
- }, R extends Input | Scope.Scope, TQueryKey extends QueryKey = QueryKey>(options: Omit<UseQueryOptions<TData, E, TData, TQueryKey>, "queryKey" | "queryFn"> & {
40
- queryKey: TQueryKey;
41
- queryFn: typeof skipToken | ((context: {
42
- client: _tanstack_react_query0.QueryClient;
43
- queryKey: TQueryKey;
44
- signal: AbortSignal;
45
- meta: _tanstack_react_query0.QueryMeta | undefined;
46
- pageParam?: unknown;
47
- direction?: unknown;
48
- }) => Effect.Effect<TData, E, R>);
49
- }) => UseQueryOptions<TData, [E] extends [never] ? EffectQueryDefect<unknown> : EffectQueryFailure<E> | EffectQueryDefect<unknown>, TData, TQueryKey>;
50
- mutationOptions: <TData, E extends {
72
+ }, TFnRequirements>(options: EffectInfiniteQueryOptionsInput<TFnResult, TFnErrorResult, TFnRequirements>) => _tanstack_react_query0.UseInfiniteQueryOptions<TFnResult, [TFnErrorResult] extends [never] ? EffectQueryDefect<unknown> : EffectQueryDefect<unknown> | EffectQueryFailure<TFnErrorResult>, TFnResult, EffectQueryQueryKey, unknown>;
73
+ mutationOptions: <TFnResult, TFnErrorResult extends {
51
74
  _tag: string;
52
- }, TVariables, R extends Input | Scope.Scope>(options: Omit<UseMutationOptions<TData, Error, TVariables, unknown>, "mutationKey" | "mutationFn"> & {
53
- mutationKey: string;
54
- mutationFn: typeof skipToken | ((variables: TVariables) => Effect.Effect<TData, E, R>);
55
- }) => UseMutationOptions<TData, [E] extends [never] ? never : EffectQueryFailure<E> | EffectQueryDefect<unknown>, TVariables>;
75
+ }, TFnRequirements, TVariables>(options: EffectQueryMutationOptionsInput<TFnResult, TFnErrorResult, TFnRequirements, TVariables>) => _tanstack_react_query0.UseMutationOptions<TFnResult, [TFnErrorResult] extends [never] ? never : EffectQueryDefect<unknown> | EffectQueryFailure<TFnErrorResult>, TVariables, unknown>;
56
76
  };
57
- type QueryKey = readonly [string, string, Record<string, unknown>?];
58
77
  //#endregion
59
78
  export { createEffectQuery };
60
79
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/errors.ts","../src/index.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/errors.ts","../src/types.ts","../src/infiniteQueryOptions.ts","../src/mutationOptions.ts","../src/queryOptions.ts","../src/index.ts"],"sourcesContent":[],"mappings":";;;;;cAEM;cACA;KAED;;AAL0B,CAAA,GAEzB,KAAA,GAAA,KAAA,EAAA,YAAqD,OAAA,CAAA,GAAA;EACrD,MAAA,EAAA,CAAA,KAAA,EAMY,KAAA,CAAM,KANiC,CAAA,OAAA,CAAA,EAAA,GAMd,SANc;AAAA,CAAA,GAEpD,CAAA,CAKC,QALD,CAAA,SAAA,CAAA,KAAuB,CAAA,GAMxB,MANwB,CAAA,KAAA,EAAA,KAAA,CAAA,GAOxB,QAPwB,SAAA;EAIV,IAAM,EAAA,MAAA;CAAmB,GAAA,QAK7B,QAJR,CAAA,MAAA,CAAA,IAAA,CAAA,OAAA,EAKa,OALb,CAKqB,QALrB,EAAA;EACF,IAAA,EAIyC,CAJzC;AACA,CAAA,CAAA,EAAA,GAIS,SAJT,EAEU,GAIR,MAJQ,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA;AACa,cAKd,kBALc,CAAA,iBAAA;EAAkB,IAAA,EAAA,MAAA;CAA1B,GAAA,KAAA,GAAA,KAAA,CAAA,SAOT,KAAA,CAPS;EACN,SAAA,IAAA,EAAA,OAOW,qBAPX;EAEP,SAAA,OAAA,EAMc,QANd;EAAM,SAAA,YAAA,EAOa,KAAA,CAAM,KAPnB,CAOyB,QAPzB,CAAA;EAEC,WAAA,CAAA,OAAA,EAAkB,MAAA,EAAA,OAAA,EAQlB,QARkB,EAAA,KAAA,EASpB,KAAA,CAAM,KATc,CASR,QATQ,CAAA;EAGP,KAAA,CAAA,OAAA,CAAA,CAAA,OAAA,EAeX,uBAfW,CAgBlB,QAhBkB,SAAA;IACJ,IAAA,EAAA,MAAA;EACiB,CAAA,GAcK,QAdL,GAAA,KAAA,EAe/B,OAf+B,CAAA,CAAA,EAiBhC,OAjBgC;;AAGxB,cA+BA,iBA/BA,CAAA,OAAA,CAAA,SA+BmC,KAAA,CA/BnC;EACU,SAAA,IAAA,EAAA,OA+BC,oBA/BD;EAAZ,SAAM,WAAA,EAgCO,KAAA,CAAM,KAhCb,CAgCmB,OAhCnB,CAAA;EAUX,WAAA,CAAA,OAAA,EAAA,MAAA,EAAA,MAAA,EAuBiC,OAvBjC;EAAoC,KAAA,CAAA,OAAA,CAAA,CAAA,OAAA,EA8B7B,uBA9B6B,CAAA,KAAA,EA8BE,OA9BF,CAAA,GA8Ba,MA9Bb,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,EA+BrC,OA/BqC;;;;KCvC9B,mBAAA,6BAGV;;;ADH6B,KEe1B,0BFbsD,CAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,kBEiBvC,mBFjBuC,GEiBjB,mBFjBiB,EAAA,aAAA,KAAA,CAAA,GAAA,CAAA,OAAA,EEoBhD,oBFpBgD,CEoB3B,SFpB2B,EEoBhB,UFpBgB,CAAA,EAAA,GEqBtD,MAAA,CAAO,MFrB+C,CEqBxC,WFrBwC,EEqB7B,gBFrB6B,EEqBb,iBFrBa,CAAA;AAAA,KEuBtD,8CFtBoD,CAAA,YAAA,EAAA,MAAA,EAAA,QEyB/C,YFzB+C,CEyBlC,YFzBkC,EAAA,OAAA,CAAA,EAAA,kBE0BrC,mBF1BqC,GE0Bf,mBF1Be,CAAA,GE2BrD,mCF3BqD,CE2BjB,YF3BiB,EE2BH,MF3BG,EE2BK,KF3BL,EE2BY,SF3BZ,CAAA;AAAA,KE6BpD,yCF3BuB,CAAA,YAAA,EAAA,MAAA,EAAA,QE8BlB,YF9BkB,CE8BL,YF9BK,EAAA,OAAA,CAAA,EAAA,kBE+BR,mBF/BQ,GE+Bc,mBF/Bd,CAAA,GEgCxB,8BFhCwB,CEgCO,YFhCP,EEgCqB,MFhCrB,EEgC6B,KFhC7B,EEgCoC,SFhCpC,CAAA;KEkCvB,4CF9BmB,CAAA,YAAA,EAAA,MAAA,EAAA,QEiCd,YFjCc,CEiCD,YFjCC,EAAA,OAAA,CAAA,EAAA,kBEkCJ,mBFlCI,GEkCkB,mBFlClB,CAAA,GEmCpB,iCFnCoB,CEmCc,YFnCd,EEmC4B,MFnC5B,EEmCoC,KFnCpC,EEmC2C,SFnC3C,CAAA;AAAmB,KEqC/B,+BFrC+B,CAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,kBEyCvB,mBFzCuB,GEyCD,mBFzCC,CAAA,GE0CvC,IF1CuC,CE2CvC,8CF3CuC,CE4CrC,WF5CqC,EE6CrC,gBF7CqC,EE8CrC,WF9CqC,EE+CrC,SF/CqC,CAAA,GEiDvC,4CFjDuC,CEkDrC,WFlDqC,EEmDrC,gBFnDqC,EEoDrC,WFpDqC,EEqDrC,SFrDqC,CAAA,GEuDvC,yCFvDuC,CEwDrC,WFxDqC,EEyDrC,gBFzDqC,EE0DrC,WF1DqC,EE2DrC,SF3DqC,CAAA,EAAA,SAAA,GAAA,UAAA,CAAA,GAAA;EACrC,QAAA,EE8DM,mBF9DN;EACF,OAAA,EE8DO,0BF9DP,CE+DA,WF/DA,EEgEA,gBFhEA,EEiEA,iBFjEA,EEkEA,mBFlEA,CAAA;CACA;;;KGFC,wGAMQ,iBACR,MAAA,CAAO,OAAO,aAAW,kBAAgB;AHfxC,KGiBM,+BHjB+C,CAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,YAAA,CAAA,GGsBvD,IHtBuD,CGuBzD,kBHvByD,CGuBtC,WHvBsC,EGuB3B,gBHvB2B,EGuBX,YHvBW,CAAA,EAAA,aAAA,GAAA,YAAA,CAAA,GAAA;EACrD,WAAA,EAAA,MAAA;EAED,UAAA,EGyBC,yBHzBsB,CG0BpB,WH1BoB,EG2BpB,gBH3BoB,EG4BpB,iBH5BoB,EG6BpB,YH7BoB,CAAA,GAAA,OG+Bf,SH/Be;CAIV;;;AATa,KIc1B,kBJZC,CAAA,WAAqD,EAAA,gBAAA,EAAA,iBAAA,EAAA,kBIgBvC,mBJhBuC,GIgBjB,mBJhBiB,EAAA,aAAA,KAAA,CAAA,GAAA,CAAA,OAAA,EImBhD,oBJnBgD,CImB3B,SJnB2B,EImBhB,UJnBgB,CAAA,EAAA,GIoBtD,MAAA,CAAO,MJpB+C,CIoBxC,WJpBwC,EIoB7B,gBJpB6B,EIoBb,iBJpBa,CAAA;AAAA,KIsBtD,sCJrBoD,CAAA,YAAA,EAAA,MAAA,EAAA,QIwB/C,YJxB+C,EAAA,kBIyBrC,mBJzBqC,GIyBf,mBJzBe,CAAA,GI0BrD,2BJ1BqD,CI0BzB,YJ1ByB,EI0BX,MJ1BW,EI0BH,KJ1BG,EI0BI,SJ1BJ,CAAA;AAAA,KI4BpD,iCJ1BuB,CAAA,YAAA,EAAA,MAAA,EAAA,QI6BlB,YJ7BkB,EAAA,kBI8BR,mBJ9BQ,GI8Bc,mBJ9Bd,CAAA,GI+BxB,sBJ/BwB,CI+BD,YJ/BC,EI+Ba,MJ/Bb,EI+BqB,KJ/BrB,EI+B4B,SJ/B5B,CAAA;KIiCvB,oCJ7BmB,CAAA,YAAA,EAAA,MAAA,EAAA,QIgCd,YJhCc,EAAA,kBIiCJ,mBJjCI,GIiCkB,mBJjClB,CAAA,GIkCpB,yBJlCoB,CIkCM,YJlCN,EIkCoB,MJlCpB,EIkC4B,KJlC5B,EIkCmC,SJlCnC,CAAA;AAAmB,KIoC/B,uBJpC+B,CAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,kBIwCvB,mBJxCuB,GIwCD,mBJxCC,CAAA,GIyCvC,IJzCuC,CI0CvC,sCJ1CuC,CI2CrC,WJ3CqC,EI4CrC,gBJ5CqC,EI6CrC,WJ7CqC,EI8CrC,SJ9CqC,CAAA,GIgDvC,oCJhDuC,CIiDrC,WJjDqC,EIkDrC,gBJlDqC,EImDrC,WJnDqC,EIoDrC,SJpDqC,CAAA,GIsDvC,iCJtDuC,CIuDrC,WJvDqC,EIwDrC,gBJxDqC,EIyDrC,WJzDqC,EI0DrC,SJ1DqC,CAAA,EAAA,SAAA,GAAA,UAAA,CAAA,GAAA;EACrC,QAAA,EI6DM,mBJ7DN;EACF,OAAA,EI6DO,kBJ7DP,CI8DA,WJ9DA,EI+DA,gBJ/DA,EIgEA,iBJhEA,EIiEA,mBJjEA,CAAA;CACA;;;iBKGY,gCACP,KAAA,CAAM,MAAM;ELdf,YAAA,EAAA,CAAA,SAAqD,EAAA,uBAAA;IACrD,IAAA,EAAA,MAAA;EAED,CAAA,EAAA,eAAA,CAAA,CAAA,OAAuB,EKsBb,uBLtBa,CKuBpB,SLvBoB,EKwBpB,cLxBoB,EKyBpB,eLzBoB,CAAA,EAAA,GK0BrB,sBAAA,CAAA,eL1BqB,CK0BrB,SL1BqB,EAAA,CK0BrB,cL1BqB,CAAA,SAAA,CAAA,KAAA,CAAA,GK0BrB,iBL1BqB,CAAA,OAAA,CAAA,GK0BrB,iBL1BqB,CAAA,OAAA,CAAA,GK0BrB,kBL1BqB,CK0BrB,cL1BqB,CAAA,EK0BrB,SL1BqB,EK0BrB,mBAAA,CL1BqB;EAIV,oBAAM,EAAA,CAAA,SAAA,EAAA,uBAAA;IAAmB,IAAA,EAAA,MAAA;EACrC,CAAA,EAAA,eAAA,CAAA,CAAA,OAAA,EK0CS,+BL1CT,CK2CE,SL3CF,EK4CE,cL5CF,EK6CE,eL7CF,CAAA,EAAA,GK8CC,sBAAA,CAAA,uBL9CD,CK8CC,SL9CD,EAAA,CK8CC,cL9CD,CAAA,SAAA,CAAA,KAAA,CAAA,GK8CC,iBL9CD,CAAA,OAAA,CAAA,GK8CC,iBL9CD,CAAA,OAAA,CAAA,GK8CC,kBL9CD,CK8CC,cL9CD,CAAA,EK8CC,SL9CD,EK8CC,mBAAA,EL9CD,OAAA,CAAA;EACF,eAAA,EAAA,CAAA,SAAA,EAAA,uBAAA;IACA,IAAA,EAAA,MAAA;EAEU,CAAA,EAAA,eAAA,EAAA,UAAA,CAAA,CAAA,OAAA,EKwDC,+BLxDD,CKyDN,SLzDM,EK0DN,cL1DM,EK2DN,eL3DM,EK4DN,UL5DM,CAAA,EAAA,GK6DP,sBAAA,CAAA,kBL7DO,CK6DP,SL7DO,EAAA,CK6DP,cL7DO,CAAA,SAAA,CAAA,KAAA,CAAA,GAAA,KAAA,GK6DP,iBL7DO,CAAA,OAAA,CAAA,GK6DP,kBL7DO,CK6DP,cL7DO,CAAA,EK6DP,UL7DO,EAAA,OAAA,CAAA;CACa"}
package/dist/index.d.mts CHANGED
@@ -1,6 +1,6 @@
1
+ import { Cause, Effect, Layer } from "effect";
1
2
  import * as _tanstack_react_query0 from "@tanstack/react-query";
2
- import { UseMutationOptions, UseQueryOptions, skipToken } from "@tanstack/react-query";
3
- import { Cause, Effect, Layer, Scope } from "effect";
3
+ import { DefinedInitialDataInfiniteOptions, DefinedInitialDataOptions, InfiniteData, QueryFunctionContext, UndefinedInitialDataInfiniteOptions, UndefinedInitialDataOptions, UnusedSkipTokenInfiniteOptions, UnusedSkipTokenOptions, UseMutationOptions, skipToken } from "@tanstack/react-query";
4
4
 
5
5
  //#region src/errors.d.ts
6
6
  declare const EffectQueryFailureTag: "EffectQueryFailure";
@@ -32,29 +32,48 @@ declare class EffectQueryDefect<TDefect> extends Error {
32
32
  match<TReturn>(matcher: EffectQueryErrorMatcher<never, TReturn> & Record<string, unknown>): TReturn;
33
33
  }
34
34
  //#endregion
35
+ //#region src/types.d.ts
36
+ type EffectQueryQueryKey = readonly [string, string, Record<string, unknown>?];
37
+ //#endregion
38
+ //#region src/infiniteQueryOptions.d.ts
39
+ type EffectInfiniteQueryQueryFn<TFnResult$1, TFnErrorResult$1, TFnRequirements$1, TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey, TPageParam = never> = (context: QueryFunctionContext<TQueryKey, TPageParam>) => Effect.Effect<TFnResult$1, TFnErrorResult$1, TFnRequirements$1>;
40
+ type EffectInfiniteQueryUndefinedInitialDataOptions<TQueryFnData, TError, TData = InfiniteData<TQueryFnData, unknown>, TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey> = UndefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey>;
41
+ type EffectInfiniteQueryUnusedSkipTokenOptions<TQueryFnData, TError, TData = InfiniteData<TQueryFnData, unknown>, TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey> = UnusedSkipTokenInfiniteOptions<TQueryFnData, TError, TData, TQueryKey>;
42
+ type EffectInfiniteQueryDefinedInitialDataOptions<TQueryFnData, TError, TData = InfiniteData<TQueryFnData, unknown>, TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey> = DefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey>;
43
+ type EffectInfiniteQueryOptionsInput<TFnResult$1, TFnErrorResult$1, TFnRequirements$1, TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey> = Omit<EffectInfiniteQueryUndefinedInitialDataOptions<TFnResult$1, TFnErrorResult$1, TFnResult$1, TQueryKey> | EffectInfiniteQueryDefinedInitialDataOptions<TFnResult$1, TFnErrorResult$1, TFnResult$1, TQueryKey> | EffectInfiniteQueryUnusedSkipTokenOptions<TFnResult$1, TFnErrorResult$1, TFnResult$1, TQueryKey>, "queryFn" | "queryKey"> & {
44
+ queryKey: EffectQueryQueryKey;
45
+ queryFn: EffectInfiniteQueryQueryFn<TFnResult$1, TFnErrorResult$1, TFnRequirements$1, EffectQueryQueryKey>;
46
+ };
47
+ //#endregion
48
+ //#region src/mutationOptions.d.ts
49
+ type EffectfulMutationFunction<TFnResult$1, TFnErrorResult$1, TFnRequirements$1, TVariables$1> = (variables: TVariables$1) => Effect.Effect<TFnResult$1, TFnErrorResult$1, TFnRequirements$1>;
50
+ type EffectQueryMutationOptionsInput<TFnResult$1, TFnErrorResult$1, TFnRequirements$1, TVariables$1> = Omit<UseMutationOptions<TFnResult$1, TFnErrorResult$1, TVariables$1>, "mutationKey" | "mutationFn"> & {
51
+ mutationKey: string;
52
+ mutationFn: EffectfulMutationFunction<TFnResult$1, TFnErrorResult$1, TFnRequirements$1, TVariables$1> | typeof skipToken;
53
+ };
54
+ //#endregion
55
+ //#region src/queryOptions.d.ts
56
+ type EffectQueryQueryFn<TFnResult$1, TFnErrorResult$1, TFnRequirements$1, TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey, TPageParam = never> = (context: QueryFunctionContext<TQueryKey, TPageParam>) => Effect.Effect<TFnResult$1, TFnErrorResult$1, TFnRequirements$1>;
57
+ type EffectQueryUndefinedInitialDataOptions<TQueryFnData, TError, TData = TQueryFnData, TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey> = UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>;
58
+ type EffectQueryUnusedSkipTokenOptions<TQueryFnData, TError, TData = TQueryFnData, TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey> = UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey>;
59
+ type EffectQueryDefinedInitialDataOptions<TQueryFnData, TError, TData = TQueryFnData, TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey> = DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>;
60
+ type EffectQueryOptionsInput<TFnResult$1, TFnErrorResult$1, TFnRequirements$1, TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey> = Omit<EffectQueryUndefinedInitialDataOptions<TFnResult$1, TFnErrorResult$1, TFnResult$1, TQueryKey> | EffectQueryDefinedInitialDataOptions<TFnResult$1, TFnErrorResult$1, TFnResult$1, TQueryKey> | EffectQueryUnusedSkipTokenOptions<TFnResult$1, TFnErrorResult$1, TFnResult$1, TQueryKey>, "queryFn" | "queryKey"> & {
61
+ queryKey: EffectQueryQueryKey;
62
+ queryFn: EffectQueryQueryFn<TFnResult$1, TFnErrorResult$1, TFnRequirements$1, EffectQueryQueryKey>;
63
+ };
64
+ //#endregion
35
65
  //#region src/index.d.ts
36
66
  declare function createEffectQuery<Input>(layer: Layer.Layer<Input, never, never>): {
37
- queryOptions: <TData, E extends {
67
+ queryOptions: <TFnResult, TFnErrorResult extends {
68
+ _tag: string;
69
+ }, TFnRequirements>(options: EffectQueryOptionsInput<TFnResult, TFnErrorResult, TFnRequirements>) => _tanstack_react_query0.UseQueryOptions<TFnResult, [TFnErrorResult] extends [never] ? EffectQueryDefect<unknown> : EffectQueryDefect<unknown> | EffectQueryFailure<TFnErrorResult>, TFnResult, EffectQueryQueryKey>;
70
+ infiniteQueryOptions: <TFnResult, TFnErrorResult extends {
38
71
  _tag: string;
39
- }, R extends Input | Scope.Scope, TQueryKey extends QueryKey = QueryKey>(options: Omit<UseQueryOptions<TData, E, TData, TQueryKey>, "queryKey" | "queryFn"> & {
40
- queryKey: TQueryKey;
41
- queryFn: typeof skipToken | ((context: {
42
- client: _tanstack_react_query0.QueryClient;
43
- queryKey: TQueryKey;
44
- signal: AbortSignal;
45
- meta: _tanstack_react_query0.QueryMeta | undefined;
46
- pageParam?: unknown;
47
- direction?: unknown;
48
- }) => Effect.Effect<TData, E, R>);
49
- }) => UseQueryOptions<TData, [E] extends [never] ? EffectQueryDefect<unknown> : EffectQueryFailure<E> | EffectQueryDefect<unknown>, TData, TQueryKey>;
50
- mutationOptions: <TData, E extends {
72
+ }, TFnRequirements>(options: EffectInfiniteQueryOptionsInput<TFnResult, TFnErrorResult, TFnRequirements>) => _tanstack_react_query0.UseInfiniteQueryOptions<TFnResult, [TFnErrorResult] extends [never] ? EffectQueryDefect<unknown> : EffectQueryDefect<unknown> | EffectQueryFailure<TFnErrorResult>, TFnResult, EffectQueryQueryKey, unknown>;
73
+ mutationOptions: <TFnResult, TFnErrorResult extends {
51
74
  _tag: string;
52
- }, TVariables, R extends Input | Scope.Scope>(options: Omit<UseMutationOptions<TData, Error, TVariables, unknown>, "mutationKey" | "mutationFn"> & {
53
- mutationKey: string;
54
- mutationFn: typeof skipToken | ((variables: TVariables) => Effect.Effect<TData, E, R>);
55
- }) => UseMutationOptions<TData, [E] extends [never] ? never : EffectQueryFailure<E> | EffectQueryDefect<unknown>, TVariables>;
75
+ }, TFnRequirements, TVariables>(options: EffectQueryMutationOptionsInput<TFnResult, TFnErrorResult, TFnRequirements, TVariables>) => _tanstack_react_query0.UseMutationOptions<TFnResult, [TFnErrorResult] extends [never] ? never : EffectQueryDefect<unknown> | EffectQueryFailure<TFnErrorResult>, TVariables, unknown>;
56
76
  };
57
- type QueryKey = readonly [string, string, Record<string, unknown>?];
58
77
  //#endregion
59
78
  export { createEffectQuery };
60
79
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/errors.ts","../src/index.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/errors.ts","../src/types.ts","../src/infiniteQueryOptions.ts","../src/mutationOptions.ts","../src/queryOptions.ts","../src/index.ts"],"sourcesContent":[],"mappings":";;;;;cAEM;cACA;KAED;;AAL0B,CAAA,GAEzB,KAAA,GAAA,KAAA,EAAA,YAAqD,OAAA,CAAA,GAAA;EACrD,MAAA,EAAA,CAAA,KAAA,EAMY,KAAA,CAAM,KANiC,CAAA,OAAA,CAAA,EAAA,GAMd,SANc;AAAA,CAAA,GAEpD,CAAA,CAKC,QALD,CAAA,SAAA,CAAA,KAAuB,CAAA,GAMxB,MANwB,CAAA,KAAA,EAAA,KAAA,CAAA,GAOxB,QAPwB,SAAA;EAIV,IAAM,EAAA,MAAA;CAAmB,GAAA,QAK7B,QAJR,CAAA,MAAA,CAAA,IAAA,CAAA,OAAA,EAKa,OALb,CAKqB,QALrB,EAAA;EACF,IAAA,EAIyC,CAJzC;AACA,CAAA,CAAA,EAAA,GAIS,SAJT,EAEU,GAIR,MAJQ,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA;AACa,cAKd,kBALc,CAAA,iBAAA;EAAkB,IAAA,EAAA,MAAA;CAA1B,GAAA,KAAA,GAAA,KAAA,CAAA,SAOT,KAAA,CAPS;EACN,SAAA,IAAA,EAAA,OAOW,qBAPX;EAEP,SAAA,OAAA,EAMc,QANd;EAAM,SAAA,YAAA,EAOa,KAAA,CAAM,KAPnB,CAOyB,QAPzB,CAAA;EAEC,WAAA,CAAA,OAAA,EAAkB,MAAA,EAAA,OAAA,EAQlB,QARkB,EAAA,KAAA,EASpB,KAAA,CAAM,KATc,CASR,QATQ,CAAA;EAGP,KAAA,CAAA,OAAA,CAAA,CAAA,OAAA,EAeX,uBAfW,CAgBlB,QAhBkB,SAAA;IACJ,IAAA,EAAA,MAAA;EACiB,CAAA,GAcK,QAdL,GAAA,KAAA,EAe/B,OAf+B,CAAA,CAAA,EAiBhC,OAjBgC;;AAGxB,cA+BA,iBA/BA,CAAA,OAAA,CAAA,SA+BmC,KAAA,CA/BnC;EACU,SAAA,IAAA,EAAA,OA+BC,oBA/BD;EAAZ,SAAM,WAAA,EAgCO,KAAA,CAAM,KAhCb,CAgCmB,OAhCnB,CAAA;EAUX,WAAA,CAAA,OAAA,EAAA,MAAA,EAAA,MAAA,EAuBiC,OAvBjC;EAAoC,KAAA,CAAA,OAAA,CAAA,CAAA,OAAA,EA8B7B,uBA9B6B,CAAA,KAAA,EA8BE,OA9BF,CAAA,GA8Ba,MA9Bb,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,EA+BrC,OA/BqC;;;;KCvC9B,mBAAA,6BAGV;;;ADH6B,KEe1B,0BFbsD,CAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,kBEiBvC,mBFjBuC,GEiBjB,mBFjBiB,EAAA,aAAA,KAAA,CAAA,GAAA,CAAA,OAAA,EEoBhD,oBFpBgD,CEoB3B,SFpB2B,EEoBhB,UFpBgB,CAAA,EAAA,GEqBtD,MAAA,CAAO,MFrB+C,CEqBxC,WFrBwC,EEqB7B,gBFrB6B,EEqBb,iBFrBa,CAAA;AAAA,KEuBtD,8CFtBoD,CAAA,YAAA,EAAA,MAAA,EAAA,QEyB/C,YFzB+C,CEyBlC,YFzBkC,EAAA,OAAA,CAAA,EAAA,kBE0BrC,mBF1BqC,GE0Bf,mBF1Be,CAAA,GE2BrD,mCF3BqD,CE2BjB,YF3BiB,EE2BH,MF3BG,EE2BK,KF3BL,EE2BY,SF3BZ,CAAA;AAAA,KE6BpD,yCF3BuB,CAAA,YAAA,EAAA,MAAA,EAAA,QE8BlB,YF9BkB,CE8BL,YF9BK,EAAA,OAAA,CAAA,EAAA,kBE+BR,mBF/BQ,GE+Bc,mBF/Bd,CAAA,GEgCxB,8BFhCwB,CEgCO,YFhCP,EEgCqB,MFhCrB,EEgC6B,KFhC7B,EEgCoC,SFhCpC,CAAA;KEkCvB,4CF9BmB,CAAA,YAAA,EAAA,MAAA,EAAA,QEiCd,YFjCc,CEiCD,YFjCC,EAAA,OAAA,CAAA,EAAA,kBEkCJ,mBFlCI,GEkCkB,mBFlClB,CAAA,GEmCpB,iCFnCoB,CEmCc,YFnCd,EEmC4B,MFnC5B,EEmCoC,KFnCpC,EEmC2C,SFnC3C,CAAA;AAAmB,KEqC/B,+BFrC+B,CAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,kBEyCvB,mBFzCuB,GEyCD,mBFzCC,CAAA,GE0CvC,IF1CuC,CE2CvC,8CF3CuC,CE4CrC,WF5CqC,EE6CrC,gBF7CqC,EE8CrC,WF9CqC,EE+CrC,SF/CqC,CAAA,GEiDvC,4CFjDuC,CEkDrC,WFlDqC,EEmDrC,gBFnDqC,EEoDrC,WFpDqC,EEqDrC,SFrDqC,CAAA,GEuDvC,yCFvDuC,CEwDrC,WFxDqC,EEyDrC,gBFzDqC,EE0DrC,WF1DqC,EE2DrC,SF3DqC,CAAA,EAAA,SAAA,GAAA,UAAA,CAAA,GAAA;EACrC,QAAA,EE8DM,mBF9DN;EACF,OAAA,EE8DO,0BF9DP,CE+DA,WF/DA,EEgEA,gBFhEA,EEiEA,iBFjEA,EEkEA,mBFlEA,CAAA;CACA;;;KGFC,wGAMQ,iBACR,MAAA,CAAO,OAAO,aAAW,kBAAgB;AHfxC,KGiBM,+BHjB+C,CAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,YAAA,CAAA,GGsBvD,IHtBuD,CGuBzD,kBHvByD,CGuBtC,WHvBsC,EGuB3B,gBHvB2B,EGuBX,YHvBW,CAAA,EAAA,aAAA,GAAA,YAAA,CAAA,GAAA;EACrD,WAAA,EAAA,MAAA;EAED,UAAA,EGyBC,yBHzBsB,CG0BpB,WH1BoB,EG2BpB,gBH3BoB,EG4BpB,iBH5BoB,EG6BpB,YH7BoB,CAAA,GAAA,OG+Bf,SH/Be;CAIV;;;AATa,KIc1B,kBJZC,CAAA,WAAqD,EAAA,gBAAA,EAAA,iBAAA,EAAA,kBIgBvC,mBJhBuC,GIgBjB,mBJhBiB,EAAA,aAAA,KAAA,CAAA,GAAA,CAAA,OAAA,EImBhD,oBJnBgD,CImB3B,SJnB2B,EImBhB,UJnBgB,CAAA,EAAA,GIoBtD,MAAA,CAAO,MJpB+C,CIoBxC,WJpBwC,EIoB7B,gBJpB6B,EIoBb,iBJpBa,CAAA;AAAA,KIsBtD,sCJrBoD,CAAA,YAAA,EAAA,MAAA,EAAA,QIwB/C,YJxB+C,EAAA,kBIyBrC,mBJzBqC,GIyBf,mBJzBe,CAAA,GI0BrD,2BJ1BqD,CI0BzB,YJ1ByB,EI0BX,MJ1BW,EI0BH,KJ1BG,EI0BI,SJ1BJ,CAAA;AAAA,KI4BpD,iCJ1BuB,CAAA,YAAA,EAAA,MAAA,EAAA,QI6BlB,YJ7BkB,EAAA,kBI8BR,mBJ9BQ,GI8Bc,mBJ9Bd,CAAA,GI+BxB,sBJ/BwB,CI+BD,YJ/BC,EI+Ba,MJ/Bb,EI+BqB,KJ/BrB,EI+B4B,SJ/B5B,CAAA;KIiCvB,oCJ7BmB,CAAA,YAAA,EAAA,MAAA,EAAA,QIgCd,YJhCc,EAAA,kBIiCJ,mBJjCI,GIiCkB,mBJjClB,CAAA,GIkCpB,yBJlCoB,CIkCM,YJlCN,EIkCoB,MJlCpB,EIkC4B,KJlC5B,EIkCmC,SJlCnC,CAAA;AAAmB,KIoC/B,uBJpC+B,CAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,kBIwCvB,mBJxCuB,GIwCD,mBJxCC,CAAA,GIyCvC,IJzCuC,CI0CvC,sCJ1CuC,CI2CrC,WJ3CqC,EI4CrC,gBJ5CqC,EI6CrC,WJ7CqC,EI8CrC,SJ9CqC,CAAA,GIgDvC,oCJhDuC,CIiDrC,WJjDqC,EIkDrC,gBJlDqC,EImDrC,WJnDqC,EIoDrC,SJpDqC,CAAA,GIsDvC,iCJtDuC,CIuDrC,WJvDqC,EIwDrC,gBJxDqC,EIyDrC,WJzDqC,EI0DrC,SJ1DqC,CAAA,EAAA,SAAA,GAAA,UAAA,CAAA,GAAA;EACrC,QAAA,EI6DM,mBJ7DN;EACF,OAAA,EI6DO,kBJ7DP,CI8DA,WJ9DA,EI+DA,gBJ/DA,EIgEA,iBJhEA,EIiEA,mBJjEA,CAAA;CACA;;;iBKGY,gCACP,KAAA,CAAM,MAAM;ELdf,YAAA,EAAA,CAAA,SAAqD,EAAA,uBAAA;IACrD,IAAA,EAAA,MAAA;EAED,CAAA,EAAA,eAAA,CAAA,CAAA,OAAuB,EKsBb,uBLtBa,CKuBpB,SLvBoB,EKwBpB,cLxBoB,EKyBpB,eLzBoB,CAAA,EAAA,GK0BrB,sBAAA,CAAA,eL1BqB,CK0BrB,SL1BqB,EAAA,CK0BrB,cL1BqB,CAAA,SAAA,CAAA,KAAA,CAAA,GK0BrB,iBL1BqB,CAAA,OAAA,CAAA,GK0BrB,iBL1BqB,CAAA,OAAA,CAAA,GK0BrB,kBL1BqB,CK0BrB,cL1BqB,CAAA,EK0BrB,SL1BqB,EK0BrB,mBAAA,CL1BqB;EAIV,oBAAM,EAAA,CAAA,SAAA,EAAA,uBAAA;IAAmB,IAAA,EAAA,MAAA;EACrC,CAAA,EAAA,eAAA,CAAA,CAAA,OAAA,EK0CS,+BL1CT,CK2CE,SL3CF,EK4CE,cL5CF,EK6CE,eL7CF,CAAA,EAAA,GK8CC,sBAAA,CAAA,uBL9CD,CK8CC,SL9CD,EAAA,CK8CC,cL9CD,CAAA,SAAA,CAAA,KAAA,CAAA,GK8CC,iBL9CD,CAAA,OAAA,CAAA,GK8CC,iBL9CD,CAAA,OAAA,CAAA,GK8CC,kBL9CD,CK8CC,cL9CD,CAAA,EK8CC,SL9CD,EK8CC,mBAAA,EL9CD,OAAA,CAAA;EACF,eAAA,EAAA,CAAA,SAAA,EAAA,uBAAA;IACA,IAAA,EAAA,MAAA;EAEU,CAAA,EAAA,eAAA,EAAA,UAAA,CAAA,CAAA,OAAA,EKwDC,+BLxDD,CKyDN,SLzDM,EK0DN,cL1DM,EK2DN,eL3DM,EK4DN,UL5DM,CAAA,EAAA,GK6DP,sBAAA,CAAA,kBL7DO,CK6DP,SL7DO,EAAA,CK6DP,cL7DO,CAAA,SAAA,CAAA,KAAA,CAAA,GAAA,KAAA,GK6DP,iBL7DO,CAAA,OAAA,CAAA,GK6DP,kBL7DO,CK6DP,cL7DO,CAAA,EK6DP,UL7DO,EAAA,OAAA,CAAA;CACa"}
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { mutationOptions, queryOptions } from "@tanstack/react-query";
2
1
  import { Cause, Effect, Exit, ManagedRuntime } from "effect";
2
+ import { infiniteQueryOptions, mutationOptions, queryOptions } from "@tanstack/react-query";
3
3
 
4
4
  //#region \0@oxc-project+runtime@0.95.0/helpers/typeof.js
5
5
  function _typeof(o) {
@@ -101,46 +101,109 @@ function _objectSpread2(e) {
101
101
  return e;
102
102
  }
103
103
 
104
+ //#endregion
105
+ //#region src/infiniteQueryOptions.ts
106
+ /**
107
+ * @internal
108
+ */
109
+ function effectInfiniteQueryOptions(inputOptions, context) {
110
+ const [spanName] = inputOptions.queryKey;
111
+ const queryFn = async (queryFnContext) => {
112
+ const effect = inputOptions.queryFn(queryFnContext);
113
+ const result = await context.runner.run(effect, spanName, { signal: context.signal });
114
+ return Exit.match(result, {
115
+ onSuccess: (value) => value,
116
+ onFailure: (cause) => {
117
+ if (cause._tag === "Fail") {
118
+ const failure = cause.error;
119
+ throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);
120
+ }
121
+ throw new EffectQueryDefect(Cause.pretty(cause), cause);
122
+ }
123
+ });
124
+ };
125
+ return infiniteQueryOptions(_objectSpread2(_objectSpread2({}, inputOptions), {}, {
126
+ queryKey: inputOptions.queryKey,
127
+ queryFn
128
+ }));
129
+ }
130
+
131
+ //#endregion
132
+ //#region src/mutationOptions.ts
133
+ /**
134
+ * @internal
135
+ */
136
+ function effectQueryMutationOptions(inputOptions, context) {
137
+ const spanName = inputOptions.mutationKey;
138
+ const mutationFn = async (variables) => {
139
+ const effect = inputOptions.mutationFn(variables);
140
+ const result = await context.runner.run(effect, spanName);
141
+ return Exit.match(result, {
142
+ onSuccess: (value) => value,
143
+ onFailure: (cause) => {
144
+ if (cause._tag === "Fail") {
145
+ const failure = cause.error;
146
+ throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);
147
+ }
148
+ throw new EffectQueryDefect(Cause.pretty(cause), cause);
149
+ }
150
+ });
151
+ };
152
+ return mutationOptions(_objectSpread2(_objectSpread2({}, inputOptions), {}, { mutationFn }));
153
+ }
154
+
155
+ //#endregion
156
+ //#region src/queryOptions.ts
157
+ /**
158
+ * @internal
159
+ */
160
+ function effectQueryQueryOptions(inputOptions, context) {
161
+ const [spanName] = inputOptions.queryKey;
162
+ const queryFn = async (queryFnContext) => {
163
+ const effect = inputOptions.queryFn(queryFnContext);
164
+ const result = await context.runner.run(effect, spanName, { signal: context.signal });
165
+ return Exit.match(result, {
166
+ onSuccess: (value) => value,
167
+ onFailure: (cause) => {
168
+ if (cause._tag === "Fail") {
169
+ const failure = cause.error;
170
+ throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);
171
+ }
172
+ throw new EffectQueryDefect(Cause.pretty(cause), cause);
173
+ }
174
+ });
175
+ };
176
+ return queryOptions(_objectSpread2(_objectSpread2({}, inputOptions), {}, {
177
+ queryKey: inputOptions.queryKey,
178
+ queryFn
179
+ }));
180
+ }
181
+
182
+ //#endregion
183
+ //#region src/runner.ts
184
+ var EffectQueryRunner = class {
185
+ constructor(runtime) {
186
+ _defineProperty(this, "runtime", void 0);
187
+ this.runtime = runtime;
188
+ }
189
+ async run(effect, span, options = {}) {
190
+ var _this = this;
191
+ const effectToRun = effect;
192
+ return await _this.runtime.runPromiseExit(effectToRun.pipe(Effect.withSpan(span), Effect.scoped, Effect.tapErrorCause(Effect.logError)), { signal: options.signal });
193
+ }
194
+ };
195
+
104
196
  //#endregion
105
197
  //#region src/index.ts
106
198
  function createEffectQuery(layer) {
107
- const runtime = ManagedRuntime.make(layer);
108
- const runner = (span, options = {}) => (effect) => runtime.runPromiseExit(effect.pipe(Effect.withSpan(span), Effect.scoped, Effect.tapErrorCause(Effect.logError)), { signal: options.signal });
199
+ const runner = new EffectQueryRunner(ManagedRuntime.make(layer));
109
200
  return {
110
- queryOptions: (options) => {
111
- const [spanName] = options.queryKey;
112
- const queryFn = async (context) => {
113
- const result = await options.queryFn(context).pipe(runner(spanName, { signal: context.signal }));
114
- return Exit.match(result, {
115
- onSuccess: (value) => value,
116
- onFailure: (cause) => {
117
- if (cause._tag === "Fail") {
118
- const failure = cause.error;
119
- throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);
120
- }
121
- throw new EffectQueryDefect(Cause.pretty(cause), cause);
122
- }
123
- });
124
- };
125
- return queryOptions(_objectSpread2(_objectSpread2({}, options), {}, { queryFn }));
126
- },
127
- mutationOptions: (options) => {
128
- const spanName = options.mutationKey;
129
- const mutationFn = async (variables) => {
130
- const result = await options.mutationFn(variables).pipe(runner(spanName));
131
- return Exit.match(result, {
132
- onSuccess: (value) => value,
133
- onFailure: (cause) => {
134
- if (cause._tag === "Fail") {
135
- const failure = cause.error;
136
- throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);
137
- }
138
- throw new EffectQueryDefect(Cause.pretty(cause), cause);
139
- }
140
- });
141
- };
142
- return mutationOptions(_objectSpread2(_objectSpread2({}, options), {}, { mutationFn }));
143
- }
201
+ queryOptions: (options) => effectQueryQueryOptions({
202
+ queryKey: options.queryKey,
203
+ queryFn: options.queryFn
204
+ }, { runner }),
205
+ infiniteQueryOptions: (options) => effectInfiniteQueryOptions(options, { runner }),
206
+ mutationOptions: (options) => effectQueryMutationOptions(options, { runner })
144
207
  };
145
208
  }
146
209
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["queryFn: QueryFunction<TData, TQueryKey>","mutationFn: MutationFunction<TData, TVariables>"],"sources":["../src/errors.ts","../src/index.ts"],"sourcesContent":["import { Cause } from \"effect\";\n\nconst EffectQueryFailureTag = \"EffectQueryFailure\" as const;\nconst EffectQueryDefectTag = \"EffectQueryDefect\" as const;\n\ntype EffectQueryErrorMatcher<\n TFailure extends { _tag: string } | never = never,\n TReturn = unknown,\n> = {\n OrElse: (cause: Cause.Cause<unknown>) => TReturn;\n} & ([TFailure] extends [never]\n ? Record<never, never>\n : TFailure extends { _tag: string }\n ? {\n [K in TFailure[\"_tag\"]]?: (\n failure: Extract<TFailure, { _tag: K }>\n ) => TReturn;\n }\n : Record<never, never>);\n\nexport class EffectQueryFailure<\n TFailure extends { _tag: string } | never = never,\n> extends Error {\n readonly _tag: typeof EffectQueryFailureTag;\n readonly failure: TFailure;\n readonly failureCause: Cause.Cause<TFailure>;\n constructor(\n message: string,\n failure: TFailure,\n cause: Cause.Cause<TFailure>\n ) {\n super(message);\n this._tag = EffectQueryFailureTag;\n this.failure = failure;\n this.failureCause = cause;\n }\n\n match<TReturn>(\n matcher: EffectQueryErrorMatcher<\n TFailure extends { _tag: string } ? TFailure : never,\n TReturn\n >\n ): TReturn {\n if (\n this.failure &&\n typeof this.failure === \"object\" &&\n \"_tag\" in this.failure\n ) {\n const tag = this.failure._tag;\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic tag matching requires any\n const handler = (matcher as any)[tag];\n if (typeof handler === \"function\") {\n return handler(this.failure);\n }\n }\n return matcher.OrElse(this.failureCause);\n }\n}\n\nexport class EffectQueryDefect<TDefect> extends Error {\n readonly _tag: typeof EffectQueryDefectTag;\n readonly defectCause: Cause.Cause<TDefect>;\n constructor(message: string, defect: TDefect) {\n super(message);\n this._tag = EffectQueryDefectTag;\n this.defectCause = Cause.die(defect);\n }\n\n match<TReturn>(\n matcher: EffectQueryErrorMatcher<never, TReturn> & Record<string, unknown>\n ): TReturn {\n return matcher.OrElse(this.defectCause);\n }\n}\n","import {\n type MutationFunction,\n mutationOptions,\n type QueryFunction,\n type QueryFunctionContext,\n queryOptions,\n type skipToken,\n type UseMutationOptions,\n type UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport {\n Cause,\n Effect,\n Exit,\n type Layer,\n ManagedRuntime,\n type Scope,\n} from \"effect\";\nimport { EffectQueryDefect, EffectQueryFailure } from \"./errors\";\n\nexport function createEffectQuery<Input>(\n layer: Layer.Layer<Input, never, never>\n) {\n type RuntimeContext = Input | Scope.Scope;\n\n type EffectfulMutationFunction<\n TData,\n E,\n TVariables,\n R extends RuntimeContext,\n > = (variables: TVariables) => Effect.Effect<TData, E, R>;\n\n type EffectfulMutationOptions<\n TData,\n E,\n TVariables,\n R extends RuntimeContext,\n > = Omit<\n UseMutationOptions<TData, Error, TVariables>,\n \"mutationKey\" | \"mutationFn\"\n > & {\n mutationKey: string;\n mutationFn:\n | EffectfulMutationFunction<TData, E, TVariables, R>\n | typeof skipToken;\n };\n\n type EffectfulQueryFunction<\n TData,\n E,\n R,\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = never,\n > = (\n context: QueryFunctionContext<TQueryKey, TPageParam>\n ) => Effect.Effect<TData, E, R>;\n\n type EffectfulQueryOptions<\n TData,\n TError,\n R,\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = never,\n > = Omit<\n UseQueryOptions<TData, TError, TData, TQueryKey>,\n \"queryKey\" | \"queryFn\"\n > & {\n queryKey: TQueryKey;\n queryFn:\n | EffectfulQueryFunction<TData, TError, R, TQueryKey, TPageParam>\n | typeof skipToken;\n };\n\n const runtime = ManagedRuntime.make(layer);\n const runner =\n <A, E, R extends RuntimeContext>(\n span: string,\n options: { signal?: AbortSignal } = {}\n ) =>\n (effect: Effect.Effect<A, E, R>): Promise<Exit.Exit<A, E>> =>\n runtime.runPromiseExit(\n effect.pipe(\n Effect.withSpan(span),\n Effect.scoped,\n Effect.tapErrorCause(Effect.logError)\n ),\n {\n signal: options.signal,\n }\n );\n\n return {\n queryOptions: <\n TData,\n E extends { _tag: string },\n R extends RuntimeContext,\n TQueryKey extends QueryKey = QueryKey,\n >(\n options: EffectfulQueryOptions<TData, E, R, TQueryKey>\n ) => {\n const [spanName] = options.queryKey;\n\n const queryFn: QueryFunction<TData, TQueryKey> = async (\n context: QueryFunctionContext<TQueryKey>\n ) => {\n const effect = (\n options.queryFn as EffectfulQueryFunction<TData, E, R, TQueryKey>\n )(context);\n const result = await effect.pipe(\n runner(spanName, { signal: context.signal })\n );\n return Exit.match(result, {\n onSuccess: (value) => value,\n onFailure: (cause) => {\n if (cause._tag === \"Fail\") {\n const failure = cause.error;\n throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);\n }\n throw new EffectQueryDefect(Cause.pretty(cause), cause);\n },\n });\n };\n\n return queryOptions({\n ...options,\n queryFn,\n }) as UseQueryOptions<\n TData,\n [E] extends [never]\n ? EffectQueryDefect<unknown>\n : EffectQueryFailure<E> | EffectQueryDefect<unknown>,\n TData,\n TQueryKey\n >;\n },\n mutationOptions: <\n TData,\n E extends { _tag: string },\n TVariables,\n R extends RuntimeContext,\n >(\n options: EffectfulMutationOptions<TData, E, TVariables, R>\n ) => {\n const spanName = options.mutationKey;\n const mutationFn: MutationFunction<TData, TVariables> = async (\n variables: TVariables\n ) => {\n const effect = (\n options.mutationFn as EffectfulMutationFunction<\n TData,\n E,\n TVariables,\n R\n >\n )(variables);\n const result = await effect.pipe(runner(spanName));\n return Exit.match(result, {\n onSuccess: (value) => value,\n onFailure: (cause) => {\n if (cause._tag === \"Fail\") {\n const failure = cause.error;\n throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);\n }\n throw new EffectQueryDefect(Cause.pretty(cause), cause);\n },\n });\n };\n\n return mutationOptions({\n ...options,\n mutationFn,\n }) as UseMutationOptions<\n TData,\n [E] extends [never]\n ? never\n : EffectQueryFailure<E> | EffectQueryDefect<unknown>,\n TVariables\n >;\n },\n };\n}\n\ntype QueryKey = readonly [string, string, Record<string, unknown>?];\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,MAAM,wBAAwB;AAC9B,MAAM,uBAAuB;AAiB7B,IAAa,qBAAb,cAEU,MAAM;CAId,YACE,SACA,SACA,OACA;AACA,QAAM,QAAQ;wBARP;wBACA;wBACA;AAOP,OAAK,OAAO;AACZ,OAAK,UAAU;AACf,OAAK,eAAe;;CAGtB,MACE,SAIS;AACT,MACE,KAAK,WACL,OAAO,KAAK,YAAY,YACxB,UAAU,KAAK,SACf;GAGA,MAAM,UAAW,QAFL,KAAK,QAAQ;AAGzB,OAAI,OAAO,YAAY,WACrB,QAAO,QAAQ,KAAK,QAAQ;;AAGhC,SAAO,QAAQ,OAAO,KAAK,aAAa;;;AAI5C,IAAa,oBAAb,cAAgD,MAAM;CAGpD,YAAY,SAAiB,QAAiB;AAC5C,QAAM,QAAQ;wBAHP;wBACA;AAGP,OAAK,OAAO;AACZ,OAAK,cAAc,MAAM,IAAI,OAAO;;CAGtC,MACE,SACS;AACT,SAAO,QAAQ,OAAO,KAAK,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnD3C,SAAgB,kBACd,OACA;CAmDA,MAAM,UAAU,eAAe,KAAK,MAAM;CAC1C,MAAM,UAEF,MACA,UAAoC,EAAE,MAEvC,WACC,QAAQ,eACN,OAAO,KACL,OAAO,SAAS,KAAK,EACrB,OAAO,QACP,OAAO,cAAc,OAAO,SAAS,CACtC,EACD,EACE,QAAQ,QAAQ,QACjB,CACF;AAEL,QAAO;EACL,eAME,YACG;GACH,MAAM,CAAC,YAAY,QAAQ;GAE3B,MAAMA,UAA2C,OAC/C,YACG;IAIH,MAAM,SAAS,MAFb,QAAQ,QACR,QAAQ,CACkB,KAC1B,OAAO,UAAU,EAAE,QAAQ,QAAQ,QAAQ,CAAC,CAC7C;AACD,WAAO,KAAK,MAAM,QAAQ;KACxB,YAAY,UAAU;KACtB,YAAY,UAAU;AACpB,UAAI,MAAM,SAAS,QAAQ;OACzB,MAAM,UAAU,MAAM;AACtB,aAAM,IAAI,mBAAmB,MAAM,OAAO,MAAM,EAAE,SAAS,MAAM;;AAEnE,YAAM,IAAI,kBAAkB,MAAM,OAAO,MAAM,EAAE,MAAM;;KAE1D,CAAC;;AAGJ,UAAO,+CACF,gBACH,WACA;;EASJ,kBAME,YACG;GACH,MAAM,WAAW,QAAQ;GACzB,MAAMC,aAAkD,OACtD,cACG;IASH,MAAM,SAAS,MAPb,QAAQ,WAMR,UAAU,CACgB,KAAK,OAAO,SAAS,CAAC;AAClD,WAAO,KAAK,MAAM,QAAQ;KACxB,YAAY,UAAU;KACtB,YAAY,UAAU;AACpB,UAAI,MAAM,SAAS,QAAQ;OACzB,MAAM,UAAU,MAAM;AACtB,aAAM,IAAI,mBAAmB,MAAM,OAAO,MAAM,EAAE,SAAS,MAAM;;AAEnE,YAAM,IAAI,kBAAkB,MAAM,OAAO,MAAM,EAAE,MAAM;;KAE1D,CAAC;;AAGJ,UAAO,kDACF,gBACH,cACA;;EAQL"}
1
+ {"version":3,"file":"index.mjs","names":["queryFn: Exclude<\n UseInfiniteQueryOptions<\n TFnResult,\n TFnErrorResult,\n InfiniteData<TFnResult, unknown>,\n EffectQueryQueryKey,\n unknown\n >[\"queryFn\"],\n SkipToken | undefined\n >","mutationFn: MutationFunction<TFnResult, TVariables>","queryFn: QueryFunction<TFnResult, EffectQueryQueryKey>","this"],"sources":["../src/errors.ts","../src/infiniteQueryOptions.ts","../src/mutationOptions.ts","../src/queryOptions.ts","../src/runner.ts","../src/index.ts"],"sourcesContent":["import { Cause } from \"effect\";\n\nconst EffectQueryFailureTag = \"EffectQueryFailure\" as const;\nconst EffectQueryDefectTag = \"EffectQueryDefect\" as const;\n\ntype EffectQueryErrorMatcher<\n TFailure extends { _tag: string } | never = never,\n TReturn = unknown,\n> = {\n OrElse: (cause: Cause.Cause<unknown>) => TReturn;\n} & ([TFailure] extends [never]\n ? Record<never, never>\n : TFailure extends { _tag: string }\n ? {\n [K in TFailure[\"_tag\"]]?: (\n failure: Extract<TFailure, { _tag: K }>\n ) => TReturn;\n }\n : Record<never, never>);\n\nexport class EffectQueryFailure<\n TFailure extends { _tag: string } | never = never,\n> extends Error {\n readonly _tag: typeof EffectQueryFailureTag;\n readonly failure: TFailure;\n readonly failureCause: Cause.Cause<TFailure>;\n constructor(\n message: string,\n failure: TFailure,\n cause: Cause.Cause<TFailure>\n ) {\n super(message);\n this._tag = EffectQueryFailureTag;\n this.failure = failure;\n this.failureCause = cause;\n }\n\n match<TReturn>(\n matcher: EffectQueryErrorMatcher<\n TFailure extends { _tag: string } ? TFailure : never,\n TReturn\n >\n ): TReturn {\n if (\n this.failure &&\n typeof this.failure === \"object\" &&\n \"_tag\" in this.failure\n ) {\n const tag = this.failure._tag;\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic tag matching requires any\n const handler = (matcher as any)[tag];\n if (typeof handler === \"function\") {\n return handler(this.failure);\n }\n }\n return matcher.OrElse(this.failureCause);\n }\n}\n\nexport class EffectQueryDefect<TDefect> extends Error {\n readonly _tag: typeof EffectQueryDefectTag;\n readonly defectCause: Cause.Cause<TDefect>;\n constructor(message: string, defect: TDefect) {\n super(message);\n this._tag = EffectQueryDefectTag;\n this.defectCause = Cause.die(defect);\n }\n\n match<TReturn>(\n matcher: EffectQueryErrorMatcher<never, TReturn> & Record<string, unknown>\n ): TReturn {\n return matcher.OrElse(this.defectCause);\n }\n}\n","import {\n type DefinedInitialDataInfiniteOptions,\n type InfiniteData,\n infiniteQueryOptions,\n type QueryFunctionContext,\n type SkipToken,\n type UndefinedInitialDataInfiniteOptions,\n type UnusedSkipTokenInfiniteOptions,\n type UseInfiniteQueryOptions,\n} from \"@tanstack/react-query\";\nimport { Cause, type Effect, Exit } from \"effect\";\nimport { EffectQueryDefect, EffectQueryFailure } from \"./errors\";\nimport type { EffectQueryRunner } from \"./runner\";\nimport type { EffectQueryQueryKey } from \"./types\";\n\ntype EffectInfiniteQueryQueryFn<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n TPageParam = never,\n> = (\n context: QueryFunctionContext<TQueryKey, TPageParam>\n) => Effect.Effect<TFnResult, TFnErrorResult, TFnRequirements>;\n\ntype EffectInfiniteQueryUndefinedInitialDataOptions<\n TQueryFnData,\n TError,\n TData = InfiniteData<TQueryFnData, unknown>,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = UndefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey>;\n\ntype EffectInfiniteQueryUnusedSkipTokenOptions<\n TQueryFnData,\n TError,\n TData = InfiniteData<TQueryFnData, unknown>,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = UnusedSkipTokenInfiniteOptions<TQueryFnData, TError, TData, TQueryKey>;\n\ntype EffectInfiniteQueryDefinedInitialDataOptions<\n TQueryFnData,\n TError,\n TData = InfiniteData<TQueryFnData, unknown>,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = DefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey>;\n\nexport type EffectInfiniteQueryOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = Omit<\n | EffectInfiniteQueryUndefinedInitialDataOptions<\n TFnResult,\n TFnErrorResult,\n TFnResult,\n TQueryKey\n >\n | EffectInfiniteQueryDefinedInitialDataOptions<\n TFnResult,\n TFnErrorResult,\n TFnResult,\n TQueryKey\n >\n | EffectInfiniteQueryUnusedSkipTokenOptions<\n TFnResult,\n TFnErrorResult,\n TFnResult,\n TQueryKey\n >,\n \"queryFn\" | \"queryKey\"\n> & {\n queryKey: EffectQueryQueryKey;\n queryFn: EffectInfiniteQueryQueryFn<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n EffectQueryQueryKey\n >;\n};\n\n/**\n * @internal\n */\nexport function effectInfiniteQueryOptions<\n TRuntimeInput,\n TFnResult,\n TFnErrorResult extends { _tag: string },\n TFnRequirements,\n>(\n inputOptions: EffectInfiniteQueryOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements\n >,\n context: {\n runner: EffectQueryRunner<TRuntimeInput>;\n signal?: AbortSignal;\n }\n) {\n const [spanName] = inputOptions.queryKey;\n\n const queryFn: Exclude<\n UseInfiniteQueryOptions<\n TFnResult,\n TFnErrorResult,\n InfiniteData<TFnResult, unknown>,\n EffectQueryQueryKey,\n unknown\n >[\"queryFn\"],\n SkipToken | undefined\n > = async (queryFnContext) => {\n const effect = inputOptions.queryFn(queryFnContext);\n const result = await context.runner.run(effect, spanName, {\n signal: context.signal,\n });\n return Exit.match(result, {\n onSuccess: (value) => value,\n onFailure: (cause) => {\n if (cause._tag === \"Fail\") {\n const failure = cause.error;\n throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);\n }\n throw new EffectQueryDefect(Cause.pretty(cause), cause);\n },\n });\n };\n\n // The as UseQueryOptions is a workaround to set the correct error type. React Query has no way to infer the error type from the Effect.\n return infiniteQueryOptions({\n ...inputOptions,\n queryKey: inputOptions.queryKey as EffectQueryQueryKey,\n queryFn,\n }) as UseInfiniteQueryOptions<\n TFnResult,\n [TFnErrorResult] extends [never]\n ? EffectQueryDefect<unknown>\n : EffectQueryFailure<TFnErrorResult> | EffectQueryDefect<unknown>,\n TFnResult,\n EffectQueryQueryKey\n >;\n}\n","import {\n type MutationFunction,\n mutationOptions,\n type skipToken,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { Cause, type Effect, Exit } from \"effect\";\nimport { EffectQueryDefect, EffectQueryFailure } from \"./errors\";\nimport type { EffectQueryRunner } from \"./runner\";\n\ntype EffectfulMutationFunction<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TVariables,\n> = (\n variables: TVariables\n) => Effect.Effect<TFnResult, TFnErrorResult, TFnRequirements>;\n\nexport type EffectQueryMutationOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TVariables,\n> = Omit<\n UseMutationOptions<TFnResult, TFnErrorResult, TVariables>,\n \"mutationKey\" | \"mutationFn\"\n> & {\n mutationKey: string;\n mutationFn:\n | EffectfulMutationFunction<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TVariables\n >\n | typeof skipToken;\n};\n\n/**\n * @internal\n */\nexport function effectQueryMutationOptions<\n TRuntimeInput,\n TFnResult,\n TFnErrorResult extends { _tag: string },\n TFnRequirements,\n TVariables,\n>(\n inputOptions: EffectQueryMutationOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TVariables\n >,\n context: {\n runner: EffectQueryRunner<TRuntimeInput>;\n }\n) {\n const spanName = inputOptions.mutationKey;\n const mutationFn: MutationFunction<TFnResult, TVariables> = async (\n variables: TVariables\n ) => {\n const effect = (\n inputOptions.mutationFn as EffectfulMutationFunction<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TVariables\n >\n )(variables);\n const result = await context.runner.run(effect, spanName);\n return Exit.match(result, {\n onSuccess: (value) => value,\n onFailure: (cause) => {\n if (cause._tag === \"Fail\") {\n const failure = cause.error;\n throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);\n }\n throw new EffectQueryDefect(Cause.pretty(cause), cause);\n },\n });\n };\n\n return mutationOptions({\n ...inputOptions,\n mutationFn,\n }) as UseMutationOptions<\n TFnResult,\n [TFnErrorResult] extends [never]\n ? never\n : EffectQueryFailure<TFnErrorResult> | EffectQueryDefect<unknown>,\n TVariables\n >;\n}\n","import {\n type DefinedInitialDataOptions,\n type QueryFunction,\n type QueryFunctionContext,\n queryOptions,\n type UndefinedInitialDataOptions,\n type UnusedSkipTokenOptions,\n type UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport { Cause, type Effect, Exit } from \"effect\";\nimport { EffectQueryDefect, EffectQueryFailure } from \"./errors\";\nimport type { EffectQueryRunner } from \"./runner\";\nimport type { EffectQueryQueryKey } from \"./types\";\n\ntype EffectQueryQueryFn<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n TPageParam = never,\n> = (\n context: QueryFunctionContext<TQueryKey, TPageParam>\n) => Effect.Effect<TFnResult, TFnErrorResult, TFnRequirements>;\n\ntype EffectQueryUndefinedInitialDataOptions<\n TQueryFnData,\n TError,\n TData = TQueryFnData,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>;\n\ntype EffectQueryUnusedSkipTokenOptions<\n TQueryFnData,\n TError,\n TData = TQueryFnData,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey>;\n\ntype EffectQueryDefinedInitialDataOptions<\n TQueryFnData,\n TError,\n TData = TQueryFnData,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>;\n\nexport type EffectQueryOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = Omit<\n | EffectQueryUndefinedInitialDataOptions<\n TFnResult,\n TFnErrorResult,\n TFnResult,\n TQueryKey\n >\n | EffectQueryDefinedInitialDataOptions<\n TFnResult,\n TFnErrorResult,\n TFnResult,\n TQueryKey\n >\n | EffectQueryUnusedSkipTokenOptions<\n TFnResult,\n TFnErrorResult,\n TFnResult,\n TQueryKey\n >,\n \"queryFn\" | \"queryKey\"\n> & {\n queryKey: EffectQueryQueryKey;\n queryFn: EffectQueryQueryFn<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n EffectQueryQueryKey\n >;\n};\n\n/**\n * @internal\n */\nexport function effectQueryQueryOptions<\n TRuntimeInput,\n TFnResult,\n TFnErrorResult extends { _tag: string },\n TFnRequirements,\n>(\n inputOptions: EffectQueryOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements\n >,\n context: {\n runner: EffectQueryRunner<TRuntimeInput>;\n signal?: AbortSignal;\n }\n) {\n const [spanName] = inputOptions.queryKey;\n\n const queryFn: QueryFunction<TFnResult, EffectQueryQueryKey> = async (\n queryFnContext\n ) => {\n const effect = inputOptions.queryFn(queryFnContext);\n const result = await context.runner.run(effect, spanName, {\n signal: context.signal,\n });\n return Exit.match(result, {\n onSuccess: (value) => value,\n onFailure: (cause) => {\n if (cause._tag === \"Fail\") {\n const failure = cause.error;\n throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);\n }\n throw new EffectQueryDefect(Cause.pretty(cause), cause);\n },\n });\n };\n\n // The as UseQueryOptions is a workaround to set the correct error type. React Query has no way to infer the error type from the Effect.\n return queryOptions({\n ...inputOptions,\n queryKey: inputOptions.queryKey,\n queryFn,\n }) as UseQueryOptions<\n TFnResult,\n [TFnErrorResult] extends [never]\n ? EffectQueryDefect<unknown>\n : EffectQueryFailure<TFnErrorResult> | EffectQueryDefect<unknown>,\n TFnResult,\n EffectQueryQueryKey\n >;\n}\n","import { Effect, type Exit, type Scope } from \"effect\";\nimport type { ManagedRuntime } from \"effect/ManagedRuntime\";\n\nexport class EffectQueryRunner<TRuntimeInput> {\n readonly runtime: ManagedRuntime<TRuntimeInput, never>;\n constructor(runtime: ManagedRuntime<TRuntimeInput, never>) {\n this.runtime = runtime;\n }\n\n async run<TResult, TError, TRequirements>(\n effect: Effect.Effect<TResult, TError, TRequirements>,\n span: string,\n options: { signal?: AbortSignal } = {}\n ): Promise<Exit.Exit<TResult, TError>> {\n // This is a workaround to allow the effect to run without a scope (it will be provided by the caller)\n const effectToRun = effect as Effect.Effect<\n TResult,\n TError,\n TRuntimeInput | Scope.Scope\n >;\n return await this.runtime.runPromiseExit(\n effectToRun.pipe(\n Effect.withSpan(span),\n Effect.scoped,\n Effect.tapErrorCause(Effect.logError)\n ),\n {\n signal: options.signal,\n }\n );\n }\n}\n","import { type Layer, ManagedRuntime } from \"effect\";\nimport {\n type EffectInfiniteQueryOptionsInput,\n effectInfiniteQueryOptions,\n} from \"./infiniteQueryOptions\";\nimport {\n type EffectQueryMutationOptionsInput,\n effectQueryMutationOptions,\n} from \"./mutationOptions\";\nimport {\n type EffectQueryOptionsInput,\n effectQueryQueryOptions,\n} from \"./queryOptions\";\nimport { EffectQueryRunner } from \"./runner\";\n\nexport function createEffectQuery<Input>(\n layer: Layer.Layer<Input, never, never>\n) {\n const runtime = ManagedRuntime.make(layer);\n const runner = new EffectQueryRunner(runtime);\n\n return {\n queryOptions: <\n TFnResult,\n TFnErrorResult extends { _tag: string },\n TFnRequirements,\n >(\n options: EffectQueryOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements\n >\n ) =>\n effectQueryQueryOptions<\n Input,\n TFnResult,\n TFnErrorResult,\n TFnRequirements\n >(\n {\n queryKey: options.queryKey,\n queryFn: options.queryFn,\n },\n {\n runner,\n }\n ),\n infiniteQueryOptions: <\n TFnResult,\n TFnErrorResult extends { _tag: string },\n TFnRequirements,\n >(\n options: EffectInfiniteQueryOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements\n >\n ) =>\n effectInfiniteQueryOptions<\n Input,\n TFnResult,\n TFnErrorResult,\n TFnRequirements\n >(options, { runner }),\n mutationOptions: <\n TFnResult,\n TFnErrorResult extends { _tag: string },\n TFnRequirements,\n TVariables,\n >(\n options: EffectQueryMutationOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TVariables\n >\n ) =>\n effectQueryMutationOptions<\n Input,\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TVariables\n >(options, { runner }),\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "effect-query",
3
- "version": "0.0.1-alpha.2",
3
+ "version": "0.0.1-alpha.3",
4
4
  "description": "Effect adapter for Tanstack Query",
5
5
  "repository": {
6
6
  "type": "git",
package/src/index.ts CHANGED
@@ -1,183 +1,86 @@
1
+ import { type Layer, ManagedRuntime } from "effect";
1
2
  import {
2
- type MutationFunction,
3
- mutationOptions,
4
- type QueryFunction,
5
- type QueryFunctionContext,
6
- queryOptions,
7
- type skipToken,
8
- type UseMutationOptions,
9
- type UseQueryOptions,
10
- } from "@tanstack/react-query";
3
+ type EffectInfiniteQueryOptionsInput,
4
+ effectInfiniteQueryOptions,
5
+ } from "./infiniteQueryOptions";
11
6
  import {
12
- Cause,
13
- Effect,
14
- Exit,
15
- type Layer,
16
- ManagedRuntime,
17
- type Scope,
18
- } from "effect";
19
- import { EffectQueryDefect, EffectQueryFailure } from "./errors";
7
+ type EffectQueryMutationOptionsInput,
8
+ effectQueryMutationOptions,
9
+ } from "./mutationOptions";
10
+ import {
11
+ type EffectQueryOptionsInput,
12
+ effectQueryQueryOptions,
13
+ } from "./queryOptions";
14
+ import { EffectQueryRunner } from "./runner";
20
15
 
21
16
  export function createEffectQuery<Input>(
22
17
  layer: Layer.Layer<Input, never, never>
23
18
  ) {
24
- type RuntimeContext = Input | Scope.Scope;
25
-
26
- type EffectfulMutationFunction<
27
- TData,
28
- E,
29
- TVariables,
30
- R extends RuntimeContext,
31
- > = (variables: TVariables) => Effect.Effect<TData, E, R>;
32
-
33
- type EffectfulMutationOptions<
34
- TData,
35
- E,
36
- TVariables,
37
- R extends RuntimeContext,
38
- > = Omit<
39
- UseMutationOptions<TData, Error, TVariables>,
40
- "mutationKey" | "mutationFn"
41
- > & {
42
- mutationKey: string;
43
- mutationFn:
44
- | EffectfulMutationFunction<TData, E, TVariables, R>
45
- | typeof skipToken;
46
- };
47
-
48
- type EffectfulQueryFunction<
49
- TData,
50
- E,
51
- R,
52
- TQueryKey extends QueryKey = QueryKey,
53
- TPageParam = never,
54
- > = (
55
- context: QueryFunctionContext<TQueryKey, TPageParam>
56
- ) => Effect.Effect<TData, E, R>;
57
-
58
- type EffectfulQueryOptions<
59
- TData,
60
- TError,
61
- R,
62
- TQueryKey extends QueryKey = QueryKey,
63
- TPageParam = never,
64
- > = Omit<
65
- UseQueryOptions<TData, TError, TData, TQueryKey>,
66
- "queryKey" | "queryFn"
67
- > & {
68
- queryKey: TQueryKey;
69
- queryFn:
70
- | EffectfulQueryFunction<TData, TError, R, TQueryKey, TPageParam>
71
- | typeof skipToken;
72
- };
73
-
74
19
  const runtime = ManagedRuntime.make(layer);
75
- const runner =
76
- <A, E, R extends RuntimeContext>(
77
- span: string,
78
- options: { signal?: AbortSignal } = {}
79
- ) =>
80
- (effect: Effect.Effect<A, E, R>): Promise<Exit.Exit<A, E>> =>
81
- runtime.runPromiseExit(
82
- effect.pipe(
83
- Effect.withSpan(span),
84
- Effect.scoped,
85
- Effect.tapErrorCause(Effect.logError)
86
- ),
87
- {
88
- signal: options.signal,
89
- }
90
- );
20
+ const runner = new EffectQueryRunner(runtime);
91
21
 
92
22
  return {
93
23
  queryOptions: <
94
- TData,
95
- E extends { _tag: string },
96
- R extends RuntimeContext,
97
- TQueryKey extends QueryKey = QueryKey,
24
+ TFnResult,
25
+ TFnErrorResult extends { _tag: string },
26
+ TFnRequirements,
98
27
  >(
99
- options: EffectfulQueryOptions<TData, E, R, TQueryKey>
100
- ) => {
101
- const [spanName] = options.queryKey;
102
-
103
- const queryFn: QueryFunction<TData, TQueryKey> = async (
104
- context: QueryFunctionContext<TQueryKey>
105
- ) => {
106
- const effect = (
107
- options.queryFn as EffectfulQueryFunction<TData, E, R, TQueryKey>
108
- )(context);
109
- const result = await effect.pipe(
110
- runner(spanName, { signal: context.signal })
111
- );
112
- return Exit.match(result, {
113
- onSuccess: (value) => value,
114
- onFailure: (cause) => {
115
- if (cause._tag === "Fail") {
116
- const failure = cause.error;
117
- throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);
118
- }
119
- throw new EffectQueryDefect(Cause.pretty(cause), cause);
120
- },
121
- });
122
- };
123
-
124
- return queryOptions({
125
- ...options,
126
- queryFn,
127
- }) as UseQueryOptions<
128
- TData,
129
- [E] extends [never]
130
- ? EffectQueryDefect<unknown>
131
- : EffectQueryFailure<E> | EffectQueryDefect<unknown>,
132
- TData,
133
- TQueryKey
134
- >;
135
- },
28
+ options: EffectQueryOptionsInput<
29
+ TFnResult,
30
+ TFnErrorResult,
31
+ TFnRequirements
32
+ >
33
+ ) =>
34
+ effectQueryQueryOptions<
35
+ Input,
36
+ TFnResult,
37
+ TFnErrorResult,
38
+ TFnRequirements
39
+ >(
40
+ {
41
+ queryKey: options.queryKey,
42
+ queryFn: options.queryFn,
43
+ },
44
+ {
45
+ runner,
46
+ }
47
+ ),
48
+ infiniteQueryOptions: <
49
+ TFnResult,
50
+ TFnErrorResult extends { _tag: string },
51
+ TFnRequirements,
52
+ >(
53
+ options: EffectInfiniteQueryOptionsInput<
54
+ TFnResult,
55
+ TFnErrorResult,
56
+ TFnRequirements
57
+ >
58
+ ) =>
59
+ effectInfiniteQueryOptions<
60
+ Input,
61
+ TFnResult,
62
+ TFnErrorResult,
63
+ TFnRequirements
64
+ >(options, { runner }),
136
65
  mutationOptions: <
137
- TData,
138
- E extends { _tag: string },
66
+ TFnResult,
67
+ TFnErrorResult extends { _tag: string },
68
+ TFnRequirements,
139
69
  TVariables,
140
- R extends RuntimeContext,
141
70
  >(
142
- options: EffectfulMutationOptions<TData, E, TVariables, R>
143
- ) => {
144
- const spanName = options.mutationKey;
145
- const mutationFn: MutationFunction<TData, TVariables> = async (
146
- variables: TVariables
147
- ) => {
148
- const effect = (
149
- options.mutationFn as EffectfulMutationFunction<
150
- TData,
151
- E,
152
- TVariables,
153
- R
154
- >
155
- )(variables);
156
- const result = await effect.pipe(runner(spanName));
157
- return Exit.match(result, {
158
- onSuccess: (value) => value,
159
- onFailure: (cause) => {
160
- if (cause._tag === "Fail") {
161
- const failure = cause.error;
162
- throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);
163
- }
164
- throw new EffectQueryDefect(Cause.pretty(cause), cause);
165
- },
166
- });
167
- };
168
-
169
- return mutationOptions({
170
- ...options,
171
- mutationFn,
172
- }) as UseMutationOptions<
173
- TData,
174
- [E] extends [never]
175
- ? never
176
- : EffectQueryFailure<E> | EffectQueryDefect<unknown>,
71
+ options: EffectQueryMutationOptionsInput<
72
+ TFnResult,
73
+ TFnErrorResult,
74
+ TFnRequirements,
177
75
  TVariables
178
- >;
179
- },
76
+ >
77
+ ) =>
78
+ effectQueryMutationOptions<
79
+ Input,
80
+ TFnResult,
81
+ TFnErrorResult,
82
+ TFnRequirements,
83
+ TVariables
84
+ >(options, { runner }),
180
85
  };
181
86
  }
182
-
183
- type QueryKey = readonly [string, string, Record<string, unknown>?];
@@ -0,0 +1,142 @@
1
+ import {
2
+ type DefinedInitialDataInfiniteOptions,
3
+ type InfiniteData,
4
+ infiniteQueryOptions,
5
+ type QueryFunctionContext,
6
+ type SkipToken,
7
+ type UndefinedInitialDataInfiniteOptions,
8
+ type UnusedSkipTokenInfiniteOptions,
9
+ type UseInfiniteQueryOptions,
10
+ } from "@tanstack/react-query";
11
+ import { Cause, type Effect, Exit } from "effect";
12
+ import { EffectQueryDefect, EffectQueryFailure } from "./errors";
13
+ import type { EffectQueryRunner } from "./runner";
14
+ import type { EffectQueryQueryKey } from "./types";
15
+
16
+ type EffectInfiniteQueryQueryFn<
17
+ TFnResult,
18
+ TFnErrorResult,
19
+ TFnRequirements,
20
+ TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,
21
+ TPageParam = never,
22
+ > = (
23
+ context: QueryFunctionContext<TQueryKey, TPageParam>
24
+ ) => Effect.Effect<TFnResult, TFnErrorResult, TFnRequirements>;
25
+
26
+ type EffectInfiniteQueryUndefinedInitialDataOptions<
27
+ TQueryFnData,
28
+ TError,
29
+ TData = InfiniteData<TQueryFnData, unknown>,
30
+ TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,
31
+ > = UndefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey>;
32
+
33
+ type EffectInfiniteQueryUnusedSkipTokenOptions<
34
+ TQueryFnData,
35
+ TError,
36
+ TData = InfiniteData<TQueryFnData, unknown>,
37
+ TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,
38
+ > = UnusedSkipTokenInfiniteOptions<TQueryFnData, TError, TData, TQueryKey>;
39
+
40
+ type EffectInfiniteQueryDefinedInitialDataOptions<
41
+ TQueryFnData,
42
+ TError,
43
+ TData = InfiniteData<TQueryFnData, unknown>,
44
+ TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,
45
+ > = DefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey>;
46
+
47
+ export type EffectInfiniteQueryOptionsInput<
48
+ TFnResult,
49
+ TFnErrorResult,
50
+ TFnRequirements,
51
+ TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,
52
+ > = Omit<
53
+ | EffectInfiniteQueryUndefinedInitialDataOptions<
54
+ TFnResult,
55
+ TFnErrorResult,
56
+ TFnResult,
57
+ TQueryKey
58
+ >
59
+ | EffectInfiniteQueryDefinedInitialDataOptions<
60
+ TFnResult,
61
+ TFnErrorResult,
62
+ TFnResult,
63
+ TQueryKey
64
+ >
65
+ | EffectInfiniteQueryUnusedSkipTokenOptions<
66
+ TFnResult,
67
+ TFnErrorResult,
68
+ TFnResult,
69
+ TQueryKey
70
+ >,
71
+ "queryFn" | "queryKey"
72
+ > & {
73
+ queryKey: EffectQueryQueryKey;
74
+ queryFn: EffectInfiniteQueryQueryFn<
75
+ TFnResult,
76
+ TFnErrorResult,
77
+ TFnRequirements,
78
+ EffectQueryQueryKey
79
+ >;
80
+ };
81
+
82
+ /**
83
+ * @internal
84
+ */
85
+ export function effectInfiniteQueryOptions<
86
+ TRuntimeInput,
87
+ TFnResult,
88
+ TFnErrorResult extends { _tag: string },
89
+ TFnRequirements,
90
+ >(
91
+ inputOptions: EffectInfiniteQueryOptionsInput<
92
+ TFnResult,
93
+ TFnErrorResult,
94
+ TFnRequirements
95
+ >,
96
+ context: {
97
+ runner: EffectQueryRunner<TRuntimeInput>;
98
+ signal?: AbortSignal;
99
+ }
100
+ ) {
101
+ const [spanName] = inputOptions.queryKey;
102
+
103
+ const queryFn: Exclude<
104
+ UseInfiniteQueryOptions<
105
+ TFnResult,
106
+ TFnErrorResult,
107
+ InfiniteData<TFnResult, unknown>,
108
+ EffectQueryQueryKey,
109
+ unknown
110
+ >["queryFn"],
111
+ SkipToken | undefined
112
+ > = async (queryFnContext) => {
113
+ const effect = inputOptions.queryFn(queryFnContext);
114
+ const result = await context.runner.run(effect, spanName, {
115
+ signal: context.signal,
116
+ });
117
+ return Exit.match(result, {
118
+ onSuccess: (value) => value,
119
+ onFailure: (cause) => {
120
+ if (cause._tag === "Fail") {
121
+ const failure = cause.error;
122
+ throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);
123
+ }
124
+ throw new EffectQueryDefect(Cause.pretty(cause), cause);
125
+ },
126
+ });
127
+ };
128
+
129
+ // The as UseQueryOptions is a workaround to set the correct error type. React Query has no way to infer the error type from the Effect.
130
+ return infiniteQueryOptions({
131
+ ...inputOptions,
132
+ queryKey: inputOptions.queryKey as EffectQueryQueryKey,
133
+ queryFn,
134
+ }) as UseInfiniteQueryOptions<
135
+ TFnResult,
136
+ [TFnErrorResult] extends [never]
137
+ ? EffectQueryDefect<unknown>
138
+ : EffectQueryFailure<TFnErrorResult> | EffectQueryDefect<unknown>,
139
+ TFnResult,
140
+ EffectQueryQueryKey
141
+ >;
142
+ }
@@ -0,0 +1,95 @@
1
+ import {
2
+ type MutationFunction,
3
+ mutationOptions,
4
+ type skipToken,
5
+ type UseMutationOptions,
6
+ } from "@tanstack/react-query";
7
+ import { Cause, type Effect, Exit } from "effect";
8
+ import { EffectQueryDefect, EffectQueryFailure } from "./errors";
9
+ import type { EffectQueryRunner } from "./runner";
10
+
11
+ type EffectfulMutationFunction<
12
+ TFnResult,
13
+ TFnErrorResult,
14
+ TFnRequirements,
15
+ TVariables,
16
+ > = (
17
+ variables: TVariables
18
+ ) => Effect.Effect<TFnResult, TFnErrorResult, TFnRequirements>;
19
+
20
+ export type EffectQueryMutationOptionsInput<
21
+ TFnResult,
22
+ TFnErrorResult,
23
+ TFnRequirements,
24
+ TVariables,
25
+ > = Omit<
26
+ UseMutationOptions<TFnResult, TFnErrorResult, TVariables>,
27
+ "mutationKey" | "mutationFn"
28
+ > & {
29
+ mutationKey: string;
30
+ mutationFn:
31
+ | EffectfulMutationFunction<
32
+ TFnResult,
33
+ TFnErrorResult,
34
+ TFnRequirements,
35
+ TVariables
36
+ >
37
+ | typeof skipToken;
38
+ };
39
+
40
+ /**
41
+ * @internal
42
+ */
43
+ export function effectQueryMutationOptions<
44
+ TRuntimeInput,
45
+ TFnResult,
46
+ TFnErrorResult extends { _tag: string },
47
+ TFnRequirements,
48
+ TVariables,
49
+ >(
50
+ inputOptions: EffectQueryMutationOptionsInput<
51
+ TFnResult,
52
+ TFnErrorResult,
53
+ TFnRequirements,
54
+ TVariables
55
+ >,
56
+ context: {
57
+ runner: EffectQueryRunner<TRuntimeInput>;
58
+ }
59
+ ) {
60
+ const spanName = inputOptions.mutationKey;
61
+ const mutationFn: MutationFunction<TFnResult, TVariables> = async (
62
+ variables: TVariables
63
+ ) => {
64
+ const effect = (
65
+ inputOptions.mutationFn as EffectfulMutationFunction<
66
+ TFnResult,
67
+ TFnErrorResult,
68
+ TFnRequirements,
69
+ TVariables
70
+ >
71
+ )(variables);
72
+ const result = await context.runner.run(effect, spanName);
73
+ return Exit.match(result, {
74
+ onSuccess: (value) => value,
75
+ onFailure: (cause) => {
76
+ if (cause._tag === "Fail") {
77
+ const failure = cause.error;
78
+ throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);
79
+ }
80
+ throw new EffectQueryDefect(Cause.pretty(cause), cause);
81
+ },
82
+ });
83
+ };
84
+
85
+ return mutationOptions({
86
+ ...inputOptions,
87
+ mutationFn,
88
+ }) as UseMutationOptions<
89
+ TFnResult,
90
+ [TFnErrorResult] extends [never]
91
+ ? never
92
+ : EffectQueryFailure<TFnErrorResult> | EffectQueryDefect<unknown>,
93
+ TVariables
94
+ >;
95
+ }
@@ -0,0 +1,134 @@
1
+ import {
2
+ type DefinedInitialDataOptions,
3
+ type QueryFunction,
4
+ type QueryFunctionContext,
5
+ queryOptions,
6
+ type UndefinedInitialDataOptions,
7
+ type UnusedSkipTokenOptions,
8
+ type UseQueryOptions,
9
+ } from "@tanstack/react-query";
10
+ import { Cause, type Effect, Exit } from "effect";
11
+ import { EffectQueryDefect, EffectQueryFailure } from "./errors";
12
+ import type { EffectQueryRunner } from "./runner";
13
+ import type { EffectQueryQueryKey } from "./types";
14
+
15
+ type EffectQueryQueryFn<
16
+ TFnResult,
17
+ TFnErrorResult,
18
+ TFnRequirements,
19
+ TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,
20
+ TPageParam = never,
21
+ > = (
22
+ context: QueryFunctionContext<TQueryKey, TPageParam>
23
+ ) => Effect.Effect<TFnResult, TFnErrorResult, TFnRequirements>;
24
+
25
+ type EffectQueryUndefinedInitialDataOptions<
26
+ TQueryFnData,
27
+ TError,
28
+ TData = TQueryFnData,
29
+ TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,
30
+ > = UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>;
31
+
32
+ type EffectQueryUnusedSkipTokenOptions<
33
+ TQueryFnData,
34
+ TError,
35
+ TData = TQueryFnData,
36
+ TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,
37
+ > = UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey>;
38
+
39
+ type EffectQueryDefinedInitialDataOptions<
40
+ TQueryFnData,
41
+ TError,
42
+ TData = TQueryFnData,
43
+ TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,
44
+ > = DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>;
45
+
46
+ export type EffectQueryOptionsInput<
47
+ TFnResult,
48
+ TFnErrorResult,
49
+ TFnRequirements,
50
+ TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,
51
+ > = Omit<
52
+ | EffectQueryUndefinedInitialDataOptions<
53
+ TFnResult,
54
+ TFnErrorResult,
55
+ TFnResult,
56
+ TQueryKey
57
+ >
58
+ | EffectQueryDefinedInitialDataOptions<
59
+ TFnResult,
60
+ TFnErrorResult,
61
+ TFnResult,
62
+ TQueryKey
63
+ >
64
+ | EffectQueryUnusedSkipTokenOptions<
65
+ TFnResult,
66
+ TFnErrorResult,
67
+ TFnResult,
68
+ TQueryKey
69
+ >,
70
+ "queryFn" | "queryKey"
71
+ > & {
72
+ queryKey: EffectQueryQueryKey;
73
+ queryFn: EffectQueryQueryFn<
74
+ TFnResult,
75
+ TFnErrorResult,
76
+ TFnRequirements,
77
+ EffectQueryQueryKey
78
+ >;
79
+ };
80
+
81
+ /**
82
+ * @internal
83
+ */
84
+ export function effectQueryQueryOptions<
85
+ TRuntimeInput,
86
+ TFnResult,
87
+ TFnErrorResult extends { _tag: string },
88
+ TFnRequirements,
89
+ >(
90
+ inputOptions: EffectQueryOptionsInput<
91
+ TFnResult,
92
+ TFnErrorResult,
93
+ TFnRequirements
94
+ >,
95
+ context: {
96
+ runner: EffectQueryRunner<TRuntimeInput>;
97
+ signal?: AbortSignal;
98
+ }
99
+ ) {
100
+ const [spanName] = inputOptions.queryKey;
101
+
102
+ const queryFn: QueryFunction<TFnResult, EffectQueryQueryKey> = async (
103
+ queryFnContext
104
+ ) => {
105
+ const effect = inputOptions.queryFn(queryFnContext);
106
+ const result = await context.runner.run(effect, spanName, {
107
+ signal: context.signal,
108
+ });
109
+ return Exit.match(result, {
110
+ onSuccess: (value) => value,
111
+ onFailure: (cause) => {
112
+ if (cause._tag === "Fail") {
113
+ const failure = cause.error;
114
+ throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);
115
+ }
116
+ throw new EffectQueryDefect(Cause.pretty(cause), cause);
117
+ },
118
+ });
119
+ };
120
+
121
+ // The as UseQueryOptions is a workaround to set the correct error type. React Query has no way to infer the error type from the Effect.
122
+ return queryOptions({
123
+ ...inputOptions,
124
+ queryKey: inputOptions.queryKey,
125
+ queryFn,
126
+ }) as UseQueryOptions<
127
+ TFnResult,
128
+ [TFnErrorResult] extends [never]
129
+ ? EffectQueryDefect<unknown>
130
+ : EffectQueryFailure<TFnErrorResult> | EffectQueryDefect<unknown>,
131
+ TFnResult,
132
+ EffectQueryQueryKey
133
+ >;
134
+ }
package/src/runner.ts ADDED
@@ -0,0 +1,32 @@
1
+ import { Effect, type Exit, type Scope } from "effect";
2
+ import type { ManagedRuntime } from "effect/ManagedRuntime";
3
+
4
+ export class EffectQueryRunner<TRuntimeInput> {
5
+ readonly runtime: ManagedRuntime<TRuntimeInput, never>;
6
+ constructor(runtime: ManagedRuntime<TRuntimeInput, never>) {
7
+ this.runtime = runtime;
8
+ }
9
+
10
+ async run<TResult, TError, TRequirements>(
11
+ effect: Effect.Effect<TResult, TError, TRequirements>,
12
+ span: string,
13
+ options: { signal?: AbortSignal } = {}
14
+ ): Promise<Exit.Exit<TResult, TError>> {
15
+ // This is a workaround to allow the effect to run without a scope (it will be provided by the caller)
16
+ const effectToRun = effect as Effect.Effect<
17
+ TResult,
18
+ TError,
19
+ TRuntimeInput | Scope.Scope
20
+ >;
21
+ return await this.runtime.runPromiseExit(
22
+ effectToRun.pipe(
23
+ Effect.withSpan(span),
24
+ Effect.scoped,
25
+ Effect.tapErrorCause(Effect.logError)
26
+ ),
27
+ {
28
+ signal: options.signal,
29
+ }
30
+ );
31
+ }
32
+ }
package/src/types.ts ADDED
@@ -0,0 +1,5 @@
1
+ export type EffectQueryQueryKey = readonly [
2
+ string,
3
+ string,
4
+ Record<string, unknown>?,
5
+ ];