@effect-app/vue 4.0.0-beta.248 → 4.0.0-beta.249
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -1
- package/dist/runtime.d.ts +2 -19
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +2 -40
- package/dist/toast.d.ts +2 -51
- package/dist/toast.d.ts.map +1 -1
- package/dist/toast.js +2 -34
- package/dist/withToast.d.ts +2 -30
- package/dist/withToast.d.ts.map +1 -1
- package/dist/withToast.js +2 -64
- package/package.json +2 -2
- package/src/runtime.ts +1 -56
- package/src/toast.ts +1 -54
- package/src/withToast.ts +1 -133
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,25 @@
|
|
|
1
1
|
# @effect-app/vue
|
|
2
2
|
|
|
3
|
+
## 4.0.0-beta.249
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- ba789a2: Move core service contracts and runtime-agnostic modules into `effect-app`, keep `infra` and `vue` focused on adapters, and drop the temporary `infra` compatibility re-export paths in favor of the new canonical imports.
|
|
8
|
+
|
|
9
|
+
`@effect-app/infra` no longer re-exports moved core modules such as `./Model`, `./Emailer/service`, `./QueueMaker/service`, `./Store/service`, `./adapters/*`, or `./api/*` entrypoints.
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- Updated dependencies [ba789a2]
|
|
14
|
+
- effect-app@4.0.0-beta.249
|
|
15
|
+
|
|
3
16
|
## 4.0.0-beta.248
|
|
4
17
|
|
|
5
18
|
### Patch Changes
|
|
6
19
|
|
|
7
20
|
- 2a86a17: improve tsgo compat: avoid deferred `Schema.Type`/`Codec.Encoded`/`Codec.DecodingServices`/`Codec.EncodingServices` conditional helpers in generic positions where the type parameter is already constrained to `Schema.Top`. Index the property directly (`X["Type"]`, `X["Encoded"]`, `X["DecodingServices"]`, …) so tsgo doesn't leak `unknown` into `Effect` channels (notably `R`).
|
|
8
21
|
|
|
9
|
-
Sites: `client/clientFor.ts` (`RequestHandlerFor`, `FinalTypeOf`, `ExtractResponse`, `ExtractEResponse`), `client/makeClient.ts` (`InputFromPayload`, `OutputFromSuccess`, `InvalidationConfigForCommand`, `TaggedRequestWithMeta` overloads), `rpc/MiddlewareMaker.ts` (`Errors`), `rpc/RpcMiddleware.ts` (`Failure`, `FailureContext`), `Schema/ext.ts` (`ReadonlySetFromArray`, `ReadonlyMapFromArray`), `infra/
|
|
22
|
+
Sites: `client/clientFor.ts` (`RequestHandlerFor`, `FinalTypeOf`, `ExtractResponse`, `ExtractEResponse`), `client/makeClient.ts` (`InputFromPayload`, `OutputFromSuccess`, `InvalidationConfigForCommand`, `TaggedRequestWithMeta` overloads), `rpc/MiddlewareMaker.ts` (`Errors`), `rpc/RpcMiddleware.ts` (`Failure`, `FailureContext`), `Schema/ext.ts` (`ReadonlySetFromArray`, `ReadonlyMapFromArray`), `infra/routing.ts` (`GetSuccessShape`, handlers, route matcher), `vue/makeClient.ts` (`MutationExt.project`, `MutationWithExtensions`, `QueryProjection`), `vue/routeParams.ts` (`parseRouteParams*`).
|
|
10
23
|
|
|
11
24
|
- Updated dependencies [2a86a17]
|
|
12
25
|
- effect-app@4.0.0-beta.248
|
package/dist/runtime.d.ts
CHANGED
|
@@ -1,19 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import * as Layer from "effect-app/Layer";
|
|
4
|
-
import * as ManagedRuntime from "effect/ManagedRuntime";
|
|
5
|
-
export declare const makeAppRuntime: <A, E>(layer: Layer.Layer<A, E, never>) => Effect.Effect<ManagedRuntime.ManagedRuntime<A, never> & {
|
|
6
|
-
[Symbol.dispose](): void;
|
|
7
|
-
[Symbol.asyncDispose](): Promise<void>;
|
|
8
|
-
}, never, never>;
|
|
9
|
-
export declare function initializeSync<A, E>(layer: Layer.Layer<A, E>): ManagedRuntime.ManagedRuntime<A, never> & {
|
|
10
|
-
[Symbol.dispose](): void;
|
|
11
|
-
[Symbol.asyncDispose](): Promise<void>;
|
|
12
|
-
};
|
|
13
|
-
export declare function initializeAsync<A, E>(layer: Layer.Layer<A, E>): Promise<ManagedRuntime.ManagedRuntime<A, never> & {
|
|
14
|
-
[Symbol.dispose](): void;
|
|
15
|
-
[Symbol.asyncDispose](): Promise<void>;
|
|
16
|
-
}>;
|
|
17
|
-
export declare const makeRunPromise: <T>(services: Context<T>) => <A, E>(effect: Effect.Effect<A, E, T>, options?: Effect.RunOptions | undefined) => Promise<Awaited<import("effect/Types").NoInfer<A>>>;
|
|
18
|
-
export declare const makeRunSync: <T>(services: Context<T>) => <A, E>(effect: Effect.Effect<A, E, T>) => import("effect/Types").NoInfer<A>;
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3J1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEtBQUssT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDakQsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssS0FBSyxNQUFNLGtCQUFrQixDQUFBO0FBSXpDLE9BQU8sS0FBSyxjQUFjLE1BQU0sdUJBQXVCLENBQUE7QUFFdkQsZUFBTyxNQUFNLGNBQWMsR0FBK0IsQ0FBQyxFQUFFLENBQUM7OztnQkFlNUQsQ0FBQTtBQUVGLHdCQUFnQixjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzs7RUFHNUQ7QUFFRCx3QkFBZ0IsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7O0dBRzdEO0FBR0QsZUFBTyxNQUFNLGNBQWMsR0FBSSxDQUFDLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQywySUFPaEQsQ0FBQTtBQUVOLGVBQU8sTUFBTSxXQUFXLEdBQUksQ0FBQyxZQUFZLE9BQU8sQ0FBQyxDQUFDLENBQUMsZ0ZBU2hELENBQUEifQ==
|
|
1
|
+
export * from "effect-app/runtime";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3J1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0IsQ0FBQSJ9
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA"}
|
package/dist/runtime.js
CHANGED
|
@@ -1,40 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import * as Layer from "effect-app/Layer";
|
|
4
|
-
import * as Exit from "effect/Exit";
|
|
5
|
-
import { flow } from "effect/Function";
|
|
6
|
-
import * as Logger from "effect/Logger";
|
|
7
|
-
import * as ManagedRuntime from "effect/ManagedRuntime";
|
|
8
|
-
export const makeAppRuntime = Effect.fnUntraced(function* (layer) {
|
|
9
|
-
const l = layer.pipe(Layer.provide(Logger.layer([Logger.consolePretty()])));
|
|
10
|
-
const mrt = ManagedRuntime.make(l);
|
|
11
|
-
yield* mrt.contextEffect;
|
|
12
|
-
return Object.assign(mrt, {
|
|
13
|
-
[Symbol.dispose]() {
|
|
14
|
-
return Effect.runSync(mrt.disposeEffect);
|
|
15
|
-
},
|
|
16
|
-
[Symbol.asyncDispose]() {
|
|
17
|
-
return mrt.dispose();
|
|
18
|
-
}
|
|
19
|
-
}); // as we initialise here, there is no more error left.
|
|
20
|
-
});
|
|
21
|
-
export function initializeSync(layer) {
|
|
22
|
-
const runtime = Effect.runSync(makeAppRuntime(layer));
|
|
23
|
-
return runtime;
|
|
24
|
-
}
|
|
25
|
-
export function initializeAsync(layer) {
|
|
26
|
-
return Effect
|
|
27
|
-
.runPromise(makeAppRuntime(layer));
|
|
28
|
-
}
|
|
29
|
-
// we wrap into CauseException because we want to keep the full cause of the failure.
|
|
30
|
-
export const makeRunPromise = (services) => flow(Effect.runPromiseExitWith(services), (_) => _.then(Exit.match({
|
|
31
|
-
onFailure: (cause) => Promise.reject(new CauseException(cause, "runPromise")),
|
|
32
|
-
onSuccess: (value) => Promise.resolve(value)
|
|
33
|
-
})));
|
|
34
|
-
export const makeRunSync = (services) => flow(Effect.runSyncExitWith(services), Exit.match({
|
|
35
|
-
onFailure: (cause) => {
|
|
36
|
-
throw new CauseException(cause, "runSync");
|
|
37
|
-
},
|
|
38
|
-
onSuccess: (value) => value
|
|
39
|
-
}));
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUV6RCxPQUFPLEtBQUssTUFBTSxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sS0FBSyxLQUFLLE1BQU0sa0JBQWtCLENBQUE7QUFDekMsT0FBTyxLQUFLLElBQUksTUFBTSxhQUFhLENBQUE7QUFDbkMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQ3RDLE9BQU8sS0FBSyxNQUFNLE1BQU0sZUFBZSxDQUFBO0FBQ3ZDLE9BQU8sS0FBSyxjQUFjLE1BQU0sdUJBQXVCLENBQUE7QUFFdkQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQU8sS0FBd0I7SUFDdEYsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDbEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUNwQyxDQUFBO0lBQ25CLE1BQU0sR0FBRyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDbEMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQTtJQUN4QixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO1FBQ3hCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUNkLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDMUMsQ0FBQztRQUVELENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztZQUNuQixPQUFPLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUN0QixDQUFDO0tBQ0YsQ0FBQyxDQUFBLENBQUMsc0RBQXNEO0FBQzNELENBQUMsQ0FBQyxDQUFBO0FBRUYsTUFBTSxVQUFVLGNBQWMsQ0FBTyxLQUF3QjtJQUMzRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQ3JELE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUFPLEtBQXdCO0lBQzVELE9BQU8sTUFBTTtTQUNWLFVBQVUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtBQUN0QyxDQUFDO0FBRUQscUZBQXFGO0FBQ3JGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFJLFFBQW9CLEVBQUUsRUFBRSxDQUN4RCxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDOUMsQ0FBQyxDQUFDLElBQUksQ0FDSixJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ1QsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksY0FBYyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztJQUM3RSxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0NBQzdDLENBQUMsQ0FDSCxDQUFDLENBQUE7QUFFTixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBSSxRQUFvQixFQUFFLEVBQUUsQ0FDckQsSUFBSSxDQUNGLE1BQU0sQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDVCxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNuQixNQUFNLElBQUksY0FBYyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUM1QyxDQUFDO0lBQ0QsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLO0NBQzVCLENBQUMsQ0FDSCxDQUFBIn0=
|
|
1
|
+
export * from "effect-app/runtime";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUEifQ==
|
package/dist/toast.d.ts
CHANGED
|
@@ -1,51 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export type ToastId = string | number;
|
|
4
|
-
export type ToastOpts = {
|
|
5
|
-
id?: ToastId;
|
|
6
|
-
timeout?: number;
|
|
7
|
-
groupId?: string;
|
|
8
|
-
requestId?: string;
|
|
9
|
-
};
|
|
10
|
-
export type ToastOptsInternal = {
|
|
11
|
-
id?: ToastId | null;
|
|
12
|
-
timeout?: number;
|
|
13
|
-
groupId?: string;
|
|
14
|
-
requestId?: string;
|
|
15
|
-
};
|
|
16
|
-
export type UseToast = () => {
|
|
17
|
-
error: (this: void, message: string, options?: ToastOpts) => ToastId;
|
|
18
|
-
warning: (this: void, message: string, options?: ToastOpts) => ToastId;
|
|
19
|
-
success: (this: void, message: string, options?: ToastOpts) => ToastId;
|
|
20
|
-
info: (this: void, message: string, options?: ToastOpts) => ToastId;
|
|
21
|
-
dismiss: (this: void, id: ToastId) => void;
|
|
22
|
-
};
|
|
23
|
-
declare const CurrentToastId_base: Context.OpaqueClass<CurrentToastId, "CurrentToastId", {
|
|
24
|
-
toastId: ToastId;
|
|
25
|
-
}>;
|
|
26
|
-
export declare class CurrentToastId extends CurrentToastId_base {
|
|
27
|
-
}
|
|
28
|
-
/** fallback to CurrentToastId when available unless id is explicitly set to a value or null */
|
|
29
|
-
export declare const wrap: (toast: ReturnType<UseToast>) => {
|
|
30
|
-
error: (message: string, options?: ToastOptsInternal) => Effect.Effect<ToastId, never, never>;
|
|
31
|
-
info: (message: string, options?: ToastOptsInternal) => Effect.Effect<ToastId, never, never>;
|
|
32
|
-
success: (message: string, options?: ToastOptsInternal) => Effect.Effect<ToastId, never, never>;
|
|
33
|
-
warning: (message: string, options?: ToastOptsInternal) => Effect.Effect<ToastId, never, never>;
|
|
34
|
-
dismiss: (toastId: ToastId) => Effect.Effect<void, never, never>;
|
|
35
|
-
};
|
|
36
|
-
declare const Toast_base: Context.OpaqueClass<Toast, "Toast", {
|
|
37
|
-
error: (message: string, options?: ToastOptsInternal) => Effect.Effect<ToastId, never, never>;
|
|
38
|
-
info: (message: string, options?: ToastOptsInternal) => Effect.Effect<ToastId, never, never>;
|
|
39
|
-
success: (message: string, options?: ToastOptsInternal) => Effect.Effect<ToastId, never, never>;
|
|
40
|
-
warning: (message: string, options?: ToastOptsInternal) => Effect.Effect<ToastId, never, never>;
|
|
41
|
-
dismiss: (toastId: ToastId) => Effect.Effect<void, never, never>;
|
|
42
|
-
}>;
|
|
43
|
-
export declare class Toast extends Toast_base {
|
|
44
|
-
static readonly error: (message: string, options?: ToastOptsInternal | undefined) => Effect.Effect<ToastId, never, Toast>;
|
|
45
|
-
static readonly info: (message: string, options?: ToastOptsInternal | undefined) => Effect.Effect<ToastId, never, Toast>;
|
|
46
|
-
static readonly success: (message: string, options?: ToastOptsInternal | undefined) => Effect.Effect<ToastId, never, Toast>;
|
|
47
|
-
static readonly warning: (message: string, options?: ToastOptsInternal | undefined) => Effect.Effect<ToastId, never, Toast>;
|
|
48
|
-
static readonly dismiss: (toastId: ToastId) => Effect.Effect<void, never, Toast>;
|
|
49
|
-
}
|
|
50
|
-
export {};
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90b2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLG9CQUFvQixDQUFBO0FBRTdDLE9BQU8sS0FBSyxNQUFNLE1BQU0sbUJBQW1CLENBQUE7QUFHM0MsTUFBTSxNQUFNLE9BQU8sR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFBO0FBQ3JDLE1BQU0sTUFBTSxTQUFTLEdBQUc7SUFBRSxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxNQUFNLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxNQUFNLENBQUM7SUFBQyxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUE7Q0FBRSxDQUFBO0FBQ2hHLE1BQU0sTUFBTSxpQkFBaUIsR0FBRztJQUFFLEVBQUUsQ0FBQyxFQUFFLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxNQUFNLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxNQUFNLENBQUM7SUFBQyxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUE7Q0FBRSxDQUFBO0FBRS9HLE1BQU0sTUFBTSxRQUFRLEdBQUcsTUFBTTtJQUMzQixLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQUUsU0FBUyxLQUFLLE9BQU8sQ0FBQTtJQUNwRSxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQUUsU0FBUyxLQUFLLE9BQU8sQ0FBQTtJQUN0RSxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQUUsU0FBUyxLQUFLLE9BQU8sQ0FBQTtJQUN0RSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQUUsU0FBUyxLQUFLLE9BQU8sQ0FBQTtJQUNuRSxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLEtBQUssSUFBSSxDQUFBO0NBQzNDLENBQUE7O2FBRTZFLE9BQU87O0FBQXJGLHFCQUFhLGNBQWUsU0FBUSxtQkFBd0U7Q0FBRztBQUUvRywrRkFBK0Y7QUFDL0YsZUFBTyxNQUFNLElBQUksVUFBVyxVQUFVLENBQUMsUUFBUSxDQUFDO0lBaUI1QyxLQUFLLFlBZlksTUFBTSxZQUFZLGlCQUFpQjtJQWdCcEQsSUFBSTtJQUNKLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTyxZQUFZLE9BQU87Q0FFN0IsQ0FBQTs7cUJBckJvQixNQUFNLFlBQVksaUJBQWlCOzs7O3VCQW1CakMsT0FBTzs7QUFNOUIscUJBQWEsS0FBTSxTQUFRLFVBQTRDO0lBQ3JFLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxxR0FBZ0M7SUFDckQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLHFHQUErQjtJQUNuRCxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8scUdBQWtDO0lBQ3pELE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxxR0FBa0M7SUFDekQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLDBEQUFrQztDQUMxRCJ9
|
|
1
|
+
export * from "effect-app/toast";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90b2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtCQUFrQixDQUFBIn0=
|
package/dist/toast.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../src/toast.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../src/toast.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA"}
|
package/dist/toast.js
CHANGED
|
@@ -1,34 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import * as Effect from "effect-app/Effect";
|
|
4
|
-
import * as Option from "effect-app/Option";
|
|
5
|
-
export class CurrentToastId extends Context.Opaque()("CurrentToastId") {
|
|
6
|
-
}
|
|
7
|
-
/** fallback to CurrentToastId when available unless id is explicitly set to a value or null */
|
|
8
|
-
export const wrap = (toast) => {
|
|
9
|
-
const wrap = (toastHandler) => {
|
|
10
|
-
return (message, options) => Effect.serviceOption(CurrentToastId).pipe(Effect.flatMap((currentToast) => Effect.sync(() => {
|
|
11
|
-
const { id: _id, ...rest } = options ?? {};
|
|
12
|
-
const id = _id !== undefined
|
|
13
|
-
? _id ?? undefined
|
|
14
|
-
: Option.getOrUndefined(Option.map(currentToast, (_) => _.toastId));
|
|
15
|
-
// when id is undefined, we may end up with no toast at all..
|
|
16
|
-
return toastHandler(message, id !== undefined ? { ...rest, id } : rest);
|
|
17
|
-
})));
|
|
18
|
-
};
|
|
19
|
-
return {
|
|
20
|
-
error: wrap(toast.error),
|
|
21
|
-
info: wrap(toast.info),
|
|
22
|
-
success: wrap(toast.success),
|
|
23
|
-
warning: wrap(toast.warning),
|
|
24
|
-
dismiss: (toastId) => Effect.sync(() => toast.dismiss(toastId))
|
|
25
|
-
};
|
|
26
|
-
};
|
|
27
|
-
export class Toast extends Context.Opaque()("Toast") {
|
|
28
|
-
static error = accessEffectFn(this, "error");
|
|
29
|
-
static info = accessEffectFn(this, "info");
|
|
30
|
-
static success = accessEffectFn(this, "success");
|
|
31
|
-
static warning = accessEffectFn(this, "warning");
|
|
32
|
-
static dismiss = accessEffectFn(this, "dismiss");
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdG9hc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxvQkFBb0IsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDbkQsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssTUFBTSxNQUFNLG1CQUFtQixDQUFBO0FBYzNDLE1BQU0sT0FBTyxjQUFlLFNBQVEsT0FBTyxDQUFDLE1BQU0sRUFBd0MsQ0FBQyxnQkFBZ0IsQ0FBQztDQUFHO0FBRS9HLCtGQUErRjtBQUMvRixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxLQUEyQixFQUFFLEVBQUU7SUFDbEQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxZQUErRCxFQUFFLEVBQUU7UUFDL0UsT0FBTyxDQUFDLE9BQWUsRUFBRSxPQUEyQixFQUFFLEVBQUUsQ0FDdEQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQ3ZDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUM5QixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNmLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQTtZQUMxQyxNQUFNLEVBQUUsR0FBRyxHQUFHLEtBQUssU0FBUztnQkFDMUIsQ0FBQyxDQUFDLEdBQUcsSUFBSSxTQUFTO2dCQUNsQixDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7WUFDckUsNkRBQTZEO1lBQzdELE9BQU8sWUFBWSxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN6RSxDQUFDLENBQUMsQ0FDSCxDQUNGLENBQUE7SUFDTCxDQUFDLENBQUE7SUFDRCxPQUFPO1FBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3hCLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztRQUN0QixPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDNUIsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzVCLE9BQU8sRUFBRSxDQUFDLE9BQWdCLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUN6RSxDQUFBO0FBQ0gsQ0FBQyxDQUFBO0FBSUQsTUFBTSxPQUFPLEtBQU0sU0FBUSxPQUFPLENBQUMsTUFBTSxFQUFxQixDQUFDLE9BQU8sQ0FBQztJQUNyRSxNQUFNLENBQVUsS0FBSyxHQUFHLGNBQWMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDckQsTUFBTSxDQUFVLElBQUksR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0lBQ25ELE1BQU0sQ0FBVSxPQUFPLEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUN6RCxNQUFNLENBQVUsT0FBTyxHQUFHLGNBQWMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDekQsTUFBTSxDQUFVLE9BQU8sR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFBO0NBQzFEIn0=
|
|
1
|
+
export * from "effect-app/toast";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdG9hc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxrQkFBa0IsQ0FBQSJ9
|
package/dist/withToast.d.ts
CHANGED
|
@@ -1,30 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import * as Layer from "effect-app/Layer";
|
|
4
|
-
import type * as Option from "effect-app/Option";
|
|
5
|
-
import { Toast } from "./toast.js";
|
|
6
|
-
export interface ToastOptions<A, E, Args extends ReadonlyArray<unknown>, WaiR, SucR, ErrR> {
|
|
7
|
-
stableToastId?: undefined | string | ((...args: Args) => string | undefined);
|
|
8
|
-
timeout?: number;
|
|
9
|
-
showSpanInfo?: false;
|
|
10
|
-
groupId?: string;
|
|
11
|
-
onWaiting: string | ((...args: Args) => string | null) | null | ((...args: Args) => Effect.Effect<string | null, never, WaiR>);
|
|
12
|
-
onSuccess: string | ((a: A, ...args: Args) => string | null) | null | ((a: A, ...args: Args) => Effect.Effect<string | null, never, SucR>);
|
|
13
|
-
onFailure: string | ((error: Option.Option<E>, ...args: Args) => string | {
|
|
14
|
-
level: "warn" | "error";
|
|
15
|
-
message: string;
|
|
16
|
-
}) | ((error: Option.Option<E>, ...args: Args) => Effect.Effect<string | {
|
|
17
|
-
level: "warn" | "error";
|
|
18
|
-
message: string;
|
|
19
|
-
}, never, ErrR>);
|
|
20
|
-
}
|
|
21
|
-
declare const WithToast_base: Context.ServiceClass<WithToast, "WithToast", <A, E, Args extends readonly unknown[], R, WaiR = never, SucR = never, ErrR = never>(options: ToastOptions<A, E, Args, WaiR, SucR, ErrR>) => (self: Effect.Effect<A, E, R>, ...args: Args) => Effect.Effect<A, E, ErrR | R | SucR | WaiR>> & {
|
|
22
|
-
readonly make: Effect.Effect<<A, E, Args extends readonly unknown[], R, WaiR = never, SucR = never, ErrR = never>(options: ToastOptions<A, E, Args, WaiR, SucR, ErrR>) => (self: Effect.Effect<A, E, R>, ...args: Args) => Effect.Effect<A, E, ErrR | R | SucR | WaiR>, never, Toast>;
|
|
23
|
-
};
|
|
24
|
-
export declare class WithToast extends WithToast_base {
|
|
25
|
-
static readonly DefaultWithoutDependencies: Layer.Layer<WithToast, never, Toast>;
|
|
26
|
-
static readonly Default: Layer.Layer<WithToast, never, Toast>;
|
|
27
|
-
static readonly handle: <A, E, Args extends Array<unknown>, R, WaiR = never, SucR = never, ErrR = never>(options: ToastOptions<A, E, Args, WaiR, SucR, ErrR>) => (self: Effect.Effect<A, E, R>, ...args: Args) => Effect.Effect<A, E, R | WaiR | SucR | ErrR | WithToast>;
|
|
28
|
-
}
|
|
29
|
-
export {};
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aFRvYXN0LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvd2l0aFRvYXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sb0JBQW9CLENBQUE7QUFDN0MsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssS0FBSyxNQUFNLGtCQUFrQixDQUFBO0FBQ3pDLE9BQU8sS0FBSyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQTtBQUtoRCxPQUFPLEVBQWtCLEtBQUssRUFBZ0IsTUFBTSxZQUFZLENBQUE7QUFFaEUsTUFBTSxXQUFXLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksU0FBUyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJO0lBQ3ZGLGFBQWEsQ0FBQyxFQUFFLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLElBQUksS0FBSyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUE7SUFDNUUsT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFBO0lBQ2hCLFlBQVksQ0FBQyxFQUFFLEtBQUssQ0FBQTtJQUNwQixPQUFPLENBQUMsRUFBRSxNQUFNLENBQUE7SUFDaEIsU0FBUyxFQUNMLE1BQU0sR0FDTixDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsSUFBSSxLQUFLLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FDbEMsSUFBSSxHQUNKLENBQUMsQ0FDRCxHQUFHLElBQUksRUFBRSxJQUFJLEtBQ1YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQ2pELFNBQVMsRUFDTCxNQUFNLEdBQ04sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsSUFBSSxLQUFLLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FDeEMsSUFBSSxHQUNKLENBQUMsQ0FDRCxDQUFDLEVBQUUsQ0FBQyxFQUNKLEdBQUcsSUFBSSxFQUFFLElBQUksS0FDVixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDakQsU0FBUyxFQUNMLE1BQU0sR0FDTixDQUFDLENBQ0QsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQ3ZCLEdBQUcsSUFBSSxFQUFFLElBQUksS0FDVixNQUFNLEdBQUc7UUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQztRQUFDLE9BQU8sRUFBRSxNQUFNLENBQUE7S0FBRSxDQUFDLEdBQ3pELENBQUMsQ0FDRCxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFDdkIsR0FBRyxJQUFJLEVBQUUsSUFBSSxLQUNWLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHO1FBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUM7UUFBQyxPQUFPLEVBQUUsTUFBTSxDQUFBO0tBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtDQUMxRjs0RUFNVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksU0FBUyxTQUFTLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLFVBQVUsSUFBSSxVQUFVLElBQUksbUJBQ3ZFLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztrQ0FEN0MsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLFNBQVMsU0FBUyxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxVQUFVLElBQUksVUFBVSxJQUFJLG1CQUN2RSxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7O0FBSnpELHFCQUFhLFNBQVUsU0FBUSxjQWlGN0I7SUFDQSxNQUFNLENBQUMsUUFBUSxDQUFDLDBCQUEwQix1Q0FBZ0M7SUFDMUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLHVDQUFrQztJQUV6RCxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksU0FBUyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksR0FBRyxLQUFLLEVBQUUsSUFBSSxHQUFHLEtBQUssRUFBRSxJQUFJLEdBQUcsS0FBSyxXQUM3RixZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsS0FDbEQsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLElBQUksS0FBSyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUNiO0NBQy9GIn0=
|
|
1
|
+
export * from "effect-app/withToast";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aFRvYXN0LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvd2l0aFRvYXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsc0JBQXNCLENBQUEifQ==
|
package/dist/withToast.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withToast.d.ts","sourceRoot":"","sources":["../src/withToast.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"withToast.d.ts","sourceRoot":"","sources":["../src/withToast.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA"}
|
package/dist/withToast.js
CHANGED
|
@@ -1,64 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import * as Layer from "effect-app/Layer";
|
|
4
|
-
import * as S from "effect-app/Schema";
|
|
5
|
-
import { wrapEffect } from "effect-app/utils";
|
|
6
|
-
import * as Cause from "effect/Cause";
|
|
7
|
-
import * as Fiber from "effect/Fiber";
|
|
8
|
-
import { CurrentToastId, Toast } from "./toast.js";
|
|
9
|
-
// @effect-diagnostics-next-line missingEffectServiceDependency:off
|
|
10
|
-
export class WithToast extends Context.Service()("WithToast", {
|
|
11
|
-
make: Effect.gen(function* () {
|
|
12
|
-
const toast = yield* Toast;
|
|
13
|
-
return (options) => Effect.fnUntraced(function* (self, ...args) {
|
|
14
|
-
const baseTimeout = options.timeout ?? 3_000;
|
|
15
|
-
const stableToastId = typeof options.stableToastId === "function"
|
|
16
|
-
? options.stableToastId(...args)
|
|
17
|
-
: options.stableToastId;
|
|
18
|
-
const requestId = yield* Effect.currentSpan.pipe(Effect.map((span) => span.traceId), Effect.orElseSucceed(() => S.StringId.make()));
|
|
19
|
-
const groupId = options.groupId;
|
|
20
|
-
const meta = { ...(groupId !== undefined ? { groupId } : {}), requestId };
|
|
21
|
-
const t = yield* wrapEffect(options.onWaiting)(...args);
|
|
22
|
-
const toastId = t === null
|
|
23
|
-
? stableToastId
|
|
24
|
-
: stableToastId ?? `wait-${Math.random().toString(36).slice(2)}`;
|
|
25
|
-
const waitingFiber = t === null ? undefined : yield* Effect.forkChild(Effect.sleep("1 seconds").pipe(Effect.andThen(toast.info(t, { id: toastId, timeout: Infinity, ...meta }))));
|
|
26
|
-
const interruptWaiting = waitingFiber ? Fiber.interrupt(waitingFiber) : Effect.void;
|
|
27
|
-
return yield* self.pipe(Effect.tap(Effect.fnUntraced(function* (a) {
|
|
28
|
-
yield* interruptWaiting;
|
|
29
|
-
const t = yield* wrapEffect(options.onSuccess)(a, ...args);
|
|
30
|
-
if (t === null) {
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
yield* toast.success(t, toastId !== undefined
|
|
34
|
-
? { id: toastId, timeout: baseTimeout, ...meta }
|
|
35
|
-
: { timeout: baseTimeout, ...meta });
|
|
36
|
-
})), Effect.tapCause(Effect.fnUntraced(function* (cause) {
|
|
37
|
-
yield* interruptWaiting;
|
|
38
|
-
yield* Effect.logDebug("WithToast - caught error cause: " + Cause.squash(cause), Cause.hasInterruptsOnly(cause), cause);
|
|
39
|
-
if (Cause.hasInterruptsOnly(cause)) {
|
|
40
|
-
if (toastId)
|
|
41
|
-
yield* toast.dismiss(toastId);
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
const spanInfo = options.showSpanInfo !== false
|
|
45
|
-
? yield* Effect.currentSpan.pipe(Effect.map((span) => `\nTrace: ${span.traceId}\nSpan: ${span.spanId}`), Effect.orElseSucceed(() => ""))
|
|
46
|
-
: "";
|
|
47
|
-
const t = yield* wrapEffect(options.onFailure)(Cause.findErrorOption(cause), ...args);
|
|
48
|
-
const opts = { timeout: baseTimeout * 2, ...meta };
|
|
49
|
-
if (typeof t === "object") {
|
|
50
|
-
const message = t.message + spanInfo;
|
|
51
|
-
return t.level === "warn"
|
|
52
|
-
? yield* toast.warning(message, toastId !== undefined ? { ...opts, id: toastId } : opts)
|
|
53
|
-
: yield* toast.error(message, toastId !== undefined ? { ...opts, id: toastId } : opts);
|
|
54
|
-
}
|
|
55
|
-
yield* toast.error(t + spanInfo, toastId !== undefined ? { ...opts, id: toastId } : opts);
|
|
56
|
-
}, Effect.uninterruptible)), toastId !== undefined ? Effect.provideService(CurrentToastId, CurrentToastId.of({ toastId })) : (_) => _);
|
|
57
|
-
});
|
|
58
|
-
})
|
|
59
|
-
}) {
|
|
60
|
-
static DefaultWithoutDependencies = Layer.effect(this, this.make);
|
|
61
|
-
static Default = this.DefaultWithoutDependencies;
|
|
62
|
-
static handle = (options) => (self, ...args) => this.use((_) => _(options)(self, ...args));
|
|
63
|
-
}
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aFRvYXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dpdGhUb2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLG9CQUFvQixDQUFBO0FBQzdDLE9BQU8sS0FBSyxNQUFNLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxLQUFLLEtBQUssTUFBTSxrQkFBa0IsQ0FBQTtBQUV6QyxPQUFPLEtBQUssQ0FBQyxNQUFNLG1CQUFtQixDQUFBO0FBQ3RDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUM3QyxPQUFPLEtBQUssS0FBSyxNQUFNLGNBQWMsQ0FBQTtBQUNyQyxPQUFPLEtBQUssS0FBSyxNQUFNLGNBQWMsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBZ0IsTUFBTSxZQUFZLENBQUE7QUFrQ2hFLG1FQUFtRTtBQUNuRSxNQUFNLE9BQU8sU0FBVSxTQUFRLE9BQU8sQ0FBQyxPQUFPLEVBQWEsQ0FBQyxXQUFXLEVBQUU7SUFDdkUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ3hCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQTtRQUMxQixPQUFPLENBQ0wsT0FBbUQsRUFDbkQsRUFBRSxDQUNGLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBNEIsRUFBRSxHQUFHLElBQVU7WUFDckUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUE7WUFFNUMsTUFBTSxhQUFhLEdBQUcsT0FBTyxPQUFPLENBQUMsYUFBYSxLQUFLLFVBQVU7Z0JBQy9ELENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDO2dCQUNoQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQTtZQUV6QixNQUFNLFNBQVMsR0FBVyxL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
|
|
1
|
+
export * from "effect-app/withToast";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aFRvYXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dpdGhUb2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHNCQUFzQixDQUFBIn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-app/vue",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.249",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"homepage": "https://github.com/effect-ts-app/libs/tree/main/packages/vue",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"@vueuse/core": "^14.3.0",
|
|
12
12
|
"change-case": "^5.4.4",
|
|
13
13
|
"query-string": "^9.3.1",
|
|
14
|
-
"effect-app": "4.0.0-beta.
|
|
14
|
+
"effect-app": "4.0.0-beta.249"
|
|
15
15
|
},
|
|
16
16
|
"peerDependencies": {
|
|
17
17
|
"@effect/atom-vue": "^4.0.0-beta.70",
|
package/src/runtime.ts
CHANGED
|
@@ -1,56 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { type Context } from "effect-app/Context"
|
|
3
|
-
import * as Effect from "effect-app/Effect"
|
|
4
|
-
import * as Layer from "effect-app/Layer"
|
|
5
|
-
import * as Exit from "effect/Exit"
|
|
6
|
-
import { flow } from "effect/Function"
|
|
7
|
-
import * as Logger from "effect/Logger"
|
|
8
|
-
import * as ManagedRuntime from "effect/ManagedRuntime"
|
|
9
|
-
|
|
10
|
-
export const makeAppRuntime = Effect.fnUntraced(function*<A, E>(layer: Layer.Layer<A, E>) {
|
|
11
|
-
const l = layer.pipe(
|
|
12
|
-
Layer.provide(Logger.layer([Logger.consolePretty()]))
|
|
13
|
-
) as Layer.Layer<A>
|
|
14
|
-
const mrt = ManagedRuntime.make(l)
|
|
15
|
-
yield* mrt.contextEffect
|
|
16
|
-
return Object.assign(mrt, {
|
|
17
|
-
[Symbol.dispose]() {
|
|
18
|
-
return Effect.runSync(mrt.disposeEffect)
|
|
19
|
-
},
|
|
20
|
-
|
|
21
|
-
[Symbol.asyncDispose]() {
|
|
22
|
-
return mrt.dispose()
|
|
23
|
-
}
|
|
24
|
-
}) // as we initialise here, there is no more error left.
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
export function initializeSync<A, E>(layer: Layer.Layer<A, E>) {
|
|
28
|
-
const runtime = Effect.runSync(makeAppRuntime(layer))
|
|
29
|
-
return runtime
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function initializeAsync<A, E>(layer: Layer.Layer<A, E>) {
|
|
33
|
-
return Effect
|
|
34
|
-
.runPromise(makeAppRuntime(layer))
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// we wrap into CauseException because we want to keep the full cause of the failure.
|
|
38
|
-
export const makeRunPromise = <T>(services: Context<T>) =>
|
|
39
|
-
flow(Effect.runPromiseExitWith(services), (_) =>
|
|
40
|
-
_.then(
|
|
41
|
-
Exit.match({
|
|
42
|
-
onFailure: (cause) => Promise.reject(new CauseException(cause, "runPromise")),
|
|
43
|
-
onSuccess: (value) => Promise.resolve(value)
|
|
44
|
-
})
|
|
45
|
-
))
|
|
46
|
-
|
|
47
|
-
export const makeRunSync = <T>(services: Context<T>) =>
|
|
48
|
-
flow(
|
|
49
|
-
Effect.runSyncExitWith(services),
|
|
50
|
-
Exit.match({
|
|
51
|
-
onFailure: (cause) => {
|
|
52
|
-
throw new CauseException(cause, "runSync")
|
|
53
|
-
},
|
|
54
|
-
onSuccess: (value) => value
|
|
55
|
-
})
|
|
56
|
-
)
|
|
1
|
+
export * from "effect-app/runtime"
|
package/src/toast.ts
CHANGED
|
@@ -1,54 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { accessEffectFn } from "effect-app/Context"
|
|
3
|
-
import * as Effect from "effect-app/Effect"
|
|
4
|
-
import * as Option from "effect-app/Option"
|
|
5
|
-
|
|
6
|
-
export type ToastId = string | number
|
|
7
|
-
export type ToastOpts = { id?: ToastId; timeout?: number; groupId?: string; requestId?: string }
|
|
8
|
-
export type ToastOptsInternal = { id?: ToastId | null; timeout?: number; groupId?: string; requestId?: string }
|
|
9
|
-
|
|
10
|
-
export type UseToast = () => {
|
|
11
|
-
error: (this: void, message: string, options?: ToastOpts) => ToastId
|
|
12
|
-
warning: (this: void, message: string, options?: ToastOpts) => ToastId
|
|
13
|
-
success: (this: void, message: string, options?: ToastOpts) => ToastId
|
|
14
|
-
info: (this: void, message: string, options?: ToastOpts) => ToastId
|
|
15
|
-
dismiss: (this: void, id: ToastId) => void
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export class CurrentToastId extends Context.Opaque<CurrentToastId, { toastId: ToastId }>()("CurrentToastId") {}
|
|
19
|
-
|
|
20
|
-
/** fallback to CurrentToastId when available unless id is explicitly set to a value or null */
|
|
21
|
-
export const wrap = (toast: ReturnType<UseToast>) => {
|
|
22
|
-
const wrap = (toastHandler: (message: string, options?: ToastOpts) => ToastId) => {
|
|
23
|
-
return (message: string, options?: ToastOptsInternal) =>
|
|
24
|
-
Effect.serviceOption(CurrentToastId).pipe(
|
|
25
|
-
Effect.flatMap((currentToast) =>
|
|
26
|
-
Effect.sync(() => {
|
|
27
|
-
const { id: _id, ...rest } = options ?? {}
|
|
28
|
-
const id = _id !== undefined
|
|
29
|
-
? _id ?? undefined
|
|
30
|
-
: Option.getOrUndefined(Option.map(currentToast, (_) => _.toastId))
|
|
31
|
-
// when id is undefined, we may end up with no toast at all..
|
|
32
|
-
return toastHandler(message, id !== undefined ? { ...rest, id } : rest)
|
|
33
|
-
})
|
|
34
|
-
)
|
|
35
|
-
)
|
|
36
|
-
}
|
|
37
|
-
return {
|
|
38
|
-
error: wrap(toast.error),
|
|
39
|
-
info: wrap(toast.info),
|
|
40
|
-
success: wrap(toast.success),
|
|
41
|
-
warning: wrap(toast.warning),
|
|
42
|
-
dismiss: (toastId: ToastId) => Effect.sync(() => toast.dismiss(toastId))
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
type ToastShape = ReturnType<typeof wrap>
|
|
47
|
-
|
|
48
|
-
export class Toast extends Context.Opaque<Toast, ToastShape>()("Toast") {
|
|
49
|
-
static readonly error = accessEffectFn(this, "error")
|
|
50
|
-
static readonly info = accessEffectFn(this, "info")
|
|
51
|
-
static readonly success = accessEffectFn(this, "success")
|
|
52
|
-
static readonly warning = accessEffectFn(this, "warning")
|
|
53
|
-
static readonly dismiss = accessEffectFn(this, "dismiss")
|
|
54
|
-
}
|
|
1
|
+
export * from "effect-app/toast"
|
package/src/withToast.ts
CHANGED
|
@@ -1,133 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import * as Effect from "effect-app/Effect"
|
|
3
|
-
import * as Layer from "effect-app/Layer"
|
|
4
|
-
import type * as Option from "effect-app/Option"
|
|
5
|
-
import * as S from "effect-app/Schema"
|
|
6
|
-
import { wrapEffect } from "effect-app/utils"
|
|
7
|
-
import * as Cause from "effect/Cause"
|
|
8
|
-
import * as Fiber from "effect/Fiber"
|
|
9
|
-
import { CurrentToastId, Toast, type ToastId } from "./toast.js"
|
|
10
|
-
|
|
11
|
-
export interface ToastOptions<A, E, Args extends ReadonlyArray<unknown>, WaiR, SucR, ErrR> {
|
|
12
|
-
stableToastId?: undefined | string | ((...args: Args) => string | undefined)
|
|
13
|
-
timeout?: number
|
|
14
|
-
showSpanInfo?: false
|
|
15
|
-
groupId?: string
|
|
16
|
-
onWaiting:
|
|
17
|
-
| string
|
|
18
|
-
| ((...args: Args) => string | null)
|
|
19
|
-
| null
|
|
20
|
-
| ((
|
|
21
|
-
...args: Args
|
|
22
|
-
) => Effect.Effect<string | null, never, WaiR>)
|
|
23
|
-
onSuccess:
|
|
24
|
-
| string
|
|
25
|
-
| ((a: A, ...args: Args) => string | null)
|
|
26
|
-
| null
|
|
27
|
-
| ((
|
|
28
|
-
a: A,
|
|
29
|
-
...args: Args
|
|
30
|
-
) => Effect.Effect<string | null, never, SucR>)
|
|
31
|
-
onFailure:
|
|
32
|
-
| string
|
|
33
|
-
| ((
|
|
34
|
-
error: Option.Option<E>,
|
|
35
|
-
...args: Args
|
|
36
|
-
) => string | { level: "warn" | "error"; message: string })
|
|
37
|
-
| ((
|
|
38
|
-
error: Option.Option<E>,
|
|
39
|
-
...args: Args
|
|
40
|
-
) => Effect.Effect<string | { level: "warn" | "error"; message: string }, never, ErrR>)
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// @effect-diagnostics-next-line missingEffectServiceDependency:off
|
|
44
|
-
export class WithToast extends Context.Service<WithToast>()("WithToast", {
|
|
45
|
-
make: Effect.gen(function*() {
|
|
46
|
-
const toast = yield* Toast
|
|
47
|
-
return <A, E, Args extends readonly unknown[], R, WaiR = never, SucR = never, ErrR = never>(
|
|
48
|
-
options: ToastOptions<A, E, Args, WaiR, SucR, ErrR>
|
|
49
|
-
) =>
|
|
50
|
-
Effect.fnUntraced(function*(self: Effect.Effect<A, E, R>, ...args: Args) {
|
|
51
|
-
const baseTimeout = options.timeout ?? 3_000
|
|
52
|
-
|
|
53
|
-
const stableToastId = typeof options.stableToastId === "function"
|
|
54
|
-
? options.stableToastId(...args)
|
|
55
|
-
: options.stableToastId
|
|
56
|
-
|
|
57
|
-
const requestId: string = yield* Effect.currentSpan.pipe(
|
|
58
|
-
Effect.map((span) => span.traceId),
|
|
59
|
-
Effect.orElseSucceed(() => S.StringId.make())
|
|
60
|
-
)
|
|
61
|
-
const groupId = options.groupId
|
|
62
|
-
const meta = { ...(groupId !== undefined ? { groupId } : {}), requestId }
|
|
63
|
-
|
|
64
|
-
const t = yield* wrapEffect(options.onWaiting)(...args)
|
|
65
|
-
const toastId: ToastId | undefined = t === null
|
|
66
|
-
? stableToastId
|
|
67
|
-
: stableToastId ?? `wait-${Math.random().toString(36).slice(2)}`
|
|
68
|
-
|
|
69
|
-
const waitingFiber = t === null ? undefined : yield* Effect.forkChild(
|
|
70
|
-
Effect.sleep("1 seconds").pipe(
|
|
71
|
-
Effect.andThen(toast.info(t, { id: toastId!, timeout: Infinity, ...meta }))
|
|
72
|
-
)
|
|
73
|
-
)
|
|
74
|
-
const interruptWaiting = waitingFiber ? Fiber.interrupt(waitingFiber) : Effect.void
|
|
75
|
-
|
|
76
|
-
return yield* self.pipe(
|
|
77
|
-
Effect.tap(Effect.fnUntraced(function*(a) {
|
|
78
|
-
yield* interruptWaiting
|
|
79
|
-
const t = yield* wrapEffect(options.onSuccess)(a, ...args)
|
|
80
|
-
if (t === null) {
|
|
81
|
-
return
|
|
82
|
-
}
|
|
83
|
-
yield* toast.success(
|
|
84
|
-
t,
|
|
85
|
-
toastId !== undefined
|
|
86
|
-
? { id: toastId, timeout: baseTimeout, ...meta }
|
|
87
|
-
: { timeout: baseTimeout, ...meta }
|
|
88
|
-
)
|
|
89
|
-
})),
|
|
90
|
-
Effect.tapCause(Effect.fnUntraced(function*(cause) {
|
|
91
|
-
yield* interruptWaiting
|
|
92
|
-
yield* Effect.logDebug(
|
|
93
|
-
"WithToast - caught error cause: " + Cause.squash(cause),
|
|
94
|
-
Cause.hasInterruptsOnly(cause),
|
|
95
|
-
cause
|
|
96
|
-
)
|
|
97
|
-
|
|
98
|
-
if (Cause.hasInterruptsOnly(cause)) {
|
|
99
|
-
if (toastId) yield* toast.dismiss(toastId)
|
|
100
|
-
return
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
const spanInfo = options.showSpanInfo !== false
|
|
104
|
-
? yield* Effect.currentSpan.pipe(
|
|
105
|
-
Effect.map((span) => `\nTrace: ${span.traceId}\nSpan: ${span.spanId}`),
|
|
106
|
-
Effect.orElseSucceed(() => "")
|
|
107
|
-
)
|
|
108
|
-
: ""
|
|
109
|
-
|
|
110
|
-
const t = yield* wrapEffect(options.onFailure)(Cause.findErrorOption(cause), ...args)
|
|
111
|
-
const opts = { timeout: baseTimeout * 2, ...meta }
|
|
112
|
-
|
|
113
|
-
if (typeof t === "object") {
|
|
114
|
-
const message = t.message + spanInfo
|
|
115
|
-
return t.level === "warn"
|
|
116
|
-
? yield* toast.warning(message, toastId !== undefined ? { ...opts, id: toastId } : opts)
|
|
117
|
-
: yield* toast.error(message, toastId !== undefined ? { ...opts, id: toastId } : opts)
|
|
118
|
-
}
|
|
119
|
-
yield* toast.error(t + spanInfo, toastId !== undefined ? { ...opts, id: toastId } : opts)
|
|
120
|
-
}, Effect.uninterruptible)),
|
|
121
|
-
toastId !== undefined ? Effect.provideService(CurrentToastId, CurrentToastId.of({ toastId })) : (_) => _
|
|
122
|
-
)
|
|
123
|
-
})
|
|
124
|
-
})
|
|
125
|
-
}) {
|
|
126
|
-
static readonly DefaultWithoutDependencies = Layer.effect(this, this.make)
|
|
127
|
-
static readonly Default = this.DefaultWithoutDependencies
|
|
128
|
-
|
|
129
|
-
static readonly handle = <A, E, Args extends Array<unknown>, R, WaiR = never, SucR = never, ErrR = never>(
|
|
130
|
-
options: ToastOptions<A, E, Args, WaiR, SucR, ErrR>
|
|
131
|
-
): (self: Effect.Effect<A, E, R>, ...args: Args) => Effect.Effect<A, E, R | WaiR | SucR | ErrR | WithToast> =>
|
|
132
|
-
(self, ...args) => this.use((_) => _<A, E, Args, R, WaiR, SucR, ErrR>(options)(self, ...args))
|
|
133
|
-
}
|
|
1
|
+
export * from "effect-app/withToast"
|