@duplojs/http 0.2.0 → 0.4.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/dist/client/getBody.cjs +22 -0
- package/dist/client/getBody.d.ts +1 -0
- package/dist/client/getBody.mjs +20 -0
- package/dist/client/hooks.cjs +79 -0
- package/dist/client/hooks.d.ts +33 -0
- package/dist/client/hooks.mjs +70 -0
- package/dist/client/httpClient.cjs +153 -0
- package/dist/client/httpClient.d.ts +60 -0
- package/dist/client/httpClient.mjs +130 -0
- package/dist/client/index.cjs +33 -0
- package/dist/client/index.d.ts +9 -0
- package/dist/client/index.mjs +9 -0
- package/dist/client/insertParamsInPath.cjs +12 -0
- package/dist/client/insertParamsInPath.d.ts +2 -0
- package/dist/client/insertParamsInPath.mjs +10 -0
- package/dist/client/kind.cjs +9 -0
- package/dist/client/kind.d.ts +6 -0
- package/dist/client/kind.mjs +7 -0
- package/dist/client/promiseRequest.cjs +355 -0
- package/dist/client/promiseRequest.d.ts +98 -0
- package/dist/client/promiseRequest.mjs +332 -0
- package/dist/client/queryToString.cjs +25 -0
- package/dist/client/queryToString.d.ts +2 -0
- package/dist/client/queryToString.mjs +23 -0
- package/dist/client/types/ObjectCanBeEmpty.cjs +2 -0
- package/dist/client/types/ObjectCanBeEmpty.d.ts +4 -0
- package/dist/client/types/ObjectCanBeEmpty.mjs +1 -0
- package/dist/client/types/clientRequestParams.cjs +2 -0
- package/dist/client/types/clientRequestParams.d.ts +51 -0
- package/dist/client/types/clientRequestParams.mjs +1 -0
- package/dist/client/types/clientResponse.cjs +2 -0
- package/dist/client/types/clientResponse.d.ts +34 -0
- package/dist/client/types/clientResponse.mjs +1 -0
- package/dist/client/types/index.cjs +7 -0
- package/dist/client/types/index.d.ts +4 -0
- package/dist/client/types/index.mjs +4 -0
- package/dist/client/types/serverRoute.cjs +2 -0
- package/dist/client/types/serverRoute.d.ts +22 -0
- package/dist/client/types/serverRoute.mjs +1 -0
- package/dist/client/unexpectedResponseError.cjs +44 -0
- package/dist/client/unexpectedResponseError.d.ts +38 -0
- package/dist/client/unexpectedResponseError.mjs +39 -0
- package/dist/core/functionsBuilders/route/default.cjs +10 -9
- package/dist/core/functionsBuilders/route/default.mjs +3 -2
- package/dist/core/functionsBuilders/route/hook.cjs +22 -22
- package/dist/core/functionsBuilders/route/hook.d.ts +2 -2
- package/dist/core/functionsBuilders/route/hook.mjs +2 -2
- package/dist/core/functionsBuilders/steps/create.d.ts +2 -2
- package/dist/core/functionsBuilders/steps/defaults/checkerStep.cjs +3 -2
- package/dist/core/functionsBuilders/steps/defaults/checkerStep.mjs +3 -2
- package/dist/core/functionsBuilders/steps/defaults/cutStep.cjs +3 -2
- package/dist/core/functionsBuilders/steps/defaults/cutStep.mjs +3 -2
- package/dist/core/functionsBuilders/steps/defaults/extractStep.cjs +6 -5
- package/dist/core/functionsBuilders/steps/defaults/extractStep.mjs +4 -3
- package/dist/core/functionsBuilders/steps/defaults/handlerStep.cjs +3 -2
- package/dist/core/functionsBuilders/steps/defaults/handlerStep.mjs +3 -2
- package/dist/core/functionsBuilders/steps/defaults/processStep.cjs +5 -4
- package/dist/core/functionsBuilders/steps/defaults/processStep.mjs +3 -2
- package/dist/core/hub/defaultNotfoundHandler.d.ts +1 -1
- package/dist/core/hub/index.cjs +1 -1
- package/dist/core/hub/index.mjs +1 -1
- package/dist/core/index.cjs +37 -34
- package/dist/core/index.mjs +5 -3
- package/dist/core/response/base.cjs +40 -0
- package/dist/core/response/base.d.ts +21 -0
- package/dist/core/response/base.mjs +38 -0
- package/dist/core/response/contract.cjs +2 -2
- package/dist/core/response/contract.d.ts +120 -118
- package/dist/core/response/contract.mjs +2 -2
- package/dist/core/{route/hooks/response.cjs → response/hook.cjs} +4 -3
- package/dist/core/{route/hooks/response.d.ts → response/hook.d.ts} +2 -2
- package/dist/core/{route/hooks/response.mjs → response/hook.mjs} +3 -2
- package/dist/core/response/index.cjs +9 -38
- package/dist/core/response/index.d.ts +3 -20
- package/dist/core/response/index.mjs +3 -38
- package/dist/core/response/predicted.cjs +22 -0
- package/dist/core/response/predicted.d.ts +11 -0
- package/dist/core/response/predicted.mjs +20 -0
- package/dist/core/route/{hooks/index.cjs → hooks.cjs} +2 -3
- package/dist/core/route/{hooks/index.d.ts → hooks.d.ts} +4 -4
- package/dist/core/route/{hooks/index.mjs → hooks.mjs} +2 -2
- package/dist/core/route/index.cjs +4 -4
- package/dist/core/route/index.mjs +1 -1
- package/dist/core/steps/cut.d.ts +3 -3
- package/dist/core/steps/handler.d.ts +3 -3
- package/dist/core/steps/identifier.d.ts +2 -2
- package/dist/core/steps/types/stepFunctionParams.d.ts +2 -2
- package/dist/core/types/forbiddenBigintDataParser.cjs +2 -0
- package/dist/core/types/forbiddenBigintDataParser.d.ts +6 -0
- package/dist/core/types/forbiddenBigintDataParser.mjs +1 -0
- package/dist/core/types/index.cjs +1 -0
- package/dist/core/types/index.d.ts +1 -0
- package/dist/core/types/index.mjs +1 -0
- package/dist/interfaces/node/createHttpServer.cjs +1 -0
- package/dist/interfaces/node/createHttpServer.d.ts +2 -1
- package/dist/interfaces/node/createHttpServer.mjs +1 -0
- package/dist/interfaces/node/hooks.cjs +16 -13
- package/dist/interfaces/node/hooks.mjs +15 -12
- package/dist/plugins/codeGenerator/index.cjs +0 -3
- package/dist/plugins/codeGenerator/index.mjs +1 -1
- package/dist/plugins/codeGenerator/plugin.cjs +1 -1
- package/dist/plugins/codeGenerator/plugin.mjs +1 -1
- package/dist/plugins/codeGenerator/routeToDataParser.cjs +4 -55
- package/dist/plugins/codeGenerator/routeToDataParser.d.ts +2 -181
- package/dist/plugins/codeGenerator/routeToDataParser.mjs +6 -54
- package/dist/plugins/openApiGenerator/aggregateStepContract.cjs +62 -0
- package/dist/plugins/openApiGenerator/aggregateStepContract.d.ts +18 -0
- package/dist/plugins/openApiGenerator/aggregateStepContract.mjs +60 -0
- package/dist/plugins/openApiGenerator/index.cjs +17 -0
- package/dist/plugins/openApiGenerator/index.d.ts +7 -0
- package/dist/plugins/openApiGenerator/index.mjs +7 -0
- package/dist/plugins/openApiGenerator/makeOpenApiPage.cjs +30 -0
- package/dist/plugins/openApiGenerator/makeOpenApiPage.d.ts +7 -0
- package/dist/plugins/openApiGenerator/makeOpenApiPage.mjs +28 -0
- package/dist/plugins/openApiGenerator/makeOpenApiRoute.cjs +15 -0
- package/dist/plugins/openApiGenerator/makeOpenApiRoute.d.ts +18 -0
- package/dist/plugins/openApiGenerator/makeOpenApiRoute.mjs +13 -0
- package/dist/plugins/openApiGenerator/plugin.cjs +90 -0
- package/dist/plugins/openApiGenerator/plugin.d.ts +49 -0
- package/dist/plugins/openApiGenerator/plugin.mjs +88 -0
- package/dist/plugins/openApiGenerator/routeToOpenApi.cjs +163 -0
- package/dist/plugins/openApiGenerator/routeToOpenApi.d.ts +35 -0
- package/dist/plugins/openApiGenerator/routeToOpenApi.mjs +161 -0
- package/dist/plugins/openApiGenerator/types/endpointResponse.cjs +2 -0
- package/dist/plugins/openApiGenerator/types/endpointResponse.d.ts +19 -0
- package/dist/plugins/openApiGenerator/types/endpointResponse.mjs +1 -0
- package/dist/plugins/openApiGenerator/types/entrypoint.cjs +2 -0
- package/dist/plugins/openApiGenerator/types/entrypoint.d.ts +22 -0
- package/dist/plugins/openApiGenerator/types/entrypoint.mjs +1 -0
- package/dist/plugins/openApiGenerator/types/entrypointKey.cjs +2 -0
- package/dist/plugins/openApiGenerator/types/entrypointKey.d.ts +1 -0
- package/dist/plugins/openApiGenerator/types/entrypointKey.mjs +1 -0
- package/dist/plugins/openApiGenerator/types/index.cjs +11 -0
- package/dist/plugins/openApiGenerator/types/index.d.ts +8 -0
- package/dist/plugins/openApiGenerator/types/index.mjs +8 -0
- package/dist/plugins/openApiGenerator/types/openApiDocument.cjs +2 -0
- package/dist/plugins/openApiGenerator/types/openApiDocument.d.ts +31 -0
- package/dist/plugins/openApiGenerator/types/openApiDocument.mjs +1 -0
- package/dist/plugins/openApiGenerator/types/openApiMethod.cjs +2 -0
- package/dist/plugins/openApiGenerator/types/openApiMethod.d.ts +1 -0
- package/dist/plugins/openApiGenerator/types/openApiMethod.mjs +1 -0
- package/dist/plugins/openApiGenerator/types/openApiOperation.cjs +2 -0
- package/dist/plugins/openApiGenerator/types/openApiOperation.d.ts +8 -0
- package/dist/plugins/openApiGenerator/types/openApiOperation.mjs +1 -0
- package/dist/plugins/openApiGenerator/types/openApiPath.cjs +2 -0
- package/dist/plugins/openApiGenerator/types/openApiPath.d.ts +4 -0
- package/dist/plugins/openApiGenerator/types/openApiPath.mjs +1 -0
- package/dist/plugins/openApiGenerator/types/openApiSecuritySchema.cjs +2 -0
- package/dist/plugins/openApiGenerator/types/openApiSecuritySchema.d.ts +8 -0
- package/dist/plugins/openApiGenerator/types/openApiSecuritySchema.mjs +1 -0
- package/package.json +17 -4
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
import { unwrap } from '@duplojs/utils';
|
|
2
|
+
import { getBody } from './getBody.mjs';
|
|
3
|
+
import { insertParamsInPath } from './insertParamsInPath.mjs';
|
|
4
|
+
import { queryToString } from './queryToString.mjs';
|
|
5
|
+
import { launchRequestHook, launchResponseHook, launchNotPredictedHook, launchResponseTypeHook, launchExpectedResponseHook, launchInformationHook, launchCodeHook, launchErrorHook } from './hooks.mjs';
|
|
6
|
+
import * as EE from '@duplojs/utils/either';
|
|
7
|
+
import * as SS from '@duplojs/utils/string';
|
|
8
|
+
import * as AA from '@duplojs/utils/array';
|
|
9
|
+
import { UnexpectedInformationResponseError, UnexpectedCodeResponseError, UnexpectedResponseTypeError, UnexpectedResponseError } from './unexpectedResponseError.mjs';
|
|
10
|
+
|
|
11
|
+
class PromiseRequest extends Promise {
|
|
12
|
+
params;
|
|
13
|
+
hooks = {};
|
|
14
|
+
constructor(params) {
|
|
15
|
+
super((resolve) => void EE
|
|
16
|
+
.rightAsyncPipe(Promise.resolve(params), (params) => launchRequestHook(params.hooks.request, this.hooks.request ?? [], params), PromiseRequest.fetch, (response) => launchResponseHook(params.hooks.response, this.hooks.response ?? [], response), async (response) => {
|
|
17
|
+
if (params.disabledPredicateMode === false && response.predicted === false) {
|
|
18
|
+
await launchNotPredictedHook(params.hooks.notPredictedResponse, this.hooks.notPredictedResponse ?? [], response);
|
|
19
|
+
return EE.right("response", response);
|
|
20
|
+
}
|
|
21
|
+
if (SS.startsWith(response.code, "1")) {
|
|
22
|
+
await launchResponseTypeHook(params.hooks.informationalResponseType, this.hooks.informationalResponseType ?? [], response);
|
|
23
|
+
}
|
|
24
|
+
else if (SS.startsWith(response.code, "2")) {
|
|
25
|
+
await launchResponseTypeHook(params.hooks.successfulResponseType, this.hooks.successfulResponseType ?? [], response);
|
|
26
|
+
await launchExpectedResponseHook(params.hooks.expectedResponse, this.hooks.expectedResponse ?? [], response);
|
|
27
|
+
}
|
|
28
|
+
else if (SS.startsWith(response.code, "3")) {
|
|
29
|
+
await launchResponseTypeHook(params.hooks.redirectionResponseType, this.hooks.redirectionResponseType ?? [], response);
|
|
30
|
+
}
|
|
31
|
+
else if (SS.startsWith(response.code, "4")) {
|
|
32
|
+
await launchResponseTypeHook(params.hooks.clientErrorResponseType, this.hooks.clientErrorResponseType ?? [], response);
|
|
33
|
+
await launchExpectedResponseHook(params.hooks.expectedResponse, this.hooks.expectedResponse ?? [], response);
|
|
34
|
+
}
|
|
35
|
+
else if (SS.startsWith(response.code, "5")) {
|
|
36
|
+
await launchResponseTypeHook(params.hooks.serverErrorResponseType, this.hooks.serverErrorResponseType ?? [], response);
|
|
37
|
+
}
|
|
38
|
+
if (response.information !== undefined) {
|
|
39
|
+
await launchInformationHook(params.hooks.information[response.information] ?? [], this.hooks.information?.[response.information] ?? [], response);
|
|
40
|
+
}
|
|
41
|
+
await launchCodeHook(params.hooks.code[response.code] ?? [], this.hooks.code?.[response.code] ?? [], response);
|
|
42
|
+
return EE.right("response", response);
|
|
43
|
+
})
|
|
44
|
+
.then(async (result) => {
|
|
45
|
+
if (EE.eitherFutureErrorKind.has(result)) {
|
|
46
|
+
const error = unwrap(result);
|
|
47
|
+
await launchErrorHook(params.hooks.error, this.hooks.error ?? [], error, params);
|
|
48
|
+
return EE.left("request-error", {
|
|
49
|
+
error,
|
|
50
|
+
requestParams: params,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return result;
|
|
54
|
+
})
|
|
55
|
+
.then(resolve));
|
|
56
|
+
this.params = params;
|
|
57
|
+
}
|
|
58
|
+
addRequestInterceptor(callback) {
|
|
59
|
+
this.hooks.request ??= [];
|
|
60
|
+
this.hooks.request.push(callback);
|
|
61
|
+
return this;
|
|
62
|
+
}
|
|
63
|
+
addResponseInterceptor(callback) {
|
|
64
|
+
this.hooks.response ??= [];
|
|
65
|
+
this.hooks.response.push(callback);
|
|
66
|
+
return this;
|
|
67
|
+
}
|
|
68
|
+
whenNotPredictedResponse(callback) {
|
|
69
|
+
this.hooks.notPredictedResponse ??= [];
|
|
70
|
+
this.hooks.notPredictedResponse.push(callback);
|
|
71
|
+
return this;
|
|
72
|
+
}
|
|
73
|
+
whenInformation(information, callback) {
|
|
74
|
+
const formattedInformation = AA.coalescing(information);
|
|
75
|
+
formattedInformation.forEach((information) => {
|
|
76
|
+
this.hooks.information ??= {};
|
|
77
|
+
this.hooks.information[information] ??= [];
|
|
78
|
+
this.hooks.information[information].push(callback);
|
|
79
|
+
});
|
|
80
|
+
return this;
|
|
81
|
+
}
|
|
82
|
+
whenCode(code, callback) {
|
|
83
|
+
const formattedCode = AA.coalescing(code);
|
|
84
|
+
formattedCode.forEach((code) => {
|
|
85
|
+
this.hooks.code ??= {};
|
|
86
|
+
this.hooks.code[code] ??= [];
|
|
87
|
+
this.hooks.code[code].push(callback);
|
|
88
|
+
});
|
|
89
|
+
return this;
|
|
90
|
+
}
|
|
91
|
+
whenInformationalResponse(callback) {
|
|
92
|
+
this.hooks.informationalResponseType ??= [];
|
|
93
|
+
this.hooks.informationalResponseType.push(callback);
|
|
94
|
+
return this;
|
|
95
|
+
}
|
|
96
|
+
whenSuccessfulResponse(callback) {
|
|
97
|
+
this.hooks.successfulResponseType ??= [];
|
|
98
|
+
this.hooks.successfulResponseType.push(callback);
|
|
99
|
+
return this;
|
|
100
|
+
}
|
|
101
|
+
whenRedirectionResponse(callback) {
|
|
102
|
+
this.hooks.redirectionResponseType ??= [];
|
|
103
|
+
this.hooks.redirectionResponseType.push(callback);
|
|
104
|
+
return this;
|
|
105
|
+
}
|
|
106
|
+
whenClientErrorResponse(callback) {
|
|
107
|
+
this.hooks.clientErrorResponseType ??= [];
|
|
108
|
+
this.hooks.clientErrorResponseType.push(callback);
|
|
109
|
+
return this;
|
|
110
|
+
}
|
|
111
|
+
whenServerErrorResponse(callback) {
|
|
112
|
+
this.hooks.serverErrorResponseType ??= [];
|
|
113
|
+
this.hooks.serverErrorResponseType.push(callback);
|
|
114
|
+
return this;
|
|
115
|
+
}
|
|
116
|
+
whenExpectedResponse(callback) {
|
|
117
|
+
this.hooks.expectedResponse ??= [];
|
|
118
|
+
this.hooks.expectedResponse.push(callback);
|
|
119
|
+
return this;
|
|
120
|
+
}
|
|
121
|
+
whenError(callback) {
|
|
122
|
+
this.hooks.error ??= [];
|
|
123
|
+
this.hooks.error.push(callback);
|
|
124
|
+
return this;
|
|
125
|
+
}
|
|
126
|
+
iWantInformation(information) {
|
|
127
|
+
const formattedInformation = AA.coalescing(information);
|
|
128
|
+
return this.then(EE.whenIsRight((response) => {
|
|
129
|
+
if (response.information !== undefined
|
|
130
|
+
&& AA.includes(formattedInformation, response.information)) {
|
|
131
|
+
return EE.right("response", response);
|
|
132
|
+
}
|
|
133
|
+
return EE.left("unexpect-response", response);
|
|
134
|
+
}));
|
|
135
|
+
}
|
|
136
|
+
iWantCode(code) {
|
|
137
|
+
const formattedCode = AA.coalescing(code);
|
|
138
|
+
return this.then(EE.whenIsRight((response) => {
|
|
139
|
+
if (AA.includes(formattedCode, response.code)) {
|
|
140
|
+
return EE.right("response", response);
|
|
141
|
+
}
|
|
142
|
+
return EE.left("unexpect-response", response);
|
|
143
|
+
}));
|
|
144
|
+
}
|
|
145
|
+
iWantInformationalResponse() {
|
|
146
|
+
return this.then(EE.whenIsRight((response) => {
|
|
147
|
+
if (SS.startsWith(response.code, "1")) {
|
|
148
|
+
return EE.right("response", response);
|
|
149
|
+
}
|
|
150
|
+
return EE.left("unexpect-response", response);
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
iWantSuccessfulResponse() {
|
|
154
|
+
return this.then(EE.whenIsRight((response) => {
|
|
155
|
+
if (SS.startsWith(response.code, "2")) {
|
|
156
|
+
return EE.right("response", response);
|
|
157
|
+
}
|
|
158
|
+
return EE.left("unexpect-response", response);
|
|
159
|
+
}));
|
|
160
|
+
}
|
|
161
|
+
iWantRedirectionResponse() {
|
|
162
|
+
return this.then(EE.whenIsRight((response) => {
|
|
163
|
+
if (SS.startsWith(response.code, "3")) {
|
|
164
|
+
return EE.right("response", response);
|
|
165
|
+
}
|
|
166
|
+
return EE.left("unexpect-response", response);
|
|
167
|
+
}));
|
|
168
|
+
}
|
|
169
|
+
iWantClientErrorResponse() {
|
|
170
|
+
return this.then(EE.whenIsRight((response) => {
|
|
171
|
+
if (SS.startsWith(response.code, "4")) {
|
|
172
|
+
return EE.right("response", response);
|
|
173
|
+
}
|
|
174
|
+
return EE.left("unexpect-response", response);
|
|
175
|
+
}));
|
|
176
|
+
}
|
|
177
|
+
iWantServerErrorResponse() {
|
|
178
|
+
return this.then(EE.whenIsRight((response) => {
|
|
179
|
+
if (SS.startsWith(response.code, "5")) {
|
|
180
|
+
return EE.right("response", response);
|
|
181
|
+
}
|
|
182
|
+
return EE.left("unexpect-response", response);
|
|
183
|
+
}));
|
|
184
|
+
}
|
|
185
|
+
iWantExpectedResponse() {
|
|
186
|
+
return this.then(EE.whenIsRight((response) => {
|
|
187
|
+
if (SS.startsWith(response.code, "2") || SS.startsWith(response.code, "4")) {
|
|
188
|
+
return EE.right("response", response);
|
|
189
|
+
}
|
|
190
|
+
return EE.left("unexpect-response", response);
|
|
191
|
+
}));
|
|
192
|
+
}
|
|
193
|
+
iWantInformationOrThrow(information) {
|
|
194
|
+
return this
|
|
195
|
+
.iWantInformation(information)
|
|
196
|
+
.then((maybeResponse) => {
|
|
197
|
+
if (EE.isRight(maybeResponse)) {
|
|
198
|
+
return unwrap(maybeResponse);
|
|
199
|
+
}
|
|
200
|
+
throw new UnexpectedInformationResponseError(information, unwrap(maybeResponse));
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
iWantCodeOrThrow(code) {
|
|
204
|
+
return this
|
|
205
|
+
.iWantCode(code)
|
|
206
|
+
.then((maybeResponse) => {
|
|
207
|
+
if (EE.isRight(maybeResponse)) {
|
|
208
|
+
return unwrap(maybeResponse);
|
|
209
|
+
}
|
|
210
|
+
throw new UnexpectedCodeResponseError(code, unwrap(maybeResponse));
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
iWantInformationalResponseOrThrow() {
|
|
214
|
+
return this
|
|
215
|
+
.iWantInformationalResponse()
|
|
216
|
+
.then((maybeResponse) => {
|
|
217
|
+
if (EE.isRight(maybeResponse)) {
|
|
218
|
+
return unwrap(maybeResponse);
|
|
219
|
+
}
|
|
220
|
+
throw new UnexpectedResponseTypeError("informational", unwrap(maybeResponse));
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
iWantSuccessfulResponseOrThrow() {
|
|
224
|
+
return this
|
|
225
|
+
.iWantSuccessfulResponse()
|
|
226
|
+
.then((maybeResponse) => {
|
|
227
|
+
if (EE.isRight(maybeResponse)) {
|
|
228
|
+
return unwrap(maybeResponse);
|
|
229
|
+
}
|
|
230
|
+
throw new UnexpectedResponseTypeError("successful", unwrap(maybeResponse));
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
iWantRedirectionResponseOrThrow() {
|
|
234
|
+
return this
|
|
235
|
+
.iWantRedirectionResponse()
|
|
236
|
+
.then((maybeResponse) => {
|
|
237
|
+
if (EE.isRight(maybeResponse)) {
|
|
238
|
+
return unwrap(maybeResponse);
|
|
239
|
+
}
|
|
240
|
+
throw new UnexpectedResponseTypeError("redirection", unwrap(maybeResponse));
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
iWantClientErrorResponseOrThrow() {
|
|
244
|
+
return this
|
|
245
|
+
.iWantClientErrorResponse()
|
|
246
|
+
.then((maybeResponse) => {
|
|
247
|
+
if (EE.isRight(maybeResponse)) {
|
|
248
|
+
return unwrap(maybeResponse);
|
|
249
|
+
}
|
|
250
|
+
throw new UnexpectedResponseTypeError("clientError", unwrap(maybeResponse));
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
iWantServerErrorResponseOrThrow() {
|
|
254
|
+
return this
|
|
255
|
+
.iWantServerErrorResponse()
|
|
256
|
+
.then((maybeResponse) => {
|
|
257
|
+
if (EE.isRight(maybeResponse)) {
|
|
258
|
+
return unwrap(maybeResponse);
|
|
259
|
+
}
|
|
260
|
+
throw new UnexpectedResponseTypeError("informational", unwrap(maybeResponse));
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
iWantExpectedResponseOrThrow() {
|
|
264
|
+
return this
|
|
265
|
+
.iWantExpectedResponse()
|
|
266
|
+
.then((maybeResponse) => {
|
|
267
|
+
if (EE.isRight(maybeResponse)) {
|
|
268
|
+
return unwrap(maybeResponse);
|
|
269
|
+
}
|
|
270
|
+
throw new UnexpectedResponseError(unwrap(maybeResponse));
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
static get [Symbol.species]() {
|
|
274
|
+
return Promise;
|
|
275
|
+
}
|
|
276
|
+
static fetch(requestParams) {
|
|
277
|
+
const path = insertParamsInPath(requestParams.path, requestParams.params);
|
|
278
|
+
const query = queryToString(requestParams.query);
|
|
279
|
+
const url = query
|
|
280
|
+
? `${path}?${query}`
|
|
281
|
+
: path;
|
|
282
|
+
const headers = { ...requestParams.headers };
|
|
283
|
+
let body = requestParams.body;
|
|
284
|
+
if (body) {
|
|
285
|
+
if (!headers["content-type"]) {
|
|
286
|
+
if (typeof body === "string") {
|
|
287
|
+
headers["content-type"] = "text/plain; charset=utf-8";
|
|
288
|
+
body = body.toString();
|
|
289
|
+
}
|
|
290
|
+
else if ((body
|
|
291
|
+
&& typeof body === "object"
|
|
292
|
+
&& body?.constructor?.name === "Object")
|
|
293
|
+
|| (body instanceof Array
|
|
294
|
+
&& body?.constructor?.name === "Array")
|
|
295
|
+
|| body === null
|
|
296
|
+
|| typeof body === "boolean"
|
|
297
|
+
|| typeof body === "number") {
|
|
298
|
+
headers["content-type"] = "application/json; charset=utf-8";
|
|
299
|
+
body = JSON.stringify(body);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return fetch(`${requestParams.baseUrl}${url}`, {
|
|
304
|
+
...requestParams.initParams,
|
|
305
|
+
headers: headers,
|
|
306
|
+
method: requestParams.method,
|
|
307
|
+
body: body,
|
|
308
|
+
})
|
|
309
|
+
.then((response) => getBody(response)
|
|
310
|
+
.then((body) => EE.right("response", {
|
|
311
|
+
body,
|
|
312
|
+
information: response.headers.get(requestParams.informationHeaderKey) || undefined,
|
|
313
|
+
code: response.status.toString(),
|
|
314
|
+
ok: (response.status < 500)
|
|
315
|
+
? response.ok
|
|
316
|
+
: null,
|
|
317
|
+
headers: response.headers,
|
|
318
|
+
type: response.type,
|
|
319
|
+
url: response.url,
|
|
320
|
+
redirected: response.redirected,
|
|
321
|
+
raw: response,
|
|
322
|
+
requestParams,
|
|
323
|
+
predicted: response.headers.get(requestParams.predictedHeaderKey) !== null,
|
|
324
|
+
})))
|
|
325
|
+
.catch((error) => EE.left("request-error", {
|
|
326
|
+
error,
|
|
327
|
+
requestParams,
|
|
328
|
+
}));
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
export { PromiseRequest };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function queryToString(query) {
|
|
4
|
+
if (!query) {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
return Object.entries(query)
|
|
8
|
+
.reduce((pv, [key, value]) => {
|
|
9
|
+
if (!value) {
|
|
10
|
+
return pv;
|
|
11
|
+
}
|
|
12
|
+
if (Array.isArray(value)) {
|
|
13
|
+
value.forEach((subValue) => {
|
|
14
|
+
pv.push(`${key}=${subValue}`);
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
pv.push(`${key}=${value}`);
|
|
19
|
+
}
|
|
20
|
+
return pv;
|
|
21
|
+
}, [])
|
|
22
|
+
.join("&") || null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
exports.queryToString = queryToString;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
function queryToString(query) {
|
|
2
|
+
if (!query) {
|
|
3
|
+
return null;
|
|
4
|
+
}
|
|
5
|
+
return Object.entries(query)
|
|
6
|
+
.reduce((pv, [key, value]) => {
|
|
7
|
+
if (!value) {
|
|
8
|
+
return pv;
|
|
9
|
+
}
|
|
10
|
+
if (Array.isArray(value)) {
|
|
11
|
+
value.forEach((subValue) => {
|
|
12
|
+
pv.push(`${key}=${subValue}`);
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
pv.push(`${key}=${value}`);
|
|
17
|
+
}
|
|
18
|
+
return pv;
|
|
19
|
+
}, [])
|
|
20
|
+
.join("&") || null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { queryToString };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type SimplifyTopLevel, type IsEqual, type MaybeArray, type AnyTuple } from "@duplojs/utils";
|
|
2
|
+
import { type ServerRouteHeaders, type ServerRouteParams, type ServerRouteQuery, type ServerRoute, type ServerPrimitiveData } from "./serverRoute";
|
|
3
|
+
import { type ObjectCanBeEmpty } from "./ObjectCanBeEmpty";
|
|
4
|
+
import type * as OO from "@duplojs/utils/object";
|
|
5
|
+
export interface ClientRequestInitParams extends Pick<RequestInit, "cache" | "credentials" | "integrity" | "keepalive" | "mode" | "redirect" | "referrer" | "referrerPolicy" | "signal"> {
|
|
6
|
+
}
|
|
7
|
+
export type ClientRequestParamsHeaders = Record<string, string | undefined>;
|
|
8
|
+
export type ClientRequestParamsParams = Record<string, string | undefined>;
|
|
9
|
+
export type ClientRequestParamsQuery = Record<string, MaybeArray<string> | undefined>;
|
|
10
|
+
export type ClientRequestParamsBody = unknown;
|
|
11
|
+
export interface ClientRequestParams<GenericHookParams extends Record<string, unknown> = Record<string, unknown>> {
|
|
12
|
+
method: string;
|
|
13
|
+
path: string;
|
|
14
|
+
headers?: ClientRequestParamsHeaders;
|
|
15
|
+
params?: ClientRequestParamsParams;
|
|
16
|
+
query?: ClientRequestParamsQuery;
|
|
17
|
+
body?: ClientRequestParamsBody;
|
|
18
|
+
initParams?: ClientRequestInitParams;
|
|
19
|
+
hookParams?: GenericHookParams;
|
|
20
|
+
}
|
|
21
|
+
type StringifyTuple<GenericTuple extends AnyTuple<ServerPrimitiveData>> = GenericTuple extends [
|
|
22
|
+
infer InferredFirst extends ServerPrimitiveData,
|
|
23
|
+
...infer InferredRest
|
|
24
|
+
] ? InferredRest extends readonly [] ? [`${InferredFirst}`] : InferredRest extends AnyTuple ? StringifyTuple<InferredRest> extends infer InferredResult extends AnyTuple ? [`${InferredFirst}`, ...InferredResult] : never : never : never;
|
|
25
|
+
export type ServerRouteToClientRequestParamsHeaders<GenericHeader extends ServerRouteHeaders | undefined> = GenericHeader extends ServerRouteHeaders ? SimplifyTopLevel<{
|
|
26
|
+
[Prop in keyof GenericHeader]: GenericHeader[Prop] extends infer InferredValue ? InferredValue extends ServerPrimitiveData ? InferredValue extends undefined ? InferredValue : `${InferredValue}` : never : never;
|
|
27
|
+
}> : GenericHeader;
|
|
28
|
+
export type ServerRouteToClientRequestParamsParams<GenericParams extends ServerRouteParams | undefined> = GenericParams extends ServerRouteParams ? SimplifyTopLevel<{
|
|
29
|
+
[Prop in keyof GenericParams]: GenericParams[Prop] extends infer InferredValue ? InferredValue extends ServerPrimitiveData ? InferredValue extends undefined ? InferredValue : `${InferredValue}` : never : never;
|
|
30
|
+
}> : GenericParams;
|
|
31
|
+
export type ServerRouteToClientRequestParamsQuery<GenericQuery extends ServerRouteQuery | undefined> = GenericQuery extends ServerRouteQuery ? SimplifyTopLevel<{
|
|
32
|
+
[Prop in keyof GenericQuery]: GenericQuery[Prop] extends infer InferredValue ? InferredValue extends MaybeArray<ServerPrimitiveData> ? InferredValue extends undefined ? InferredValue : InferredValue extends AnyTuple ? StringifyTuple<InferredValue> : InferredValue extends readonly any[] ? `${InferredValue[number]}`[] : InferredValue extends ServerPrimitiveData ? `${InferredValue}` : never : never : never;
|
|
33
|
+
}> : GenericQuery;
|
|
34
|
+
type MaybeParams<GenericParams extends object> = {
|
|
35
|
+
[Prop in keyof GenericParams]-?: undefined extends GenericParams[Prop] ? Prop : GenericParams[Prop] extends object ? ObjectCanBeEmpty<GenericParams[Prop]> extends true ? Prop : never : never;
|
|
36
|
+
}[keyof GenericParams] extends infer InferredKeys extends keyof GenericParams ? OO.PartialKeys<GenericParams, InferredKeys> : never;
|
|
37
|
+
export type ServerRouteToClientRequestParams<GenericServerRoute extends ServerRoute = ServerRoute, GenericHookParams extends Record<string, unknown> = Record<string, unknown>> = GenericServerRoute extends any ? SimplifyTopLevel<({
|
|
38
|
+
method: GenericServerRoute["method"];
|
|
39
|
+
path: GenericServerRoute["path"];
|
|
40
|
+
initParams?: ClientRequestInitParams;
|
|
41
|
+
hookParams?: GenericHookParams;
|
|
42
|
+
} & MaybeParams<(IsEqual<GenericServerRoute["headers"], unknown> extends true ? {} : {
|
|
43
|
+
headers: ServerRouteToClientRequestParamsHeaders<GenericServerRoute["headers"]>;
|
|
44
|
+
}) & (IsEqual<GenericServerRoute["params"], unknown> extends true ? {} : {
|
|
45
|
+
params: ServerRouteToClientRequestParamsParams<GenericServerRoute["params"]>;
|
|
46
|
+
}) & (IsEqual<GenericServerRoute["query"], unknown> extends true ? {} : {
|
|
47
|
+
query: ServerRouteToClientRequestParamsQuery<GenericServerRoute["query"]>;
|
|
48
|
+
}) & (IsEqual<GenericServerRoute["body"], unknown> extends true ? {} : {
|
|
49
|
+
body: GenericServerRoute["body"];
|
|
50
|
+
})>)> extends infer InferredResult extends ClientRequestParams ? InferredResult : never : never;
|
|
51
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type * as SS from "@duplojs/utils/string";
|
|
2
|
+
import { type ServerRouteResponse, type ServerRoute } from "./serverRoute";
|
|
3
|
+
import { type IsEqual, type SimplifyTopLevel } from "@duplojs/utils";
|
|
4
|
+
import { type PromiseRequestParams } from "../promiseRequest";
|
|
5
|
+
export type ClientResponseBody = unknown;
|
|
6
|
+
export interface ClientResponse<GenericPromiseRequestParams extends PromiseRequestParams = PromiseRequestParams> {
|
|
7
|
+
code: SS.Number;
|
|
8
|
+
information: undefined | string;
|
|
9
|
+
body: ClientResponseBody;
|
|
10
|
+
ok: boolean | null;
|
|
11
|
+
headers: Headers;
|
|
12
|
+
type: ResponseType;
|
|
13
|
+
url: string;
|
|
14
|
+
redirected: boolean;
|
|
15
|
+
raw: globalThis.Response;
|
|
16
|
+
requestParams: GenericPromiseRequestParams;
|
|
17
|
+
predicted: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface NotPredictedClientResponse<GenericPromiseRequestParams extends PromiseRequestParams = PromiseRequestParams> extends ClientResponse<GenericPromiseRequestParams> {
|
|
20
|
+
predicted: false;
|
|
21
|
+
}
|
|
22
|
+
export type ServerRouteToClientResponse<GenericServerRoute extends ServerRoute = ServerRoute, GenericHookParams extends Record<string, unknown> = Record<string, unknown>> = IsEqual<GenericServerRoute, ServerRoute> extends true ? ClientResponse<PromiseRequestParams<GenericHookParams>> : GenericServerRoute extends any ? GenericServerRoute["responses"] extends infer InferredResponse ? InferredResponse extends ServerRouteResponse ? SimplifyTopLevel<{
|
|
23
|
+
code: InferredResponse["code"];
|
|
24
|
+
information: InferredResponse["information"];
|
|
25
|
+
body: InferredResponse["body"];
|
|
26
|
+
ok: boolean | null;
|
|
27
|
+
headers: Headers;
|
|
28
|
+
type: ResponseType;
|
|
29
|
+
url: string;
|
|
30
|
+
redirected: boolean;
|
|
31
|
+
raw: globalThis.Response;
|
|
32
|
+
requestParams: PromiseRequestParams<GenericHookParams>;
|
|
33
|
+
predicted: boolean;
|
|
34
|
+
}> extends infer InferredResult extends ClientResponse ? InferredResult : never : never : never : never;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type MaybeArray } from "@duplojs/utils";
|
|
2
|
+
import type * as SS from "@duplojs/utils/string";
|
|
3
|
+
export type ServerPrimitiveData = string | undefined | number | null | boolean;
|
|
4
|
+
export type ServerRouteHeaders = Record<string, ServerPrimitiveData>;
|
|
5
|
+
export type ServerRouteParams = Record<string, ServerPrimitiveData>;
|
|
6
|
+
export type ServerRouteQuery = Record<string, MaybeArray<ServerPrimitiveData>>;
|
|
7
|
+
export type ServerRouteBody = unknown;
|
|
8
|
+
export type ServerRouteResponseBody = unknown;
|
|
9
|
+
export interface ServerRouteResponse {
|
|
10
|
+
code: SS.Number;
|
|
11
|
+
information?: string;
|
|
12
|
+
body?: ServerRouteResponseBody;
|
|
13
|
+
}
|
|
14
|
+
export interface ServerRoute {
|
|
15
|
+
path: string;
|
|
16
|
+
method: string;
|
|
17
|
+
headers?: ServerRouteHeaders;
|
|
18
|
+
params?: ServerRouteParams;
|
|
19
|
+
query?: ServerRouteQuery;
|
|
20
|
+
body?: ServerRouteBody;
|
|
21
|
+
responses: ServerRouteResponse;
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var utils = require('@duplojs/utils');
|
|
4
|
+
var kind = require('./kind.cjs');
|
|
5
|
+
|
|
6
|
+
class UnexpectedInformationResponseError extends utils.kindHeritage("unexpected-information-response-error", kind.createClientKind("unexpected-information-response-error"), Error) {
|
|
7
|
+
information;
|
|
8
|
+
response;
|
|
9
|
+
constructor(information, response) {
|
|
10
|
+
super({}, ["Unexpected information response."]);
|
|
11
|
+
this.information = information;
|
|
12
|
+
this.response = response;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
class UnexpectedCodeResponseError extends utils.kindHeritage("unexpected-code-response-error", kind.createClientKind("unexpected-code-response-error"), Error) {
|
|
16
|
+
code;
|
|
17
|
+
response;
|
|
18
|
+
constructor(code, response) {
|
|
19
|
+
super({}, ["Unexpected code response."]);
|
|
20
|
+
this.code = code;
|
|
21
|
+
this.response = response;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
class UnexpectedResponseTypeError extends utils.kindHeritage("unexpected-response-type-error", kind.createClientKind("unexpected-response-type-error"), Error) {
|
|
25
|
+
expectType;
|
|
26
|
+
response;
|
|
27
|
+
constructor(expectType, response) {
|
|
28
|
+
super({}, ["Unexpected response type."]);
|
|
29
|
+
this.expectType = expectType;
|
|
30
|
+
this.response = response;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
class UnexpectedResponseError extends utils.kindHeritage("unexpected-response-error", kind.createClientKind("unexpected-response-error"), Error) {
|
|
34
|
+
response;
|
|
35
|
+
constructor(response) {
|
|
36
|
+
super({}, ["Unexpected response."]);
|
|
37
|
+
this.response = response;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
exports.UnexpectedCodeResponseError = UnexpectedCodeResponseError;
|
|
42
|
+
exports.UnexpectedInformationResponseError = UnexpectedInformationResponseError;
|
|
43
|
+
exports.UnexpectedResponseError = UnexpectedResponseError;
|
|
44
|
+
exports.UnexpectedResponseTypeError = UnexpectedResponseTypeError;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type ClientResponse } from "./types";
|
|
2
|
+
import { type PromiseRequestParams } from "./promiseRequest";
|
|
3
|
+
export interface RequestErrorContent {
|
|
4
|
+
error: unknown;
|
|
5
|
+
requestParams: PromiseRequestParams;
|
|
6
|
+
}
|
|
7
|
+
declare const UnexpectedInformationResponseError_base: new (params: {
|
|
8
|
+
"@DuplojsHttpClient/unexpected-information-response-error"?: unknown;
|
|
9
|
+
}, parentParams: [message?: string | undefined, options?: ErrorOptions | undefined]) => import("@duplojs/utils").Kind<import("@duplojs/utils").KindDefinition<"@DuplojsHttpClient/unexpected-information-response-error", unknown>, unknown> & import("@duplojs/utils").Kind<import("@duplojs/utils").KindDefinition<"unexpected-information-response-error", unknown>, unknown> & Error;
|
|
10
|
+
export declare class UnexpectedInformationResponseError extends UnexpectedInformationResponseError_base {
|
|
11
|
+
information: string | string[];
|
|
12
|
+
response: RequestErrorContent | ClientResponse;
|
|
13
|
+
constructor(information: string | string[], response: RequestErrorContent | ClientResponse);
|
|
14
|
+
}
|
|
15
|
+
declare const UnexpectedCodeResponseError_base: new (params: {
|
|
16
|
+
"@DuplojsHttpClient/unexpected-code-response-error"?: unknown;
|
|
17
|
+
}, parentParams: [message?: string | undefined, options?: ErrorOptions | undefined]) => Error & import("@duplojs/utils").Kind<import("@duplojs/utils").KindDefinition<"@DuplojsHttpClient/unexpected-code-response-error", unknown>, unknown> & import("@duplojs/utils").Kind<import("@duplojs/utils").KindDefinition<"unexpected-code-response-error", unknown>, unknown>;
|
|
18
|
+
export declare class UnexpectedCodeResponseError extends UnexpectedCodeResponseError_base {
|
|
19
|
+
code: string | string[];
|
|
20
|
+
response: RequestErrorContent | ClientResponse;
|
|
21
|
+
constructor(code: string | string[], response: RequestErrorContent | ClientResponse);
|
|
22
|
+
}
|
|
23
|
+
declare const UnexpectedResponseTypeError_base: new (params: {
|
|
24
|
+
"@DuplojsHttpClient/unexpected-response-type-error"?: unknown;
|
|
25
|
+
}, parentParams: [message?: string | undefined, options?: ErrorOptions | undefined]) => Error & import("@duplojs/utils").Kind<import("@duplojs/utils").KindDefinition<"@DuplojsHttpClient/unexpected-response-type-error", unknown>, unknown> & import("@duplojs/utils").Kind<import("@duplojs/utils").KindDefinition<"unexpected-response-type-error", unknown>, unknown>;
|
|
26
|
+
export declare class UnexpectedResponseTypeError extends UnexpectedResponseTypeError_base {
|
|
27
|
+
expectType: "informational" | "successful" | "redirection" | "clientError" | "serverError";
|
|
28
|
+
response: RequestErrorContent | ClientResponse;
|
|
29
|
+
constructor(expectType: "informational" | "successful" | "redirection" | "clientError" | "serverError", response: RequestErrorContent | ClientResponse);
|
|
30
|
+
}
|
|
31
|
+
declare const UnexpectedResponseError_base: new (params: {
|
|
32
|
+
"@DuplojsHttpClient/unexpected-response-error"?: unknown;
|
|
33
|
+
}, parentParams: [message?: string | undefined, options?: ErrorOptions | undefined]) => Error & import("@duplojs/utils").Kind<import("@duplojs/utils").KindDefinition<"@DuplojsHttpClient/unexpected-response-error", unknown>, unknown> & import("@duplojs/utils").Kind<import("@duplojs/utils").KindDefinition<"unexpected-response-error", unknown>, unknown>;
|
|
34
|
+
export declare class UnexpectedResponseError extends UnexpectedResponseError_base {
|
|
35
|
+
response: RequestErrorContent | ClientResponse;
|
|
36
|
+
constructor(response: RequestErrorContent | ClientResponse);
|
|
37
|
+
}
|
|
38
|
+
export {};
|