@effect-app/infra 1.24.2 → 1.25.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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @effect-app/infra
2
2
 
3
+ ## 1.25.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 0fa59b0: feat: add routing2 based on @effect/rpc
8
+
3
9
  ## 1.24.2
4
10
 
5
11
  ### Patch Changes
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.makeRpcClient = exports.makeRpc = void 0;
7
+ var _rpc = require("@effect/rpc");
8
+ var _effectApp = require("effect-app");
9
+ /* eslint-disable @typescript-eslint/no-explicit-any */
10
+
11
+ const merge = (a, b) => a !== undefined && b.length ? _effectApp.S.Union(a, ...b) : a !== undefined ? a : b.length ? _effectApp.S.Union(...b) : _effectApp.S.Never;
12
+ const makeRpcClient = errors => {
13
+ function TaggedRequest() {
14
+ // TODO: filter errors based on config + take care of inversion
15
+ const errorSchemas = Object.values(errors);
16
+ return (tag, fields, config) => {
17
+ const req = _effectApp.S.TaggedRequest()(tag, {
18
+ payload: fields,
19
+ failure: merge(config?.failure, errorSchemas),
20
+ success: config?.success ?? _effectApp.S.Void
21
+ });
22
+ const req2 = Object.assign(req, {
23
+ config
24
+ });
25
+ return req2;
26
+ };
27
+ }
28
+ return {
29
+ TaggedRequest
30
+ };
31
+ };
32
+ exports.makeRpcClient = makeRpcClient;
33
+ const makeRpc = middleware => {
34
+ return {
35
+ effect: (schema, handler, moduleName) => {
36
+ return _rpc.Rpc.effect(schema, middleware.execute(schema, handler, moduleName));
37
+ }
38
+ };
39
+ };
40
+ exports.makeRpc = makeRpc;
41
+ //# sourceMappingURL=DynamicMiddleware.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DynamicMiddleware.cjs","names":["_rpc","require","_effectApp","merge","a","b","undefined","length","S","Union","Never","makeRpcClient","errors","TaggedRequest","errorSchemas","Object","values","tag","fields","config","req","payload","failure","success","Void","req2","assign","exports","makeRpc","middleware","effect","schema","handler","moduleName","Rpc","execute"],"sources":["../../../src/api/routing2/DynamicMiddleware.ts"],"sourcesContent":[null],"mappings":";;;;;;AACA,IAAAA,IAAA,GAAAC,OAAA;AAEA,IAAAC,UAAA,GAAAD,OAAA;AAHA;;AAmEA,MAAME,KAAK,GAAGA,CAACC,CAAM,EAAEC,CAAa,KAClCD,CAAC,KAAKE,SAAS,IAAID,CAAC,CAACE,MAAM,GAAGC,YAAC,CAACC,KAAK,CAACL,CAAC,EAAE,GAAGC,CAAC,CAAC,GAAGD,CAAC,KAAKE,SAAS,GAAGF,CAAC,GAAGC,CAAC,CAACE,MAAM,GAAGC,YAAC,CAACC,KAAK,CAAC,GAAGJ,CAAC,CAAC,GAAGG,YAAC,CAACE,KAAK;AAEpG,MAAMC,aAAa,GAIxBC,MAA6C,IAC3C;EAGF,SAASC,aAAaA,CAAA;IAiEpB;IACA,MAAMC,YAAY,GAAGC,MAAM,CAACC,MAAM,CAACJ,MAAM,CAAC;IAC1C,OAAQ,CACNK,GAAQ,EACRC,MAAc,EACdC,MAAU,KACR;MACF,MAAMC,GAAG,GAAGZ,YAAC,CAACK,aAAa,EAAQ,CAACI,GAAG,EAAE;QACvCI,OAAO,EAAEH,MAAM;QACfI,OAAO,EAAEnB,KAAK,CAACgB,MAAM,EAAEG,OAAO,EAAER,YAAY,CAAC;QAC7CS,OAAO,EAAEJ,MAAM,EAAEI,OAAO,IAAIf,YAAC,CAACgB;OAC/B,CAAC;MACF,MAAMC,IAAI,GAAGV,MAAM,CAACW,MAAM,CAACN,GAAG,EAAE;QAAED;MAAM,CAAE,CAAC;MAC3C,OAAOM,IAAI;IACb,CAAC;EACH;EAEA,OAAO;IACLZ;GACD;AACH,CAAC;AAAAc,OAAA,CAAAhB,aAAA,GAAAA,aAAA;AA0BM,MAAMiB,OAAO,GAClBC,UAAuC,IACrC;EACF,OAAO;IACLC,MAAM,EAAEA,CACNC,MAAqC,EACrCC,OAMC,EACDC,UAAmB,KACjB;MACF,OAAOC,QAAG,CAACJ,MAAM,CACfC,MAAM,EACNF,UAAU,CAACM,OAAO,CAACJ,MAAM,EAAEC,OAAO,EAAEC,UAAU,CAAC,CAChD;IACH;GACD;AACH,CAAC;AAAAN,OAAA,CAAAC,OAAA,GAAAA,OAAA","ignoreList":[]}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.makeRouter2 = void 0;
7
+ var _utils = require("@effect-app/core/utils");
8
+ var _rpc = require("@effect/rpc");
9
+ var _rpcHttp = require("@effect/rpc-http");
10
+ var _effectApp = require("effect-app");
11
+ var _http = require("effect-app/http");
12
+ var _DynamicMiddleware = require("./routing2/DynamicMiddleware.cjs");
13
+ /* eslint-disable @typescript-eslint/no-empty-object-type */
14
+ /* eslint-disable @typescript-eslint/no-explicit-any */
15
+
16
+ const makeRouter2 = middleware => {
17
+ const rpc = (0, _DynamicMiddleware.makeRpc)(middleware);
18
+ function matchFor(rsc) {
19
+ const meta = rsc.meta;
20
+ if (!meta) throw new Error("Resource has no meta specified"); // TODO: do something with moduleName+cur etc.
21
+ const filtered = (0, _utils.typedKeysOf)(rsc).reduce((acc, cur) => {
22
+ if (_effectApp.Predicate.isObject(rsc[cur]) && rsc[cur]["success"]) {
23
+ acc[cur] = rsc[cur];
24
+ }
25
+ return acc;
26
+ }, {});
27
+ const matchWithServices = action => {
28
+ return (_services, f) => req =>
29
+ // Effect.andThen(allLower(services), (svc2) =>
30
+ // ...ctx, ...svc2,
31
+ f(req, {
32
+ Response: rsc[action].success
33
+ });
34
+ };
35
+ const controllers = controllers => {
36
+ const handlers = (0, _utils.typedKeysOf)(filtered).reduce((acc, cur) => {
37
+ if (cur === "meta") return acc;
38
+ acc[cur] = {
39
+ h: controllers[cur].handler,
40
+ Request: rsc[cur]
41
+ };
42
+ return acc;
43
+ }, {});
44
+ const mapped = (0, _utils.typedKeysOf)(handlers).reduce((acc, cur) => {
45
+ const handler = handlers[cur];
46
+ const req = handler.Request;
47
+ acc[cur] = rpc.effect(req, handler.h, meta.moduleName); // TODO
48
+ return acc;
49
+ }, {});
50
+ const router = _rpc.RpcRouter.make(...Object.values(mapped));
51
+ return _http.HttpRouter.empty.pipe(_http.HttpRouter.all("/rpc/" + rsc.meta.moduleName, _rpcHttp.HttpRpcRouter.toHttpApp(router)));
52
+ };
53
+ const r = {
54
+ controllers,
55
+ ...(0, _utils.typedKeysOf)(filtered).reduce((prev, cur) => {
56
+ ;
57
+ prev[cur] = (svcOrFnOrEffect, fnOrNone) => {
58
+ const stack = new Error().stack?.split("\n").slice(2).join("\n");
59
+ return _effectApp.Effect.isEffect(svcOrFnOrEffect) ? class {
60
+ static stack = stack;
61
+ static _tag = "d";
62
+ static handler = () => svcOrFnOrEffect;
63
+ } : typeof svcOrFnOrEffect === "function" ? class {
64
+ static stack = stack;
65
+ static _tag = "d";
66
+ static handler = (req, ctx) => svcOrFnOrEffect(req, {
67
+ ...ctx,
68
+ Response: rsc[cur].success
69
+ });
70
+ } : class {
71
+ static stack = stack;
72
+ static _tag = "d";
73
+ static handler = matchWithServices(cur)(svcOrFnOrEffect, fnOrNone);
74
+ };
75
+ };
76
+ prev[cur + "Raw"] = (svcOrFnOrEffect, fnOrNone) => {
77
+ const stack = new Error().stack?.split("\n").slice(2).join("\n");
78
+ return _effectApp.Effect.isEffect(svcOrFnOrEffect) ? class {
79
+ static stack = stack;
80
+ static _tag = "raw";
81
+ static handler = () => svcOrFnOrEffect;
82
+ } : typeof svcOrFnOrEffect === "function" ? class {
83
+ static stack = stack;
84
+ static _tag = "raw";
85
+ static handler = (req, ctx) => svcOrFnOrEffect(req, {
86
+ ...ctx,
87
+ Response: rsc[cur].success
88
+ });
89
+ } : class {
90
+ static stack = stack;
91
+ static _tag = "raw";
92
+ static handler = matchWithServices(cur)(svcOrFnOrEffect, fnOrNone);
93
+ };
94
+ };
95
+ return prev;
96
+ }, {})
97
+ };
98
+ return r;
99
+ }
100
+ function matchAll(handlers) {
101
+ const r = (0, _utils.typedKeysOf)(handlers).reduce((acc, cur) => {
102
+ return _http.HttpRouter.concat(acc, handlers[cur]);
103
+ }, _http.HttpRouter.empty);
104
+ return r;
105
+ }
106
+ return {
107
+ matchAll,
108
+ matchFor
109
+ };
110
+ };
111
+ exports.makeRouter2 = makeRouter2;
112
+ //# sourceMappingURL=routing2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing2.cjs","names":["_utils","require","_rpc","_rpcHttp","_effectApp","_http","_DynamicMiddleware","makeRouter2","middleware","rpc","makeRpc","matchFor","rsc","meta","Error","filtered","typedKeysOf","reduce","acc","cur","Predicate","isObject","matchWithServices","action","_services","f","req","Response","success","controllers","handlers","h","handler","Request","mapped","effect","moduleName","router","RpcRouter","make","Object","values","HttpRouter","empty","pipe","all","HttpRpcRouter","toHttpApp","r","prev","svcOrFnOrEffect","fnOrNone","stack","split","slice","join","Effect","isEffect","_tag","ctx","matchAll","concat","exports"],"sources":["../../src/api/routing2.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,79 @@
1
+ import { Rpc } from "@effect/rpc";
2
+ import type { Effect, Request } from "effect-app";
3
+ import { S } from "effect-app";
4
+ import type * as EffectRequest from "effect/Request";
5
+ /**
6
+ * Middleware is inactivate by default, the Key is optional in route context, and the service is optionally provided as Effect Context.
7
+ * Unless configured as `true`
8
+ */
9
+ export type ContextMap<Key, Service, E> = [Key, Service, E, true];
10
+ export type ContextMapCustom<Key, Service, E, Custom> = [Key, Service, E, Custom];
11
+ /**
12
+ * Middleware is active by default, and provides the Service at Key in route context, and the Service is provided as Effect Context.
13
+ * Unless omitted
14
+ */
15
+ export type ContextMapInverted<Key, Service, E> = [Key, Service, E, false];
16
+ type Values<T extends Record<any, any>> = T[keyof T];
17
+ export type GetEffectContext<CTXMap extends Record<string, [string, any, S.Schema.All, any]>, T> = Values<{
18
+ [key in keyof CTXMap as CTXMap[key][3] extends true ? never : key extends keyof T ? T[key] extends true ? never : CTXMap[key][0] : CTXMap[key][0]]: CTXMap[key][1];
19
+ } & {
20
+ [key in keyof CTXMap as CTXMap[key][3] extends false ? never : key extends keyof T ? T[key] extends true ? CTXMap[key][0] : never : never]: CTXMap[key][1];
21
+ }>;
22
+ export type ValuesOrNeverSchema<T extends Record<any, any>> = Values<T> extends never ? typeof S.Never : Values<T>;
23
+ export type GetEffectError<CTXMap extends Record<string, [string, any, S.Schema.All, any]>, T> = Values<{
24
+ [key in keyof CTXMap as CTXMap[key][3] extends true ? never : key extends keyof T ? T[key] extends true ? never : CTXMap[key][0] : CTXMap[key][0]]: CTXMap[key][2];
25
+ } & {
26
+ [key in keyof CTXMap as CTXMap[key][3] extends false ? never : key extends keyof T ? T[key] extends true ? CTXMap[key][0] : never : never]: CTXMap[key][2];
27
+ }>;
28
+ type GetFailure1<F1> = F1 extends S.Schema.Any ? F1 : typeof S.Never;
29
+ type GetFailure<F1, F2> = F1 extends S.Schema.Any ? F2 extends S.Schema.Any ? S.Union<[F1, F2]> : F1 : F2;
30
+ export declare const makeRpcClient: <RequestConfig extends object, CTXMap extends Record<string, [string, any, S.Schema.All, any]>>(errors: { [K in keyof CTXMap]: CTXMap[K][2]; }) => {
31
+ TaggedRequest: <Self>() => {
32
+ <Tag extends string, Payload extends S.Struct.Fields, C extends {
33
+ success: S.Schema.Any;
34
+ failure: S.Schema.Any;
35
+ }>(tag: Tag, fields: Payload, config: RequestConfig & C): S.TaggedRequestClass<Self, Tag, {
36
+ readonly _tag: S.tag<Tag>;
37
+ } & Payload, (typeof config)["success"], GetEffectError<CTXMap, C> extends never ? (typeof config)["failure"] : GetFailure<(typeof config)["failure"], GetEffectError<CTXMap, C>>> & {
38
+ config: Omit<C, "success" | "failure">;
39
+ };
40
+ <Tag extends string, Payload_1 extends S.Struct.Fields, C_1 extends {
41
+ success: S.Schema.Any;
42
+ }>(tag: Tag, fields: Payload_1, config: RequestConfig & C_1): S.TaggedRequestClass<Self, Tag, {
43
+ readonly _tag: S.tag<Tag>;
44
+ } & Payload_1, (typeof config)["success"], GetFailure1<GetEffectError<CTXMap, C_1>>> & {
45
+ config: Omit<C_1, "success" | "failure">;
46
+ };
47
+ <Tag extends string, Payload_2 extends S.Struct.Fields, C_2 extends {
48
+ failure: S.Schema.Any;
49
+ }>(tag: Tag, fields: Payload_2, config: RequestConfig & C_2): S.TaggedRequestClass<Self, Tag, {
50
+ readonly _tag: S.tag<Tag>;
51
+ } & Payload_2, typeof S.Void, GetFailure1<GetEffectError<CTXMap, C_2>>> & {
52
+ config: Omit<C_2, "success" | "failure">;
53
+ };
54
+ <Tag extends string, Payload_3 extends S.Struct.Fields, C_3 extends Record<string, any>>(tag: Tag, fields: Payload_3, config: C_3 & RequestConfig): S.TaggedRequestClass<Self, Tag, {
55
+ readonly _tag: S.tag<Tag>;
56
+ } & Payload_3, typeof S.Void, GetFailure1<GetEffectError<CTXMap, C_3>>> & {
57
+ config: Omit<C_3, "success" | "failure">;
58
+ };
59
+ <Tag extends string, Payload_4 extends S.Struct.Fields>(tag: Tag, fields: Payload_4): S.TaggedRequestClass<Self, Tag, {
60
+ readonly _tag: S.tag<Tag>;
61
+ } & Payload_4, typeof S.Void, typeof S.Never>;
62
+ };
63
+ };
64
+ export interface Middleware<Context, CTXMap extends Record<string, [string, any, S.Schema.All, any]>> {
65
+ contextMap: CTXMap;
66
+ context: Context;
67
+ execute: <T extends {
68
+ config?: {
69
+ [K in keyof CTXMap]?: any;
70
+ };
71
+ }, Req extends S.TaggedRequest.All, R>(schema: T & S.Schema<Req, any, never>, handler: (request: Req) => Effect.Effect<EffectRequest.Request.Success<Req>, EffectRequest.Request.Error<Req>, R>, moduleName?: string) => (req: Req) => Effect.Effect<Request.Request.Success<Req>, Request.Request.Error<Req>, any>;
72
+ }
73
+ export declare const makeRpc: <Context, CTXMap extends Record<string, [string, any, S.Schema.All, any]>>(middleware: Middleware<Context, CTXMap>) => {
74
+ effect: <T extends {
75
+ config?: { [K in keyof CTXMap]?: any; };
76
+ }, Req extends S.TaggedRequest.All, R>(schema: T & S.Schema<Req, any, never>, handler: (request: Req) => Effect.Effect<EffectRequest.Request.Success<Req>, EffectRequest.Request.Error<Req>, R>, moduleName?: string) => Rpc.Rpc<Req, Context | Exclude<R, GetEffectContext<CTXMap, T["config"]>>>;
77
+ };
78
+ export {};
79
+ //# sourceMappingURL=DynamicMiddleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DynamicMiddleware.d.ts","sourceRoot":"","sources":["../../../src/api/routing2/DynamicMiddleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { Rpc } from "@effect/rpc";
3
+ import { S } from "effect-app";
4
+ const merge = (a, b) => a !== undefined && b.length ? S.Union(a, ...b) : a !== undefined ? a : b.length ? S.Union(...b) : S.Never;
5
+ export const makeRpcClient = (errors) => {
6
+ function TaggedRequest() {
7
+ // TODO: filter errors based on config + take care of inversion
8
+ const errorSchemas = Object.values(errors);
9
+ return ((tag, fields, config) => {
10
+ const req = S.TaggedRequest()(tag, {
11
+ payload: fields,
12
+ failure: merge(config?.failure, errorSchemas),
13
+ success: config?.success ?? S.Void
14
+ });
15
+ const req2 = Object.assign(req, { config });
16
+ return req2;
17
+ });
18
+ }
19
+ return {
20
+ TaggedRequest
21
+ };
22
+ };
23
+ export const makeRpc = (middleware) => {
24
+ return {
25
+ effect: (schema, handler, moduleName) => {
26
+ return Rpc.effect(schema, middleware.execute(schema, handler, moduleName));
27
+ }
28
+ };
29
+ };
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRHluYW1pY01pZGRsZXdhcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3JvdXRpbmcyL0R5bmFtaWNNaWRkbGV3YXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBRWpDLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFnRTlCLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBTSxFQUFFLENBQWEsRUFBRSxFQUFFLENBQ3RDLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7QUFFM0csTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBSTNCLE1BQTZDLEVBQzdDLEVBQUU7SUFHRixTQUFTLGFBQWE7UUFpRXBCLCtEQUErRDtRQUMvRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzFDLE9BQU8sQ0FBQyxDQUNOLEdBQVEsRUFDUixNQUFjLEVBQ2QsTUFBVSxFQUNWLEVBQUU7WUFDRixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFRLENBQUMsR0FBRyxFQUFFO2dCQUN2QyxPQUFPLEVBQUUsTUFBTTtnQkFDZixPQUFPLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDO2dCQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsSUFBSTthQUNuQyxDQUFDLENBQUE7WUFDRixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUE7WUFDM0MsT0FBTyxJQUFJLENBQUE7UUFDYixDQUFDLENBQVEsQ0FBQTtJQUNYLENBQUM7SUFFRCxPQUFPO1FBQ0wsYUFBYTtLQUNkLENBQUE7QUFDSCxDQUFDLENBQUE7QUEwQkQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQ3JCLFVBQXVDLEVBQ3ZDLEVBQUU7SUFDRixPQUFPO1FBQ0wsTUFBTSxFQUFFLENBQ04sTUFBcUMsRUFDckMsT0FNQyxFQUNELFVBQW1CLEVBQ25CLEVBQUU7WUFDRixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQ2YsTUFBTSxFQUNOLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FDaEQsQ0FBQTtRQUNILENBQUM7S0FDRixDQUFBO0FBQ0gsQ0FBQyxDQUFBIn0=
@@ -0,0 +1,79 @@
1
+ import type { EffectUnunified } from "@effect-app/core/Effect";
2
+ import type { _R } from "@effect-app/infra/api/routing";
3
+ import type { Rpc } from "@effect/rpc";
4
+ import type { S } from "effect-app";
5
+ import { Effect } from "effect-app";
6
+ import { HttpRouter } from "effect-app/http";
7
+ import type { GetEffectContext, Middleware } from "./routing2/DynamicMiddleware.js";
8
+ export interface Hint<Err extends string> {
9
+ Err: Err;
10
+ }
11
+ type HandleVoid<Expected, Actual, Result> = [Expected] extends [void] ? [Actual] extends [void] ? Result : Hint<"You're returning non void for a void Response, please fix"> : Result;
12
+ type AnyRequestModule = S.Schema.Any & {
13
+ success?: S.Schema.Any;
14
+ failure?: S.Schema.Any;
15
+ };
16
+ type GetSuccess<T> = T extends {
17
+ success: S.Schema.Any;
18
+ } ? T["success"] : typeof S.Void;
19
+ type GetFailure<T extends {
20
+ failure?: S.Schema.Any;
21
+ }> = T["failure"] extends never ? typeof S.Never : T["failure"];
22
+ export interface Handler<Action extends AnyRequestModule, RT extends "raw" | "d", A, E, R, Context> {
23
+ new (): {};
24
+ _tag: RT;
25
+ handler: (req: S.Schema.Type<Action>, ctx: Context) => Effect<A, E, R>;
26
+ }
27
+ type AHandler<Action extends AnyRequestModule> = Handler<Action, "raw", S.Schema.Encoded<GetSuccess<Action>>, S.Schema.Type<GetFailure<Action>>, any, {
28
+ Response: any;
29
+ }> | Handler<Action, "d", S.Schema.Type<GetSuccess<Action>>, S.Schema.Type<GetFailure<Action>>, any, {
30
+ Response: any;
31
+ }>;
32
+ type Filter<T> = {
33
+ [K in keyof T as T[K] extends S.Schema.All & {
34
+ success: S.Schema.Any;
35
+ failure: S.Schema.Any;
36
+ } ? K : never]: T[K];
37
+ };
38
+ export declare const makeRouter2: <Context, CTXMap extends Record<string, [string, any, S.Schema.All, any]>>(middleware: Middleware<Context, CTXMap>) => {
39
+ matchAll: <T extends {
40
+ [key: string]: HttpRouter.HttpRouter<any, any>;
41
+ }>(handlers: T) => HttpRouter.HttpRouter<[T[keyof T]] extends [HttpRouter.HttpRouter<infer E, any>] ? E : never, [T[keyof T]] extends [HttpRouter.HttpRouter<any, infer R>] ? R : never>;
42
+ matchFor: <Rsc extends Record<string, any> & {
43
+ meta: {
44
+ moduleName: string;
45
+ };
46
+ }>(rsc: Rsc) => {
47
+ controllers: <THandlers extends { [K in keyof Filter<Rsc>]: AHandler<Rsc[K]>; }>(controllers: THandlers) => HttpRouter.HttpRouter<import("@effect/platform/HttpServerError").RequestError, Exclude<[(keyof Filter<Rsc> extends infer T extends keyof Filter<Rsc> ? { [K in T]: Rpc.Rpc<Rsc[K], _R<ReturnType<THandlers[K]["handler"]>>>; } : never)[keyof Filter<Rsc>]] extends [Rpc.Rpc<any, infer R>] ? R : never, HttpRouter.HttpRouter.Provided> | Exclude<import("@effect/schema/Serializable").SerializableWithResult.Context<[(keyof Filter<Rsc> extends infer T extends keyof Filter<Rsc> ? { [K in T]: Rpc.Rpc<Rsc[K], _R<ReturnType<THandlers[K]["handler"]>>>; } : never)[keyof Filter<Rsc>]] extends [Rpc.Rpc<infer Req extends S.TaggedRequest.All, any>] ? Req : never>, HttpRouter.HttpRouter.Provided>>;
48
+ } & { [Key in keyof Filter<Rsc>]: {
49
+ <R2, E, A>(f: Effect<A, E, R2>): HandleVoid<S.Schema.Type<GetSuccess<Rsc[Key]>>, A, Handler<Rsc[Key], "d", A, E, Exclude<R2, GetEffectContext<CTXMap, Rsc[Key]["config"]>>, {
50
+ Response: Rsc[Key]["success"];
51
+ }>>;
52
+ <R2, E_1, A_1>(f: (req: S.Schema.Type<Rsc[Key]>, ctx: {
53
+ Response: Rsc[Key]["success"];
54
+ }) => Effect<A_1, E_1, R2>): HandleVoid<S.Schema.Type<GetSuccess<Rsc[Key]>>, A_1, Handler<Rsc[Key], "d", A_1, E_1, Exclude<R2, GetEffectContext<CTXMap, Rsc[Key]["config"]>>, {
55
+ Response: Rsc[Key]["success"];
56
+ }>>;
57
+ <SVC extends Record<string, EffectUnunified<any, any, any>>, R2, E_2, A_2>(services: SVC, f: (req: S.Schema.Type<Rsc[Key]>, ctx: {
58
+ Response: Rsc[Key];
59
+ }) => Effect<A_2, E_2, R2>): HandleVoid<S.Schema.Type<GetSuccess<Rsc[Key]>>, A_2, Handler<Rsc[Key], "d", A_2, E_2, Exclude<R2, GetEffectContext<CTXMap, Rsc[Key]["config"]>>, {
60
+ Response: Rsc[Key]["success"];
61
+ }>>;
62
+ }; } & { [Key_1 in keyof Filter<Rsc> as Key_1 extends string ? `${Key_1}Raw` : never]: {
63
+ <R2_1, E, A>(f: Effect<A, E, R2_1>): HandleVoid<S.Schema.Encoded<GetSuccess<Rsc[Key_1]>>, A, Handler<Rsc[Key_1], "raw", A, E, Exclude<R2_1, GetEffectContext<CTXMap, Rsc[Key_1]["config"]>>, {
64
+ Response: Rsc[Key_1]["success"];
65
+ }>>;
66
+ <R2_1, E_1, A_1>(f: (req: S.Schema.Type<Rsc[Key_1]>, ctx: {
67
+ Response: Rsc[Key_1]["success"];
68
+ }) => Effect<A_1, E_1, R2_1>): HandleVoid<S.Schema.Encoded<GetSuccess<Rsc[Key_1]>>, A_1, Handler<Rsc[Key_1], "raw", A_1, E_1, Exclude<R2_1, GetEffectContext<CTXMap, Rsc[Key_1]["config"]>>, {
69
+ Response: Rsc[Key_1]["success"];
70
+ }>>;
71
+ <SVC extends Record<string, EffectUnunified<any, any, any>>, R2, E_2, A_2>(services: SVC, f: (req: S.Schema.Type<Rsc[Key_1]>, ctx: {
72
+ Response: Rsc[Key_1];
73
+ }) => Effect<A_2, E_2, R2>): HandleVoid<S.Schema.Encoded<GetSuccess<Rsc[Key_1]>>, A_2, Handler<Rsc[Key_1], "raw", A_2, E_2, Exclude<R2, GetEffectContext<CTXMap, Rsc[Key_1]["config"]>>, {
74
+ Response: Rsc[Key_1]["success"];
75
+ }>>;
76
+ }; };
77
+ };
78
+ export {};
79
+ //# sourceMappingURL=routing2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing2.d.ts","sourceRoot":"","sources":["../../src/api/routing2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ /* eslint-disable @typescript-eslint/no-empty-object-type */
2
+ /* eslint-disable @typescript-eslint/no-explicit-any */
3
+ import { typedKeysOf } from "@effect-app/core/utils";
4
+ import { RpcRouter } from "@effect/rpc";
5
+ import { HttpRpcRouter } from "@effect/rpc-http";
6
+ import { Effect, Predicate } from "effect-app";
7
+ import { HttpRouter } from "effect-app/http";
8
+ import { makeRpc } from "./routing2/DynamicMiddleware.js";
9
+ export const makeRouter2 = (middleware) => {
10
+ const rpc = makeRpc(middleware);
11
+ function matchFor(rsc) {
12
+ const meta = rsc.meta;
13
+ if (!meta)
14
+ throw new Error("Resource has no meta specified"); // TODO: do something with moduleName+cur etc.
15
+ const filtered = typedKeysOf(rsc).reduce((acc, cur) => {
16
+ if (Predicate.isObject(rsc[cur]) && rsc[cur]["success"]) {
17
+ acc[cur] = rsc[cur];
18
+ }
19
+ return acc;
20
+ }, {});
21
+ const matchWithServices = (action) => {
22
+ return (_services, f) => (req) =>
23
+ // Effect.andThen(allLower(services), (svc2) =>
24
+ // ...ctx, ...svc2,
25
+ f(req, { Response: rsc[action].success });
26
+ };
27
+ const controllers = (controllers) => {
28
+ const handlers = typedKeysOf(filtered).reduce((acc, cur) => {
29
+ if (cur === "meta")
30
+ return acc;
31
+ acc[cur] = {
32
+ h: controllers[cur].handler,
33
+ Request: rsc[cur]
34
+ };
35
+ return acc;
36
+ }, {});
37
+ const mapped = typedKeysOf(handlers).reduce((acc, cur) => {
38
+ const handler = handlers[cur];
39
+ const req = handler.Request;
40
+ acc[cur] = rpc.effect(req, handler.h, meta.moduleName); // TODO
41
+ return acc;
42
+ }, {});
43
+ const router = RpcRouter.make(...Object.values(mapped));
44
+ return HttpRouter.empty.pipe(HttpRouter.all(("/rpc/" + rsc.meta.moduleName), HttpRpcRouter.toHttpApp(router)));
45
+ };
46
+ const r = {
47
+ controllers,
48
+ ...typedKeysOf(filtered).reduce((prev, cur) => {
49
+ ;
50
+ prev[cur] = (svcOrFnOrEffect, fnOrNone) => {
51
+ const stack = new Error().stack?.split("\n").slice(2).join("\n");
52
+ return Effect.isEffect(svcOrFnOrEffect)
53
+ ? class {
54
+ static stack = stack;
55
+ static _tag = "d";
56
+ static handler = () => svcOrFnOrEffect;
57
+ }
58
+ : typeof svcOrFnOrEffect === "function"
59
+ ? class {
60
+ static stack = stack;
61
+ static _tag = "d";
62
+ static handler = (req, ctx) => svcOrFnOrEffect(req, { ...ctx, Response: rsc[cur].success });
63
+ }
64
+ : class {
65
+ static stack = stack;
66
+ static _tag = "d";
67
+ static handler = matchWithServices(cur)(svcOrFnOrEffect, fnOrNone);
68
+ };
69
+ };
70
+ prev[cur + "Raw"] = (svcOrFnOrEffect, fnOrNone) => {
71
+ const stack = new Error().stack?.split("\n").slice(2).join("\n");
72
+ return Effect.isEffect(svcOrFnOrEffect)
73
+ ? class {
74
+ static stack = stack;
75
+ static _tag = "raw";
76
+ static handler = () => svcOrFnOrEffect;
77
+ }
78
+ : typeof svcOrFnOrEffect === "function"
79
+ ? class {
80
+ static stack = stack;
81
+ static _tag = "raw";
82
+ static handler = (req, ctx) => svcOrFnOrEffect(req, { ...ctx, Response: rsc[cur].success });
83
+ }
84
+ : class {
85
+ static stack = stack;
86
+ static _tag = "raw";
87
+ static handler = matchWithServices(cur)(svcOrFnOrEffect, fnOrNone);
88
+ };
89
+ };
90
+ return prev;
91
+ }, {})
92
+ };
93
+ return r;
94
+ }
95
+ function matchAll(handlers) {
96
+ const r = typedKeysOf(handlers).reduce((acc, cur) => {
97
+ return HttpRouter.concat(acc, handlers[cur]);
98
+ }, HttpRouter.empty);
99
+ return r;
100
+ }
101
+ return { matchAll, matchFor };
102
+ };
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGluZzIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3JvdXRpbmcyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDREQUE0RDtBQUM1RCx1REFBdUQ7QUFHdkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBSXBELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRWhELE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUU1QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUNBQWlDLENBQUE7QUF1RHpELE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUN6QixVQUF1QyxFQUN2QyxFQUFFO0lBQ0YsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQy9CLFNBQVMsUUFBUSxDQUNmLEdBQVE7UUFFUixNQUFNLElBQUksR0FBSSxHQUFXLENBQUMsSUFBOEIsQ0FBQTtRQUN4RCxJQUFJLENBQUMsSUFBSTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQSxDQUFDLDhDQUE4QztRQUczRyxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ3BELElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDeEQsR0FBRyxDQUFDLEdBQXFCLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDdkMs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
@@ -15,5 +15,5 @@ export declare function makeSQLQueue<Evt extends {
15
15
  }, EvtE, DrainEvtE>(queueName: NonEmptyString255, queueDrainName: NonEmptyString255, schema: S.Schema<Evt, EvtE>, drainSchema: S.Schema<DrainEvt, DrainEvtE>): Effect.Effect<{
16
16
  publish: (messages_0: Evt, ...messages: Evt[]) => Effect.Effect<void, never, never>;
17
17
  drain: <DrainE, DrainR>(handleEvent: (ks: DrainEvt) => Effect<void, DrainE, DrainR>, sessionId?: string) => Effect.Effect<never, never, RequestContextContainer | import("../Store/ContextMapContainer.js").ContextMapContainer | Exclude<Exclude<Exclude<DrainR, Tracer.ParentSpan>, never>, Tracer.ParentSpan>>;
18
- }, never, SqlClient.SqlClient | RequestContextContainer>;
18
+ }, never, RequestContextContainer | SqlClient.SqlClient>;
19
19
  //# sourceMappingURL=SQLQueue.d.ts.map
