@effect/platform 0.68.6 → 0.69.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.
Files changed (229) hide show
  1. package/HttpApiMiddleware/package.json +6 -0
  2. package/README.md +306 -233
  3. package/dist/cjs/Headers.js +7 -2
  4. package/dist/cjs/Headers.js.map +1 -1
  5. package/dist/cjs/HttpApi.js +90 -78
  6. package/dist/cjs/HttpApi.js.map +1 -1
  7. package/dist/cjs/HttpApiBuilder.js +243 -255
  8. package/dist/cjs/HttpApiBuilder.js.map +1 -1
  9. package/dist/cjs/HttpApiClient.js +64 -59
  10. package/dist/cjs/HttpApiClient.js.map +1 -1
  11. package/dist/cjs/HttpApiEndpoint.js +74 -109
  12. package/dist/cjs/HttpApiEndpoint.js.map +1 -1
  13. package/dist/cjs/HttpApiError.js +3 -4
  14. package/dist/cjs/HttpApiError.js.map +1 -1
  15. package/dist/cjs/HttpApiGroup.js +103 -100
  16. package/dist/cjs/HttpApiGroup.js.map +1 -1
  17. package/dist/cjs/HttpApiMiddleware.js +67 -0
  18. package/dist/cjs/HttpApiMiddleware.js.map +1 -0
  19. package/dist/cjs/HttpApiSchema.js +33 -7
  20. package/dist/cjs/HttpApiSchema.js.map +1 -1
  21. package/dist/cjs/HttpApiSecurity.js +2 -2
  22. package/dist/cjs/HttpApiSecurity.js.map +1 -1
  23. package/dist/cjs/HttpApiSwagger.js +3 -1
  24. package/dist/cjs/HttpApiSwagger.js.map +1 -1
  25. package/dist/cjs/HttpBody.js.map +1 -1
  26. package/dist/cjs/HttpIncomingMessage.js +5 -1
  27. package/dist/cjs/HttpIncomingMessage.js.map +1 -1
  28. package/dist/cjs/HttpServer.js +12 -1
  29. package/dist/cjs/HttpServer.js.map +1 -1
  30. package/dist/cjs/HttpServerRespondable.js +1 -1
  31. package/dist/cjs/HttpServerRespondable.js.map +1 -1
  32. package/dist/cjs/OpenApi.js +102 -63
  33. package/dist/cjs/OpenApi.js.map +1 -1
  34. package/dist/cjs/OpenApiJsonSchema.js +58 -47
  35. package/dist/cjs/OpenApiJsonSchema.js.map +1 -1
  36. package/dist/cjs/Transferable.js +2 -2
  37. package/dist/cjs/Transferable.js.map +1 -1
  38. package/dist/cjs/UrlParams.js +5 -1
  39. package/dist/cjs/UrlParams.js.map +1 -1
  40. package/dist/cjs/Worker.js.map +1 -1
  41. package/dist/cjs/WorkerError.js +1 -5
  42. package/dist/cjs/WorkerError.js.map +1 -1
  43. package/dist/cjs/WorkerRunner.js.map +1 -1
  44. package/dist/cjs/index.js +3 -1
  45. package/dist/cjs/internal/httpBody.js +1 -1
  46. package/dist/cjs/internal/httpBody.js.map +1 -1
  47. package/dist/cjs/internal/httpClientRequest.js.map +1 -1
  48. package/dist/cjs/internal/httpClientResponse.js +1 -1
  49. package/dist/cjs/internal/httpClientResponse.js.map +1 -1
  50. package/dist/cjs/internal/httpRouter.js +1 -1
  51. package/dist/cjs/internal/httpRouter.js.map +1 -1
  52. package/dist/cjs/internal/httpServer.js +7 -1
  53. package/dist/cjs/internal/httpServer.js.map +1 -1
  54. package/dist/cjs/internal/httpServerRequest.js +1 -1
  55. package/dist/cjs/internal/httpServerRequest.js.map +1 -1
  56. package/dist/cjs/internal/httpServerResponse.js.map +1 -1
  57. package/dist/cjs/internal/keyValueStore.js +1 -1
  58. package/dist/cjs/internal/keyValueStore.js.map +1 -1
  59. package/dist/cjs/internal/multipart.js +1 -1
  60. package/dist/cjs/internal/multipart.js.map +1 -1
  61. package/dist/cjs/internal/worker.js +6 -7
  62. package/dist/cjs/internal/worker.js.map +1 -1
  63. package/dist/cjs/internal/workerRunner.js +3 -4
  64. package/dist/cjs/internal/workerRunner.js.map +1 -1
  65. package/dist/dts/Headers.d.ts +4 -6
  66. package/dist/dts/Headers.d.ts.map +1 -1
  67. package/dist/dts/HttpApi.d.ts +64 -140
  68. package/dist/dts/HttpApi.d.ts.map +1 -1
  69. package/dist/dts/HttpApiBuilder.d.ts +84 -167
  70. package/dist/dts/HttpApiBuilder.d.ts.map +1 -1
  71. package/dist/dts/HttpApiClient.d.ts +34 -11
  72. package/dist/dts/HttpApiClient.d.ts.map +1 -1
  73. package/dist/dts/HttpApiEndpoint.d.ts +119 -273
  74. package/dist/dts/HttpApiEndpoint.d.ts.map +1 -1
  75. package/dist/dts/HttpApiError.d.ts +5 -2
  76. package/dist/dts/HttpApiError.d.ts.map +1 -1
  77. package/dist/dts/HttpApiGroup.d.ts +96 -194
  78. package/dist/dts/HttpApiGroup.d.ts.map +1 -1
  79. package/dist/dts/HttpApiMiddleware.d.ts +231 -0
  80. package/dist/dts/HttpApiMiddleware.d.ts.map +1 -0
  81. package/dist/dts/HttpApiSchema.d.ts +6 -2
  82. package/dist/dts/HttpApiSchema.d.ts.map +1 -1
  83. package/dist/dts/HttpApiSecurity.d.ts +1 -1
  84. package/dist/dts/HttpApiSecurity.d.ts.map +1 -1
  85. package/dist/dts/HttpApiSwagger.d.ts +2 -2
  86. package/dist/dts/HttpApiSwagger.d.ts.map +1 -1
  87. package/dist/dts/HttpBody.d.ts +2 -2
  88. package/dist/dts/HttpBody.d.ts.map +1 -1
  89. package/dist/dts/HttpClientRequest.d.ts +2 -2
  90. package/dist/dts/HttpClientRequest.d.ts.map +1 -1
  91. package/dist/dts/HttpClientResponse.d.ts +3 -3
  92. package/dist/dts/HttpClientResponse.d.ts.map +1 -1
  93. package/dist/dts/HttpIncomingMessage.d.ts +3 -3
  94. package/dist/dts/HttpIncomingMessage.d.ts.map +1 -1
  95. package/dist/dts/HttpRouter.d.ts +3 -3
  96. package/dist/dts/HttpRouter.d.ts.map +1 -1
  97. package/dist/dts/HttpServer.d.ts +15 -0
  98. package/dist/dts/HttpServer.d.ts.map +1 -1
  99. package/dist/dts/HttpServerRequest.d.ts +3 -3
  100. package/dist/dts/HttpServerRequest.d.ts.map +1 -1
  101. package/dist/dts/HttpServerRespondable.d.ts.map +1 -1
  102. package/dist/dts/HttpServerResponse.d.ts +2 -2
  103. package/dist/dts/HttpServerResponse.d.ts.map +1 -1
  104. package/dist/dts/KeyValueStore.d.ts +2 -2
  105. package/dist/dts/KeyValueStore.d.ts.map +1 -1
  106. package/dist/dts/Multipart.d.ts +3 -3
  107. package/dist/dts/Multipart.d.ts.map +1 -1
  108. package/dist/dts/OpenApi.d.ts +17 -39
  109. package/dist/dts/OpenApi.d.ts.map +1 -1
  110. package/dist/dts/OpenApiJsonSchema.d.ts +10 -5
  111. package/dist/dts/OpenApiJsonSchema.d.ts.map +1 -1
  112. package/dist/dts/Transferable.d.ts +4 -1
  113. package/dist/dts/Transferable.d.ts.map +1 -1
  114. package/dist/dts/UrlParams.d.ts +3 -6
  115. package/dist/dts/UrlParams.d.ts.map +1 -1
  116. package/dist/dts/Worker.d.ts +7 -8
  117. package/dist/dts/Worker.d.ts.map +1 -1
  118. package/dist/dts/WorkerError.d.ts +1 -1
  119. package/dist/dts/WorkerError.d.ts.map +1 -1
  120. package/dist/dts/WorkerRunner.d.ts +2 -3
  121. package/dist/dts/WorkerRunner.d.ts.map +1 -1
  122. package/dist/dts/index.d.ts +4 -0
  123. package/dist/dts/index.d.ts.map +1 -1
  124. package/dist/dts/internal/httpRouter.d.ts.map +1 -1
  125. package/dist/esm/Headers.js +7 -2
  126. package/dist/esm/Headers.js.map +1 -1
  127. package/dist/esm/HttpApi.js +88 -77
  128. package/dist/esm/HttpApi.js.map +1 -1
  129. package/dist/esm/HttpApiBuilder.js +236 -244
  130. package/dist/esm/HttpApiBuilder.js.map +1 -1
  131. package/dist/esm/HttpApiClient.js +64 -59
  132. package/dist/esm/HttpApiClient.js.map +1 -1
  133. package/dist/esm/HttpApiEndpoint.js +73 -106
  134. package/dist/esm/HttpApiEndpoint.js.map +1 -1
  135. package/dist/esm/HttpApiError.js +3 -4
  136. package/dist/esm/HttpApiError.js.map +1 -1
  137. package/dist/esm/HttpApiGroup.js +102 -99
  138. package/dist/esm/HttpApiGroup.js.map +1 -1
  139. package/dist/esm/HttpApiMiddleware.js +56 -0
  140. package/dist/esm/HttpApiMiddleware.js.map +1 -0
  141. package/dist/esm/HttpApiSchema.js +31 -5
  142. package/dist/esm/HttpApiSchema.js.map +1 -1
  143. package/dist/esm/HttpApiSecurity.js +1 -1
  144. package/dist/esm/HttpApiSecurity.js.map +1 -1
  145. package/dist/esm/HttpApiSwagger.js +4 -2
  146. package/dist/esm/HttpApiSwagger.js.map +1 -1
  147. package/dist/esm/HttpBody.js.map +1 -1
  148. package/dist/esm/HttpIncomingMessage.js +4 -1
  149. package/dist/esm/HttpIncomingMessage.js.map +1 -1
  150. package/dist/esm/HttpServer.js +11 -0
  151. package/dist/esm/HttpServer.js.map +1 -1
  152. package/dist/esm/HttpServerRespondable.js +1 -1
  153. package/dist/esm/HttpServerRespondable.js.map +1 -1
  154. package/dist/esm/OpenApi.js +97 -59
  155. package/dist/esm/OpenApi.js.map +1 -1
  156. package/dist/esm/OpenApiJsonSchema.js +56 -46
  157. package/dist/esm/OpenApiJsonSchema.js.map +1 -1
  158. package/dist/esm/Transferable.js +2 -2
  159. package/dist/esm/Transferable.js.map +1 -1
  160. package/dist/esm/UrlParams.js +4 -1
  161. package/dist/esm/UrlParams.js.map +1 -1
  162. package/dist/esm/Worker.js.map +1 -1
  163. package/dist/esm/WorkerError.js +1 -4
  164. package/dist/esm/WorkerError.js.map +1 -1
  165. package/dist/esm/WorkerRunner.js.map +1 -1
  166. package/dist/esm/index.js +4 -0
  167. package/dist/esm/index.js.map +1 -1
  168. package/dist/esm/internal/httpBody.js +1 -1
  169. package/dist/esm/internal/httpBody.js.map +1 -1
  170. package/dist/esm/internal/httpClientRequest.js.map +1 -1
  171. package/dist/esm/internal/httpClientResponse.js +1 -1
  172. package/dist/esm/internal/httpClientResponse.js.map +1 -1
  173. package/dist/esm/internal/httpRouter.js +1 -1
  174. package/dist/esm/internal/httpRouter.js.map +1 -1
  175. package/dist/esm/internal/httpServer.js +6 -0
  176. package/dist/esm/internal/httpServer.js.map +1 -1
  177. package/dist/esm/internal/httpServerRequest.js +1 -1
  178. package/dist/esm/internal/httpServerRequest.js.map +1 -1
  179. package/dist/esm/internal/httpServerResponse.js.map +1 -1
  180. package/dist/esm/internal/keyValueStore.js +1 -1
  181. package/dist/esm/internal/keyValueStore.js.map +1 -1
  182. package/dist/esm/internal/multipart.js +1 -1
  183. package/dist/esm/internal/multipart.js.map +1 -1
  184. package/dist/esm/internal/worker.js +6 -7
  185. package/dist/esm/internal/worker.js.map +1 -1
  186. package/dist/esm/internal/workerRunner.js +3 -4
  187. package/dist/esm/internal/workerRunner.js.map +1 -1
  188. package/package.json +10 -3
  189. package/src/Headers.ts +12 -4
  190. package/src/HttpApi.ts +183 -258
  191. package/src/HttpApiBuilder.ts +532 -481
  192. package/src/HttpApiClient.ts +163 -112
  193. package/src/HttpApiEndpoint.ts +443 -564
  194. package/src/HttpApiError.ts +4 -6
  195. package/src/HttpApiGroup.ts +277 -325
  196. package/src/HttpApiMiddleware.ts +318 -0
  197. package/src/HttpApiSchema.ts +39 -2
  198. package/src/HttpApiSecurity.ts +1 -1
  199. package/src/HttpApiSwagger.ts +3 -3
  200. package/src/HttpBody.ts +2 -2
  201. package/src/HttpClientRequest.ts +2 -2
  202. package/src/HttpClientResponse.ts +3 -3
  203. package/src/HttpIncomingMessage.ts +3 -3
  204. package/src/HttpRouter.ts +3 -3
  205. package/src/HttpServer.ts +21 -0
  206. package/src/HttpServerRequest.ts +3 -3
  207. package/src/HttpServerRespondable.ts +1 -1
  208. package/src/HttpServerResponse.ts +2 -2
  209. package/src/KeyValueStore.ts +2 -2
  210. package/src/Multipart.ts +3 -3
  211. package/src/OpenApi.ts +113 -104
  212. package/src/OpenApiJsonSchema.ts +67 -53
  213. package/src/Transferable.ts +2 -2
  214. package/src/UrlParams.ts +3 -3
  215. package/src/Worker.ts +7 -8
  216. package/src/WorkerError.ts +1 -1
  217. package/src/WorkerRunner.ts +2 -3
  218. package/src/index.ts +5 -0
  219. package/src/internal/httpBody.ts +2 -2
  220. package/src/internal/httpClientRequest.ts +2 -2
  221. package/src/internal/httpClientResponse.ts +3 -3
  222. package/src/internal/httpRouter.ts +2 -2
  223. package/src/internal/httpServer.ts +13 -0
  224. package/src/internal/httpServerRequest.ts +3 -3
  225. package/src/internal/httpServerResponse.ts +2 -2
  226. package/src/internal/keyValueStore.ts +1 -1
  227. package/src/internal/multipart.ts +3 -3
  228. package/src/internal/worker.ts +6 -7
  229. package/src/internal/workerRunner.ts +3 -4
