@gcmdev/faxios 0.2.0 → 0.2.2
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/LICENSE +8 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/adapters/fetch-helpers.d.ts +2 -1
- package/dist/lib/adapters/fetch-helpers.d.ts.map +1 -0
- package/dist/lib/adapters/fetch.d.ts +1 -0
- package/dist/lib/adapters/fetch.d.ts.map +1 -0
- package/dist/lib/adapters/fetch.js +86 -26
- package/dist/lib/adapters/fetch.js.map +1 -1
- package/dist/lib/cancel/CanceledError.d.ts +2 -1
- package/dist/lib/cancel/CanceledError.d.ts.map +1 -0
- package/dist/lib/cancel/isCancel.d.ts +1 -0
- package/dist/lib/cancel/isCancel.d.ts.map +1 -0
- package/dist/lib/core/Faxios.d.ts +4 -3
- package/dist/lib/core/Faxios.d.ts.map +1 -0
- package/dist/lib/core/Faxios.js +8 -4
- package/dist/lib/core/Faxios.js.map +1 -1
- package/dist/lib/core/FaxiosError.d.ts +3 -2
- package/dist/lib/core/FaxiosError.d.ts.map +1 -0
- package/dist/lib/core/FaxiosHeaders.d.ts +9 -8
- package/dist/lib/core/FaxiosHeaders.d.ts.map +1 -0
- package/dist/lib/core/buildFullPath.d.ts +1 -0
- package/dist/lib/core/buildFullPath.d.ts.map +1 -0
- package/dist/lib/core/define.d.ts +20 -3
- package/dist/lib/core/define.d.ts.map +1 -0
- package/dist/lib/core/define.js.map +1 -1
- package/dist/lib/core/dispatchRequest.d.ts +2 -1
- package/dist/lib/core/dispatchRequest.d.ts.map +1 -0
- package/dist/lib/core/mergeConfig.d.ts +3 -2
- package/dist/lib/core/mergeConfig.d.ts.map +1 -0
- package/dist/lib/core/mergeConfig.js +40 -2
- package/dist/lib/core/mergeConfig.js.map +1 -1
- package/dist/lib/core/prepareRequest.d.ts +1 -0
- package/dist/lib/core/prepareRequest.d.ts.map +1 -0
- package/dist/lib/core/route.d.ts +10 -1
- package/dist/lib/core/route.d.ts.map +1 -0
- package/dist/lib/core/route.js +2 -5
- package/dist/lib/core/route.js.map +1 -1
- package/dist/lib/core/settle.d.ts +1 -0
- package/dist/lib/core/settle.d.ts.map +1 -0
- package/dist/lib/core/transformData.d.ts +3 -2
- package/dist/lib/core/transformData.d.ts.map +1 -0
- package/dist/lib/core/validateSchema.d.ts +3 -2
- package/dist/lib/core/validateSchema.d.ts.map +1 -0
- package/dist/lib/defaults/index.d.ts +1 -0
- package/dist/lib/defaults/index.d.ts.map +1 -0
- package/dist/lib/defaults/transitional.d.ts +1 -0
- package/dist/lib/defaults/transitional.d.ts.map +1 -0
- package/dist/lib/env/data.d.ts +2 -1
- package/dist/lib/env/data.d.ts.map +1 -0
- package/dist/lib/env/data.js +1 -1
- package/dist/lib/faxios.d.ts +59 -38
- package/dist/lib/faxios.d.ts.map +1 -0
- package/dist/lib/faxios.js.map +1 -1
- package/dist/lib/helpers/FaxiosURLSearchParams.d.ts +1 -0
- package/dist/lib/helpers/FaxiosURLSearchParams.d.ts.map +1 -0
- package/dist/lib/helpers/HttpStatusCode.d.ts +1 -0
- package/dist/lib/helpers/HttpStatusCode.d.ts.map +1 -0
- package/dist/lib/helpers/buildURL.d.ts +1 -0
- package/dist/lib/helpers/buildURL.d.ts.map +1 -0
- package/dist/lib/helpers/cloneConfig.d.ts +1 -1
- package/dist/lib/helpers/cloneConfig.d.ts.map +1 -0
- package/dist/lib/helpers/cloneConfig.js +2 -2
- package/dist/lib/helpers/cloneConfig.js.map +1 -1
- package/dist/lib/helpers/combineURLs.d.ts +1 -0
- package/dist/lib/helpers/combineURLs.d.ts.map +1 -0
- package/dist/lib/helpers/composeSignals.d.ts +1 -0
- package/dist/lib/helpers/composeSignals.d.ts.map +1 -0
- package/dist/lib/helpers/cookies.d.ts +2 -1
- package/dist/lib/helpers/cookies.d.ts.map +1 -0
- package/dist/lib/helpers/estimateDataURLDecodedBytes.d.ts +1 -0
- package/dist/lib/helpers/estimateDataURLDecodedBytes.d.ts.map +1 -0
- package/dist/lib/helpers/formDataToJSON.d.ts +2 -1
- package/dist/lib/helpers/formDataToJSON.d.ts.map +1 -0
- package/dist/lib/helpers/formDataToJSON.js +1 -1
- package/dist/lib/helpers/formDataToJSON.js.map +1 -1
- package/dist/lib/helpers/isAbsoluteURL.d.ts +1 -0
- package/dist/lib/helpers/isAbsoluteURL.d.ts.map +1 -0
- package/dist/lib/helpers/isFaxiosError.d.ts +1 -0
- package/dist/lib/helpers/isFaxiosError.d.ts.map +1 -0
- package/dist/lib/helpers/isURLSameOrigin.d.ts +1 -0
- package/dist/lib/helpers/isURLSameOrigin.d.ts.map +1 -0
- package/dist/lib/helpers/parseHeaders.d.ts +2 -1
- package/dist/lib/helpers/parseHeaders.d.ts.map +1 -0
- package/dist/lib/helpers/progressEventReducer.d.ts +1 -0
- package/dist/lib/helpers/progressEventReducer.d.ts.map +1 -0
- package/dist/lib/helpers/sanitizeHeaderValue.d.ts +1 -0
- package/dist/lib/helpers/sanitizeHeaderValue.d.ts.map +1 -0
- package/dist/lib/helpers/speedometer.d.ts +1 -0
- package/dist/lib/helpers/speedometer.d.ts.map +1 -0
- package/dist/lib/helpers/substitutePathParams.d.ts +1 -0
- package/dist/lib/helpers/substitutePathParams.d.ts.map +1 -0
- package/dist/lib/helpers/substitutePathParams.js +11 -3
- package/dist/lib/helpers/substitutePathParams.js.map +1 -1
- package/dist/lib/helpers/throttle.d.ts +1 -0
- package/dist/lib/helpers/throttle.d.ts.map +1 -0
- package/dist/lib/helpers/toFormData.d.ts +1 -0
- package/dist/lib/helpers/toFormData.d.ts.map +1 -0
- package/dist/lib/helpers/toFormData.js +4 -2
- package/dist/lib/helpers/toFormData.js.map +1 -1
- package/dist/lib/helpers/toURLEncodedForm.d.ts +1 -0
- package/dist/lib/helpers/toURLEncodedForm.d.ts.map +1 -0
- package/dist/lib/helpers/trackStream.d.ts +1 -0
- package/dist/lib/helpers/trackStream.d.ts.map +1 -0
- package/dist/lib/helpers/validator.d.ts +2 -1
- package/dist/lib/helpers/validator.d.ts.map +1 -0
- package/dist/lib/platform.d.ts +1 -0
- package/dist/lib/platform.d.ts.map +1 -0
- package/dist/lib/plugins/attempt.d.ts +1 -0
- package/dist/lib/plugins/attempt.d.ts.map +1 -0
- package/dist/lib/plugins/authBearer.d.ts +10 -5
- package/dist/lib/plugins/authBearer.d.ts.map +1 -0
- package/dist/lib/plugins/authBearer.js +6 -0
- package/dist/lib/plugins/authBearer.js.map +1 -1
- package/dist/lib/plugins/definePlugin.d.ts +4 -3
- package/dist/lib/plugins/definePlugin.d.ts.map +1 -0
- package/dist/lib/plugins/retry.d.ts +24 -23
- package/dist/lib/plugins/retry.d.ts.map +1 -0
- package/dist/lib/plugins/timing.d.ts +9 -8
- package/dist/lib/plugins/timing.d.ts.map +1 -0
- package/dist/lib/types/standard-schema.d.ts +7 -6
- package/dist/lib/types/standard-schema.d.ts.map +1 -0
- package/dist/lib/types.d.ts +104 -92
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/utils.d.ts +5 -3
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +9 -2
- package/dist/lib/utils.js.map +1 -1
- package/package.json +8 -4
- package/skills/configure-requests/SKILL.md +53 -8
- package/skills/configure-requests/references/plugins.md +54 -6
- package/src/index.ts +57 -0
- package/src/lib/adapters/fetch-helpers.ts +167 -0
- package/src/lib/adapters/fetch.ts +871 -0
- package/src/lib/cancel/CanceledError.ts +23 -0
- package/src/lib/cancel/isCancel.ts +10 -0
- package/src/lib/core/Faxios.ts +517 -0
- package/src/lib/core/FaxiosError.ts +283 -0
- package/src/lib/core/FaxiosHeaders.ts +529 -0
- package/src/lib/core/buildFullPath.ts +51 -0
- package/src/lib/core/define.ts +127 -0
- package/src/lib/core/dispatchRequest.ts +171 -0
- package/src/lib/core/mergeConfig.ts +213 -0
- package/src/lib/core/prepareRequest.ts +155 -0
- package/src/lib/core/route.ts +65 -0
- package/src/lib/core/settle.ts +20 -0
- package/src/lib/core/transformData.ts +23 -0
- package/src/lib/core/validateSchema.ts +53 -0
- package/src/lib/defaults/index.ts +221 -0
- package/src/lib/defaults/transitional.ts +9 -0
- package/src/lib/env/data.ts +1 -0
- package/src/lib/faxios.ts +306 -0
- package/src/lib/helpers/FaxiosURLSearchParams.ts +52 -0
- package/src/lib/helpers/HttpStatusCode.ts +77 -0
- package/src/lib/helpers/buildURL.ts +77 -0
- package/src/lib/helpers/cloneConfig.ts +22 -0
- package/src/lib/helpers/combineURLs.ts +11 -0
- package/src/lib/helpers/composeSignals.ts +74 -0
- package/src/lib/helpers/cookies.ts +68 -0
- package/src/lib/helpers/deprecatedMethod.ts +32 -0
- package/src/lib/helpers/estimateDataURLDecodedBytes.ts +95 -0
- package/src/lib/helpers/formDataToJSON.ts +122 -0
- package/src/lib/helpers/isAbsoluteURL.ts +13 -0
- package/src/lib/helpers/isFaxiosError.ts +19 -0
- package/src/lib/helpers/isURLSameOrigin.ts +16 -0
- package/src/lib/helpers/parseHeaders.ts +76 -0
- package/src/lib/helpers/progressEventReducer.ts +57 -0
- package/src/lib/helpers/sanitizeHeaderValue.ts +61 -0
- package/src/lib/helpers/speedometer.ts +55 -0
- package/src/lib/helpers/substitutePathParams.ts +23 -0
- package/src/lib/helpers/throttle.ts +45 -0
- package/src/lib/helpers/toFormData.ts +298 -0
- package/src/lib/helpers/toURLEncodedForm.ts +14 -0
- package/src/lib/helpers/trackStream.ts +123 -0
- package/src/lib/helpers/validator.ts +114 -0
- package/src/lib/platform.ts +44 -0
- package/src/lib/plugins/attempt.ts +3 -0
- package/src/lib/plugins/authBearer.ts +129 -0
- package/src/lib/plugins/definePlugin.ts +34 -0
- package/src/lib/plugins/retry.ts +245 -0
- package/src/lib/plugins/timing.ts +76 -0
- package/src/lib/types/standard-schema.ts +58 -0
- package/src/lib/types.ts +496 -0
- package/src/lib/utils.ts +941 -0
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
// @ts-self-types="./FaxiosError.d.ts" — required for Deno: index.d.ts re-exports SchemaValidationError from here
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
import type { FaxiosResponse, InternalFaxiosRequestConfig } from "../types.js";
|
|
5
|
+
import type { StandardSchemaV1 } from "../types/standard-schema.js";
|
|
6
|
+
import utils from "../utils.js";
|
|
7
|
+
import FaxiosHeaders from "./FaxiosHeaders.js";
|
|
8
|
+
|
|
9
|
+
const REDACTED = "[REDACTED ****]";
|
|
10
|
+
|
|
11
|
+
function hasOwnOrPrototypeToJSON(source: unknown): boolean {
|
|
12
|
+
if (utils.hasOwnProp(source, "toJSON")) {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
let prototype = Object.getPrototypeOf(source);
|
|
17
|
+
|
|
18
|
+
while (prototype && prototype !== Object.prototype) {
|
|
19
|
+
if (utils.hasOwnProp(prototype, "toJSON")) {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
prototype = Object.getPrototypeOf(prototype);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Build a plain-object snapshot of `config` and replace the value of any key
|
|
30
|
+
// (case-insensitive) listed in `redactKeys` with REDACTED. Walks through arrays
|
|
31
|
+
// and FaxiosHeaders, and short-circuits on circular references.
|
|
32
|
+
function redactConfig(config: unknown, redactKeys: Array<string>): unknown {
|
|
33
|
+
const lowerKeys = new Set(redactKeys.map(k => String(k).toLowerCase()));
|
|
34
|
+
const seen: Array<object> = [];
|
|
35
|
+
|
|
36
|
+
const visitObject = (source: object): Record<string, unknown> => {
|
|
37
|
+
const result: Record<string, unknown> = Object.create(null);
|
|
38
|
+
for (const [ key, value ] of Object.entries(source)) {
|
|
39
|
+
const reducedValue = lowerKeys.has(key.toLowerCase())
|
|
40
|
+
? REDACTED
|
|
41
|
+
: visit(value);
|
|
42
|
+
if (!utils.isUndefined(reducedValue)) {
|
|
43
|
+
result[key] = reducedValue;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return result;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const visit = (source: unknown): unknown => {
|
|
50
|
+
if (source === null || typeof source !== "object") return source;
|
|
51
|
+
if (utils.isBuffer(source)) return source;
|
|
52
|
+
if (seen.indexOf(source) !== -1) return undefined;
|
|
53
|
+
|
|
54
|
+
if (source instanceof FaxiosHeaders) {
|
|
55
|
+
source = source.toJSON();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
seen.push(source as object);
|
|
59
|
+
|
|
60
|
+
let result: unknown;
|
|
61
|
+
if (utils.isArray(source)) {
|
|
62
|
+
result = [];
|
|
63
|
+
(source as Array<unknown>).forEach((v, i) => {
|
|
64
|
+
const reducedValue = visit(v);
|
|
65
|
+
if (!utils.isUndefined(reducedValue)) {
|
|
66
|
+
(result as Array<unknown>)[i] = reducedValue;
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
if (!utils.isPlainObject(source) && hasOwnOrPrototypeToJSON(source)) {
|
|
72
|
+
seen.pop();
|
|
73
|
+
return source;
|
|
74
|
+
}
|
|
75
|
+
result = visitObject(source as object);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
seen.pop();
|
|
79
|
+
return result;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
return visit(config);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
class FaxiosError<T = unknown, D = unknown> extends Error {
|
|
86
|
+
isFaxiosError: boolean;
|
|
87
|
+
code?: string;
|
|
88
|
+
config?: InternalFaxiosRequestConfig<D>;
|
|
89
|
+
request?: unknown;
|
|
90
|
+
response?: FaxiosResponse<T, D>;
|
|
91
|
+
status?: number;
|
|
92
|
+
override cause?: Error;
|
|
93
|
+
issues?: ReadonlyArray<StandardSchemaV1.Issue>;
|
|
94
|
+
// legacy/cross-browser optional props:
|
|
95
|
+
description?: unknown;
|
|
96
|
+
number?: unknown;
|
|
97
|
+
fileName?: unknown;
|
|
98
|
+
lineNumber?: unknown;
|
|
99
|
+
columnNumber?: unknown;
|
|
100
|
+
event?: unknown;
|
|
101
|
+
override name: string;
|
|
102
|
+
|
|
103
|
+
static readonly ERR_BAD_OPTION_VALUE = "ERR_BAD_OPTION_VALUE";
|
|
104
|
+
static readonly ERR_BAD_OPTION = "ERR_BAD_OPTION";
|
|
105
|
+
static readonly ECONNABORTED = "ECONNABORTED";
|
|
106
|
+
static readonly ETIMEDOUT = "ETIMEDOUT";
|
|
107
|
+
static readonly ECONNREFUSED = "ECONNREFUSED";
|
|
108
|
+
static readonly ERR_NETWORK = "ERR_NETWORK";
|
|
109
|
+
static readonly ERR_FR_TOO_MANY_REDIRECTS = "ERR_FR_TOO_MANY_REDIRECTS";
|
|
110
|
+
static readonly ERR_DEPRECATED = "ERR_DEPRECATED";
|
|
111
|
+
static readonly ERR_BAD_RESPONSE = "ERR_BAD_RESPONSE";
|
|
112
|
+
static readonly ERR_BAD_REQUEST = "ERR_BAD_REQUEST";
|
|
113
|
+
static readonly ERR_CANCELED = "ERR_CANCELED";
|
|
114
|
+
static readonly ERR_NOT_SUPPORT = "ERR_NOT_SUPPORT";
|
|
115
|
+
static readonly ERR_INVALID_URL = "ERR_INVALID_URL";
|
|
116
|
+
static readonly ERR_FORM_DATA_DEPTH_EXCEEDED = "ERR_FORM_DATA_DEPTH_EXCEEDED";
|
|
117
|
+
static readonly ERR_BAD_RESPONSE_SCHEMA = "ERR_BAD_RESPONSE_SCHEMA";
|
|
118
|
+
static readonly ERR_BAD_REQUEST_SCHEMA = "ERR_BAD_REQUEST_SCHEMA";
|
|
119
|
+
static readonly ERR_BAD_PARAMS_SCHEMA = "ERR_BAD_PARAMS_SCHEMA";
|
|
120
|
+
static readonly ERR_BAD_PATH_PARAMS_SCHEMA = "ERR_BAD_PATH_PARAMS_SCHEMA";
|
|
121
|
+
|
|
122
|
+
static from(
|
|
123
|
+
error: Error & { code?: string; status?: number; },
|
|
124
|
+
code?: string,
|
|
125
|
+
config?: InternalFaxiosRequestConfig,
|
|
126
|
+
request?: unknown,
|
|
127
|
+
response?: FaxiosResponse,
|
|
128
|
+
customProps?: Record<string, unknown>
|
|
129
|
+
): FaxiosError {
|
|
130
|
+
const faxiosError = new FaxiosError(
|
|
131
|
+
error.message,
|
|
132
|
+
code || error.code,
|
|
133
|
+
config,
|
|
134
|
+
request,
|
|
135
|
+
response
|
|
136
|
+
);
|
|
137
|
+
faxiosError.cause = error;
|
|
138
|
+
faxiosError.name = error.name;
|
|
139
|
+
|
|
140
|
+
// Preserve status from the original error if not already set from response
|
|
141
|
+
if (error.status != null && faxiosError.status == null) {
|
|
142
|
+
faxiosError.status = error.status;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
customProps && Object.assign(faxiosError, customProps);
|
|
146
|
+
return faxiosError;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Create an Error with the specified message, config, error code, request and response.
|
|
151
|
+
*
|
|
152
|
+
* @param {string} message The error message.
|
|
153
|
+
* @param {string} [code] The error code (for example, 'ECONNABORTED').
|
|
154
|
+
* @param {Object} [config] The config.
|
|
155
|
+
* @param {Object} [request] The request.
|
|
156
|
+
* @param {Object} [response] The response.
|
|
157
|
+
*
|
|
158
|
+
* @returns {Error} The created error.
|
|
159
|
+
*/
|
|
160
|
+
constructor(
|
|
161
|
+
message: string,
|
|
162
|
+
code?: string,
|
|
163
|
+
config?: InternalFaxiosRequestConfig<D>,
|
|
164
|
+
request?: unknown,
|
|
165
|
+
response?: FaxiosResponse<T, D>
|
|
166
|
+
) {
|
|
167
|
+
super(message);
|
|
168
|
+
|
|
169
|
+
// Make message enumerable to maintain backward compatibility
|
|
170
|
+
// The native Error constructor sets message as non-enumerable,
|
|
171
|
+
// but faxios < v1.13.3 had it as enumerable
|
|
172
|
+
Object.defineProperty(
|
|
173
|
+
this,
|
|
174
|
+
"message",
|
|
175
|
+
Object.assign(Object.create(null) as PropertyDescriptor, {
|
|
176
|
+
value: message,
|
|
177
|
+
enumerable: true,
|
|
178
|
+
writable: true,
|
|
179
|
+
configurable: true,
|
|
180
|
+
})
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
this.name = "FaxiosError";
|
|
184
|
+
this.isFaxiosError = true;
|
|
185
|
+
code && (this.code = code);
|
|
186
|
+
config && (this.config = config);
|
|
187
|
+
request && (this.request = request);
|
|
188
|
+
if (response) {
|
|
189
|
+
this.response = response;
|
|
190
|
+
this.status = response.status;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
toJSON() {
|
|
195
|
+
// Opt-in redaction: when the request config carries a `redact` array, the
|
|
196
|
+
// value of any matching key (case-insensitive, at any depth) is replaced
|
|
197
|
+
// with REDACTED in the serialized snapshot. Undefined or empty leaves the
|
|
198
|
+
// existing serialization behavior unchanged.
|
|
199
|
+
const config = this.config;
|
|
200
|
+
const redactKeys =
|
|
201
|
+
config && utils.hasOwnProp(config, "redact") ? config.redact : undefined;
|
|
202
|
+
const serializedConfig =
|
|
203
|
+
utils.isArray(redactKeys) && redactKeys.length > 0
|
|
204
|
+
? redactConfig(config, redactKeys)
|
|
205
|
+
: utils.toJSONObject(config);
|
|
206
|
+
|
|
207
|
+
return {
|
|
208
|
+
// Standard
|
|
209
|
+
message: this.message,
|
|
210
|
+
name: this.name,
|
|
211
|
+
// Microsoft
|
|
212
|
+
description: this.description,
|
|
213
|
+
number: this.number,
|
|
214
|
+
// Mozilla
|
|
215
|
+
fileName: this.fileName,
|
|
216
|
+
lineNumber: this.lineNumber,
|
|
217
|
+
columnNumber: this.columnNumber,
|
|
218
|
+
stack: this.stack,
|
|
219
|
+
// Faxios
|
|
220
|
+
config: serializedConfig,
|
|
221
|
+
code: this.code,
|
|
222
|
+
status: this.status,
|
|
223
|
+
issues: this.issues,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const SCHEMA_ERROR_CODES: ReadonlySet<string> = new Set([
|
|
229
|
+
FaxiosError.ERR_BAD_RESPONSE_SCHEMA,
|
|
230
|
+
FaxiosError.ERR_BAD_REQUEST_SCHEMA,
|
|
231
|
+
FaxiosError.ERR_BAD_PARAMS_SCHEMA,
|
|
232
|
+
FaxiosError.ERR_BAD_PATH_PARAMS_SCHEMA,
|
|
233
|
+
]);
|
|
234
|
+
|
|
235
|
+
type SchemaIssues = ReadonlyArray<StandardSchemaV1.Issue>;
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Error thrown when a schema rejects a value. Narrow on `code` to tell them apart.
|
|
239
|
+
* For `ERR_BAD_RESPONSE_SCHEMA`, `response` is always present and `response.data`
|
|
240
|
+
* holds the body as it was before validation (after `transformResponse`).
|
|
241
|
+
*/
|
|
242
|
+
export type SchemaValidationError =
|
|
243
|
+
| FaxiosError & {
|
|
244
|
+
code: typeof FaxiosError.ERR_BAD_RESPONSE_SCHEMA;
|
|
245
|
+
issues: SchemaIssues;
|
|
246
|
+
response: FaxiosResponse;
|
|
247
|
+
}
|
|
248
|
+
| FaxiosError & {
|
|
249
|
+
code:
|
|
250
|
+
| typeof FaxiosError.ERR_BAD_PARAMS_SCHEMA
|
|
251
|
+
| typeof FaxiosError.ERR_BAD_PATH_PARAMS_SCHEMA
|
|
252
|
+
| typeof FaxiosError.ERR_BAD_REQUEST_SCHEMA;
|
|
253
|
+
issues: SchemaIssues;
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
function isFaxiosResponse(value: unknown): value is FaxiosResponse {
|
|
257
|
+
if (!utils.isObject(value)) return false;
|
|
258
|
+
const r = value as Record<string, unknown>;
|
|
259
|
+
return (
|
|
260
|
+
utils.hasOwnProp(r, "data") &&
|
|
261
|
+
typeof r.status === "number" &&
|
|
262
|
+
typeof r.statusText === "string" &&
|
|
263
|
+
utils.isObject(r.headers) &&
|
|
264
|
+
utils.isObject(r.config) &&
|
|
265
|
+
// headers is the only required field of InternalFaxiosRequestConfig.
|
|
266
|
+
utils.hasOwnProp(r.config, "headers") &&
|
|
267
|
+
utils.isObject((r.config as Record<string, unknown>).headers)
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
export function isSchemaValidationError(err: unknown): err is SchemaValidationError {
|
|
272
|
+
const e = err as Record<string, unknown>;
|
|
273
|
+
return (
|
|
274
|
+
utils.isObject(err) &&
|
|
275
|
+
e.isFaxiosError === true &&
|
|
276
|
+
typeof e.code === "string" &&
|
|
277
|
+
SCHEMA_ERROR_CODES.has(e.code) &&
|
|
278
|
+
Array.isArray(e.issues) &&
|
|
279
|
+
(e.code !== FaxiosError.ERR_BAD_RESPONSE_SCHEMA || isFaxiosResponse(e.response))
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
export default FaxiosError;
|