@commercetools/ts-client 1.2.1 → 2.0.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 (45) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +0 -1
  3. package/dist/commercetools-ts-client.browser.cjs.js +116 -73
  4. package/dist/commercetools-ts-client.browser.esm.js +116 -73
  5. package/dist/commercetools-ts-client.cjs.dev.js +116 -73
  6. package/dist/commercetools-ts-client.cjs.prod.js +116 -73
  7. package/dist/commercetools-ts-client.esm.js +116 -73
  8. package/dist/declarations/src/client/builder.d.ts +9 -4
  9. package/dist/declarations/src/client/builder.d.ts.map +1 -0
  10. package/dist/declarations/src/client/client.d.ts +1 -0
  11. package/dist/declarations/src/client/client.d.ts.map +1 -0
  12. package/dist/declarations/src/client/index.d.ts +1 -0
  13. package/dist/declarations/src/client/index.d.ts.map +1 -0
  14. package/dist/declarations/src/index.d.ts +1 -0
  15. package/dist/declarations/src/index.d.ts.map +1 -0
  16. package/dist/declarations/src/middleware/auth-middleware/anonymous-session-flow.d.ts +1 -0
  17. package/dist/declarations/src/middleware/auth-middleware/anonymous-session-flow.d.ts.map +1 -0
  18. package/dist/declarations/src/middleware/auth-middleware/client-credentials-flow.d.ts +1 -0
  19. package/dist/declarations/src/middleware/auth-middleware/client-credentials-flow.d.ts.map +1 -0
  20. package/dist/declarations/src/middleware/auth-middleware/existing-token-flow.d.ts +1 -0
  21. package/dist/declarations/src/middleware/auth-middleware/existing-token-flow.d.ts.map +1 -0
  22. package/dist/declarations/src/middleware/auth-middleware/index.d.ts +1 -0
  23. package/dist/declarations/src/middleware/auth-middleware/index.d.ts.map +1 -0
  24. package/dist/declarations/src/middleware/auth-middleware/password-flow.d.ts +1 -0
  25. package/dist/declarations/src/middleware/auth-middleware/password-flow.d.ts.map +1 -0
  26. package/dist/declarations/src/middleware/auth-middleware/refresh-token-flow.d.ts +1 -0
  27. package/dist/declarations/src/middleware/auth-middleware/refresh-token-flow.d.ts.map +1 -0
  28. package/dist/declarations/src/middleware/create-concurrent-modification-middleware.d.ts +4 -2
  29. package/dist/declarations/src/middleware/create-concurrent-modification-middleware.d.ts.map +1 -0
  30. package/dist/declarations/src/middleware/create-correlation-id-middleware.d.ts +1 -0
  31. package/dist/declarations/src/middleware/create-correlation-id-middleware.d.ts.map +1 -0
  32. package/dist/declarations/src/middleware/create-error-middleware.d.ts +1 -0
  33. package/dist/declarations/src/middleware/create-error-middleware.d.ts.map +1 -0
  34. package/dist/declarations/src/middleware/create-http-middleware.d.ts +1 -0
  35. package/dist/declarations/src/middleware/create-http-middleware.d.ts.map +1 -0
  36. package/dist/declarations/src/middleware/create-logger-middleware.d.ts +1 -0
  37. package/dist/declarations/src/middleware/create-logger-middleware.d.ts.map +1 -0
  38. package/dist/declarations/src/middleware/create-queue-middleware.d.ts +1 -0
  39. package/dist/declarations/src/middleware/create-queue-middleware.d.ts.map +1 -0
  40. package/dist/declarations/src/middleware/create-user-agent-middleware.d.ts +1 -0
  41. package/dist/declarations/src/middleware/create-user-agent-middleware.d.ts.map +1 -0
  42. package/dist/declarations/src/middleware/index.d.ts +1 -0
  43. package/dist/declarations/src/middleware/index.d.ts.map +1 -0
  44. package/dist/declarations/src/types/types.d.ts +31 -13
  45. package/package.json +4 -3
