@fuman/fetch 0.1.0 → 0.1.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.
@@ -1,5 +1,5 @@
1
- import { FfetchAddon } from './types.js';
2
1
  import { MaybePromise } from '@fuman/utils';
2
+ import { FfetchAddon } from './types.js';
3
3
  export interface RateLimitAddon {
4
4
  rateLimit?: {
5
5
  /**
@@ -1,5 +1,5 @@
1
- import { FfetchAddon } from './types.js';
2
1
  import { MaybePromise } from '@fuman/utils';
2
+ import { FfetchAddon } from './types.js';
3
3
  export interface RateLimitAddon {
4
4
  rateLimit?: {
5
5
  /**
package/ffetch.cjs CHANGED
@@ -66,6 +66,9 @@ class FfetchResultImpl {
66
66
  } catch {
67
67
  }
68
68
  }
69
+ if (this._options.mapError != null) {
70
+ throw this._options.mapError(err);
71
+ }
69
72
  throw err;
70
73
  }
71
74
  return res;
@@ -195,6 +198,8 @@ function createFfetch(baseOptions = {}) {
195
198
  }
196
199
  init.headers = headers;
197
200
  options.validateResponse ??= baseOptions.validateResponse;
201
+ options.readBodyOnError ??= baseOptions.readBodyOnError;
202
+ options.mapError ??= baseOptions.mapError;
198
203
  return new FfetchResultInner(fetcher, url, init, headers, options, stack);
199
204
  };
200
205
  const fn = fn_;
package/ffetch.d.cts CHANGED
@@ -23,6 +23,30 @@ export interface FfetchOptions {
23
23
  * @default true
24
24
  */
25
25
  readBodyOnError?: boolean;
26
+ /**
27
+ * optional function to map the error
28
+ *
29
+ * useful when your API has an app-level error format, and you want to throw a custom error
30
+ *
31
+ * @param err original {@link HttpError} that would have been thrown
32
+ * @returns the error to be thrown instead
33
+ * @example
34
+ * ```ts
35
+ * const api = createFfetch({
36
+ * ...,
37
+ * mapError: (err) => {
38
+ * if (err.response.headers.get('Content-Type') !== 'application/json') return err
39
+ * try {
40
+ * // note: .bodyText is only available if `readBodyOnError` is true
41
+ * const json = JSON.parse(err.bodyText)
42
+ * throw new ApiError(json.errorCode, json.message)
43
+ * } catch {
44
+ * return err
45
+ * }
46
+ * }
47
+ * })
48
+ */
49
+ mapError?: (err: HttpError) => Error;
26
50
  /**
27
51
  * base url to be prepended to the url
28
52
  *
package/ffetch.d.ts CHANGED
@@ -23,6 +23,30 @@ export interface FfetchOptions {
23
23
  * @default true
24
24
  */
25
25
  readBodyOnError?: boolean;
26
+ /**
27
+ * optional function to map the error
28
+ *
29
+ * useful when your API has an app-level error format, and you want to throw a custom error
30
+ *
31
+ * @param err original {@link HttpError} that would have been thrown
32
+ * @returns the error to be thrown instead
33
+ * @example
34
+ * ```ts
35
+ * const api = createFfetch({
36
+ * ...,
37
+ * mapError: (err) => {
38
+ * if (err.response.headers.get('Content-Type') !== 'application/json') return err
39
+ * try {
40
+ * // note: .bodyText is only available if `readBodyOnError` is true
41
+ * const json = JSON.parse(err.bodyText)
42
+ * throw new ApiError(json.errorCode, json.message)
43
+ * } catch {
44
+ * return err
45
+ * }
46
+ * }
47
+ * })
48
+ */
49
+ mapError?: (err: HttpError) => Error;
26
50
  /**
27
51
  * base url to be prepended to the url
28
52
  *
package/ffetch.js CHANGED
@@ -64,6 +64,9 @@ class FfetchResultImpl {
64
64
  } catch {
65
65
  }
66
66
  }
67
+ if (this._options.mapError != null) {
68
+ throw this._options.mapError(err);
69
+ }
67
70
  throw err;
68
71
  }
69
72
  return res;
@@ -193,6 +196,8 @@ function createFfetch(baseOptions = {}) {
193
196
  }
194
197
  init.headers = headers;
195
198
  options.validateResponse ??= baseOptions.validateResponse;
199
+ options.readBodyOnError ??= baseOptions.readBodyOnError;
200
+ options.mapError ??= baseOptions.mapError;
196
201
  return new FfetchResultInner(fetcher, url, init, headers, options, stack);
197
202
  };
198
203
  const fn = fn_;
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@fuman/fetch",
3
3
  "type": "module",
4
- "version": "0.1.0",
4
+ "version": "0.1.1",
5
5
  "description": "tiny wrapper over fetch",
6
6
  "license": "MIT",
7
7
  "dependencies": {
8
- "@fuman/utils": "^0.0.14"
8
+ "@fuman/utils": "^0.0.15"
9
9
  },
10
10
  "peerDependencies": {
11
11
  "@badrap/valita": ">=0.4.0",