@@ -1,12 +1,14 @@
1
1
  /**
2
2
  * @since 1.0.0
3
3
  */
4
- import * as ParseResult from "@effect/schema/ParseResult"
5
- import * as Schema from "@effect/schema/Schema"
6
4
  import * as Context from "effect/Context"
7
5
  import * as Effect from "effect/Effect"
8
6
  import { identity } from "effect/Function"
9
7
  import * as Option from "effect/Option"
8
+ import * as ParseResult from "effect/ParseResult"
9
+ import * as Schema from "effect/Schema"
10
+ import type * as AST from "effect/SchemaAST"
11
+ import type { Scope } from "effect/Scope"
10
12
  import type { Simplify } from "effect/Types"
11
13
  import * as HttpApi from "./HttpApi.js"
12
14
  import type { HttpApiEndpoint } from "./HttpApiEndpoint.js"
@@ -17,49 +19,89 @@ import * as HttpClientError from "./HttpClientError.js"
17
19
  import * as HttpClientRequest from "./HttpClientRequest.js"
18
20
  import * as HttpClientResponse from "./HttpClientResponse.js"
19
21
  import * as HttpMethod from "./HttpMethod.js"
22
+ import type { HttpApiMiddleware } from "./index.js"
20
23
 
21
24
  /**
22
25
  * @since 1.0.0
23
26
  * @category models
24
27
  */
