@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
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @commercetools/ts-client
2
2
 
3
+ ## 2.0.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#767](https://github.com/commercetools/commercetools-sdk-typescript/pull/767) [`d82a9e0`](https://github.com/commercetools/commercetools-sdk-typescript/commit/d82a9e0e6666e076183172a9229ffcda8e28905a) Thanks [@ajimae](https://github.com/ajimae)! - Fix issues with request state not being reset back to default on error when fetching token.
8
+
9
+ ## 2.0.0
10
+
11
+ ### Major Changes
12
+
13
+ - [#708](https://github.com/commercetools/commercetools-sdk-typescript/pull/708) [`e7e5ac7`](https://github.com/commercetools/commercetools-sdk-typescript/commit/e7e5ac73de07a8ce141ec0bc2b2abf492462ec73) Thanks [@lojzatran](https://github.com/lojzatran)! - Make ts-sdk-v3 consistent with v2
14
+
3
15
  ## 1.2.1
4
16
 
5
17
  ### Patch Changes
package/README.md CHANGED
@@ -78,7 +78,6 @@ const client: Client = new ClientBuilder()
78
78
  .withHttpMiddleware(httpMiddlewareOptions)
79
79
  .withRetryMiddleware(retryOptions)
80
80
  .withMiddleware(middleware({})) // <<<------------------- add the custom middleware here
81
- .withErrorMiddleware({})
82
81
  .build()
83
82
 
84
83
  const apiRoot = createApiBuilderFromCtpClient(client)
@@ -121,10 +121,11 @@ function createError({
121
121
  return new HttpError(statusCode, errorMessage, rest);
122
122
  }
123
123
 
124
- function predicate(retryCodes, response) {
125
- return !
126
- // retryCodes.includes(response?.error?.message) ||
127
- [503, ...retryCodes].includes(response?.status || response?.statusCode);
124
+ function hasResponseRetryCode(retryCodes, response) {
125
+ return (
126
+ // retryCodes.includes(response?.error?.message) ||
127
+ [503, ...retryCodes].includes(response?.status || response?.statusCode)
128
+ );
128
129
  }
129
130
  async function executeHttpClientRequest(fetcher, config) {
130
131
  async function sendRequest() {
@@ -151,14 +152,17 @@ async function executor(request) {
151
152
  const data = await executeHttpClientRequest(async options => {
152
153
  const {
153
154
  enableRetry,
154
- retryConfig
155
+ retryConfig,
156
+ abortController
155
157
  } = rest;
156
158
  const {
157
159
  retryCodes = [],
158
160
  maxDelay = Infinity,
159
161
  maxRetries = 3,
160
162
  backoff = true,
161
- retryDelay = 200
163
+ retryDelay = 200,
164
+ // If set to true reinitialize the abort controller when the timeout is reached and apply the retry config
165
+ retryOnAbort = true
162
166
  } = retryConfig || {};
163
167
  let result,
164
168
  data,
@@ -184,15 +188,41 @@ async function executor(request) {
184
188
  });
185
189
  }
186
190
  async function executeWithRetry() {
191
+ const executeWithTryCatch = async (retryCodes, retryWhenAborted) => {
192
+ let _response = {};
193
+ try {
194
+ _response = await execute();
195
+ if (_response.status > 299 && hasResponseRetryCode(retryCodes, _response)) return {
196
+ _response,
197
+ shouldRetry: true
198
+ };
199
+ } catch (e) {
200
+ if (e.name.includes('AbortError') && retryWhenAborted) {
201
+ return {
202
+ _response: e,
203
+ shouldRetry: true
204
+ };
205
+ } else {
206
+ throw e;
207
+ }
208
+ }
209
+ return {
210
+ _response,
211
+ shouldRetry: false
212
+ };
213
+ };
214
+ const retryWhenAborted = retryOnAbort || !abortController || !abortController.signal;
187
215
  // first attempt
188
- let _response = await execute();
189
- if (predicate(retryCodes, _response)) return _response;
190
-
216
+ let {
217
+ _response,
218
+ shouldRetry
219
+ } = await executeWithTryCatch(retryCodes, retryWhenAborted);
191
220
  // retry attempts
192
- while (enableRetry && retryCount < maxRetries) {
221
+ while (enableRetry && shouldRetry && retryCount < maxRetries) {
193
222
  retryCount++;
194
- _response = await execute();
195
- if (predicate(retryCodes, _response)) return _response;
223
+ const execution = await executeWithTryCatch(retryCodes, retryWhenAborted);
224
+ _response = execution._response;
225
+ shouldRetry = execution.shouldRetry;
196
226
 
197
227
  // delay next execution
198
228
  const timer = calculateRetryDelay({
@@ -432,7 +462,6 @@ function createUserAgent(options) {
432
462
  function validateHttpOptions(options) {
433
463
  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`');
434
464
  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.');
435
- 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.');
436
465
  }
437
466
 
438
467
  /**
@@ -638,7 +667,10 @@ async function executeRequest$1(options) {
638
667
  * and there's either no token or the token is expired
639
668
  */
640
669
  if (tokenCacheObject && tokenCacheObject.refreshToken && (!tokenCacheObject.token || tokenCacheObject.token && Date.now() > tokenCacheObject.expirationTime)) {
641
- if (!userOption) throw new Error('Missing required options.');
670
+ if (!userOption) {
671
+ requestState.set(false);
672
+ throw new Error('Missing required options.');
673
+ }
642
674
  const opt = {
643
675
  ...buildRequestForRefreshTokenFlow({
644
676
  ...userOption,
@@ -711,8 +743,10 @@ async function executeRequest$1(options) {
711
743
  const error = new Error(response.data.message ? response.data.message : JSON.stringify(response.data));
712
744
  /**
713
745
  * reject the error immediately
714
- * and free up the middleware chain
746
+ * and free up the middleware chain and
747
+ * release the requestState by setting it to false
715
748
  */
749
+ requestState.set(false);
716
750
  request.reject({
717
751
  ...request,
718
752
  headers: {
@@ -727,6 +761,10 @@ async function executeRequest$1(options) {
727
761
  }
728
762
  });
729
763
  } catch (error) {
764
+ /**
765
+ * on error release the state by setting it to false
766
+ */
767
+ requestState.set(false);
730
768
  return {
731
769
  ...request,
732
770
  headers: {
@@ -914,7 +952,7 @@ function createAuthMiddlewareForRefreshTokenFlow$1(options) {
914
952
  };
915
953
  }
916
954
 
917
- function createConcurrentModificationMiddleware$1() {
955
+ function createConcurrentModificationMiddleware$1(modifierFunction) {
918
956
  return next => {
919
957
  return async request => {
920
958
  const response = await next(request);
@@ -928,13 +966,17 @@ function createConcurrentModificationMiddleware$1() {
928
966
 
929
967
  // update the resource version here
930
968
  if (version) {
931
- request.body = typeof request.body == 'string' ? {
932
- ...JSON.parse(request.body),
933
- version
934
- } : {
935
- ...request.body,
936
- version
937
- };
969
+ if (modifierFunction) {
970
+ request.body = await modifierFunction(version, request, response);
971
+ } else {
972
+ request.body = typeof request.body == 'string' ? {
973
+ ...JSON.parse(request.body),
974
+ version
975
+ } : {
976
+ ...request.body,
977
+ version
978
+ };
979
+ }
938
980
  return next(request);
939
981
  }
940
982
  }
@@ -956,7 +998,7 @@ function createCorrelationIdMiddleware$1(options) {
956
998
  };
957
999
  }
958
1000
 
959
- function createErrorMiddleware$1(options) {
1001
+ function createErrorMiddleware(options) {
960
1002
  return next => async request => {
961
1003
  const response = await next(request);
962
1004
  if (response.error) {
@@ -988,7 +1030,8 @@ async function executeRequest({
988
1030
  request,
989
1031
  abortController,
990
1032
  maskSensitiveHeaderData,
991
- includeRequestInErrorResponse
1033
+ includeRequestInErrorResponse,
1034
+ includeResponseHeaders
992
1035
  } = clientOptions;
993
1036
  try {
994
1037
  if (timeout) timer = setTimeout(() => {
@@ -1003,6 +1046,9 @@ async function executeRequest({
1003
1046
  body: clientOptions.body
1004
1047
  } : {})
1005
1048
  });
1049
+ if (!includeResponseHeaders) {
1050
+ response.headers = null;
1051
+ }
1006
1052
  if (response.statusCode >= 200 && response.statusCode < 300) {
1007
1053
  if (clientOptions.method == 'HEAD') {
1008
1054
  return {
@@ -1046,7 +1092,7 @@ async function executeRequest({
1046
1092
  };
1047
1093
  } catch (e) {
1048
1094
  // We know that this is a network error
1049
- const headers = getHeaders(e.response?.headers);
1095
+ const headers = includeResponseHeaders ? getHeaders(e.response?.headers) : null;
1050
1096
  const statusCode = e.response?.status || e.response?.data0 || 0;
1051
1097
  const message = e.response?.data?.message;
1052
1098
  const error = createError({
@@ -1083,7 +1129,8 @@ function createHttpMiddleware$1(options) {
1083
1129
  retryConfig,
1084
1130
  getAbortController,
1085
1131
  includeOriginalRequest,
1086
- includeRequestInErrorResponse,
1132
+ includeRequestInErrorResponse = true,
1133
+ includeResponseHeaders = true,
1087
1134
  maskSensitiveHeaderData,
1088
1135
  httpClientOptions
1089
1136
  } = options;
@@ -1119,6 +1166,7 @@ function createHttpMiddleware$1(options) {
1119
1166
  headers: requestHeader,
1120
1167
  includeRequestInErrorResponse,
1121
1168
  maskSensitiveHeaderData,
1169
+ includeResponseHeaders,
1122
1170
  ...httpClientOptions
1123
1171
  };
1124
1172
  if (credentialsMode) {
@@ -1152,43 +1200,17 @@ function createHttpMiddleware$1(options) {
1152
1200
  };
1153
1201
  }
1154
1202
 
1155
- // error, info, success
1156
1203
  function createLoggerMiddleware$1(options) {
1157
1204
  return next => {
1158
1205
  return async request => {
1159
1206
  let response = await next(request);
1160
1207
  const originalResponse = Object.assign({}, response);
1161
1208
  const {
1162
- loggerFn = console.log,
1163
- // logLevel = 'ERROR',
1164
- maskSensitiveHeaderData = true,
1165
- includeOriginalRequest = true,
1166
- includeResponseHeaders = true
1167
- // includeRequestInErrorResponse
1209
+ loggerFn = console.log
1168
1210
  } = options || {};
1169
- if (includeOriginalRequest && maskSensitiveHeaderData) {
1170
- maskAuthData(response.request);
1171
- }
1172
- if (!includeOriginalRequest) {
1173
- const {
1174
- request,
1175
- ...rest
1176
- } = response;
1177
- response = rest;
1178
- }
1179
- if (!includeResponseHeaders) {
1180
- const {
1181
- headers,
1182
- ...rest
1183
- } = response;
1184
- response = rest;
1185
- }
1186
1211
  if (loggerFn && typeof loggerFn == 'function') {
1187
1212
  loggerFn(response);
1188
- // return originalResponse
1189
1213
  }
1190
-
1191
- // console.log({ Response: response })
1192
1214
  return originalResponse;
1193
1215
  };
1194
1216
  };
@@ -1240,7 +1262,7 @@ function createQueueMiddleware$1({
1240
1262
 
1241
1263
  var packageJson = {
1242
1264
  name: "@commercetools/ts-client",
1243
- version: "1.2.1",
1265
+ version: "2.0.1",
1244
1266
  engines: {
1245
1267
  node: ">=14"
1246
1268
  },
@@ -1276,7 +1298,7 @@ var packageJson = {
1276
1298
  "abort-controller": "3.0.0",
1277
1299
  buffer: "^6.0.3",
1278
1300
  "node-fetch": "^2.6.1",
1279
- uuid: "9.0.1"
1301
+ uuid: "10.0.0"
1280
1302
  },
1281
1303
  files: [
1282
1304
  "dist",
@@ -1299,7 +1321,8 @@ var packageJson = {
1299
1321
  scripts: {
1300
1322
  organize_imports: "find src -type f -name '*.ts' | xargs organize-imports-cli",
1301
1323
  postbuild: "yarn organize_imports",
1302
- post_process_generate: "yarn organize_imports"
1324
+ post_process_generate: "yarn organize_imports",
1325
+ docs: "typedoc --out docs"
1303
1326
  }
1304
1327
  };
1305
1328
 
@@ -1307,7 +1330,7 @@ function createUserAgentMiddleware$1(options) {
1307
1330
  return next => async request => {
1308
1331
  const userAgent = createUserAgent({
1309
1332
  ...options,
1310
- name: `commercetools-sdk-javascript-v3/${packageJson.version}`
1333
+ name: `${options.name ? options.name + '/' : ''}commercetools-sdk-javascript-v3/${packageJson.version}`
1311
1334
  });
1312
1335
  const requestWithUserAgent = {
1313
1336
  ...request,
@@ -1329,7 +1352,7 @@ var middleware = /*#__PURE__*/Object.freeze({
1329
1352
  createAuthMiddlewareForRefreshTokenFlow: createAuthMiddlewareForRefreshTokenFlow$1,
1330
1353
  createConcurrentModificationMiddleware: createConcurrentModificationMiddleware$1,
1331
1354
  createCorrelationIdMiddleware: createCorrelationIdMiddleware$1,
1332
- createErrorMiddleware: createErrorMiddleware$1,
1355
+ createErrorMiddleware: createErrorMiddleware,
1333
1356
  createHttpMiddleware: createHttpMiddleware$1,
1334
1357
  createLoggerMiddleware: createLoggerMiddleware$1,
1335
1358
  createQueueMiddleware: createQueueMiddleware$1,
@@ -1495,8 +1518,7 @@ const {
1495
1518
  createLoggerMiddleware,
1496
1519
  createQueueMiddleware,
1497
1520
  createUserAgentMiddleware,
1498
- createConcurrentModificationMiddleware,
1499
- createErrorMiddleware
1521
+ createConcurrentModificationMiddleware
1500
1522
  } = middleware;
1501
1523
  class ClientBuilder {
1502
1524
  constructor() {
@@ -1508,7 +1530,9 @@ class ClientBuilder {
1508
1530
  _defineProperty(this, "loggerMiddleware", void 0);
1509
1531
  _defineProperty(this, "queueMiddleware", void 0);
1510
1532
  _defineProperty(this, "concurrentMiddleware", void 0);
1511
- _defineProperty(this, "errorMiddleware", void 0);
1533
+ _defineProperty(this, "telemetryMiddleware", void 0);
1534
+ _defineProperty(this, "beforeMiddleware", void 0);
1535
+ _defineProperty(this, "afterMiddleware", void 0);
1512
1536
  _defineProperty(this, "middlewares", []);
1513
1537
  this.userAgentMiddleware = createUserAgentMiddleware({});
1514
1538
  }
@@ -1627,30 +1651,49 @@ class ClientBuilder {
1627
1651
  });
1628
1652
  return this;
1629
1653
  }
1630
- withConcurrentModificationMiddleware() {
1631
- this.concurrentMiddleware = createConcurrentModificationMiddleware();
1654
+ withConcurrentModificationMiddleware(options) {
1655
+ this.concurrentMiddleware = createConcurrentModificationMiddleware(options?.concurrentModificationHandlerFn);
1632
1656
  return this;
1633
1657
  }
1634
- withErrorMiddleware(options) {
1635
- this.errorMiddleware = createErrorMiddleware(options);
1658
+ withTelemetryMiddleware(options) {
1659
+ const {
1660
+ createTelemetryMiddleware,
1661
+ ...rest
1662
+ } = options;
1663
+ this.withUserAgentMiddleware({
1664
+ customAgent: rest?.userAgent || 'typescript-sdk-apm-middleware'
1665
+ });
1666
+ this.telemetryMiddleware = createTelemetryMiddleware(rest);
1667
+ return this;
1668
+ }
1669
+ withBeforeExecutionMiddleware(options) {
1670
+ const {
1671
+ middleware,
1672
+ ...rest
1673
+ } = options || {};
1674
+ this.beforeMiddleware = options.middleware(rest);
1675
+ return this;
1676
+ }
1677
+ withAfterExecutionMiddleware(options) {
1678
+ const {
1679
+ middleware,
1680
+ ...rest
1681
+ } = options || {};
1682
+ this.afterMiddleware = options.middleware(rest);
1636
1683
  return this;
1637
1684
  }
1638
1685
  build() {
1639
1686
  const middlewares = this.middlewares.slice();
1640
-
1641
- /**
1642
- * - use default retry policy if not explicity added
1643
- * - add retry middleware to be used by concurrent modification
1644
- * middleware if not explicitly added as part of the middleware
1645
- */
1687
+ if (this.telemetryMiddleware) middlewares.push(this.telemetryMiddleware);
1646
1688
  if (this.correlationIdMiddleware) middlewares.push(this.correlationIdMiddleware);
1647
1689
  if (this.userAgentMiddleware) middlewares.push(this.userAgentMiddleware);
1648
1690
  if (this.authMiddleware) middlewares.push(this.authMiddleware);
1691
+ if (this.beforeMiddleware) middlewares.push(this.beforeMiddleware);
1649
1692
  if (this.queueMiddleware) middlewares.push(this.queueMiddleware);
1650
1693
  if (this.loggerMiddleware) middlewares.push(this.loggerMiddleware);
1651
- if (this.errorMiddleware) middlewares.push(this.errorMiddleware);
1652
1694
  if (this.concurrentMiddleware) middlewares.push(this.concurrentMiddleware);
1653
1695
  if (this.httpMiddleware) middlewares.push(this.httpMiddleware);
1696
+ if (this.afterMiddleware) middlewares.push(this.afterMiddleware);
1654
1697
  return createClient({
1655
1698
  middlewares
1656
1699
  });