@@ -112,10 +112,11 @@ function createError({
112
112
  return new HttpError(statusCode, errorMessage, rest);
113
113
  }
114
114
 
115
- function predicate(retryCodes, response) {
116
- return !
117
- // retryCodes.includes(response?.error?.message) ||
118
- [503, ...retryCodes].includes(response?.status || response?.statusCode);
115
+ function hasResponseRetryCode(retryCodes, response) {
116
+ return (
117
+ // retryCodes.includes(response?.error?.message) ||
118
+ [503, ...retryCodes].includes(response?.status || response?.statusCode)
119
+ );
119
120
  }
120
121
  async function executeHttpClientRequest(fetcher, config) {
121
122
  async function sendRequest() {
@@ -142,14 +143,17 @@ async function executor(request) {
142
143
  const data = await executeHttpClientRequest(async options => {
143
144
  const {
144
145
  enableRetry,
145
- retryConfig
146
+ retryConfig,
147
+ abortController
146
148
  } = rest;
147
149
  const {
148
150
  retryCodes = [],
149
151
  maxDelay = Infinity,
150
152
  maxRetries = 3,
151
153
  backoff = true,
152
- retryDelay = 200
154
+ retryDelay = 200,
155
+ // If set to true reinitialize the abort controller when the timeout is reached and apply the retry config
156
+ retryOnAbort = true
153
157
  } = retryConfig || {};
154
158
  let result,
155
159
  data,
@@ -175,15 +179,41 @@ async function executor(request) {
175
179
  });
176
180
  }
177
181
  async function executeWithRetry() {
182
+ const executeWithTryCatch = async (retryCodes, retryWhenAborted) => {
183
+ let _response = {};
184
+ try {
185
+ _response = await execute();
186
+ if (_response.status > 299 && hasResponseRetryCode(retryCodes, _response)) return {
187
+ _response,
188
+ shouldRetry: true
189
+ };
190
+ } catch (e) {
191
+ if (e.name.includes('AbortError') && retryWhenAborted) {
192
+ return {
193
+ _response: e,
194
+ shouldRetry: true
195
+ };
196
+ } else {
197
+ throw e;
198
+ }
199
+ }
200
+ return {
201
+ _response,
202
+ shouldRetry: false
203
+ };
204
+ };
205
+ const retryWhenAborted = retryOnAbort || !abortController || !abortController.signal;
178
206
  // first attempt
179
- let _response = await execute();
180
- if (predicate(retryCodes, _response)) return _response;
181
-
207
+ let {
208
+ _response,
209
+ shouldRetry
210
+ } = await executeWithTryCatch(retryCodes, retryWhenAborted);
182
211
  // retry attempts
183
- while (enableRetry && retryCount < maxRetries) {
212
+ while (enableRetry && shouldRetry && retryCount < maxRetries) {
184
213
  retryCount++;
185
- _response = await execute();
186
- if (predicate(retryCodes, _response)) return _response;
214
+ const execution = await executeWithTryCatch(retryCodes, retryWhenAborted);
215
+ _response = execution._response;
216
+ shouldRetry = execution.shouldRetry;
187
217
 
188
218
  // delay next execution
189
219
  const timer = calculateRetryDelay({
@@ -423,7 +453,6 @@ function createUserAgent(options) {
423
453
  function validateHttpOptions(options) {
424
454
  if (!options.host) throw new Error('Request `host` or `url` is missing or invalid, please pass in a valid host e.g `host: http://a-valid-host-url`');
425
455
  if (!options.httpClient && typeof options.httpClient !== 'function') throw new Error('An `httpClient` is not available, please pass in a `fetch` or `axios` instance as an option or have them globally available.');
426
- if (options.timeout && !options.getAbortController) throw new Error('`AbortController` is not available. Please pass in `getAbortController` as an option or have AbortController globally available when using timeout.');
427
456
  }
428
457
 
429
458
  /**
@@ -629,7 +658,10 @@ async function executeRequest$1(options) {
629
658
  * and there's either no token or the token is expired
630
659
  */
631
660
  if (tokenCacheObject && tokenCacheObject.refreshToken && (!tokenCacheObject.token || tokenCacheObject.token && Date.now() > tokenCacheObject.expirationTime)) {
632
- if (!userOption) throw new Error('Missing required options.');
661
+ if (!userOption) {
662
+ requestState.set(false);
663
+ throw new Error('Missing required options.');
664
+ }
633
665
  const opt = {
634
666
  ...buildRequestForRefreshTokenFlow({
635
667
  ...userOption,
@@ -702,8 +734,10 @@ async function executeRequest$1(options) {
702
734
  const error = new Error(response.data.message ? response.data.message : JSON.stringify(response.data));
703
735
  /**
704
736
  * reject the error immediately
705
- * and free up the middleware chain
737
+ * and free up the middleware chain and
738
+ * release the requestState by setting it to false
706
739
  */
740
+ requestState.set(false);
707
741
  request.reject({
708
742
  ...request,
709
743
  headers: {
@@ -718,6 +752,10 @@ async function executeRequest$1(options) {
718
752
  }
719
753
  });
720
754
  } catch (error) {
755
+ /**
756
+ * on error release the state by setting it to false
757
+ */
758
+ requestState.set(false);
721
759
  return {
722
760
  ...request,
723
761
  headers: {
@@ -905,7 +943,7 @@ function createAuthMiddlewareForRefreshTokenFlow$1(options) {
905
943
  };
906
944
  }
907
945
 
908
- function createConcurrentModificationMiddleware$1() {
946
+ function createConcurrentModificationMiddleware$1(modifierFunction) {
909
947
  return next => {
910
948
  return async request => {
911
949
  const response = await next(request);
@@ -919,13 +957,17 @@ function createConcurrentModificationMiddleware$1() {
919
957
 
920
958
  // update the resource version here
921
959
  if (version) {
922
- request.body = typeof request.body == 'string' ? {
923
- ...JSON.parse(request.body),
924
- version
925
- } : {
926
- ...request.body,
927
- version
928
- };
960
+ if (modifierFunction) {
961
+ request.body = await modifierFunction(version, request, response);
962
+ } else {
963
+ request.body = typeof request.body == 'string' ? {
964
+ ...JSON.parse(request.body),
965
+ version
966
+ } : {
967
+ ...request.body,
968
+ version
969
+ };
970
+ }
929
971
  return next(request);
930
972
  }
931
973
  }
@@ -947,7 +989,7 @@ function createCorrelationIdMiddleware$1(options) {
947
989
  };
948
990
  }
949
991
 
950
- function createErrorMiddleware$1(options) {
992
+ function createErrorMiddleware(options) {
951
993
  return next => async request => {
952
994
  const response = await next(request);
953
995
  if (response.error) {
@@ -979,7 +1021,8 @@ async function executeRequest({
979
1021
  request,
980
1022
  abortController,
981
1023
  maskSensitiveHeaderData,
982
- includeRequestInErrorResponse
1024
+ includeRequestInErrorResponse,
1025
+ includeResponseHeaders
983
1026
  } = clientOptions;
984
1027
  try {
985
1028
  if (timeout) timer = setTimeout(() => {
@@ -994,6 +1037,9 @@ async function executeRequest({
994
1037
  body: clientOptions.body
995
1038
  } : {})
996
1039
  });
1040
+ if (!includeResponseHeaders) {
1041
+ response.headers = null;
1042
+ }
997
1043
  if (response.statusCode >= 200 && response.statusCode < 300) {
998
1044
  if (clientOptions.method == 'HEAD') {
999
1045
  return {
@@ -1037,7 +1083,7 @@ async function executeRequest({
1037
1083
  };
1038
1084
  } catch (e) {
1039
1085
  // We know that this is a network error
1040
- const headers = getHeaders(e.response?.headers);
1086
+ const headers = includeResponseHeaders ? getHeaders(e.response?.headers) : null;
1041
1087
  const statusCode = e.response?.status || e.response?.data0 || 0;
1042
1088
  const message = e.response?.data?.message;
1043
1089
  const error = createError({
@@ -1074,7 +1120,8 @@ function createHttpMiddleware$1(options) {
1074
1120
  retryConfig,
1075
1121
  getAbortController,
1076
1122
  includeOriginalRequest,
1077
- includeRequestInErrorResponse,
1123
+ includeRequestInErrorResponse = true,
1124
+ includeResponseHeaders = true,
1078
1125
  maskSensitiveHeaderData,
1079
1126
  httpClientOptions
1080
1127
  } = options;
@@ -1110,6 +1157,7 @@ function createHttpMiddleware$1(options) {
1110
1157
  headers: requestHeader,
1111
1158
  includeRequestInErrorResponse,
1112
1159
  maskSensitiveHeaderData,
1160
+ includeResponseHeaders,
1113
1161
  ...httpClientOptions
1114
1162
  };
1115
1163
  if (credentialsMode) {
@@ -1143,43 +1191,17 @@ function createHttpMiddleware$1(options) {
1143
1191
  };
1144
1192
  }
1145
1193
 
1146
- // error, info, success
1147
1194
  function createLoggerMiddleware$1(options) {
1148
1195
  return next => {
1149
1196
  return async request => {
1150
1197
  let response = await next(request);
1151
1198
  const originalResponse = Object.assign({}, response);
1152
1199
  const {
1153
- loggerFn = console.log,
1154
- // logLevel = 'ERROR',
1155
- maskSensitiveHeaderData = true,
1156
- includeOriginalRequest = true,
1157
- includeResponseHeaders = true
1158
- // includeRequestInErrorResponse
1200
+ loggerFn = console.log
1159
1201
  } = options || {};
1160
- if (includeOriginalRequest && maskSensitiveHeaderData) {
1161
- maskAuthData(response.request);
1162
- }
1163
- if (!includeOriginalRequest) {
1164
- const {
1165
- request,
1166
- ...rest
1167
- } = response;
1168
- response = rest;
1169
- }
1170
- if (!includeResponseHeaders) {
1171
- const {
1172
- headers,
1173
- ...rest
1174
- } = response;
1175
- response = rest;
1176
- }
1177
1202
  if (loggerFn && typeof loggerFn == 'function') {
1178
1203
  loggerFn(response);
1179
- // return originalResponse
1180
1204
  }
1181
-
1182
- // console.log({ Response: response })
1183
1205
  return originalResponse;
1184
1206
  };
1185
1207
  };
@@ -1231,7 +1253,7 @@ function createQueueMiddleware$1({
1231
1253
 
1232
1254
  var packageJson = {
1233
1255
  name: "@commercetools/ts-client",
1234
- version: "1.2.1",
1256
+ version: "2.0.1",
1235
1257
  engines: {
1236
1258
  node: ">=14"
1237
1259
  },
@@ -1267,7 +1289,7 @@ var packageJson = {
1267
1289
  "abort-controller": "3.0.0",
1268
1290
  buffer: "^6.0.3",
1269
1291
  "node-fetch": "^2.6.1",
1270
- uuid: "9.0.1"
1292
+ uuid: "10.0.0"
1271
1293
  },
1272
1294
  files: [
1273
1295
  "dist",
@@ -1290,7 +1312,8 @@ var packageJson = {
1290
1312
  scripts: {
1291
1313
  organize_imports: "find src -type f -name '*.ts' | xargs organize-imports-cli",
1292
1314
  postbuild: "yarn organize_imports",
1293
- post_process_generate: "yarn organize_imports"
1315
+ post_process_generate: "yarn organize_imports",
1316
+ docs: "typedoc --out docs"
1294
1317
  }
1295
1318
  };
1296
1319
 
@@ -1298,7 +1321,7 @@ function createUserAgentMiddleware$1(options) {
1298
1321
  return next => async request => {
1299
1322
  const userAgent = createUserAgent({
1300
1323
  ...options,
1301
- name: `commercetools-sdk-javascript-v3/${packageJson.version}`
1324
+ name: `${options.name ? options.name + '/' : ''}commercetools-sdk-javascript-v3/${packageJson.version}`
1302
1325
  });
1303
1326
  const requestWithUserAgent = {
1304
1327
  ...request,
@@ -1320,7 +1343,7 @@ var middleware = /*#__PURE__*/Object.freeze({
1320
1343
  createAuthMiddlewareForRefreshTokenFlow: createAuthMiddlewareForRefreshTokenFlow$1,
1321
1344
  createConcurrentModificationMiddleware: createConcurrentModificationMiddleware$1,
1322
1345
  createCorrelationIdMiddleware: createCorrelationIdMiddleware$1,
1323
- createErrorMiddleware: createErrorMiddleware$1,
1346
+ createErrorMiddleware: createErrorMiddleware,
1324
1347
  createHttpMiddleware: createHttpMiddleware$1,
1325
1348
  createLoggerMiddleware: createLoggerMiddleware$1,
1326
1349
  createQueueMiddleware: createQueueMiddleware$1,
@@ -1486,8 +1509,7 @@ const {
1486
1509
  createLoggerMiddleware,
1487
1510
  createQueueMiddleware,
1488
1511
  createUserAgentMiddleware,
1489
- createConcurrentModificationMiddleware,
1490
- createErrorMiddleware
1512
+ createConcurrentModificationMiddleware
1491
1513
  } = middleware;
1492
1514
  class ClientBuilder {
1493
1515
  constructor() {
@@ -1499,7 +1521,9 @@ class ClientBuilder {
1499
1521
  _defineProperty(this, "loggerMiddleware", void 0);
1500
1522
  _defineProperty(this, "queueMiddleware", void 0);
1501
1523
  _defineProperty(this, "concurrentMiddleware", void 0);
1502
- _defineProperty(this, "errorMiddleware", void 0);
1524
+ _defineProperty(this, "telemetryMiddleware", void 0);
1525
+ _defineProperty(this, "beforeMiddleware", void 0);
1526
+ _defineProperty(this, "afterMiddleware", void 0);
1503
1527
  _defineProperty(this, "middlewares", []);
1504
1528
  this.userAgentMiddleware = createUserAgentMiddleware({});
1505
1529
  }
@@ -1618,30 +1642,49 @@ class ClientBuilder {
1618
1642
  });
1619
1643
  return this;
1620
1644
  }
1621
- withConcurrentModificationMiddleware() {
1622
- this.concurrentMiddleware = createConcurrentModificationMiddleware();
1645
+ withConcurrentModificationMiddleware(options) {
1646
+ this.concurrentMiddleware = createConcurrentModificationMiddleware(options?.concurrentModificationHandlerFn);
1623
1647
  return this;
1624
1648
  }
1625
- withErrorMiddleware(options) {
1626
- this.errorMiddleware = createErrorMiddleware(options);
1649
+ withTelemetryMiddleware(options) {
1650
+ const {
1651
+ createTelemetryMiddleware,
1652
+ ...rest
1653
+ } = options;
1654
+ this.withUserAgentMiddleware({
1655
+ customAgent: rest?.userAgent || 'typescript-sdk-apm-middleware'
1656
+ });
1657
+ this.telemetryMiddleware = createTelemetryMiddleware(rest);
1658
+ return this;
1659
+ }
1660
+ withBeforeExecutionMiddleware(options) {
1661
+ const {
1662
+ middleware,
1663
+ ...rest
1664
+ } = options || {};
1665
+ this.beforeMiddleware = options.middleware(rest);
1666
+ return this;
1667
+ }
1668
+ withAfterExecutionMiddleware(options) {
1669
+ const {
1670
+ middleware,
1671
+ ...rest
1672
+ } = options || {};
1673
+ this.afterMiddleware = options.middleware(rest);
1627
1674
  return this;
1628
1675
  }
1629
1676
  build() {
1630
1677
  const middlewares = this.middlewares.slice();
1631
-
1632
- /**
1633
- * - use default retry policy if not explicity added
1634
- * - add retry middleware to be used by concurrent modification
1635
- * middleware if not explicitly added as part of the middleware
1636
- */
1678
+ if (this.telemetryMiddleware) middlewares.push(this.telemetryMiddleware);
1637
1679
  if (this.correlationIdMiddleware) middlewares.push(this.correlationIdMiddleware);
1638
1680
  if (this.userAgentMiddleware) middlewares.push(this.userAgentMiddleware);
1639
1681
  if (this.authMiddleware) middlewares.push(this.authMiddleware);
1682
+ if (this.beforeMiddleware) middlewares.push(this.beforeMiddleware);
1640
1683
  if (this.queueMiddleware) middlewares.push(this.queueMiddleware);
1641
1684
  if (this.loggerMiddleware) middlewares.push(this.loggerMiddleware);
1642
- if (this.errorMiddleware) middlewares.push(this.errorMiddleware);
1643
1685
  if (this.concurrentMiddleware) middlewares.push(this.concurrentMiddleware);
1644
1686
  if (this.httpMiddleware) middlewares.push(this.httpMiddleware);
1687
+ if (this.afterMiddleware) middlewares.push(this.afterMiddleware);
1645
1688
  return createClient({
1646
1689
  middlewares
1647
1690
  });