@marianmeres/http-utils 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api.d.ts +22 -0
- package/dist/error.d.ts +87 -0
- package/dist/index.cjs +340 -0
- package/dist/index.js +335 -0
- package/dist/status.d.ts +258 -0
- package/package.json +4 -1
- package/.editorconfig +0 -12
- package/.prettierignore +0 -1
- package/.prettierrc.yaml +0 -5
- package/rollup.config.js +0 -15
- package/src/api.ts +0 -198
- package/src/error.ts +0 -162
- package/src/status.ts +0 -107
- package/tests/api.test.js +0 -136
- package/tests/utils.test.js +0 -64
- package/tsconfig.json +0 -113
- /package/{src/index.ts → dist/index.d.ts} +0 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
import { dset } from 'dset/merge';
|
|
2
|
+
|
|
3
|
+
class HTTP_STATUS {
|
|
4
|
+
// 1xx
|
|
5
|
+
// prettier-ignore
|
|
6
|
+
static INFO = {
|
|
7
|
+
CONTINUE: { CODE: 100, TEXT: 'Continue' },
|
|
8
|
+
SWITCHING_PROTOCOLS: { CODE: 101, TEXT: 'Switching Protocols' },
|
|
9
|
+
PROCESSING: { CODE: 102, TEXT: 'Processing' },
|
|
10
|
+
EARLY_HINTS: { CODE: 103, TEXT: 'Early Hints' },
|
|
11
|
+
};
|
|
12
|
+
// 2xx
|
|
13
|
+
// prettier-ignore
|
|
14
|
+
static SUCCESS = {
|
|
15
|
+
OK: { CODE: 200, TEXT: 'OK' },
|
|
16
|
+
NON_AUTHORITATIVE_INFO: { CODE: 203, TEXT: 'Non-Authoritative Information' },
|
|
17
|
+
ACCEPTED: { CODE: 202, TEXT: 'Accepted' },
|
|
18
|
+
NO_CONTENT: { CODE: 204, TEXT: 'No Content' },
|
|
19
|
+
RESET_CONTENT: { CODE: 205, TEXT: 'Reset Content' },
|
|
20
|
+
PARTIAL_CONTENT: { CODE: 206, TEXT: 'Partial Content' },
|
|
21
|
+
MULTI_STATUS: { CODE: 207, TEXT: 'Multi-Status' },
|
|
22
|
+
ALREADY_REPORTED: { CODE: 208, TEXT: 'Already Reported' },
|
|
23
|
+
IM_USED: { CODE: 226, TEXT: 'IM Used' }, // ?
|
|
24
|
+
};
|
|
25
|
+
// 3xx
|
|
26
|
+
// prettier-ignore
|
|
27
|
+
static REDIRECT = {
|
|
28
|
+
MUTLIPLE_CHOICES: { CODE: 300, TEXT: 'Multiple Choices' },
|
|
29
|
+
MOVED_PERMANENTLY: { CODE: 301, TEXT: 'Moved Permanently' },
|
|
30
|
+
FOUND: { CODE: 302, TEXT: 'Found' },
|
|
31
|
+
SEE_OTHER: { CODE: 303, TEXT: 'See Other' },
|
|
32
|
+
NOT_MODIFIED: { CODE: 304, TEXT: 'Not Modified' },
|
|
33
|
+
TEMPORARY_REDIRECT: { CODE: 307, TEXT: 'Temporary Redirect' },
|
|
34
|
+
PERMANENT_REDIRECT: { CODE: 308, TEXT: 'Permanent Redirect' },
|
|
35
|
+
};
|
|
36
|
+
// 4xx
|
|
37
|
+
// prettier-ignore
|
|
38
|
+
static ERROR_CLIENT = {
|
|
39
|
+
BAD_REQUEST: { CODE: 400, TEXT: 'Bad Request' },
|
|
40
|
+
UNAUTHORIZED: { CODE: 401, TEXT: 'Unauthorized' },
|
|
41
|
+
PAYMENT_REQUIRED_EXPERIMENTAL: { CODE: 402, TEXT: 'Payment Required Experimental' },
|
|
42
|
+
FORBIDDEN: { CODE: 403, TEXT: 'Forbidden' },
|
|
43
|
+
NOT_FOUND: { CODE: 404, TEXT: 'Not Found' },
|
|
44
|
+
METHOD_NOT_ALLOWED: { CODE: 405, TEXT: 'Method Not Allowed' },
|
|
45
|
+
NOT_ACCEPTABLE: { CODE: 406, TEXT: 'Not Acceptable' },
|
|
46
|
+
PROXY_AUTHENTICATION_REQUIRED: { CODE: 407, TEXT: 'Proxy Authentication Required' },
|
|
47
|
+
REQUEST_TIMEOUT: { CODE: 408, TEXT: 'Request Timeout' },
|
|
48
|
+
CONFLICT: { CODE: 409, TEXT: 'Conflict' },
|
|
49
|
+
GONE: { CODE: 410, TEXT: 'Gone' },
|
|
50
|
+
LENGTH_REQUIRED: { CODE: 411, TEXT: 'Length Required' },
|
|
51
|
+
PRECONDITION_FAILED: { CODE: 412, TEXT: 'Precondition Failed' },
|
|
52
|
+
PAYLOAD_TOO_LARGE: { CODE: 413, TEXT: 'Payload Too Large' },
|
|
53
|
+
URI_TOO_LONG: { CODE: 414, TEXT: 'URI Too Long' },
|
|
54
|
+
UNSUPPORTED_MEDIA_TYPE: { CODE: 415, TEXT: 'Unsupported Media Type' },
|
|
55
|
+
RANGE_NOT_SATISFIABLE: { CODE: 416, TEXT: 'Range Not Satisfiable' },
|
|
56
|
+
EXPECTATION_FAILED: { CODE: 417, TEXT: 'Expectation Failed' },
|
|
57
|
+
IM_A_TEAPOT: { CODE: 418, TEXT: "I'm a teapot" },
|
|
58
|
+
MISDIRECTED_REQUEST: { CODE: 421, TEXT: 'Misdirected Request' },
|
|
59
|
+
UNPROCESSABLE_CONTENT: { CODE: 422, TEXT: 'Unprocessable Content' },
|
|
60
|
+
LOCKED: { CODE: 423, TEXT: 'Locked' },
|
|
61
|
+
FAILED_DEPENDENCY: { CODE: 424, TEXT: 'Failed Dependency' },
|
|
62
|
+
TOO_EARLY_EXPERIMENTAL: { CODE: 425, TEXT: 'Too Early Experimental' },
|
|
63
|
+
UPGRADE_REQUIRED: { CODE: 426, TEXT: 'Upgrade Required' },
|
|
64
|
+
PRECONDITION_REQUIRED: { CODE: 428, TEXT: 'Precondition Required' },
|
|
65
|
+
TOO_MANY_REQUESTS: { CODE: 429, TEXT: 'Too Many Requests' },
|
|
66
|
+
REQUEST_HEADER_FIELDS_TOO_LARGE: { CODE: 431, TEXT: 'Request Header Fields Too Large' },
|
|
67
|
+
UNAVAILABLE_FOR_LEGAL_REASONS: { CODE: 451, TEXT: 'Unavailable For Legal Reasons' },
|
|
68
|
+
};
|
|
69
|
+
// 5xx
|
|
70
|
+
// prettier-ignore
|
|
71
|
+
static ERROR_SERVER = {
|
|
72
|
+
INTERNAL_SERVER_ERROR: { CODE: 500, TEXT: 'Internal Server Error' },
|
|
73
|
+
NOT_IMPLEMENTED: { CODE: 501, TEXT: 'Not Implemented' },
|
|
74
|
+
BAD_GATEWAY: { CODE: 502, TEXT: 'Bad Gateway' },
|
|
75
|
+
SERVICE_UNAVAILABLE: { CODE: 503, TEXT: 'Service Unavailable' },
|
|
76
|
+
GATEWAY_TIMEOUT: { CODE: 504, TEXT: 'Gateway Timeout' },
|
|
77
|
+
HTTP_VERSION_NOT_SUPPORTED: { CODE: 505, TEXT: 'HTTP Version Not Supported' },
|
|
78
|
+
VARIANT_ALSO_NEGOTIATES: { CODE: 506, TEXT: 'Variant Also Negotiates' },
|
|
79
|
+
INSUFFICIENT_STORAGE: { CODE: 507, TEXT: 'Insufficient Storage' },
|
|
80
|
+
LOOP_DETECTED: { CODE: 508, TEXT: 'Loop Detected' },
|
|
81
|
+
NOT_EXTENDED: { CODE: 510, TEXT: 'Not Extended' },
|
|
82
|
+
NETWORK_AUTH_REQUIRED: { CODE: 511, TEXT: 'Network Authentication Required' },
|
|
83
|
+
};
|
|
84
|
+
//
|
|
85
|
+
static findByCode(code) {
|
|
86
|
+
const keys = [
|
|
87
|
+
'INFO',
|
|
88
|
+
'SUCCESS',
|
|
89
|
+
'REDIRECT',
|
|
90
|
+
'ERROR_CLIENT',
|
|
91
|
+
'ERROR_SERVER',
|
|
92
|
+
];
|
|
93
|
+
for (const _TYPE of keys) {
|
|
94
|
+
for (const [_KEY, data] of Object.entries(HTTP_STATUS[_TYPE])) {
|
|
95
|
+
if (data.CODE == code) {
|
|
96
|
+
return { ...data, _TYPE, _KEY };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// opinionated base for all
|
|
105
|
+
class HttpError extends Error {
|
|
106
|
+
name = 'HttpError';
|
|
107
|
+
status = HTTP_STATUS.ERROR_SERVER.INTERNAL_SERVER_ERROR.CODE;
|
|
108
|
+
statusText = HTTP_STATUS.ERROR_SERVER.INTERNAL_SERVER_ERROR.TEXT;
|
|
109
|
+
body = null;
|
|
110
|
+
}
|
|
111
|
+
// some more specific instances of the well known ones...
|
|
112
|
+
// client
|
|
113
|
+
class BadRequest extends HttpError {
|
|
114
|
+
name = 'HttpBadRequestError';
|
|
115
|
+
status = HTTP_STATUS.ERROR_CLIENT.BAD_REQUEST.CODE;
|
|
116
|
+
statusText = HTTP_STATUS.ERROR_CLIENT.BAD_REQUEST.TEXT;
|
|
117
|
+
}
|
|
118
|
+
class Unauthorized extends HttpError {
|
|
119
|
+
name = 'HttpUnauthorizedError';
|
|
120
|
+
status = HTTP_STATUS.ERROR_CLIENT.UNAUTHORIZED.CODE;
|
|
121
|
+
statusText = HTTP_STATUS.ERROR_CLIENT.UNAUTHORIZED.TEXT;
|
|
122
|
+
}
|
|
123
|
+
class Forbidden extends HttpError {
|
|
124
|
+
name = 'HttpForbiddenError';
|
|
125
|
+
status = HTTP_STATUS.ERROR_CLIENT.FORBIDDEN.CODE;
|
|
126
|
+
statusText = HTTP_STATUS.ERROR_CLIENT.FORBIDDEN.TEXT;
|
|
127
|
+
}
|
|
128
|
+
class NotFound extends HttpError {
|
|
129
|
+
name = 'HttpNotFoundError';
|
|
130
|
+
status = HTTP_STATUS.ERROR_CLIENT.NOT_FOUND.CODE;
|
|
131
|
+
statusText = HTTP_STATUS.ERROR_CLIENT.NOT_FOUND.TEXT;
|
|
132
|
+
}
|
|
133
|
+
class MethodNotAllowed extends HttpError {
|
|
134
|
+
name = 'HttpMethodNotAllowedError';
|
|
135
|
+
status = HTTP_STATUS.ERROR_CLIENT.METHOD_NOT_ALLOWED.CODE;
|
|
136
|
+
statusText = HTTP_STATUS.ERROR_CLIENT.METHOD_NOT_ALLOWED.TEXT;
|
|
137
|
+
}
|
|
138
|
+
class RequestTimeout extends HttpError {
|
|
139
|
+
name = 'HttpRequestTimeoutError';
|
|
140
|
+
status = HTTP_STATUS.ERROR_CLIENT.REQUEST_TIMEOUT.CODE;
|
|
141
|
+
statusText = HTTP_STATUS.ERROR_CLIENT.REQUEST_TIMEOUT.TEXT;
|
|
142
|
+
}
|
|
143
|
+
class Conflict extends HttpError {
|
|
144
|
+
name = 'HttpConflictError';
|
|
145
|
+
status = HTTP_STATUS.ERROR_CLIENT.CONFLICT.CODE;
|
|
146
|
+
statusText = HTTP_STATUS.ERROR_CLIENT.CONFLICT.TEXT;
|
|
147
|
+
}
|
|
148
|
+
class Gone extends HttpError {
|
|
149
|
+
name = 'HttpGoneError';
|
|
150
|
+
status = HTTP_STATUS.ERROR_CLIENT.GONE.CODE;
|
|
151
|
+
statusText = HTTP_STATUS.ERROR_CLIENT.GONE.TEXT;
|
|
152
|
+
}
|
|
153
|
+
class ImATeapot extends HttpError {
|
|
154
|
+
name = 'HttpImATeapotError';
|
|
155
|
+
status = HTTP_STATUS.ERROR_CLIENT.IM_A_TEAPOT.CODE;
|
|
156
|
+
statusText = HTTP_STATUS.ERROR_CLIENT.IM_A_TEAPOT.TEXT;
|
|
157
|
+
}
|
|
158
|
+
// server
|
|
159
|
+
class InternalServerError extends HttpError {
|
|
160
|
+
name = 'HttpInternalServerError';
|
|
161
|
+
}
|
|
162
|
+
class NotImplemented extends HttpError {
|
|
163
|
+
name = 'HttpServiceUnavailableError';
|
|
164
|
+
status = HTTP_STATUS.ERROR_SERVER.NOT_IMPLEMENTED.CODE;
|
|
165
|
+
statusText = HTTP_STATUS.ERROR_SERVER.NOT_IMPLEMENTED.TEXT;
|
|
166
|
+
}
|
|
167
|
+
class BadGateway extends HttpError {
|
|
168
|
+
name = 'HttpBadGatewayError';
|
|
169
|
+
status = HTTP_STATUS.ERROR_SERVER.BAD_GATEWAY.CODE;
|
|
170
|
+
statusText = HTTP_STATUS.ERROR_SERVER.BAD_GATEWAY.TEXT;
|
|
171
|
+
}
|
|
172
|
+
class ServiceUnavailable extends HttpError {
|
|
173
|
+
name = 'HttpServiceUnavailableError';
|
|
174
|
+
status = HTTP_STATUS.ERROR_SERVER.SERVICE_UNAVAILABLE.CODE;
|
|
175
|
+
statusText = HTTP_STATUS.ERROR_SERVER.SERVICE_UNAVAILABLE.TEXT;
|
|
176
|
+
}
|
|
177
|
+
//
|
|
178
|
+
const HTTP_ERROR = {
|
|
179
|
+
// base
|
|
180
|
+
HttpError,
|
|
181
|
+
// client
|
|
182
|
+
BadRequest,
|
|
183
|
+
Unauthorized,
|
|
184
|
+
Forbidden,
|
|
185
|
+
NotFound,
|
|
186
|
+
MethodNotAllowed,
|
|
187
|
+
RequestTimeout,
|
|
188
|
+
Conflict,
|
|
189
|
+
Gone,
|
|
190
|
+
ImATeapot,
|
|
191
|
+
// server
|
|
192
|
+
InternalServerError,
|
|
193
|
+
NotImplemented,
|
|
194
|
+
BadGateway,
|
|
195
|
+
ServiceUnavailable,
|
|
196
|
+
};
|
|
197
|
+
const _wellKnownCtorMap = {
|
|
198
|
+
'400': BadRequest,
|
|
199
|
+
'401': Unauthorized,
|
|
200
|
+
'403': Forbidden,
|
|
201
|
+
'404': NotFound,
|
|
202
|
+
'405': MethodNotAllowed,
|
|
203
|
+
'408': RequestTimeout,
|
|
204
|
+
'409': Conflict,
|
|
205
|
+
'410': Gone,
|
|
206
|
+
'418': ImATeapot,
|
|
207
|
+
//
|
|
208
|
+
'500': InternalServerError,
|
|
209
|
+
'501': NotImplemented,
|
|
210
|
+
'502': BadGateway,
|
|
211
|
+
'503': ServiceUnavailable,
|
|
212
|
+
};
|
|
213
|
+
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause
|
|
214
|
+
const createHttpError = (code, message, body, cause) => {
|
|
215
|
+
const fallback = HTTP_STATUS.ERROR_SERVER.INTERNAL_SERVER_ERROR;
|
|
216
|
+
code = Number(code);
|
|
217
|
+
if (isNaN(code) || !(code >= 400 && code < 600))
|
|
218
|
+
code = fallback.CODE;
|
|
219
|
+
const found = HTTP_STATUS.findByCode(code);
|
|
220
|
+
const statusText = found?.TEXT ?? fallback.TEXT;
|
|
221
|
+
// opinionated convention
|
|
222
|
+
if (typeof body === 'string') {
|
|
223
|
+
// prettier-ignore
|
|
224
|
+
try {
|
|
225
|
+
body = JSON.parse(body);
|
|
226
|
+
}
|
|
227
|
+
catch (e) { }
|
|
228
|
+
}
|
|
229
|
+
// try to find the well known one, otherwise fallback to generic
|
|
230
|
+
const ctor = _wellKnownCtorMap[`${code}`] ?? HttpError;
|
|
231
|
+
let e = new ctor(message || statusText, { cause });
|
|
232
|
+
e.status = found?.CODE ?? fallback.CODE;
|
|
233
|
+
e.statusText = statusText;
|
|
234
|
+
e.body = body;
|
|
235
|
+
return e;
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
const _fetchRaw = async ({ method, path, data = null, token = null, headers = null, signal = null, credentials, }) => {
|
|
239
|
+
headers = Object.entries(headers || {}).map(([k, v]) => ({ [k.toLowerCase()]: v }));
|
|
240
|
+
const opts = { method, credentials, headers, signal };
|
|
241
|
+
if (data) {
|
|
242
|
+
const isObj = typeof data === 'object';
|
|
243
|
+
// multipart/form-data -- no explicit Content-Type
|
|
244
|
+
if (data instanceof FormData) {
|
|
245
|
+
opts.body = data;
|
|
246
|
+
}
|
|
247
|
+
// cover 99% use cases (may not fit all)
|
|
248
|
+
else {
|
|
249
|
+
// if not stated, assuming json
|
|
250
|
+
if (isObj || !headers['content-type']) {
|
|
251
|
+
opts.headers['content-type'] = 'application/json';
|
|
252
|
+
}
|
|
253
|
+
opts.body = JSON.stringify(data);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// opinionated convention
|
|
257
|
+
if (token) {
|
|
258
|
+
opts.headers['authorization'] = `Bearer ${token}`;
|
|
259
|
+
}
|
|
260
|
+
return await fetch(path, opts);
|
|
261
|
+
};
|
|
262
|
+
const _fetch = async (params, respHeaders = null, _dumpParams = false) => {
|
|
263
|
+
if (_dumpParams)
|
|
264
|
+
return params;
|
|
265
|
+
const r = await _fetchRaw(params);
|
|
266
|
+
if (params.raw)
|
|
267
|
+
return r;
|
|
268
|
+
// quick-n-dirty reference to headers (so it's still accessible over this api wrap)
|
|
269
|
+
if (respHeaders) {
|
|
270
|
+
Object.assign(respHeaders, [...r.headers.entries()].reduce((m, [k, v]) => ({ ...m, [k]: v }), {}),
|
|
271
|
+
// adding status/text under special keys
|
|
272
|
+
{
|
|
273
|
+
__http_status_code__: r.status,
|
|
274
|
+
__http_status_text__: r.statusText,
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
let body = await r.text();
|
|
278
|
+
// prettier-ignore
|
|
279
|
+
try {
|
|
280
|
+
body = JSON.parse(body);
|
|
281
|
+
}
|
|
282
|
+
catch (e) { }
|
|
283
|
+
params.assert ??= true; // default is true
|
|
284
|
+
if (!r.ok && params.assert) {
|
|
285
|
+
throw createHttpError(r.status, null, body);
|
|
286
|
+
}
|
|
287
|
+
return body;
|
|
288
|
+
};
|
|
289
|
+
const createHttpApi = (base, defaults) => {
|
|
290
|
+
const _merge = (a, b) => {
|
|
291
|
+
const wrap = { result: a };
|
|
292
|
+
dset(wrap, 'result', b);
|
|
293
|
+
return wrap.result;
|
|
294
|
+
};
|
|
295
|
+
const _getDefs = async () => {
|
|
296
|
+
return new Promise(async (resolve) => {
|
|
297
|
+
if (typeof defaults === 'function') {
|
|
298
|
+
resolve(await defaults());
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
resolve(defaults || {});
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
};
|
|
305
|
+
return {
|
|
306
|
+
// GET
|
|
307
|
+
async get(path, params, respHeaders = null, _dumpParams = false) {
|
|
308
|
+
path = `${base || ''}` + path;
|
|
309
|
+
return _fetch(_merge(await _getDefs(), { ...params, method: 'GET', path }), respHeaders, _dumpParams);
|
|
310
|
+
},
|
|
311
|
+
// POST
|
|
312
|
+
async post(path, data = null, params, respHeaders = null, _dumpParams = false) {
|
|
313
|
+
path = `${base || ''}` + path;
|
|
314
|
+
return _fetch(_merge(await _getDefs(), { ...(params || {}), data, method: 'POST', path }), respHeaders, _dumpParams);
|
|
315
|
+
},
|
|
316
|
+
// PUT
|
|
317
|
+
async put(path, data = null, params, respHeaders = null, _dumpParams = false) {
|
|
318
|
+
path = `${base || ''}` + path;
|
|
319
|
+
return _fetch(_merge(await _getDefs(), { ...(params || {}), data, method: 'PUT', path }), respHeaders, _dumpParams);
|
|
320
|
+
},
|
|
321
|
+
// PATCH
|
|
322
|
+
async patch(path, data = null, params, respHeaders = null, _dumpParams = false) {
|
|
323
|
+
path = `${base || ''}` + path;
|
|
324
|
+
return _fetch(_merge(await _getDefs(), { ...(params || {}), data, method: 'PATCH', path }), respHeaders, _dumpParams);
|
|
325
|
+
},
|
|
326
|
+
// DELETE
|
|
327
|
+
// https://stackoverflow.com/questions/299628/is-an-entity-body-allowed-for-an-http-delete-request
|
|
328
|
+
async del(path, data = null, params, respHeaders = null, _dumpParams = false) {
|
|
329
|
+
path = `${base || ''}` + path;
|
|
330
|
+
return _fetch(_merge(await _getDefs(), { ...(params || {}), data, method: 'DELETE', path }), respHeaders, _dumpParams);
|
|
331
|
+
},
|
|
332
|
+
};
|
|
333
|
+
};
|
|
334
|
+
|
|
335
|
+
export { HTTP_ERROR, HTTP_STATUS, createHttpApi, createHttpError };
|
package/dist/status.d.ts
ADDED
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
export declare class HTTP_STATUS {
|
|
2
|
+
static readonly INFO: {
|
|
3
|
+
CONTINUE: {
|
|
4
|
+
CODE: number;
|
|
5
|
+
TEXT: string;
|
|
6
|
+
};
|
|
7
|
+
SWITCHING_PROTOCOLS: {
|
|
8
|
+
CODE: number;
|
|
9
|
+
TEXT: string;
|
|
10
|
+
};
|
|
11
|
+
PROCESSING: {
|
|
12
|
+
CODE: number;
|
|
13
|
+
TEXT: string;
|
|
14
|
+
};
|
|
15
|
+
EARLY_HINTS: {
|
|
16
|
+
CODE: number;
|
|
17
|
+
TEXT: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
static readonly SUCCESS: {
|
|
21
|
+
OK: {
|
|
22
|
+
CODE: number;
|
|
23
|
+
TEXT: string;
|
|
24
|
+
};
|
|
25
|
+
NON_AUTHORITATIVE_INFO: {
|
|
26
|
+
CODE: number;
|
|
27
|
+
TEXT: string;
|
|
28
|
+
};
|
|
29
|
+
ACCEPTED: {
|
|
30
|
+
CODE: number;
|
|
31
|
+
TEXT: string;
|
|
32
|
+
};
|
|
33
|
+
NO_CONTENT: {
|
|
34
|
+
CODE: number;
|
|
35
|
+
TEXT: string;
|
|
36
|
+
};
|
|
37
|
+
RESET_CONTENT: {
|
|
38
|
+
CODE: number;
|
|
39
|
+
TEXT: string;
|
|
40
|
+
};
|
|
41
|
+
PARTIAL_CONTENT: {
|
|
42
|
+
CODE: number;
|
|
43
|
+
TEXT: string;
|
|
44
|
+
};
|
|
45
|
+
MULTI_STATUS: {
|
|
46
|
+
CODE: number;
|
|
47
|
+
TEXT: string;
|
|
48
|
+
};
|
|
49
|
+
ALREADY_REPORTED: {
|
|
50
|
+
CODE: number;
|
|
51
|
+
TEXT: string;
|
|
52
|
+
};
|
|
53
|
+
IM_USED: {
|
|
54
|
+
CODE: number;
|
|
55
|
+
TEXT: string;
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
static readonly REDIRECT: {
|
|
59
|
+
MUTLIPLE_CHOICES: {
|
|
60
|
+
CODE: number;
|
|
61
|
+
TEXT: string;
|
|
62
|
+
};
|
|
63
|
+
MOVED_PERMANENTLY: {
|
|
64
|
+
CODE: number;
|
|
65
|
+
TEXT: string;
|
|
66
|
+
};
|
|
67
|
+
FOUND: {
|
|
68
|
+
CODE: number;
|
|
69
|
+
TEXT: string;
|
|
70
|
+
};
|
|
71
|
+
SEE_OTHER: {
|
|
72
|
+
CODE: number;
|
|
73
|
+
TEXT: string;
|
|
74
|
+
};
|
|
75
|
+
NOT_MODIFIED: {
|
|
76
|
+
CODE: number;
|
|
77
|
+
TEXT: string;
|
|
78
|
+
};
|
|
79
|
+
TEMPORARY_REDIRECT: {
|
|
80
|
+
CODE: number;
|
|
81
|
+
TEXT: string;
|
|
82
|
+
};
|
|
83
|
+
PERMANENT_REDIRECT: {
|
|
84
|
+
CODE: number;
|
|
85
|
+
TEXT: string;
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
static readonly ERROR_CLIENT: {
|
|
89
|
+
BAD_REQUEST: {
|
|
90
|
+
CODE: number;
|
|
91
|
+
TEXT: string;
|
|
92
|
+
};
|
|
93
|
+
UNAUTHORIZED: {
|
|
94
|
+
CODE: number;
|
|
95
|
+
TEXT: string;
|
|
96
|
+
};
|
|
97
|
+
PAYMENT_REQUIRED_EXPERIMENTAL: {
|
|
98
|
+
CODE: number;
|
|
99
|
+
TEXT: string;
|
|
100
|
+
};
|
|
101
|
+
FORBIDDEN: {
|
|
102
|
+
CODE: number;
|
|
103
|
+
TEXT: string;
|
|
104
|
+
};
|
|
105
|
+
NOT_FOUND: {
|
|
106
|
+
CODE: number;
|
|
107
|
+
TEXT: string;
|
|
108
|
+
};
|
|
109
|
+
METHOD_NOT_ALLOWED: {
|
|
110
|
+
CODE: number;
|
|
111
|
+
TEXT: string;
|
|
112
|
+
};
|
|
113
|
+
NOT_ACCEPTABLE: {
|
|
114
|
+
CODE: number;
|
|
115
|
+
TEXT: string;
|
|
116
|
+
};
|
|
117
|
+
PROXY_AUTHENTICATION_REQUIRED: {
|
|
118
|
+
CODE: number;
|
|
119
|
+
TEXT: string;
|
|
120
|
+
};
|
|
121
|
+
REQUEST_TIMEOUT: {
|
|
122
|
+
CODE: number;
|
|
123
|
+
TEXT: string;
|
|
124
|
+
};
|
|
125
|
+
CONFLICT: {
|
|
126
|
+
CODE: number;
|
|
127
|
+
TEXT: string;
|
|
128
|
+
};
|
|
129
|
+
GONE: {
|
|
130
|
+
CODE: number;
|
|
131
|
+
TEXT: string;
|
|
132
|
+
};
|
|
133
|
+
LENGTH_REQUIRED: {
|
|
134
|
+
CODE: number;
|
|
135
|
+
TEXT: string;
|
|
136
|
+
};
|
|
137
|
+
PRECONDITION_FAILED: {
|
|
138
|
+
CODE: number;
|
|
139
|
+
TEXT: string;
|
|
140
|
+
};
|
|
141
|
+
PAYLOAD_TOO_LARGE: {
|
|
142
|
+
CODE: number;
|
|
143
|
+
TEXT: string;
|
|
144
|
+
};
|
|
145
|
+
URI_TOO_LONG: {
|
|
146
|
+
CODE: number;
|
|
147
|
+
TEXT: string;
|
|
148
|
+
};
|
|
149
|
+
UNSUPPORTED_MEDIA_TYPE: {
|
|
150
|
+
CODE: number;
|
|
151
|
+
TEXT: string;
|
|
152
|
+
};
|
|
153
|
+
RANGE_NOT_SATISFIABLE: {
|
|
154
|
+
CODE: number;
|
|
155
|
+
TEXT: string;
|
|
156
|
+
};
|
|
157
|
+
EXPECTATION_FAILED: {
|
|
158
|
+
CODE: number;
|
|
159
|
+
TEXT: string;
|
|
160
|
+
};
|
|
161
|
+
IM_A_TEAPOT: {
|
|
162
|
+
CODE: number;
|
|
163
|
+
TEXT: string;
|
|
164
|
+
};
|
|
165
|
+
MISDIRECTED_REQUEST: {
|
|
166
|
+
CODE: number;
|
|
167
|
+
TEXT: string;
|
|
168
|
+
};
|
|
169
|
+
UNPROCESSABLE_CONTENT: {
|
|
170
|
+
CODE: number;
|
|
171
|
+
TEXT: string;
|
|
172
|
+
};
|
|
173
|
+
LOCKED: {
|
|
174
|
+
CODE: number;
|
|
175
|
+
TEXT: string;
|
|
176
|
+
};
|
|
177
|
+
FAILED_DEPENDENCY: {
|
|
178
|
+
CODE: number;
|
|
179
|
+
TEXT: string;
|
|
180
|
+
};
|
|
181
|
+
TOO_EARLY_EXPERIMENTAL: {
|
|
182
|
+
CODE: number;
|
|
183
|
+
TEXT: string;
|
|
184
|
+
};
|
|
185
|
+
UPGRADE_REQUIRED: {
|
|
186
|
+
CODE: number;
|
|
187
|
+
TEXT: string;
|
|
188
|
+
};
|
|
189
|
+
PRECONDITION_REQUIRED: {
|
|
190
|
+
CODE: number;
|
|
191
|
+
TEXT: string;
|
|
192
|
+
};
|
|
193
|
+
TOO_MANY_REQUESTS: {
|
|
194
|
+
CODE: number;
|
|
195
|
+
TEXT: string;
|
|
196
|
+
};
|
|
197
|
+
REQUEST_HEADER_FIELDS_TOO_LARGE: {
|
|
198
|
+
CODE: number;
|
|
199
|
+
TEXT: string;
|
|
200
|
+
};
|
|
201
|
+
UNAVAILABLE_FOR_LEGAL_REASONS: {
|
|
202
|
+
CODE: number;
|
|
203
|
+
TEXT: string;
|
|
204
|
+
};
|
|
205
|
+
};
|
|
206
|
+
static readonly ERROR_SERVER: {
|
|
207
|
+
INTERNAL_SERVER_ERROR: {
|
|
208
|
+
CODE: number;
|
|
209
|
+
TEXT: string;
|
|
210
|
+
};
|
|
211
|
+
NOT_IMPLEMENTED: {
|
|
212
|
+
CODE: number;
|
|
213
|
+
TEXT: string;
|
|
214
|
+
};
|
|
215
|
+
BAD_GATEWAY: {
|
|
216
|
+
CODE: number;
|
|
217
|
+
TEXT: string;
|
|
218
|
+
};
|
|
219
|
+
SERVICE_UNAVAILABLE: {
|
|
220
|
+
CODE: number;
|
|
221
|
+
TEXT: string;
|
|
222
|
+
};
|
|
223
|
+
GATEWAY_TIMEOUT: {
|
|
224
|
+
CODE: number;
|
|
225
|
+
TEXT: string;
|
|
226
|
+
};
|
|
227
|
+
HTTP_VERSION_NOT_SUPPORTED: {
|
|
228
|
+
CODE: number;
|
|
229
|
+
TEXT: string;
|
|
230
|
+
};
|
|
231
|
+
VARIANT_ALSO_NEGOTIATES: {
|
|
232
|
+
CODE: number;
|
|
233
|
+
TEXT: string;
|
|
234
|
+
};
|
|
235
|
+
INSUFFICIENT_STORAGE: {
|
|
236
|
+
CODE: number;
|
|
237
|
+
TEXT: string;
|
|
238
|
+
};
|
|
239
|
+
LOOP_DETECTED: {
|
|
240
|
+
CODE: number;
|
|
241
|
+
TEXT: string;
|
|
242
|
+
};
|
|
243
|
+
NOT_EXTENDED: {
|
|
244
|
+
CODE: number;
|
|
245
|
+
TEXT: string;
|
|
246
|
+
};
|
|
247
|
+
NETWORK_AUTH_REQUIRED: {
|
|
248
|
+
CODE: number;
|
|
249
|
+
TEXT: string;
|
|
250
|
+
};
|
|
251
|
+
};
|
|
252
|
+
static findByCode(code: number | string): {
|
|
253
|
+
CODE: number;
|
|
254
|
+
TEXT: string;
|
|
255
|
+
_TYPE: string;
|
|
256
|
+
_KEY: string;
|
|
257
|
+
} | null;
|
|
258
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@marianmeres/http-utils",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Misc DRY http fetch related helpers",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -9,6 +9,9 @@
|
|
|
9
9
|
"require": "./dist/index.cjs",
|
|
10
10
|
"import": "./dist/index.js"
|
|
11
11
|
},
|
|
12
|
+
"files": [
|
|
13
|
+
"dist"
|
|
14
|
+
],
|
|
12
15
|
"scripts": {
|
|
13
16
|
"clean": "rimraf dist/*",
|
|
14
17
|
"prettier": "prettier --write \"{src,tests}/**/*.{js,ts,json}\"",
|
package/.editorconfig
DELETED
package/.prettierignore
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
/node_modules/
|
package/.prettierrc.yaml
DELETED
package/rollup.config.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import typescript from '@rollup/plugin-typescript';
|
|
3
|
-
|
|
4
|
-
const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8'))
|
|
5
|
-
|
|
6
|
-
export default [
|
|
7
|
-
{
|
|
8
|
-
input: 'src/index.ts',
|
|
9
|
-
plugins: [ typescript() ],
|
|
10
|
-
output: [
|
|
11
|
-
{ file: pkg.main, format: 'cjs' },
|
|
12
|
-
{ file: pkg.module, format: 'es' }
|
|
13
|
-
]
|
|
14
|
-
}
|
|
15
|
-
];
|