@effect-app/vue 1.0.14 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/query.d.ts CHANGED
@@ -1,16 +1,18 @@
1
- import type { QueryObserverOptions, QueryObserverResult, RefetchOptions, UseQueryReturnType } from "@tanstack/vue-query";
2
- import { Effect } from "effect-app";
3
- import type { ApiConfig, FetchResponse, QueryResult } from "effect-app/client";
1
+ import * as Result from "@effect-rx/rx/Result";
2
+ import type { QueryKey, QueryObserverOptions, QueryObserverResult, RefetchOptions, UseQueryReturnType } from "@tanstack/vue-query";
3
+ import type { Cause } from "effect-app";
4
+ import { Effect, Runtime } from "effect-app";
5
+ import type { ApiConfig, FetchResponse } from "effect-app/client";
4
6
  import type { HttpClient } from "effect-app/http";
5
7
  import type { ComputedRef, WatchSource } from "vue";
6
- export interface QueryObserverOptionsCustom extends Omit<QueryObserverOptions, "queryKey" | "queryFn"> {
8
+ export interface QueryObserverOptionsCustom<TQueryFnData = unknown, TError = Error, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TPageParam = never> extends Omit<QueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey, TPageParam>, "queryKey" | "queryFn"> {
7
9
  }
8
10
  export declare function useSafeQuery<E, A>(self: {
9
11
  handler: Effect<FetchResponse<A>, E, ApiConfig | HttpClient.Client.Default>;
10
12
  mapPath: string;
11
13
  name: string;
12
14
  }, options?: QueryObserverOptionsCustom | undefined): readonly [
13
- ComputedRef<QueryResult<E, A>>,
15
+ ComputedRef<Result.Result<A, E>>,
14
16
  ComputedRef<A | undefined>,
15
17
  (options?: RefetchOptions | undefined) => Promise<QueryObserverResult<any, any>>,
16
18
  UseQueryReturnType<any, any>
@@ -20,18 +22,21 @@ export declare function useSafeQuery<Arg, E, A>(self: {
20
22
  mapPath: (arg: Arg) => string;
21
23
  name: string;
22
24
  }, arg: Arg | WatchSource<Arg>, options?: QueryObserverOptionsCustom | undefined): readonly [
23
- ComputedRef<QueryResult<E, A>>,
25
+ ComputedRef<Result.Result<A, E>>,
24
26
  ComputedRef<A | undefined>,
25
27
  (options?: RefetchOptions | undefined) => Promise<QueryObserverResult<any, any>>,
26
28
  UseQueryReturnType<any, any>
27
29
  ];
30
+ export interface KnownFiberFailure<E> extends Runtime.FiberFailure {
31
+ readonly [Runtime.FiberFailureCauseId]: Cause.Cause<E>;
32
+ }
28
33
  export declare const useSafeQuery_: <I, A, E>(q: {
29
- handler: (req: I) => Effect<FetchResponse<A>, E, ApiConfig | HttpClient.Client.Default>;
34
+ readonly handler: (req: I) => Effect<FetchResponse<A>, E, ApiConfig | HttpClient.Client.Default>;
30
35
  mapPath: (req: I) => string;
31
36
  name: string;
32
37
  } | {
33
- handler: Effect<FetchResponse<A>, E, ApiConfig | HttpClient.Client.Default>;
38
+ readonly handler: Effect<FetchResponse<A>, E, ApiConfig | HttpClient.Client.Default>;
34
39
  mapPath: string;
35
40
  name: string;
36
- }, arg?: I | WatchSource<I>, options?: QueryObserverOptionsCustom) => readonly [ComputedRef<QueryResult<Error | null, unknown>>, ComputedRef<unknown>, (options?: RefetchOptions | undefined) => Promise<QueryObserverResult<unknown, Error>>, UseQueryReturnType<unknown, Error>];
41
+ }, arg?: I | WatchSource<I>, options?: QueryObserverOptionsCustom<unknown, KnownFiberFailure<E>, A>) => readonly [ComputedRef<Result.Result<A, E>>, ComputedRef<A | undefined>, (options?: RefetchOptions | undefined) => Promise<QueryObserverResult<A, KnownFiberFailure<E>>>, UseQueryReturnType<A, KnownFiberFailure<E>>];
37
42
  //# sourceMappingURL=query.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAExH,OAAO,EAAS,MAAM,EAA2B,MAAM,YAAY,CAAA;AAEnE,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,KAAK,CAAA;AAGnD,MAAM,WAAW,0BAA2B,SAAQ,IAAI,CAAC,oBAAoB,EAAE,UAAU,GAAG,SAAS,CAAC;CAAG;AAEzG,wBAAgB,YAAY,CAAC,CAAC,EAAE,CAAC,EAC/B,IAAI,EAAE;IACJ,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC3E,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;CACb,EACD,OAAO,CAAC,EAAE,0BAA0B,GAAG,SAAS,GAC/C,SAAS;IACV,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,WAAW,CAAC,CAAC,GAAG,SAAS,CAAC;IAC1B,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,SAAS,KAAK,OAAO,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAChF,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC;CAC7B,CAAA;AACD,wBAAgB,YAAY,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EACpC,IAAI,EAAE;IACJ,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACzF,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAA;IAC7B,IAAI,EAAE,MAAM,CAAA;CACb,EACD,GAAG,EAAE,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,EAC3B,OAAO,CAAC,EAAE,0BAA0B,GAAG,SAAS,GAC/C,SAAS;IACV,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,WAAW,CAAC,CAAC,GAAG,SAAS,CAAC;IAC1B,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,SAAS,KAAK,OAAO,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAChF,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC;CAC7B,CAAA;AAsCD,eAAO,MAAM,aAAa,eAEpB;IACA,OAAO,EAAE,CACP,GAAG,EAAE,CAAC,KACH,OACH,cAAc,CAAC,CAAC,EAChB,CAAC,EACD,SAAS,GAAG,WAAW,MAAM,CAAC,OAAO,CACtC,CAAA;IACD,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAA;CACb,GACC;IACA,OAAO,EAAE,OACP,cAAc,CAAC,CAAC,EAChB,CAAC,EACD,SAAS,GAAG,WAAW,MAAM,CAAC,OAAO,CACtC,CAAA;IACD,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;CACb,QACG,CAAC,GAAG,YAAY,CAAC,CAAC,YACf,0BAA0B,iNA6DpC,CAAA"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
