@effect-app/infra 1.24.2 → 1.25.1
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 -0
- package/_cjs/api/routing2/DynamicMiddleware.cjs +41 -0
- package/_cjs/api/routing2/DynamicMiddleware.cjs.map +1 -0
- package/_cjs/api/routing2.cjs +112 -0
- package/_cjs/api/routing2.cjs.map +1 -0
- package/dist/api/routing2/DynamicMiddleware.d.ts +79 -0
- package/dist/api/routing2/DynamicMiddleware.d.ts.map +1 -0
- package/dist/api/routing2/DynamicMiddleware.js +30 -0
- package/dist/api/routing2.d.ts +79 -0
- package/dist/api/routing2.d.ts.map +1 -0
- package/dist/api/routing2.js +103 -0
- package/dist/services/QueueMaker/SQLQueue.d.ts +1 -1
- package/package.json +26 -4
- package/src/api/routing2/DynamicMiddleware.ts +211 -0
- package/src/api/routing2.ts +338 -0
- package/vitest.config.ts.timestamp-1711656440838-19c636fe320df.mjs +0 -0
- package/vitest.config.ts.timestamp-1711724061890-6ecedb0a07fdd.mjs +0 -0
- package/vitest.config.ts.timestamp-1711743489537-da8d9e5f66c9f.mjs +0 -0
- package/vitest.config.ts.timestamp-1711744615239-dcf257a844e01.mjs +0 -37
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# @effect-app/infra
|
|
2
2
|
|
|
3
|
+
## 1.25.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [b670052]
|
|
8
|
+
- effect-app@1.18.0
|
|
9
|
+
- @effect-app/infra-adapters@1.12.2
|
|
10
|
+
|
|
11
|
+
## 1.25.0
|
|
12
|
+
|
|
13
|
+
### Minor Changes
|
|
14
|
+
|
|
15
|
+
- 0fa59b0: feat: add routing2 based on @effect/rpc
|
|
16
|
+
|
|
3
17
|
## 1.24.2
|
|
4
18
|
|
|
5
19
|
### 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
|
|
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.
|
|
3
|
+
"version": "1.25.1",
|
|
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",
|
|
@@ -18,10 +20,10 @@
|
|
|
18
20
|
"proper-lockfile": "^4.1.2",
|
|
19
21
|
"pure-rand": "6.1.0",
|
|
20
22
|
"redlock": "^4.2.0",
|
|
23
|
+
"@effect-app/infra-adapters": "1.12.2",
|
|
21
24
|
"@effect-app/core": "1.10.2",
|
|
22
|
-
"effect-app": "1.
|
|
23
|
-
"@effect-app/schema": "1.12.2"
|
|
24
|
-
"@effect-app/infra-adapters": "1.12.1"
|
|
25
|
+
"effect-app": "1.18.0",
|
|
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
|
+
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -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=
|