@shipengine/js-api 0.52.2 → 0.53.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/client.d.ts CHANGED
@@ -1,9 +1,10 @@
1
- import { AxiosRequestHeaders } from "axios";
1
+ import { AxiosError, AxiosRequestHeaders } from "axios";
2
2
  import { AccountBillingPlanAPI } from "./account-billing-plan";
3
3
  import { AccountSettingsAPI } from "./account-settings";
4
4
  import { AddressesAPI } from "./addresses";
5
5
  import { CarriersAPI } from "./carriers";
6
6
  import { CustomPackagesAPI } from "./custom-packages";
7
+ import { CodedError } from "./errors";
7
8
  import { FundingSourcesAPI } from "./funding-sources";
8
9
  import { InsuranceAPI } from "./insurance";
9
10
  import { LabelsAPI } from "./labels";
@@ -20,6 +21,12 @@ import { WarehousesAPI } from "./warehouses";
20
21
  * # ShipEngine API Client Headers
21
22
  */
22
23
  export type ShipEngineAPIHeaders = AxiosRequestHeaders;
24
+ /**
25
+ * # ShipEngine API axios error response
26
+ */
27
+ export type ApiError = AxiosError<{
28
+ errors: CodedError[];
29
+ } | CodedError[] | CodedError | string>;
23
30
  /**
24
31
  * # ShipEngine API Client Configuration
25
32
  */
@@ -36,6 +43,10 @@ export interface ShipEngineAPIConfig {
36
43
  * `headers` are optional HTTP headers to be sent with all requests.
37
44
  */
38
45
  headers?: ShipEngineAPIHeaders;
46
+ /**
47
+ * `onApiError` is an optional callback function that will be executed whenever there is an error.
48
+ */
49
+ onApiError?: (errors: CodedError[], error: ApiError) => void;
39
50
  }
40
51
  /**
41
52
  * # ShipEngine API Client
@@ -45,7 +56,7 @@ export interface ShipEngineAPIConfig {
45
56
  */
46
57
  export declare class ShipEngineAPI {
47
58
  private client;
48
- constructor(token: string, { baseURL, headers, getToken }: ShipEngineAPIConfig);
59
+ constructor(token: string, { baseURL, headers, getToken, onApiError }: ShipEngineAPIConfig);
49
60
  /**
50
61
  * The `token` method takes in a string and sets it as the Authorization header for all requests.
51
62
  */
package/errors/utils.d.ts CHANGED
@@ -1,3 +1,7 @@
1
1
  import { CodedError } from "./types";
2
2
  export declare const isCodedErrors: (errs: any) => errs is CodedError[];
3
3
  export declare const isCodedError: (err: any) => err is CodedError;
4
+ export declare const isDataCodedErrors: (data: any) => data is {
5
+ errors: CodedError[];
6
+ };
7
+ export declare const parseError: (err: any) => CodedError[];
package/index.js CHANGED
@@ -229,6 +229,21 @@ class AddressesAPI {
229
229
 
230
230
  const isCodedErrors = (errs) => Array.isArray(errs) && errs.every((err) => isCodedError(err));
231
231
  const isCodedError = (err) => !!err.errorCode;
232
+ const isDataCodedErrors = (data) => !!data.errors && isCodedErrors(data.errors);
233
+ const parseError = (err) => {
234
+ var _a;
235
+ if (!((_a = err.response) == null ? void 0 : _a.data))
236
+ return [new CodedError(err.message)];
237
+ if (isDataCodedErrors(err.response.data)) {
238
+ return err.response.data.errors.map((err2) => CodedError.fromObject(err2));
239
+ } else if (isCodedErrors(err.response.data)) {
240
+ return err.response.data.map((err2) => CodedError.fromObject(err2));
241
+ } else if (isCodedError(err.response.data)) {
242
+ return [CodedError.fromObject(err.response.data)];
243
+ } else {
244
+ return [new CodedError(err.message)];
245
+ }
246
+ };
232
247
 
233
248
  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
234
249
 
@@ -3864,6 +3879,7 @@ var __async = (__this, __arguments, generator) => {
3864
3879
  });
3865
3880
  };
