@effect/platform 0.62.5 → 0.63.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/HttpApi/package.json +6 -0
- package/HttpApiBuilder/package.json +6 -0
- package/HttpApiClient/package.json +6 -0
- package/HttpApiEndpoint/package.json +6 -0
- package/HttpApiError/package.json +6 -0
- package/HttpApiGroup/package.json +6 -0
- package/HttpApiSchema/package.json +6 -0
- package/HttpApiSecurity/package.json +6 -0
- package/HttpApiSwagger/package.json +6 -0
- package/OpenApi/package.json +6 -0
- package/README.md +863 -302
- package/dist/cjs/HttpApi.js +168 -0
- package/dist/cjs/HttpApi.js.map +1 -0
- package/dist/cjs/HttpApiBuilder.js +471 -0
- package/dist/cjs/HttpApiBuilder.js.map +1 -0
- package/dist/cjs/HttpApiClient.js +134 -0
- package/dist/cjs/HttpApiClient.js.map +1 -0
- package/dist/cjs/HttpApiEndpoint.js +181 -0
- package/dist/cjs/HttpApiEndpoint.js.map +1 -0
- package/dist/cjs/HttpApiError.js +69 -0
- package/dist/cjs/HttpApiError.js.map +1 -0
- package/dist/cjs/HttpApiGroup.js +151 -0
- package/dist/cjs/HttpApiGroup.js.map +1 -0
- package/dist/cjs/HttpApiSchema.js +241 -0
- package/dist/cjs/HttpApiSchema.js.map +1 -0
- package/dist/cjs/HttpApiSecurity.js +83 -0
- package/dist/cjs/HttpApiSecurity.js.map +1 -0
- package/dist/cjs/HttpApiSwagger.js +50 -0
- package/dist/cjs/HttpApiSwagger.js.map +1 -0
- package/dist/cjs/HttpMethod.js +1 -1
- package/dist/cjs/HttpMethod.js.map +1 -1
- package/dist/cjs/HttpRouter.js +6 -1
- package/dist/cjs/HttpRouter.js.map +1 -1
- package/dist/cjs/OpenApi.js +317 -0
- package/dist/cjs/OpenApi.js.map +1 -0
- package/dist/cjs/index.js +21 -1
- package/dist/cjs/internal/apiSwagger.js +2 -0
- package/dist/cjs/internal/apiSwagger.js.map +1 -0
- package/dist/cjs/internal/httpRouter.js +6 -1
- package/dist/cjs/internal/httpRouter.js.map +1 -1
- package/dist/cjs/internal/multipart.js +5 -1
- package/dist/cjs/internal/multipart.js.map +1 -1
- package/dist/dts/HttpApi.d.ts +156 -0
- package/dist/dts/HttpApi.d.ts.map +1 -0
- package/dist/dts/HttpApiBuilder.d.ts +296 -0
- package/dist/dts/HttpApiBuilder.d.ts.map +1 -0
- package/dist/dts/HttpApiClient.d.ts +31 -0
- package/dist/dts/HttpApiClient.d.ts.map +1 -0
- package/dist/dts/HttpApiEndpoint.d.ts +350 -0
- package/dist/dts/HttpApiEndpoint.d.ts.map +1 -0
- package/dist/dts/HttpApiError.d.ts +70 -0
- package/dist/dts/HttpApiError.d.ts.map +1 -0
- package/dist/dts/HttpApiGroup.d.ts +196 -0
- package/dist/dts/HttpApiGroup.d.ts.map +1 -0
- package/dist/dts/HttpApiSchema.d.ts +223 -0
- package/dist/dts/HttpApiSchema.d.ts.map +1 -0
- package/dist/dts/HttpApiSecurity.d.ts +122 -0
- package/dist/dts/HttpApiSecurity.d.ts.map +1 -0
- package/dist/dts/HttpApiSwagger.d.ts +10 -0
- package/dist/dts/HttpApiSwagger.d.ts.map +1 -0
- package/dist/dts/HttpMethod.d.ts +16 -0
- package/dist/dts/HttpMethod.d.ts.map +1 -1
- package/dist/dts/HttpRouter.d.ts +8 -0
- package/dist/dts/HttpRouter.d.ts.map +1 -1
- package/dist/dts/HttpServerResponse.d.ts +3 -3
- package/dist/dts/HttpServerResponse.d.ts.map +1 -1
- package/dist/dts/OpenApi.d.ts +348 -0
- package/dist/dts/OpenApi.d.ts.map +1 -0
- package/dist/dts/index.d.ts +40 -0
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/internal/apiSwagger.d.ts +2 -0
- package/dist/dts/internal/apiSwagger.d.ts.map +1 -0
- package/dist/dts/internal/httpRouter.d.ts.map +1 -1
- package/dist/esm/HttpApi.js +157 -0
- package/dist/esm/HttpApi.js.map +1 -0
- package/dist/esm/HttpApiBuilder.js +447 -0
- package/dist/esm/HttpApiBuilder.js.map +1 -0
- package/dist/esm/HttpApiClient.js +124 -0
- package/dist/esm/HttpApiClient.js.map +1 -0
- package/dist/esm/HttpApiEndpoint.js +169 -0
- package/dist/esm/HttpApiEndpoint.js.map +1 -0
- package/dist/esm/HttpApiError.js +59 -0
- package/dist/esm/HttpApiError.js.map +1 -0
- package/dist/esm/HttpApiGroup.js +140 -0
- package/dist/esm/HttpApiGroup.js.map +1 -0
- package/dist/esm/HttpApiSchema.js +217 -0
- package/dist/esm/HttpApiSchema.js.map +1 -0
- package/dist/esm/HttpApiSecurity.js +73 -0
- package/dist/esm/HttpApiSecurity.js.map +1 -0
- package/dist/esm/HttpApiSwagger.js +40 -0
- package/dist/esm/HttpApiSwagger.js.map +1 -0
- package/dist/esm/HttpMethod.js +1 -1
- package/dist/esm/HttpMethod.js.map +1 -1
- package/dist/esm/HttpRouter.js +5 -0
- package/dist/esm/HttpRouter.js.map +1 -1
- package/dist/esm/OpenApi.js +299 -0
- package/dist/esm/OpenApi.js.map +1 -0
- package/dist/esm/index.js +40 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal/apiSwagger.js +2 -0
- package/dist/esm/internal/apiSwagger.js.map +1 -0
- package/dist/esm/internal/httpRouter.js +5 -0
- package/dist/esm/internal/httpRouter.js.map +1 -1
- package/dist/esm/internal/multipart.js +5 -1
- package/dist/esm/internal/multipart.js.map +1 -1
- package/package.json +83 -3
- package/src/HttpApi.ts +342 -0
- package/src/HttpApiBuilder.ts +869 -0
- package/src/HttpApiClient.ts +228 -0
- package/src/HttpApiEndpoint.ts +818 -0
- package/src/HttpApiError.ts +113 -0
- package/src/HttpApiGroup.ts +365 -0
- package/src/HttpApiSchema.ts +384 -0
- package/src/HttpApiSecurity.ts +169 -0
- package/src/HttpApiSwagger.ts +46 -0
- package/src/HttpMethod.ts +19 -1
- package/src/HttpRouter.ts +9 -0
- package/src/HttpServerResponse.ts +3 -3
- package/src/OpenApi.ts +665 -0
- package/src/index.ts +50 -0
- package/src/internal/apiSwagger.ts +7 -0
- package/src/internal/httpRouter.ts +9 -0
- package/src/internal/multipart.ts +5 -1
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as AST from "@effect/schema/AST";
|
|
5
|
+
import * as ParseResult from "@effect/schema/ParseResult";
|
|
6
|
+
import * as Schema from "@effect/schema/Schema";
|
|
7
|
+
import * as Chunk from "effect/Chunk";
|
|
8
|
+
import * as Context from "effect/Context";
|
|
9
|
+
import * as Effect from "effect/Effect";
|
|
10
|
+
import * as Encoding from "effect/Encoding";
|
|
11
|
+
import * as FiberRef from "effect/FiberRef";
|
|
12
|
+
import { identity } from "effect/Function";
|
|
13
|
+
import { globalValue } from "effect/GlobalValue";
|
|
14
|
+
import * as Layer from "effect/Layer";
|
|
15
|
+
import * as Option from "effect/Option";
|
|
16
|
+
import { pipeArguments } from "effect/Pipeable";
|
|
17
|
+
import * as Redacted from "effect/Redacted";
|
|
18
|
+
import { unify } from "effect/Unify";
|
|
19
|
+
import * as HttpApi from "./HttpApi.js";
|
|
20
|
+
import * as HttpApiEndpoint from "./HttpApiEndpoint.js";
|
|
21
|
+
import { HttpApiDecodeError } from "./HttpApiError.js";
|
|
22
|
+
import * as HttpApiSchema from "./HttpApiSchema.js";
|
|
23
|
+
import * as HttpApp from "./HttpApp.js";
|
|
24
|
+
import * as HttpMethod from "./HttpMethod.js";
|
|
25
|
+
import * as HttpMiddleware from "./HttpMiddleware.js";
|
|
26
|
+
import * as HttpRouter from "./HttpRouter.js";
|
|
27
|
+
import * as HttpServer from "./HttpServer.js";
|
|
28
|
+
import * as HttpServerRequest from "./HttpServerRequest.js";
|
|
29
|
+
import * as HttpServerResponse from "./HttpServerResponse.js";
|
|
30
|
+
import * as OpenApi from "./OpenApi.js";
|
|
31
|
+
/**
|
|
32
|
+
* The router that the API endpoints are attached to.
|
|
33
|
+
*
|
|
34
|
+
* @since 1.0.0
|
|
35
|
+
* @category router
|
|
36
|
+
*/
|
|
37
|
+
export class Router extends /*#__PURE__*/HttpRouter.Tag("@effect/platform/HttpApiBuilder/Router")() {}
|
|
38
|
+
/**
|
|
39
|
+
* Build an `HttpApp` from an `HttpApi` instance, and serve it using an
|
|
40
|
+
* `HttpServer`.
|
|
41
|
+
*
|
|
42
|
+
* Optionally, you can provide a middleware function that will be applied to
|
|
43
|
+
* the `HttpApp` before serving.
|
|
44
|
+
*
|
|
45
|
+
* @since 1.0.0
|
|
46
|
+
* @category constructors
|
|
47
|
+
*/
|
|
48
|
+
export const serve = middleware => httpApp.pipe(Effect.map(HttpServer.serve(middleware)), Layer.unwrapEffect, Layer.provide(Router.Live));
|
|
49
|
+
/**
|
|
50
|
+
* Construct an `HttpApp` from an `HttpApi` instance.
|
|
51
|
+
*
|
|
52
|
+
* @since 1.0.0
|
|
53
|
+
* @category constructors
|
|
54
|
+
*/
|
|
55
|
+
export const httpApp = /*#__PURE__*/Effect.gen(function* () {
|
|
56
|
+
const api = yield* HttpApi.HttpApi;
|
|
57
|
+
const router = yield* Router.router;
|
|
58
|
+
const apiMiddleware = yield* Effect.serviceOption(Middleware);
|
|
59
|
+
const errorSchema = makeErrorSchema(api);
|
|
60
|
+
const encodeError = Schema.encodeUnknown(errorSchema);
|
|
61
|
+
return router.pipe(apiMiddleware._tag === "Some" ? apiMiddleware.value : identity, Effect.catchAll(error => Effect.matchEffect(encodeError(error), {
|
|
62
|
+
onFailure: () => Effect.die(error),
|
|
63
|
+
onSuccess: Effect.succeed
|
|
64
|
+
})));
|
|
65
|
+
});
|
|
66
|
+
/**
|
|
67
|
+
* Build a root level `Layer` from an `HttpApi` instance.
|
|
68
|
+
*
|
|
69
|
+
* The `Layer` will provide the `HttpApi` service, and will require the
|
|
70
|
+
* implementation for all the `HttpApiGroup`'s contained in the `HttpApi`.
|
|
71
|
+
*
|
|
72
|
+
* The resulting `Layer` can be provided to the `HttpApiBuilder.serve` layer.
|
|
73
|
+
*
|
|
74
|
+
* @since 1.0.0
|
|
75
|
+
* @category constructors
|
|
76
|
+
*/
|
|
77
|
+
export const api = self => Layer.succeed(HttpApi.HttpApi, self);
|
|
78
|
+
/**
|
|
79
|
+
* @since 1.0.0
|
|
80
|
+
* @category handlers
|
|
81
|
+
*/
|
|
82
|
+
export const HandlersTypeId = /*#__PURE__*/Symbol.for("@effect/platform/HttpApiBuilder/Handlers");
|
|
83
|
+
const HandlersProto = {
|
|
84
|
+
[HandlersTypeId]: {
|
|
85
|
+
_Endpoints: identity
|
|
86
|
+
},
|
|
87
|
+
pipe() {
|
|
88
|
+
return pipeArguments(this, arguments);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
const makeHandlers = options => {
|
|
92
|
+
const self = Object.create(HandlersProto);
|
|
93
|
+
self.group = options.group;
|
|
94
|
+
self.handlers = options.handlers;
|
|
95
|
+
return self;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Create a `Layer` that will implement all the endpoints in an `HttpApiGroup`.
|
|
99
|
+
*
|
|
100
|
+
* An unimplemented `Handlers` instance is passed to the `build` function, which
|
|
101
|
+
* you can use to add handlers to the group.
|
|
102
|
+
*
|
|
103
|
+
* You can implement endpoints using the `HttpApiBuilder.handle` api.
|
|
104
|
+
*
|
|
105
|
+
* @since 1.0.0
|
|
106
|
+
* @category handlers
|
|
107
|
+
*/
|
|
108
|
+
export const group = (api, groupName, build) => Router.use(router => Effect.gen(function* () {
|
|
109
|
+
const context = yield* Effect.context();
|
|
110
|
+
const group = Chunk.findFirst(api.groups, group => group.identifier === groupName);
|
|
111
|
+
if (group._tag === "None") {
|
|
112
|
+
throw new Error(`Group "${groupName}" not found in API`);
|
|
113
|
+
}
|
|
114
|
+
const result = build(makeHandlers({
|
|
115
|
+
group: group.value,
|
|
116
|
+
handlers: Chunk.empty()
|
|
117
|
+
}));
|
|
118
|
+
const handlers = Effect.isEffect(result) ? yield* result : result;
|
|
119
|
+
const routes = [];
|
|
120
|
+
for (const item of handlers.handlers) {
|
|
121
|
+
if (item._tag === "Middleware") {
|
|
122
|
+
for (const route of routes) {
|
|
123
|
+
;
|
|
124
|
+
route.handler = item.middleware(route.handler);
|
|
125
|
+
}
|
|
126
|
+
} else {
|
|
127
|
+
routes.push(handlerToRoute(item.endpoint, function (request) {
|
|
128
|
+
return Effect.mapInputContext(item.handler(request), input => Context.merge(context, input));
|
|
129
|
+
}, item.withFullResponse));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
yield* router.concat(HttpRouter.fromIterable(routes));
|
|
133
|
+
}));
|
|
134
|
+
/**
|
|
135
|
+
* Add the implementation for an `HttpApiEndpoint` to a `Handlers` group.
|
|
136
|
+
*
|
|
137
|
+
* @since 1.0.0
|
|
138
|
+
* @category handlers
|
|
139
|
+
*/
|
|
140
|
+
export const handle = (name, handler, options) => self => {
|
|
141
|
+
const o = Chunk.findFirst(self.group.endpoints, endpoint => endpoint.name === name);
|
|
142
|
+
if (o._tag === "None") {
|
|
143
|
+
throw new Error(`Endpoint "${name}" not found in group "${self.group.identifier}"`);
|
|
144
|
+
}
|
|
145
|
+
const endpoint = o.value;
|
|
146
|
+
return makeHandlers({
|
|
147
|
+
group: self.group,
|
|
148
|
+
handlers: Chunk.append(self.handlers, {
|
|
149
|
+
_tag: "Handler",
|
|
150
|
+
endpoint,
|
|
151
|
+
handler,
|
|
152
|
+
withFullResponse: options?.withFullResponse === true
|
|
153
|
+
})
|
|
154
|
+
});
|
|
155
|
+
};
|
|
156
|
+
/**
|
|
157
|
+
* Add `HttpMiddleware` to a `Handlers` group.
|
|
158
|
+
*
|
|
159
|
+
* Any errors are required to have a corresponding schema in the API.
|
|
160
|
+
* You can add middleware errors to an `HttpApiGroup` using the `HttpApiGroup.addError`
|
|
161
|
+
* api.
|
|
162
|
+
*
|
|
163
|
+
* @since 1.0.0
|
|
164
|
+
* @category middleware
|
|
165
|
+
*/
|
|
166
|
+
export const middleware = middleware => self => makeHandlers({
|
|
167
|
+
...self,
|
|
168
|
+
handlers: Chunk.append(self.handlers, {
|
|
169
|
+
_tag: "Middleware",
|
|
170
|
+
middleware
|
|
171
|
+
})
|
|
172
|
+
});
|
|
173
|
+
/**
|
|
174
|
+
* @since 1.0.0
|
|
175
|
+
* @category middleware
|
|
176
|
+
*/
|
|
177
|
+
export class Middleware extends /*#__PURE__*/Context.Tag("@effect/platform/HttpApiBuilder/Middleware")() {}
|
|
178
|
+
const middlewareAdd = middleware => Effect.map(Effect.context(), context => {
|
|
179
|
+
const current = Context.getOption(context, Middleware);
|
|
180
|
+
const withContext = httpApp => Effect.mapInputContext(middleware(httpApp), input => Context.merge(context, input));
|
|
181
|
+
return current._tag === "None" ? withContext : httpApp => withContext(current.value(httpApp));
|
|
182
|
+
});
|
|
183
|
+
const middlewareAddNoContext = middleware => Effect.map(Effect.serviceOption(Middleware), current => {
|
|
184
|
+
return current._tag === "None" ? middleware : httpApp => middleware(current.value(httpApp));
|
|
185
|
+
});
|
|
186
|
+
/**
|
|
187
|
+
* Create an `HttpApi` level middleware `Layer`.
|
|
188
|
+
*
|
|
189
|
+
* @since 1.0.0
|
|
190
|
+
* @category middleware
|
|
191
|
+
*/
|
|
192
|
+
export const middlewareLayer = (...args) => {
|
|
193
|
+
const apiFirst = HttpApi.isHttpApi(args[0]);
|
|
194
|
+
const withContext = apiFirst ? args[2]?.withContext === true : args[1]?.withContext === true;
|
|
195
|
+
const add = withContext ? middlewareAdd : middlewareAddNoContext;
|
|
196
|
+
const middleware = apiFirst ? args[1] : args[0];
|
|
197
|
+
return Effect.isEffect(middleware) ? Layer.effect(Middleware, Effect.flatMap(middleware, add)) : Layer.effect(Middleware, add(middleware));
|
|
198
|
+
};
|
|
199
|
+
/**
|
|
200
|
+
* Create an `HttpApi` level middleware `Layer`, that has a `Scope` provided to
|
|
201
|
+
* the constructor.
|
|
202
|
+
*
|
|
203
|
+
* @since 1.0.0
|
|
204
|
+
* @category middleware
|
|
205
|
+
*/
|
|
206
|
+
export const middlewareLayerScoped = (...args) => {
|
|
207
|
+
const apiFirst = HttpApi.isHttpApi(args[0]);
|
|
208
|
+
const withContext = apiFirst ? args[2]?.withContext === true : args[1]?.withContext === true;
|
|
209
|
+
const add = withContext ? middlewareAdd : middlewareAddNoContext;
|
|
210
|
+
const middleware = apiFirst ? args[1] : args[0];
|
|
211
|
+
return Layer.scoped(Middleware, Effect.flatMap(middleware, add));
|
|
212
|
+
};
|
|
213
|
+
/**
|
|
214
|
+
* A CORS middleware layer that can be provided to the `HttpApiBuilder.serve` layer.
|
|
215
|
+
*
|
|
216
|
+
* @since 1.0.0
|
|
217
|
+
* @category middleware
|
|
218
|
+
*/
|
|
219
|
+
export const middlewareCors = options => middlewareLayer(HttpMiddleware.cors(options));
|
|
220
|
+
/**
|
|
221
|
+
* A middleware that adds an openapi.json endpoint to the API.
|
|
222
|
+
*
|
|
223
|
+
* @since 1.0.0
|
|
224
|
+
* @category middleware
|
|
225
|
+
*/
|
|
226
|
+
export const middlewareOpenApi = options => Router.use(router => Effect.gen(function* () {
|
|
227
|
+
const api = yield* HttpApi.HttpApi;
|
|
228
|
+
const spec = OpenApi.fromApi(api);
|
|
229
|
+
const response = yield* HttpServerResponse.json(spec).pipe(Effect.orDie);
|
|
230
|
+
yield* router.get(options?.path ?? "/openapi.json", Effect.succeed(response));
|
|
231
|
+
}));
|
|
232
|
+
const bearerLen = `Bearer `.length;
|
|
233
|
+
/**
|
|
234
|
+
* @since 1.0.0
|
|
235
|
+
* @category middleware
|
|
236
|
+
*/
|
|
237
|
+
export const securityDecode = self => {
|
|
238
|
+
switch (self._tag) {
|
|
239
|
+
case "Bearer":
|
|
240
|
+
{
|
|
241
|
+
return Effect.map(HttpServerRequest.HttpServerRequest, request => Redacted.make((request.headers.authorization ?? "").slice(bearerLen)));
|
|
242
|
+
}
|
|
243
|
+
case "ApiKey":
|
|
244
|
+
{
|
|
245
|
+
const schema = Schema.Struct({
|
|
246
|
+
[self.key]: Schema.String
|
|
247
|
+
});
|
|
248
|
+
const decode = unify(self.in === "query" ? HttpServerRequest.schemaSearchParams(schema) : self.in === "cookie" ? HttpServerRequest.schemaCookies(schema) : HttpServerRequest.schemaHeaders(schema));
|
|
249
|
+
return Effect.match(decode, {
|
|
250
|
+
onFailure: () => Redacted.make(""),
|
|
251
|
+
onSuccess: match => Redacted.make(match[self.key])
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
case "Basic":
|
|
255
|
+
{
|
|
256
|
+
const empty = {
|
|
257
|
+
username: "",
|
|
258
|
+
password: Redacted.make("")
|
|
259
|
+
};
|
|
260
|
+
return HttpServerRequest.HttpServerRequest.pipe(Effect.flatMap(request => Encoding.decodeBase64String(request.headers.authorization ?? "")), Effect.match({
|
|
261
|
+
onFailure: () => empty,
|
|
262
|
+
onSuccess: header => {
|
|
263
|
+
const parts = header.split(":");
|
|
264
|
+
if (parts.length !== 2) {
|
|
265
|
+
return empty;
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
username: parts[0],
|
|
269
|
+
password: Redacted.make(parts[1])
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
}));
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
/**
|
|
277
|
+
* Set a cookie from an `HttpApiSecurity.HttpApiKey` instance.
|
|
278
|
+
*
|
|
279
|
+
* You can use this api before returning a response from an endpoint handler.
|
|
280
|
+
*
|
|
281
|
+
* ```ts
|
|
282
|
+
* ApiBuilder.handle(
|
|
283
|
+
* "authenticate",
|
|
284
|
+
* (_) => ApiBuilder.securitySetCookie(security, "secret123")
|
|
285
|
+
* )
|
|
286
|
+
* ```
|
|
287
|
+
*
|
|
288
|
+
* @since 1.0.0
|
|
289
|
+
* @category middleware
|
|
290
|
+
*/
|
|
291
|
+
export const securitySetCookie = (self, value, options) => {
|
|
292
|
+
const stringValue = typeof value === "string" ? value : Redacted.value(value);
|
|
293
|
+
return HttpApp.appendPreResponseHandler((_req, response) => Effect.orDie(HttpServerResponse.setCookie(response, self.key, stringValue, {
|
|
294
|
+
secure: true,
|
|
295
|
+
httpOnly: true,
|
|
296
|
+
...options
|
|
297
|
+
})));
|
|
298
|
+
};
|
|
299
|
+
/**
|
|
300
|
+
* Make a middleware from an `HttpApiSecurity` instance, that can be used when
|
|
301
|
+
* constructing a `Handlers` group.
|
|
302
|
+
*
|
|
303
|
+
* @since 1.0.0
|
|
304
|
+
* @category middleware
|
|
305
|
+
* @example
|
|
306
|
+
* import { HttpApiBuilder, HttpApiSecurity } from "@effect/platform"
|
|
307
|
+
* import { Schema } from "@effect/schema"
|
|
308
|
+
* import { Context, Effect, Redacted } from "effect"
|
|
309
|
+
*
|
|
310
|
+
* class User extends Schema.Class<User>("User")({
|
|
311
|
+
* id: Schema.Number
|
|
312
|
+
* }) {}
|
|
313
|
+
*
|
|
314
|
+
* class CurrentUser extends Context.Tag("CurrentUser")<CurrentUser, User>() {}
|
|
315
|
+
*
|
|
316
|
+
* class Accounts extends Context.Tag("Accounts")<Accounts, {
|
|
317
|
+
* readonly findUserByAccessToken: (accessToken: string) => Effect.Effect<User>
|
|
318
|
+
* }>() {}
|
|
319
|
+
*
|
|
320
|
+
* const securityMiddleware = Effect.gen(function*() {
|
|
321
|
+
* const accounts = yield* Accounts
|
|
322
|
+
* return HttpApiBuilder.middlewareSecurity(
|
|
323
|
+
* HttpApiSecurity.bearer,
|
|
324
|
+
* CurrentUser,
|
|
325
|
+
* (token) => accounts.findUserByAccessToken(Redacted.value(token))
|
|
326
|
+
* )
|
|
327
|
+
* })
|
|
328
|
+
*/
|
|
329
|
+
export const middlewareSecurity = (self, tag, f) => middleware(Effect.provideServiceEffect(tag, Effect.flatMap(securityDecode(self), f)));
|
|
330
|
+
/**
|
|
331
|
+
* Make a middleware from an `HttpApiSecurity` instance, that can be used when
|
|
332
|
+
* constructing a `Handlers` group.
|
|
333
|
+
*
|
|
334
|
+
* This version does not supply any context to the handlers.
|
|
335
|
+
*
|
|
336
|
+
* @since 1.0.0
|
|
337
|
+
* @category middleware
|
|
338
|
+
*/
|
|
339
|
+
export const middlewareSecurityVoid = (self, f) => middleware(httpApp => securityDecode(self).pipe(Effect.flatMap(f), Effect.zipRight(httpApp)));
|
|
340
|
+
// internal
|
|
341
|
+
const requestPayload = (request, urlParams, isMultipart) => HttpMethod.hasBody(request.method) ? isMultipart ? Effect.orDie(request.multipart) : Effect.orDie(request.json) : Effect.succeed(urlParams);
|
|
342
|
+
const handlerToRoute = (endpoint, handler, isFullResponse) => {
|
|
343
|
+
const decodePath = Option.map(endpoint.pathSchema, Schema.decodeUnknown);
|
|
344
|
+
const isMultipart = endpoint.payloadSchema.pipe(Option.map(schema => HttpApiSchema.getMultipart(schema.ast)), Option.getOrElse(() => false));
|
|
345
|
+
const decodePayload = Option.map(endpoint.payloadSchema, Schema.decodeUnknown);
|
|
346
|
+
const decodeHeaders = Option.map(endpoint.headersSchema, Schema.decodeUnknown);
|
|
347
|
+
const encoding = HttpApiSchema.getEncoding(endpoint.successSchema.ast);
|
|
348
|
+
const successStatus = HttpApiSchema.getStatusSuccess(endpoint.successSchema);
|
|
349
|
+
const encodeSuccess = Option.map(HttpApiEndpoint.schemaSuccess(endpoint), schema => {
|
|
350
|
+
const encode = Schema.encodeUnknown(schema);
|
|
351
|
+
switch (encoding.kind) {
|
|
352
|
+
case "Json":
|
|
353
|
+
{
|
|
354
|
+
return body => Effect.orDie(Effect.flatMap(encode(body), json => HttpServerResponse.json(json, {
|
|
355
|
+
status: successStatus,
|
|
356
|
+
contentType: encoding.contentType
|
|
357
|
+
})));
|
|
358
|
+
}
|
|
359
|
+
case "Text":
|
|
360
|
+
{
|
|
361
|
+
return body => Effect.map(Effect.orDie(encode(body)), text => HttpServerResponse.text(text, {
|
|
362
|
+
status: successStatus,
|
|
363
|
+
contentType: encoding.contentType
|
|
364
|
+
}));
|
|
365
|
+
}
|
|
366
|
+
case "Uint8Array":
|
|
367
|
+
{
|
|
368
|
+
return body => Effect.map(Effect.orDie(encode(body)), data => HttpServerResponse.uint8Array(data, {
|
|
369
|
+
status: successStatus,
|
|
370
|
+
contentType: encoding.contentType
|
|
371
|
+
}));
|
|
372
|
+
}
|
|
373
|
+
case "UrlParams":
|
|
374
|
+
{
|
|
375
|
+
return body => Effect.map(Effect.orDie(encode(body)), params => HttpServerResponse.urlParams(params, {
|
|
376
|
+
status: successStatus,
|
|
377
|
+
contentType: encoding.contentType
|
|
378
|
+
}));
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
return HttpRouter.makeRoute(endpoint.method, endpoint.path, Effect.withFiberRuntime(fiber => {
|
|
383
|
+
const context = fiber.getFiberRef(FiberRef.currentContext);
|
|
384
|
+
const request = Context.unsafeGet(context, HttpServerRequest.HttpServerRequest);
|
|
385
|
+
const routeContext = Context.unsafeGet(context, HttpRouter.RouteContext);
|
|
386
|
+
const urlParams = Context.unsafeGet(context, HttpServerRequest.ParsedSearchParams);
|
|
387
|
+
return (decodePath._tag === "Some" ? Effect.catchAll(decodePath.value(routeContext.params), HttpApiDecodeError.refailParseError) : Effect.succeed(routeContext.params)).pipe(Effect.bindTo("pathParams"), decodePayload._tag === "Some" ? Effect.bind("payload", _ => requestPayload(request, urlParams, isMultipart).pipe(Effect.orDie, Effect.flatMap(raw => Effect.catchAll(decodePayload.value(raw), HttpApiDecodeError.refailParseError)))) : identity, decodeHeaders._tag === "Some" ? Effect.bind("headers", _ => Effect.orDie(decodeHeaders.value(request.headers))) : identity, Effect.flatMap(input => {
|
|
388
|
+
const request = {
|
|
389
|
+
path: input.pathParams
|
|
390
|
+
};
|
|
391
|
+
if ("payload" in input) {
|
|
392
|
+
request.payload = input.payload;
|
|
393
|
+
}
|
|
394
|
+
if ("headers" in input) {
|
|
395
|
+
request.headers = input.headers;
|
|
396
|
+
}
|
|
397
|
+
return handler(request);
|
|
398
|
+
}), isFullResponse ? identity : encodeSuccess._tag === "Some" ? Effect.flatMap(encodeSuccess.value) : Effect.as(HttpServerResponse.empty({
|
|
399
|
+
status: successStatus
|
|
400
|
+
})));
|
|
401
|
+
}));
|
|
402
|
+
};
|
|
403
|
+
const astCache = /*#__PURE__*/globalValue("@effect/platform/HttpApiBuilder/astCache", () => new WeakMap());
|
|
404
|
+
const makeErrorSchema = api => {
|
|
405
|
+
const schemas = new Set();
|
|
406
|
+
function processSchema(schema) {
|
|
407
|
+
if (astCache.has(schema.ast)) {
|
|
408
|
+
schemas.add(astCache.get(schema.ast));
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
const ast = schema.ast;
|
|
412
|
+
if (ast._tag === "Union") {
|
|
413
|
+
for (const astType of ast.types) {
|
|
414
|
+
const errorSchema = Schema.make(astType).annotations({
|
|
415
|
+
...ast.annotations,
|
|
416
|
+
...astType.annotations
|
|
417
|
+
});
|
|
418
|
+
astCache.set(astType, errorSchema);
|
|
419
|
+
schemas.add(errorSchema);
|
|
420
|
+
}
|
|
421
|
+
} else {
|
|
422
|
+
astCache.set(ast, schema);
|
|
423
|
+
schemas.add(schema);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
processSchema(api.errorSchema);
|
|
427
|
+
for (const group of api.groups) {
|
|
428
|
+
for (const endpoint of group.endpoints) {
|
|
429
|
+
processSchema(endpoint.errorSchema);
|
|
430
|
+
}
|
|
431
|
+
processSchema(group.errorSchema);
|
|
432
|
+
}
|
|
433
|
+
return Schema.Union(...[...schemas].map(schema => {
|
|
434
|
+
const status = HttpApiSchema.getStatusError(schema);
|
|
435
|
+
const encoded = AST.encodedAST(schema.ast);
|
|
436
|
+
const isEmpty = encoded._tag === "VoidKeyword";
|
|
437
|
+
return Schema.transformOrFail(Schema.Any, schema, {
|
|
438
|
+
decode: (_, __, ast) => ParseResult.fail(new ParseResult.Forbidden(ast, _, "Encode only schema")),
|
|
439
|
+
encode: (error, _, ast) => isEmpty ? HttpServerResponse.empty({
|
|
440
|
+
status
|
|
441
|
+
}) : HttpServerResponse.json(error, {
|
|
442
|
+
status
|
|
443
|
+
}).pipe(Effect.mapError(error => new ParseResult.Type(ast, error, "Could not encode to JSON")))
|
|
444
|
+
});
|
|
445
|
+
}));
|
|
446
|
+
};
|
|
447
|
+
//# sourceMappingURL=HttpApiBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpApiBuilder.js","names":["AST","ParseResult","Schema","Chunk","Context","Effect","Encoding","FiberRef","identity","globalValue","Layer","Option","pipeArguments","Redacted","unify","HttpApi","HttpApiEndpoint","HttpApiDecodeError","HttpApiSchema","HttpApp","HttpMethod","HttpMiddleware","HttpRouter","HttpServer","HttpServerRequest","HttpServerResponse","OpenApi","Router","Tag","serve","middleware","httpApp","pipe","map","unwrapEffect","provide","Live","gen","api","router","apiMiddleware","serviceOption","Middleware","errorSchema","makeErrorSchema","encodeError","encodeUnknown","_tag","value","catchAll","error","matchEffect","onFailure","die","onSuccess","succeed","self","HandlersTypeId","Symbol","for","HandlersProto","_Endpoints","arguments","makeHandlers","options","Object","create","group","handlers","groupName","build","use","context","findFirst","groups","identifier","Error","result","empty","isEffect","routes","item","route","handler","push","handlerToRoute","endpoint","request","mapInputContext","input","merge","withFullResponse","concat","fromIterable","handle","name","o","endpoints","append","middlewareAdd","current","getOption","withContext","middlewareAddNoContext","middlewareLayer","args","apiFirst","isHttpApi","add","effect","flatMap","middlewareLayerScoped","scoped","middlewareCors","cors","middlewareOpenApi","spec","fromApi","response","json","orDie","get","path","bearerLen","length","securityDecode","make","headers","authorization","slice","schema","Struct","key","String","decode","in","schemaSearchParams","schemaCookies","schemaHeaders","match","username","password","decodeBase64String","header","parts","split","securitySetCookie","stringValue","appendPreResponseHandler","_req","setCookie","secure","httpOnly","middlewareSecurity","tag","f","provideServiceEffect","middlewareSecurityVoid","zipRight","requestPayload","urlParams","isMultipart","hasBody","method","multipart","isFullResponse","decodePath","pathSchema","decodeUnknown","payloadSchema","getMultipart","ast","getOrElse","decodePayload","decodeHeaders","headersSchema","encoding","getEncoding","successSchema","successStatus","getStatusSuccess","encodeSuccess","schemaSuccess","encode","kind","body","status","contentType","text","data","uint8Array","params","makeRoute","withFiberRuntime","fiber","getFiberRef","currentContext","unsafeGet","routeContext","RouteContext","ParsedSearchParams","refailParseError","bindTo","bind","_","raw","pathParams","payload","as","astCache","WeakMap","schemas","Set","processSchema","has","astType","types","annotations","set","Union","getStatusError","encoded","encodedAST","isEmpty","transformOrFail","Any","__","fail","Forbidden","mapError","Type"],"sources":["../../src/HttpApiBuilder.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,GAAG,MAAM,oBAAoB;AACzC,OAAO,KAAKC,WAAW,MAAM,4BAA4B;AACzD,OAAO,KAAKC,MAAM,MAAM,uBAAuB;AAC/C,OAAO,KAAKC,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,OAAO,MAAM,gBAAgB;AACzC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,QAAQ,MAAM,iBAAiB;AAC3C,OAAO,KAAKC,QAAQ,MAAM,iBAAiB;AAC3C,SAASC,QAAQ,QAAQ,iBAAiB;AAC1C,SAASC,WAAW,QAAQ,oBAAoB;AAChD,OAAO,KAAKC,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,SAAwBC,aAAa,QAAQ,iBAAiB;AAE9D,OAAO,KAAKC,QAAQ,MAAM,iBAAiB;AAG3C,SAASC,KAAK,QAAQ,cAAc;AAGpC,OAAO,KAAKC,OAAO,MAAM,cAAc;AACvC,OAAO,KAAKC,eAAe,MAAM,sBAAsB;AACvD,SAASC,kBAAkB,QAAQ,mBAAmB;AAEtD,OAAO,KAAKC,aAAa,MAAM,oBAAoB;AAEnD,OAAO,KAAKC,OAAO,MAAM,cAAc;AACvC,OAAO,KAAKC,UAAU,MAAM,iBAAiB;AAC7C,OAAO,KAAKC,cAAc,MAAM,qBAAqB;AACrD,OAAO,KAAKC,UAAU,MAAM,iBAAiB;AAC7C,OAAO,KAAKC,UAAU,MAAM,iBAAiB;AAC7C,OAAO,KAAKC,iBAAiB,MAAM,wBAAwB;AAC3D,OAAO,KAAKC,kBAAkB,MAAM,yBAAyB;AAC7D,OAAO,KAAKC,OAAO,MAAM,cAAc;AAGvC;;;;;;AAMA,OAAM,MAAOC,MAAO,sBAAQL,UAAU,CAACM,GAAG,CAAC,wCAAwC,CAAC,EAAU;AAE9F;;;;;;;;;;AAUA,OAAO,MAAMC,KAAK,GAYbC,UAAmE,IAKtEC,OAAO,CAACC,IAAI,CACV3B,MAAM,CAAC4B,GAAG,CAACV,UAAU,CAACM,KAAK,CAACC,UAAW,CAAC,CAAC,EACzCpB,KAAK,CAACwB,YAAY,EAClBxB,KAAK,CAACyB,OAAO,CAACR,MAAM,CAACS,IAAI,CAAC,CAC3B;AAEH;;;;;;AAMA,OAAO,MAAML,OAAO,gBAIhB1B,MAAM,CAACgC,GAAG,CAAC,aAAS;EACtB,MAAMC,GAAG,GAAG,OAAOvB,OAAO,CAACA,OAAO;EAClC,MAAMwB,MAAM,GAAG,OAAOZ,MAAM,CAACY,MAAM;EACnC,MAAMC,aAAa,GAAG,OAAOnC,MAAM,CAACoC,aAAa,CAACC,UAAU,CAAC;EAC7D,MAAMC,WAAW,GAAGC,eAAe,CAACN,GAAU,CAAC;EAC/C,MAAMO,WAAW,GAAG3C,MAAM,CAAC4C,aAAa,CAACH,WAAW,CAAC;EACrD,OAAOJ,MAAM,CAACP,IAAI,CAChBQ,aAAa,CAACO,IAAI,KAAK,MAAM,GAAGP,aAAa,CAACQ,KAAK,GAAGxC,QAAQ,EAC9DH,MAAM,CAAC4C,QAAQ,CAAEC,KAAK,IACpB7C,MAAM,CAAC8C,WAAW,CAACN,WAAW,CAACK,KAAK,CAAC,EAAE;IACrCE,SAAS,EAAEA,CAAA,KAAM/C,MAAM,CAACgD,GAAG,CAACH,KAAK,CAAC;IAClCI,SAAS,EAAEjD,MAAM,CAACkD;GACnB,CAAC,CACH,CACF;AACH,CAAC,CAAC;AAEF;;;;;;;;;;;AAWA,OAAO,MAAMjB,GAAG,GACdkB,IAA4C,IAE5C9C,KAAK,CAAC6C,OAAO,CAACxC,OAAO,CAACA,OAAO,EAAEyC,IAAI,CAAQ;AAE7C;;;;AAIA,OAAO,MAAMC,cAAc,gBAAkBC,MAAM,CAACC,GAAG,CAAC,0CAA0C,CAAC;AAoDnG,MAAMC,aAAa,GAAG;EACpB,CAACH,cAAc,GAAG;IAChBI,UAAU,EAAErD;GACb;EACDwB,IAAIA,CAAA;IACF,OAAOpB,aAAa,CAAC,IAAI,EAAEkD,SAAS,CAAC;EACvC;CACD;AAED,MAAMC,YAAY,GAChBC,OAGC,IAC4B;EAC7B,MAAMR,IAAI,GAAGS,MAAM,CAACC,MAAM,CAACN,aAAa,CAAC;EACzCJ,IAAI,CAACW,KAAK,GAAGH,OAAO,CAACG,KAAK;EAC1BX,IAAI,CAACY,QAAQ,GAAGJ,OAAO,CAACI,QAAQ;EAChC,OAAOZ,IAAI;AACb,CAAC;AAED;;;;;;;;;;;AAWA,OAAO,MAAMW,KAAK,GAAGA,CASnB7B,GAAiD,EACjD+B,SAAe,EACfC,KAIkH,KAMlH3C,MAAM,CAAC4C,GAAG,CAAEhC,MAAM,IAChBlC,MAAM,CAACgC,GAAG,CAAC,aAAS;EAClB,MAAMmC,OAAO,GAAG,OAAOnE,MAAM,CAACmE,OAAO,EAAO;EAC5C,MAAML,KAAK,GAAGhE,KAAK,CAACsE,SAAS,CAACnC,GAAG,CAACoC,MAAM,EAAGP,KAAK,IAAKA,KAAK,CAACQ,UAAU,KAAKN,SAAS,CAAC;EACpF,IAAIF,KAAK,CAACpB,IAAI,KAAK,MAAM,EAAE;IACzB,MAAM,IAAI6B,KAAK,CAAC,UAAUP,SAAS,oBAAoB,CAAC;EAC1D;EACA,MAAMQ,MAAM,GAAGP,KAAK,CAACP,YAAY,CAAC;IAAEI,KAAK,EAAEA,KAAK,CAACnB,KAAY;IAAEoB,QAAQ,EAAEjE,KAAK,CAAC2E,KAAK;EAAE,CAAE,CAAC,CAAC;EAC1F,MAAMV,QAAQ,GAAG/D,MAAM,CAAC0E,QAAQ,CAACF,MAAM,CAAC,GAAI,OAAOA,MAAM,GAAIA,MAAM;EACnE,MAAMG,MAAM,GAAsC,EAAE;EACpD,KAAK,MAAMC,IAAI,IAAIb,QAAQ,CAACA,QAAQ,EAAE;IACpC,IAAIa,IAAI,CAAClC,IAAI,KAAK,YAAY,EAAE;MAC9B,KAAK,MAAMmC,KAAK,IAAIF,MAAM,EAAE;QAC1B;QAAEE,KAA6C,CAACC,OAAO,GAAGF,IAAI,CAACnD,UAAU,CAACoD,KAAK,CAACC,OAAc,CAAC;MACjG;IACF,CAAC,MAAM;MACLH,MAAM,CAACI,IAAI,CAACC,cAAc,CACxBJ,IAAI,CAACK,QAAQ,EACb,UAASC,OAAO;QACd,OAAOlF,MAAM,CAACmF,eAAe,CAC3BP,IAAI,CAACE,OAAO,CAACI,OAAO,CAAC,EACpBE,KAAK,IAAKrF,OAAO,CAACsF,KAAK,CAAClB,OAAO,EAAEiB,KAAK,CAAC,CACzC;MACH,CAAC,EACDR,IAAI,CAACU,gBAAgB,CACtB,CAAC;IACJ;EACF;EACA,OAAOpD,MAAM,CAACqD,MAAM,CAACtE,UAAU,CAACuE,YAAY,CAACb,MAAM,CAAC,CAAC;AACvD,CAAC,CAAC,CACI;AAEV;;;;;;AAMA,OAAO,MAAMc,MAAM,GAoBfA,CACFC,IAAU,EACVZ,OAA+E,EAC/EnB,OAEC,KAGDR,IAAiC,IAK/B;EACF,MAAMwC,CAAC,GAAG7F,KAAK,CAACsE,SAAS,CAACjB,IAAI,CAACW,KAAK,CAAC8B,SAAS,EAAGX,QAAQ,IAAKA,QAAQ,CAACS,IAAI,KAAKA,IAAI,CAAC;EACrF,IAAIC,CAAC,CAACjD,IAAI,KAAK,MAAM,EAAE;IACrB,MAAM,IAAI6B,KAAK,CAAC,aAAamB,IAAI,yBAAyBvC,IAAI,CAACW,KAAK,CAACQ,UAAU,GAAG,CAAC;EACrF;EACA,MAAMW,QAAQ,GAAGU,CAAC,CAAChD,KAAK;EACxB,OAAOe,YAAY,CAAC;IAClBI,KAAK,EAAEX,IAAI,CAACW,KAAK;IACjBC,QAAQ,EAAEjE,KAAK,CAAC+F,MAAM,CAAC1C,IAAI,CAACY,QAAQ,EAAE;MACpCrB,IAAI,EAAE,SAAS;MACfuC,QAAQ;MACRH,OAAO;MACPQ,gBAAgB,EAAE3B,OAAO,EAAE2B,gBAAgB,KAAK;KACjD;GACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;AAUA,OAAO,MAAM7D,UAAU,GACNA,UAA6C,IAE1D0B,IAA+B,IAE/BO,YAAY,CAAqE;EAC/E,GAAGP,IAAW;EACdY,QAAQ,EAAEjE,KAAK,CAAC+F,MAAM,CAAC1C,IAAI,CAACY,QAAQ,EAAE;IACpCrB,IAAI,EAAE,YAAY;IAClBjB;GACD;CACF,CAAC;AAEN;;;;AAIA,OAAM,MAAOY,UAAW,sBAAQtC,OAAO,CAACwB,GAAG,CAAC,4CAA4C,CAAC,EAGtF;AAgBH,MAAMuE,aAAa,GAAIrE,UAAyC,IAC9DzB,MAAM,CAAC4B,GAAG,CACR5B,MAAM,CAACmE,OAAO,EAAS,EACtBA,OAAO,IAAI;EACV,MAAM4B,OAAO,GAAGhG,OAAO,CAACiG,SAAS,CAAC7B,OAAO,EAAE9B,UAAU,CAAC;EACtD,MAAM4D,WAAW,GAAmCvE,OAAO,IACzD1B,MAAM,CAACmF,eAAe,CAAC1D,UAAU,CAACC,OAAO,CAAC,EAAG0D,KAAK,IAAKrF,OAAO,CAACsF,KAAK,CAAClB,OAAO,EAAEiB,KAAK,CAAC,CAAC;EACvF,OAAOW,OAAO,CAACrD,IAAI,KAAK,MAAM,GAAGuD,WAAW,GAAIvE,OAAO,IAAKuE,WAAW,CAACF,OAAO,CAACpD,KAAK,CAACjB,OAAO,CAAC,CAAC;AACjG,CAAC,CACF;AAEH,MAAMwE,sBAAsB,GAC1BzE,UAAyC,IAEzCzB,MAAM,CAAC4B,GAAG,CACR5B,MAAM,CAACoC,aAAa,CAACC,UAAU,CAAC,EAC/B0D,OAAO,IAAmC;EACzC,OAAOA,OAAO,CAACrD,IAAI,KAAK,MAAM,GAAGjB,UAAU,GAAIC,OAAO,IAAKD,UAAU,CAACsE,OAAO,CAACpD,KAAK,CAACjB,OAAO,CAAC,CAAC;AAC/F,CAAC,CACF;AAEH;;;;;;AAMA,OAAO,MAAMyE,eAAe,GA2BxBA,CACF,GAAGC,IAWF,KACM;EACP,MAAMC,QAAQ,GAAG3F,OAAO,CAAC4F,SAAS,CAACF,IAAI,CAAC,CAAC,CAAC,CAAC;EAC3C,MAAMH,WAAW,GAAGI,QAAQ,GAAGD,IAAI,CAAC,CAAC,CAAC,EAAEH,WAAW,KAAK,IAAI,GAAIG,IAAY,CAAC,CAAC,CAAC,EAAEH,WAAW,KAAK,IAAI;EACrG,MAAMM,GAAG,GAAGN,WAAW,GAAGH,aAAa,GAAGI,sBAAsB;EAChE,MAAMzE,UAAU,GAAG4E,QAAQ,GAAGD,IAAI,CAAC,CAAC,CAAC,GAAGA,IAAI,CAAC,CAAC,CAAC;EAC/C,OAAOpG,MAAM,CAAC0E,QAAQ,CAACjD,UAAU,CAAC,GAC9BpB,KAAK,CAACmG,MAAM,CAACnE,UAAU,EAAErC,MAAM,CAACyG,OAAO,CAAChF,UAAiB,EAAE8E,GAAG,CAAC,CAAC,GAChElG,KAAK,CAACmG,MAAM,CAACnE,UAAU,EAAEkE,GAAG,CAAC9E,UAAiB,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;;AAOA,OAAO,MAAMiF,qBAAqB,GA2B9BA,CACF,GAAGN,IAWF,KACM;EACP,MAAMC,QAAQ,GAAG3F,OAAO,CAAC4F,SAAS,CAACF,IAAI,CAAC,CAAC,CAAC,CAAC;EAC3C,MAAMH,WAAW,GAAGI,QAAQ,GAAGD,IAAI,CAAC,CAAC,CAAC,EAAEH,WAAW,KAAK,IAAI,GAAIG,IAAY,CAAC,CAAC,CAAC,EAAEH,WAAW,KAAK,IAAI;EACrG,MAAMM,GAAG,GAAGN,WAAW,GAAGH,aAAa,GAAGI,sBAAsB;EAChE,MAAMzE,UAAU,GAAG4E,QAAQ,GAAGD,IAAI,CAAC,CAAC,CAAC,GAAGA,IAAI,CAAC,CAAC,CAAC;EAC/C,OAAO/F,KAAK,CAACsG,MAAM,CAACtE,UAAU,EAAErC,MAAM,CAACyG,OAAO,CAAChF,UAAiB,EAAE8E,GAAG,CAAC,CAAC;AACzE,CAAC;AAED;;;;;;AAMA,OAAO,MAAMK,cAAc,GACzBjD,OAOa,IACUwC,eAAe,CAACnF,cAAc,CAAC6F,IAAI,CAAClD,OAAO,CAAC,CAAC;AAEtE;;;;;;AAMA,OAAO,MAAMmD,iBAAiB,GAC5BnD,OAEa,IAEbrC,MAAM,CAAC4C,GAAG,CAAEhC,MAAM,IAChBlC,MAAM,CAACgC,GAAG,CAAC,aAAS;EAClB,MAAMC,GAAG,GAAG,OAAOvB,OAAO,CAACA,OAAO;EAClC,MAAMqG,IAAI,GAAG1F,OAAO,CAAC2F,OAAO,CAAC/E,GAAG,CAAC;EACjC,MAAMgF,QAAQ,GAAG,OAAO7F,kBAAkB,CAAC8F,IAAI,CAACH,IAAI,CAAC,CAACpF,IAAI,CACxD3B,MAAM,CAACmH,KAAK,CACb;EACD,OAAOjF,MAAM,CAACkF,GAAG,CAACzD,OAAO,EAAE0D,IAAI,IAAI,eAAe,EAAErH,MAAM,CAACkD,OAAO,CAAC+D,QAAQ,CAAC,CAAC;AAC/E,CAAC,CAAC,CACH;AAYH,MAAMK,SAAS,GAAG,SAAS,CAACC,MAAM;AAElC;;;;AAIA,OAAO,MAAMC,cAAc,GACzBrE,IAAc,IAKZ;EACF,QAAQA,IAAI,CAACT,IAAI;IACf,KAAK,QAAQ;MAAE;QACb,OAAO1C,MAAM,CAAC4B,GAAG,CACfT,iBAAiB,CAACA,iBAAiB,EAClC+D,OAAO,IAAK1E,QAAQ,CAACiH,IAAI,CAAC,CAACvC,OAAO,CAACwC,OAAO,CAACC,aAAa,IAAI,EAAE,EAAEC,KAAK,CAACN,SAAS,CAAC,CAAQ,CAC1F;MACH;IACA,KAAK,QAAQ;MAAE;QACb,MAAMO,MAAM,GAAGhI,MAAM,CAACiI,MAAM,CAAC;UAC3B,CAAC3E,IAAI,CAAC4E,GAAG,GAAGlI,MAAM,CAACmI;SACpB,CAAC;QACF,MAAMC,MAAM,GAAGxH,KAAK,CAClB0C,IAAI,CAAC+E,EAAE,KAAK,OAAO,GACf/G,iBAAiB,CAACgH,kBAAkB,CAACN,MAAM,CAAC,GAC5C1E,IAAI,CAAC+E,EAAE,KAAK,QAAQ,GACpB/G,iBAAiB,CAACiH,aAAa,CAACP,MAAM,CAAC,GACvC1G,iBAAiB,CAACkH,aAAa,CAACR,MAAM,CAAC,CAC5C;QACD,OAAO7H,MAAM,CAACsI,KAAK,CAACL,MAAM,EAAE;UAC1BlF,SAAS,EAAEA,CAAA,KAAMvC,QAAQ,CAACiH,IAAI,CAAC,EAAE,CAAQ;UACzCxE,SAAS,EAAGqF,KAAK,IAAK9H,QAAQ,CAACiH,IAAI,CAACa,KAAK,CAACnF,IAAI,CAAC4E,GAAG,CAAC;SACpD,CAAC;MACJ;IACA,KAAK,OAAO;MAAE;QACZ,MAAMtD,KAAK,GAAmD;UAC5D8D,QAAQ,EAAE,EAAE;UACZC,QAAQ,EAAEhI,QAAQ,CAACiH,IAAI,CAAC,EAAE;SACpB;QACR,OAAOtG,iBAAiB,CAACA,iBAAiB,CAACQ,IAAI,CAC7C3B,MAAM,CAACyG,OAAO,CAAEvB,OAAO,IAAKjF,QAAQ,CAACwI,kBAAkB,CAACvD,OAAO,CAACwC,OAAO,CAACC,aAAa,IAAI,EAAE,CAAC,CAAC,EAC7F3H,MAAM,CAACsI,KAAK,CAAC;UACXvF,SAAS,EAAEA,CAAA,KAAM0B,KAAK;UACtBxB,SAAS,EAAGyF,MAAM,IAAI;YACpB,MAAMC,KAAK,GAAGD,MAAM,CAACE,KAAK,CAAC,GAAG,CAAC;YAC/B,IAAID,KAAK,CAACpB,MAAM,KAAK,CAAC,EAAE;cACtB,OAAO9C,KAAK;YACd;YACA,OAAO;cACL8D,QAAQ,EAAEI,KAAK,CAAC,CAAC,CAAC;cAClBH,QAAQ,EAAEhI,QAAQ,CAACiH,IAAI,CAACkB,KAAK,CAAC,CAAC,CAAC;aAC1B;UACV;SACD,CAAC,CACH;MACH;EACF;AACF,CAAC;AAED;;;;;;;;;;;;;;;AAeA,OAAO,MAAME,iBAAiB,GAAGA,CAC/B1F,IAA4B,EAC5BR,KAAiC,EACjCgB,OAA2B,KACJ;EACvB,MAAMmF,WAAW,GAAG,OAAOnG,KAAK,KAAK,QAAQ,GAAGA,KAAK,GAAGnC,QAAQ,CAACmC,KAAK,CAACA,KAAK,CAAC;EAC7E,OAAO7B,OAAO,CAACiI,wBAAwB,CAAC,CAACC,IAAI,EAAE/B,QAAQ,KACrDjH,MAAM,CAACmH,KAAK,CACV/F,kBAAkB,CAAC6H,SAAS,CAAChC,QAAQ,EAAE9D,IAAI,CAAC4E,GAAG,EAAEe,WAAW,EAAE;IAC5DI,MAAM,EAAE,IAAI;IACZC,QAAQ,EAAE,IAAI;IACd,GAAGxF;GACJ,CAAC,CACH,CACF;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,OAAO,MAAMyF,kBAAkB,GAAGA,CAChCjG,IAAc,EACdkG,GAAsB,EACtBC,CAE6B,KAE7B7H,UAAU,CAACzB,MAAM,CAACuJ,oBAAoB,CACpCF,GAAG,EACHrJ,MAAM,CAACyG,OAAO,CAACe,cAAc,CAACrE,IAAI,CAAC,EAAEmG,CAAC,CAAC,CACxC,CAAkC;AAErC;;;;;;;;;AASA,OAAO,MAAME,sBAAsB,GAAGA,CACpCrG,IAAc,EACdmG,CAE6B,KAE7B7H,UAAU,CAAEC,OAAO,IACjB8F,cAAc,CAACrE,IAAI,CAAC,CAACxB,IAAI,CACvB3B,MAAM,CAACyG,OAAO,CAAC6C,CAAC,CAAC,EACjBtJ,MAAM,CAACyJ,QAAQ,CAAC/H,OAAO,CAAC,CACzB,CACmC;AAExC;AAEA,MAAMgI,cAAc,GAAGA,CACrBxE,OAA4C,EAC5CyE,SAAyD,EACzDC,WAAoB,KAQpB7I,UAAU,CAAC8I,OAAO,CAAC3E,OAAO,CAAC4E,MAAM,CAAC,GAC9BF,WAAW,GACT5J,MAAM,CAACmH,KAAK,CAACjC,OAAO,CAAC6E,SAAS,CAAC,GAC/B/J,MAAM,CAACmH,KAAK,CAACjC,OAAO,CAACgC,IAAI,CAAC,GAC5BlH,MAAM,CAACkD,OAAO,CAACyG,SAAS,CAAC;AAE/B,MAAM3E,cAAc,GAAGA,CACrBC,QAA6C,EAC7CH,OAA+D,EAC/DkF,cAAuB,KACO;EAC9B,MAAMC,UAAU,GAAG3J,MAAM,CAACsB,GAAG,CAACqD,QAAQ,CAACiF,UAAU,EAAErK,MAAM,CAACsK,aAAa,CAAC;EACxE,MAAMP,WAAW,GAAG3E,QAAQ,CAACmF,aAAa,CAACzI,IAAI,CAC7CrB,MAAM,CAACsB,GAAG,CAAEiG,MAAM,IAAKhH,aAAa,CAACwJ,YAAY,CAACxC,MAAM,CAACyC,GAAG,CAAC,CAAC,EAC9DhK,MAAM,CAACiK,SAAS,CAAC,MAAM,KAAK,CAAC,CAC9B;EACD,MAAMC,aAAa,GAAGlK,MAAM,CAACsB,GAAG,CAACqD,QAAQ,CAACmF,aAAa,EAAEvK,MAAM,CAACsK,aAAa,CAAC;EAC9E,MAAMM,aAAa,GAAGnK,MAAM,CAACsB,GAAG,CAACqD,QAAQ,CAACyF,aAAa,EAAE7K,MAAM,CAACsK,aAAa,CAAC;EAC9E,MAAMQ,QAAQ,GAAG9J,aAAa,CAAC+J,WAAW,CAAC3F,QAAQ,CAAC4F,aAAa,CAACP,GAAG,CAAC;EACtE,MAAMQ,aAAa,GAAGjK,aAAa,CAACkK,gBAAgB,CAAC9F,QAAQ,CAAC4F,aAAa,CAAC;EAC5E,MAAMG,aAAa,GAAG1K,MAAM,CAACsB,GAAG,CAACjB,eAAe,CAACsK,aAAa,CAAChG,QAAQ,CAAC,EAAG4C,MAAM,IAAI;IACnF,MAAMqD,MAAM,GAAGrL,MAAM,CAAC4C,aAAa,CAACoF,MAAM,CAAC;IAC3C,QAAQ8C,QAAQ,CAACQ,IAAI;MACnB,KAAK,MAAM;QAAE;UACX,OAAQC,IAAa,IACnBpL,MAAM,CAACmH,KAAK,CACVnH,MAAM,CAACyG,OAAO,CAACyE,MAAM,CAACE,IAAI,CAAC,EAAGlE,IAAI,IAChC9F,kBAAkB,CAAC8F,IAAI,CAACA,IAAI,EAAE;YAC5BmE,MAAM,EAAEP,aAAa;YACrBQ,WAAW,EAAEX,QAAQ,CAACW;WACvB,CAAC,CAAC,CACN;QACL;MACA,KAAK,MAAM;QAAE;UACX,OAAQF,IAAa,IACnBpL,MAAM,CAAC4B,GAAG,CAAC5B,MAAM,CAACmH,KAAK,CAAC+D,MAAM,CAACE,IAAI,CAAC,CAAC,EAAGG,IAAI,IAC1CnK,kBAAkB,CAACmK,IAAI,CAACA,IAAW,EAAE;YACnCF,MAAM,EAAEP,aAAa;YACrBQ,WAAW,EAAEX,QAAQ,CAACW;WACvB,CAAC,CAAC;QACT;MACA,KAAK,YAAY;QAAE;UACjB,OAAQF,IAAa,IACnBpL,MAAM,CAAC4B,GAAG,CAAC5B,MAAM,CAACmH,KAAK,CAAC+D,MAAM,CAACE,IAAI,CAAC,CAAC,EAAGI,IAAI,IAC1CpK,kBAAkB,CAACqK,UAAU,CAACD,IAAW,EAAE;YACzCH,MAAM,EAAEP,aAAa;YACrBQ,WAAW,EAAEX,QAAQ,CAACW;WACvB,CAAC,CAAC;QACT;MACA,KAAK,WAAW;QAAE;UAChB,OAAQF,IAAa,IACnBpL,MAAM,CAAC4B,GAAG,CAAC5B,MAAM,CAACmH,KAAK,CAAC+D,MAAM,CAACE,IAAI,CAAC,CAAC,EAAGM,MAAM,IAC5CtK,kBAAkB,CAACuI,SAAS,CAAC+B,MAAa,EAAE;YAC1CL,MAAM,EAAEP,aAAa;YACrBQ,WAAW,EAAEX,QAAQ,CAACW;WACvB,CAAC,CAAC;QACT;IACF;EACF,CAAC,CAAC;EACF,OAAOrK,UAAU,CAAC0K,SAAS,CACzB1G,QAAQ,CAAC6E,MAAM,EACf7E,QAAQ,CAACoC,IAAI,EACbrH,MAAM,CAAC4L,gBAAgB,CAAEC,KAAK,IAAI;IAChC,MAAM1H,OAAO,GAAG0H,KAAK,CAACC,WAAW,CAAC5L,QAAQ,CAAC6L,cAAc,CAAC;IAC1D,MAAM7G,OAAO,GAAGnF,OAAO,CAACiM,SAAS,CAAC7H,OAAO,EAAEhD,iBAAiB,CAACA,iBAAiB,CAAC;IAC/E,MAAM8K,YAAY,GAAGlM,OAAO,CAACiM,SAAS,CAAC7H,OAAO,EAAElD,UAAU,CAACiL,YAAY,CAAC;IACxE,MAAMvC,SAAS,GAAG5J,OAAO,CAACiM,SAAS,CAAC7H,OAAO,EAAEhD,iBAAiB,CAACgL,kBAAkB,CAAC;IAClF,OAAO,CAAClC,UAAU,CAACvH,IAAI,KAAK,MAAM,GAC9B1C,MAAM,CAAC4C,QAAQ,CAACqH,UAAU,CAACtH,KAAK,CAACsJ,YAAY,CAACP,MAAM,CAAC,EAAE9K,kBAAkB,CAACwL,gBAAgB,CAAC,GAC3FpM,MAAM,CAACkD,OAAO,CAAC+I,YAAY,CAACP,MAAM,CAAC,EAAE/J,IAAI,CACzC3B,MAAM,CAACqM,MAAM,CAAC,YAAY,CAAC,EAC3B7B,aAAa,CAAC9H,IAAI,KAAK,MAAM,GACzB1C,MAAM,CAACsM,IAAI,CAAC,SAAS,EAAGC,CAAC,IACzB7C,cAAc,CAACxE,OAAO,EAAEyE,SAAS,EAAEC,WAAW,CAAC,CAACjI,IAAI,CAClD3B,MAAM,CAACmH,KAAK,EACZnH,MAAM,CAACyG,OAAO,CAAE+F,GAAG,IAAKxM,MAAM,CAAC4C,QAAQ,CAAC4H,aAAa,CAAC7H,KAAK,CAAC6J,GAAG,CAAC,EAAE5L,kBAAkB,CAACwL,gBAAgB,CAAC,CAAC,CACxG,CAAC,GACFjM,QAAQ,EACZsK,aAAa,CAAC/H,IAAI,KAAK,MAAM,GACzB1C,MAAM,CAACsM,IAAI,CAAC,SAAS,EAAGC,CAAC,IAAKvM,MAAM,CAACmH,KAAK,CAACsD,aAAa,CAAC9H,KAAK,CAACuC,OAAO,CAACwC,OAAO,CAAC,CAAC,CAAC,GACjFvH,QAAQ,EACZH,MAAM,CAACyG,OAAO,CAAErB,KAAK,IAAI;MACvB,MAAMF,OAAO,GAAQ;QAAEmC,IAAI,EAAEjC,KAAK,CAACqH;MAAU,CAAE;MAC/C,IAAI,SAAS,IAAIrH,KAAK,EAAE;QACtBF,OAAO,CAACwH,OAAO,GAAGtH,KAAK,CAACsH,OAAO;MACjC;MACA,IAAI,SAAS,IAAItH,KAAK,EAAE;QACtBF,OAAO,CAACwC,OAAO,GAAGtC,KAAK,CAACsC,OAAO;MACjC;MACA,OAAO5C,OAAO,CAACI,OAAO,CAAC;IACzB,CAAC,CAAC,EACF8E,cAAc,GACZ7J,QAA4E,GAC5E6K,aAAa,CAACtI,IAAI,KAAK,MAAM,GAC3B1C,MAAM,CAACyG,OAAO,CAACuE,aAAa,CAACrI,KAAK,CAAC,GACnC3C,MAAM,CAAC2M,EAAE,CAACvL,kBAAkB,CAACqD,KAAK,CAAC;MAAE4G,MAAM,EAAEP;IAAa,CAAE,CAAC,CAAC,CACnE;EACL,CAAC,CAAC,CACH;AACH,CAAC;AAED,MAAM8B,QAAQ,gBAAGxM,WAAW,CAC1B,0CAA0C,EAC1C,MAAM,IAAIyM,OAAO,EAA8B,CAChD;AAED,MAAMtK,eAAe,GACnBN,GAAsG,IACrC;EACjE,MAAM6K,OAAO,GAAG,IAAIC,GAAG,EAAqB;EAC5C,SAASC,aAAaA,CAACnF,MAAyB;IAC9C,IAAI+E,QAAQ,CAACK,GAAG,CAACpF,MAAM,CAACyC,GAAG,CAAC,EAAE;MAC5BwC,OAAO,CAACvG,GAAG,CAACqG,QAAQ,CAACxF,GAAG,CAACS,MAAM,CAACyC,GAAG,CAAE,CAAC;MACtC;IACF;IACA,MAAMA,GAAG,GAAGzC,MAAM,CAACyC,GAAG;IACtB,IAAIA,GAAG,CAAC5H,IAAI,KAAK,OAAO,EAAE;MACxB,KAAK,MAAMwK,OAAO,IAAI5C,GAAG,CAAC6C,KAAK,EAAE;QAC/B,MAAM7K,WAAW,GAAGzC,MAAM,CAAC4H,IAAI,CAACyF,OAAO,CAAC,CAACE,WAAW,CAAC;UACnD,GAAG9C,GAAG,CAAC8C,WAAW;UAClB,GAAGF,OAAO,CAACE;SACZ,CAAC;QACFR,QAAQ,CAACS,GAAG,CAACH,OAAO,EAAE5K,WAAW,CAAC;QAClCwK,OAAO,CAACvG,GAAG,CAACjE,WAAW,CAAC;MAC1B;IACF,CAAC,MAAM;MACLsK,QAAQ,CAACS,GAAG,CAAC/C,GAAG,EAAEzC,MAAM,CAAC;MACzBiF,OAAO,CAACvG,GAAG,CAACsB,MAAM,CAAC;IACrB;EACF;EACAmF,aAAa,CAAC/K,GAAG,CAACK,WAAW,CAAC;EAC9B,KAAK,MAAMwB,KAAK,IAAI7B,GAAG,CAACoC,MAAM,EAAE;IAC9B,KAAK,MAAMY,QAAQ,IAAInB,KAAK,CAAC8B,SAAS,EAAE;MACtCoH,aAAa,CAAC/H,QAAQ,CAAC3C,WAAW,CAAC;IACrC;IACA0K,aAAa,CAAClJ,KAAK,CAACxB,WAAW,CAAC;EAClC;EACA,OAAOzC,MAAM,CAACyN,KAAK,CAAC,GAAG,CAAC,GAAGR,OAAO,CAAC,CAAClL,GAAG,CAAEiG,MAAM,IAAI;IACjD,MAAMwD,MAAM,GAAGxK,aAAa,CAAC0M,cAAc,CAAC1F,MAAM,CAAC;IACnD,MAAM2F,OAAO,GAAG7N,GAAG,CAAC8N,UAAU,CAAC5F,MAAM,CAACyC,GAAG,CAAC;IAC1C,MAAMoD,OAAO,GAAGF,OAAO,CAAC9K,IAAI,KAAK,aAAa;IAC9C,OAAO7C,MAAM,CAAC8N,eAAe,CAAC9N,MAAM,CAAC+N,GAAG,EAAE/F,MAAM,EAAE;MAChDI,MAAM,EAAEA,CAACsE,CAAC,EAAEsB,EAAE,EAAEvD,GAAG,KAAK1K,WAAW,CAACkO,IAAI,CAAC,IAAIlO,WAAW,CAACmO,SAAS,CAACzD,GAAG,EAAEiC,CAAC,EAAE,oBAAoB,CAAC,CAAC;MACjGrB,MAAM,EAAEA,CAACrI,KAAK,EAAE0J,CAAC,EAAEjC,GAAG,KACpBoD,OAAO,GACLtM,kBAAkB,CAACqD,KAAK,CAAC;QAAE4G;MAAM,CAAE,CAAC,GACpCjK,kBAAkB,CAAC8F,IAAI,CAACrE,KAAK,EAAE;QAAEwI;MAAM,CAAE,CAAC,CAAC1J,IAAI,CAC7C3B,MAAM,CAACgO,QAAQ,CAAEnL,KAAK,IAAK,IAAIjD,WAAW,CAACqO,IAAI,CAAC3D,GAAG,EAAEzH,KAAK,EAAE,0BAA0B,CAAC,CAAC;KAE/F,CAAC;EACJ,CAAC,CAAC,CAAQ;AACZ,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as ParseResult from "@effect/schema/ParseResult";
|
|
5
|
+
import * as Schema from "@effect/schema/Schema";
|
|
6
|
+
import * as Context from "effect/Context";
|
|
7
|
+
import * as Effect from "effect/Effect";
|
|
8
|
+
import { identity } from "effect/Function";
|
|
9
|
+
import * as Option from "effect/Option";
|
|
10
|
+
import * as HttpApi from "./HttpApi.js";
|
|
11
|
+
import * as HttpApiSchema from "./HttpApiSchema.js";
|
|
12
|
+
import * as HttpClient from "./HttpClient.js";
|
|
13
|
+
import * as HttpClientError from "./HttpClientError.js";
|
|
14
|
+
import * as HttpClientRequest from "./HttpClientRequest.js";
|
|
15
|
+
import * as HttpClientResponse from "./HttpClientResponse.js";
|
|
16
|
+
import * as HttpMethod from "./HttpMethod.js";
|
|
17
|
+
/**
|
|
18
|
+
* @since 1.0.0
|
|
19
|
+
* @category constructors
|
|
20
|
+
*/
|
|
21
|
+
export const make = (api, options) => Effect.gen(function* () {
|
|
22
|
+
const context = yield* Effect.context();
|
|
23
|
+
const httpClient = (yield* HttpClient.HttpClient).pipe(options?.baseUrl === undefined ? identity : HttpClient.mapRequest(HttpClientRequest.prependUrl(options.baseUrl)), options?.transformClient === undefined ? identity : options.transformClient);
|
|
24
|
+
const client = {};
|
|
25
|
+
HttpApi.reflect(api, {
|
|
26
|
+
onGroup({
|
|
27
|
+
group
|
|
28
|
+
}) {
|
|
29
|
+
client[group.identifier] = {};
|
|
30
|
+
},
|
|
31
|
+
onEndpoint({
|
|
32
|
+
endpoint,
|
|
33
|
+
errors,
|
|
34
|
+
group,
|
|
35
|
+
successAST,
|
|
36
|
+
successEncoding,
|
|
37
|
+
successStatus
|
|
38
|
+
}) {
|
|
39
|
+
const makeUrl = compilePath(endpoint.path);
|
|
40
|
+
const successDecode = successAST.pipe(Option.map(ast => {
|
|
41
|
+
const schema = Schema.make(ast);
|
|
42
|
+
switch (successEncoding.kind) {
|
|
43
|
+
case "Json":
|
|
44
|
+
{
|
|
45
|
+
return HttpClientResponse.schemaBodyJson(schema);
|
|
46
|
+
}
|
|
47
|
+
case "UrlParams":
|
|
48
|
+
{
|
|
49
|
+
return HttpClientResponse.schemaBodyUrlParams(schema);
|
|
50
|
+
}
|
|
51
|
+
case "Uint8Array":
|
|
52
|
+
{
|
|
53
|
+
return response => response.arrayBuffer.pipe(Effect.map(buffer => new Uint8Array(buffer)), Effect.flatMap(Schema.decodeUnknown(schema)));
|
|
54
|
+
}
|
|
55
|
+
case "Text":
|
|
56
|
+
{
|
|
57
|
+
return response => Effect.flatMap(response.text, Schema.decodeUnknown(schema));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}));
|
|
61
|
+
const handleError = (request, response) => {
|
|
62
|
+
const error = errors.get(response.status);
|
|
63
|
+
if (error === undefined) {
|
|
64
|
+
return Effect.die(new HttpClientError.ResponseError({
|
|
65
|
+
reason: "Decode",
|
|
66
|
+
request,
|
|
67
|
+
response
|
|
68
|
+
}));
|
|
69
|
+
} else if (Option.isNone(error)) {
|
|
70
|
+
return Effect.fail(new HttpClientError.ResponseError({
|
|
71
|
+
reason: "StatusCode",
|
|
72
|
+
request,
|
|
73
|
+
response
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
const decode = Schema.decodeUnknown(Schema.make(error.value));
|
|
77
|
+
return response.text.pipe(Effect.flatMap(text => text === "" ? Effect.void : Effect.try({
|
|
78
|
+
try: () => JSON.parse(text),
|
|
79
|
+
catch: cause => new HttpClientError.ResponseError({
|
|
80
|
+
reason: "Decode",
|
|
81
|
+
request,
|
|
82
|
+
response,
|
|
83
|
+
cause
|
|
84
|
+
})
|
|
85
|
+
})), Effect.flatMap(json => Effect.mapError(decode(json), cause => new HttpClientError.ResponseError({
|
|
86
|
+
reason: "Decode",
|
|
87
|
+
request,
|
|
88
|
+
response,
|
|
89
|
+
cause
|
|
90
|
+
}))), Effect.flatMap(Effect.fail));
|
|
91
|
+
};
|
|
92
|
+
const isMultipart = endpoint.payloadSchema.pipe(Option.map(schema => HttpApiSchema.getMultipart(schema.ast)), Option.getOrElse(() => false));
|
|
93
|
+
const encodePayload = endpoint.payloadSchema.pipe(Option.filter(() => !isMultipart), Option.map(Schema.encodeUnknown));
|
|
94
|
+
const encodeHeaders = endpoint.headersSchema.pipe(Option.map(Schema.encodeUnknown));
|
|
95
|
+
client[group.identifier][endpoint.name] = request => {
|
|
96
|
+
const url = request && request.path ? makeUrl(request && request.path) : endpoint.path;
|
|
97
|
+
const baseRequest = HttpClientRequest.make(endpoint.method)(url);
|
|
98
|
+
return (isMultipart ? Effect.succeed(baseRequest.pipe(HttpClientRequest.formDataBody(request.payload))) : encodePayload._tag === "Some" ? encodePayload.value(request.payload).pipe(Effect.flatMap(payload => HttpMethod.hasBody(endpoint.method) ? HttpClientRequest.jsonBody(baseRequest, payload) : Effect.succeed(HttpClientRequest.setUrlParams(baseRequest, payload))), Effect.orDie) : Effect.succeed(baseRequest)).pipe(encodeHeaders._tag === "Some" ? Effect.flatMap(httpRequest => encodeHeaders.value(request.headers).pipe(Effect.orDie, Effect.map(headers => HttpClientRequest.setHeaders(httpRequest, headers)))) : identity, Effect.flatMap(request => Effect.flatMap(httpClient(request), response => response.status !== successStatus ? handleError(request, response) : Effect.succeed(response))), successDecode._tag === "Some" ? Effect.flatMap(successDecode.value) : Effect.asVoid, Effect.scoped, Effect.catchIf(ParseResult.isParseError, Effect.die), Effect.mapInputContext(input => Context.merge(context, input)));
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
return client;
|
|
103
|
+
});
|
|
104
|
+
// ----------------------------------------------------------------------------
|
|
105
|
+
const paramsRegex = /:(\w+)[^/]*/g;
|
|
106
|
+
const compilePath = path => {
|
|
107
|
+
const segments = path.split(paramsRegex);
|
|
108
|
+
const len = segments.length;
|
|
109
|
+
if (len === 1) {
|
|
110
|
+
return _ => path;
|
|
111
|
+
}
|
|
112
|
+
return params => {
|
|
113
|
+
let url = segments[0];
|
|
114
|
+
for (let i = 1; i < len; i++) {
|
|
115
|
+
if (i % 2 === 0) {
|
|
116
|
+
url += segments[i];
|
|
117
|
+
} else {
|
|
118
|
+
url += params[segments[i]];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return url;
|
|
122
|
+
};
|
|
123
|
+
};
|
|
124
|
+
//# sourceMappingURL=HttpApiClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpApiClient.js","names":["ParseResult","Schema","Context","Effect","identity","Option","HttpApi","HttpApiSchema","HttpClient","HttpClientError","HttpClientRequest","HttpClientResponse","HttpMethod","make","api","options","gen","context","httpClient","pipe","baseUrl","undefined","mapRequest","prependUrl","transformClient","client","reflect","onGroup","group","identifier","onEndpoint","endpoint","errors","successAST","successEncoding","successStatus","makeUrl","compilePath","path","successDecode","map","ast","schema","kind","schemaBodyJson","schemaBodyUrlParams","response","arrayBuffer","buffer","Uint8Array","flatMap","decodeUnknown","text","handleError","request","error","get","status","die","ResponseError","reason","isNone","fail","decode","value","void","try","JSON","parse","catch","cause","json","mapError","isMultipart","payloadSchema","getMultipart","getOrElse","encodePayload","filter","encodeUnknown","encodeHeaders","headersSchema","name","url","baseRequest","method","succeed","formDataBody","payload","_tag","hasBody","jsonBody","setUrlParams","orDie","httpRequest","headers","setHeaders","asVoid","scoped","catchIf","isParseError","mapInputContext","input","merge","paramsRegex","segments","split","len","length","_","params","i"],"sources":["../../src/HttpApiClient.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,WAAW,MAAM,4BAA4B;AACzD,OAAO,KAAKC,MAAM,MAAM,uBAAuB;AAC/C,OAAO,KAAKC,OAAO,MAAM,gBAAgB;AACzC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,SAASC,QAAQ,QAAQ,iBAAiB;AAC1C,OAAO,KAAKC,MAAM,MAAM,eAAe;AAEvC,OAAO,KAAKC,OAAO,MAAM,cAAc;AAGvC,OAAO,KAAKC,aAAa,MAAM,oBAAoB;AACnD,OAAO,KAAKC,UAAU,MAAM,iBAAiB;AAC7C,OAAO,KAAKC,eAAe,MAAM,sBAAsB;AACvD,OAAO,KAAKC,iBAAiB,MAAM,wBAAwB;AAC3D,OAAO,KAAKC,kBAAkB,MAAM,yBAAyB;AAC7D,OAAO,KAAKC,UAAU,MAAM,iBAAiB;AAiC7C;;;;AAIA,OAAO,MAAMC,IAAI,GAAGA,CAClBC,GAAM,EACNC,OAGC,KAEDZ,MAAM,CAACa,GAAG,CAAC,aAAS;EAClB,MAAMC,OAAO,GAAG,OAAOd,MAAM,CAACc,OAAO,EAAO;EAC5C,MAAMC,UAAU,GAAG,CAAC,OAAOV,UAAU,CAACA,UAAU,EAAEW,IAAI,CACpDJ,OAAO,EAAEK,OAAO,KAAKC,SAAS,GAAGjB,QAAQ,GAAGI,UAAU,CAACc,UAAU,CAACZ,iBAAiB,CAACa,UAAU,CAACR,OAAO,CAACK,OAAO,CAAC,CAAC,EAChHL,OAAO,EAAES,eAAe,KAAKH,SAAS,GAAGjB,QAAQ,GAAGW,OAAO,CAACS,eAAe,CAC5E;EACD,MAAMC,MAAM,GAAwC,EAAE;EACtDnB,OAAO,CAACoB,OAAO,CAACZ,GAAU,EAAE;IAC1Ba,OAAOA,CAAC;MAAEC;IAAK,CAAE;MACfH,MAAM,CAACG,KAAK,CAACC,UAAU,CAAC,GAAG,EAAE;IAC/B,CAAC;IACDC,UAAUA,CAAC;MAAEC,QAAQ;MAAEC,MAAM;MAAEJ,KAAK;MAAEK,UAAU;MAAEC,eAAe;MAAEC;IAAa,CAAE;MAChF,MAAMC,OAAO,GAAGC,WAAW,CAACN,QAAQ,CAACO,IAAI,CAAC;MAC1C,MAAMC,aAAa,GAAGN,UAAU,CAACd,IAAI,CACnCd,MAAM,CAACmC,GAAG,CAAEC,GAAG,IAAI;QACjB,MAAMC,MAAM,GAAGzC,MAAM,CAACY,IAAI,CAAC4B,GAAG,CAAC;QAC/B,QAAQP,eAAe,CAACS,IAAI;UAC1B,KAAK,MAAM;YAAE;cACX,OAAOhC,kBAAkB,CAACiC,cAAc,CAACF,MAAM,CAAC;YAClD;UACA,KAAK,WAAW;YAAE;cAChB,OAAO/B,kBAAkB,CAACkC,mBAAmB,CAACH,MAAa,CAAC;YAC9D;UACA,KAAK,YAAY;YAAE;cACjB,OAAQI,QAA+C,IACrDA,QAAQ,CAACC,WAAW,CAAC5B,IAAI,CACvBhB,MAAM,CAACqC,GAAG,CAAEQ,MAAM,IAAK,IAAIC,UAAU,CAACD,MAAM,CAAC,CAAC,EAC9C7C,MAAM,CAAC+C,OAAO,CAACjD,MAAM,CAACkD,aAAa,CAACT,MAAM,CAAC,CAAC,CAC7C;YACL;UACA,KAAK,MAAM;YAAE;cACX,OAAQI,QAA+C,IACrD3C,MAAM,CAAC+C,OAAO,CAACJ,QAAQ,CAACM,IAAI,EAAEnD,MAAM,CAACkD,aAAa,CAACT,MAAM,CAAC,CAAC;YAC/D;QACF;MACF,CAAC,CAAC,CACH;MACD,MAAMW,WAAW,GAAGA,CAClBC,OAA4C,EAC5CR,QAA+C,KAC7C;QACF,MAAMS,KAAK,GAAGvB,MAAM,CAACwB,GAAG,CAACV,QAAQ,CAACW,MAAM,CAAC;QACzC,IAAIF,KAAK,KAAKlC,SAAS,EAAE;UACvB,OAAOlB,MAAM,CAACuD,GAAG,CACf,IAAIjD,eAAe,CAACkD,aAAa,CAAC;YAChCC,MAAM,EAAE,QAAQ;YAChBN,OAAO;YACPR;WACD,CAAC,CACH;QACH,CAAC,MAAM,IAAIzC,MAAM,CAACwD,MAAM,CAACN,KAAK,CAAC,EAAE;UAC/B,OAAOpD,MAAM,CAAC2D,IAAI,CAChB,IAAIrD,eAAe,CAACkD,aAAa,CAAC;YAChCC,MAAM,EAAE,YAAY;YACpBN,OAAO;YACPR;WACD,CAAC,CACH;QACH;QACA,MAAMiB,MAAM,GAAG9D,MAAM,CAACkD,aAAa,CAAClD,MAAM,CAACY,IAAI,CAAC0C,KAAK,CAACS,KAAK,CAAC,CAAC;QAC7D,OAAOlB,QAAQ,CAACM,IAAI,CAACjC,IAAI,CACvBhB,MAAM,CAAC+C,OAAO,CAAEE,IAAI,IAClBA,IAAI,KAAK,EAAE,GAAGjD,MAAM,CAAC8D,IAAI,GAAG9D,MAAM,CAAC+D,GAAG,CAAC;UACrCA,GAAG,EAAEA,CAAA,KAAMC,IAAI,CAACC,KAAK,CAAChB,IAAI,CAAC;UAC3BiB,KAAK,EAAGC,KAAK,IACX,IAAI7D,eAAe,CAACkD,aAAa,CAAC;YAChCC,MAAM,EAAE,QAAQ;YAChBN,OAAO;YACPR,QAAQ;YACRwB;WACD;SACJ,CAAC,CACH,EACDnE,MAAM,CAAC+C,OAAO,CAAEqB,IAAI,IAClBpE,MAAM,CAACqE,QAAQ,CAACT,MAAM,CAACQ,IAAI,CAAC,EAAGD,KAAK,IAClC,IAAI7D,eAAe,CAACkD,aAAa,CAAC;UAChCC,MAAM,EAAE,QAAQ;UAChBN,OAAO;UACPR,QAAQ;UACRwB;SACD,CAAC,CAAC,CACN,EACDnE,MAAM,CAAC+C,OAAO,CAAC/C,MAAM,CAAC2D,IAAI,CAAC,CAC5B;MACH,CAAC;MACD,MAAMW,WAAW,GAAG1C,QAAQ,CAAC2C,aAAa,CAACvD,IAAI,CAC7Cd,MAAM,CAACmC,GAAG,CAAEE,MAAM,IAAKnC,aAAa,CAACoE,YAAY,CAACjC,MAAM,CAACD,GAAG,CAAC,CAAC,EAC9DpC,MAAM,CAACuE,SAAS,CAAC,MAAM,KAAK,CAAC,CAC9B;MACD,MAAMC,aAAa,GAAG9C,QAAQ,CAAC2C,aAAa,CAACvD,IAAI,CAC/Cd,MAAM,CAACyE,MAAM,CAAC,MAAM,CAACL,WAAW,CAAC,EACjCpE,MAAM,CAACmC,GAAG,CAACvC,MAAM,CAAC8E,aAAa,CAAC,CACjC;MACD,MAAMC,aAAa,GAAGjD,QAAQ,CAACkD,aAAa,CAAC9D,IAAI,CAC/Cd,MAAM,CAACmC,GAAG,CAACvC,MAAM,CAAC8E,aAAa,CAAC,CACjC;MACDtD,MAAM,CAACG,KAAK,CAACC,UAAU,CAAC,CAACE,QAAQ,CAACmD,IAAI,CAAC,GAAI5B,OAI1C,IAAI;QACH,MAAM6B,GAAG,GAAG7B,OAAO,IAAIA,OAAO,CAAChB,IAAI,GAAGF,OAAO,CAACkB,OAAO,IAAIA,OAAO,CAAChB,IAAI,CAAC,GAAGP,QAAQ,CAACO,IAAI;QACtF,MAAM8C,WAAW,GAAG1E,iBAAiB,CAACG,IAAI,CAACkB,QAAQ,CAACsD,MAAM,CAAC,CAACF,GAAG,CAAC;QAChE,OAAO,CAACV,WAAW,GACjBtE,MAAM,CAACmF,OAAO,CAACF,WAAW,CAACjE,IAAI,CAC7BT,iBAAiB,CAAC6E,YAAY,CAACjC,OAAO,CAACkC,OAAO,CAAC,CAChD,CAAC,GACAX,aAAa,CAACY,IAAI,KAAK,MAAM,GAC7BZ,aAAa,CAACb,KAAK,CAACV,OAAO,CAACkC,OAAO,CAAC,CAACrE,IAAI,CACzChB,MAAM,CAAC+C,OAAO,CAAEsC,OAAO,IACrB5E,UAAU,CAAC8E,OAAO,CAAC3D,QAAQ,CAACsD,MAAM,CAAC,GAC/B3E,iBAAiB,CAACiF,QAAQ,CAACP,WAAW,EAAEI,OAAO,CAAC,GAChDrF,MAAM,CAACmF,OAAO,CAAC5E,iBAAiB,CAACkF,YAAY,CAACR,WAAW,EAAEI,OAAc,CAAC,CAAC,CAChF,EACDrF,MAAM,CAAC0F,KAAK,CACb,GACC1F,MAAM,CAACmF,OAAO,CAACF,WAAW,CAAC,EAAEjE,IAAI,CACjC6D,aAAa,CAACS,IAAI,KAAK,MAAM,GACzBtF,MAAM,CAAC+C,OAAO,CAAE4C,WAAW,IAC3Bd,aAAa,CAAChB,KAAK,CAACV,OAAO,CAACyC,OAAO,CAAC,CAAC5E,IAAI,CACvChB,MAAM,CAAC0F,KAAK,EACZ1F,MAAM,CAACqC,GAAG,CAAEuD,OAAO,IAAKrF,iBAAiB,CAACsF,UAAU,CAACF,WAAW,EAAEC,OAAc,CAAC,CAAC,CACnF,CACF,GACC3F,QAAQ,EACZD,MAAM,CAAC+C,OAAO,CAAEI,OAAO,IACrBnD,MAAM,CAAC+C,OAAO,CAAChC,UAAU,CAACoC,OAAO,CAAC,EAAGR,QAAQ,IAC3CA,QAAQ,CAACW,MAAM,KAAKtB,aAAa,GAC7BkB,WAAW,CAACC,OAAO,EAAER,QAAQ,CAAC,GAC9B3C,MAAM,CAACmF,OAAO,CAACxC,QAAQ,CAAC,CAAC,CAChC,EACDP,aAAa,CAACkD,IAAI,KAAK,MAAM,GACzBtF,MAAM,CAAC+C,OAAO,CAACX,aAAa,CAACyB,KAAK,CAAC,GACnC7D,MAAM,CAAC8F,MAAM,EACjB9F,MAAM,CAAC+F,MAAM,EACb/F,MAAM,CAACgG,OAAO,CAACnG,WAAW,CAACoG,YAAY,EAAEjG,MAAM,CAACuD,GAAG,CAAC,EACpDvD,MAAM,CAACkG,eAAe,CAAEC,KAAK,IAAKpG,OAAO,CAACqG,KAAK,CAACtF,OAAO,EAAEqF,KAAK,CAAC,CAAC,CACjE;MACL,CAAC;IACH;GACD,CAAC;EACF,OAAO7E,MAAa;AACtB,CAAC,CAAC;AAEJ;AAEA,MAAM+E,WAAW,GAAG,cAAc;AAElC,MAAMnE,WAAW,GAAIC,IAAY,IAAI;EACnC,MAAMmE,QAAQ,GAAGnE,IAAI,CAACoE,KAAK,CAACF,WAAW,CAAC;EACxC,MAAMG,GAAG,GAAGF,QAAQ,CAACG,MAAM;EAC3B,IAAID,GAAG,KAAK,CAAC,EAAE;IACb,OAAQE,CAAM,IAAKvE,IAAI;EACzB;EACA,OAAQwE,MAA8B,IAAI;IACxC,IAAI3B,GAAG,GAAGsB,QAAQ,CAAC,CAAC,CAAC;IACrB,KAAK,IAAIM,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,GAAG,EAAEI,CAAC,EAAE,EAAE;MAC5B,IAAIA,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACf5B,GAAG,IAAIsB,QAAQ,CAACM,CAAC,CAAC;MACpB,CAAC,MAAM;QACL5B,GAAG,IAAI2B,MAAM,CAACL,QAAQ,CAACM,CAAC,CAAC,CAAC;MAC5B;IACF;IACA,OAAO5B,GAAG;EACZ,CAAC;AACH,CAAC","ignoreList":[]}
|