@effect-app/infra 0.106.2 → 0.107.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 +13 -0
- package/_cjs/api/express/schema/routing.cjs +1 -1
- package/_cjs/api/express/schema/routing.cjs.map +1 -1
- package/_src/api/express/schema/routing.ts +1 -1
- package/dist/api/express/schema/routing.js +1 -1
- package/package.json +4 -4
- package/_src/api/app.ts.bak +0 -125
- package/_src/api/errors.ts.bak +0 -20
- package/_src/api/express/routing.ts.bak +0 -460
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @effect-app/infra
|
|
2
2
|
|
|
3
|
+
## 0.107.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 771d7e6: Fix model name
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [771d7e6]
|
|
12
|
+
- @effect-app/prelude@0.81.0
|
|
13
|
+
- @effect-app/schema@0.74.0
|
|
14
|
+
- @effect-app/infra-adapters@0.67.2
|
|
15
|
+
|
|
3
16
|
## 0.106.2
|
|
4
17
|
|
|
5
18
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routing.cjs","names":["S","_interopRequireWildcard","require","_atlasPlutus","OpenApi","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","asRouteDescriptionAny","arrAsRouteDescriptionAny","arr","map","makeRouteDescriptor","path","method","handler","_tag","makeFromSchema","jsonSchema_","for","jsonSchema","Request","Req","Response","Res_","ResponseOpenApi","Res","extractSchema","Void","makeReqQuerySchema","tsplus_module_2","flatMap","sync","tsplus_module_3","fromNullable","Query","_","match","onNone","tsplus_module_1","none","onSome","some","makeReqHeadersSchema","Headers","makeReqCookieSchema","Cookie","makeReqPathSchema","Path","makeReqBodySchema","Body","makeResSchema","makeParameters","inn","getOrElse","o","isObjectSchema","x","keys","properties","p","schema","required","Boolean","includes","name","in","all","req","
|
|
1
|
+
{"version":3,"file":"routing.cjs","names":["S","_interopRequireWildcard","require","_atlasPlutus","OpenApi","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","asRouteDescriptionAny","arrAsRouteDescriptionAny","arr","map","makeRouteDescriptor","path","method","handler","_tag","makeFromSchema","jsonSchema_","for","jsonSchema","Request","Req","Response","Res_","ResponseOpenApi","Res","extractSchema","Void","makeReqQuerySchema","tsplus_module_2","flatMap","sync","tsplus_module_3","fromNullable","Query","_","match","onNone","tsplus_module_1","none","onSome","some","makeReqHeadersSchema","Headers","makeReqCookieSchema","Cookie","makeReqPathSchema","Path","makeReqBodySchema","Body","makeResSchema","makeParameters","inn","getOrElse","o","isObjectSchema","x","keys","properties","p","schema","required","Boolean","includes","name","in","all","req","Model","reqQuery","reqHeaders","reqBody","reqPath","reqCookie","res","isEmpty","toLowerCase","tags","info","description","summary","operationId","title","parameters","requestBody","getOrUndefined","content","responses","concat","constructor","statusCode","type"],"sources":["../../../../_src/api/express/schema/routing.ts"],"sourcesContent":[null],"mappings":"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"}
|
|
@@ -59,7 +59,7 @@ export function makeFromSchema(e) {
|
|
|
59
59
|
};
|
|
60
60
|
}
|
|
61
61
|
return tsplus_module_2.map(tsplus_module_2.all({
|
|
62
|
-
req: jsonSchema(Req.
|
|
62
|
+
req: jsonSchema(Req.Model),
|
|
63
63
|
reqQuery: makeReqQuerySchema,
|
|
64
64
|
reqHeaders: makeReqHeadersSchema,
|
|
65
65
|
reqBody: makeReqBodySchema,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-app/infra",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.107.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
@@ -19,9 +19,9 @@
|
|
|
19
19
|
"pure-rand": "6.0.4",
|
|
20
20
|
"redlock": "^4.2.0",
|
|
21
21
|
"@effect-app/core": "0.79.1",
|
|
22
|
-
"@effect-app/infra-adapters": "0.67.
|
|
23
|
-
"@effect-app/prelude": "0.
|
|
24
|
-
"@effect-app/schema": "0.
|
|
22
|
+
"@effect-app/infra-adapters": "0.67.2",
|
|
23
|
+
"@effect-app/prelude": "0.81.0",
|
|
24
|
+
"@effect-app/schema": "0.74.0"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@babel/cli": "^7.23.4",
|
package/_src/api/app.ts.bak
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import { flow } from "@effect-app/core/Function"
|
|
3
|
-
import * as S from "@effect-app/schema"
|
|
4
|
-
|
|
5
|
-
import { NotFoundError, UnauthorizedError } from "./errors.js"
|
|
6
|
-
|
|
7
|
-
export function handle<
|
|
8
|
-
TModule extends Record<
|
|
9
|
-
string,
|
|
10
|
-
any // { Class: S.SchemaAny; new (...args: any[]): any } | S.SchemaAny
|
|
11
|
-
>
|
|
12
|
-
>(
|
|
13
|
-
_: TModule & { ResponseOpenApi?: any },
|
|
14
|
-
adaptResponse?: any
|
|
15
|
-
): <R, E>(
|
|
16
|
-
h: (
|
|
17
|
-
r: InstanceType<
|
|
18
|
-
S.GetRequest<TModule> extends { new(...args: any[]): any } ? S.GetRequest<TModule>
|
|
19
|
-
: never
|
|
20
|
-
>
|
|
21
|
-
) => Effect<R, E, S.To<Extr<S.GetResponse<TModule>>>>
|
|
22
|
-
) => {
|
|
23
|
-
h: typeof h
|
|
24
|
-
Request: S.GetRequest<TModule>
|
|
25
|
-
Response: S.GetResponse<TModule>
|
|
26
|
-
ResponseOpenApi: any
|
|
27
|
-
} {
|
|
28
|
-
// TODO: Prevent over providing // no strict/shrink yet.
|
|
29
|
-
const Request = S.extractRequest(_)
|
|
30
|
-
const Response = S.extractResponse(_)
|
|
31
|
-
|
|
32
|
-
return <R, E>(
|
|
33
|
-
h: (
|
|
34
|
-
r: InstanceType<
|
|
35
|
-
S.GetRequest<TModule> extends { new(...args: any[]): any } ? S.GetRequest<TModule>
|
|
36
|
-
: never
|
|
37
|
-
>
|
|
38
|
-
) => Effect<R, E, S.To<Extr<S.GetResponse<TModule>>>>
|
|
39
|
-
) => ({
|
|
40
|
-
adaptResponse,
|
|
41
|
-
h,
|
|
42
|
-
Request,
|
|
43
|
-
Response,
|
|
44
|
-
ResponseOpenApi: _.ResponseOpenApi ?? Response
|
|
45
|
-
} as any)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
type Extr<T> = T extends { Class: S.SchemaAny } ? T["Class"]
|
|
49
|
-
: T extends S.SchemaAny ? T
|
|
50
|
-
: never
|
|
51
|
-
|
|
52
|
-
export function accessM_<T, UserId, Err>(
|
|
53
|
-
canAccess: (rsc: T, userId: UserId) => boolean,
|
|
54
|
-
bad: (rsc: T, userId: UserId) => Err
|
|
55
|
-
) {
|
|
56
|
-
return <R, E, A>(
|
|
57
|
-
rsc: T,
|
|
58
|
-
userId: UserId,
|
|
59
|
-
ok: (rsc: T) => Effect<R, E, A>
|
|
60
|
-
): Effect<R, E | Err, A> => {
|
|
61
|
-
if (canAccess(rsc, userId)) {
|
|
62
|
-
return ok(rsc)
|
|
63
|
-
}
|
|
64
|
-
return Effect.fail(bad(rsc, userId))
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export function access_<T, UserId, Err>(
|
|
69
|
-
canAccess: (rsc: T, userId: UserId) => boolean,
|
|
70
|
-
bad: (rsc: T, userId: UserId) => Err
|
|
71
|
-
) {
|
|
72
|
-
const auth = accessM_(canAccess, bad)
|
|
73
|
-
return <A>(rsc: T, userId: UserId, ok: (rsc: T) => A) => auth(rsc, userId, flow(ok, Effect.succeed))
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export function accessM<T, UserId, Err>(
|
|
77
|
-
canAccess: (rsc: T, userId: UserId) => boolean,
|
|
78
|
-
bad: (rsc: T, userId: UserId) => Err
|
|
79
|
-
) {
|
|
80
|
-
return <R, E, A>(userId: UserId, ok: (rsc: T) => Effect<R, E, A>) =>
|
|
81
|
-
(rsc: T): Effect<R, E | Err, A> => {
|
|
82
|
-
if (canAccess(rsc, userId)) {
|
|
83
|
-
return ok(rsc)
|
|
84
|
-
}
|
|
85
|
-
return Effect.fail(bad(rsc, userId))
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export function access<T, UserId, Err>(
|
|
90
|
-
canAccess: (rsc: T, userId: UserId) => boolean,
|
|
91
|
-
bad: (rsc: T, userId: UserId) => Err
|
|
92
|
-
) {
|
|
93
|
-
const auth = accessM(canAccess, bad)
|
|
94
|
-
return <A>(userId: UserId, ok: (rsc: T) => A) => auth(userId, flow(ok, Effect.succeed))
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
export function makeAuthorize<T, UserId>(
|
|
98
|
-
canAccess: (rsc: T, userId: UserId) => boolean,
|
|
99
|
-
type: string,
|
|
100
|
-
getId: (t: T) => string | number
|
|
101
|
-
) {
|
|
102
|
-
return {
|
|
103
|
-
access_: access_(canAccess, () => new UnauthorizedError()),
|
|
104
|
-
access: access(canAccess, () => new UnauthorizedError()),
|
|
105
|
-
accessM_: accessM_(canAccess, () => new UnauthorizedError()),
|
|
106
|
-
accessM: accessM(canAccess, () => new UnauthorizedError()),
|
|
107
|
-
|
|
108
|
-
accessOrHide_: access_(
|
|
109
|
-
canAccess,
|
|
110
|
-
r => new NotFoundError(type, getId(r).toString())
|
|
111
|
-
),
|
|
112
|
-
accessOrHide: access(
|
|
113
|
-
canAccess,
|
|
114
|
-
r => new NotFoundError(type, getId(r).toString())
|
|
115
|
-
),
|
|
116
|
-
accessOrHideM_: accessM_(
|
|
117
|
-
canAccess,
|
|
118
|
-
r => new NotFoundError(type, getId(r).toString())
|
|
119
|
-
),
|
|
120
|
-
accessOrHideM: accessM(
|
|
121
|
-
canAccess,
|
|
122
|
-
r => new NotFoundError(type, getId(r).toString())
|
|
123
|
-
)
|
|
124
|
-
}
|
|
125
|
-
}
|
package/_src/api/errors.ts.bak
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
export class NotFoundError {
|
|
2
|
-
public readonly _tag = "NotFoundError"
|
|
3
|
-
public readonly message: string
|
|
4
|
-
constructor(type: string, id: string) {
|
|
5
|
-
this.message = `Didn't find ${type}#${id}`
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export class ValidationError {
|
|
10
|
-
public readonly _tag = "ValidationError"
|
|
11
|
-
constructor(public readonly errors: ReadonlyArray<unknown>) {}
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export class NotLoggedInError {
|
|
15
|
-
public readonly _tag = "NotLoggedInError"
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export class UnauthorizedError {
|
|
19
|
-
public readonly _tag = "UnauthorizedError"
|
|
20
|
-
}
|
|
@@ -1,460 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/ban-types */
|
|
2
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
-
import * as S from "@effect-app/schema"
|
|
4
|
-
import { Encoder, extractSchema } from "@effect-app/schema"
|
|
5
|
-
import type express from "express"
|
|
6
|
-
|
|
7
|
-
import * as Ex from "@effect-app/infra-adapters/express"
|
|
8
|
-
import type { NotFoundError, NotLoggedInError, UnauthorizedError, ValidationError } from "../../../errors.js"
|
|
9
|
-
import type {
|
|
10
|
-
Encode,
|
|
11
|
-
Middleware,
|
|
12
|
-
MiddlewareHandler,
|
|
13
|
-
RequestHandler,
|
|
14
|
-
RequestHandlerOptRes,
|
|
15
|
-
RequestParsers
|
|
16
|
-
} from "./schema/requestHandler.js"
|
|
17
|
-
import { makeRequestParsers, parseRequestParams, respondSuccess } from "./schema/requestHandler.js"
|
|
18
|
-
import { makeRouteDescriptor } from "./schema/routing.js"
|
|
19
|
-
|
|
20
|
-
/*
|
|
21
|
-
An app should take ownership over these
|
|
22
|
-
*/
|
|
23
|
-
export type SupportedErrors =
|
|
24
|
-
| ValidationError
|
|
25
|
-
| NotFoundError
|
|
26
|
-
| NotLoggedInError
|
|
27
|
-
| UnauthorizedError
|
|
28
|
-
|
|
29
|
-
export function match<
|
|
30
|
-
R,
|
|
31
|
-
PathA,
|
|
32
|
-
CookieA,
|
|
33
|
-
QueryA,
|
|
34
|
-
BodyA,
|
|
35
|
-
HeaderA,
|
|
36
|
-
ReqA extends {} & PathA & QueryA & BodyA,
|
|
37
|
-
ResA,
|
|
38
|
-
R2 = never,
|
|
39
|
-
PR = never
|
|
40
|
-
>(
|
|
41
|
-
r: RequestHandler<
|
|
42
|
-
R,
|
|
43
|
-
PathA,
|
|
44
|
-
CookieA,
|
|
45
|
-
QueryA,
|
|
46
|
-
BodyA,
|
|
47
|
-
HeaderA,
|
|
48
|
-
ReqA,
|
|
49
|
-
ResA,
|
|
50
|
-
SupportedErrors
|
|
51
|
-
>,
|
|
52
|
-
mw?: Middleware<
|
|
53
|
-
R,
|
|
54
|
-
PathA,
|
|
55
|
-
CookieA,
|
|
56
|
-
QueryA,
|
|
57
|
-
BodyA,
|
|
58
|
-
HeaderA,
|
|
59
|
-
ReqA,
|
|
60
|
-
ResA,
|
|
61
|
-
SupportedErrors,
|
|
62
|
-
R2,
|
|
63
|
-
PR
|
|
64
|
-
>
|
|
65
|
-
) {
|
|
66
|
-
let h: MiddlewareHandler<SupportedErrors, R2, PR> | undefined = undefined
|
|
67
|
-
if (mw) {
|
|
68
|
-
const { handle, handler } = mw(r)
|
|
69
|
-
r = handler
|
|
70
|
-
h = handle
|
|
71
|
-
}
|
|
72
|
-
return Ex.match(r.Request.method.toLowerCase() as any)(
|
|
73
|
-
r.Request.path.split("?")[0],
|
|
74
|
-
makeRequestHandler<R, PathA, CookieA, QueryA, BodyA, HeaderA, ReqA, ResA, R2, PR>(
|
|
75
|
-
r,
|
|
76
|
-
h
|
|
77
|
-
)
|
|
78
|
-
).zipRight(
|
|
79
|
-
Effect(makeRouteDescriptor(r.Request.path, r.Request.method, r))
|
|
80
|
-
)
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export function makeRequestHandler<
|
|
84
|
-
R,
|
|
85
|
-
PathA,
|
|
86
|
-
CookieA,
|
|
87
|
-
QueryA,
|
|
88
|
-
BodyA,
|
|
89
|
-
HeaderA,
|
|
90
|
-
ReqA extends {} & PathA & QueryA & BodyA,
|
|
91
|
-
ResA = void,
|
|
92
|
-
R2 = never,
|
|
93
|
-
PR = never
|
|
94
|
-
>(
|
|
95
|
-
handle: RequestHandlerOptRes<
|
|
96
|
-
R | PR,
|
|
97
|
-
PathA,
|
|
98
|
-
CookieA,
|
|
99
|
-
QueryA,
|
|
100
|
-
BodyA,
|
|
101
|
-
HeaderA,
|
|
102
|
-
ReqA,
|
|
103
|
-
ResA,
|
|
104
|
-
SupportedErrors
|
|
105
|
-
>,
|
|
106
|
-
h?: (req: express.Request, res: express.Response) => Layer<R2, SupportedErrors, PR>
|
|
107
|
-
) {
|
|
108
|
-
const { Request, Response } = handle
|
|
109
|
-
const res = Response ? extractSchema(Response as any) : S.Void
|
|
110
|
-
const encodeResponse = handle.adaptResponse
|
|
111
|
-
? (req: ReqA) => Encoder.for(handle.adaptResponse(req))
|
|
112
|
-
: () => Encoder.for(res)
|
|
113
|
-
|
|
114
|
-
return handleRequest<
|
|
115
|
-
R,
|
|
116
|
-
PathA,
|
|
117
|
-
CookieA,
|
|
118
|
-
QueryA,
|
|
119
|
-
BodyA,
|
|
120
|
-
HeaderA,
|
|
121
|
-
ResA,
|
|
122
|
-
never,
|
|
123
|
-
ReqA,
|
|
124
|
-
R2,
|
|
125
|
-
PR
|
|
126
|
-
>(makeRequestParsers(Request), encodeResponse as any, handle.h, h)
|
|
127
|
-
}
|
|
128
|
-
export function handleRequest<
|
|
129
|
-
R,
|
|
130
|
-
PathA,
|
|
131
|
-
CookieA,
|
|
132
|
-
QueryA,
|
|
133
|
-
BodyA,
|
|
134
|
-
HeaderA,
|
|
135
|
-
ResA,
|
|
136
|
-
ResE,
|
|
137
|
-
ReqA extends {} & PathA & BodyA & QueryA,
|
|
138
|
-
R2 = never,
|
|
139
|
-
PR = never
|
|
140
|
-
>(
|
|
141
|
-
requestParsers: RequestParsers<PathA, CookieA, QueryA, BodyA, HeaderA>,
|
|
142
|
-
encodeResponse: (r: ReqA) => Encode<ResA, ResE>,
|
|
143
|
-
handle: (r: ReqA) => Effect<R | PR, SupportedErrors, ResA>,
|
|
144
|
-
h?: (req: express.Request, res: express.Response) => Layer<R2, SupportedErrors, PR>
|
|
145
|
-
) {
|
|
146
|
-
const parseRequest = parseRequestParams(requestParsers)
|
|
147
|
-
const respond = respondSuccess(encodeResponse)
|
|
148
|
-
return (req: express.Request, res: express.Response) =>
|
|
149
|
-
parseRequest(req)
|
|
150
|
-
.map(({ body, path, query }) => {
|
|
151
|
-
const hn = {
|
|
152
|
-
...body.value,
|
|
153
|
-
...query.value,
|
|
154
|
-
...path.value
|
|
155
|
-
} as ReqA
|
|
156
|
-
return hn
|
|
157
|
-
})
|
|
158
|
-
.flatMap(inp => {
|
|
159
|
-
const hn = handle(inp)
|
|
160
|
-
const r = h ? hn.provide(h(req, res)) : hn
|
|
161
|
-
return (
|
|
162
|
-
r as never as Effect<Exclude<R | R2, PR>, SupportedErrors, ResA>
|
|
163
|
-
).flatMap(outp => respond(inp, res)(outp))
|
|
164
|
-
})
|
|
165
|
-
.catchTag("ValidationError", err =>
|
|
166
|
-
Effect.sync(() => {
|
|
167
|
-
res.status(400).send(err.errors)
|
|
168
|
-
}))
|
|
169
|
-
.catchTag("NotFoundError", err =>
|
|
170
|
-
Effect.sync(() => {
|
|
171
|
-
res.status(404).send(err)
|
|
172
|
-
}))
|
|
173
|
-
.catchTag("NotLoggedInError", err =>
|
|
174
|
-
Effect.sync(() => {
|
|
175
|
-
res.status(401).send(err)
|
|
176
|
-
}))
|
|
177
|
-
.catchTag("UnauthorizedError", err =>
|
|
178
|
-
Effect.sync(() => {
|
|
179
|
-
res.status(403).send(err)
|
|
180
|
-
}))
|
|
181
|
-
// final catch all; expecting never so that unhandled known errors will show up
|
|
182
|
-
.catchAll((err: never) =>
|
|
183
|
-
Effect(
|
|
184
|
-
console.error(
|
|
185
|
-
"Program error, compiler probably silenced, got an unsupported Error in Error Channel of Effect",
|
|
186
|
-
err
|
|
187
|
-
)
|
|
188
|
-
).flatMap(Effect.die)
|
|
189
|
-
)
|
|
190
|
-
// .tapCause(() => Effect(res.status(500).send()))
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// Additional convenience helpers
|
|
194
|
-
|
|
195
|
-
export function get<
|
|
196
|
-
R,
|
|
197
|
-
PathA,
|
|
198
|
-
CookieA,
|
|
199
|
-
QueryA,
|
|
200
|
-
BodyA,
|
|
201
|
-
HeaderA,
|
|
202
|
-
ReqA extends {} & PathA & QueryA & BodyA,
|
|
203
|
-
ResA,
|
|
204
|
-
R2 = never,
|
|
205
|
-
PR = never
|
|
206
|
-
>(
|
|
207
|
-
path: string,
|
|
208
|
-
r: RequestHandler<
|
|
209
|
-
R,
|
|
210
|
-
PathA,
|
|
211
|
-
CookieA,
|
|
212
|
-
QueryA,
|
|
213
|
-
BodyA,
|
|
214
|
-
HeaderA,
|
|
215
|
-
ReqA,
|
|
216
|
-
ResA,
|
|
217
|
-
SupportedErrors
|
|
218
|
-
>,
|
|
219
|
-
mw?: Middleware<
|
|
220
|
-
R,
|
|
221
|
-
PathA,
|
|
222
|
-
CookieA,
|
|
223
|
-
QueryA,
|
|
224
|
-
BodyA,
|
|
225
|
-
HeaderA,
|
|
226
|
-
ReqA,
|
|
227
|
-
ResA,
|
|
228
|
-
SupportedErrors,
|
|
229
|
-
R2,
|
|
230
|
-
PR
|
|
231
|
-
>
|
|
232
|
-
) {
|
|
233
|
-
let h: MiddlewareHandler<SupportedErrors, R2, PR> | undefined = undefined
|
|
234
|
-
if (mw) {
|
|
235
|
-
const { handle, handler } = mw(r)
|
|
236
|
-
r = handler
|
|
237
|
-
h = handle
|
|
238
|
-
}
|
|
239
|
-
return Ex.get(
|
|
240
|
-
path,
|
|
241
|
-
makeRequestHandler<R, PathA, CookieA, QueryA, BodyA, HeaderA, ReqA, ResA, R2, PR>(
|
|
242
|
-
r,
|
|
243
|
-
h
|
|
244
|
-
)
|
|
245
|
-
).zipRight(Effect(makeRouteDescriptor(path, "GET", r)))
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
export function post<
|
|
249
|
-
R,
|
|
250
|
-
PathA,
|
|
251
|
-
CookieA,
|
|
252
|
-
QueryA,
|
|
253
|
-
BodyA,
|
|
254
|
-
HeaderA,
|
|
255
|
-
ReqA extends {} & PathA & QueryA & BodyA,
|
|
256
|
-
ResA = void,
|
|
257
|
-
R2 = never,
|
|
258
|
-
PR = never
|
|
259
|
-
>(
|
|
260
|
-
path: string,
|
|
261
|
-
r: RequestHandler<
|
|
262
|
-
R,
|
|
263
|
-
PathA,
|
|
264
|
-
CookieA,
|
|
265
|
-
QueryA,
|
|
266
|
-
BodyA,
|
|
267
|
-
HeaderA,
|
|
268
|
-
ReqA,
|
|
269
|
-
ResA,
|
|
270
|
-
SupportedErrors
|
|
271
|
-
>,
|
|
272
|
-
mw?: Middleware<
|
|
273
|
-
R,
|
|
274
|
-
PathA,
|
|
275
|
-
CookieA,
|
|
276
|
-
QueryA,
|
|
277
|
-
BodyA,
|
|
278
|
-
HeaderA,
|
|
279
|
-
ReqA,
|
|
280
|
-
ResA,
|
|
281
|
-
SupportedErrors,
|
|
282
|
-
R2,
|
|
283
|
-
PR
|
|
284
|
-
>
|
|
285
|
-
) {
|
|
286
|
-
let h: MiddlewareHandler<SupportedErrors, R2, PR> | undefined = undefined
|
|
287
|
-
if (mw) {
|
|
288
|
-
const { handle, handler } = mw(r)
|
|
289
|
-
r = handler
|
|
290
|
-
h = handle
|
|
291
|
-
}
|
|
292
|
-
return Ex.post(
|
|
293
|
-
path,
|
|
294
|
-
makeRequestHandler<R, PathA, CookieA, QueryA, BodyA, HeaderA, ReqA, ResA, R2, PR>(
|
|
295
|
-
r,
|
|
296
|
-
h
|
|
297
|
-
)
|
|
298
|
-
).zipRight(Effect(makeRouteDescriptor(path, "POST", r)))
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
export function put<
|
|
302
|
-
R,
|
|
303
|
-
PathA,
|
|
304
|
-
CookieA,
|
|
305
|
-
QueryA,
|
|
306
|
-
BodyA,
|
|
307
|
-
HeaderA,
|
|
308
|
-
ReqA extends {} & PathA & QueryA & BodyA,
|
|
309
|
-
ResA = void,
|
|
310
|
-
R2 = never,
|
|
311
|
-
PR = never
|
|
312
|
-
>(
|
|
313
|
-
path: string,
|
|
314
|
-
r: RequestHandler<
|
|
315
|
-
R,
|
|
316
|
-
PathA,
|
|
317
|
-
CookieA,
|
|
318
|
-
QueryA,
|
|
319
|
-
BodyA,
|
|
320
|
-
HeaderA,
|
|
321
|
-
ReqA,
|
|
322
|
-
ResA,
|
|
323
|
-
SupportedErrors
|
|
324
|
-
>,
|
|
325
|
-
mw?: Middleware<
|
|
326
|
-
R,
|
|
327
|
-
PathA,
|
|
328
|
-
CookieA,
|
|
329
|
-
QueryA,
|
|
330
|
-
BodyA,
|
|
331
|
-
HeaderA,
|
|
332
|
-
ReqA,
|
|
333
|
-
ResA,
|
|
334
|
-
SupportedErrors,
|
|
335
|
-
R2,
|
|
336
|
-
PR
|
|
337
|
-
>
|
|
338
|
-
) {
|
|
339
|
-
let h: MiddlewareHandler<SupportedErrors, R2, PR> | undefined = undefined
|
|
340
|
-
if (mw) {
|
|
341
|
-
const { handle, handler } = mw(r)
|
|
342
|
-
r = handler
|
|
343
|
-
h = handle
|
|
344
|
-
}
|
|
345
|
-
return Ex.put(
|
|
346
|
-
path,
|
|
347
|
-
makeRequestHandler<R, PathA, CookieA, QueryA, BodyA, HeaderA, ReqA, ResA, R2, PR>(
|
|
348
|
-
r,
|
|
349
|
-
h
|
|
350
|
-
)
|
|
351
|
-
).zipRight(Effect(makeRouteDescriptor(path, "PUT", r)))
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
export function patch<
|
|
355
|
-
R,
|
|
356
|
-
PathA,
|
|
357
|
-
CookieA,
|
|
358
|
-
QueryA,
|
|
359
|
-
BodyA,
|
|
360
|
-
HeaderA,
|
|
361
|
-
ReqA extends {} & PathA & QueryA & BodyA,
|
|
362
|
-
ResA = void,
|
|
363
|
-
R2 = never,
|
|
364
|
-
PR = never
|
|
365
|
-
>(
|
|
366
|
-
path: string,
|
|
367
|
-
r: RequestHandler<
|
|
368
|
-
R,
|
|
369
|
-
PathA,
|
|
370
|
-
CookieA,
|
|
371
|
-
QueryA,
|
|
372
|
-
BodyA,
|
|
373
|
-
HeaderA,
|
|
374
|
-
ReqA,
|
|
375
|
-
ResA,
|
|
376
|
-
SupportedErrors
|
|
377
|
-
>,
|
|
378
|
-
mw?: Middleware<
|
|
379
|
-
R,
|
|
380
|
-
PathA,
|
|
381
|
-
CookieA,
|
|
382
|
-
QueryA,
|
|
383
|
-
BodyA,
|
|
384
|
-
HeaderA,
|
|
385
|
-
ReqA,
|
|
386
|
-
ResA,
|
|
387
|
-
SupportedErrors,
|
|
388
|
-
R2,
|
|
389
|
-
PR
|
|
390
|
-
>
|
|
391
|
-
) {
|
|
392
|
-
let h: MiddlewareHandler<SupportedErrors, R2, PR> | undefined = undefined
|
|
393
|
-
if (mw) {
|
|
394
|
-
const { handle, handler } = mw(r)
|
|
395
|
-
r = handler
|
|
396
|
-
h = handle
|
|
397
|
-
}
|
|
398
|
-
return Ex.patch(
|
|
399
|
-
path,
|
|
400
|
-
makeRequestHandler<R, PathA, CookieA, QueryA, BodyA, HeaderA, ReqA, ResA, R2, PR>(
|
|
401
|
-
r,
|
|
402
|
-
h
|
|
403
|
-
)
|
|
404
|
-
).zipRight(Effect(makeRouteDescriptor(path, "PATCH", r)))
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
function del<
|
|
408
|
-
R,
|
|
409
|
-
PathA,
|
|
410
|
-
CookieA,
|
|
411
|
-
QueryA,
|
|
412
|
-
BodyA,
|
|
413
|
-
HeaderA,
|
|
414
|
-
ReqA extends {} & PathA & QueryA & BodyA,
|
|
415
|
-
ResA = void,
|
|
416
|
-
R2 = never,
|
|
417
|
-
PR = never
|
|
418
|
-
>(
|
|
419
|
-
path: string,
|
|
420
|
-
r: RequestHandler<
|
|
421
|
-
R,
|
|
422
|
-
PathA,
|
|
423
|
-
CookieA,
|
|
424
|
-
QueryA,
|
|
425
|
-
BodyA,
|
|
426
|
-
HeaderA,
|
|
427
|
-
ReqA,
|
|
428
|
-
ResA,
|
|
429
|
-
SupportedErrors
|
|
430
|
-
>,
|
|
431
|
-
mw?: Middleware<
|
|
432
|
-
R,
|
|
433
|
-
PathA,
|
|
434
|
-
CookieA,
|
|
435
|
-
QueryA,
|
|
436
|
-
BodyA,
|
|
437
|
-
HeaderA,
|
|
438
|
-
ReqA,
|
|
439
|
-
ResA,
|
|
440
|
-
SupportedErrors,
|
|
441
|
-
R2,
|
|
442
|
-
PR
|
|
443
|
-
>
|
|
444
|
-
) {
|
|
445
|
-
let h: MiddlewareHandler<SupportedErrors, R2, PR> | undefined = undefined
|
|
446
|
-
if (mw) {
|
|
447
|
-
const { handle, handler } = mw(r)
|
|
448
|
-
r = handler
|
|
449
|
-
h = handle
|
|
450
|
-
}
|
|
451
|
-
return Ex.delete(
|
|
452
|
-
path,
|
|
453
|
-
makeRequestHandler<R, PathA, CookieA, QueryA, BodyA, HeaderA, ReqA, ResA, R2, PR>(
|
|
454
|
-
r,
|
|
455
|
-
h
|
|
456
|
-
)
|
|
457
|
-
).zipRight(Effect(makeRouteDescriptor(path, "DELETE", r)))
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
export { del as delete }
|