@commercetools/ts-client 1.1.0 → 1.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.
Files changed (49) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +55 -0
  3. package/dist/commercetools-ts-client.browser.cjs.js +68 -80
  4. package/dist/commercetools-ts-client.browser.esm.js +68 -80
  5. package/dist/commercetools-ts-client.cjs.d.ts +1 -0
  6. package/dist/commercetools-ts-client.cjs.d.ts.map +1 -0
  7. package/dist/commercetools-ts-client.cjs.dev.js +68 -80
  8. package/dist/commercetools-ts-client.cjs.prod.js +68 -80
  9. package/dist/commercetools-ts-client.esm.js +68 -80
  10. package/dist/declarations/src/client/builder.d.ts +1 -1
  11. package/dist/declarations/src/client/client.d.ts +1 -1
  12. package/dist/declarations/src/client/index.d.ts +2 -2
  13. package/dist/declarations/src/index.d.ts +3 -3
  14. package/dist/declarations/src/middleware/auth-middleware/anonymous-session-flow.d.ts +1 -1
  15. package/dist/declarations/src/middleware/auth-middleware/client-credentials-flow.d.ts +1 -1
  16. package/dist/declarations/src/middleware/auth-middleware/existing-token-flow.d.ts +1 -1
  17. package/dist/declarations/src/middleware/auth-middleware/index.d.ts +5 -5
  18. package/dist/declarations/src/middleware/auth-middleware/password-flow.d.ts +1 -1
  19. package/dist/declarations/src/middleware/auth-middleware/refresh-token-flow.d.ts +1 -1
  20. package/dist/declarations/src/middleware/create-concurrent-modification-middleware.d.ts +1 -1
  21. package/dist/declarations/src/middleware/create-correlation-id-middleware.d.ts +1 -1
  22. package/dist/declarations/src/middleware/create-error-middleware.d.ts +1 -1
  23. package/dist/declarations/src/middleware/create-http-middleware.d.ts +1 -1
  24. package/dist/declarations/src/middleware/create-logger-middleware.d.ts +1 -1
  25. package/dist/declarations/src/middleware/create-queue-middleware.d.ts +1 -1
  26. package/dist/declarations/src/middleware/create-user-agent-middleware.d.ts +1 -1
  27. package/dist/declarations/src/middleware/index.d.ts +8 -8
  28. package/package.json +5 -4
  29. package/dist/declarations/src/middleware/auth-middleware/auth-request-builder.d.ts +0 -24
  30. package/dist/declarations/src/middleware/auth-middleware/auth-request-executor.d.ts +0 -2
  31. package/dist/declarations/src/utils/constants.d.ts +0 -5
  32. package/dist/declarations/src/utils/createError.d.ts +0 -8
  33. package/dist/declarations/src/utils/errors.d.ts +0 -10
  34. package/dist/declarations/src/utils/executor.d.ts +0 -2
  35. package/dist/declarations/src/utils/generateID.d.ts +0 -1
  36. package/dist/declarations/src/utils/headers.d.ts +0 -2
  37. package/dist/declarations/src/utils/index.d.ts +0 -18
  38. package/dist/declarations/src/utils/isBuffer.d.ts +0 -1
  39. package/dist/declarations/src/utils/maskAuthData.d.ts +0 -2
  40. package/dist/declarations/src/utils/mergeAuthHeader.d.ts +0 -2
  41. package/dist/declarations/src/utils/methods.d.ts +0 -2
  42. package/dist/declarations/src/utils/retryDelay.d.ts +0 -8
  43. package/dist/declarations/src/utils/sleep.d.ts +0 -1
  44. package/dist/declarations/src/utils/tokenCacheKey.d.ts +0 -2
  45. package/dist/declarations/src/utils/tokenExpirationTime.d.ts +0 -1
  46. package/dist/declarations/src/utils/tokenStore.d.ts +0 -2
  47. package/dist/declarations/src/utils/url.d.ts +0 -2
  48. package/dist/declarations/src/utils/userAgent.d.ts +0 -2
  49. package/dist/declarations/src/utils/validate.d.ts +0 -25
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @commercetools/ts-client
2
2
 
