@autometa/http 1.0.4 → 1.0.6
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 +195 -128
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.cts +24 -28
- package/dist/index.d.ts +24 -28
- package/dist/index.js +196 -135
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
package/dist/esm/index.js
CHANGED
|
@@ -28,47 +28,14 @@ var __privateSet = (obj, member, value, setter) => {
|
|
|
28
28
|
return value;
|
|
29
29
|
};
|
|
30
30
|
|
|
31
|
+
// src/http.ts
|
|
32
|
+
import { Fixture as Fixture2, LIFE_CYCLE as LIFE_CYCLE2 } from "@autometa/app";
|
|
33
|
+
|
|
31
34
|
// src/http.builder.ts
|
|
32
35
|
import { Fixture, LIFE_CYCLE } from "@autometa/app";
|
|
33
|
-
import { AutomationError as
|
|
34
|
-
import axios from "axios";
|
|
35
|
-
import { plainToClass } from "class-transformer";
|
|
36
|
+
import { AutomationError as AutomationError4 } from "@autometa/errors";
|
|
36
37
|
import { urlJoinP } from "url-join-ts";
|
|
37
38
|
|
|
38
|
-
// src/http.response.ts
|
|
39
|
-
var HTTPResponse = class _HTTPResponse {
|
|
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
|
-
}
|
|
53
|
-
static derive(original, data) {
|
|
54
|
-
const response = new DerivedHTTPResponse();
|
|
55
|
-
if (typeof data === "function") {
|
|
56
|
-
const fn = data;
|
|
57
|
-
response.data = fn(original.data);
|
|
58
|
-
} else {
|
|
59
|
-
response.data = data;
|
|
60
|
-
}
|
|
61
|
-
response.status = original.status;
|
|
62
|
-
response.statusText = original.statusText;
|
|
63
|
-
response.headers = original.headers;
|
|
64
|
-
response.request = original.request;
|
|
65
|
-
response.actual = original;
|
|
66
|
-
return response;
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
var DerivedHTTPResponse = class extends HTTPResponse {
|
|
70
|
-
};
|
|
71
|
-
|
|
72
39
|
// src/schema.map.ts
|
|
73
40
|
import { AutomationError } from "@autometa/errors";
|
|
74
41
|
import { StatusCodes } from "@autometa/status-codes";
|
|
@@ -156,9 +123,159 @@ function IsStatusCode(value) {
|
|
|
156
123
|
return Object.values(StatusCodes).map((it) => it.status).includes(value);
|
|
157
124
|
}
|
|
158
125
|
|
|
159
|
-
// src/
|
|
126
|
+
// src/transform-response.ts
|
|
127
|
+
import { AutomationError as AutomationError2 } from "@autometa/errors";
|
|
160
128
|
import isJson from "@stdlib/assert-is-json";
|
|
161
129
|
import { highlight } from "cli-highlight";
|
|
130
|
+
function transformResponse(allowPlainText, data) {
|
|
131
|
+
if (data === null) {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
if (data === void 0) {
|
|
135
|
+
return void 0;
|
|
136
|
+
}
|
|
137
|
+
if (isJson(data)) {
|
|
138
|
+
return JSON.parse(data);
|
|
139
|
+
}
|
|
140
|
+
if (["true", "false"].includes(data)) {
|
|
141
|
+
return JSON.parse(data);
|
|
142
|
+
}
|
|
143
|
+
if (/^\d*\.?\d+$/.test(data)) {
|
|
144
|
+
return JSON.parse(data);
|
|
145
|
+
}
|
|
146
|
+
if (allowPlainText) {
|
|
147
|
+
return data;
|
|
148
|
+
}
|
|
149
|
+
const response = highlight(data, { language: "html" });
|
|
150
|
+
const message = [
|
|
151
|
+
`Could not parse a response as json, and this request was not configured to allow plain text responses.`,
|
|
152
|
+
`To allow plain text responses, use the 'allowPlainText' method on the HTTP client.`,
|
|
153
|
+
" ",
|
|
154
|
+
response
|
|
155
|
+
];
|
|
156
|
+
throw new AutomationError2(message.join("\n"));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// src/axios-executor.ts
|
|
160
|
+
import axios from "axios";
|
|
161
|
+
import { plainToInstance } from "class-transformer";
|
|
162
|
+
|
|
163
|
+
// src/http.response.ts
|
|
164
|
+
var HTTPResponse = class {
|
|
165
|
+
static derive(original, data) {
|
|
166
|
+
const response = new DerivedHTTPResponse();
|
|
167
|
+
if (typeof data === "function") {
|
|
168
|
+
const fn = data;
|
|
169
|
+
response.data = fn(original.data);
|
|
170
|
+
} else {
|
|
171
|
+
response.data = data;
|
|
172
|
+
}
|
|
173
|
+
response.status = original.status;
|
|
174
|
+
response.statusText = original.statusText;
|
|
175
|
+
response.headers = original.headers;
|
|
176
|
+
response.request = original.request;
|
|
177
|
+
response.actual = original;
|
|
178
|
+
return response;
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
var DerivedHTTPResponse = class extends HTTPResponse {
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
// src/axios-executor.ts
|
|
185
|
+
import { AutomationError as AutomationError3 } from "@autometa/errors";
|
|
186
|
+
var _result;
|
|
187
|
+
var AxiosExecutor = class {
|
|
188
|
+
constructor(options, schemaMap, requestState, requireSchema) {
|
|
189
|
+
this.options = options;
|
|
190
|
+
this.schemaMap = schemaMap;
|
|
191
|
+
this.requestState = requestState;
|
|
192
|
+
this.requireSchema = requireSchema;
|
|
193
|
+
__privateAdd(this, _result, {});
|
|
194
|
+
}
|
|
195
|
+
get error() {
|
|
196
|
+
return __privateGet(this, _result).error;
|
|
197
|
+
}
|
|
198
|
+
get requestSucceeded() {
|
|
199
|
+
return __privateGet(this, _result).response !== void 0;
|
|
200
|
+
}
|
|
201
|
+
get validationFailed() {
|
|
202
|
+
return __privateGet(this, _result).validated === void 0;
|
|
203
|
+
}
|
|
204
|
+
async tryRequest() {
|
|
205
|
+
try {
|
|
206
|
+
__privateGet(this, _result).response = await axios(this.options);
|
|
207
|
+
this.tryValidate();
|
|
208
|
+
} catch (e) {
|
|
209
|
+
if (__privateGet(this, _result).error) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const { method, fullUrl, data, headers } = this.requestState;
|
|
213
|
+
const body = JSON.stringify(data, null, 2);
|
|
214
|
+
const headersString = JSON.stringify(headers, null, 2);
|
|
215
|
+
const message = `Failed to send request to ${method}:${fullUrl}.
|
|
216
|
+
headers:
|
|
217
|
+
${headersString}
|
|
218
|
+
|
|
219
|
+
body:
|
|
220
|
+
${body}`;
|
|
221
|
+
__privateGet(this, _result).error = new AutomationError3(message, { cause: e });
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
async tryValidate() {
|
|
225
|
+
const { status, data } = __privateGet(this, _result).response;
|
|
226
|
+
const { method, fullUrl } = this.requestState;
|
|
227
|
+
try {
|
|
228
|
+
__privateGet(this, _result).validated = this.schemaMap.validate(
|
|
229
|
+
status,
|
|
230
|
+
data,
|
|
231
|
+
this.requireSchema
|
|
232
|
+
);
|
|
233
|
+
} catch (e) {
|
|
234
|
+
const error = e;
|
|
235
|
+
const message = `Failed to validate response from ${method}:${fullUrl}.
|
|
236
|
+
|
|
237
|
+
Provided body was:
|
|
238
|
+
${JSON.stringify(data, null, 2)}`;
|
|
239
|
+
__privateGet(this, _result).error = new AutomationError3(message, { cause: error });
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
getValidatedResponse() {
|
|
243
|
+
const { status, statusText, headers } = __privateGet(this, _result).response;
|
|
244
|
+
const { validated: data } = __privateGet(this, _result);
|
|
245
|
+
const { fullUrl: url, method } = this.requestState;
|
|
246
|
+
return plainToInstance(HTTPResponse, {
|
|
247
|
+
status,
|
|
248
|
+
statusText,
|
|
249
|
+
headers,
|
|
250
|
+
data,
|
|
251
|
+
request: {
|
|
252
|
+
url,
|
|
253
|
+
method
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
getResponse() {
|
|
258
|
+
const { status, statusText, headers, data } = __privateGet(this, _result).response;
|
|
259
|
+
const { fullUrl: url, method } = this.requestState;
|
|
260
|
+
return plainToInstance(
|
|
261
|
+
HTTPResponse,
|
|
262
|
+
{
|
|
263
|
+
status,
|
|
264
|
+
statusText,
|
|
265
|
+
headers,
|
|
266
|
+
data,
|
|
267
|
+
request: {
|
|
268
|
+
url,
|
|
269
|
+
method
|
|
270
|
+
}
|
|
271
|
+
},
|
|
272
|
+
{ excludeExtraneousValues: true }
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
_result = new WeakMap();
|
|
277
|
+
|
|
278
|
+
// src/http.builder.ts
|
|
162
279
|
var _headers, _params, _url, _route, _method, _schemaMap, _responseType, _data, _requireSchema, _allowPlainText, _onBeforeSend, _onAfterSend;
|
|
163
280
|
var HTTPRequestBuilder = class {
|
|
164
281
|
constructor(map) {
|
|
@@ -256,43 +373,47 @@ var HTTPRequestBuilder = class {
|
|
|
256
373
|
async put() {
|
|
257
374
|
return this._request("PUT");
|
|
258
375
|
}
|
|
376
|
+
async patch() {
|
|
377
|
+
return this._request("PATCH");
|
|
378
|
+
}
|
|
259
379
|
async _request(method) {
|
|
260
380
|
__privateSet(this, _method, method);
|
|
381
|
+
const options = this.constructOptions(method);
|
|
382
|
+
this.tryRunBeforeHooks();
|
|
383
|
+
const executor = new AxiosExecutor(
|
|
384
|
+
options,
|
|
385
|
+
__privateGet(this, _schemaMap),
|
|
386
|
+
this.currentState,
|
|
387
|
+
__privateGet(this, _requireSchema)
|
|
388
|
+
);
|
|
389
|
+
await executor.tryRequest();
|
|
390
|
+
if (executor.requestSucceeded && !executor.validationFailed) {
|
|
391
|
+
const response = executor.getValidatedResponse();
|
|
392
|
+
this.tryRunAfterHooks(response);
|
|
393
|
+
return response;
|
|
394
|
+
}
|
|
395
|
+
if (executor.requestSucceeded) {
|
|
396
|
+
const response = executor.getResponse();
|
|
397
|
+
this.tryRunAfterHooks(response);
|
|
398
|
+
}
|
|
399
|
+
throw executor.error;
|
|
400
|
+
}
|
|
401
|
+
constructOptions(method) {
|
|
261
402
|
const url = this.currentUrl;
|
|
262
403
|
const headers = __privateGet(this, _headers) && Object.fromEntries(__privateGet(this, _headers));
|
|
263
404
|
const responseType = __privateGet(this, _responseType);
|
|
264
405
|
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
|
-
}
|
|
406
|
+
return {
|
|
407
|
+
method,
|
|
408
|
+
url,
|
|
409
|
+
headers,
|
|
410
|
+
data,
|
|
411
|
+
responseType,
|
|
412
|
+
validateStatus: function(status) {
|
|
413
|
+
return status >= 100 && status < 500;
|
|
414
|
+
},
|
|
415
|
+
transformResponse: transformResponse.bind(null, __privateGet(this, _allowPlainText))
|
|
416
|
+
};
|
|
296
417
|
}
|
|
297
418
|
tryRunBeforeHooks() {
|
|
298
419
|
let index = 0;
|
|
@@ -303,8 +424,8 @@ var HTTPRequestBuilder = class {
|
|
|
303
424
|
}
|
|
304
425
|
} catch (e) {
|
|
305
426
|
const error = e;
|
|
306
|
-
const message = `HTTP Client
|
|
307
|
-
throw new
|
|
427
|
+
const message = `HTTP Client 'onBeforeRequest' experienced an error at listener count ${index}`;
|
|
428
|
+
throw new AutomationError4(message, { cause: error });
|
|
308
429
|
}
|
|
309
430
|
}
|
|
310
431
|
tryRunAfterHooks(response) {
|
|
@@ -316,36 +437,10 @@ var HTTPRequestBuilder = class {
|
|
|
316
437
|
}
|
|
317
438
|
} catch (e) {
|
|
318
439
|
const error = e;
|
|
319
|
-
const message = `HTTP Client
|
|
320
|
-
throw new
|
|
440
|
+
const message = `HTTP Client 'onRequestReceived' experienced an error at listener count ${index}`;
|
|
441
|
+
throw new AutomationError4(message, { cause: error });
|
|
321
442
|
}
|
|
322
443
|
}
|
|
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
444
|
};
|
|
350
445
|
_headers = new WeakMap();
|
|
351
446
|
_params = new WeakMap();
|
|
@@ -362,30 +457,8 @@ _onAfterSend = new WeakMap();
|
|
|
362
457
|
HTTPRequestBuilder = __decorateClass([
|
|
363
458
|
Fixture(LIFE_CYCLE.Transient)
|
|
364
459
|
], 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
|
-
return JSON.parse(data);
|
|
377
|
-
}
|
|
378
|
-
const response = highlight(data, { language: "html" });
|
|
379
|
-
const message = [
|
|
380
|
-
`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:`,
|
|
381
|
-
" ",
|
|
382
|
-
response
|
|
383
|
-
];
|
|
384
|
-
throw new AutomationError2(message.join("\n"));
|
|
385
|
-
}
|
|
386
460
|
|
|
387
461
|
// src/http.ts
|
|
388
|
-
import { Fixture as Fixture2, LIFE_CYCLE as LIFE_CYCLE2 } from "@autometa/app";
|
|
389
462
|
var _url2, _route2, _headers2, _requireSchema2, _schemaMap2, _onBeforeSend2, _onAfterSend2, _allowPlainText2;
|
|
390
463
|
var HTTP = class {
|
|
391
464
|
constructor() {
|
|
@@ -476,12 +549,6 @@ HTTP = __decorateClass([
|
|
|
476
549
|
Fixture2(LIFE_CYCLE2.Transient)
|
|
477
550
|
], HTTP);
|
|
478
551
|
export {
|
|
479
|
-
|
|
480
|
-
HTTP,
|
|
481
|
-
HTTPRequestBuilder,
|
|
482
|
-
HTTPResponse,
|
|
483
|
-
IsStatusCode,
|
|
484
|
-
SchemaMap,
|
|
485
|
-
assertIsStatusCode
|
|
552
|
+
HTTP
|
|
486
553
|
};
|
|
487
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 return JSON.parse(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.ts","../../src/http.builder.ts","../../src/schema.map.ts","../../src/transform-response.ts","../../src/axios-executor.ts","../../src/http.response.ts"],"sourcesContent":["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","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"],"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,16 +8,11 @@ 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
|
}
|
|
18
|
-
declare class DerivedHTTPResponse<T, K> extends HTTPResponse<T> {
|
|
19
|
-
actual: HTTPResponse<K>;
|
|
20
|
-
}
|
|
21
16
|
|
|
22
17
|
type SchemaParser = {
|
|
23
18
|
parse: (data: unknown) => unknown;
|
|
@@ -27,6 +22,18 @@ type StatusCode<T extends typeof StatusCodes = typeof StatusCodes> = {
|
|
|
27
22
|
status: infer U;
|
|
28
23
|
} ? U : never;
|
|
29
24
|
}[keyof T];
|
|
25
|
+
type RequestState = {
|
|
26
|
+
headers: Map<string, string>;
|
|
27
|
+
params: Map<string, unknown>;
|
|
28
|
+
url: string;
|
|
29
|
+
route: string[];
|
|
30
|
+
responseType: ResponseType | undefined;
|
|
31
|
+
data: unknown;
|
|
32
|
+
method: Method;
|
|
33
|
+
get fullUrl(): string;
|
|
34
|
+
};
|
|
35
|
+
type RequestHook = (state: RequestState) => unknown;
|
|
36
|
+
type ResponseHook<T> = (state: HTTPResponse<T>) => unknown;
|
|
30
37
|
|
|
31
38
|
declare class SchemaMap {
|
|
32
39
|
#private;
|
|
@@ -35,6 +42,10 @@ declare class SchemaMap {
|
|
|
35
42
|
from: StatusCode;
|
|
36
43
|
to: StatusCode;
|
|
37
44
|
}[]): (typeof parser)["parse"];
|
|
45
|
+
register(parser: SchemaParser, ...args: (StatusCode | {
|
|
46
|
+
from: StatusCode;
|
|
47
|
+
to: StatusCode;
|
|
48
|
+
})[]): (typeof parser)["parse"];
|
|
38
49
|
registerSingle(parser: SchemaParser, ...codes: StatusCode[]): void;
|
|
39
50
|
including(map: SchemaMap): this;
|
|
40
51
|
registerRange(parser: SchemaParser, ...range: {
|
|
@@ -44,21 +55,7 @@ declare class SchemaMap {
|
|
|
44
55
|
get(status: StatusCode): SchemaParser | undefined;
|
|
45
56
|
validate<T>(status: StatusCode, response: T, strict: boolean): T;
|
|
46
57
|
}
|
|
47
|
-
declare function assertIsStatusCode(value: number): asserts value is StatusCode;
|
|
48
|
-
declare function IsStatusCode(value: number): value is StatusCode;
|
|
49
58
|
|
|
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
59
|
declare class HTTPRequestBuilder {
|
|
63
60
|
#private;
|
|
64
61
|
constructor(map: SchemaMap);
|
|
@@ -67,10 +64,10 @@ declare class HTTPRequestBuilder {
|
|
|
67
64
|
get currentUrl(): string;
|
|
68
65
|
url(url: string): this;
|
|
69
66
|
allowPlainText(value: boolean): this;
|
|
70
|
-
schema(parser: SchemaParser, ...codes:
|
|
67
|
+
schema(parser: SchemaParser, ...codes: StatusCode[]): HTTPRequestBuilder;
|
|
71
68
|
schema(parser: SchemaParser, ...range: {
|
|
72
|
-
from:
|
|
73
|
-
to:
|
|
69
|
+
from: StatusCode;
|
|
70
|
+
to: StatusCode;
|
|
74
71
|
}[]): HTTPRequestBuilder;
|
|
75
72
|
onBeforeSend(...hook: RequestHook[]): this;
|
|
76
73
|
onReceivedResponse(...hook: ResponseHook<unknown>[]): this;
|
|
@@ -84,12 +81,11 @@ declare class HTTPRequestBuilder {
|
|
|
84
81
|
get<TReturn>(): Promise<HTTPResponse<TReturn>>;
|
|
85
82
|
delete<TReturn>(): Promise<HTTPResponse<TReturn>>;
|
|
86
83
|
put<TReturn>(): Promise<HTTPResponse<TReturn>>;
|
|
84
|
+
patch<TReturn>(): Promise<HTTPResponse<TReturn>>;
|
|
87
85
|
private _request;
|
|
86
|
+
private constructOptions;
|
|
88
87
|
private tryRunBeforeHooks;
|
|
89
88
|
private tryRunAfterHooks;
|
|
90
|
-
makeResponse<T>(res: AxiosResponse): HTTPResponse<T>;
|
|
91
|
-
private createWrapper;
|
|
92
|
-
private validateSchemas;
|
|
93
89
|
}
|
|
94
90
|
|
|
95
91
|
declare class HTTP {
|
|
@@ -123,4 +119,4 @@ declare class HTTP {
|
|
|
123
119
|
private builder;
|
|
124
120
|
}
|
|
125
121
|
|
|
126
|
-
export {
|
|
122
|
+
export { HTTP };
|
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,16 +8,11 @@ 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
|
}
|
|
18
|
-
declare class DerivedHTTPResponse<T, K> extends HTTPResponse<T> {
|
|
19
|
-
actual: HTTPResponse<K>;
|
|
20
|
-
}
|
|
21
16
|
|
|
22
17
|
type SchemaParser = {
|
|
23
18
|
parse: (data: unknown) => unknown;
|
|
@@ -27,6 +22,18 @@ type StatusCode<T extends typeof StatusCodes = typeof StatusCodes> = {
|
|
|
27
22
|
status: infer U;
|
|
28
23
|
} ? U : never;
|
|
29
24
|
}[keyof T];
|
|
25
|
+
type RequestState = {
|
|
26
|
+
headers: Map<string, string>;
|
|
27
|
+
params: Map<string, unknown>;
|
|
28
|
+
url: string;
|
|
29
|
+
route: string[];
|
|
30
|
+
responseType: ResponseType | undefined;
|
|
31
|
+
data: unknown;
|
|
32
|
+
method: Method;
|
|
33
|
+
get fullUrl(): string;
|
|
34
|
+
};
|
|
35
|
+
type RequestHook = (state: RequestState) => unknown;
|
|
36
|
+
type ResponseHook<T> = (state: HTTPResponse<T>) => unknown;
|
|
30
37
|
|
|
31
38
|
declare class SchemaMap {
|
|
32
39
|
#private;
|
|
@@ -35,6 +42,10 @@ declare class SchemaMap {
|
|
|
35
42
|
from: StatusCode;
|
|
36
43
|
to: StatusCode;
|
|
37
44
|
}[]): (typeof parser)["parse"];
|
|
45
|
+
register(parser: SchemaParser, ...args: (StatusCode | {
|
|
46
|
+
from: StatusCode;
|
|
47
|
+
to: StatusCode;
|
|
48
|
+
})[]): (typeof parser)["parse"];
|
|
38
49
|
registerSingle(parser: SchemaParser, ...codes: StatusCode[]): void;
|
|
39
50
|
including(map: SchemaMap): this;
|
|
40
51
|
registerRange(parser: SchemaParser, ...range: {
|
|
@@ -44,21 +55,7 @@ declare class SchemaMap {
|
|
|
44
55
|
get(status: StatusCode): SchemaParser | undefined;
|
|
45
56
|
validate<T>(status: StatusCode, response: T, strict: boolean): T;
|
|
46
57
|
}
|
|
47
|
-
declare function assertIsStatusCode(value: number): asserts value is StatusCode;
|
|
48
|
-
declare function IsStatusCode(value: number): value is StatusCode;
|
|
49
58
|
|
|
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
59
|
declare class HTTPRequestBuilder {
|
|
63
60
|
#private;
|
|
64
61
|
constructor(map: SchemaMap);
|
|
@@ -67,10 +64,10 @@ declare class HTTPRequestBuilder {
|
|
|
67
64
|
get currentUrl(): string;
|
|
68
65
|
url(url: string): this;
|
|
69
66
|
allowPlainText(value: boolean): this;
|
|
70
|
-
schema(parser: SchemaParser, ...codes:
|
|
67
|
+
schema(parser: SchemaParser, ...codes: StatusCode[]): HTTPRequestBuilder;
|
|
71
68
|
schema(parser: SchemaParser, ...range: {
|
|
72
|
-
from:
|
|
73
|
-
to:
|
|
69
|
+
from: StatusCode;
|
|
70
|
+
to: StatusCode;
|
|
74
71
|
}[]): HTTPRequestBuilder;
|
|
75
72
|
onBeforeSend(...hook: RequestHook[]): this;
|
|
76
73
|
onReceivedResponse(...hook: ResponseHook<unknown>[]): this;
|
|
@@ -84,12 +81,11 @@ declare class HTTPRequestBuilder {
|
|
|
84
81
|
get<TReturn>(): Promise<HTTPResponse<TReturn>>;
|
|
85
82
|
delete<TReturn>(): Promise<HTTPResponse<TReturn>>;
|
|
86
83
|
put<TReturn>(): Promise<HTTPResponse<TReturn>>;
|
|
84
|
+
patch<TReturn>(): Promise<HTTPResponse<TReturn>>;
|
|
87
85
|
private _request;
|
|
86
|
+
private constructOptions;
|
|
88
87
|
private tryRunBeforeHooks;
|
|
89
88
|
private tryRunAfterHooks;
|
|
90
|
-
makeResponse<T>(res: AxiosResponse): HTTPResponse<T>;
|
|
91
|
-
private createWrapper;
|
|
92
|
-
private validateSchemas;
|
|
93
89
|
}
|
|
94
90
|
|
|
95
91
|
declare class HTTP {
|
|
@@ -123,4 +119,4 @@ declare class HTTP {
|
|
|
123
119
|
private builder;
|
|
124
120
|
}
|
|
125
121
|
|
|
126
|
-
export {
|
|
122
|
+
export { HTTP };
|
package/dist/index.js
CHANGED
|
@@ -57,57 +57,18 @@ var __privateSet = (obj, member, value, setter) => {
|
|
|
57
57
|
// src/index.ts
|
|
58
58
|
var src_exports = {};
|
|
59
59
|
__export(src_exports, {
|
|
60
|
-
|
|
61
|
-
HTTP: () => HTTP,
|
|
62
|
-
HTTPRequestBuilder: () => HTTPRequestBuilder,
|
|
63
|
-
HTTPResponse: () => HTTPResponse,
|
|
64
|
-
IsStatusCode: () => IsStatusCode,
|
|
65
|
-
SchemaMap: () => SchemaMap,
|
|
66
|
-
assertIsStatusCode: () => assertIsStatusCode
|
|
60
|
+
HTTP: () => HTTP
|
|
67
61
|
});
|
|
68
62
|
module.exports = __toCommonJS(src_exports);
|
|
69
63
|
|
|
64
|
+
// src/http.ts
|
|
65
|
+
var import_app2 = require("@autometa/app");
|
|
66
|
+
|
|
70
67
|
// src/http.builder.ts
|
|
71
68
|
var import_app = require("@autometa/app");
|
|
72
|
-
var
|
|
73
|
-
var import_axios = __toESM(require("axios"), 1);
|
|
74
|
-
var import_class_transformer = require("class-transformer");
|
|
69
|
+
var import_errors4 = require("@autometa/errors");
|
|
75
70
|
var import_url_join_ts = require("url-join-ts");
|
|
76
71
|
|
|
77
|
-
// src/http.response.ts
|
|
78
|
-
var HTTPResponse = class _HTTPResponse {
|
|
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
|
-
}
|
|
92
|
-
static derive(original, data) {
|
|
93
|
-
const response = new DerivedHTTPResponse();
|
|
94
|
-
if (typeof data === "function") {
|
|
95
|
-
const fn = data;
|
|
96
|
-
response.data = fn(original.data);
|
|
97
|
-
} else {
|
|
98
|
-
response.data = data;
|
|
99
|
-
}
|
|
100
|
-
response.status = original.status;
|
|
101
|
-
response.statusText = original.statusText;
|
|
102
|
-
response.headers = original.headers;
|
|
103
|
-
response.request = original.request;
|
|
104
|
-
response.actual = original;
|
|
105
|
-
return response;
|
|
106
|
-
}
|
|
107
|
-
};
|
|
108
|
-
var DerivedHTTPResponse = class extends HTTPResponse {
|
|
109
|
-
};
|
|
110
|
-
|
|
111
72
|
// src/schema.map.ts
|
|
112
73
|
var import_errors = require("@autometa/errors");
|
|
113
74
|
var import_status_codes = require("@autometa/status-codes");
|
|
@@ -195,9 +156,159 @@ function IsStatusCode(value) {
|
|
|
195
156
|
return Object.values(import_status_codes.StatusCodes).map((it) => it.status).includes(value);
|
|
196
157
|
}
|
|
197
158
|
|
|
198
|
-
// src/
|
|
159
|
+
// src/transform-response.ts
|
|
160
|
+
var import_errors2 = require("@autometa/errors");
|
|
199
161
|
var import_assert_is_json = __toESM(require("@stdlib/assert-is-json"), 1);
|
|
200
162
|
var import_cli_highlight = require("cli-highlight");
|
|
163
|
+
function transformResponse(allowPlainText, data) {
|
|
164
|
+
if (data === null) {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
if (data === void 0) {
|
|
168
|
+
return void 0;
|
|
169
|
+
}
|
|
170
|
+
if ((0, import_assert_is_json.default)(data)) {
|
|
171
|
+
return JSON.parse(data);
|
|
172
|
+
}
|
|
173
|
+
if (["true", "false"].includes(data)) {
|
|
174
|
+
return JSON.parse(data);
|
|
175
|
+
}
|
|
176
|
+
if (/^\d*\.?\d+$/.test(data)) {
|
|
177
|
+
return JSON.parse(data);
|
|
178
|
+
}
|
|
179
|
+
if (allowPlainText) {
|
|
180
|
+
return data;
|
|
181
|
+
}
|
|
182
|
+
const response = (0, import_cli_highlight.highlight)(data, { language: "html" });
|
|
183
|
+
const message = [
|
|
184
|
+
`Could not parse a response as json, and this request was not configured to allow plain text responses.`,
|
|
185
|
+
`To allow plain text responses, use the 'allowPlainText' method on the HTTP client.`,
|
|
186
|
+
" ",
|
|
187
|
+
response
|
|
188
|
+
];
|
|
189
|
+
throw new import_errors2.AutomationError(message.join("\n"));
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// src/axios-executor.ts
|
|
193
|
+
var import_axios = __toESM(require("axios"), 1);
|
|
194
|
+
var import_class_transformer = require("class-transformer");
|
|
195
|
+
|
|
196
|
+
// src/http.response.ts
|
|
197
|
+
var HTTPResponse = class {
|
|
198
|
+
static derive(original, data) {
|
|
199
|
+
const response = new DerivedHTTPResponse();
|
|
200
|
+
if (typeof data === "function") {
|
|
201
|
+
const fn = data;
|
|
202
|
+
response.data = fn(original.data);
|
|
203
|
+
} else {
|
|
204
|
+
response.data = data;
|
|
205
|
+
}
|
|
206
|
+
response.status = original.status;
|
|
207
|
+
response.statusText = original.statusText;
|
|
208
|
+
response.headers = original.headers;
|
|
209
|
+
response.request = original.request;
|
|
210
|
+
response.actual = original;
|
|
211
|
+
return response;
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
var DerivedHTTPResponse = class extends HTTPResponse {
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
// src/axios-executor.ts
|
|
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,30 +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
|
-
return JSON.parse(data);
|
|
416
|
-
}
|
|
417
|
-
const response = (0, import_cli_highlight.highlight)(data, { language: "html" });
|
|
418
|
-
const message = [
|
|
419
|
-
`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:`,
|
|
420
|
-
" ",
|
|
421
|
-
response
|
|
422
|
-
];
|
|
423
|
-
throw new import_errors2.AutomationError(message.join("\n"));
|
|
424
|
-
}
|
|
425
493
|
|
|
426
494
|
// src/http.ts
|
|
427
|
-
var import_app2 = require("@autometa/app");
|
|
428
495
|
var _url2, _route2, _headers2, _requireSchema2, _schemaMap2, _onBeforeSend2, _onAfterSend2, _allowPlainText2;
|
|
429
496
|
var HTTP = class {
|
|
430
497
|
constructor() {
|
|
@@ -516,12 +583,6 @@ HTTP = __decorateClass([
|
|
|
516
583
|
], HTTP);
|
|
517
584
|
// Annotate the CommonJS export names for ESM import in node:
|
|
518
585
|
0 && (module.exports = {
|
|
519
|
-
|
|
520
|
-
HTTP,
|
|
521
|
-
HTTPRequestBuilder,
|
|
522
|
-
HTTPResponse,
|
|
523
|
-
IsStatusCode,
|
|
524
|
-
SchemaMap,
|
|
525
|
-
assertIsStatusCode
|
|
586
|
+
HTTP
|
|
526
587
|
});
|
|
527
588
|
//# 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 return JSON.parse(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.ts","../src/http.builder.ts","../src/schema.map.ts","../src/transform-response.ts","../src/axios-executor.ts","../src/http.response.ts"],"sourcesContent":["// export * from \"./http.builder\";\n// export * from \"./http.response\";\n// export * from \"./types\";\n// export * from \"./schema.map\";\nexport * from \"./http\";\n// export * from './axios-executor'\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","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"],"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.6",
|
|
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": {
|