25
- export type Client<A extends HttpApi.HttpApi.Any> = [A] extends
26
- [HttpApi.HttpApi<infer _Groups, infer _ApiError, infer _ApiErrorR>] ? {
27
- readonly [GroupName in _Groups["identifier"]]: [HttpApiGroup.WithName<_Groups, GroupName>] extends
28
- [HttpApiGroup<GroupName, infer _Endpoints, infer _GroupError, infer _GroupErrorR>] ? {
29
- readonly [Name in _Endpoints["name"]]: [HttpApiEndpoint.WithName<_Endpoints, Name>] extends [
30
- HttpApiEndpoint<
31
- Name,
32
- infer _Method,
33
- infer _Path,
34
- infer _Payload,
35
- infer _Headers,
36
- infer _Success,
37
- infer _Error,
38
- infer _R
39
- >
40
- ] ? (
41
- request: Simplify<HttpApiEndpoint.ClientRequest<_Path, _Payload, _Headers>>
42
- ) => Effect.Effect<
43
- _Success,
44
- _Error | _GroupError | _ApiError | HttpClientError.HttpClientError
45
- > :
46
- never
28
+ export type Client<Groups extends HttpApiGroup.Any, ApiError> = Simplify<
29
+ & {
30
+ readonly [Group in Extract<Groups, { readonly topLevel: false }> as HttpApiGroup.Name<Group>]: [Group] extends
31
+ [HttpApiGroup<infer _GroupName, infer _Endpoints, infer _GroupError, infer _GroupErrorR>] ? {
32
+ readonly [Endpoint in _Endpoints as HttpApiEndpoint.Name<Endpoint>]: Client.Method<
33
+ Endpoint,
34
+ ApiError,
35
+ _GroupError
36
+ >
47
37
  } :
48
38
  never
49
- } :
50
- never
39
+ }
40
+ & {
41
+ readonly [Method in Client.TopLevelMethods<Groups, ApiError> as Method[0]]: Method[1]
42
+ }
43
+ >
44
+
45
+ /**
46
+ * @since 1.0.0
47
+ * @category models
48
+ */
49
+ export declare namespace Client {
50
+ /**
51
+ * @since 1.0.0
52
+ * @category models
53
+ */
54
+ export type Method<Endpoint, ApiError, GroupError> = [Endpoint] extends [
55
+ HttpApiEndpoint<
56
+ infer _Name,
57
+ infer _Method,
58
+ infer _Path,
59
+ infer _UrlParams,
60
+ infer _Payload,
61
+ infer _Headers,
62
+ infer _Success,
63
+ infer _Error,
64
+ infer _R,
65
+ infer _RE
66
+ >
67
+ ] ? (
68
+ request: Simplify<HttpApiEndpoint.ClientRequest<_Path, _UrlParams, _Payload, _Headers>>
69
+ ) => Effect.Effect<
70
+ _Success,
71
+ _Error | GroupError | ApiError | HttpClientError.HttpClientError
72
+ > :
73
+ never
74
+
75
+ /**
76
+ * @since 1.0.0
77
+ * @category models
78
+ */
79
+ export type TopLevelMethods<Groups extends HttpApiGroup.Any, ApiError> =
80
+ Extract<Groups, { readonly topLevel: true }> extends
81
+ HttpApiGroup<infer _Id, infer _Endpoints, infer _Error, infer _ErrorR, infer _TopLevel> ?
82
+ _Endpoints extends infer Endpoint ? [HttpApiEndpoint.Name<Endpoint>, Client.Method<Endpoint, ApiError, _Error>]
83
+ : never :
84
+ never
85
+ }
51
86
 
52
87
  /**
53
88
  * @since 1.0.0
54
89
  * @category constructors
55
90
  */
56
- export const make = <A extends HttpApi.HttpApi.Any>(
57
- api: A,
91
+ export const make = <Groups extends HttpApiGroup.Any, ApiError, ApiR>(
92
+ api: HttpApi.HttpApi<Groups, ApiError, ApiR>,
58
93
  options?: {
59
94
  readonly transformClient?: ((client: HttpClient.HttpClient) => HttpClient.HttpClient) | undefined
95
+ readonly transformResponse?:
96
+ | ((effect: Effect.Effect<unknown, unknown, Scope>) => Effect.Effect<unknown, unknown, Scope>)
97
+ | undefined
60
98
  readonly baseUrl?: string | undefined
61
99
  }
62
- ): Effect.Effect<Simplify<Client<A>>, never, HttpApi.HttpApi.Context<A> | HttpClient.HttpClient> =>
100
+ ): Effect.Effect<
101
+ Simplify<Client<Groups, ApiError>>,
102
+ never,
103
+ HttpApiMiddleware.HttpApiMiddleware.Without<ApiR | HttpApiGroup.ClientContext<Groups>> | HttpClient.HttpClient
104
+ > =>
63
105
  Effect.gen(function*() {
64
106
  const context = yield* Effect.context<any>()
65
107
  const httpClient = (yield* HttpClient.HttpClient).pipe(
@@ -69,82 +111,26 @@ export const make = <A extends HttpApi.HttpApi.Any>(
69
111
  const client: Record<string, Record<string, any>> = {}
70
112
  HttpApi.reflect(api as any, {
71
113
  onGroup({ group }) {
114
+ if (group.topLevel) return
72
115
  client[group.identifier] = {}
73
116
  },
74
- onEndpoint({ endpoint, errors, group, successAST, successEncoding, successStatus }) {
117
+ onEndpoint({ endpoint, errors, group, successes }) {
75
118
  const makeUrl = compilePath(endpoint.path)
76
- const successDecode = successAST.pipe(
77
- Option.map((ast) => {
78
- const schema = Schema.make(ast)
79
- switch (successEncoding.kind) {
80
- case "Json": {
81
- return HttpClientResponse.schemaBodyJson(schema)
82
- }
83
- case "UrlParams": {
84
- return HttpClientResponse.schemaBodyUrlParams(schema as any)
85
- }
86
- case "Uint8Array": {
87
- return (response: HttpClientResponse.HttpClientResponse) =>
88
- response.arrayBuffer.pipe(
89
- Effect.map((buffer) => new Uint8Array(buffer)),
90
- Effect.flatMap(Schema.decodeUnknown(schema))
91
- )
92
- }
93
- case "Text": {
94
- return (response: HttpClientResponse.HttpClientResponse) =>
95
- Effect.flatMap(response.text, Schema.decodeUnknown(schema))
96
- }
97
- }
98
- })
99
- )
100
- const handleError = (
101
- request: HttpClientRequest.HttpClientRequest,
102
- response: HttpClientResponse.HttpClientResponse
103
- ) => {
104
- const error = errors.get(response.status)
105
- if (error === undefined) {
106
- return Effect.die(
107
- new HttpClientError.ResponseError({
108
- reason: "Decode",
109
- request,
110
- response
111
- })
112
- )
113
- } else if (Option.isNone(error)) {
114
- return Effect.fail(
115
- new HttpClientError.ResponseError({
116
- reason: "StatusCode",
117
- request,
118
- response
119
- })
120
- )
119
+ const decodeMap: Record<
120
+ number | "orElse",
121
+ (response: HttpClientResponse.HttpClientResponse) => Effect.Effect<any, any>
122
+ > = { orElse: statusOrElse }
123
+ errors.forEach((ast, status) => {
124
+ if (ast._tag === "None") {
125
+ decodeMap[status] = statusCodeError
126
+ return
121
127
  }
122
- const decode = Schema.decodeUnknown(Schema.make(error.value))
123
- return response.text.pipe(
124
- Effect.flatMap((text) =>
125
- text === "" ? Effect.void : Effect.try({
126
- try: () => JSON.parse(text),
127
- catch: (cause) =>
128
- new HttpClientError.ResponseError({
129
- reason: "Decode",
130
- request,
131
- response,
132
- cause
133
- })
134
- })
135
- ),
136
- Effect.flatMap((json) =>
137
- Effect.mapError(decode(json), (cause) =>
138
- new HttpClientError.ResponseError({
139
- reason: "Decode",
140
- request,
141
- response,
142
- cause
143
- }))
144
- ),
145
- Effect.flatMap(Effect.fail)
146
- )
147
- }
128
+ const decode = schemaToResponse(ast.value)
129
+ decodeMap[status] = (response) => Effect.flatMap(decode(response), Effect.fail)
130
+ })
131
+ successes.forEach((ast, status) => {
132
+ decodeMap[status] = ast._tag === "None" ? responseAsVoid : schemaToResponse(ast.value)
133
+ })
148
134
  const isMultipart = endpoint.payloadSchema.pipe(
149
135
  Option.map((schema) => HttpApiSchema.getMultipart(schema.ast)),
150
136
  Option.getOrElse(() => false)
@@ -156,12 +142,16 @@ export const make = <A extends HttpApi.HttpApi.Any>(
156
142
  const encodeHeaders = endpoint.headersSchema.pipe(
157
143
  Option.map(Schema.encodeUnknown)
158
144
  )
159
- client[group.identifier][endpoint.name] = (request: {
145
+ const encodeUrlParams = endpoint.urlParamsSchema.pipe(
146
+ Option.map(Schema.encodeUnknown)
147
+ )
148
+ ;(group.topLevel ? client : client[group.identifier])[endpoint.name] = (request: {
160
149
  readonly path: any
150
+ readonly urlParams: any
161
151
  readonly payload: any
162
152
  readonly headers: any
163
153
  }) => {
164
- const url = request && request.path ? makeUrl(request && request.path) : endpoint.path
154
+ const url = request && request.path ? makeUrl(request.path) : endpoint.path
165
155
  const baseRequest = HttpClientRequest.make(endpoint.method)(url)
166
156
  return (isMultipart ?
167
157
  Effect.succeed(baseRequest.pipe(
@@ -185,15 +175,17 @@ export const make = <A extends HttpApi.HttpApi.Any>(
185
175
  )
186
176
  )
187
177
  : identity,
188
- Effect.flatMap((request) =>
189
- Effect.flatMap(httpClient.execute(request), (response) =>
190
- response.status !== successStatus
191
- ? handleError(request, response)
192
- : Effect.succeed(response))
193
- ),
194
- successDecode._tag === "Some"
195
- ? Effect.flatMap(successDecode.value)
196
- : Effect.asVoid,
178
+ encodeUrlParams._tag === "Some"
179
+ ? Effect.flatMap((httpRequest) =>
180
+ encodeUrlParams.value(request.urlParams).pipe(
181
+ Effect.orDie,
182
+ Effect.map((params) => HttpClientRequest.appendUrlParams(httpRequest, params as any))
183
+ )
184
+ )
185
+ : identity,
186
+ Effect.flatMap(httpClient.execute),
187
+ Effect.flatMap(HttpClientResponse.matchStatus(decodeMap)),
188
+ options?.transformResponse === undefined ? identity : options.transformResponse,
197
189
  Effect.scoped,
198
190
  Effect.catchIf(ParseResult.isParseError, Effect.die),
199
191
  Effect.mapInputContext((input) => Context.merge(context, input))
@@ -226,3 +218,62 @@ const compilePath = (path: string) => {
226
218
  return url
227
219
  }
228
220
  }
221
+
222
+ const schemaToResponse = (
223
+ ast: AST.AST
224
+ ): (response: HttpClientResponse.HttpClientResponse) => Effect.Effect<any, any> => {
225
+ const schema = Schema.make(ast)
226
+ const encoding = HttpApiSchema.getEncoding(ast)
227
+ const decode = Schema.decodeUnknown(schema)
228
+ switch (encoding.kind) {
229
+ case "Json": {
230
+ return (response) => Effect.flatMap(responseJson(response), decode)
231
+ }
232
+ case "UrlParams": {
233
+ return HttpClientResponse.schemaBodyUrlParams(schema as any)
234
+ }
235
+ case "Uint8Array": {
236
+ return (response: HttpClientResponse.HttpClientResponse) =>
237
+ response.arrayBuffer.pipe(
238
+ Effect.map((buffer) => new Uint8Array(buffer)),
239
+ Effect.flatMap(decode)
240
+ )
241
+ }
242
+ case "Text": {
243
+ return (response) => Effect.flatMap(response.text, decode)
244
+ }
245
+ }
246
+ }
247
+
248
+ const responseJson = (response: HttpClientResponse.HttpClientResponse) =>
249
+ Effect.flatMap(response.text, (text) =>
250
+ text === "" ? Effect.void : Effect.try({
251
+ try: () => JSON.parse(text),
252
+ catch: (cause) =>
253
+ new HttpClientError.ResponseError({
254
+ reason: "Decode",
255
+ request: response.request,
256
+ response,
257
+ cause
258
+ })
259
+ }))
260
+
261
+ const statusOrElse = (response: HttpClientResponse.HttpClientResponse) =>
262
+ Effect.fail(
263
+ new HttpClientError.ResponseError({
264
+ reason: "Decode",
265
+ request: response.request,
266
+ response
267
+ })
268
+ )
269
+
270
+ const statusCodeError = (response: HttpClientResponse.HttpClientResponse) =>
271
+ Effect.fail(
272
+ new HttpClientError.ResponseError({
273
+ reason: "StatusCode",
274
+ request: response.request,
275
+ response
276
+ })
277
+ )
278
+
279
+ const responseAsVoid = (_response: HttpClientResponse.HttpClientResponse) => Effect.void