@autometa/http 1.0.5 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/esm/index.js +177 -113
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.cts +24 -25
- package/dist/index.d.ts +24 -25
- package/dist/index.js +178 -118
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
package/dist/esm/index.js
CHANGED
|
@@ -28,28 +28,8 @@ var __privateSet = (obj, member, value, setter) => {
|
|
|
28
28
|
return value;
|
|
29
29
|
};
|
|
30
30
|
|
|
31
|
-
// src/http.builder.ts
|
|
32
|
-
import { Fixture, LIFE_CYCLE } from "@autometa/app";
|
|
33
|
-
import { AutomationError as AutomationError2 } from "@autometa/errors";
|
|
34
|
-
import axios from "axios";
|
|
35
|
-
import { plainToClass } from "class-transformer";
|
|
36
|
-
import { urlJoinP } from "url-join-ts";
|
|
37
|
-
|
|
38
31
|
// src/http.response.ts
|
|
39
|
-
var HTTPResponse = class
|
|
40
|
-
static fromRaw(data, status, statusText, headers, url, validated, passedValidation) {
|
|
41
|
-
const response = new _HTTPResponse();
|
|
42
|
-
response.data = data;
|
|
43
|
-
response.status = status;
|
|
44
|
-
response.statusText = statusText;
|
|
45
|
-
response.headers = headers;
|
|
46
|
-
response.request = {
|
|
47
|
-
url,
|
|
48
|
-
validated,
|
|
49
|
-
passedValidation
|
|
50
|
-
};
|
|
51
|
-
return response;
|
|
52
|
-
}
|
|
32
|
+
var HTTPResponse = class {
|
|
53
33
|
static derive(original, data) {
|
|
54
34
|
const response = new DerivedHTTPResponse();
|
|
55
35
|
if (typeof data === "function") {
|
|
@@ -69,6 +49,14 @@ var HTTPResponse = class _HTTPResponse {
|
|
|
69
49
|
var DerivedHTTPResponse = class extends HTTPResponse {
|
|
70
50
|
};
|
|
71
51
|
|
|
52
|
+
// src/http.ts
|
|
53
|
+
import { Fixture as Fixture2, LIFE_CYCLE as LIFE_CYCLE2 } from "@autometa/app";
|
|
54
|
+
|
|
55
|
+
// src/http.builder.ts
|
|
56
|
+
import { Fixture, LIFE_CYCLE } from "@autometa/app";
|
|
57
|
+
import { AutomationError as AutomationError4 } from "@autometa/errors";
|
|
58
|
+
import { urlJoinP } from "url-join-ts";
|
|
59
|
+
|
|
72
60
|
// src/schema.map.ts
|
|
73
61
|
import { AutomationError } from "@autometa/errors";
|
|
74
62
|
import { StatusCodes } from "@autometa/status-codes";
|
|
@@ -156,9 +144,136 @@ function IsStatusCode(value) {
|
|
|
156
144
|
return Object.values(StatusCodes).map((it) => it.status).includes(value);
|
|
157
145
|
}
|
|
158
146
|
|
|
159
|
-
// src/
|
|
147
|
+
// src/transform-response.ts
|
|
148
|
+
import { AutomationError as AutomationError2 } from "@autometa/errors";
|
|
160
149
|
import isJson from "@stdlib/assert-is-json";
|
|
161
150
|
import { highlight } from "cli-highlight";
|
|
151
|
+
function transformResponse(allowPlainText, data) {
|
|
152
|
+
if (data === null) {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
if (data === void 0) {
|
|
156
|
+
return void 0;
|
|
157
|
+
}
|
|
158
|
+
if (isJson(data)) {
|
|
159
|
+
return JSON.parse(data);
|
|
160
|
+
}
|
|
161
|
+
if (["true", "false"].includes(data)) {
|
|
162
|
+
return JSON.parse(data);
|
|
163
|
+
}
|
|
164
|
+
if (/^\d*\.?\d+$/.test(data)) {
|
|
165
|
+
return JSON.parse(data);
|
|
166
|
+
}
|
|
167
|
+
if (allowPlainText) {
|
|
168
|
+
return data;
|
|
169
|
+
}
|
|
170
|
+
const response = highlight(data, { language: "html" });
|
|
171
|
+
const message = [
|
|
172
|
+
`Could not parse a response as json, and this request was not configured to allow plain text responses.`,
|
|
173
|
+
`To allow plain text responses, use the 'allowPlainText' method on the HTTP client.`,
|
|
174
|
+
" ",
|
|
175
|
+
response
|
|
176
|
+
];
|
|
177
|
+
throw new AutomationError2(message.join("\n"));
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// src/axios-executor.ts
|
|
181
|
+
import axios from "axios";
|
|
182
|
+
import { plainToInstance } from "class-transformer";
|
|
183
|
+
import { AutomationError as AutomationError3 } from "@autometa/errors";
|
|
184
|
+
var _result;
|
|
185
|
+
var AxiosExecutor = class {
|
|
186
|
+
constructor(options, schemaMap, requestState, requireSchema) {
|
|
187
|
+
this.options = options;
|
|
188
|
+
this.schemaMap = schemaMap;
|
|
189
|
+
this.requestState = requestState;
|
|
190
|
+
this.requireSchema = requireSchema;
|
|
191
|
+
__privateAdd(this, _result, {});
|
|
192
|
+
}
|
|
193
|
+
get error() {
|
|
194
|
+
return __privateGet(this, _result).error;
|
|
195
|
+
}
|
|
196
|
+
get requestSucceeded() {
|
|
197
|
+
return __privateGet(this, _result).response !== void 0;
|
|
198
|
+
}
|
|
199
|
+
get validationFailed() {
|
|
200
|
+
return __privateGet(this, _result).validated === void 0;
|
|
201
|
+
}
|
|
202
|
+
async tryRequest() {
|
|
203
|
+
try {
|
|
204
|
+
__privateGet(this, _result).response = await axios(this.options);
|
|
205
|
+
this.tryValidate();
|
|
206
|
+
} catch (e) {
|
|
207
|
+
if (__privateGet(this, _result).error) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
const { method, fullUrl, data, headers } = this.requestState;
|
|
211
|
+
const body = JSON.stringify(data, null, 2);
|
|
212
|
+
const headersString = JSON.stringify(headers, null, 2);
|
|
213
|
+
const message = `Failed to send request to ${method}:${fullUrl}.
|
|
214
|
+
headers:
|
|
215
|
+
${headersString}
|
|
216
|
+
|
|
217
|
+
body:
|
|
218
|
+
${body}`;
|
|
219
|
+
__privateGet(this, _result).error = new AutomationError3(message, { cause: e });
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
async tryValidate() {
|
|
223
|
+
const { status, data } = __privateGet(this, _result).response;
|
|
224
|
+
const { method, fullUrl } = this.requestState;
|
|
225
|
+
try {
|
|
226
|
+
__privateGet(this, _result).validated = this.schemaMap.validate(
|
|
227
|
+
status,
|
|
228
|
+
data,
|
|
229
|
+
this.requireSchema
|
|
230
|
+
);
|
|
231
|
+
} catch (e) {
|
|
232
|
+
const error = e;
|
|
233
|
+
const message = `Failed to validate response from ${method}:${fullUrl}.
|
|
234
|
+
|
|
235
|
+
Provided body was:
|
|
236
|
+
${JSON.stringify(data, null, 2)}`;
|
|
237
|
+
__privateGet(this, _result).error = new AutomationError3(message, { cause: error });
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
getValidatedResponse() {
|
|
241
|
+
const { status, statusText, headers } = __privateGet(this, _result).response;
|
|
242
|
+
const { validated: data } = __privateGet(this, _result);
|
|
243
|
+
const { fullUrl: url, method } = this.requestState;
|
|
244
|
+
return plainToInstance(HTTPResponse, {
|
|
245
|
+
status,
|
|
246
|
+
statusText,
|
|
247
|
+
headers,
|
|
248
|
+
data,
|
|
249
|
+
request: {
|
|
250
|
+
url,
|
|
251
|
+
method
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
getResponse() {
|
|
256
|
+
const { status, statusText, headers, data } = __privateGet(this, _result).response;
|
|
257
|
+
const { fullUrl: url, method } = this.requestState;
|
|
258
|
+
return plainToInstance(
|
|
259
|
+
HTTPResponse,
|
|
260
|
+
{
|
|
261
|
+
status,
|
|
262
|
+
statusText,
|
|
263
|
+
headers,
|
|
264
|
+
data,
|
|
265
|
+
request: {
|
|
266
|
+
url,
|
|
267
|
+
method
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
{ excludeExtraneousValues: true }
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
_result = new WeakMap();
|
|
275
|
+
|
|
276
|
+
// src/http.builder.ts
|
|
162
277
|
var _headers, _params, _url, _route, _method, _schemaMap, _responseType, _data, _requireSchema, _allowPlainText, _onBeforeSend, _onAfterSend;
|
|
163
278
|
var HTTPRequestBuilder = class {
|
|
164
279
|
constructor(map) {
|
|
@@ -256,43 +371,47 @@ var HTTPRequestBuilder = class {
|
|
|
256
371
|
async put() {
|
|
257
372
|
return this._request("PUT");
|
|
258
373
|
}
|
|
374
|
+
async patch() {
|
|
375
|
+
return this._request("PATCH");
|
|
376
|
+
}
|
|
259
377
|
async _request(method) {
|
|
260
378
|
__privateSet(this, _method, method);
|
|
379
|
+
const options = this.constructOptions(method);
|
|
380
|
+
this.tryRunBeforeHooks();
|
|
381
|
+
const executor = new AxiosExecutor(
|
|
382
|
+
options,
|
|
383
|
+
__privateGet(this, _schemaMap),
|
|
384
|
+
this.currentState,
|
|
385
|
+
__privateGet(this, _requireSchema)
|
|
386
|
+
);
|
|
387
|
+
await executor.tryRequest();
|
|
388
|
+
if (executor.requestSucceeded && !executor.validationFailed) {
|
|
389
|
+
const response = executor.getValidatedResponse();
|
|
390
|
+
this.tryRunAfterHooks(response);
|
|
391
|
+
return response;
|
|
392
|
+
}
|
|
393
|
+
if (executor.requestSucceeded) {
|
|
394
|
+
const response = executor.getResponse();
|
|
395
|
+
this.tryRunAfterHooks(response);
|
|
396
|
+
}
|
|
397
|
+
throw executor.error;
|
|
398
|
+
}
|
|
399
|
+
constructOptions(method) {
|
|
261
400
|
const url = this.currentUrl;
|
|
262
401
|
const headers = __privateGet(this, _headers) && Object.fromEntries(__privateGet(this, _headers));
|
|
263
402
|
const responseType = __privateGet(this, _responseType);
|
|
264
403
|
const data = __privateGet(this, _data);
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
return status >= 100 && status < 500;
|
|
277
|
-
},
|
|
278
|
-
transformResponse: transformResponse.bind(null, __privateGet(this, _allowPlainText))
|
|
279
|
-
});
|
|
280
|
-
const instance = this.makeResponse(response);
|
|
281
|
-
skipFailedAfterHooks = true;
|
|
282
|
-
this.tryRunAfterHooks(instance);
|
|
283
|
-
return instance;
|
|
284
|
-
} catch (e) {
|
|
285
|
-
if (response && !skipFailedAfterHooks) {
|
|
286
|
-
const instance = this.createWrapper(response);
|
|
287
|
-
this.tryRunAfterHooks(instance);
|
|
288
|
-
}
|
|
289
|
-
const error = e;
|
|
290
|
-
const message = `HTTP Client failed while while making request to ${url} with:
|
|
291
|
-
* headers: ${JSON.stringify(headers, null, 2)}
|
|
292
|
-
|
|
293
|
-
* data: ${data && JSON.stringify(data, null, 2)}`;
|
|
294
|
-
throw new AutomationError2(message, { cause: error });
|
|
295
|
-
}
|
|
404
|
+
return {
|
|
405
|
+
method,
|
|
406
|
+
url,
|
|
407
|
+
headers,
|
|
408
|
+
data,
|
|
409
|
+
responseType,
|
|
410
|
+
validateStatus: function(status) {
|
|
411
|
+
return status >= 100 && status < 500;
|
|
412
|
+
},
|
|
413
|
+
transformResponse: transformResponse.bind(null, __privateGet(this, _allowPlainText))
|
|
414
|
+
};
|
|
296
415
|
}
|
|
297
416
|
tryRunBeforeHooks() {
|
|
298
417
|
let index = 0;
|
|
@@ -303,8 +422,8 @@ var HTTPRequestBuilder = class {
|
|
|
303
422
|
}
|
|
304
423
|
} catch (e) {
|
|
305
424
|
const error = e;
|
|
306
|
-
const message = `HTTP Client
|
|
307
|
-
throw new
|
|
425
|
+
const message = `HTTP Client 'onBeforeRequest' experienced an error at listener count ${index}`;
|
|
426
|
+
throw new AutomationError4(message, { cause: error });
|
|
308
427
|
}
|
|
309
428
|
}
|
|
310
429
|
tryRunAfterHooks(response) {
|
|
@@ -316,36 +435,10 @@ var HTTPRequestBuilder = class {
|
|
|
316
435
|
}
|
|
317
436
|
} catch (e) {
|
|
318
437
|
const error = e;
|
|
319
|
-
const message = `HTTP Client
|
|
320
|
-
throw new
|
|
438
|
+
const message = `HTTP Client 'onRequestReceived' experienced an error at listener count ${index}`;
|
|
439
|
+
throw new AutomationError4(message, { cause: error });
|
|
321
440
|
}
|
|
322
441
|
}
|
|
323
|
-
makeResponse(res) {
|
|
324
|
-
const { status, data } = res;
|
|
325
|
-
const parsed = this.validateSchemas(status, data);
|
|
326
|
-
return this.createWrapper(res, parsed);
|
|
327
|
-
}
|
|
328
|
-
createWrapper({ status, statusText, headers, data }, parsed) {
|
|
329
|
-
const params = Object.fromEntries(__privateGet(this, _params));
|
|
330
|
-
const url = urlJoinP(__privateGet(this, _url), __privateGet(this, _route), params);
|
|
331
|
-
return plainToClass(HTTPResponse, {
|
|
332
|
-
status,
|
|
333
|
-
statusText,
|
|
334
|
-
headers,
|
|
335
|
-
data: parsed ?? data,
|
|
336
|
-
request: {
|
|
337
|
-
url,
|
|
338
|
-
validated: !!parsed
|
|
339
|
-
}
|
|
340
|
-
});
|
|
341
|
-
}
|
|
342
|
-
validateSchemas(status, data) {
|
|
343
|
-
return __privateGet(this, _schemaMap).validate(
|
|
344
|
-
status,
|
|
345
|
-
data,
|
|
346
|
-
__privateGet(this, _requireSchema)
|
|
347
|
-
);
|
|
348
|
-
}
|
|
349
442
|
};
|
|
350
443
|
_headers = new WeakMap();
|
|
351
444
|
_params = new WeakMap();
|
|
@@ -362,33 +455,8 @@ _onAfterSend = new WeakMap();
|
|
|
362
455
|
HTTPRequestBuilder = __decorateClass([
|
|
363
456
|
Fixture(LIFE_CYCLE.Transient)
|
|
364
457
|
], HTTPRequestBuilder);
|
|
365
|
-
function transformResponse(allowPlainText, data) {
|
|
366
|
-
if (isJson(data)) {
|
|
367
|
-
return JSON.parse(data);
|
|
368
|
-
}
|
|
369
|
-
if (["true", "false"].includes(data)) {
|
|
370
|
-
return JSON.parse(data);
|
|
371
|
-
}
|
|
372
|
-
if (data === "" || data === void 0) {
|
|
373
|
-
return void 0;
|
|
374
|
-
}
|
|
375
|
-
if (allowPlainText) {
|
|
376
|
-
if (/^\d*\.?\d+$/.test(data) || ["true", "false"].includes(data)) {
|
|
377
|
-
return JSON.parse(data);
|
|
378
|
-
}
|
|
379
|
-
return data;
|
|
380
|
-
}
|
|
381
|
-
const response = highlight(data, { language: "html" });
|
|
382
|
-
const message = [
|
|
383
|
-
`HTTP Client received a response which could not be parsed as JSON, and plain text responses were not configured for this request, Instead the body was:`,
|
|
384
|
-
" ",
|
|
385
|
-
response
|
|
386
|
-
];
|
|
387
|
-
throw new AutomationError2(message.join("\n"));
|
|
388
|
-
}
|
|
389
458
|
|
|
390
459
|
// src/http.ts
|
|
391
|
-
import { Fixture as Fixture2, LIFE_CYCLE as LIFE_CYCLE2 } from "@autometa/app";
|
|
392
460
|
var _url2, _route2, _headers2, _requireSchema2, _schemaMap2, _onBeforeSend2, _onAfterSend2, _allowPlainText2;
|
|
393
461
|
var HTTP = class {
|
|
394
462
|
constructor() {
|
|
@@ -481,10 +549,6 @@ HTTP = __decorateClass([
|
|
|
481
549
|
export {
|
|
482
550
|
DerivedHTTPResponse,
|
|
483
551
|
HTTP,
|
|
484
|
-
|
|
485
|
-
HTTPResponse,
|
|
486
|
-
IsStatusCode,
|
|
487
|
-
SchemaMap,
|
|
488
|
-
assertIsStatusCode
|
|
552
|
+
HTTPResponse
|
|
489
553
|
};
|
|
490
554
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/http.builder.ts","../../src/http.response.ts","../../src/schema.map.ts","../../src/http.ts"],"sourcesContent":["import { Fixture, LIFE_CYCLE } from \"@autometa/app\";\nimport { AutomationError } from \"@autometa/errors\";\nimport axios, { AxiosResponse, Method, ResponseType } from \"axios\";\nimport { plainToClass } from \"class-transformer\";\nimport { urlJoinP } from \"url-join-ts\";\nimport { HTTPResponse } from \"./http.response\";\nimport { SchemaMap } from \"./schema.map\";\nimport { SchemaParser, StatusCode } from \"./types\";\nimport isJson from \"@stdlib/assert-is-json\";\nimport { highlight } from \"cli-highlight\";\nexport type RequestState = {\n headers: Map<string, string>;\n params: Map<string, unknown>;\n url: string;\n route: string[];\n responseType: ResponseType | undefined;\n data: unknown;\n method: Method;\n get fullUrl(): string;\n};\n\nexport type RequestHook = (state: RequestState) => unknown;\nexport type ResponseHook<T> = (state: HTTPResponse<T>) => unknown;\n\n@Fixture(LIFE_CYCLE.Transient)\nexport class HTTPRequestBuilder {\n #headers = new Map<string, string>();\n #params = new Map<string, unknown>();\n #url: string;\n #route: string[] = [];\n #method: Method;\n #schemaMap = new SchemaMap();\n #responseType: ResponseType | undefined = \"json\";\n #data: unknown;\n #requireSchema = false;\n #allowPlainText = false;\n #onBeforeSend: RequestHook[] = [];\n #onAfterSend: ResponseHook<unknown>[] = [];\n constructor(map: SchemaMap) {\n this.#schemaMap = new SchemaMap().including(map);\n }\n requireSchema(value: boolean) {\n this.#requireSchema = value;\n return this;\n }\n get currentState(): RequestState {\n const fullUrl = this.currentUrl;\n return {\n headers: this.#headers,\n params: this.#params,\n url: this.#url,\n route: this.#route,\n responseType: this.#responseType,\n data: this.#data,\n method: this.#method,\n fullUrl\n };\n }\n\n get currentUrl() {\n const params = Object.fromEntries(this.#params);\n return urlJoinP(this.#url, this.#route, params);\n }\n\n url(url: string) {\n this.#url = url;\n return this;\n }\n allowPlainText(value: boolean) {\n this.#allowPlainText = value;\n return this;\n }\n schema(parser: SchemaParser, ...codes: number[]): HTTPRequestBuilder;\n schema(\n parser: SchemaParser,\n ...range: { from: number; to: number }[]\n ): HTTPRequestBuilder;\n\n schema(\n parser: SchemaParser,\n ...args: (number | { from: number; to: number })[]\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.#schemaMap.register(parser, ...(args as any));\n return this;\n }\n\n onBeforeSend(...hook: RequestHook[]) {\n this.#onBeforeSend.push(...hook);\n return this;\n }\n\n onReceivedResponse(...hook: ResponseHook<unknown>[]) {\n this.#onAfterSend.push(...hook);\n return this;\n }\n\n route(...route: (string | number | boolean)[]) {\n this.#route.push(...route.map((it) => `${it}`));\n return this;\n }\n\n header<T>(name: string, value: T) {\n const val = Array.isArray(value) ? value.join(\",\") : `${value}`;\n this.#headers.set(name, val);\n return this;\n }\n\n headers(dict: Record<string, string>) {\n Object.entries(dict).forEach(([name, value]) =>\n this.#headers.set(name, value)\n );\n return this;\n }\n\n param<T>(name: string, value: T) {\n this.#params.set(name, value);\n return this;\n }\n\n params(dict: Record<string, unknown>) {\n Object.entries(dict).forEach(([name, value]) => this.param(name, value));\n return this;\n }\n\n data<T>(data: T) {\n this.#data = data;\n return this;\n }\n\n async post<TReturn>(): Promise<HTTPResponse<TReturn>> {\n return this._request(\"POST\");\n }\n\n async get<TReturn>(): Promise<HTTPResponse<TReturn>> {\n return this._request(\"GET\");\n }\n\n async delete<TReturn>(): Promise<HTTPResponse<TReturn>> {\n return this._request(\"DELETE\");\n }\n\n async put<TReturn>(): Promise<HTTPResponse<TReturn>> {\n return this._request(\"PUT\");\n }\n\n private async _request<T>(method: Method) {\n this.#method = method;\n const url = this.currentUrl;\n const headers = this.#headers && Object.fromEntries(this.#headers);\n const responseType = this.#responseType;\n const data = this.#data;\n let response: AxiosResponse = undefined as unknown as AxiosResponse;\n let skipFailedAfterHooks = false;\n try {\n this.tryRunBeforeHooks();\n response = await axios({\n method,\n url,\n headers,\n data,\n responseType,\n validateStatus: function (status) {\n return status >= 100 && status < 500;\n },\n transformResponse: transformResponse.bind(null, this.#allowPlainText)\n });\n const instance = this.makeResponse<T>(response);\n\n skipFailedAfterHooks = true;\n this.tryRunAfterHooks<T>(instance);\n return instance;\n } catch (e) {\n if (response && !skipFailedAfterHooks) {\n const instance = this.createWrapper<T>(response);\n this.tryRunAfterHooks<T>(instance);\n }\n const error = e as Error;\n const message = `HTTP Client failed while while making request to ${url} with:\n* headers: ${JSON.stringify(headers, null, 2)}\n\n* data: ${data && JSON.stringify(data, null, 2)}`;\n throw new AutomationError(message, { cause: error });\n }\n }\n\n private tryRunBeforeHooks() {\n let index = 0;\n try {\n for (const hook of this.#onBeforeSend) {\n hook(this.currentState);\n index++;\n }\n } catch (e) {\n const error = e as Error;\n const message = `HTTP Client encountered an error while running 'onBeforeRequest' hooks at index ${index}`;\n throw new AutomationError(message, { cause: error });\n }\n }\n private tryRunAfterHooks<T>(response: HTTPResponse<T>) {\n let index = 0;\n try {\n for (const hook of this.#onAfterSend) {\n hook(response);\n index++;\n }\n } catch (e) {\n const error = e as Error;\n const message = `HTTP Client encountered an error while running 'onAfterRequest' hooks at index ${index}`;\n throw new AutomationError(message, { cause: error });\n }\n }\n makeResponse<T>(res: AxiosResponse) {\n const { status, data } = res;\n const parsed = this.validateSchemas<T>(status, data);\n return this.createWrapper<T>(res, parsed);\n }\n\n private createWrapper<T>(\n { status, statusText, headers, data }: AxiosResponse<T>,\n parsed?: T\n ) {\n const params = Object.fromEntries(this.#params);\n const url = urlJoinP(this.#url, this.#route, params);\n return plainToClass(HTTPResponse<T>, {\n status,\n statusText,\n headers,\n data: parsed ?? data,\n request: {\n url,\n validated: !!parsed\n }\n });\n }\n\n private validateSchemas<T>(status: number, data: T): T {\n return this.#schemaMap.validate<T>(\n status as StatusCode,\n data,\n this.#requireSchema\n );\n }\n}\n\nfunction transformResponse(allowPlainText: boolean, data: string) {\n if (isJson(data)) {\n return JSON.parse(data);\n }\n if ([\"true\", \"false\"].includes(data)) {\n return JSON.parse(data);\n }\n\n if (data === \"\" || data === undefined) {\n return undefined;\n }\n if (allowPlainText) {\n if (/^\\d*\\.?\\d+$/.test(data) || ['true', 'false'].includes(data)) {\n return JSON.parse(data);\n }\n return data;\n }\n const response = highlight(data, { language: \"html\" });\n const message = [\n `HTTP Client received a response which could not be parsed as JSON, and plain text responses were not configured for this request, Instead the body was:`,\n \" \",\n response\n ];\n throw new AutomationError(message.join(\"\\n\"));\n}\n","export class HTTPResponse<T> {\n status: number;\n statusText: string;\n data: T;\n headers: Record<string, string>;\n request: {\n url: string;\n validated: boolean;\n passedValidation: boolean\n };\n\n static fromRaw<T>(\n data: T,\n status: number,\n statusText: string,\n headers: Record<string, string>,\n url: string,\n validated: boolean,\n passedValidation: boolean\n ) {\n const response = new HTTPResponse<T>();\n response.data = data;\n response.status = status;\n response.statusText = statusText;\n response.headers = headers;\n response.request = {\n url,\n validated,\n passedValidation\n };\n return response;\n }\n static derive<TOriginal, TDerived>(\n original: HTTPResponse<TOriginal>,\n data: TDerived\n ): HTTPResponse<TDerived>;\n static derive<TOriginal, TDerived>(\n original: HTTPResponse<TOriginal>,\n data: (original: TOriginal) => TDerived\n ): HTTPResponse<TDerived>;\n static derive<TOriginal, TDerived>(\n original: HTTPResponse<TOriginal>,\n data: TDerived | ((original: TOriginal) => TDerived)\n ) {\n const response = new DerivedHTTPResponse<TDerived, TOriginal>();\n if (typeof data === \"function\") {\n const fn = data as (original: TOriginal) => TDerived;\n response.data = fn(original.data);\n } else {\n response.data = data;\n }\n response.status = original.status;\n response.statusText = original.statusText;\n response.headers = original.headers;\n response.request = original.request;\n response.actual = original as HTTPResponse<TOriginal>;\n return response;\n }\n}\n\nexport class DerivedHTTPResponse<T, K> extends HTTPResponse<T> {\n actual: HTTPResponse<K>;\n}\n","import { StatusCode, SchemaParser } from \"./types\";\nimport { AutomationError } from \"@autometa/errors\";\nimport { StatusCodes } from \"@autometa/status-codes\";\n\nexport class SchemaMap {\n #children: SchemaMap[] = [];\n #map: Map<StatusCode, SchemaParser> = new Map();\n register(\n parser: SchemaParser,\n ...codes: StatusCode[]\n ): (typeof parser)[\"parse\"];\n register(\n parser: SchemaParser,\n ...range: { from: StatusCode; to: StatusCode }[]\n ): (typeof parser)[\"parse\"];\n register(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ) {\n args.forEach((arg) => {\n if (typeof arg === \"number\") {\n this.registerSingle(parser, arg);\n } else {\n this.registerRange(parser, arg);\n }\n });\n return parser.parse;\n }\n\n registerSingle(parser: SchemaParser, ...codes: StatusCode[]) {\n codes.forEach((code) => {\n if (this.#map.has(code)) {\n throw new AutomationError(\n `Status code ${code} is already registered with a parser`\n );\n }\n assertIsStatusCode(code);\n this.#map.set(code, parser);\n });\n }\n\n including(map: SchemaMap) {\n this.#children.includes(map);\n return this;\n }\n registerRange(\n parser: SchemaParser,\n ...range: { from: StatusCode; to: StatusCode }[]\n ) {\n range.forEach(({ from, to }) => {\n assertIsStatusCode(from);\n assertIsStatusCode(to);\n for (let i = from; i <= to; i++) {\n if (!IsStatusCode(i)) {\n continue;\n }\n if (this.#map.has(i)) {\n throw new AutomationError(\n `Status code ${i} is already registered with a parser`\n );\n }\n this.#map.set(i, parser);\n }\n });\n }\n\n get(status: StatusCode): SchemaParser | undefined {\n assertIsStatusCode(status);\n const local = this.#map.get(status);\n if (local) {\n return local;\n }\n const nested = this.#children.find((it) => it.#map.has(status));\n return nested?.get(status);\n }\n\n validate<T>(status: StatusCode, response: T, strict: boolean): T {\n const parser = this.get(status);\n if (!parser) {\n if (!strict) {\n return response;\n }\n throw new AutomationError(\n `No schema parser registered for status code ${status} and 'requireSchema' is set to true`\n );\n }\n return parser.parse(response) as T;\n }\n}\n\nexport function assertIsStatusCode(value: number): asserts value is StatusCode {\n const result = Object.values(StatusCodes)\n .map((it) => it.status as number)\n .includes(value);\n if (!result) {\n throw new AutomationError(\n `Expected status code ${value} to be a valid status code, but it is not a known HTTP codeF`\n );\n }\n}\n\nexport function IsStatusCode(value: number): value is StatusCode {\n return Object.values(StatusCodes)\n .map((it) => it.status as number)\n .includes(value);\n}\n","import { Fixture, LIFE_CYCLE } from \"@autometa/app\";\nimport { HTTPRequestBuilder, RequestHook, ResponseHook } from \"./http.builder\";\nimport { SchemaMap } from \"./schema.map\";\nimport { SchemaParser, StatusCode } from \"./types\";\n@Fixture(LIFE_CYCLE.Transient)\nexport class HTTP {\n #url: string;\n #route: string[] = [];\n #headers = new Map<string, string>();\n #requireSchema = false;\n #schemaMap: SchemaMap = new SchemaMap();\n #onBeforeSend: RequestHook[] = [];\n #onAfterSend: ResponseHook<unknown>[] = [];\n #allowPlainText = false;\n\n allowPlainText(value: boolean) {\n this.#allowPlainText = value;\n return this;\n }\n requireSchema(value: boolean) {\n this.#requireSchema = value;\n return this;\n }\n\n url(url: string) {\n this.#url = url;\n return this;\n }\n\n sharedOnBeforeSend(hook: RequestHook) {\n this.#onBeforeSend.push(hook);\n return this;\n }\n\n sharedOnReceiveResponse(hook: ResponseHook<unknown>) {\n this.#onAfterSend.push(hook);\n return this;\n }\n\n onBeforeSend(hook: RequestHook) {\n return this.builder().onBeforeSend(hook);\n }\n\n onReceiveResponse(hook: ResponseHook<unknown>) {\n return this.builder().onReceivedResponse(hook);\n }\n\n sharedSchema(parser: SchemaParser, ...codes: StatusCode[]): HTTP;\n sharedSchema(\n parser: SchemaParser,\n ...range: { from: StatusCode; to: StatusCode }[]\n ): HTTP;\n sharedSchema(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.#schemaMap.register(parser, ...(args as any));\n return this;\n }\n\n schema(parser: SchemaParser, ...codes: StatusCode[]): HTTPRequestBuilder;\n schema(\n parser: SchemaParser,\n ...range: { from: StatusCode; to: StatusCode }[]\n ): HTTPRequestBuilder;\n schema(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this.builder().schema(parser, ...(args as any));\n }\n\n sharedRoute(...route: string[]) {\n this.#route.push(...route);\n return this;\n }\n\n param(name: string, value: string) {\n return this.builder().param(name, value);\n }\n\n params(dict: Record<string, string>) {\n return this.builder().params(dict);\n }\n\n data<T>(data: T) {\n return this.builder().data(data);\n }\n\n sharedHeader(name: string, value: string) {\n this.#headers.set(name, value);\n return this;\n }\n\n route(...route: (string | number | boolean)[]) {\n return this.builder().route(...route);\n }\n\n header<T>(name: string, value: T) {\n return this.builder().header(name, value);\n }\n\n headers(dict: Record<string, string>) {\n return this.builder().headers(dict);\n }\n\n get() {\n return this.builder().get();\n }\n\n private builder() {\n return new HTTPRequestBuilder(this.#schemaMap)\n .url(this.#url)\n .route(...this.#route)\n .allowPlainText(this.#allowPlainText)\n .headers(Object.fromEntries(this.#headers))\n .requireSchema(this.#requireSchema)\n .onBeforeSend(...this.#onBeforeSend)\n .onReceivedResponse(...this.#onAfterSend);\n }\n}\n"],"mappings":"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","names":["AutomationError","AutomationError","Fixture","LIFE_CYCLE","_url","_route","_headers","_requireSchema","_schemaMap","_onBeforeSend","_onAfterSend","_allowPlainText","Fixture","LIFE_CYCLE"]}
|
|
1
|
+
{"version":3,"sources":["../../src/http.response.ts","../../src/http.ts","../../src/http.builder.ts","../../src/schema.map.ts","../../src/transform-response.ts","../../src/axios-executor.ts"],"sourcesContent":["import { Method } from \"axios\";\n\nexport class HTTPResponse<T> {\n status: number;\n statusText: string;\n data: T;\n headers: Record<string, string>;\n request: {\n url: string;\n method: Method;\n };\n static derive<TOriginal, TDerived>(\n original: HTTPResponse<TOriginal>,\n data: TDerived\n ): HTTPResponse<TDerived>;\n static derive<TOriginal, TDerived>(\n original: HTTPResponse<TOriginal>,\n data: (original: TOriginal) => TDerived\n ): HTTPResponse<TDerived>;\n static derive<TOriginal, TDerived>(\n original: HTTPResponse<TOriginal>,\n data: TDerived | ((original: TOriginal) => TDerived)\n ) {\n const response = new DerivedHTTPResponse<TDerived, TOriginal>();\n if (typeof data === \"function\") {\n const fn = data as (original: TOriginal) => TDerived;\n response.data = fn(original.data);\n } else {\n response.data = data;\n }\n response.status = original.status;\n response.statusText = original.statusText;\n response.headers = original.headers;\n response.request = original.request;\n response.actual = original as HTTPResponse<TOriginal>;\n return response;\n }\n}\n\nexport class DerivedHTTPResponse<T, K> extends HTTPResponse<T> {\n actual: HTTPResponse<K>;\n}\n","import { Fixture, LIFE_CYCLE } from \"@autometa/app\";\nimport { HTTPRequestBuilder } from \"./http.builder\";\nimport { SchemaMap } from \"./schema.map\";\nimport { RequestHook, ResponseHook, SchemaParser, StatusCode } from \"./types\";\n@Fixture(LIFE_CYCLE.Transient)\nexport class HTTP {\n #url: string;\n #route: string[] = [];\n #headers = new Map<string, string>();\n #requireSchema = false;\n #schemaMap: SchemaMap = new SchemaMap();\n #onBeforeSend: RequestHook[] = [];\n #onAfterSend: ResponseHook<unknown>[] = [];\n #allowPlainText = false;\n\n allowPlainText(value: boolean) {\n this.#allowPlainText = value;\n return this;\n }\n requireSchema(value: boolean) {\n this.#requireSchema = value;\n return this;\n }\n\n url(url: string) {\n this.#url = url;\n return this;\n }\n\n sharedOnBeforeSend(hook: RequestHook) {\n this.#onBeforeSend.push(hook);\n return this;\n }\n\n sharedOnReceiveResponse(hook: ResponseHook<unknown>) {\n this.#onAfterSend.push(hook);\n return this;\n }\n\n onBeforeSend(hook: RequestHook) {\n return this.builder().onBeforeSend(hook);\n }\n\n onReceiveResponse(hook: ResponseHook<unknown>) {\n return this.builder().onReceivedResponse(hook);\n }\n\n sharedSchema(parser: SchemaParser, ...codes: StatusCode[]): HTTP;\n sharedSchema(\n parser: SchemaParser,\n ...range: { from: StatusCode; to: StatusCode }[]\n ): HTTP;\n sharedSchema(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.#schemaMap.register(parser, ...(args as any));\n return this;\n }\n\n schema(parser: SchemaParser, ...codes: StatusCode[]): HTTPRequestBuilder;\n schema(\n parser: SchemaParser,\n ...range: { from: StatusCode; to: StatusCode }[]\n ): HTTPRequestBuilder;\n schema(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this.builder().schema(parser, ...(args as any));\n }\n\n sharedRoute(...route: string[]) {\n this.#route.push(...route);\n return this;\n }\n\n param(name: string, value: string) {\n return this.builder().param(name, value);\n }\n\n params(dict: Record<string, string>) {\n return this.builder().params(dict);\n }\n\n data<T>(data: T) {\n return this.builder().data(data);\n }\n\n sharedHeader(name: string, value: string) {\n this.#headers.set(name, value);\n return this;\n }\n\n route(...route: (string | number | boolean)[]) {\n return this.builder().route(...route);\n }\n\n header<T>(name: string, value: T) {\n return this.builder().header(name, value);\n }\n\n headers(dict: Record<string, string>) {\n return this.builder().headers(dict);\n }\n\n get() {\n return this.builder().get();\n }\n\n private builder() {\n return new HTTPRequestBuilder(this.#schemaMap)\n .url(this.#url)\n .route(...this.#route)\n .allowPlainText(this.#allowPlainText)\n .headers(Object.fromEntries(this.#headers))\n .requireSchema(this.#requireSchema)\n .onBeforeSend(...this.#onBeforeSend)\n .onReceivedResponse(...this.#onAfterSend);\n }\n}\n","import { Fixture, LIFE_CYCLE } from \"@autometa/app\";\nimport { AutomationError } from \"@autometa/errors\";\nimport { AxiosRequestConfig, Method, ResponseType } from \"axios\";\nimport { urlJoinP } from \"url-join-ts\";\nimport { HTTPResponse } from \"./http.response\";\nimport { SchemaMap } from \"./schema.map\";\nimport {\n RequestHook,\n RequestState,\n ResponseHook,\n SchemaParser,\n StatusCode\n} from \"./types\";\nimport { transformResponse } from \"./transform-response\";\nimport { AxiosExecutor } from \"./axios-executor\";\n\n@Fixture(LIFE_CYCLE.Transient)\nexport class HTTPRequestBuilder {\n #headers = new Map<string, string>();\n #params = new Map<string, unknown>();\n #url: string;\n #route: string[] = [];\n #method: Method;\n #schemaMap = new SchemaMap();\n #responseType: ResponseType | undefined = \"json\";\n #data: unknown;\n #requireSchema = false;\n #allowPlainText = false;\n #onBeforeSend: RequestHook[] = [];\n #onAfterSend: ResponseHook<unknown>[] = [];\n constructor(map: SchemaMap) {\n this.#schemaMap = new SchemaMap().including(map);\n }\n requireSchema(value: boolean) {\n this.#requireSchema = value;\n return this;\n }\n get currentState(): RequestState {\n const fullUrl = this.currentUrl;\n return {\n headers: this.#headers,\n params: this.#params,\n url: this.#url,\n route: this.#route,\n responseType: this.#responseType,\n data: this.#data,\n method: this.#method,\n fullUrl\n };\n }\n\n get currentUrl() {\n const params = Object.fromEntries(this.#params);\n return urlJoinP(this.#url, this.#route, params);\n }\n\n url(url: string) {\n this.#url = url;\n return this;\n }\n\n allowPlainText(value: boolean) {\n this.#allowPlainText = value;\n return this;\n }\n\n schema(parser: SchemaParser, ...codes: StatusCode[]): HTTPRequestBuilder;\n schema(\n parser: SchemaParser,\n ...range: { from: StatusCode; to: StatusCode }[]\n ): HTTPRequestBuilder;\n\n schema(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ) {\n this.#schemaMap.register(parser, ...args);\n return this;\n }\n\n onBeforeSend(...hook: RequestHook[]) {\n this.#onBeforeSend.push(...hook);\n return this;\n }\n\n onReceivedResponse(...hook: ResponseHook<unknown>[]) {\n this.#onAfterSend.push(...hook);\n return this;\n }\n\n route(...route: (string | number | boolean)[]) {\n this.#route.push(...route.map((it) => `${it}`));\n return this;\n }\n\n header<T>(name: string, value: T) {\n const val = Array.isArray(value) ? value.join(\",\") : `${value}`;\n this.#headers.set(name, val);\n return this;\n }\n\n headers(dict: Record<string, string>) {\n Object.entries(dict).forEach(([name, value]) =>\n this.#headers.set(name, value)\n );\n return this;\n }\n\n param<T>(name: string, value: T) {\n this.#params.set(name, value);\n return this;\n }\n\n params(dict: Record<string, unknown>) {\n Object.entries(dict).forEach(([name, value]) => this.param(name, value));\n return this;\n }\n\n data<T>(data: T) {\n this.#data = data;\n return this;\n }\n\n async post<TReturn>(): Promise<HTTPResponse<TReturn>> {\n return this._request(\"POST\");\n }\n\n async get<TReturn>(): Promise<HTTPResponse<TReturn>> {\n return this._request(\"GET\");\n }\n\n async delete<TReturn>(): Promise<HTTPResponse<TReturn>> {\n return this._request(\"DELETE\");\n }\n\n async put<TReturn>(): Promise<HTTPResponse<TReturn>> {\n return this._request(\"PUT\");\n }\n\n async patch<TReturn>(): Promise<HTTPResponse<TReturn>> {\n return this._request(\"PATCH\");\n }\n private async _request<T>(method: Method) {\n this.#method = method;\n\n const options: AxiosRequestConfig = this.constructOptions<T>(method);\n this.tryRunBeforeHooks();\n const executor = new AxiosExecutor(\n options,\n this.#schemaMap,\n this.currentState,\n this.#requireSchema\n );\n await executor.tryRequest<T>();\n if (executor.requestSucceeded && !executor.validationFailed) {\n const response = executor.getValidatedResponse<T>();\n this.tryRunAfterHooks<T>(response);\n return response;\n }\n if (executor.requestSucceeded) {\n const response = executor.getResponse<T>();\n // this.tryOnValidationFailed(response);\n this.tryRunAfterHooks<T>(response);\n }\n throw executor.error;\n }\n\n private constructOptions<T>(method: string): AxiosRequestConfig<T> {\n const url = this.currentUrl;\n const headers = this.#headers && Object.fromEntries(this.#headers);\n const responseType = this.#responseType;\n const data = this.#data as T;\n return {\n method,\n url,\n headers,\n data,\n responseType,\n validateStatus: function (status) {\n return status >= 100 && status < 500;\n },\n transformResponse: transformResponse.bind(null, this.#allowPlainText)\n };\n }\n\n private tryRunBeforeHooks() {\n let index = 0;\n try {\n for (const hook of this.#onBeforeSend) {\n hook(this.currentState);\n index++;\n }\n } catch (e) {\n const error = e as Error;\n const message = `HTTP Client 'onBeforeRequest' experienced an error at listener count ${index}`;\n throw new AutomationError(message, { cause: error });\n }\n }\n private tryRunAfterHooks<T>(response: HTTPResponse<T>) {\n let index = 0;\n try {\n for (const hook of this.#onAfterSend) {\n hook(response);\n index++;\n }\n } catch (e) {\n const error = e as Error;\n const message = `HTTP Client 'onRequestReceived' experienced an error at listener count ${index}`;\n throw new AutomationError(message, { cause: error });\n }\n }\n}\n","import { StatusCode, SchemaParser } from \"./types\";\nimport { AutomationError } from \"@autometa/errors\";\nimport { StatusCodes } from \"@autometa/status-codes\";\n\nexport class SchemaMap {\n #children: SchemaMap[] = [];\n #map: Map<StatusCode, SchemaParser> = new Map();\n register(\n parser: SchemaParser,\n ...codes: StatusCode[]\n ): (typeof parser)[\"parse\"];\n register(\n parser: SchemaParser,\n ...range: { from: StatusCode; to: StatusCode }[]\n ): (typeof parser)[\"parse\"];\n register(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ): (typeof parser)[\"parse\"];\n register(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ) {\n args.forEach((arg) => {\n if (typeof arg === \"number\") {\n this.registerSingle(parser, arg);\n } else {\n this.registerRange(parser, arg);\n }\n });\n return parser.parse;\n }\n\n registerSingle(parser: SchemaParser, ...codes: StatusCode[]) {\n codes.forEach((code) => {\n if (this.#map.has(code)) {\n throw new AutomationError(\n `Status code ${code} is already registered with a parser`\n );\n }\n assertIsStatusCode(code);\n this.#map.set(code, parser);\n });\n }\n\n including(map: SchemaMap) {\n this.#children.includes(map);\n return this;\n }\n registerRange(\n parser: SchemaParser,\n ...range: { from: StatusCode; to: StatusCode }[]\n ) {\n range.forEach(({ from, to }) => {\n assertIsStatusCode(from);\n assertIsStatusCode(to);\n for (let i = from; i <= to; i++) {\n if (!IsStatusCode(i)) {\n continue;\n }\n if (this.#map.has(i)) {\n throw new AutomationError(\n `Status code ${i} is already registered with a parser`\n );\n }\n this.#map.set(i, parser);\n }\n });\n }\n\n get(status: StatusCode): SchemaParser | undefined {\n assertIsStatusCode(status);\n const local = this.#map.get(status);\n if (local) {\n return local;\n }\n const nested = this.#children.find((it) => it.#map.has(status));\n return nested?.get(status);\n }\n\n validate<T>(status: StatusCode, response: T, strict: boolean): T {\n const parser = this.get(status);\n if (!parser) {\n if (!strict) {\n return response;\n }\n throw new AutomationError(\n `No schema parser registered for status code ${status} and 'requireSchema' is set to true`\n );\n }\n return parser.parse(response) as T;\n }\n}\n\nexport function assertIsStatusCode(value: number): asserts value is StatusCode {\n const result = Object.values(StatusCodes)\n .map((it) => it.status as number)\n .includes(value);\n if (!result) {\n throw new AutomationError(\n `Expected status code ${value} to be a valid status code, but it is not a known HTTP codeF`\n );\n }\n}\n\nexport function IsStatusCode(value: number): value is StatusCode {\n return Object.values(StatusCodes)\n .map((it) => it.status as number)\n .includes(value);\n}\n","import { AutomationError } from \"@autometa/errors\";\nimport isJson from \"@stdlib/assert-is-json\";\nimport { highlight } from \"cli-highlight\";\n\nexport function transformResponse(\n allowPlainText: boolean,\n data: string | undefined | null\n) {\n if (data === null) {\n return null;\n }\n if (data === undefined) {\n return undefined;\n }\n if (isJson(data)) {\n return JSON.parse(data);\n }\n if ([\"true\", \"false\"].includes(data)) {\n return JSON.parse(data);\n }\n if (/^\\d*\\.?\\d+$/.test(data)) {\n return JSON.parse(data);\n }\n\n if (allowPlainText) {\n return data;\n }\n const response = highlight(data, { language: \"html\" });\n const message = [\n `Could not parse a response as json, and this request was not configured to allow plain text responses.`,\n `To allow plain text responses, use the 'allowPlainText' method on the HTTP client.`,\n \" \",\n response\n ];\n throw new AutomationError(message.join(\"\\n\"));\n}\n","import axios, { AxiosRequestConfig, AxiosResponse } from \"axios\";\nimport { SchemaMap } from \"./schema.map\";\nimport type { RequestState, StatusCode } from \"./types\";\nimport { plainToInstance } from \"class-transformer\";\nimport { HTTPResponse } from \"./http.response\";\nimport { AutomationError } from \"@autometa/errors\";\ntype ExecutorState = {\n response: AxiosResponse<unknown>;\n validated: unknown;\n error: Error | undefined;\n};\nexport class AxiosExecutor {\n #result: ExecutorState = {} as ExecutorState;\n constructor(\n private options: AxiosRequestConfig,\n private schemaMap: SchemaMap,\n private requestState: RequestState,\n private requireSchema: boolean\n ) {}\n\n get error() {\n return this.#result.error;\n }\n get requestSucceeded() {\n return this.#result.response !== undefined;\n }\n\n get validationFailed() {\n return this.#result.validated === undefined;\n }\n\n async tryRequest<T>() {\n try {\n this.#result.response = await axios<T>(this.options);\n this.tryValidate();\n } catch (e) {\n if (this.#result.error) {\n return;\n }\n const { method, fullUrl, data, headers } = this.requestState;\n const body = JSON.stringify(data, null, 2);\n const headersString = JSON.stringify(headers, null, 2);\n const message = `Failed to send request to ${method}:${fullUrl}.\nheaders:\n${headersString}\n \nbody: \n${body}`;\n this.#result.error = new AutomationError(message, { cause: e as Error });\n }\n }\n\n async tryValidate() {\n const { status, data } = this.#result.response;\n const { method, fullUrl } = this.requestState;\n try {\n this.#result.validated = this.schemaMap.validate(\n status as StatusCode,\n data,\n this.requireSchema\n );\n } catch (e) {\n const error = e as Error;\n const message = `Failed to validate response from ${method}:${fullUrl}.\n \nProvided body was:\n${JSON.stringify(data, null, 2)}`;\n this.#result.error = new AutomationError(message, { cause: error });\n }\n }\n\n getValidatedResponse<T>() {\n const { status, statusText, headers } = this.#result.response;\n const { validated: data } = this.#result;\n const { fullUrl: url, method } = this.requestState;\n return plainToInstance(HTTPResponse, {\n status,\n statusText,\n headers,\n data,\n request: {\n url,\n method\n }\n }) as HTTPResponse<T>;\n }\n\n getResponse<T>() {\n const { status, statusText, headers, data } = this.#result.response;\n const { fullUrl: url, method } = this.requestState;\n return plainToInstance(\n HTTPResponse,\n {\n status,\n statusText,\n headers,\n data,\n request: {\n url,\n method\n }\n },\n { excludeExtraneousValues: true }\n ) as HTTPResponse<T>;\n }\n}\n"],"mappings":"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","names":["Fixture","LIFE_CYCLE","AutomationError","AutomationError","AutomationError","AutomationError","AutomationError","_url","_route","_headers","_requireSchema","_schemaMap","_onBeforeSend","_onAfterSend","_allowPlainText","Fixture","LIFE_CYCLE"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Method, ResponseType } from 'axios';
|
|
2
2
|
import { StatusCodes } from '@autometa/status-codes';
|
|
3
3
|
|
|
4
4
|
declare class HTTPResponse<T> {
|
|
@@ -8,10 +8,8 @@ declare class HTTPResponse<T> {
|
|
|
8
8
|
headers: Record<string, string>;
|
|
9
9
|
request: {
|
|
10
10
|
url: string;
|
|
11
|
-
|
|
12
|
-
passedValidation: boolean;
|
|
11
|
+
method: Method;
|
|
13
12
|
};
|
|
14
|
-
static fromRaw<T>(data: T, status: number, statusText: string, headers: Record<string, string>, url: string, validated: boolean, passedValidation: boolean): HTTPResponse<T>;
|
|
15
13
|
static derive<TOriginal, TDerived>(original: HTTPResponse<TOriginal>, data: TDerived): HTTPResponse<TDerived>;
|
|
16
14
|
static derive<TOriginal, TDerived>(original: HTTPResponse<TOriginal>, data: (original: TOriginal) => TDerived): HTTPResponse<TDerived>;
|
|
17
15
|
}
|
|
@@ -27,6 +25,18 @@ type StatusCode<T extends typeof StatusCodes = typeof StatusCodes> = {
|
|
|
27
25
|
status: infer U;
|
|
28
26
|
} ? U : never;
|
|
29
27
|
}[keyof T];
|
|
28
|
+
type RequestState = {
|
|
29
|
+
headers: Map<string, string>;
|
|
30
|
+
params: Map<string, unknown>;
|
|
31
|
+
url: string;
|
|
32
|
+
route: string[];
|
|
33
|
+
responseType: ResponseType | undefined;
|
|
34
|
+
data: unknown;
|
|
35
|
+
method: Method;
|
|
36
|
+
get fullUrl(): string;
|
|
37
|
+
};
|
|
38
|
+
type RequestHook = (state: RequestState) => unknown;
|
|
39
|
+
type ResponseHook<T> = (state: HTTPResponse<T>) => unknown;
|
|
30
40
|
|
|
31
41
|
declare class SchemaMap {
|
|
32
42
|
#private;
|
|
@@ -35,6 +45,10 @@ declare class SchemaMap {
|
|
|
35
45
|
from: StatusCode;
|
|
36
46
|
to: StatusCode;
|
|
37
47
|
}[]): (typeof parser)["parse"];
|
|
48
|
+
register(parser: SchemaParser, ...args: (StatusCode | {
|
|
49
|
+
from: StatusCode;
|
|
50
|
+
to: StatusCode;
|
|
51
|
+
})[]): (typeof parser)["parse"];
|
|
38
52
|
registerSingle(parser: SchemaParser, ...codes: StatusCode[]): void;
|
|
39
53
|
including(map: SchemaMap): this;
|
|
40
54
|
registerRange(parser: SchemaParser, ...range: {
|
|
@@ -44,21 +58,7 @@ declare class SchemaMap {
|
|
|
44
58
|
get(status: StatusCode): SchemaParser | undefined;
|
|
45
59
|
validate<T>(status: StatusCode, response: T, strict: boolean): T;
|
|
46
60
|
}
|
|
47
|
-
declare function assertIsStatusCode(value: number): asserts value is StatusCode;
|
|
48
|
-
declare function IsStatusCode(value: number): value is StatusCode;
|
|
49
61
|
|
|
50
|
-
type RequestState = {
|
|
51
|
-
headers: Map<string, string>;
|
|
52
|
-
params: Map<string, unknown>;
|
|
53
|
-
url: string;
|
|
54
|
-
route: string[];
|
|
55
|
-
responseType: ResponseType | undefined;
|
|
56
|
-
data: unknown;
|
|
57
|
-
method: Method;
|
|
58
|
-
get fullUrl(): string;
|
|
59
|
-
};
|
|
60
|
-
type RequestHook = (state: RequestState) => unknown;
|
|
61
|
-
type ResponseHook<T> = (state: HTTPResponse<T>) => unknown;
|
|
62
62
|
declare class HTTPRequestBuilder {
|
|
63
63
|
#private;
|
|
64
64
|
constructor(map: SchemaMap);
|
|
@@ -67,10 +67,10 @@ declare class HTTPRequestBuilder {
|
|
|
67
67
|
get currentUrl(): string;
|
|
68
68
|
url(url: string): this;
|
|
69
69
|
allowPlainText(value: boolean): this;
|
|
70
|
-
schema(parser: SchemaParser, ...codes:
|
|
70
|
+
schema(parser: SchemaParser, ...codes: StatusCode[]): HTTPRequestBuilder;
|
|
71
71
|
schema(parser: SchemaParser, ...range: {
|
|
72
|
-
from:
|
|
73
|
-
to:
|
|
72
|
+
from: StatusCode;
|
|
73
|
+
to: StatusCode;
|
|
74
74
|
}[]): HTTPRequestBuilder;
|
|
75
75
|
onBeforeSend(...hook: RequestHook[]): this;
|
|
76
76
|
onReceivedResponse(...hook: ResponseHook<unknown>[]): this;
|
|
@@ -84,12 +84,11 @@ declare class HTTPRequestBuilder {
|
|
|
84
84
|
get<TReturn>(): Promise<HTTPResponse<TReturn>>;
|
|
85
85
|
delete<TReturn>(): Promise<HTTPResponse<TReturn>>;
|
|
86
86
|
put<TReturn>(): Promise<HTTPResponse<TReturn>>;
|
|
87
|
+
patch<TReturn>(): Promise<HTTPResponse<TReturn>>;
|
|
87
88
|
private _request;
|
|
89
|
+
private constructOptions;
|
|
88
90
|
private tryRunBeforeHooks;
|
|
89
91
|
private tryRunAfterHooks;
|
|
90
|
-
makeResponse<T>(res: AxiosResponse): HTTPResponse<T>;
|
|
91
|
-
private createWrapper;
|
|
92
|
-
private validateSchemas;
|
|
93
92
|
}
|
|
94
93
|
|
|
95
94
|
declare class HTTP {
|
|
@@ -123,4 +122,4 @@ declare class HTTP {
|
|
|
123
122
|
private builder;
|
|
124
123
|
}
|
|
125
124
|
|
|
126
|
-
export { DerivedHTTPResponse, HTTP,
|
|
125
|
+
export { DerivedHTTPResponse, HTTP, HTTPResponse, RequestHook, RequestState, ResponseHook, SchemaParser, StatusCode };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Method, ResponseType } from 'axios';
|
|
2
2
|
import { StatusCodes } from '@autometa/status-codes';
|
|
3
3
|
|
|
4
4
|
declare class HTTPResponse<T> {
|
|
@@ -8,10 +8,8 @@ declare class HTTPResponse<T> {
|
|
|
8
8
|
headers: Record<string, string>;
|
|
9
9
|
request: {
|
|
10
10
|
url: string;
|
|
11
|
-
|
|
12
|
-
passedValidation: boolean;
|
|
11
|
+
method: Method;
|
|
13
12
|
};
|
|
14
|
-
static fromRaw<T>(data: T, status: number, statusText: string, headers: Record<string, string>, url: string, validated: boolean, passedValidation: boolean): HTTPResponse<T>;
|
|
15
13
|
static derive<TOriginal, TDerived>(original: HTTPResponse<TOriginal>, data: TDerived): HTTPResponse<TDerived>;
|
|
16
14
|
static derive<TOriginal, TDerived>(original: HTTPResponse<TOriginal>, data: (original: TOriginal) => TDerived): HTTPResponse<TDerived>;
|
|
17
15
|
}
|
|
@@ -27,6 +25,18 @@ type StatusCode<T extends typeof StatusCodes = typeof StatusCodes> = {
|
|
|
27
25
|
status: infer U;
|
|
28
26
|
} ? U : never;
|
|
29
27
|
}[keyof T];
|
|
28
|
+
type RequestState = {
|
|
29
|
+
headers: Map<string, string>;
|
|
30
|
+
params: Map<string, unknown>;
|
|
31
|
+
url: string;
|
|
32
|
+
route: string[];
|
|
33
|
+
responseType: ResponseType | undefined;
|
|
34
|
+
data: unknown;
|
|
35
|
+
method: Method;
|
|
36
|
+
get fullUrl(): string;
|
|
37
|
+
};
|
|
38
|
+
type RequestHook = (state: RequestState) => unknown;
|
|
39
|
+
type ResponseHook<T> = (state: HTTPResponse<T>) => unknown;
|
|
30
40
|
|
|
31
41
|
declare class SchemaMap {
|
|
32
42
|
#private;
|
|
@@ -35,6 +45,10 @@ declare class SchemaMap {
|
|
|
35
45
|
from: StatusCode;
|
|
36
46
|
to: StatusCode;
|
|
37
47
|
}[]): (typeof parser)["parse"];
|
|
48
|
+
register(parser: SchemaParser, ...args: (StatusCode | {
|
|
49
|
+
from: StatusCode;
|
|
50
|
+
to: StatusCode;
|
|
51
|
+
})[]): (typeof parser)["parse"];
|
|
38
52
|
registerSingle(parser: SchemaParser, ...codes: StatusCode[]): void;
|
|
39
53
|
including(map: SchemaMap): this;
|
|
40
54
|
registerRange(parser: SchemaParser, ...range: {
|
|
@@ -44,21 +58,7 @@ declare class SchemaMap {
|
|
|
44
58
|
get(status: StatusCode): SchemaParser | undefined;
|
|
45
59
|
validate<T>(status: StatusCode, response: T, strict: boolean): T;
|
|
46
60
|
}
|
|
47
|
-
declare function assertIsStatusCode(value: number): asserts value is StatusCode;
|
|
48
|
-
declare function IsStatusCode(value: number): value is StatusCode;
|
|
49
61
|
|
|
50
|
-
type RequestState = {
|
|
51
|
-
headers: Map<string, string>;
|
|
52
|
-
params: Map<string, unknown>;
|
|
53
|
-
url: string;
|
|
54
|
-
route: string[];
|
|
55
|
-
responseType: ResponseType | undefined;
|
|
56
|
-
data: unknown;
|
|
57
|
-
method: Method;
|
|
58
|
-
get fullUrl(): string;
|
|
59
|
-
};
|
|
60
|
-
type RequestHook = (state: RequestState) => unknown;
|
|
61
|
-
type ResponseHook<T> = (state: HTTPResponse<T>) => unknown;
|
|
62
62
|
declare class HTTPRequestBuilder {
|
|
63
63
|
#private;
|
|
64
64
|
constructor(map: SchemaMap);
|
|
@@ -67,10 +67,10 @@ declare class HTTPRequestBuilder {
|
|
|
67
67
|
get currentUrl(): string;
|
|
68
68
|
url(url: string): this;
|
|
69
69
|
allowPlainText(value: boolean): this;
|
|
70
|
-
schema(parser: SchemaParser, ...codes:
|
|
70
|
+
schema(parser: SchemaParser, ...codes: StatusCode[]): HTTPRequestBuilder;
|
|
71
71
|
schema(parser: SchemaParser, ...range: {
|
|
72
|
-
from:
|
|
73
|
-
to:
|
|
72
|
+
from: StatusCode;
|
|
73
|
+
to: StatusCode;
|
|
74
74
|
}[]): HTTPRequestBuilder;
|
|
75
75
|
onBeforeSend(...hook: RequestHook[]): this;
|
|
76
76
|
onReceivedResponse(...hook: ResponseHook<unknown>[]): this;
|
|
@@ -84,12 +84,11 @@ declare class HTTPRequestBuilder {
|
|
|
84
84
|
get<TReturn>(): Promise<HTTPResponse<TReturn>>;
|
|
85
85
|
delete<TReturn>(): Promise<HTTPResponse<TReturn>>;
|
|
86
86
|
put<TReturn>(): Promise<HTTPResponse<TReturn>>;
|
|
87
|
+
patch<TReturn>(): Promise<HTTPResponse<TReturn>>;
|
|
87
88
|
private _request;
|
|
89
|
+
private constructOptions;
|
|
88
90
|
private tryRunBeforeHooks;
|
|
89
91
|
private tryRunAfterHooks;
|
|
90
|
-
makeResponse<T>(res: AxiosResponse): HTTPResponse<T>;
|
|
91
|
-
private createWrapper;
|
|
92
|
-
private validateSchemas;
|
|
93
92
|
}
|
|
94
93
|
|
|
95
94
|
declare class HTTP {
|
|
@@ -123,4 +122,4 @@ declare class HTTP {
|
|
|
123
122
|
private builder;
|
|
124
123
|
}
|
|
125
124
|
|
|
126
|
-
export { DerivedHTTPResponse, HTTP,
|
|
125
|
+
export { DerivedHTTPResponse, HTTP, HTTPResponse, RequestHook, RequestState, ResponseHook, SchemaParser, StatusCode };
|
package/dist/index.js
CHANGED
|
@@ -59,36 +59,12 @@ var src_exports = {};
|
|
|
59
59
|
__export(src_exports, {
|
|
60
60
|
DerivedHTTPResponse: () => DerivedHTTPResponse,
|
|
61
61
|
HTTP: () => HTTP,
|
|
62
|
-
|
|
63
|
-
HTTPResponse: () => HTTPResponse,
|
|
64
|
-
IsStatusCode: () => IsStatusCode,
|
|
65
|
-
SchemaMap: () => SchemaMap,
|
|
66
|
-
assertIsStatusCode: () => assertIsStatusCode
|
|
62
|
+
HTTPResponse: () => HTTPResponse
|
|
67
63
|
});
|
|
68
64
|
module.exports = __toCommonJS(src_exports);
|
|
69
65
|
|
|
70
|
-
// src/http.builder.ts
|
|
71
|
-
var import_app = require("@autometa/app");
|
|
72
|
-
var import_errors2 = require("@autometa/errors");
|
|
73
|
-
var import_axios = __toESM(require("axios"), 1);
|
|
74
|
-
var import_class_transformer = require("class-transformer");
|
|
75
|
-
var import_url_join_ts = require("url-join-ts");
|
|
76
|
-
|
|
77
66
|
// src/http.response.ts
|
|
78
|
-
var HTTPResponse = class
|
|
79
|
-
static fromRaw(data, status, statusText, headers, url, validated, passedValidation) {
|
|
80
|
-
const response = new _HTTPResponse();
|
|
81
|
-
response.data = data;
|
|
82
|
-
response.status = status;
|
|
83
|
-
response.statusText = statusText;
|
|
84
|
-
response.headers = headers;
|
|
85
|
-
response.request = {
|
|
86
|
-
url,
|
|
87
|
-
validated,
|
|
88
|
-
passedValidation
|
|
89
|
-
};
|
|
90
|
-
return response;
|
|
91
|
-
}
|
|
67
|
+
var HTTPResponse = class {
|
|
92
68
|
static derive(original, data) {
|
|
93
69
|
const response = new DerivedHTTPResponse();
|
|
94
70
|
if (typeof data === "function") {
|
|
@@ -108,6 +84,14 @@ var HTTPResponse = class _HTTPResponse {
|
|
|
108
84
|
var DerivedHTTPResponse = class extends HTTPResponse {
|
|
109
85
|
};
|
|
110
86
|
|
|
87
|
+
// src/http.ts
|
|
88
|
+
var import_app2 = require("@autometa/app");
|
|
89
|
+
|
|
90
|
+
// src/http.builder.ts
|
|
91
|
+
var import_app = require("@autometa/app");
|
|
92
|
+
var import_errors4 = require("@autometa/errors");
|
|
93
|
+
var import_url_join_ts = require("url-join-ts");
|
|
94
|
+
|
|
111
95
|
// src/schema.map.ts
|
|
112
96
|
var import_errors = require("@autometa/errors");
|
|
113
97
|
var import_status_codes = require("@autometa/status-codes");
|
|
@@ -195,9 +179,136 @@ function IsStatusCode(value) {
|
|
|
195
179
|
return Object.values(import_status_codes.StatusCodes).map((it) => it.status).includes(value);
|
|
196
180
|
}
|
|
197
181
|
|
|
198
|
-
// src/
|
|
182
|
+
// src/transform-response.ts
|
|
183
|
+
var import_errors2 = require("@autometa/errors");
|
|
199
184
|
var import_assert_is_json = __toESM(require("@stdlib/assert-is-json"), 1);
|
|
200
185
|
var import_cli_highlight = require("cli-highlight");
|
|
186
|
+
function transformResponse(allowPlainText, data) {
|
|
187
|
+
if (data === null) {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
if (data === void 0) {
|
|
191
|
+
return void 0;
|
|
192
|
+
}
|
|
193
|
+
if ((0, import_assert_is_json.default)(data)) {
|
|
194
|
+
return JSON.parse(data);
|
|
195
|
+
}
|
|
196
|
+
if (["true", "false"].includes(data)) {
|
|
197
|
+
return JSON.parse(data);
|
|
198
|
+
}
|
|
199
|
+
if (/^\d*\.?\d+$/.test(data)) {
|
|
200
|
+
return JSON.parse(data);
|
|
201
|
+
}
|
|
202
|
+
if (allowPlainText) {
|
|
203
|
+
return data;
|
|
204
|
+
}
|
|
205
|
+
const response = (0, import_cli_highlight.highlight)(data, { language: "html" });
|
|
206
|
+
const message = [
|
|
207
|
+
`Could not parse a response as json, and this request was not configured to allow plain text responses.`,
|
|
208
|
+
`To allow plain text responses, use the 'allowPlainText' method on the HTTP client.`,
|
|
209
|
+
" ",
|
|
210
|
+
response
|
|
211
|
+
];
|
|
212
|
+
throw new import_errors2.AutomationError(message.join("\n"));
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// src/axios-executor.ts
|
|
216
|
+
var import_axios = __toESM(require("axios"), 1);
|
|
217
|
+
var import_class_transformer = require("class-transformer");
|
|
218
|
+
var import_errors3 = require("@autometa/errors");
|
|
219
|
+
var _result;
|
|
220
|
+
var AxiosExecutor = class {
|
|
221
|
+
constructor(options, schemaMap, requestState, requireSchema) {
|
|
222
|
+
this.options = options;
|
|
223
|
+
this.schemaMap = schemaMap;
|
|
224
|
+
this.requestState = requestState;
|
|
225
|
+
this.requireSchema = requireSchema;
|
|
226
|
+
__privateAdd(this, _result, {});
|
|
227
|
+
}
|
|
228
|
+
get error() {
|
|
229
|
+
return __privateGet(this, _result).error;
|
|
230
|
+
}
|
|
231
|
+
get requestSucceeded() {
|
|
232
|
+
return __privateGet(this, _result).response !== void 0;
|
|
233
|
+
}
|
|
234
|
+
get validationFailed() {
|
|
235
|
+
return __privateGet(this, _result).validated === void 0;
|
|
236
|
+
}
|
|
237
|
+
async tryRequest() {
|
|
238
|
+
try {
|
|
239
|
+
__privateGet(this, _result).response = await (0, import_axios.default)(this.options);
|
|
240
|
+
this.tryValidate();
|
|
241
|
+
} catch (e) {
|
|
242
|
+
if (__privateGet(this, _result).error) {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
const { method, fullUrl, data, headers } = this.requestState;
|
|
246
|
+
const body = JSON.stringify(data, null, 2);
|
|
247
|
+
const headersString = JSON.stringify(headers, null, 2);
|
|
248
|
+
const message = `Failed to send request to ${method}:${fullUrl}.
|
|
249
|
+
headers:
|
|
250
|
+
${headersString}
|
|
251
|
+
|
|
252
|
+
body:
|
|
253
|
+
${body}`;
|
|
254
|
+
__privateGet(this, _result).error = new import_errors3.AutomationError(message, { cause: e });
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
async tryValidate() {
|
|
258
|
+
const { status, data } = __privateGet(this, _result).response;
|
|
259
|
+
const { method, fullUrl } = this.requestState;
|
|
260
|
+
try {
|
|
261
|
+
__privateGet(this, _result).validated = this.schemaMap.validate(
|
|
262
|
+
status,
|
|
263
|
+
data,
|
|
264
|
+
this.requireSchema
|
|
265
|
+
);
|
|
266
|
+
} catch (e) {
|
|
267
|
+
const error = e;
|
|
268
|
+
const message = `Failed to validate response from ${method}:${fullUrl}.
|
|
269
|
+
|
|
270
|
+
Provided body was:
|
|
271
|
+
${JSON.stringify(data, null, 2)}`;
|
|
272
|
+
__privateGet(this, _result).error = new import_errors3.AutomationError(message, { cause: error });
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
getValidatedResponse() {
|
|
276
|
+
const { status, statusText, headers } = __privateGet(this, _result).response;
|
|
277
|
+
const { validated: data } = __privateGet(this, _result);
|
|
278
|
+
const { fullUrl: url, method } = this.requestState;
|
|
279
|
+
return (0, import_class_transformer.plainToInstance)(HTTPResponse, {
|
|
280
|
+
status,
|
|
281
|
+
statusText,
|
|
282
|
+
headers,
|
|
283
|
+
data,
|
|
284
|
+
request: {
|
|
285
|
+
url,
|
|
286
|
+
method
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
getResponse() {
|
|
291
|
+
const { status, statusText, headers, data } = __privateGet(this, _result).response;
|
|
292
|
+
const { fullUrl: url, method } = this.requestState;
|
|
293
|
+
return (0, import_class_transformer.plainToInstance)(
|
|
294
|
+
HTTPResponse,
|
|
295
|
+
{
|
|
296
|
+
status,
|
|
297
|
+
statusText,
|
|
298
|
+
headers,
|
|
299
|
+
data,
|
|
300
|
+
request: {
|
|
301
|
+
url,
|
|
302
|
+
method
|
|
303
|
+
}
|
|
304
|
+
},
|
|
305
|
+
{ excludeExtraneousValues: true }
|
|
306
|
+
);
|
|
307
|
+
}
|
|
308
|
+
};
|
|
309
|
+
_result = new WeakMap();
|
|
310
|
+
|
|
311
|
+
// src/http.builder.ts
|
|
201
312
|
var _headers, _params, _url, _route, _method, _schemaMap, _responseType, _data, _requireSchema, _allowPlainText, _onBeforeSend, _onAfterSend;
|
|
202
313
|
var HTTPRequestBuilder = class {
|
|
203
314
|
constructor(map) {
|
|
@@ -295,43 +406,47 @@ var HTTPRequestBuilder = class {
|
|
|
295
406
|
async put() {
|
|
296
407
|
return this._request("PUT");
|
|
297
408
|
}
|
|
409
|
+
async patch() {
|
|
410
|
+
return this._request("PATCH");
|
|
411
|
+
}
|
|
298
412
|
async _request(method) {
|
|
299
413
|
__privateSet(this, _method, method);
|
|
414
|
+
const options = this.constructOptions(method);
|
|
415
|
+
this.tryRunBeforeHooks();
|
|
416
|
+
const executor = new AxiosExecutor(
|
|
417
|
+
options,
|
|
418
|
+
__privateGet(this, _schemaMap),
|
|
419
|
+
this.currentState,
|
|
420
|
+
__privateGet(this, _requireSchema)
|
|
421
|
+
);
|
|
422
|
+
await executor.tryRequest();
|
|
423
|
+
if (executor.requestSucceeded && !executor.validationFailed) {
|
|
424
|
+
const response = executor.getValidatedResponse();
|
|
425
|
+
this.tryRunAfterHooks(response);
|
|
426
|
+
return response;
|
|
427
|
+
}
|
|
428
|
+
if (executor.requestSucceeded) {
|
|
429
|
+
const response = executor.getResponse();
|
|
430
|
+
this.tryRunAfterHooks(response);
|
|
431
|
+
}
|
|
432
|
+
throw executor.error;
|
|
433
|
+
}
|
|
434
|
+
constructOptions(method) {
|
|
300
435
|
const url = this.currentUrl;
|
|
301
436
|
const headers = __privateGet(this, _headers) && Object.fromEntries(__privateGet(this, _headers));
|
|
302
437
|
const responseType = __privateGet(this, _responseType);
|
|
303
438
|
const data = __privateGet(this, _data);
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
return status >= 100 && status < 500;
|
|
316
|
-
},
|
|
317
|
-
transformResponse: transformResponse.bind(null, __privateGet(this, _allowPlainText))
|
|
318
|
-
});
|
|
319
|
-
const instance = this.makeResponse(response);
|
|
320
|
-
skipFailedAfterHooks = true;
|
|
321
|
-
this.tryRunAfterHooks(instance);
|
|
322
|
-
return instance;
|
|
323
|
-
} catch (e) {
|
|
324
|
-
if (response && !skipFailedAfterHooks) {
|
|
325
|
-
const instance = this.createWrapper(response);
|
|
326
|
-
this.tryRunAfterHooks(instance);
|
|
327
|
-
}
|
|
328
|
-
const error = e;
|
|
329
|
-
const message = `HTTP Client failed while while making request to ${url} with:
|
|
330
|
-
* headers: ${JSON.stringify(headers, null, 2)}
|
|
331
|
-
|
|
332
|
-
* data: ${data && JSON.stringify(data, null, 2)}`;
|
|
333
|
-
throw new import_errors2.AutomationError(message, { cause: error });
|
|
334
|
-
}
|
|
439
|
+
return {
|
|
440
|
+
method,
|
|
441
|
+
url,
|
|
442
|
+
headers,
|
|
443
|
+
data,
|
|
444
|
+
responseType,
|
|
445
|
+
validateStatus: function(status) {
|
|
446
|
+
return status >= 100 && status < 500;
|
|
447
|
+
},
|
|
448
|
+
transformResponse: transformResponse.bind(null, __privateGet(this, _allowPlainText))
|
|
449
|
+
};
|
|
335
450
|
}
|
|
336
451
|
tryRunBeforeHooks() {
|
|
337
452
|
let index = 0;
|
|
@@ -342,8 +457,8 @@ var HTTPRequestBuilder = class {
|
|
|
342
457
|
}
|
|
343
458
|
} catch (e) {
|
|
344
459
|
const error = e;
|
|
345
|
-
const message = `HTTP Client
|
|
346
|
-
throw new
|
|
460
|
+
const message = `HTTP Client 'onBeforeRequest' experienced an error at listener count ${index}`;
|
|
461
|
+
throw new import_errors4.AutomationError(message, { cause: error });
|
|
347
462
|
}
|
|
348
463
|
}
|
|
349
464
|
tryRunAfterHooks(response) {
|
|
@@ -355,36 +470,10 @@ var HTTPRequestBuilder = class {
|
|
|
355
470
|
}
|
|
356
471
|
} catch (e) {
|
|
357
472
|
const error = e;
|
|
358
|
-
const message = `HTTP Client
|
|
359
|
-
throw new
|
|
473
|
+
const message = `HTTP Client 'onRequestReceived' experienced an error at listener count ${index}`;
|
|
474
|
+
throw new import_errors4.AutomationError(message, { cause: error });
|
|
360
475
|
}
|
|
361
476
|
}
|
|
362
|
-
makeResponse(res) {
|
|
363
|
-
const { status, data } = res;
|
|
364
|
-
const parsed = this.validateSchemas(status, data);
|
|
365
|
-
return this.createWrapper(res, parsed);
|
|
366
|
-
}
|
|
367
|
-
createWrapper({ status, statusText, headers, data }, parsed) {
|
|
368
|
-
const params = Object.fromEntries(__privateGet(this, _params));
|
|
369
|
-
const url = (0, import_url_join_ts.urlJoinP)(__privateGet(this, _url), __privateGet(this, _route), params);
|
|
370
|
-
return (0, import_class_transformer.plainToClass)(HTTPResponse, {
|
|
371
|
-
status,
|
|
372
|
-
statusText,
|
|
373
|
-
headers,
|
|
374
|
-
data: parsed ?? data,
|
|
375
|
-
request: {
|
|
376
|
-
url,
|
|
377
|
-
validated: !!parsed
|
|
378
|
-
}
|
|
379
|
-
});
|
|
380
|
-
}
|
|
381
|
-
validateSchemas(status, data) {
|
|
382
|
-
return __privateGet(this, _schemaMap).validate(
|
|
383
|
-
status,
|
|
384
|
-
data,
|
|
385
|
-
__privateGet(this, _requireSchema)
|
|
386
|
-
);
|
|
387
|
-
}
|
|
388
477
|
};
|
|
389
478
|
_headers = new WeakMap();
|
|
390
479
|
_params = new WeakMap();
|
|
@@ -401,33 +490,8 @@ _onAfterSend = new WeakMap();
|
|
|
401
490
|
HTTPRequestBuilder = __decorateClass([
|
|
402
491
|
(0, import_app.Fixture)(import_app.LIFE_CYCLE.Transient)
|
|
403
492
|
], HTTPRequestBuilder);
|
|
404
|
-
function transformResponse(allowPlainText, data) {
|
|
405
|
-
if ((0, import_assert_is_json.default)(data)) {
|
|
406
|
-
return JSON.parse(data);
|
|
407
|
-
}
|
|
408
|
-
if (["true", "false"].includes(data)) {
|
|
409
|
-
return JSON.parse(data);
|
|
410
|
-
}
|
|
411
|
-
if (data === "" || data === void 0) {
|
|
412
|
-
return void 0;
|
|
413
|
-
}
|
|
414
|
-
if (allowPlainText) {
|
|
415
|
-
if (/^\d*\.?\d+$/.test(data) || ["true", "false"].includes(data)) {
|
|
416
|
-
return JSON.parse(data);
|
|
417
|
-
}
|
|
418
|
-
return data;
|
|
419
|
-
}
|
|
420
|
-
const response = (0, import_cli_highlight.highlight)(data, { language: "html" });
|
|
421
|
-
const message = [
|
|
422
|
-
`HTTP Client received a response which could not be parsed as JSON, and plain text responses were not configured for this request, Instead the body was:`,
|
|
423
|
-
" ",
|
|
424
|
-
response
|
|
425
|
-
];
|
|
426
|
-
throw new import_errors2.AutomationError(message.join("\n"));
|
|
427
|
-
}
|
|
428
493
|
|
|
429
494
|
// src/http.ts
|
|
430
|
-
var import_app2 = require("@autometa/app");
|
|
431
495
|
var _url2, _route2, _headers2, _requireSchema2, _schemaMap2, _onBeforeSend2, _onAfterSend2, _allowPlainText2;
|
|
432
496
|
var HTTP = class {
|
|
433
497
|
constructor() {
|
|
@@ -521,10 +585,6 @@ HTTP = __decorateClass([
|
|
|
521
585
|
0 && (module.exports = {
|
|
522
586
|
DerivedHTTPResponse,
|
|
523
587
|
HTTP,
|
|
524
|
-
|
|
525
|
-
HTTPResponse,
|
|
526
|
-
IsStatusCode,
|
|
527
|
-
SchemaMap,
|
|
528
|
-
assertIsStatusCode
|
|
588
|
+
HTTPResponse
|
|
529
589
|
});
|
|
530
590
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/http.builder.ts","../src/http.response.ts","../src/schema.map.ts","../src/http.ts"],"sourcesContent":["export * from \"./http.builder\";\nexport * from \"./http.response\";\nexport * from \"./types\";\nexport * from \"./schema.map\";\nexport * from \"./http\";\n","import { Fixture, LIFE_CYCLE } from \"@autometa/app\";\nimport { AutomationError } from \"@autometa/errors\";\nimport axios, { AxiosResponse, Method, ResponseType } from \"axios\";\nimport { plainToClass } from \"class-transformer\";\nimport { urlJoinP } from \"url-join-ts\";\nimport { HTTPResponse } from \"./http.response\";\nimport { SchemaMap } from \"./schema.map\";\nimport { SchemaParser, StatusCode } from \"./types\";\nimport isJson from \"@stdlib/assert-is-json\";\nimport { highlight } from \"cli-highlight\";\nexport type RequestState = {\n headers: Map<string, string>;\n params: Map<string, unknown>;\n url: string;\n route: string[];\n responseType: ResponseType | undefined;\n data: unknown;\n method: Method;\n get fullUrl(): string;\n};\n\nexport type RequestHook = (state: RequestState) => unknown;\nexport type ResponseHook<T> = (state: HTTPResponse<T>) => unknown;\n\n@Fixture(LIFE_CYCLE.Transient)\nexport class HTTPRequestBuilder {\n #headers = new Map<string, string>();\n #params = new Map<string, unknown>();\n #url: string;\n #route: string[] = [];\n #method: Method;\n #schemaMap = new SchemaMap();\n #responseType: ResponseType | undefined = \"json\";\n #data: unknown;\n #requireSchema = false;\n #allowPlainText = false;\n #onBeforeSend: RequestHook[] = [];\n #onAfterSend: ResponseHook<unknown>[] = [];\n constructor(map: SchemaMap) {\n this.#schemaMap = new SchemaMap().including(map);\n }\n requireSchema(value: boolean) {\n this.#requireSchema = value;\n return this;\n }\n get currentState(): RequestState {\n const fullUrl = this.currentUrl;\n return {\n headers: this.#headers,\n params: this.#params,\n url: this.#url,\n route: this.#route,\n responseType: this.#responseType,\n data: this.#data,\n method: this.#method,\n fullUrl\n };\n }\n\n get currentUrl() {\n const params = Object.fromEntries(this.#params);\n return urlJoinP(this.#url, this.#route, params);\n }\n\n url(url: string) {\n this.#url = url;\n return this;\n }\n allowPlainText(value: boolean) {\n this.#allowPlainText = value;\n return this;\n }\n schema(parser: SchemaParser, ...codes: number[]): HTTPRequestBuilder;\n schema(\n parser: SchemaParser,\n ...range: { from: number; to: number }[]\n ): HTTPRequestBuilder;\n\n schema(\n parser: SchemaParser,\n ...args: (number | { from: number; to: number })[]\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.#schemaMap.register(parser, ...(args as any));\n return this;\n }\n\n onBeforeSend(...hook: RequestHook[]) {\n this.#onBeforeSend.push(...hook);\n return this;\n }\n\n onReceivedResponse(...hook: ResponseHook<unknown>[]) {\n this.#onAfterSend.push(...hook);\n return this;\n }\n\n route(...route: (string | number | boolean)[]) {\n this.#route.push(...route.map((it) => `${it}`));\n return this;\n }\n\n header<T>(name: string, value: T) {\n const val = Array.isArray(value) ? value.join(\",\") : `${value}`;\n this.#headers.set(name, val);\n return this;\n }\n\n headers(dict: Record<string, string>) {\n Object.entries(dict).forEach(([name, value]) =>\n this.#headers.set(name, value)\n );\n return this;\n }\n\n param<T>(name: string, value: T) {\n this.#params.set(name, value);\n return this;\n }\n\n params(dict: Record<string, unknown>) {\n Object.entries(dict).forEach(([name, value]) => this.param(name, value));\n return this;\n }\n\n data<T>(data: T) {\n this.#data = data;\n return this;\n }\n\n async post<TReturn>(): Promise<HTTPResponse<TReturn>> {\n return this._request(\"POST\");\n }\n\n async get<TReturn>(): Promise<HTTPResponse<TReturn>> {\n return this._request(\"GET\");\n }\n\n async delete<TReturn>(): Promise<HTTPResponse<TReturn>> {\n return this._request(\"DELETE\");\n }\n\n async put<TReturn>(): Promise<HTTPResponse<TReturn>> {\n return this._request(\"PUT\");\n }\n\n private async _request<T>(method: Method) {\n this.#method = method;\n const url = this.currentUrl;\n const headers = this.#headers && Object.fromEntries(this.#headers);\n const responseType = this.#responseType;\n const data = this.#data;\n let response: AxiosResponse = undefined as unknown as AxiosResponse;\n let skipFailedAfterHooks = false;\n try {\n this.tryRunBeforeHooks();\n response = await axios({\n method,\n url,\n headers,\n data,\n responseType,\n validateStatus: function (status) {\n return status >= 100 && status < 500;\n },\n transformResponse: transformResponse.bind(null, this.#allowPlainText)\n });\n const instance = this.makeResponse<T>(response);\n\n skipFailedAfterHooks = true;\n this.tryRunAfterHooks<T>(instance);\n return instance;\n } catch (e) {\n if (response && !skipFailedAfterHooks) {\n const instance = this.createWrapper<T>(response);\n this.tryRunAfterHooks<T>(instance);\n }\n const error = e as Error;\n const message = `HTTP Client failed while while making request to ${url} with:\n* headers: ${JSON.stringify(headers, null, 2)}\n\n* data: ${data && JSON.stringify(data, null, 2)}`;\n throw new AutomationError(message, { cause: error });\n }\n }\n\n private tryRunBeforeHooks() {\n let index = 0;\n try {\n for (const hook of this.#onBeforeSend) {\n hook(this.currentState);\n index++;\n }\n } catch (e) {\n const error = e as Error;\n const message = `HTTP Client encountered an error while running 'onBeforeRequest' hooks at index ${index}`;\n throw new AutomationError(message, { cause: error });\n }\n }\n private tryRunAfterHooks<T>(response: HTTPResponse<T>) {\n let index = 0;\n try {\n for (const hook of this.#onAfterSend) {\n hook(response);\n index++;\n }\n } catch (e) {\n const error = e as Error;\n const message = `HTTP Client encountered an error while running 'onAfterRequest' hooks at index ${index}`;\n throw new AutomationError(message, { cause: error });\n }\n }\n makeResponse<T>(res: AxiosResponse) {\n const { status, data } = res;\n const parsed = this.validateSchemas<T>(status, data);\n return this.createWrapper<T>(res, parsed);\n }\n\n private createWrapper<T>(\n { status, statusText, headers, data }: AxiosResponse<T>,\n parsed?: T\n ) {\n const params = Object.fromEntries(this.#params);\n const url = urlJoinP(this.#url, this.#route, params);\n return plainToClass(HTTPResponse<T>, {\n status,\n statusText,\n headers,\n data: parsed ?? data,\n request: {\n url,\n validated: !!parsed\n }\n });\n }\n\n private validateSchemas<T>(status: number, data: T): T {\n return this.#schemaMap.validate<T>(\n status as StatusCode,\n data,\n this.#requireSchema\n );\n }\n}\n\nfunction transformResponse(allowPlainText: boolean, data: string) {\n if (isJson(data)) {\n return JSON.parse(data);\n }\n if ([\"true\", \"false\"].includes(data)) {\n return JSON.parse(data);\n }\n\n if (data === \"\" || data === undefined) {\n return undefined;\n }\n if (allowPlainText) {\n if (/^\\d*\\.?\\d+$/.test(data) || ['true', 'false'].includes(data)) {\n return JSON.parse(data);\n }\n return data;\n }\n const response = highlight(data, { language: \"html\" });\n const message = [\n `HTTP Client received a response which could not be parsed as JSON, and plain text responses were not configured for this request, Instead the body was:`,\n \" \",\n response\n ];\n throw new AutomationError(message.join(\"\\n\"));\n}\n","export class HTTPResponse<T> {\n status: number;\n statusText: string;\n data: T;\n headers: Record<string, string>;\n request: {\n url: string;\n validated: boolean;\n passedValidation: boolean\n };\n\n static fromRaw<T>(\n data: T,\n status: number,\n statusText: string,\n headers: Record<string, string>,\n url: string,\n validated: boolean,\n passedValidation: boolean\n ) {\n const response = new HTTPResponse<T>();\n response.data = data;\n response.status = status;\n response.statusText = statusText;\n response.headers = headers;\n response.request = {\n url,\n validated,\n passedValidation\n };\n return response;\n }\n static derive<TOriginal, TDerived>(\n original: HTTPResponse<TOriginal>,\n data: TDerived\n ): HTTPResponse<TDerived>;\n static derive<TOriginal, TDerived>(\n original: HTTPResponse<TOriginal>,\n data: (original: TOriginal) => TDerived\n ): HTTPResponse<TDerived>;\n static derive<TOriginal, TDerived>(\n original: HTTPResponse<TOriginal>,\n data: TDerived | ((original: TOriginal) => TDerived)\n ) {\n const response = new DerivedHTTPResponse<TDerived, TOriginal>();\n if (typeof data === \"function\") {\n const fn = data as (original: TOriginal) => TDerived;\n response.data = fn(original.data);\n } else {\n response.data = data;\n }\n response.status = original.status;\n response.statusText = original.statusText;\n response.headers = original.headers;\n response.request = original.request;\n response.actual = original as HTTPResponse<TOriginal>;\n return response;\n }\n}\n\nexport class DerivedHTTPResponse<T, K> extends HTTPResponse<T> {\n actual: HTTPResponse<K>;\n}\n","import { StatusCode, SchemaParser } from \"./types\";\nimport { AutomationError } from \"@autometa/errors\";\nimport { StatusCodes } from \"@autometa/status-codes\";\n\nexport class SchemaMap {\n #children: SchemaMap[] = [];\n #map: Map<StatusCode, SchemaParser> = new Map();\n register(\n parser: SchemaParser,\n ...codes: StatusCode[]\n ): (typeof parser)[\"parse\"];\n register(\n parser: SchemaParser,\n ...range: { from: StatusCode; to: StatusCode }[]\n ): (typeof parser)[\"parse\"];\n register(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ) {\n args.forEach((arg) => {\n if (typeof arg === \"number\") {\n this.registerSingle(parser, arg);\n } else {\n this.registerRange(parser, arg);\n }\n });\n return parser.parse;\n }\n\n registerSingle(parser: SchemaParser, ...codes: StatusCode[]) {\n codes.forEach((code) => {\n if (this.#map.has(code)) {\n throw new AutomationError(\n `Status code ${code} is already registered with a parser`\n );\n }\n assertIsStatusCode(code);\n this.#map.set(code, parser);\n });\n }\n\n including(map: SchemaMap) {\n this.#children.includes(map);\n return this;\n }\n registerRange(\n parser: SchemaParser,\n ...range: { from: StatusCode; to: StatusCode }[]\n ) {\n range.forEach(({ from, to }) => {\n assertIsStatusCode(from);\n assertIsStatusCode(to);\n for (let i = from; i <= to; i++) {\n if (!IsStatusCode(i)) {\n continue;\n }\n if (this.#map.has(i)) {\n throw new AutomationError(\n `Status code ${i} is already registered with a parser`\n );\n }\n this.#map.set(i, parser);\n }\n });\n }\n\n get(status: StatusCode): SchemaParser | undefined {\n assertIsStatusCode(status);\n const local = this.#map.get(status);\n if (local) {\n return local;\n }\n const nested = this.#children.find((it) => it.#map.has(status));\n return nested?.get(status);\n }\n\n validate<T>(status: StatusCode, response: T, strict: boolean): T {\n const parser = this.get(status);\n if (!parser) {\n if (!strict) {\n return response;\n }\n throw new AutomationError(\n `No schema parser registered for status code ${status} and 'requireSchema' is set to true`\n );\n }\n return parser.parse(response) as T;\n }\n}\n\nexport function assertIsStatusCode(value: number): asserts value is StatusCode {\n const result = Object.values(StatusCodes)\n .map((it) => it.status as number)\n .includes(value);\n if (!result) {\n throw new AutomationError(\n `Expected status code ${value} to be a valid status code, but it is not a known HTTP codeF`\n );\n }\n}\n\nexport function IsStatusCode(value: number): value is StatusCode {\n return Object.values(StatusCodes)\n .map((it) => it.status as number)\n .includes(value);\n}\n","import { Fixture, LIFE_CYCLE } from \"@autometa/app\";\nimport { HTTPRequestBuilder, RequestHook, ResponseHook } from \"./http.builder\";\nimport { SchemaMap } from \"./schema.map\";\nimport { SchemaParser, StatusCode } from \"./types\";\n@Fixture(LIFE_CYCLE.Transient)\nexport class HTTP {\n #url: string;\n #route: string[] = [];\n #headers = new Map<string, string>();\n #requireSchema = false;\n #schemaMap: SchemaMap = new SchemaMap();\n #onBeforeSend: RequestHook[] = [];\n #onAfterSend: ResponseHook<unknown>[] = [];\n #allowPlainText = false;\n\n allowPlainText(value: boolean) {\n this.#allowPlainText = value;\n return this;\n }\n requireSchema(value: boolean) {\n this.#requireSchema = value;\n return this;\n }\n\n url(url: string) {\n this.#url = url;\n return this;\n }\n\n sharedOnBeforeSend(hook: RequestHook) {\n this.#onBeforeSend.push(hook);\n return this;\n }\n\n sharedOnReceiveResponse(hook: ResponseHook<unknown>) {\n this.#onAfterSend.push(hook);\n return this;\n }\n\n onBeforeSend(hook: RequestHook) {\n return this.builder().onBeforeSend(hook);\n }\n\n onReceiveResponse(hook: ResponseHook<unknown>) {\n return this.builder().onReceivedResponse(hook);\n }\n\n sharedSchema(parser: SchemaParser, ...codes: StatusCode[]): HTTP;\n sharedSchema(\n parser: SchemaParser,\n ...range: { from: StatusCode; to: StatusCode }[]\n ): HTTP;\n sharedSchema(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.#schemaMap.register(parser, ...(args as any));\n return this;\n }\n\n schema(parser: SchemaParser, ...codes: StatusCode[]): HTTPRequestBuilder;\n schema(\n parser: SchemaParser,\n ...range: { from: StatusCode; to: StatusCode }[]\n ): HTTPRequestBuilder;\n schema(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this.builder().schema(parser, ...(args as any));\n }\n\n sharedRoute(...route: string[]) {\n this.#route.push(...route);\n return this;\n }\n\n param(name: string, value: string) {\n return this.builder().param(name, value);\n }\n\n params(dict: Record<string, string>) {\n return this.builder().params(dict);\n }\n\n data<T>(data: T) {\n return this.builder().data(data);\n }\n\n sharedHeader(name: string, value: string) {\n this.#headers.set(name, value);\n return this;\n }\n\n route(...route: (string | number | boolean)[]) {\n return this.builder().route(...route);\n }\n\n header<T>(name: string, value: T) {\n return this.builder().header(name, value);\n }\n\n headers(dict: Record<string, string>) {\n return this.builder().headers(dict);\n }\n\n get() {\n return this.builder().get();\n }\n\n private builder() {\n return new HTTPRequestBuilder(this.#schemaMap)\n .url(this.#url)\n .route(...this.#route)\n .allowPlainText(this.#allowPlainText)\n .headers(Object.fromEntries(this.#headers))\n .requireSchema(this.#requireSchema)\n .onBeforeSend(...this.#onBeforeSend)\n .onReceivedResponse(...this.#onAfterSend);\n }\n}\n"],"mappings":"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","names":["import_errors","axios","isJson","import_app","_url","_route","_headers","_requireSchema","_schemaMap","_onBeforeSend","_onAfterSend","_allowPlainText"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/http.response.ts","../src/http.ts","../src/http.builder.ts","../src/schema.map.ts","../src/transform-response.ts","../src/axios-executor.ts"],"sourcesContent":["// export * from \"./http.builder\";\nexport * from \"./http.response\";\nexport * from \"./types\";\n// export * from \"./schema.map\";\nexport * from \"./http\";\n// export * from './axios-executor'\n","import { Method } from \"axios\";\n\nexport class HTTPResponse<T> {\n status: number;\n statusText: string;\n data: T;\n headers: Record<string, string>;\n request: {\n url: string;\n method: Method;\n };\n static derive<TOriginal, TDerived>(\n original: HTTPResponse<TOriginal>,\n data: TDerived\n ): HTTPResponse<TDerived>;\n static derive<TOriginal, TDerived>(\n original: HTTPResponse<TOriginal>,\n data: (original: TOriginal) => TDerived\n ): HTTPResponse<TDerived>;\n static derive<TOriginal, TDerived>(\n original: HTTPResponse<TOriginal>,\n data: TDerived | ((original: TOriginal) => TDerived)\n ) {\n const response = new DerivedHTTPResponse<TDerived, TOriginal>();\n if (typeof data === \"function\") {\n const fn = data as (original: TOriginal) => TDerived;\n response.data = fn(original.data);\n } else {\n response.data = data;\n }\n response.status = original.status;\n response.statusText = original.statusText;\n response.headers = original.headers;\n response.request = original.request;\n response.actual = original as HTTPResponse<TOriginal>;\n return response;\n }\n}\n\nexport class DerivedHTTPResponse<T, K> extends HTTPResponse<T> {\n actual: HTTPResponse<K>;\n}\n","import { Fixture, LIFE_CYCLE } from \"@autometa/app\";\nimport { HTTPRequestBuilder } from \"./http.builder\";\nimport { SchemaMap } from \"./schema.map\";\nimport { RequestHook, ResponseHook, SchemaParser, StatusCode } from \"./types\";\n@Fixture(LIFE_CYCLE.Transient)\nexport class HTTP {\n #url: string;\n #route: string[] = [];\n #headers = new Map<string, string>();\n #requireSchema = false;\n #schemaMap: SchemaMap = new SchemaMap();\n #onBeforeSend: RequestHook[] = [];\n #onAfterSend: ResponseHook<unknown>[] = [];\n #allowPlainText = false;\n\n allowPlainText(value: boolean) {\n this.#allowPlainText = value;\n return this;\n }\n requireSchema(value: boolean) {\n this.#requireSchema = value;\n return this;\n }\n\n url(url: string) {\n this.#url = url;\n return this;\n }\n\n sharedOnBeforeSend(hook: RequestHook) {\n this.#onBeforeSend.push(hook);\n return this;\n }\n\n sharedOnReceiveResponse(hook: ResponseHook<unknown>) {\n this.#onAfterSend.push(hook);\n return this;\n }\n\n onBeforeSend(hook: RequestHook) {\n return this.builder().onBeforeSend(hook);\n }\n\n onReceiveResponse(hook: ResponseHook<unknown>) {\n return this.builder().onReceivedResponse(hook);\n }\n\n sharedSchema(parser: SchemaParser, ...codes: StatusCode[]): HTTP;\n sharedSchema(\n parser: SchemaParser,\n ...range: { from: StatusCode; to: StatusCode }[]\n ): HTTP;\n sharedSchema(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.#schemaMap.register(parser, ...(args as any));\n return this;\n }\n\n schema(parser: SchemaParser, ...codes: StatusCode[]): HTTPRequestBuilder;\n schema(\n parser: SchemaParser,\n ...range: { from: StatusCode; to: StatusCode }[]\n ): HTTPRequestBuilder;\n schema(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this.builder().schema(parser, ...(args as any));\n }\n\n sharedRoute(...route: string[]) {\n this.#route.push(...route);\n return this;\n }\n\n param(name: string, value: string) {\n return this.builder().param(name, value);\n }\n\n params(dict: Record<string, string>) {\n return this.builder().params(dict);\n }\n\n data<T>(data: T) {\n return this.builder().data(data);\n }\n\n sharedHeader(name: string, value: string) {\n this.#headers.set(name, value);\n return this;\n }\n\n route(...route: (string | number | boolean)[]) {\n return this.builder().route(...route);\n }\n\n header<T>(name: string, value: T) {\n return this.builder().header(name, value);\n }\n\n headers(dict: Record<string, string>) {\n return this.builder().headers(dict);\n }\n\n get() {\n return this.builder().get();\n }\n\n private builder() {\n return new HTTPRequestBuilder(this.#schemaMap)\n .url(this.#url)\n .route(...this.#route)\n .allowPlainText(this.#allowPlainText)\n .headers(Object.fromEntries(this.#headers))\n .requireSchema(this.#requireSchema)\n .onBeforeSend(...this.#onBeforeSend)\n .onReceivedResponse(...this.#onAfterSend);\n }\n}\n","import { Fixture, LIFE_CYCLE } from \"@autometa/app\";\nimport { AutomationError } from \"@autometa/errors\";\nimport { AxiosRequestConfig, Method, ResponseType } from \"axios\";\nimport { urlJoinP } from \"url-join-ts\";\nimport { HTTPResponse } from \"./http.response\";\nimport { SchemaMap } from \"./schema.map\";\nimport {\n RequestHook,\n RequestState,\n ResponseHook,\n SchemaParser,\n StatusCode\n} from \"./types\";\nimport { transformResponse } from \"./transform-response\";\nimport { AxiosExecutor } from \"./axios-executor\";\n\n@Fixture(LIFE_CYCLE.Transient)\nexport class HTTPRequestBuilder {\n #headers = new Map<string, string>();\n #params = new Map<string, unknown>();\n #url: string;\n #route: string[] = [];\n #method: Method;\n #schemaMap = new SchemaMap();\n #responseType: ResponseType | undefined = \"json\";\n #data: unknown;\n #requireSchema = false;\n #allowPlainText = false;\n #onBeforeSend: RequestHook[] = [];\n #onAfterSend: ResponseHook<unknown>[] = [];\n constructor(map: SchemaMap) {\n this.#schemaMap = new SchemaMap().including(map);\n }\n requireSchema(value: boolean) {\n this.#requireSchema = value;\n return this;\n }\n get currentState(): RequestState {\n const fullUrl = this.currentUrl;\n return {\n headers: this.#headers,\n params: this.#params,\n url: this.#url,\n route: this.#route,\n responseType: this.#responseType,\n data: this.#data,\n method: this.#method,\n fullUrl\n };\n }\n\n get currentUrl() {\n const params = Object.fromEntries(this.#params);\n return urlJoinP(this.#url, this.#route, params);\n }\n\n url(url: string) {\n this.#url = url;\n return this;\n }\n\n allowPlainText(value: boolean) {\n this.#allowPlainText = value;\n return this;\n }\n\n schema(parser: SchemaParser, ...codes: StatusCode[]): HTTPRequestBuilder;\n schema(\n parser: SchemaParser,\n ...range: { from: StatusCode; to: StatusCode }[]\n ): HTTPRequestBuilder;\n\n schema(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ) {\n this.#schemaMap.register(parser, ...args);\n return this;\n }\n\n onBeforeSend(...hook: RequestHook[]) {\n this.#onBeforeSend.push(...hook);\n return this;\n }\n\n onReceivedResponse(...hook: ResponseHook<unknown>[]) {\n this.#onAfterSend.push(...hook);\n return this;\n }\n\n route(...route: (string | number | boolean)[]) {\n this.#route.push(...route.map((it) => `${it}`));\n return this;\n }\n\n header<T>(name: string, value: T) {\n const val = Array.isArray(value) ? value.join(\",\") : `${value}`;\n this.#headers.set(name, val);\n return this;\n }\n\n headers(dict: Record<string, string>) {\n Object.entries(dict).forEach(([name, value]) =>\n this.#headers.set(name, value)\n );\n return this;\n }\n\n param<T>(name: string, value: T) {\n this.#params.set(name, value);\n return this;\n }\n\n params(dict: Record<string, unknown>) {\n Object.entries(dict).forEach(([name, value]) => this.param(name, value));\n return this;\n }\n\n data<T>(data: T) {\n this.#data = data;\n return this;\n }\n\n async post<TReturn>(): Promise<HTTPResponse<TReturn>> {\n return this._request(\"POST\");\n }\n\n async get<TReturn>(): Promise<HTTPResponse<TReturn>> {\n return this._request(\"GET\");\n }\n\n async delete<TReturn>(): Promise<HTTPResponse<TReturn>> {\n return this._request(\"DELETE\");\n }\n\n async put<TReturn>(): Promise<HTTPResponse<TReturn>> {\n return this._request(\"PUT\");\n }\n\n async patch<TReturn>(): Promise<HTTPResponse<TReturn>> {\n return this._request(\"PATCH\");\n }\n private async _request<T>(method: Method) {\n this.#method = method;\n\n const options: AxiosRequestConfig = this.constructOptions<T>(method);\n this.tryRunBeforeHooks();\n const executor = new AxiosExecutor(\n options,\n this.#schemaMap,\n this.currentState,\n this.#requireSchema\n );\n await executor.tryRequest<T>();\n if (executor.requestSucceeded && !executor.validationFailed) {\n const response = executor.getValidatedResponse<T>();\n this.tryRunAfterHooks<T>(response);\n return response;\n }\n if (executor.requestSucceeded) {\n const response = executor.getResponse<T>();\n // this.tryOnValidationFailed(response);\n this.tryRunAfterHooks<T>(response);\n }\n throw executor.error;\n }\n\n private constructOptions<T>(method: string): AxiosRequestConfig<T> {\n const url = this.currentUrl;\n const headers = this.#headers && Object.fromEntries(this.#headers);\n const responseType = this.#responseType;\n const data = this.#data as T;\n return {\n method,\n url,\n headers,\n data,\n responseType,\n validateStatus: function (status) {\n return status >= 100 && status < 500;\n },\n transformResponse: transformResponse.bind(null, this.#allowPlainText)\n };\n }\n\n private tryRunBeforeHooks() {\n let index = 0;\n try {\n for (const hook of this.#onBeforeSend) {\n hook(this.currentState);\n index++;\n }\n } catch (e) {\n const error = e as Error;\n const message = `HTTP Client 'onBeforeRequest' experienced an error at listener count ${index}`;\n throw new AutomationError(message, { cause: error });\n }\n }\n private tryRunAfterHooks<T>(response: HTTPResponse<T>) {\n let index = 0;\n try {\n for (const hook of this.#onAfterSend) {\n hook(response);\n index++;\n }\n } catch (e) {\n const error = e as Error;\n const message = `HTTP Client 'onRequestReceived' experienced an error at listener count ${index}`;\n throw new AutomationError(message, { cause: error });\n }\n }\n}\n","import { StatusCode, SchemaParser } from \"./types\";\nimport { AutomationError } from \"@autometa/errors\";\nimport { StatusCodes } from \"@autometa/status-codes\";\n\nexport class SchemaMap {\n #children: SchemaMap[] = [];\n #map: Map<StatusCode, SchemaParser> = new Map();\n register(\n parser: SchemaParser,\n ...codes: StatusCode[]\n ): (typeof parser)[\"parse\"];\n register(\n parser: SchemaParser,\n ...range: { from: StatusCode; to: StatusCode }[]\n ): (typeof parser)[\"parse\"];\n register(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ): (typeof parser)[\"parse\"];\n register(\n parser: SchemaParser,\n ...args: (StatusCode | { from: StatusCode; to: StatusCode })[]\n ) {\n args.forEach((arg) => {\n if (typeof arg === \"number\") {\n this.registerSingle(parser, arg);\n } else {\n this.registerRange(parser, arg);\n }\n });\n return parser.parse;\n }\n\n registerSingle(parser: SchemaParser, ...codes: StatusCode[]) {\n codes.forEach((code) => {\n if (this.#map.has(code)) {\n throw new AutomationError(\n `Status code ${code} is already registered with a parser`\n );\n }\n assertIsStatusCode(code);\n this.#map.set(code, parser);\n });\n }\n\n including(map: SchemaMap) {\n this.#children.includes(map);\n return this;\n }\n registerRange(\n parser: SchemaParser,\n ...range: { from: StatusCode; to: StatusCode }[]\n ) {\n range.forEach(({ from, to }) => {\n assertIsStatusCode(from);\n assertIsStatusCode(to);\n for (let i = from; i <= to; i++) {\n if (!IsStatusCode(i)) {\n continue;\n }\n if (this.#map.has(i)) {\n throw new AutomationError(\n `Status code ${i} is already registered with a parser`\n );\n }\n this.#map.set(i, parser);\n }\n });\n }\n\n get(status: StatusCode): SchemaParser | undefined {\n assertIsStatusCode(status);\n const local = this.#map.get(status);\n if (local) {\n return local;\n }\n const nested = this.#children.find((it) => it.#map.has(status));\n return nested?.get(status);\n }\n\n validate<T>(status: StatusCode, response: T, strict: boolean): T {\n const parser = this.get(status);\n if (!parser) {\n if (!strict) {\n return response;\n }\n throw new AutomationError(\n `No schema parser registered for status code ${status} and 'requireSchema' is set to true`\n );\n }\n return parser.parse(response) as T;\n }\n}\n\nexport function assertIsStatusCode(value: number): asserts value is StatusCode {\n const result = Object.values(StatusCodes)\n .map((it) => it.status as number)\n .includes(value);\n if (!result) {\n throw new AutomationError(\n `Expected status code ${value} to be a valid status code, but it is not a known HTTP codeF`\n );\n }\n}\n\nexport function IsStatusCode(value: number): value is StatusCode {\n return Object.values(StatusCodes)\n .map((it) => it.status as number)\n .includes(value);\n}\n","import { AutomationError } from \"@autometa/errors\";\nimport isJson from \"@stdlib/assert-is-json\";\nimport { highlight } from \"cli-highlight\";\n\nexport function transformResponse(\n allowPlainText: boolean,\n data: string | undefined | null\n) {\n if (data === null) {\n return null;\n }\n if (data === undefined) {\n return undefined;\n }\n if (isJson(data)) {\n return JSON.parse(data);\n }\n if ([\"true\", \"false\"].includes(data)) {\n return JSON.parse(data);\n }\n if (/^\\d*\\.?\\d+$/.test(data)) {\n return JSON.parse(data);\n }\n\n if (allowPlainText) {\n return data;\n }\n const response = highlight(data, { language: \"html\" });\n const message = [\n `Could not parse a response as json, and this request was not configured to allow plain text responses.`,\n `To allow plain text responses, use the 'allowPlainText' method on the HTTP client.`,\n \" \",\n response\n ];\n throw new AutomationError(message.join(\"\\n\"));\n}\n","import axios, { AxiosRequestConfig, AxiosResponse } from \"axios\";\nimport { SchemaMap } from \"./schema.map\";\nimport type { RequestState, StatusCode } from \"./types\";\nimport { plainToInstance } from \"class-transformer\";\nimport { HTTPResponse } from \"./http.response\";\nimport { AutomationError } from \"@autometa/errors\";\ntype ExecutorState = {\n response: AxiosResponse<unknown>;\n validated: unknown;\n error: Error | undefined;\n};\nexport class AxiosExecutor {\n #result: ExecutorState = {} as ExecutorState;\n constructor(\n private options: AxiosRequestConfig,\n private schemaMap: SchemaMap,\n private requestState: RequestState,\n private requireSchema: boolean\n ) {}\n\n get error() {\n return this.#result.error;\n }\n get requestSucceeded() {\n return this.#result.response !== undefined;\n }\n\n get validationFailed() {\n return this.#result.validated === undefined;\n }\n\n async tryRequest<T>() {\n try {\n this.#result.response = await axios<T>(this.options);\n this.tryValidate();\n } catch (e) {\n if (this.#result.error) {\n return;\n }\n const { method, fullUrl, data, headers } = this.requestState;\n const body = JSON.stringify(data, null, 2);\n const headersString = JSON.stringify(headers, null, 2);\n const message = `Failed to send request to ${method}:${fullUrl}.\nheaders:\n${headersString}\n \nbody: \n${body}`;\n this.#result.error = new AutomationError(message, { cause: e as Error });\n }\n }\n\n async tryValidate() {\n const { status, data } = this.#result.response;\n const { method, fullUrl } = this.requestState;\n try {\n this.#result.validated = this.schemaMap.validate(\n status as StatusCode,\n data,\n this.requireSchema\n );\n } catch (e) {\n const error = e as Error;\n const message = `Failed to validate response from ${method}:${fullUrl}.\n \nProvided body was:\n${JSON.stringify(data, null, 2)}`;\n this.#result.error = new AutomationError(message, { cause: error });\n }\n }\n\n getValidatedResponse<T>() {\n const { status, statusText, headers } = this.#result.response;\n const { validated: data } = this.#result;\n const { fullUrl: url, method } = this.requestState;\n return plainToInstance(HTTPResponse, {\n status,\n statusText,\n headers,\n data,\n request: {\n url,\n method\n }\n }) as HTTPResponse<T>;\n }\n\n getResponse<T>() {\n const { status, statusText, headers, data } = this.#result.response;\n const { fullUrl: url, method } = this.requestState;\n return plainToInstance(\n HTTPResponse,\n {\n status,\n statusText,\n headers,\n data,\n request: {\n url,\n method\n }\n },\n { excludeExtraneousValues: true }\n ) as HTTPResponse<T>;\n }\n}\n"],"mappings":"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","names":["import_app","import_errors","import_errors","isJson","import_errors","axios","_url","_route","_headers","_requireSchema","_schemaMap","_onBeforeSend","_onAfterSend","_allowPlainText"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@autometa/http",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "An Axios Based HTTP Client for Autometa",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
"class-transformer": "^0.5.1",
|
|
37
37
|
"cli-highlight": "^2.1.11",
|
|
38
38
|
"reflect-metadata": "^0.1.13",
|
|
39
|
+
"ts-retry": "^4.2.3",
|
|
39
40
|
"url-join-ts": "^1.0.5"
|
|
40
41
|
},
|
|
41
42
|
"scripts": {
|