@gcmdev/faxios 0.1.0 → 0.2.1

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.
Files changed (210) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +40 -1774
  3. package/dist/index.d.ts +9 -6
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/adapters/fetch-helpers.d.ts +1 -0
  7. package/dist/lib/adapters/fetch-helpers.d.ts.map +1 -0
  8. package/dist/lib/adapters/fetch.d.ts +1 -0
  9. package/dist/lib/adapters/fetch.d.ts.map +1 -0
  10. package/dist/lib/adapters/fetch.js +23 -3
  11. package/dist/lib/adapters/fetch.js.map +1 -1
  12. package/dist/lib/cancel/CanceledError.d.ts +1 -0
  13. package/dist/lib/cancel/CanceledError.d.ts.map +1 -0
  14. package/dist/lib/cancel/isCancel.d.ts +3 -1
  15. package/dist/lib/cancel/isCancel.d.ts.map +1 -0
  16. package/dist/lib/cancel/isCancel.js +3 -0
  17. package/dist/lib/cancel/isCancel.js.map +1 -1
  18. package/dist/lib/core/Faxios.d.ts +6 -17
  19. package/dist/lib/core/Faxios.d.ts.map +1 -0
  20. package/dist/lib/core/Faxios.js +144 -76
  21. package/dist/lib/core/Faxios.js.map +1 -1
  22. package/dist/lib/core/FaxiosError.d.ts +19 -6
  23. package/dist/lib/core/FaxiosError.d.ts.map +1 -0
  24. package/dist/lib/core/FaxiosError.js +16 -1
  25. package/dist/lib/core/FaxiosError.js.map +1 -1
  26. package/dist/lib/core/FaxiosHeaders.d.ts +12 -8
  27. package/dist/lib/core/FaxiosHeaders.d.ts.map +1 -0
  28. package/dist/lib/core/FaxiosHeaders.js +1 -0
  29. package/dist/lib/core/FaxiosHeaders.js.map +1 -1
  30. package/dist/lib/core/buildFullPath.d.ts +1 -0
  31. package/dist/lib/core/buildFullPath.d.ts.map +1 -0
  32. package/dist/lib/core/define.d.ts +19 -2
  33. package/dist/lib/core/define.d.ts.map +1 -0
  34. package/dist/lib/core/define.js.map +1 -1
  35. package/dist/lib/core/dispatchRequest.d.ts +1 -0
  36. package/dist/lib/core/dispatchRequest.d.ts.map +1 -0
  37. package/dist/lib/core/dispatchRequest.js +4 -0
  38. package/dist/lib/core/dispatchRequest.js.map +1 -1
  39. package/dist/lib/core/mergeConfig.d.ts +1 -0
  40. package/dist/lib/core/mergeConfig.d.ts.map +1 -0
  41. package/dist/lib/core/prepareRequest.d.ts +1 -0
  42. package/dist/lib/core/prepareRequest.d.ts.map +1 -0
  43. package/dist/lib/core/prepareRequest.js +1 -20
  44. package/dist/lib/core/prepareRequest.js.map +1 -1
  45. package/dist/lib/core/route.d.ts +11 -2
  46. package/dist/lib/core/route.d.ts.map +1 -0
  47. package/dist/lib/core/route.js.map +1 -1
  48. package/dist/lib/core/settle.d.ts +1 -0
  49. package/dist/lib/core/settle.d.ts.map +1 -0
  50. package/dist/lib/core/transformData.d.ts +1 -0
  51. package/dist/lib/core/transformData.d.ts.map +1 -0
  52. package/dist/lib/core/validateSchema.d.ts +1 -0
  53. package/dist/lib/core/validateSchema.d.ts.map +1 -0
  54. package/dist/lib/defaults/index.d.ts +1 -0
  55. package/dist/lib/defaults/index.d.ts.map +1 -0
  56. package/dist/lib/defaults/index.js +3 -3
  57. package/dist/lib/defaults/index.js.map +1 -1
  58. package/dist/lib/defaults/transitional.d.ts +1 -1
  59. package/dist/lib/defaults/transitional.d.ts.map +1 -0
  60. package/dist/lib/defaults/transitional.js +0 -1
  61. package/dist/lib/defaults/transitional.js.map +1 -1
  62. package/dist/lib/env/data.d.ts +2 -1
  63. package/dist/lib/env/data.d.ts.map +1 -0
  64. package/dist/lib/env/data.js +1 -1
  65. package/dist/lib/env/data.js.map +1 -1
  66. package/dist/lib/faxios.d.ts +115 -48
  67. package/dist/lib/faxios.d.ts.map +1 -0
  68. package/dist/lib/faxios.js +14 -2
  69. package/dist/lib/faxios.js.map +1 -1
  70. package/dist/lib/helpers/FaxiosURLSearchParams.d.ts +3 -1
  71. package/dist/lib/helpers/FaxiosURLSearchParams.d.ts.map +1 -0
  72. package/dist/lib/helpers/FaxiosURLSearchParams.js.map +1 -1
  73. package/dist/lib/helpers/HttpStatusCode.d.ts +1 -0
  74. package/dist/lib/helpers/HttpStatusCode.d.ts.map +1 -0
  75. package/dist/lib/helpers/buildURL.d.ts +1 -0
  76. package/dist/lib/helpers/buildURL.d.ts.map +1 -0
  77. package/dist/lib/helpers/buildURL.js +7 -1
  78. package/dist/lib/helpers/buildURL.js.map +1 -1
  79. package/dist/lib/helpers/cloneConfig.d.ts +4 -0
  80. package/dist/lib/helpers/cloneConfig.d.ts.map +1 -0
  81. package/dist/lib/helpers/cloneConfig.js +21 -0
  82. package/dist/lib/helpers/cloneConfig.js.map +1 -0
  83. package/dist/lib/helpers/combineURLs.d.ts +1 -0
  84. package/dist/lib/helpers/combineURLs.d.ts.map +1 -0
  85. package/dist/lib/helpers/composeSignals.d.ts +1 -0
  86. package/dist/lib/helpers/composeSignals.d.ts.map +1 -0
  87. package/dist/lib/helpers/composeSignals.js +8 -1
  88. package/dist/lib/helpers/composeSignals.js.map +1 -1
  89. package/dist/lib/helpers/cookies.d.ts +1 -0
  90. package/dist/lib/helpers/cookies.d.ts.map +1 -0
  91. package/dist/lib/helpers/estimateDataURLDecodedBytes.d.ts +1 -0
  92. package/dist/lib/helpers/estimateDataURLDecodedBytes.d.ts.map +1 -0
  93. package/dist/lib/helpers/formDataToJSON.d.ts +1 -0
  94. package/dist/lib/helpers/formDataToJSON.d.ts.map +1 -0
  95. package/dist/lib/helpers/isAbsoluteURL.d.ts +1 -0
  96. package/dist/lib/helpers/isAbsoluteURL.d.ts.map +1 -0
  97. package/dist/lib/helpers/isFaxiosError.d.ts +8 -2
  98. package/dist/lib/helpers/isFaxiosError.d.ts.map +1 -0
  99. package/dist/lib/helpers/isFaxiosError.js +5 -1
  100. package/dist/lib/helpers/isFaxiosError.js.map +1 -1
  101. package/dist/lib/helpers/isURLSameOrigin.d.ts +1 -0
  102. package/dist/lib/helpers/isURLSameOrigin.d.ts.map +1 -0
  103. package/dist/lib/helpers/parseHeaders.d.ts +1 -0
  104. package/dist/lib/helpers/parseHeaders.d.ts.map +1 -0
  105. package/dist/lib/helpers/progressEventReducer.d.ts +1 -0
  106. package/dist/lib/helpers/progressEventReducer.d.ts.map +1 -0
  107. package/dist/lib/helpers/sanitizeHeaderValue.d.ts +1 -0
  108. package/dist/lib/helpers/sanitizeHeaderValue.d.ts.map +1 -0
  109. package/dist/lib/helpers/speedometer.d.ts +1 -0
  110. package/dist/lib/helpers/speedometer.d.ts.map +1 -0
  111. package/dist/lib/helpers/substitutePathParams.d.ts +1 -0
  112. package/dist/lib/helpers/substitutePathParams.d.ts.map +1 -0
  113. package/dist/lib/helpers/throttle.d.ts +1 -0
  114. package/dist/lib/helpers/throttle.d.ts.map +1 -0
  115. package/dist/lib/helpers/toFormData.d.ts +1 -0
  116. package/dist/lib/helpers/toFormData.d.ts.map +1 -0
  117. package/dist/lib/helpers/toURLEncodedForm.d.ts +1 -0
  118. package/dist/lib/helpers/toURLEncodedForm.d.ts.map +1 -0
  119. package/dist/lib/helpers/trackStream.d.ts +1 -0
  120. package/dist/lib/helpers/trackStream.d.ts.map +1 -0
  121. package/dist/lib/helpers/validator.d.ts +1 -0
  122. package/dist/lib/helpers/validator.d.ts.map +1 -0
  123. package/dist/lib/platform.d.ts +2 -1
  124. package/dist/lib/platform.d.ts.map +1 -0
  125. package/dist/lib/plugins/attempt.d.ts +2 -0
  126. package/dist/lib/plugins/attempt.d.ts.map +1 -0
  127. package/dist/lib/plugins/attempt.js +4 -0
  128. package/dist/lib/plugins/attempt.js.map +1 -0
  129. package/dist/lib/plugins/authBearer.d.ts +31 -0
  130. package/dist/lib/plugins/authBearer.d.ts.map +1 -0
  131. package/dist/lib/plugins/authBearer.js +99 -0
  132. package/dist/lib/plugins/authBearer.js.map +1 -0
  133. package/dist/lib/plugins/definePlugin.d.ts +22 -0
  134. package/dist/lib/plugins/definePlugin.d.ts.map +1 -0
  135. package/dist/lib/plugins/definePlugin.js +14 -0
  136. package/dist/lib/plugins/definePlugin.js.map +1 -0
  137. package/dist/lib/plugins/retry.d.ts +66 -0
  138. package/dist/lib/plugins/retry.d.ts.map +1 -0
  139. package/dist/lib/plugins/retry.js +168 -0
  140. package/dist/lib/plugins/retry.js.map +1 -0
  141. package/dist/lib/plugins/timing.d.ts +32 -0
  142. package/dist/lib/plugins/timing.d.ts.map +1 -0
  143. package/dist/lib/plugins/timing.js +53 -0
  144. package/dist/lib/plugins/timing.js.map +1 -0
  145. package/dist/lib/types/standard-schema.d.ts +1 -0
  146. package/dist/lib/types/standard-schema.d.ts.map +1 -0
  147. package/dist/lib/types.d.ts +125 -34
  148. package/dist/lib/types.d.ts.map +1 -0
  149. package/dist/lib/utils.d.ts +1 -0
  150. package/dist/lib/utils.d.ts.map +1 -0
  151. package/package.json +42 -19
  152. package/skills/configure-requests/SKILL.md +380 -0
  153. package/skills/configure-requests/references/axios-differences.md +67 -0
  154. package/skills/configure-requests/references/plugins.md +127 -0
  155. package/src/index.ts +57 -0
  156. package/src/lib/adapters/fetch-helpers.ts +167 -0
  157. package/src/lib/adapters/fetch.ts +810 -0
  158. package/src/lib/cancel/CanceledError.ts +23 -0
  159. package/src/lib/cancel/isCancel.ts +10 -0
  160. package/src/lib/core/Faxios.ts +513 -0
  161. package/src/lib/core/FaxiosError.ts +283 -0
  162. package/src/lib/core/FaxiosHeaders.ts +529 -0
  163. package/src/lib/core/buildFullPath.ts +51 -0
  164. package/src/lib/core/define.ts +127 -0
  165. package/src/lib/core/dispatchRequest.ts +171 -0
  166. package/src/lib/core/mergeConfig.ts +175 -0
  167. package/src/lib/core/prepareRequest.ts +155 -0
  168. package/src/lib/core/route.ts +68 -0
  169. package/src/lib/core/settle.ts +20 -0
  170. package/src/lib/core/transformData.ts +23 -0
  171. package/src/lib/core/validateSchema.ts +53 -0
  172. package/src/lib/defaults/index.ts +221 -0
  173. package/src/lib/defaults/transitional.ts +9 -0
  174. package/src/lib/env/data.ts +1 -0
  175. package/src/lib/faxios.ts +306 -0
  176. package/src/lib/helpers/FaxiosURLSearchParams.ts +52 -0
  177. package/src/lib/helpers/HttpStatusCode.ts +77 -0
  178. package/src/lib/helpers/buildURL.ts +77 -0
  179. package/src/lib/helpers/cloneConfig.ts +23 -0
  180. package/src/lib/helpers/combineURLs.ts +11 -0
  181. package/src/lib/helpers/composeSignals.ts +74 -0
  182. package/src/lib/helpers/cookies.ts +68 -0
  183. package/src/lib/helpers/deprecatedMethod.ts +32 -0
  184. package/src/lib/helpers/estimateDataURLDecodedBytes.ts +95 -0
  185. package/src/lib/helpers/formDataToJSON.ts +122 -0
  186. package/src/lib/helpers/isAbsoluteURL.ts +13 -0
  187. package/src/lib/helpers/isFaxiosError.ts +19 -0
  188. package/src/lib/helpers/isURLSameOrigin.ts +16 -0
  189. package/src/lib/helpers/parseHeaders.ts +76 -0
  190. package/src/lib/helpers/progressEventReducer.ts +57 -0
  191. package/src/lib/helpers/sanitizeHeaderValue.ts +61 -0
  192. package/src/lib/helpers/speedometer.ts +55 -0
  193. package/src/lib/helpers/substitutePathParams.ts +13 -0
  194. package/src/lib/helpers/throttle.ts +45 -0
  195. package/src/lib/helpers/toFormData.ts +296 -0
  196. package/src/lib/helpers/toURLEncodedForm.ts +14 -0
  197. package/src/lib/helpers/trackStream.ts +123 -0
  198. package/src/lib/helpers/validator.ts +114 -0
  199. package/src/lib/platform.ts +44 -0
  200. package/src/lib/plugins/attempt.ts +3 -0
  201. package/src/lib/plugins/authBearer.ts +124 -0
  202. package/src/lib/plugins/definePlugin.ts +34 -0
  203. package/src/lib/plugins/retry.ts +245 -0
  204. package/src/lib/plugins/timing.ts +76 -0
  205. package/src/lib/types/standard-schema.ts +58 -0
  206. package/src/lib/types.ts +496 -0
  207. package/src/lib/utils.ts +932 -0
  208. package/dist/lib/core/InterceptorManager.d.ts +0 -9
  209. package/dist/lib/core/InterceptorManager.js +0 -28
  210. package/dist/lib/core/InterceptorManager.js.map +0 -1
@@ -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 { StandardSchemaV1 } from "../types/standard-schema.js";
5
+ import type { InternalFaxiosRequestConfig, FaxiosResponse } from "../types.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_REQUEST_SCHEMA
251
+ | typeof FaxiosError.ERR_BAD_PARAMS_SCHEMA
252
+ | typeof FaxiosError.ERR_BAD_PATH_PARAMS_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;