3
+ ## 1.1.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#620](https://github.com/commercetools/commercetools-sdk-typescript/pull/620) [`f0028a3`](https://github.com/commercetools/commercetools-sdk-typescript/commit/f0028a343fe3417bbc3caeb76cc6658a5d7bff73) Thanks [@lojzatran](https://github.com/lojzatran)! - Fix issue with concurrent modification middleware functionality.
8
+
3
9
  ## 1.1.0
4
10
 
5
11
  ### Minor Changes
package/README.md CHANGED
@@ -124,3 +124,58 @@ apiRoot
124
124
  /*...*/
125
125
  })
126
126
  ```
127
+
128
+ ## Create a client
129
+
130
+ To create a client, use the `ClientBuilder` class. The `ClientBuilder` class provides a fluent API to configure the client.
131
+
132
+ ```ts
133
+ const authMiddlewareOptions = {
134
+ credentials: {
135
+ clientId: 'xxx',
136
+ clientSecret: 'xxx',
137
+ },
138
+ host: 'https://auth.europe-west1.gcp.commercetools.com',
139
+ projectKey: 'xxx',
140
+ }
141
+
142
+ const httpMiddlewareOptions = {
143
+ host: 'https://api.europe-west1.gcp.commercetools.com',
144
+ httpClient: fetch,
145
+ }
146
+
147
+ const client = new ClientBuilder()
148
+ .withHttpMiddleware(httpMiddlewareOptions)
149
+ .withConcurrentModificationMiddleware()
150
+ .withClientCredentialsFlow(authMiddlewareOptions)
151
+ .build()
152
+ ```
153
+
154
+ > [!WARNING]
155
+ > Do not add the built-in middlewares using `withMiddleware` method. Adding by this method does not respect the ordering of the middlewares and could lead to unexpected behavior.
156
+
157
+ ```ts
158
+ // WRONG CODE!!!!!
159
+ const authMiddlewareOptions = {
160
+ credentials: {
161
+ clientId: 'xxx',
162
+ clientSecret: 'xxx',
163
+ },
164
+ host: 'https://auth.europe-west1.gcp.commercetools.com',
165
+ projectKey: 'xxx',
166
+ }
167
+
168
+ const httpMiddlewareOptions = {
169
+ host: 'https://api.europe-west1.gcp.commercetools.com',
170
+ httpClient: fetch,
171
+ }
172
+
173
+ const client = new ClientBuilder()
174
+ .withMiddleware(
175
+ createAuthMiddlewareForClientCredentialsFlow(authMiddlewareOptions)
176
+ )
177
+ .withMiddleware(createHttpMiddleware(httpMiddlewareOptions))
178
+ .withMiddleware(createConcurrentModificationMiddleware())
179
+ .build()
180
+ // WRONG CODE!!!!!
181
+ ```
@@ -3,34 +3,33 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var fetch$1 = require('node-fetch');
6
- var crytpo = require('crypto');
6
+ var uuid = require('uuid');
7
7
  var _ = require('buffer/');
8
8
  var AbortController = require('abort-controller');
9
9
 
10
10
  function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
11
11
 
12
12
  var fetch__default = /*#__PURE__*/_interopDefault(fetch$1);
13
- var crytpo__default = /*#__PURE__*/_interopDefault(crytpo);
14
13
  var AbortController__default = /*#__PURE__*/_interopDefault(AbortController);
15
14
 
16
- function _toPrimitive(input, hint) {
17
- if (typeof input !== "object" || input === null) return input;
18
- var prim = input[Symbol.toPrimitive];
19
- if (prim !== undefined) {
20
- var res = prim.call(input, hint || "default");
21
- if (typeof res !== "object") return res;
15
+ function toPrimitive(t, r) {
16
+ if ("object" != typeof t || !t) return t;
17
+ var e = t[Symbol.toPrimitive];
18
+ if (void 0 !== e) {
19
+ var i = e.call(t, r || "default");
20
+ if ("object" != typeof i) return i;
22
21
  throw new TypeError("@@toPrimitive must return a primitive value.");
23
22
  }
24
- return (hint === "string" ? String : Number)(input);
23
+ return ("string" === r ? String : Number)(t);
25
24
  }
26
25
 
27
- function _toPropertyKey(arg) {
28
- var key = _toPrimitive(arg, "string");
29
- return typeof key === "symbol" ? key : String(key);
26
+ function toPropertyKey(t) {
27
+ var i = toPrimitive(t, "string");
28
+ return "symbol" == typeof i ? i : String(i);
30
29
  }
31
30
 
32
31
  function _defineProperty(obj, key, value) {
33
- key = _toPropertyKey(key);
32
+ key = toPropertyKey(key);
34
33
  if (key in obj) {
35
34
  Object.defineProperty(obj, key, {
36
35
  value: value,
@@ -115,9 +114,8 @@ function createError({
115
114
  message,
116
115
  ...rest
117
116
  }) {
118
- var _rest$originalRequest;
119
117
  let errorMessage = message || 'Unexpected non-JSON error response';
120
- if (statusCode === 404) errorMessage = `URI not found: ${((_rest$originalRequest = rest.originalRequest) === null || _rest$originalRequest === void 0 ? void 0 : _rest$originalRequest.uri) || rest.uri}`;
118
+ if (statusCode === 404) errorMessage = `URI not found: ${rest.originalRequest?.uri || rest.uri}`;
121
119
  const ResponseError = getErrorByCode(statusCode);
122
120
  if (ResponseError) return new ResponseError(errorMessage, rest);
123
121
  return new HttpError(statusCode, errorMessage, rest);
@@ -126,7 +124,7 @@ function createError({
126
124
  function predicate(retryCodes, response) {
127
125
  return !
128
126
  // retryCodes.includes(response?.error?.message) ||
129
- [503, ...retryCodes].includes((response === null || response === void 0 ? void 0 : response.status) || (response === null || response === void 0 ? void 0 : response.statusCode));
127
+ [503, ...retryCodes].includes(response?.status || response?.statusCode);
130
128
  }
131
129
  async function executeHttpClientRequest(fetcher, config) {
132
130
  async function sendRequest() {
@@ -237,9 +235,8 @@ async function executor(request) {
237
235
  return data;
238
236
  }
239
237
 
240
- // TODO: Polyfill crypto for browsers
241
238
  function generateID() {
242
- return crytpo__default["default"].randomBytes(32).toString('base64').replace(/[\/\-=+]/gi, '');
239
+ return uuid.v4();
243
240
  }
244
241
 
245
242
  function parse(headers) {
@@ -266,7 +263,7 @@ function isBuffer(obj) {
266
263
 
267
264
  function maskAuthData(request) {
268
265
  const _request = Object.assign({}, request);
269
- if (_request !== null && _request !== void 0 && _request.headers) {
266
+ if (_request?.headers) {
270
267
  if (_request.headers.Authorization) {
271
268
  _request.headers['Authorization'] = 'Bearer ********';
272
269
  }
@@ -310,8 +307,7 @@ function sleep(ms) {
310
307
  }
311
308
 
312
309
  function buildTokenCacheKey(options) {
313
- var _options$credentials;
314
- if (!(options !== null && options !== void 0 && (_options$credentials = options.credentials) !== null && _options$credentials !== void 0 && _options$credentials.clientId) || !options.projectKey || !options.host) throw new Error('Missing required options.');
310
+ if (!options?.credentials?.clientId || !options.projectKey || !options.host) throw new Error('Missing required options.');
315
311
  return {
316
312
  clientId: options.credentials.clientId,
317
313
  host: options.host,
@@ -335,6 +331,35 @@ function store(initVal) {
335
331
  };
336
332
  }
337
333
 
334
+ function urlParser(url) {
335
+ const object = {};
336
+ const data = new URLSearchParams(url);
337
+ for (let x of data.keys()) {
338
+ if (data.getAll(x).length > 1) {
339
+ object[x] = data.getAll(x);
340
+ } else {
341
+ object[x] = data.get(x);
342
+ }
343
+ }
344
+ return object;
345
+ }
346
+ function urlStringifier(object) {
347
+ const params = new URLSearchParams(object);
348
+ for (const [key, value] of Object.entries(object)) {
349
+ if (Array.isArray(value)) {
350
+ params.delete(key);
351
+ value.filter(Boolean).forEach(v => params.append(key, v));
352
+ }
353
+ }
354
+ return params.toString();
355
+ }
356
+ function parseURLString(url, parser = urlParser) {
357
+ return parser(url);
358
+ }
359
+ function stringifyURLString(object, stringifier = urlStringifier) {
360
+ return urlStringifier(object);
361
+ }
362
+
338
363
  // import { validateUserAgentOptions } from '../utils'
339
364
 
340
365
  /*
@@ -347,9 +372,8 @@ function store(initVal) {
347
372
  */
348
373
  const isBrowser = () => window.document && window.document.nodeType === 9;
349
374
  function getSystemInfo() {
350
- var _process;
351
375
  if (isBrowser()) return window.navigator.userAgent;
352
- const nodeVersion = ((_process = process) === null || _process === void 0 ? void 0 : _process.version.slice(1)) || 'unknow'; // unknow environment like React Native etc
376
+ const nodeVersion = process?.version.slice(1) || 'unknow'; // unknow environment like React Native etc
353
377
  const platformInfo = `(${process.platform}; ${process.arch})`;
354
378
 
355
379
  // return `node.js/${nodeVersion}`
@@ -391,35 +415,6 @@ function createUserAgent(options) {
391
415
  return [baseInfo, systemInfo, libraryInfo, contactInfo, customAgent].filter(Boolean).join(' ');
392
416
  }
393
417
 
394
- function urlParser(url) {
395
- const object = {};
396
- const data = new URLSearchParams(url);
397
- for (let x of data.keys()) {
398
- if (data.getAll(x).length > 1) {
399
- object[x] = data.getAll(x);
400
- } else {
401
- object[x] = data.get(x);
402
- }
403
- }
404
- return object;
405
- }
406
- function urlStringifier(object) {
407
- const params = new URLSearchParams(object);
408
- for (const [key, value] of Object.entries(object)) {
409
- if (Array.isArray(value)) {
410
- params.delete(key);
411
- value.filter(Boolean).forEach(v => params.append(key, v));
412
- }
413
- }
414
- return params.toString();
415
- }
416
- function parseURLString(url, parser = urlParser) {
417
- return parser(url);
418
- }
419
- function stringifyURLString(object, stringifier = urlStringifier) {
420
- return urlStringifier(object);
421
- }
422
-
423
418
  /**
424
419
  * validate some essential http options
425
420
  * @param options
@@ -662,12 +657,11 @@ async function executeRequest$1(options) {
662
657
  body
663
658
  });
664
659
  if (response.statusCode >= 200 && response.statusCode < 300) {
665
- var _response;
666
660
  const {
667
661
  access_token: token,
668
662
  expires_in: expiresIn,
669
663
  refresh_token: refreshToken
670
- } = (_response = response) === null || _response === void 0 ? void 0 : _response.data;
664
+ } = response?.data;
671
665
 
672
666
  // calculate token expiration time
673
667
  const expirationTime = calculateExpirationTime(expiresIn);
@@ -821,7 +815,7 @@ function createAuthMiddlewareForExistingTokenFlow$1(authorization, options) {
821
815
  return next => {
822
816
  return async request => {
823
817
  if (typeof authorization !== 'string') throw new Error('authorization must be a string');
824
- const isForce = (options === null || options === void 0 ? void 0 : options.force) === undefined ? true : options.force;
818
+ const isForce = options?.force === undefined ? true : options.force;
825
819
 
826
820
  /**
827
821
  * The request will not be modified if:
@@ -915,13 +909,12 @@ function createConcurrentModificationMiddleware$1() {
915
909
  return async request => {
916
910
  const response = await next(request);
917
911
  if (response.statusCode == 409) {
918
- var _response$error, _response$error$body, _response$error$body$, _response$error$body$2;
919
912
  /**
920
913
  * extract the currentVersion
921
914
  * from the error body and update
922
915
  * request with the currentVersion
923
916
  */
924
- const version = (_response$error = response.error) === null || _response$error === void 0 ? void 0 : (_response$error$body = _response$error.body) === null || _response$error$body === void 0 ? void 0 : (_response$error$body$ = _response$error$body.errors) === null || _response$error$body$ === void 0 ? void 0 : (_response$error$body$2 = _response$error$body$[0]) === null || _response$error$body$2 === void 0 ? void 0 : _response$error$body$2.currentVersion;
917
+ const version = response.error.body?.errors?.[0]?.currentVersion;
925
918
 
926
919
  // update the resource version here
927
920
  if (version) {
@@ -988,7 +981,6 @@ async function executeRequest({
988
981
  includeRequestInErrorResponse
989
982
  } = clientOptions;
990
983
  try {
991
- var _response$data, _response$data2;
992
984
  if (timeout) timer = setTimeout(() => {
993
985
  abortController.abort();
994
986
  }, timeout);
@@ -1018,8 +1010,8 @@ async function executeRequest({
1018
1010
  };
1019
1011
  }
1020
1012
  const error = createError({
1021
- message: (response === null || response === void 0 ? void 0 : (_response$data = response.data) === null || _response$data === void 0 ? void 0 : _response$data.message) || (response === null || response === void 0 ? void 0 : response.message),
1022
- statusCode: response.statusCode || (response === null || response === void 0 ? void 0 : (_response$data2 = response.data) === null || _response$data2 === void 0 ? void 0 : _response$data2.statusCode),
1013
+ message: response?.data?.message || response?.message,
1014
+ statusCode: response.statusCode || response?.data?.statusCode,
1023
1015
  headers: getHeaders(response.headers),
1024
1016
  method: clientOptions.method,
1025
1017
  body: response.data,
@@ -1043,19 +1035,18 @@ async function executeRequest({
1043
1035
  error
1044
1036
  };
1045
1037
  } catch (e) {
1046
- var _e$response, _e$response2, _e$response3, _e$response4, _e$response4$data, _e$response5, _e$response6;
1047
1038
  // We know that this is a network error
1048
- const headers = getHeaders((_e$response = e.response) === null || _e$response === void 0 ? void 0 : _e$response.headers);
1049
- const statusCode = ((_e$response2 = e.response) === null || _e$response2 === void 0 ? void 0 : _e$response2.status) || ((_e$response3 = e.response) === null || _e$response3 === void 0 ? void 0 : _e$response3.data0) || 0;
1050
- const message = (_e$response4 = e.response) === null || _e$response4 === void 0 ? void 0 : (_e$response4$data = _e$response4.data) === null || _e$response4$data === void 0 ? void 0 : _e$response4$data.message;
1039
+ const headers = getHeaders(e.response?.headers);
1040
+ const statusCode = e.response?.status || e.response?.data0 || 0;
1041
+ const message = e.response?.data?.message;
1051
1042
  const error = createError({
1052
1043
  statusCode,
1053
1044
  code: statusCode,
1054
1045
  status: statusCode,
1055
1046
  message: message || e.message,
1056
1047
  headers,
1057
- body: ((_e$response5 = e.response) === null || _e$response5 === void 0 ? void 0 : _e$response5.data) || e,
1058
- error: (_e$response6 = e.response) === null || _e$response6 === void 0 ? void 0 : _e$response6.data,
1048
+ body: e.response?.data || e,
1049
+ error: e.response?.data,
1059
1050
  ...(includeRequestInErrorResponse ? {
1060
1051
  originalRequest: maskSensitiveHeaderData ? maskAuthData(request) : request
1061
1052
  } : {
@@ -1239,7 +1230,7 @@ function createQueueMiddleware$1({
1239
1230
 
1240
1231
  var packageJson = {
1241
1232
  name: "@commercetools/ts-client",
1242
- version: "1.1.0",
1233
+ version: "1.1.1",
1243
1234
  engines: {
1244
1235
  node: ">=14"
1245
1236
  },
@@ -1274,7 +1265,8 @@ var packageJson = {
1274
1265
  dependencies: {
1275
1266
  "abort-controller": "3.0.0",
1276
1267
  buffer: "^6.0.3",
1277
- "node-fetch": "^2.6.1"
1268
+ "node-fetch": "^2.6.1",
1269
+ uuid: "9.0.0"
1278
1270
  },
1279
1271
  files: [
1280
1272
  "dist",
@@ -1289,8 +1281,8 @@ var packageJson = {
1289
1281
  },
1290
1282
  devDependencies: {
1291
1283
  "common-tags": "1.8.2",
1292
- dotenv: "16.0.3",
1293
- jest: "29.5.0",
1284
+ dotenv: "16.3.1",
1285
+ jest: "29.6.2",
1294
1286
  nock: "12.0.3",
1295
1287
  "organize-imports-cli": "0.10.0"
1296
1288
  },
@@ -1399,7 +1391,7 @@ function process$1(request, fn, processOpt) {
1399
1391
  const {
1400
1392
  results,
1401
1393
  count: resultsLength
1402
- } = (payload === null || payload === void 0 ? void 0 : payload.body) || {};
1394
+ } = payload?.body || {};
1403
1395
  if (!resultsLength && hasFirstPageBeenProcessed) {
1404
1396
  return resolve(acc || []);
1405
1397
  }
@@ -1453,15 +1445,10 @@ function createClient(middlewares) {
1453
1445
  ...(includeOriginalRequest ? {
1454
1446
  originalRequest: maskSensitiveHeaderData ? maskAuthData(request) : request
1455
1447
  } : {}),
1456
- ...(response !== null && response !== void 0 && response.retryCount ? {
1448
+ ...(response?.retryCount ? {
1457
1449
  retryCount: response.retryCount
1458
1450
  } : {})
1459
1451
  };
1460
- if (res.error) {
1461
- res.reject(res.error);
1462
- return res;
1463
- }
1464
- res.resolve(res);
1465
1452
  return res;
1466
1453
  }
1467
1454
  };
@@ -1471,11 +1458,11 @@ function createClient(middlewares) {
1471
1458
  execute(request) {
1472
1459
  validate('exec', request);
1473
1460
  return new Promise((resolve, reject) => {
1474
- return dispatch({
1461
+ dispatch({
1475
1462
  reject,
1476
1463
  resolve,
1477
1464
  ...request
1478
- });
1465
+ }).then(resolve).catch(reject);
1479
1466
  });
1480
1467
  }
1481
1468
  };
@@ -1619,7 +1606,7 @@ class ClientBuilder {
1619
1606
  }
1620
1607
  withCorrelationIdMiddleware(options) {
1621
1608
  this.correlationIdMiddleware = createCorrelationIdMiddleware({
1622
- generate: options === null || options === void 0 ? void 0 : options.generate,
1609
+ generate: options?.generate,
1623
1610
  ...options
1624
1611
  });
1625
1612
  return this;
@@ -1662,6 +1649,7 @@ exports.createAuthMiddlewareForExistingTokenFlow = createAuthMiddlewareForExisti
1662
1649
  exports.createAuthMiddlewareForPasswordFlow = createAuthMiddlewareForPasswordFlow$1;
1663
1650
  exports.createAuthMiddlewareForRefreshTokenFlow = createAuthMiddlewareForRefreshTokenFlow$1;
1664
1651
  exports.createClient = createClient;
1652
+ exports.createConcurrentModificationMiddleware = createConcurrentModificationMiddleware$1;
1665
1653
  exports.createCorrelationIdMiddleware = createCorrelationIdMiddleware$1;
1666
1654
  exports.createHttpMiddleware = createHttpMiddleware$1;
1667
1655
  exports.createLoggerMiddleware = createLoggerMiddleware$1;