package/dist/query.js CHANGED
@@ -1,8 +1,12 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* eslint-disable @typescript-eslint/no-unsafe-call */
3
+ /* eslint-disable @typescript-eslint/no-unsafe-return */
4
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
5
+ import * as Result from "@effect-rx/rx/Result";
1
6
  import { useQuery } from "@tanstack/vue-query";
2
- import { Cause, Effect, Either, Option, Runtime } from "effect-app";
3
- import { Done, Initial, isSuccess, Loading, Refreshing } from "effect-app/client";
7
+ import { Effect, Option, Runtime } from "effect-app";
4
8
  import { computed, ref } from "vue";
5
- import { makeQueryKey, run } from "./internal.js";
9
+ import { makeQueryKey, reportRuntimeError, run } from "./internal.js";
6
10
  export function useSafeQuery(self,
7
11
  /*
8
12
  q:
@@ -49,61 +53,38 @@ export const useSafeQuery_ = (q, arg, options = {} // TODO
49
53
  }
50
54
  : ref(arg);
51
55
  const queryKey = makeQueryKey(q.name);
52
- const r = useQuery(Effect.isEffect(q.handler)
56
+ const handler = q.handler;
57
+ const r = useQuery(Effect.isEffect(handler)
53
58
  ? {
54
59
  ...options,
55
60
  queryKey,
56
- queryFn: ({ signal }) => run
57
- .value(q.handler, { signal })
58
- .then((_) => _.body)
59
- .catch((_) => {
60
- if (!Runtime.isFiberFailure(_))
61
- throw _;
62
- const cause = _[Runtime.FiberFailureCauseId];
63
- throw Cause.squash(cause);
64
- })
61
+ queryFn: ({ signal }) => run.value(Effect
62
+ .map(handler, (_) => _.body)
63
+ .pipe(Effect.tapDefect(reportRuntimeError)), { signal })
65
64
  }
66
65
  : {
67
66
  ...options,
68
67
  queryKey: [...queryKey, req],
69
68
  queryFn: ({ signal }) => run
70
- .value(q.handler(req.value), { signal })
71
- .then((_) => _.body)
72
- .catch((_) => {
73
- if (!Runtime.isFiberFailure(_))
74
- throw _;
75
- const cause = _[Runtime.FiberFailureCauseId];
76
- throw Cause.squash(cause);
77
- })
69
+ .value(Effect
70
+ .map(handler(req.value), (_) => _.body)
71
+ .pipe(Effect.tapDefect(reportRuntimeError)), { signal })
78
72
  });
79
73
  const result = computed(() => swrToQuery({
80
- error: r.error.value,
74
+ error: r.error.value ?? undefined,
81
75
  data: r.data.value,
82
76
  isValidating: r.isFetching.value
83
77
  }));
84
- const latestSuccess = computed(() => {
85
- const value = result.value;
86
- return isSuccess(value)
87
- ? Either.isRight(value.current)
88
- ? value.current.right
89
- : Option.isSome(value.previous)
90
- ? value.previous.value
91
- : undefined
92
- : undefined;
93
- });
78
+ const latestSuccess = computed(() => Option.getOrUndefined(Result.value(result.value)));
94
79
  return [result, latestSuccess, r.refetch, r];
95
80
  };
96
81
  function swrToQuery(r) {
97
82
  if (r.error) {
98
- return r.isValidating
99
- ? Refreshing.fail(r.error, r.data)
100
- : Done.fail(r.error, r.data);
83
+ return Result.failureWithPrevious(r.error[Runtime.FiberFailureCauseId], r.data === undefined ? Option.none() : Option.some(Result.success(r.data)), r.isValidating);
101
84
  }
102
85
  if (r.data !== undefined) {
103
- return r.isValidating
104
- ? Refreshing.succeed(r.data)
105
- : Done.succeed(r.data);
86
+ return Result.success(r.data, r.isValidating);
106
87
  }
107
- return r.isValidating ? new Loading() : new Initial();
88
+ return Result.initial(r.isValidating);
108
89
  }
109
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ25FLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFHakYsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxLQUFLLENBQUE7QUFFbkMsT0FBTyxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsTUFBTSxlQUFlLENBQUE7QUErQmpELE1BQU0sVUFBVSxZQUFZLENBQzFCLElBQVM7QUFDVDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXNCRTtBQUNGLFlBQWtCLEVBQ2xCLE9BQWE7SUFFYixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUNsQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDO1FBQzlDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUNoRCxDQUFDO0FBRUQsZ0JBQWdCO0FBQ2hCLHNSQUFzUjtBQUN0UiwyUkFBMlI7QUFDM1IsdVJBQXVSO0FBQ3ZSLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUMzQixDQW9CRyxFQUNILEdBQXdCLEVBQ3hCLFVBQXNDLEVBQUUsQ0FBQyxPQUFPO0VBQ2hELEVBQUU7SUFDRixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUE7SUFDZixNQUFNLEdBQUcsR0FBaUIsQ0FBQyxHQUFHO1FBQzVCLENBQUMsQ0FBQyxTQUFTO1FB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
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELHNEQUFzRDtBQUN0RCx3REFBd0Q7QUFDeEQsNERBQTREO0FBQzVELE9BQU8sS0FBSyxNQUFNLE1BQU0sc0JBQXNCLENBQUE7QUFROUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBRTlDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUdwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUVuQyxPQUFPLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQXdDckUsTUFBTSxVQUFVLFlBQVksQ0FDMUIsSUFBUztBQUNUOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBc0JFO0FBQ0YsWUFBa0IsRUFDbEIsT0FBYTtJQUViLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUM7UUFDOUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0FBQ2hELENBQUM7QUFNRCxnQkFBZ0I7QUFDaEIsc1JBQXNSO0FBQ3RSLDJSQUEyUjtBQUMzUix1UkFBdVI7QUFDdlIsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQzNCLENBb0JHLEVBQ0gsR0FBd0IsRUFDeEIsVUFBd0UsRUFBRSxDQUFDLE9BQU87RUFDbEYsRUFBRTtJQUNGLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQTtJQUNmLE1BQU0sR0FBRyxHQUFpQixDQUFDLEdBQUc7UUFDNUIsQ0FBQyxDQUFDLFNBQVM7UUFD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
package/dist/runtime.d.ts CHANGED
@@ -18,7 +18,7 @@ export declare function makeAppRuntime<R, E, A>(layer: Layer<A, E, R>): Effect.E
18
18
  } | undefined) => Promise<Exit.Exit<A_2, E_2>>;
19
19
  runSync: <A_3, E_3>(effect: Effect.Effect<A_3, E_3, A>) => A_3;
20
20
  runSyncExit: <A_4, E_4>(effect: Effect.Effect<A_4, E_4, A>) => Exit.Exit<A_4, E_4>;
21
- runFork: <A_1, E_1>(self: Effect.Effect<A_1, E_1, A>, options?: Runtime.RunForkOptions | undefined) => import("effect/Fiber").RuntimeFiber<A_1, E_1>;
21
+ runFork: <A_5, E_5>(self: Effect.Effect<A_5, E_5, A>, options?: Runtime.RunForkOptions | undefined) => import("effect/Fiber").RuntimeFiber<A_5, E_5>;
22
22
  };
23
23
  clean: Effect.Effect<void, never, never>;
24
24
  }, E, R>;
@@ -32,7 +32,7 @@ export declare function initializeSync<E, A>(layer: Layer<A | ApiConfig | HttpCl
32
32
  } | undefined) => Promise<Exit.Exit<A_2, E_2>>;
33
33
  runSync: <A_3, E_3>(effect: Effect.Effect<A_3, E_3, HttpClient.Client.Default | ApiConfig | A>) => A_3;
34
34
  runSyncExit: <A_4, E_4>(effect: Effect.Effect<A_4, E_4, HttpClient.Client.Default | ApiConfig | A>) => Exit.Exit<A_4, E_4>;
35
- runFork: <A_1, E_1>(self: Effect.Effect<A_1, E_1, HttpClient.Client.Default | ApiConfig | A>, options?: Runtime.RunForkOptions | undefined) => import("effect/Fiber").RuntimeFiber<A_1, E_1>;
35
+ runFork: <A_5, E_5>(self: Effect.Effect<A_5, E_5, HttpClient.Client.Default | ApiConfig | A>, options?: Runtime.RunForkOptions | undefined) => import("effect/Fiber").RuntimeFiber<A_5, E_5>;
36
36
  };
37
37
  clean: () => void;
38
38
  };
@@ -46,7 +46,7 @@ export declare function initializeAsync<E, A>(layer: Layer<A | ApiConfig | HttpC
46
46
  } | undefined) => Promise<Exit.Exit<A_2, E_2>>;
47
47
  runSync: <A_3, E_3>(effect: Effect.Effect<A_3, E_3, HttpClient.Client.Default | ApiConfig | A>) => A_3;
48
48
  runSyncExit: <A_4, E_4>(effect: Effect.Effect<A_4, E_4, HttpClient.Client.Default | ApiConfig | A>) => Exit.Exit<A_4, E_4>;
49
- runFork: <A_1, E_1>(self: Effect.Effect<A_1, E_1, HttpClient.Client.Default | ApiConfig | A>, options?: Runtime.RunForkOptions | undefined) => import("effect/Fiber").RuntimeFiber<A_1, E_1>;
49
+ runFork: <A_5, E_5>(self: Effect.Effect<A_5, E_5, HttpClient.Client.Default | ApiConfig | A>, options?: Runtime.RunForkOptions | undefined) => import("effect/Fiber").RuntimeFiber<A_5, E_5>;
50
50
  };
51
51
  clean: () => Promise<void>;
52
52
  }>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect-app/vue",
3
- "version": "1.0.14",
3
+ "version": "1.2.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "homepage": "https://github.com/effect-ts-app/libs/tree/main/packages/vue",
@@ -9,13 +9,15 @@
9
9
  "@tanstack/vue-query": "^5.32.0",
10
10
  "query-string": "^9.0.0",
11
11
  "@effect-app/core": "1.0.6",
12
- "effect-app": "1.0.12",
13
- "@effect-app/vue": "1.0.14",
14
- "@effect-app/schema": "1.0.10"
12
+ "@effect-app/schema": "1.0.10",
13
+ "@effect-app/vue": "1.2.0",
14
+ "effect-app": "1.1.0"
15
15
  },
16
16
  "peerDependencies": {
17
17
  "@effect/platform": "^0.50.7",
18
18
  "@effect/platform-browser": "^0.33.7",
19
+ "@effect-rx/rx": "^0.29.1",
20
+ "@effect-rx/rx-vue": "^0.8.1",
19
21
  "@effect/schema": "^0.66.10",
20
22
  "@sentry/browser": "^7.112.2",
21
23
  "effect": "^3.0.7",
package/src/hooks.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
 
3
- export { isFailed, isInitializing, isSuccess } from "effect-app/client"
4
3
  export * from "./mutate.js"
5
4
  export * from "./query.js"
package/src/index.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { isFailed, isInitializing, isSuccess } from "effect-app/client"
1
+ export * as Result from "@effect-rx/rx/Result"
2
2
  export * from "./hooks.js"
3
3
  export * from "./runtime.js"
package/src/internal.ts CHANGED
@@ -2,6 +2,7 @@ import type * as HttpClient from "@effect/platform/Http/Client"
2
2
  import type { Effect } from "effect-app"
3
3
  import { pipe, Runtime } from "effect-app"
4
4
  import type { ApiConfig } from "effect-app/client"
5
+ import { reportError } from "./errorReporter.js"
5
6
 
6
7
  export const run = {
7
8
  value<E, A>(
@@ -11,7 +12,7 @@ export const run = {
11
12
  throw new Error("Runtime not initialized, please run `initRuntime` first")
12
13
  }
13
14
  }
14
- // const reportRuntimeError = reportError("Runtime")
15
+ export const reportRuntimeError = reportError("Runtime")
15
16
  export function initRuntime<A>(rt: Runtime.Runtime<A | ApiConfig | HttpClient.Client.Default>) {
16
17
  const runPromise = Runtime.runPromise(rt)
17
18
  run.value = function<E, A>(
package/src/mutate.ts CHANGED
@@ -3,40 +3,32 @@ import { tuple } from "@effect-app/core/Function"
3
3
  import type * as HttpClient from "@effect/platform/Http/Client"
4
4
  import { useQueryClient } from "@tanstack/vue-query"
5
5
  import { Cause, Effect, Exit, Option } from "effect-app"
6
- import { hasValue, Initial, isInitializing, Loading, queryResult, Refreshing } from "effect-app/client"
7
- import type { ApiConfig, FetchResponse, QueryResult } from "effect-app/client"
6
+ import type { ApiConfig, FetchResponse } from "effect-app/client"
8
7
  import { dropUndefinedT } from "effect-app/utils"
9
8
  import { InterruptedException } from "effect/Cause"
10
9
  import * as Either from "effect/Either"
11
10
  import type { ComputedRef, Ref } from "vue"
12
11
  import { computed, ref, shallowRef } from "vue"
13
- import { makeQueryKey, run } from "./internal.js"
12
+ import { makeQueryKey, reportRuntimeError, run } from "./internal.js"
13
+
14
+ import * as Result from "@effect-rx/rx/Result"
14
15
 
15
16
  export type WatchSource<T = any> = Ref<T> | ComputedRef<T> | (() => T)
16
- export function make<R, E, A>(self: Effect<FetchResponse<A>, E, R>) {
17
- const result = shallowRef(new Initial() as QueryResult<E, A>)
17
+ export function make<A, E, R>(self: Effect<FetchResponse<A>, E, R>) {
18
+ const result = shallowRef(Result.initial() as Result.Result<A, E>)
18
19
 
19
20
  const execute = Effect
20
21
  .sync(() => {
21
- result.value = isInitializing(result.value)
22
- ? new Loading()
23
- : new Refreshing(result.value)
22
+ result.value = Result.waiting(result.value)
24
23
  })
25
24
  .pipe(
26
- Effect.andThen(queryResult(Effect.map(self, (_) => _.body))),
25
+ Effect.andThen(Effect.map(self, (_) => _.body)),
26
+ Effect.exit,
27
+ Effect.andThen(Result.fromExit),
27
28
  Effect.flatMap((r) => Effect.sync(() => result.value = r))
28
29
  )
29
30
 
30
- const latestSuccess = computed(() => {
31
- const value = result.value
32
- return hasValue(value)
33
- ? Either.isRight(value.current)
34
- ? value.current.right
35
- : Option.isSome(value.previous)
36
- ? value.previous.value
37
- : undefined
38
- : undefined
39
- })
31
+ const latestSuccess = computed(() => Option.getOrUndefined(Result.value(result.value)))
40
32
 
41
33
  return tuple(result, latestSuccess, execute)
42
34
  }
@@ -59,7 +51,7 @@ export interface MutationError<E> {
59
51
  readonly error: E
60
52
  }
61
53
 
62
- export type MutationResult<E, A> = MutationInitial | MutationLoading | MutationSuccess<A> | MutationError<E>
54
+ export type MutationResult<A, E> = MutationInitial | MutationLoading | MutationSuccess<A> | MutationError<E>
63
55
 
64
56
  /**
65
57
  * Pass a function that returns an Effect, e.g from a client action, or an Effect
@@ -67,14 +59,14 @@ export type MutationResult<E, A> = MutationInitial | MutationLoading | MutationS
67
59
  */
68
60
  export const useSafeMutation: {
69
61
  <I, E, A>(self: { handler: (i: I) => Effect<A, E, ApiConfig | HttpClient.Client.Default>; name: string }): readonly [
70
- Readonly<Ref<MutationResult<E, A>>>,
62
+ Readonly<Ref<MutationResult<A, E>>>,
71
63
  (
72
64
  i: I,
73
65
  signal?: AbortSignal
74
66
  ) => Promise<Either.Either<A, E>>
75
67
  ]
76
68
  <E, A>(self: { handler: Effect<A, E, ApiConfig | HttpClient.Client.Default>; name: string }): readonly [
77
- Readonly<Ref<MutationResult<E, A>>>,
69
+ Readonly<Ref<MutationResult<A, E>>>,
78
70
  (
79
71
  signal?: AbortSignal
80
72
  ) => Promise<Either.Either<A, E>>
@@ -88,7 +80,7 @@ export const useSafeMutation: {
88
80
  }
89
81
  ) => {
90
82
  const queryClient = useQueryClient()
91
- const state: Ref<MutationResult<E, A>> = ref<MutationResult<E, A>>({ _tag: "Initial" }) as any
83
+ const state: Ref<MutationResult<A, E>> = ref<MutationResult<A, E>>({ _tag: "Initial" }) as any
92
84
 
93
85
  function handleExit(exit: Exit.Exit<A, E>): Effect<Either.Either<A, E>, never, never> {
94
86
  return Effect.sync(() => {
@@ -148,6 +140,7 @@ export const useSafeMutation: {
148
140
  // }))
149
141
  })
150
142
  ),
143
+ Effect.tapDefect(reportRuntimeError),
151
144
  Effect.exit,
152
145
  Effect.flatMap(handleExit)
153
146
  ),
package/src/query.ts CHANGED
@@ -2,17 +2,33 @@
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 type { QueryObserverOptions, QueryObserverResult, RefetchOptions, UseQueryReturnType } from "@tanstack/vue-query"
5
+ import * as Result from "@effect-rx/rx/Result"
6
+ import type {
7
+ QueryKey,
8
+ QueryObserverOptions,
9
+ QueryObserverResult,
10
+ RefetchOptions,
11
+ UseQueryReturnType
12
+ } from "@tanstack/vue-query"
6
13
  import { useQuery } from "@tanstack/vue-query"
7
- import { Cause, Effect, Either, Option, Runtime } from "effect-app"
8
- import { Done, Initial, isSuccess, Loading, Refreshing } from "effect-app/client"
9
- import type { ApiConfig, FetchResponse, QueryResult } from "effect-app/client"
14
+ import type { Cause } from "effect-app"
15
+ import { Effect, Option, Runtime } from "effect-app"
16
+ import type { ApiConfig, FetchResponse } from "effect-app/client"
10
17
  import type { HttpClient } from "effect-app/http"
11
18
  import { computed, ref } from "vue"
12
19
  import type { ComputedRef, WatchSource } from "vue"
13
- import { makeQueryKey, run } from "./internal.js"
20
+ import { makeQueryKey, reportRuntimeError, run } from "./internal.js"
14
21
 
15
- export interface QueryObserverOptionsCustom extends Omit<QueryObserverOptions, "queryKey" | "queryFn"> {}
22
+ export interface QueryObserverOptionsCustom<
23
+ TQueryFnData = unknown,
24
+ TError = Error,
25
+ TData = TQueryFnData,
26
+ TQueryData = TQueryFnData,
27
+ TQueryKey extends QueryKey = QueryKey,
28
+ TPageParam = never
29
+ > extends
30
+ Omit<QueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey, TPageParam>, "queryKey" | "queryFn">
31
+ {}
16
32
 
17
33
  export function useSafeQuery<E, A>(
18
34
  self: {
@@ -22,7 +38,7 @@ export function useSafeQuery<E, A>(
22
38
  },
23
39
  options?: QueryObserverOptionsCustom | undefined // TODO
24
40
  ): readonly [
25
- ComputedRef<QueryResult<E, A>>,
41
+ ComputedRef<Result.Result<A, E>>,
26
42
  ComputedRef<A | undefined>,
27
43
  (options?: RefetchOptions | undefined) => Promise<QueryObserverResult<any, any>>,
28
44
  UseQueryReturnType<any, any>
@@ -36,7 +52,7 @@ export function useSafeQuery<Arg, E, A>(
36
52
  arg: Arg | WatchSource<Arg>,
37
53
  options?: QueryObserverOptionsCustom | undefined // TODO
38
54
  ): readonly [
39
- ComputedRef<QueryResult<E, A>>,
55
+ ComputedRef<Result.Result<A, E>>,
40
56
  ComputedRef<A | undefined>,
41
57
  (options?: RefetchOptions | undefined) => Promise<QueryObserverResult<any, any>>,
42
58
  UseQueryReturnType<any, any>
@@ -74,6 +90,10 @@ export function useSafeQuery(
74
90
  : useSafeQuery_(self, argOrOptions, options)
75
91
  }
76
92
 
93
+ export interface KnownFiberFailure<E> extends Runtime.FiberFailure {
94
+ readonly [Runtime.FiberFailureCauseId]: Cause.Cause<E>
95
+ }
96
+
77
97
  // TODO: options
78
98
  // declare function useQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(options: UndefinedInitialQueryOptions<TQueryFnData, TError, TData, TQueryKey>, queryClient?: QueryClient): UseQueryReturnType<TData, TError>;
79
99
  // declare function useQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(options: DefinedInitialQueryOptions<TQueryFnData, TError, TData, TQueryKey>, queryClient?: QueryClient): UseQueryDefinedReturnType<TData, TError>;
@@ -81,7 +101,7 @@ export function useSafeQuery(
81
101
  export const useSafeQuery_ = <I, A, E>(
82
102
  q:
83
103
  | {
84
- handler: (
104
+ readonly handler: (
85
105
  req: I
86
106
  ) => Effect<
87
107
  FetchResponse<A>,
@@ -92,7 +112,7 @@ export const useSafeQuery_ = <I, A, E>(
92
112
  name: string
93
113
  }
94
114
  | {
95
- handler: Effect<
115
+ readonly handler: Effect<
96
116
  FetchResponse<A>,
97
117
  E,
98
118
  ApiConfig | HttpClient.Client.Default
@@ -101,7 +121,7 @@ export const useSafeQuery_ = <I, A, E>(
101
121
  name: string
102
122
  },
103
123
  arg?: I | WatchSource<I>,
104
- options: QueryObserverOptionsCustom = {} // TODO
124
+ options: QueryObserverOptionsCustom<unknown, KnownFiberFailure<E>, A> = {} // TODO
105
125
  ) => {
106
126
  const arr = arg
107
127
  const req: { value: I } = !arg
@@ -114,71 +134,60 @@ export const useSafeQuery_ = <I, A, E>(
114
134
  } as any)
115
135
  : ref(arg)
116
136
  const queryKey = makeQueryKey(q.name)
117
- const r = useQuery(
118
- Effect.isEffect(q.handler)
137
+ const handler = q.handler
138
+ const r = useQuery<unknown, KnownFiberFailure<E>, A>(
139
+ Effect.isEffect(handler)
119
140
  ? {
120
141
  ...options,
121
142
  queryKey,
122
143
  queryFn: ({ signal }) =>
123
- run
124
- .value(q.handler as any, { signal })
125
- .then((_) => (_ as any).body)
126
- .catch((_) => {
127
- if (!Runtime.isFiberFailure(_)) throw _
128
- const cause = _[Runtime.FiberFailureCauseId]
129
- throw Cause.squash(cause)
130
- })
144
+ run.value(
145
+ Effect
146
+ .map(handler, (_) => _.body)
147
+ .pipe(Effect.tapDefect(reportRuntimeError)),
148
+ { signal }
149
+ )
131
150
  }
132
151
  : {
133
152
  ...options,
134
153
  queryKey: [...queryKey, req],
135
154
  queryFn: ({ signal }) =>
136
155
  run
137
- .value((q.handler as any)(req.value), { signal })
138
- .then((_) => (_ as any).body)
139
- .catch((_) => {
140
- if (!Runtime.isFiberFailure(_)) throw _
141
- const cause = _[Runtime.FiberFailureCauseId]
142
- throw Cause.squash(cause)
143
- })
156
+ .value(
157
+ Effect
158
+ .map(handler(req.value), (_) => _.body)
159
+ .pipe(Effect.tapDefect(reportRuntimeError)),
160
+ { signal }
161
+ )
144
162
  }
145
163
  )
146
164
 
147
165
  const result = computed(() =>
148
166
  swrToQuery({
149
- error: r.error.value,
167
+ error: r.error.value ?? undefined,
150
168
  data: r.data.value,
151
169
  isValidating: r.isFetching.value
152
170
  })
153
171
  )
154
- const latestSuccess = computed(() => {
155
- const value = result.value
156
- return isSuccess(value)
157
- ? Either.isRight(value.current)
158
- ? value.current.right
159
- : Option.isSome(value.previous)
160
- ? value.previous.value
161
- : undefined
162
- : undefined
163
- })
172
+ const latestSuccess = computed(() => Option.getOrUndefined(Result.value(result.value)))
164
173
  return [result, latestSuccess, r.refetch, r] as const
165
174
  }
166
175
 
167
176
  function swrToQuery<E, A>(r: {
168
- error: E | undefined
177
+ error: KnownFiberFailure<E> | undefined
169
178
  data: A | undefined
170
179
  isValidating: boolean
171
- }): QueryResult<E, A> {
180
+ }): Result.Result<A, E> {
172
181
  if (r.error) {
173
- return r.isValidating
174
- ? Refreshing.fail<E, A>(r.error, r.data)
175
- : Done.fail<E, A>(r.error, r.data)
182
+ return Result.failureWithPrevious(
183
+ r.error[Runtime.FiberFailureCauseId],
184
+ r.data === undefined ? Option.none() : Option.some(Result.success(r.data)),
185
+ r.isValidating
186
+ )
176
187
  }
177
188
  if (r.data !== undefined) {
178
- return r.isValidating
179
- ? Refreshing.succeed<A, E>(r.data)
180
- : Done.succeed<A, E>(r.data)
189
+ return Result.success<A, E>(r.data, r.isValidating)
181
190
  }
182
191
 
183
- return r.isValidating ? new Loading() : new Initial()
192
+ return Result.initial(r.isValidating)
184
193
  }
@@ -0,0 +1,37 @@
1
+ // packages/vue/vitest.config.ts
2
+ import { defineConfig } from "file:///Users/patrickroza/pj/effect-app/libs/node_modules/.pnpm/vite@5.2.6_@types+node@20.11.30/node_modules/vite/dist/node/index.js";
3
+
4
+ // vite.config.base.ts
5
+ import path from "path";
6
+ import fs from "fs";
7
+ var __vite_injected_original_dirname = "/Users/patrickroza/pj/effect-app/libs";
8
+ function makeConfig(dirName) {
9
+ const prefix = path.resolve(__vite_injected_original_dirname, "packages");
10
+ const packages = fs.readdirSync(prefix).map((f) => prefix + "/" + f).filter((f) => fs.lstatSync(f).isDirectory());
11
+ const cfg = {
12
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
13
+ //plugins: [autoImport],
14
+ test: {
15
+ include: ["./test/**/*.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
16
+ reporters: "verbose",
17
+ globals: true
18
+ },
19
+ resolve: {
20
+ alias: packages.reduce((acc, cur) => {
21
+ acc[JSON.parse(fs.readFileSync(cur + "/package.json", "utf-8")).name] = path.resolve(cur, cur.endsWith("core") ? "dist" : "src");
22
+ return acc;
23
+ }, {})
24
+ // "@effect-app/core/Prelude": path.join(__dirname, "packages/core/src/Prelude.code.ts")
25
+ }
26
+ };
27
+ console.log(cfg);
28
+ return cfg;
29
+ }
30
+
31
+ // packages/vue/vitest.config.ts
32
+ var __vite_injected_original_dirname2 = "/Users/patrickroza/pj/effect-app/libs/packages/vue";
33
+ var vitest_config_default = defineConfig(makeConfig(__vite_injected_original_dirname2));
34
+ export {
35
+ vitest_config_default as default
36
+ };
37
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsicGFja2FnZXMvdnVlL3ZpdGVzdC5jb25maWcudHMiLCAidml0ZS5jb25maWcuYmFzZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIi9Vc2Vycy9wYXRyaWNrcm96YS9wai9lZmZlY3QtYXBwL2xpYnMvcGFja2FnZXMvdnVlXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvVXNlcnMvcGF0cmlja3JvemEvcGovZWZmZWN0LWFwcC9saWJzL3BhY2thZ2VzL3Z1ZS92aXRlc3QuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9Vc2Vycy9wYXRyaWNrcm96YS9wai9lZmZlY3QtYXBwL2xpYnMvcGFja2FnZXMvdnVlL3ZpdGVzdC5jb25maWcudHNcIjsvLy8gPHJlZmVyZW5jZSB0eXBlcz1cInZpdGVzdFwiIC8+XG5pbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwidml0ZVwiXG5pbXBvcnQgbWFrZUNvbmZpZyBmcm9tIFwiLi4vLi4vdml0ZS5jb25maWcuYmFzZVwiXG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyhtYWtlQ29uZmlnKF9fZGlybmFtZSkpXG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIi9Vc2Vycy9wYXRyaWNrcm96YS9wai9lZmZlY3QtYXBwL2xpYnNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIi9Vc2Vycy9wYXRyaWNrcm96YS9wai9lZmZlY3QtYXBwL2xpYnMvdml0ZS5jb25maWcuYmFzZS50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vVXNlcnMvcGF0cmlja3JvemEvcGovZWZmZWN0LWFwcC9saWJzL3ZpdGUuY29uZmlnLmJhc2UudHNcIjsvLy8gPHJlZmVyZW5jZSB0eXBlcz1cInZpdGVzdFwiIC8+XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgZnMgZnJvbSBcImZzXCJcbmltcG9ydCBBdXRvSW1wb3J0IGZyb20gXCJ1bnBsdWdpbi1hdXRvLWltcG9ydC92aXRlXCJcbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gXCJ2aXRlc3QvY29uZmlnXCJcblxuLy8gY29uc3QgYXV0b0ltcG9ydCA9IEF1dG9JbXBvcnQoe1xuLy8gICBkdHM6IFwiLi90ZXN0L2F1dG8taW1wb3J0cy5kLnRzXCIsXG4vLyAgIC8vIGluY2x1ZGU6IFtcbi8vICAgLy8gICAvXFwudGVzdFxcLlt0al1zeD8kLyAvLyAudHMsIC50c3gsIC5qcywgLmpzeFxuLy8gICAvLyBdLFxuLy8gICBpbXBvcnRzOiBbXG4vLyAgICAgXCJ2aXRlc3RcIlxuLy8gICBdXG4vLyB9KVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYWtlQ29uZmlnKGRpck5hbWU/OiBzdHJpbmcpIHtcbiAgY29uc3QgcHJlZml4ID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgXCJwYWNrYWdlc1wiKVxuICBjb25zdCBwYWNrYWdlcyA9IGZzLnJlYWRkaXJTeW5jKHByZWZpeCkubWFwKGYgPT4gcHJlZml4ICsgXCIvXCIgKyBmKS5maWx0ZXIoZiA9PiBmcy5sc3RhdFN5bmMoZikuaXNEaXJlY3RvcnkoKSApXG4gIGNvbnN0IGNmZyA9IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICAgIC8vcGx1Z2luczogW2F1dG9JbXBvcnRdLFxuICAgIHRlc3Q6IHtcbiAgICAgIGluY2x1ZGU6ICBbXCIuL3Rlc3QvKiovKi50ZXN0LntqcyxtanMsY2pzLHRzLG10cyxjdHMsanN4LHRzeH1cIl0sXG4gICAgICByZXBvcnRlcnM6IFwidmVyYm9zZVwiLFxuICAgICAgZ2xvYmFsczogdHJ1ZVxuICAgIH0sXG4gICAgcmVzb2x2ZToge1xuICAgICAgYWxpYXM6IHBhY2thZ2VzLnJlZHVjZSgoYWNjLCBjdXIpID0+IHsgLy8gd29ya2Fyb3VuZCBmb3IgL1ByZWx1ZGUgaXNzdWVcbiAgICAgIGFjY1tKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhjdXIgKyBcIi9wYWNrYWdlLmpzb25cIiwgXCJ1dGYtOFwiKSkubmFtZV0gPSBwYXRoLnJlc29sdmUoY3VyLCBjdXIuZW5kc1dpdGgoXCJjb3JlXCIpID8gXCJkaXN0XCIgOiBcInNyY1wiKVxuICAgICAgcmV0dXJuIGFjY1xuICAgIH0sIHsgfSkgLy8gXCJAZWZmZWN0LWFwcC9jb3JlL1ByZWx1ZGVcIjogcGF0aC5qb2luKF9fZGlybmFtZSwgXCJwYWNrYWdlcy9jb3JlL3NyYy9QcmVsdWRlLmNvZGUudHNcIilcbiAgfVxuICB9XG4gIGNvbnNvbGUubG9nKGNmZylcbiAgcmV0dXJuIGNmZ1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUNBLFNBQVMsb0JBQW9COzs7QUNBN0IsT0FBTyxVQUFVO0FBQ2pCLE9BQU8sUUFBUTtBQUZmLElBQU0sbUNBQW1DO0FBZ0IxQixTQUFSLFdBQTRCLFNBQWtCO0FBQ25ELFFBQU0sU0FBUyxLQUFLLFFBQVEsa0NBQVcsVUFBVTtBQUNqRCxRQUFNLFdBQVcsR0FBRyxZQUFZLE1BQU0sRUFBRSxJQUFJLE9BQUssU0FBUyxNQUFNLENBQUMsRUFBRSxPQUFPLE9BQUssR0FBRyxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUU7QUFDN0csUUFBTSxNQUFNO0FBQUE7QUFBQTtBQUFBLElBR1YsTUFBTTtBQUFBLE1BQ0osU0FBVSxDQUFDLGtEQUFrRDtBQUFBLE1BQzdELFdBQVc7QUFBQSxNQUNYLFNBQVM7QUFBQSxJQUNYO0FBQUEsSUFDQSxTQUFTO0FBQUEsTUFDUCxPQUFPLFNBQVMsT0FBTyxDQUFDLEtBQUssUUFBUTtBQUNyQyxZQUFJLEtBQUssTUFBTSxHQUFHLGFBQWEsTUFBTSxpQkFBaUIsT0FBTyxDQUFDLEVBQUUsSUFBSSxJQUFJLEtBQUssUUFBUSxLQUFLLElBQUksU0FBUyxNQUFNLElBQUksU0FBUyxLQUFLO0FBQy9ILGVBQU87QUFBQSxNQUNULEdBQUcsQ0FBRSxDQUFDO0FBQUE7QUFBQSxJQUNSO0FBQUEsRUFDQTtBQUNBLFVBQVEsSUFBSSxHQUFHO0FBQ2YsU0FBTztBQUNUOzs7QURwQ0EsSUFBTUEsb0NBQW1DO0FBSXpDLElBQU8sd0JBQVEsYUFBYSxXQUFXQyxpQ0FBUyxDQUFDOyIsCiAgIm5hbWVzIjogWyJfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSIsICJfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSJdCn0K
@@ -0,0 +1,37 @@
1
+ // packages/vue/vitest.config.ts
2
+ import { defineConfig } from "file:///Users/patrickroza/pj/effect-app/libs/node_modules/.pnpm/vite@5.2.6_@types+node@20.11.30/node_modules/vite/dist/node/index.js";
3
+
4
+ // vite.config.base.ts
5
+ import path from "path";
6
+ import fs from "fs";
7
+ var __vite_injected_original_dirname = "/Users/patrickroza/pj/effect-app/libs";
8
+ function makeConfig(dirName) {
9
+ const prefix = path.resolve(__vite_injected_original_dirname, "packages");
10
+ const packages = fs.readdirSync(prefix).map((f) => prefix + "/" + f).filter((f) => fs.lstatSync(f).isDirectory());
11
+ const cfg = {
12
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
13
+ //plugins: [autoImport],
14
+ test: {
15
+ include: ["./test/**/*.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
16
+ reporters: "verbose",
17
+ globals: true
18
+ },
19
+ resolve: {
20
+ alias: packages.reduce((acc, cur) => {
21
+ acc[JSON.parse(fs.readFileSync(cur + "/package.json", "utf-8")).name] = path.resolve(cur, cur.endsWith("core") ? "dist" : "src");
22
+ return acc;
23
+ }, {})
24
+ // "@effect-app/core/Prelude": path.join(__dirname, "packages/core/src/Prelude.code.ts")
25
+ }
26
+ };
27
+ console.log(cfg);
28
+ return cfg;
29
+ }
30
+
31
+ // packages/vue/vitest.config.ts
32
+ var __vite_injected_original_dirname2 = "/Users/patrickroza/pj/effect-app/libs/packages/vue";
33
+ var vitest_config_default = defineConfig(makeConfig(__vite_injected_original_dirname2));
34
+ export {
35
+ vitest_config_default as default
36
+ };
37
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsicGFja2FnZXMvdnVlL3ZpdGVzdC5jb25maWcudHMiLCAidml0ZS5jb25maWcuYmFzZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIi9Vc2Vycy9wYXRyaWNrcm96YS9wai9lZmZlY3QtYXBwL2xpYnMvcGFja2FnZXMvdnVlXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvVXNlcnMvcGF0cmlja3JvemEvcGovZWZmZWN0LWFwcC9saWJzL3BhY2thZ2VzL3Z1ZS92aXRlc3QuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9Vc2Vycy9wYXRyaWNrcm96YS9wai9lZmZlY3QtYXBwL2xpYnMvcGFja2FnZXMvdnVlL3ZpdGVzdC5jb25maWcudHNcIjsvLy8gPHJlZmVyZW5jZSB0eXBlcz1cInZpdGVzdFwiIC8+XG5pbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwidml0ZVwiXG5pbXBvcnQgbWFrZUNvbmZpZyBmcm9tIFwiLi4vLi4vdml0ZS5jb25maWcuYmFzZVwiXG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyhtYWtlQ29uZmlnKF9fZGlybmFtZSkpXG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIi9Vc2Vycy9wYXRyaWNrcm96YS9wai9lZmZlY3QtYXBwL2xpYnNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIi9Vc2Vycy9wYXRyaWNrcm96YS9wai9lZmZlY3QtYXBwL2xpYnMvdml0ZS5jb25maWcuYmFzZS50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vVXNlcnMvcGF0cmlja3JvemEvcGovZWZmZWN0LWFwcC9saWJzL3ZpdGUuY29uZmlnLmJhc2UudHNcIjsvLy8gPHJlZmVyZW5jZSB0eXBlcz1cInZpdGVzdFwiIC8+XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgZnMgZnJvbSBcImZzXCJcbmltcG9ydCBBdXRvSW1wb3J0IGZyb20gXCJ1bnBsdWdpbi1hdXRvLWltcG9ydC92aXRlXCJcbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gXCJ2aXRlc3QvY29uZmlnXCJcblxuLy8gY29uc3QgYXV0b0ltcG9ydCA9IEF1dG9JbXBvcnQoe1xuLy8gICBkdHM6IFwiLi90ZXN0L2F1dG8taW1wb3J0cy5kLnRzXCIsXG4vLyAgIC8vIGluY2x1ZGU6IFtcbi8vICAgLy8gICAvXFwudGVzdFxcLlt0al1zeD8kLyAvLyAudHMsIC50c3gsIC5qcywgLmpzeFxuLy8gICAvLyBdLFxuLy8gICBpbXBvcnRzOiBbXG4vLyAgICAgXCJ2aXRlc3RcIlxuLy8gICBdXG4vLyB9KVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYWtlQ29uZmlnKGRpck5hbWU/OiBzdHJpbmcpIHtcbiAgY29uc3QgcHJlZml4ID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgXCJwYWNrYWdlc1wiKVxuICBjb25zdCBwYWNrYWdlcyA9IGZzLnJlYWRkaXJTeW5jKHByZWZpeCkubWFwKGYgPT4gcHJlZml4ICsgXCIvXCIgKyBmKS5maWx0ZXIoZiA9PiBmcy5sc3RhdFN5bmMoZikuaXNEaXJlY3RvcnkoKSApXG4gIGNvbnN0IGNmZyA9IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICAgIC8vcGx1Z2luczogW2F1dG9JbXBvcnRdLFxuICAgIHRlc3Q6IHtcbiAgICAgIGluY2x1ZGU6ICBbXCIuL3Rlc3QvKiovKi50ZXN0LntqcyxtanMsY2pzLHRzLG10cyxjdHMsanN4LHRzeH1cIl0sXG4gICAgICByZXBvcnRlcnM6IFwidmVyYm9zZVwiLFxuICAgICAgZ2xvYmFsczogdHJ1ZVxuICAgIH0sXG4gICAgcmVzb2x2ZToge1xuICAgICAgYWxpYXM6IHBhY2thZ2VzLnJlZHVjZSgoYWNjLCBjdXIpID0+IHsgLy8gd29ya2Fyb3VuZCBmb3IgL1ByZWx1ZGUgaXNzdWVcbiAgICAgIGFjY1tKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhjdXIgKyBcIi9wYWNrYWdlLmpzb25cIiwgXCJ1dGYtOFwiKSkubmFtZV0gPSBwYXRoLnJlc29sdmUoY3VyLCBjdXIuZW5kc1dpdGgoXCJjb3JlXCIpID8gXCJkaXN0XCIgOiBcInNyY1wiKVxuICAgICAgcmV0dXJuIGFjY1xuICAgIH0sIHsgfSkgLy8gXCJAZWZmZWN0LWFwcC9jb3JlL1ByZWx1ZGVcIjogcGF0aC5qb2luKF9fZGlybmFtZSwgXCJwYWNrYWdlcy9jb3JlL3NyYy9QcmVsdWRlLmNvZGUudHNcIilcbiAgfVxuICB9XG4gIGNvbnNvbGUubG9nKGNmZylcbiAgcmV0dXJuIGNmZ1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUNBLFNBQVMsb0JBQW9COzs7QUNBN0IsT0FBTyxVQUFVO0FBQ2pCLE9BQU8sUUFBUTtBQUZmLElBQU0sbUNBQW1DO0FBZ0IxQixTQUFSLFdBQTRCLFNBQWtCO0FBQ25ELFFBQU0sU0FBUyxLQUFLLFFBQVEsa0NBQVcsVUFBVTtBQUNqRCxRQUFNLFdBQVcsR0FBRyxZQUFZLE1BQU0sRUFBRSxJQUFJLE9BQUssU0FBUyxNQUFNLENBQUMsRUFBRSxPQUFPLE9BQUssR0FBRyxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUU7QUFDN0csUUFBTSxNQUFNO0FBQUE7QUFBQTtBQUFBLElBR1YsTUFBTTtBQUFBLE1BQ0osU0FBVSxDQUFDLGtEQUFrRDtBQUFBLE1BQzdELFdBQVc7QUFBQSxNQUNYLFNBQVM7QUFBQSxJQUNYO0FBQUEsSUFDQSxTQUFTO0FBQUEsTUFDUCxPQUFPLFNBQVMsT0FBTyxDQUFDLEtBQUssUUFBUTtBQUNyQyxZQUFJLEtBQUssTUFBTSxHQUFHLGFBQWEsTUFBTSxpQkFBaUIsT0FBTyxDQUFDLEVBQUUsSUFBSSxJQUFJLEtBQUssUUFBUSxLQUFLLElBQUksU0FBUyxNQUFNLElBQUksU0FBUyxLQUFLO0FBQy9ILGVBQU87QUFBQSxNQUNULEdBQUcsQ0FBRSxDQUFDO0FBQUE7QUFBQSxJQUNSO0FBQUEsRUFDQTtBQUNBLFVBQVEsSUFBSSxHQUFHO0FBQ2YsU0FBTztBQUNUOzs7QURwQ0EsSUFBTUEsb0NBQW1DO0FBSXpDLElBQU8sd0JBQVEsYUFBYSxXQUFXQyxpQ0FBUyxDQUFDOyIsCiAgIm5hbWVzIjogWyJfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSIsICJfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSJdCn0K