package/package.json CHANGED
@@ -1,11 +1,13 @@
1
1
  {
2
2
  "name": "@effect-app/infra",
3
- "version": "1.24.2",
3
+ "version": "1.25.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "dependencies": {
7
7
  "@azure/cosmos": "^4.1.1",
8
8
  "@azure/service-bus": "^7.9.5",
9
+ "@effect/rpc": "^0.40.2",
10
+ "@effect/rpc-http": "^0.38.3",
9
11
  "express-oauth2-jwt-bearer": "^1.6.0",
10
12
  "@faker-js/faker": "^8.4.1",
11
13
  "@sendgrid/helpers": "^8.0.0",
@@ -19,9 +21,9 @@
19
21
  "pure-rand": "6.1.0",
20
22
  "redlock": "^4.2.0",
21
23
  "@effect-app/core": "1.10.2",
24
+ "@effect-app/infra-adapters": "1.12.1",
22
25
  "effect-app": "1.17.5",
23
- "@effect-app/schema": "1.12.2",
24
- "@effect-app/infra-adapters": "1.12.1"
26
+ "@effect-app/schema": "1.12.2"
25
27
  },
26
28
  "devDependencies": {
27
29
  "@babel/cli": "^7.25.6",
@@ -186,6 +188,26 @@
186
188
  "default": "./_cjs/api/routing/schema/routing.cjs"
187
189
  }