3866
3881
  const logger = E({
3882
+ level: process.env.NODE_ENV === "production" ? "fatal" : "info",
3867
3883
  name: "shipengine-api",
3868
3884
  serializers: __spreadProps(__spreadValues({}, k), {
3869
3885
  req: (req) => ({
@@ -3885,9 +3901,8 @@ const logger = E({
3885
3901
  }
3886
3902
  ]
3887
3903
  });
3888
- const isDataCodedErrors = (data) => !!data.errors && isCodedErrors(data.errors);
3889
3904
  class ShipEngineAPI {
3890
- constructor(token, { baseURL, headers, getToken }) {
3905
+ constructor(token, { baseURL, headers, getToken, onApiError }) {
3891
3906
  const client = axios.create({
3892
3907
  baseURL,
3893
3908
  headers: __spreadProps(__spreadValues({}, headers), {
@@ -3938,7 +3953,7 @@ class ShipEngineAPI {
3938
3953
  return res;
3939
3954
  },
3940
3955
  (err) => __async(this, null, function* () {
3941
- var _a, _b, _c, _d, _e, _f, _g;
3956
+ var _a, _b, _c, _d, _e, _f;
3942
3957
  logger.error(
3943
3958
  { err, req: err.config, res: err.response },
3944
3959
  "%s %s: %s %s - %s",
@@ -3957,22 +3972,9 @@ class ShipEngineAPI {
3957
3972
  }
3958
3973
  return axios(config);
3959
3974
  }
3960
- if ((_g = err.response) == null ? void 0 : _g.data) {
3961
- if (isDataCodedErrors(err.response.data)) {
3962
- return Promise.reject(
3963
- err.response.data.errors.map((err2) => CodedError.fromObject(err2))
3964
- );
3965
- }
3966
- if (isCodedErrors(err.response.data)) {
3967
- return Promise.reject(err.response.data.map((err2) => CodedError.fromObject(err2)));
3968
- }
3969
- if (isCodedError(err.response.data)) {
3970
- return Promise.reject([CodedError.fromObject(err.response.data)]);
3971
- }
3972
- return Promise.reject([new CodedError(err.response.data)]);
3973
- } else {
3974
- return Promise.reject([new CodedError(err.message)]);
3975
- }
3975
+ const codedErrors = parseError(err);
3976
+ onApiError == null ? void 0 : onApiError(codedErrors, err);
3977
+ return Promise.reject(codedErrors);
3976
3978
  })
3977
3979
  );
3978
3980
  this.client = client;
@@ -4167,3 +4169,5 @@ exports.WarehousesAPI = WarehousesAPI;
4167
4169
  exports.getEndUserIpAddress = getEndUserIpAddress;
4168
4170
  exports.isCodedError = isCodedError;
4169
4171
  exports.isCodedErrors = isCodedErrors;
4172
+ exports.isDataCodedErrors = isDataCodedErrors;
4173
+ exports.parseError = parseError;
package/index.mjs CHANGED
@@ -225,6 +225,21 @@ class AddressesAPI {
225
225
 
226
226
  const isCodedErrors = (errs) => Array.isArray(errs) && errs.every((err) => isCodedError(err));
227
227
  const isCodedError = (err) => !!err.errorCode;
228
+ const isDataCodedErrors = (data) => !!data.errors && isCodedErrors(data.errors);
229
+ const parseError = (err) => {
230
+ var _a;
231
+ if (!((_a = err.response) == null ? void 0 : _a.data))
232
+ return [new CodedError(err.message)];
233
+ if (isDataCodedErrors(err.response.data)) {
234
+ return err.response.data.errors.map((err2) => CodedError.fromObject(err2));
235
+ } else if (isCodedErrors(err.response.data)) {
236
+ return err.response.data.map((err2) => CodedError.fromObject(err2));
237
+ } else if (isCodedError(err.response.data)) {
238
+ return [CodedError.fromObject(err.response.data)];
239
+ } else {
240
+ return [new CodedError(err.message)];
241
+ }
242
+ };
228
243
 
229
244
  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
230
245
 
@@ -3860,6 +3875,7 @@ var __async = (__this, __arguments, generator) => {
3860
3875
  });
3861
3876
  };
3862
3877
  const logger = E({
3878
+ level: process.env.NODE_ENV === "production" ? "fatal" : "info",
3863
3879
  name: "shipengine-api",
3864
3880
  serializers: __spreadProps(__spreadValues({}, k), {
3865
3881
  req: (req) => ({
@@ -3881,9 +3897,8 @@ const logger = E({
3881
3897
  }
3882
3898
  ]
3883
3899
  });
3884
- const isDataCodedErrors = (data) => !!data.errors && isCodedErrors(data.errors);
3885
3900
  class ShipEngineAPI {
3886
- constructor(token, { baseURL, headers, getToken }) {
3901
+ constructor(token, { baseURL, headers, getToken, onApiError }) {
3887
3902
  const client = axios.create({
3888
3903
  baseURL,
3889
3904
  headers: __spreadProps(__spreadValues({}, headers), {
@@ -3934,7 +3949,7 @@ class ShipEngineAPI {
3934
3949
  return res;
3935
3950
  },
3936
3951
  (err) => __async(this, null, function* () {
3937
- var _a, _b, _c, _d, _e, _f, _g;
3952
+ var _a, _b, _c, _d, _e, _f;
3938
3953
  logger.error(
3939
3954
  { err, req: err.config, res: err.response },
3940
3955
  "%s %s: %s %s - %s",
@@ -3953,22 +3968,9 @@ class ShipEngineAPI {
3953
3968
  }
3954
3969
  return axios(config);
3955
3970
  }
3956
- if ((_g = err.response) == null ? void 0 : _g.data) {
3957
- if (isDataCodedErrors(err.response.data)) {
3958
- return Promise.reject(
3959
- err.response.data.errors.map((err2) => CodedError.fromObject(err2))
3960
- );
3961
- }
3962
- if (isCodedErrors(err.response.data)) {
3963
- return Promise.reject(err.response.data.map((err2) => CodedError.fromObject(err2)));
3964
- }
3965
- if (isCodedError(err.response.data)) {
3966
- return Promise.reject([CodedError.fromObject(err.response.data)]);
3967
- }
3968
- return Promise.reject([new CodedError(err.response.data)]);
3969
- } else {
3970
- return Promise.reject([new CodedError(err.message)]);
3971
- }
3971
+ const codedErrors = parseError(err);
3972
+ onApiError == null ? void 0 : onApiError(codedErrors, err);
3973
+ return Promise.reject(codedErrors);
3972
3974
  })
3973
3975
  );
3974
3976
  this.client = client;
@@ -4131,4 +4133,4 @@ class ShipEngineAPI {
4131
4133
  }
4132
4134
  }
4133
4135
 
4134
- export { AccountSettingsAPI, AddressesAPI, CarriersAPI, CodedError, ConfirmationType, CreditCardVendor, Currency, CustomPackagesAPI, CustomsContentsType, CustomsNonDeliveryType, FundingSourcesAPI, InsuranceAPI, InsuranceProviderType, LabelsAPI, MetadataCapability, MetadataRequirement, MetadataSatisfyingFormTypes, OrderSourcesAPI, RateCardStatus, RateCardsAPI, RatesAPI, types as SE, SalesOrderShipmentsAPI, SalesOrdersAPI, ShipEngineAPI, ShipmentsAPI, ShippingRulesAPI, ThemesAPI, WarehousesAPI, getEndUserIpAddress, isCodedError, isCodedErrors };
4136
+ export { AccountSettingsAPI, AddressesAPI, CarriersAPI, CodedError, ConfirmationType, CreditCardVendor, Currency, CustomPackagesAPI, CustomsContentsType, CustomsNonDeliveryType, FundingSourcesAPI, InsuranceAPI, InsuranceProviderType, LabelsAPI, MetadataCapability, MetadataRequirement, MetadataSatisfyingFormTypes, OrderSourcesAPI, RateCardStatus, RateCardsAPI, RatesAPI, types as SE, SalesOrderShipmentsAPI, SalesOrdersAPI, ShipEngineAPI, ShipmentsAPI, ShippingRulesAPI, ThemesAPI, WarehousesAPI, getEndUserIpAddress, isCodedError, isCodedErrors, isDataCodedErrors, parseError };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shipengine/js-api",
3
- "version": "0.52.2",
3
+ "version": "0.53.0",
4
4
  "main": "./index.js",
5
5
  "types": "./index.d.ts",
6
6
  "exports": {