188
190
  },
191
+ "./api/routing2": {
192
+ "import": {
193
+ "types": "./dist/api/routing2.d.ts",
194
+ "default": "./dist/api/routing2.js"
195
+ },
196
+ "require": {
197
+ "types": "./dist/api/routing2.d.ts",
198
+ "default": "./_cjs/api/routing2.cjs"
199
+ }
200
+ },
201
+ "./api/routing2/DynamicMiddleware": {
202
+ "import": {
203
+ "types": "./dist/api/routing2/DynamicMiddleware.d.ts",
204
+ "default": "./dist/api/routing2/DynamicMiddleware.js"
205
+ },
206
+ "require": {
207
+ "types": "./dist/api/routing2/DynamicMiddleware.d.ts",
208
+ "default": "./_cjs/api/routing2/DynamicMiddleware.cjs"
209
+ }
210
+ },
189
211
  "./api/setupRequest": {
190
212
  "import": {
191
213
  "types": "./dist/api/setupRequest.d.ts",
@@ -0,0 +1,211 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { Rpc } from "@effect/rpc"
3
+ import type { Effect, Request } from "effect-app"
4
+ import { S } from "effect-app"
5
+ import type * as EffectRequest from "effect/Request"
6
+
7
+ /**
8
+ * Middleware is inactivate by default, the Key is optional in route context, and the service is optionally provided as Effect Context.
9
+ * Unless configured as `true`
10
+ */
11
+ export type ContextMap<Key, Service, E> = [Key, Service, E, true]
12
+
13
+ export type ContextMapCustom<Key, Service, E, Custom> = [Key, Service, E, Custom]
14
+
15
+ /**
16
+ * Middleware is active by default, and provides the Service at Key in route context, and the Service is provided as Effect Context.
17
+ * Unless omitted
18
+ */
19
+ export type ContextMapInverted<Key, Service, E> = [Key, Service, E, false]
20
+
21
+ type Values<T extends Record<any, any>> = T[keyof T]
22
+
23
+ export type GetEffectContext<CTXMap extends Record<string, [string, any, S.Schema.All, any]>, T> = Values<
24
+ // inverted
25
+ & {
26
+ [
27
+ key in keyof CTXMap as CTXMap[key][3] extends true ? never
28
+ : key extends keyof T ? T[key] extends true ? never : CTXMap[key][0]
29
+ : CTXMap[key][0]
30
+ ]: // TODO: or as an Optional available?
31
+ CTXMap[key][1]
32
+ }
33
+ // normal
34
+ & {
35
+ [
36
+ key in keyof CTXMap as CTXMap[key][3] extends false ? never
37
+ : key extends keyof T ? T[key] extends true ? CTXMap[key][0] : never
38
+ : never
39
+ ]: // TODO: or as an Optional available?
40
+ CTXMap[key][1]
41
+ }
42
+ >
43
+ export type ValuesOrNeverSchema<T extends Record<any, any>> = Values<T> extends never ? typeof S.Never : Values<T>
44
+ export type GetEffectError<CTXMap extends Record<string, [string, any, S.Schema.All, any]>, T> = Values<
45
+ // inverted
46
+ & {
47
+ [
48
+ key in keyof CTXMap as CTXMap[key][3] extends true ? never
49
+ : key extends keyof T ? T[key] extends true ? never : CTXMap[key][0]
50
+ : CTXMap[key][0]
51
+ ]: // TODO: or as an Optional available?
52
+ CTXMap[key][2]
53
+ }
54
+ // normal
55
+ & {
56
+ [
57
+ key in keyof CTXMap as CTXMap[key][3] extends false ? never
58
+ : key extends keyof T ? T[key] extends true ? CTXMap[key][0] : never
59
+ : never
60
+ ]: // TODO: or as an Optional available?
61
+ CTXMap[key][2]
62
+ }
63
+ >
64
+
65
+ type GetFailure1<F1> = F1 extends S.Schema.Any ? F1 : typeof S.Never
66
+ type GetFailure<F1, F2> = F1 extends S.Schema.Any ? F2 extends S.Schema.Any ? S.Union<[F1, F2]> : F1 : F2
67
+
68
+ const merge = (a: any, b: Array<any>) =>
69
+ a !== undefined && b.length ? S.Union(a, ...b) : a !== undefined ? a : b.length ? S.Union(...b) : S.Never
70
+
71
+ export const makeRpcClient = <
72
+ RequestConfig extends object,
73
+ CTXMap extends Record<string, [string, any, S.Schema.All, any]>
74
+ >(
75
+ errors: { [K in keyof CTXMap]: CTXMap[K][2] }
76
+ ) => {
77
+ // Long way around Context/C extends etc to support actual jsdoc from passed in RequestConfig etc...
78
+ type Context = { success: S.Schema.Any; failure: S.Schema.Any }
79
+ function TaggedRequest<Self>(): {
80
+ <Tag extends string, Payload extends S.Struct.Fields, C extends Context>(
81
+ tag: Tag,
82
+ fields: Payload,
83
+ config: RequestConfig & C
84
+ ):
85
+ & S.TaggedRequestClass<
86
+ Self,
87
+ Tag,
88
+ { readonly _tag: S.tag<Tag> } & Payload,
89
+ typeof config["success"],
90
+ GetEffectError<CTXMap, C> extends never ? typeof config["failure"]
91
+ : GetFailure<typeof config["failure"], GetEffectError<CTXMap, C>>
92
+ > // typeof config["failure"]
93
+ & { config: Omit<C, "success" | "failure"> }
94
+ <Tag extends string, Payload extends S.Struct.Fields, C extends { success: S.Schema.Any }>(
95
+ tag: Tag,
96
+ fields: Payload,
97
+ config: RequestConfig & C
98
+ ):
99
+ & S.TaggedRequestClass<
100
+ Self,
101
+ Tag,
102
+ { readonly _tag: S.tag<Tag> } & Payload,
103
+ typeof config["success"],
104
+ GetFailure1<GetEffectError<CTXMap, C>>
105
+ >
106
+ & { config: Omit<C, "success" | "failure"> }
107
+ <Tag extends string, Payload extends S.Struct.Fields, C extends { failure: S.Schema.Any }>(
108
+ tag: Tag,
109
+ fields: Payload,
110
+ config: RequestConfig & C
111
+ ):
112
+ & S.TaggedRequestClass<
113
+ Self,
114
+ Tag,
115
+ { readonly _tag: S.tag<Tag> } & Payload,
116
+ typeof S.Void,
117
+ GetFailure1<GetEffectError<CTXMap, C>>
118
+ >
119
+ & { config: Omit<C, "success" | "failure"> }
120
+ <Tag extends string, Payload extends S.Struct.Fields, C extends Record<string, any>>(
121
+ tag: Tag,
122
+ fields: Payload,
123
+ config: C & RequestConfig
124
+ ):
125
+ & S.TaggedRequestClass<
126
+ Self,
127
+ Tag,
128
+ { readonly _tag: S.tag<Tag> } & Payload,
129
+ typeof S.Void,
130
+ GetFailure1<GetEffectError<CTXMap, C>>
131
+ >
132
+ & { config: Omit<C, "success" | "failure"> }
133
+ <Tag extends string, Payload extends S.Struct.Fields>(
134
+ tag: Tag,
135
+ fields: Payload
136
+ ): S.TaggedRequestClass<
137
+ Self,
138
+ Tag,
139
+ { readonly _tag: S.tag<Tag> } & Payload,
140
+ typeof S.Void,
141
+ typeof S.Never
142
+ >
143
+ } {
144
+ // TODO: filter errors based on config + take care of inversion
145
+ const errorSchemas = Object.values(errors)
146
+ return (<Tag extends string, Fields extends S.Struct.Fields, C extends Context>(
147
+ tag: Tag,
148
+ fields: Fields,
149
+ config?: C
150
+ ) => {
151
+ const req = S.TaggedRequest<Self>()(tag, {
152
+ payload: fields,
153
+ failure: merge(config?.failure, errorSchemas),
154
+ success: config?.success ?? S.Void
155
+ })
156
+ const req2 = Object.assign(req, { config })
157
+ return req2
158
+ }) as any
159
+ }
160
+
161
+ return {
162
+ TaggedRequest
163
+ }
164
+ }
165
+
166
+ export interface Middleware<Context, CTXMap extends Record<string, [string, any, S.Schema.All, any]>> {
167
+ contextMap: CTXMap
168
+ context: Context
169
+ execute: <
170
+ T extends {
171
+ config?: { [K in keyof CTXMap]?: any }
172
+ },
173
+ Req extends S.TaggedRequest.All,
174
+ R
175
+ >(
176
+ schema: T & S.Schema<Req, any, never>,
177
+ handler: (
178
+ request: Req
179
+ ) => Effect.Effect<EffectRequest.Request.Success<Req>, EffectRequest.Request.Error<Req>, R>,
180
+ moduleName?: string
181
+ ) => (
182
+ req: Req
183
+ ) => Effect.Effect<
184
+ Request.Request.Success<Req>,
185
+ Request.Request.Error<Req>,
186
+ any // smd
187
+ >
188
+ }
189
+
190
+ export const makeRpc = <Context, CTXMap extends Record<string, [string, any, S.Schema.All, any]>>(
191
+ middleware: Middleware<Context, CTXMap>
192
+ ) => {
193
+ return {
194
+ effect: <T extends { config?: { [K in keyof CTXMap]?: any } }, Req extends S.TaggedRequest.All, R>(
195
+ schema: T & S.Schema<Req, any, never>,
196
+ handler: (
197
+ request: Req
198
+ ) => Effect.Effect<
199
+ EffectRequest.Request.Success<Req>,
200
+ EffectRequest.Request.Error<Req>,
201
+ R
202
+ >,
203
+ moduleName?: string
204
+ ) => {
205
+ return Rpc.effect<Req, Context | Exclude<R, GetEffectContext<CTXMap, T["config"]>>>(
206
+ schema,
207
+ middleware.execute(schema, handler, moduleName)
208
+ )
209
+ }
210
+ }
211
+ }
@@ -0,0 +1,338 @@
1
+ /* eslint-disable @typescript-eslint/no-empty-object-type */
2
+ /* eslint-disable @typescript-eslint/no-explicit-any */
3
+
4
+ import type { EffectUnunified } from "@effect-app/core/Effect"
5
+ import { typedKeysOf } from "@effect-app/core/utils"
6
+ import type { Compute } from "@effect-app/core/utils"
7
+ import type { _E, _R } from "@effect-app/infra/api/routing"
8
+ import type { Rpc } from "@effect/rpc"
9
+ import { RpcRouter } from "@effect/rpc"
10
+ import { HttpRpcRouter } from "@effect/rpc-http"
11
+ import type { S } from "effect-app"
12
+ import { Effect, Predicate } from "effect-app"
13
+ import { HttpRouter } from "effect-app/http"
14
+ import type { GetEffectContext, Middleware } from "./routing2/DynamicMiddleware.js"
15
+ import { makeRpc } from "./routing2/DynamicMiddleware.js"
16
+
17
+ export interface Hint<Err extends string> {
18
+ Err: Err
19
+ }
20
+
21
+ type HandleVoid<Expected, Actual, Result> = [Expected] extends [void]
22
+ ? [Actual] extends [void] ? Result : Hint<"You're returning non void for a void Response, please fix">
23
+ : Result
24
+
25
+ type AnyRequestModule = S.Schema.Any & { success?: S.Schema.Any; failure?: S.Schema.Any }
26
+
27
+ type GetSuccess<T> = T extends { success: S.Schema.Any } ? T["success"] : typeof S.Void
28
+
29
+ type GetSuccessShape<Action extends { success?: S.Schema.Any }, RT extends "d" | "raw"> = RT extends "raw"
30
+ ? S.Schema.Encoded<GetSuccess<Action>>
31
+ : S.Schema.Type<GetSuccess<Action>>
32
+ type GetFailure<T extends { failure?: S.Schema.Any }> = T["failure"] extends never ? typeof S.Never : T["failure"]
33
+
34
+ export interface Handler<Action extends AnyRequestModule, RT extends "raw" | "d", A, E, R, Context> {
35
+ new(): {}
36
+ _tag: RT
37
+ handler: (
38
+ req: S.Schema.Type<Action>,
39
+ ctx: Context
40
+ ) => Effect<
41
+ A,
42
+ E,
43
+ R
44
+ >
45
+ }
46
+
47
+ // Separate "raw" vs "d" to verify A (Encoded for "raw" vs Type for "d")
48
+ type AHandler<Action extends AnyRequestModule> =
49
+ | Handler<
50
+ Action,
51
+ "raw",
52
+ S.Schema.Encoded<GetSuccess<Action>>,
53
+ S.Schema.Type<GetFailure<Action>>,
54
+ any,
55
+ { Response: any }
56
+ >
57
+ | Handler<
58
+ Action,
59
+ "d",
60
+ S.Schema.Type<GetSuccess<Action>>,
61
+ S.Schema.Type<GetFailure<Action>>,
62
+ any,
63
+ { Response: any }
64
+ >
65
+
66
+ type Filter<T> = {
67
+ [K in keyof T as T[K] extends S.Schema.All & { success: S.Schema.Any; failure: S.Schema.Any } ? K : never]: T[K]
68
+ }
69
+
70
+ export const makeRouter2 = <Context, CTXMap extends Record<string, [string, any, S.Schema.All, any]>>(
71
+ middleware: Middleware<Context, CTXMap>
72
+ ) => {
73
+ const rpc = makeRpc(middleware)
74
+ function matchFor<Rsc extends Record<string, any> & { meta: { moduleName: string } }>(
75
+ rsc: Rsc
76
+ ) {
77
+ const meta = (rsc as any).meta as { moduleName: string }
78
+ if (!meta) throw new Error("Resource has no meta specified") // TODO: do something with moduleName+cur etc.
79
+
80
+ type Filtered = Filter<Rsc>
81
+ const filtered = typedKeysOf(rsc).reduce((acc, cur) => {
82
+ if (Predicate.isObject(rsc[cur]) && rsc[cur]["success"]) {
83
+ acc[cur as keyof Filtered] = rsc[cur]
84
+ }
85
+ return acc
86
+ }, {} as Filtered)
87
+
88
+ const matchWithServices = <Key extends keyof Filtered>(action: Key) => {
89
+ return <
90
+ SVC extends Record<
91
+ string,
92
+ Effect<any, any, any>
93
+ >,
94
+ R2,
95
+ E,
96
+ A
97
+ >(
98
+ _services: SVC,
99
+ f: (
100
+ req: S.Schema.Type<Rsc[Key]>,
101
+ ctx: any
102
+ // ctx: Compute<
103
+ // LowerServices<EffectDeps<SVC>> & never // ,
104
+ // "flat"
105
+ // >
106
+ ) => Effect<A, E, R2>
107
+ ) =>
108
+ (req: any) =>
109
+ // Effect.andThen(allLower(services), (svc2) =>
110
+ // ...ctx, ...svc2,
111
+ f(req, { Response: rsc[action].success })
112
+ }
113
+
114
+ type MatchWithServicesNew<RT extends "raw" | "d", Key extends keyof Rsc> = {
115
+ <R2, E, A>(
116
+ f: Effect<A, E, R2>
117
+ ): HandleVoid<
118
+ GetSuccessShape<Rsc[Key], RT>,
119
+ A,
120
+ Handler<
121
+ Rsc[Key],
122
+ RT,
123
+ A,
124
+ E,
125
+ Exclude<R2, GetEffectContext<CTXMap, Rsc[Key]["config"]>>,
126
+ { Response: Rsc[Key]["success"] } //
127
+ >
128
+ >
129
+
130
+ <R2, E, A>(
131
+ f: (
132
+ req: S.Schema.Type<Rsc[Key]>,
133
+ ctx: { Response: Rsc[Key]["success"] }
134
+ ) => Effect<A, E, R2>
135
+ ): HandleVoid<
136
+ GetSuccessShape<Rsc[Key], RT>,
137
+ A,
138
+ Handler<
139
+ Rsc[Key],
140
+ RT,
141
+ A,
142
+ E,
143
+ Exclude<R2, GetEffectContext<CTXMap, Rsc[Key]["config"]>>,
144
+ { Response: Rsc[Key]["success"] } //
145
+ >
146
+ >
147
+
148
+ <
149
+ SVC extends Record<
150
+ string,
151
+ EffectUnunified<any, any, any>
152
+ >,
153
+ R2,
154
+ E,
155
+ A
156
+ >(
157
+ services: SVC,
158
+ f: (
159
+ req: S.Schema.Type<Rsc[Key]>,
160
+ ctx: Compute<
161
+ // LowerServices<EffectDeps<SVC>> & Pick<Rsc[Key], "success">,
162
+ { Response: Rsc[Key] },
163
+ "flat"
164
+ >
165
+ ) => Effect<A, E, R2>
166
+ ): HandleVoid<
167
+ GetSuccessShape<Rsc[Key], RT>,
168
+ A,
169
+ Handler<
170
+ Rsc[Key],
171
+ RT,
172
+ A,
173
+ E,
174
+ Exclude<R2, GetEffectContext<CTXMap, Rsc[Key]["config"]>>,
175
+ { Response: Rsc[Key]["success"] } //
176
+ >
177
+ >
178
+ }
179
+
180
+ type Keys = keyof Filtered
181
+
182
+ const controllers = <
183
+ THandlers extends {
184
+ // import to keep them separate via | for type checking!!
185
+ [K in Keys]: AHandler<Rsc[K]>
186
+ }
187
+ >(
188
+ controllers: THandlers
189
+ ) => {
190
+ const handlers = typedKeysOf(filtered).reduce(
191
+ (acc, cur) => {
192
+ if (cur === "meta") return acc
193
+ ;(acc as any)[cur] = {
194
+ h: controllers[cur as keyof typeof controllers].handler,
195
+ Request: rsc[cur]
196
+ }
197
+
198
+ return acc
199
+ },
200
+ {} as {
201
+ [K in Keys]: {
202
+ h: (
203
+ r: S.Schema.Type<Rsc[K]>
204
+ ) => Effect<
205
+ S.Schema.Type<GetSuccess<Rsc[K]>>,
206
+ _E<ReturnType<THandlers[K]["handler"]>>,
207
+ _R<ReturnType<THandlers[K]["handler"]>>
208
+ >
209
+ Request: Rsc[K]
210
+ }
211
+ }
212
+ )
213
+
214
+ const mapped = typedKeysOf(handlers).reduce((acc, cur) => {
215
+ const handler = handlers[cur]
216
+ const req = handler.Request
217
+
218
+ acc[cur] = rpc.effect(req, handler.h as any, meta.moduleName) // TODO
219
+ return acc
220
+ }, {} as any) as {
221
+ [K in Keys]: Rpc.Rpc<
222
+ Rsc[K],
223
+ _R<ReturnType<THandlers[K]["handler"]>>
224
+ >
225
+ }
226
+
227
+ type RPCRouteR<T extends Rpc.Rpc<any, any>> = [T] extends [
228
+ Rpc.Rpc<any, infer R>
229
+ ] ? R
230
+ : never
231
+
232
+ type RPCRouteReq<T extends Rpc.Rpc<any, any>> = [T] extends [
233
+ Rpc.Rpc<infer Req, any>
234
+ ] ? Req
235
+ : never
236
+
237
+ const router = RpcRouter.make(...Object.values(mapped) as any) as RpcRouter.RpcRouter<
238
+ RPCRouteReq<typeof mapped[keyof typeof mapped]>,
239
+ RPCRouteR<typeof mapped[keyof typeof mapped]>
240
+ >
241
+
242
+ return HttpRouter.empty.pipe(
243
+ HttpRouter.all(("/rpc/" + rsc.meta.moduleName) as any, HttpRpcRouter.toHttpApp(router))
244
+ )
245
+ }
246
+
247
+ const r = {
248
+ controllers,
249
+ ...typedKeysOf(filtered).reduce(
250
+ (prev, cur) => {
251
+ ;(prev as any)[cur] = (svcOrFnOrEffect: any, fnOrNone: any) => {
252
+ const stack = new Error().stack?.split("\n").slice(2).join("\n")
253
+ return Effect.isEffect(svcOrFnOrEffect)
254
+ ? class {
255
+ static stack = stack
256
+ static _tag = "d"
257
+ static handler = () => svcOrFnOrEffect
258
+ }
259
+ : typeof svcOrFnOrEffect === "function"
260
+ ? class {
261
+ static stack = stack
262
+ static _tag = "d"
263
+ static handler = (req: any, ctx: any) => svcOrFnOrEffect(req, { ...ctx, Response: rsc[cur].success })
264
+ }
265
+ : class {
266
+ static stack = stack
267
+ static _tag = "d"
268
+ static handler = matchWithServices(cur)(svcOrFnOrEffect, fnOrNone)
269
+ }
270
+ }
271
+ ;(prev as any)[(cur as any) + "Raw"] = (svcOrFnOrEffect: any, fnOrNone: any) => {
272
+ const stack = new Error().stack?.split("\n").slice(2).join("\n")
273
+ return Effect.isEffect(svcOrFnOrEffect)
274
+ ? class {
275
+ static stack = stack
276
+ static _tag = "raw"
277
+ static handler = () => svcOrFnOrEffect
278
+ }
279
+ : typeof svcOrFnOrEffect === "function"
280
+ ? class {
281
+ static stack = stack
282
+ static _tag = "raw"
283
+ static handler = (req: any, ctx: any) => svcOrFnOrEffect(req, { ...ctx, Response: rsc[cur].success })
284
+ }
285
+ : class {
286
+ static stack = stack
287
+ static _tag = "raw"
288
+ static handler = matchWithServices(cur)(svcOrFnOrEffect, fnOrNone)
289
+ }
290
+ }
291
+ return prev
292
+ },
293
+ {} as
294
+ & {
295
+ // use Rsc as Key over using Keys, so that the Go To on X.Action remain in tact in Controllers files
296
+ /**
297
+ * Requires the Type shape
298
+ */
299
+ [Key in keyof Filtered]: MatchWithServicesNew<"d", Key>
300
+ }
301
+ & {
302
+ // use Rsc as Key over using Keys, so that the Go To on X.Action remain in tact in Controllers files
303
+ /**
304
+ * Requires the Encoded shape (e.g directly undecoded from DB, so that we don't do multiple Decode/Encode)
305
+ */
306
+ [Key in keyof Filtered as Key extends string ? `${Key}Raw` : never]: MatchWithServicesNew<"raw", Key>
307
+ }
308
+ )
309
+ }
310
+ return r
311
+ }
312
+
313
+ type RequestHandlersTest = {
314
+ [key: string]: HttpRouter.HttpRouter<any, any>
315
+ }
316
+ function matchAll<T extends RequestHandlersTest>(handlers: T) {
317
+ const r = typedKeysOf(handlers).reduce((acc, cur) => {
318
+ return HttpRouter.concat(acc, handlers[cur] as any)
319
+ }, HttpRouter.empty)
320
+
321
+ type _RRouter<T extends HttpRouter.HttpRouter<any, any>> = [T] extends [
322
+ HttpRouter.HttpRouter<any, infer R>
323
+ ] ? R
324
+ : never
325
+
326
+ type _ERouter<T extends HttpRouter.HttpRouter<any, any>> = [T] extends [
327
+ HttpRouter.HttpRouter<infer E, any>
328
+ ] ? E
329
+ : never
330
+
331
+ return r as HttpRouter.HttpRouter<
332
+ _ERouter<typeof handlers[keyof typeof handlers]>,
333
+ _RRouter<typeof handlers[keyof typeof handlers]>
334
+ >
335
+ }
336
+
337
+ return { matchAll, matchFor }
338
+ }
@@ -1,37 +0,0 @@
1
- // packages/infra/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/infra/vitest.config.ts
32
- var __vite_injected_original_dirname2 = "/Users/patrickroza/pj/effect-app/libs/packages/infra";
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,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsicGFja2FnZXMvaW5mcmEvdml0ZXN0LmNvbmZpZy50cyIsICJ2aXRlLmNvbmZpZy5iYXNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiL1VzZXJzL3BhdHJpY2tyb3phL3BqL2VmZmVjdC1hcHAvbGlicy9wYWNrYWdlcy9pbmZyYVwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiL1VzZXJzL3BhdHJpY2tyb3phL3BqL2VmZmVjdC1hcHAvbGlicy9wYWNrYWdlcy9pbmZyYS92aXRlc3QuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9Vc2Vycy9wYXRyaWNrcm96YS9wai9lZmZlY3QtYXBwL2xpYnMvcGFja2FnZXMvaW5mcmEvdml0ZXN0LmNvbmZpZy50c1wiOy8vLyA8cmVmZXJlbmNlIHR5cGVzPVwidml0ZXN0XCIgLz5cbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gXCJ2aXRlXCJcbmltcG9ydCBtYWtlQ29uZmlnIGZyb20gXCIuLi8uLi92aXRlLmNvbmZpZy5iYXNlXCJcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKG1ha2VDb25maWcoX19kaXJuYW1lKSlcbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiL1VzZXJzL3BhdHJpY2tyb3phL3BqL2VmZmVjdC1hcHAvbGlic1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiL1VzZXJzL3BhdHJpY2tyb3phL3BqL2VmZmVjdC1hcHAvbGlicy92aXRlLmNvbmZpZy5iYXNlLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9Vc2Vycy9wYXRyaWNrcm96YS9wai9lZmZlY3QtYXBwL2xpYnMvdml0ZS5jb25maWcuYmFzZS50c1wiOy8vLyA8cmVmZXJlbmNlIHR5cGVzPVwidml0ZXN0XCIgLz5cbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCBmcyBmcm9tIFwiZnNcIlxuaW1wb3J0IEF1dG9JbXBvcnQgZnJvbSBcInVucGx1Z2luLWF1dG8taW1wb3J0L3ZpdGVcIlxuaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSBcInZpdGVzdC9jb25maWdcIlxuXG4vLyBjb25zdCBhdXRvSW1wb3J0ID0gQXV0b0ltcG9ydCh7XG4vLyAgIGR0czogXCIuL3Rlc3QvYXV0by1pbXBvcnRzLmQudHNcIixcbi8vICAgLy8gaW5jbHVkZTogW1xuLy8gICAvLyAgIC9cXC50ZXN0XFwuW3RqXXN4PyQvIC8vIC50cywgLnRzeCwgLmpzLCAuanN4XG4vLyAgIC8vIF0sXG4vLyAgIGltcG9ydHM6IFtcbi8vICAgICBcInZpdGVzdFwiXG4vLyAgIF1cbi8vIH0pXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1ha2VDb25maWcoZGlyTmFtZT86IHN0cmluZykge1xuICBjb25zdCBwcmVmaXggPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBcInBhY2thZ2VzXCIpXG4gIGNvbnN0IHBhY2thZ2VzID0gZnMucmVhZGRpclN5bmMocHJlZml4KS5tYXAoZiA9PiBwcmVmaXggKyBcIi9cIiArIGYpLmZpbHRlcihmID0+IGZzLmxzdGF0U3luYyhmKS5pc0RpcmVjdG9yeSgpIClcbiAgY29uc3QgY2ZnID0ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG4gICAgLy9wbHVnaW5zOiBbYXV0b0ltcG9ydF0sXG4gICAgdGVzdDoge1xuICAgICAgaW5jbHVkZTogIFtcIi4vdGVzdC8qKi8qLnRlc3Que2pzLG1qcyxjanMsdHMsbXRzLGN0cyxqc3gsdHN4fVwiXSxcbiAgICAgIHJlcG9ydGVyczogXCJ2ZXJib3NlXCIsXG4gICAgICBnbG9iYWxzOiB0cnVlXG4gICAgfSxcbiAgICByZXNvbHZlOiB7XG4gICAgICBhbGlhczogcGFja2FnZXMucmVkdWNlKChhY2MsIGN1cikgPT4geyAvLyB3b3JrYXJvdW5kIGZvciAvUHJlbHVkZSBpc3N1ZVxuICAgICAgYWNjW0pTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGN1ciArIFwiL3BhY2thZ2UuanNvblwiLCBcInV0Zi04XCIpKS5uYW1lXSA9IHBhdGgucmVzb2x2ZShjdXIsIGN1ci5lbmRzV2l0aChcImNvcmVcIikgPyBcImRpc3RcIiA6IFwic3JjXCIpXG4gICAgICByZXR1cm4gYWNjXG4gICAgfSwgeyB9KSAvLyBcIkBlZmZlY3QtYXBwL2NvcmUvUHJlbHVkZVwiOiBwYXRoLmpvaW4oX19kaXJuYW1lLCBcInBhY2thZ2VzL2NvcmUvc3JjL1ByZWx1ZGUuY29kZS50c1wiKVxuICB9XG4gIH1cbiAgY29uc29sZS5sb2coY2ZnKVxuICByZXR1cm4gY2ZnXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQ0EsU0FBUyxvQkFBb0I7OztBQ0E3QixPQUFPLFVBQVU7QUFDakIsT0FBTyxRQUFRO0FBRmYsSUFBTSxtQ0FBbUM7QUFnQjFCLFNBQVIsV0FBNEIsU0FBa0I7QUFDbkQsUUFBTSxTQUFTLEtBQUssUUFBUSxrQ0FBVyxVQUFVO0FBQ2pELFFBQU0sV0FBVyxHQUFHLFlBQVksTUFBTSxFQUFFLElBQUksT0FBSyxTQUFTLE1BQU0sQ0FBQyxFQUFFLE9BQU8sT0FBSyxHQUFHLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBRTtBQUM3RyxRQUFNLE1BQU07QUFBQTtBQUFBO0FBQUEsSUFHVixNQUFNO0FBQUEsTUFDSixTQUFVLENBQUMsa0RBQWtEO0FBQUEsTUFDN0QsV0FBVztBQUFBLE1BQ1gsU0FBUztBQUFBLElBQ1g7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQLE9BQU8sU0FBUyxPQUFPLENBQUMsS0FBSyxRQUFRO0FBQ3JDLFlBQUksS0FBSyxNQUFNLEdBQUcsYUFBYSxNQUFNLGlCQUFpQixPQUFPLENBQUMsRUFBRSxJQUFJLElBQUksS0FBSyxRQUFRLEtBQUssSUFBSSxTQUFTLE1BQU0sSUFBSSxTQUFTLEtBQUs7QUFDL0gsZUFBTztBQUFBLE1BQ1QsR0FBRyxDQUFFLENBQUM7QUFBQTtBQUFBLElBQ1I7QUFBQSxFQUNBO0FBQ0EsVUFBUSxJQUFJLEdBQUc7QUFDZixTQUFPO0FBQ1Q7OztBRHBDQSxJQUFNQSxvQ0FBbUM7QUFJekMsSUFBTyx3QkFBUSxhQUFhLFdBQVdDLGlDQUFTLENBQUM7IiwKICAibmFtZXMiOiBbIl9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lIiwgIl9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lIl0KfQo=