@labdigital/commercetools-mock 2.46.0 → 2.47.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.
Files changed (79) hide show
  1. package/dist/index.cjs +568 -241
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +782 -58
  4. package/dist/index.d.ts +782 -58
  5. package/dist/index.js +556 -229
  6. package/dist/index.js.map +1 -1
  7. package/package.json +41 -48
  8. package/src/ctMock.ts +11 -13
  9. package/src/index.test.ts +5 -5
  10. package/src/lib/predicateParser.test.ts +62 -62
  11. package/src/lib/predicateParser.ts +32 -42
  12. package/src/lib/productSearchFilter.test.ts +18 -0
  13. package/src/lib/productSearchFilter.ts +7 -0
  14. package/src/lib/projectionSearchFilter.test.ts +17 -17
  15. package/src/lib/projectionSearchFilter.ts +2 -3
  16. package/src/oauth/server.test.ts +1 -1
  17. package/src/oauth/server.ts +11 -11
  18. package/src/priceSelector.ts +1 -1
  19. package/src/product-projection-search.ts +18 -19
  20. package/src/repositories/business-unit.ts +17 -16
  21. package/src/repositories/cart/actions.ts +32 -32
  22. package/src/repositories/cart/helpers.ts +1 -1
  23. package/src/repositories/cart/index.ts +8 -8
  24. package/src/repositories/cart-discount/actions.ts +1 -4
  25. package/src/repositories/category/actions.ts +2 -6
  26. package/src/repositories/custom-object.ts +20 -21
  27. package/src/repositories/customer/actions.ts +4 -4
  28. package/src/repositories/errors.ts +1 -1
  29. package/src/repositories/extension.ts +2 -1
  30. package/src/repositories/helpers.ts +27 -27
  31. package/src/repositories/index.ts +17 -17
  32. package/src/repositories/my-customer.ts +1 -1
  33. package/src/repositories/my-order.ts +2 -2
  34. package/src/repositories/order/index.ts +1 -1
  35. package/src/repositories/product/actions.ts +1 -1
  36. package/src/repositories/quote/actions.ts +83 -0
  37. package/src/repositories/quote/index.ts +54 -0
  38. package/src/repositories/quote-request/actions.ts +84 -0
  39. package/src/repositories/quote-request/index.test.ts +167 -0
  40. package/src/repositories/quote-request/index.ts +67 -0
  41. package/src/repositories/quote-staged/actions.ts +84 -0
  42. package/src/repositories/quote-staged/index.ts +47 -0
  43. package/src/repositories/review.ts +4 -4
  44. package/src/repositories/shipping-method/actions.ts +17 -17
  45. package/src/repositories/shipping-method/index.ts +6 -6
  46. package/src/repositories/shopping-list/actions.ts +1 -1
  47. package/src/repositories/shopping-list/index.ts +9 -1
  48. package/src/repositories/subscription.ts +2 -4
  49. package/src/server.ts +3 -2
  50. package/src/services/abstract.ts +7 -7
  51. package/src/services/as-associate-order.test.ts +1 -1
  52. package/src/services/cart-discount.test.ts +1 -1
  53. package/src/services/cart.test.ts +15 -15
  54. package/src/services/category.test.ts +1 -1
  55. package/src/services/customer.test.ts +4 -4
  56. package/src/services/customer.ts +1 -1
  57. package/src/services/index.ts +20 -14
  58. package/src/services/inventory-entry.test.ts +5 -5
  59. package/src/services/my-cart.test.ts +2 -2
  60. package/src/services/my-customer.test.ts +2 -2
  61. package/src/services/order.test.ts +8 -8
  62. package/src/services/product-projection.test.ts +5 -5
  63. package/src/services/product-projection.ts +12 -14
  64. package/src/services/product.test.ts +1 -1
  65. package/src/services/quote-request.test.ts +59 -0
  66. package/src/services/quote-request.ts +16 -0
  67. package/src/services/quote-staged.ts +16 -0
  68. package/src/services/quote.ts +16 -0
  69. package/src/services/standalone-price.test.ts +4 -4
  70. package/src/services/state.test.ts +1 -1
  71. package/src/services/store.test.ts +2 -2
  72. package/src/services/tax-category.test.ts +1 -1
  73. package/src/shipping.ts +3 -3
  74. package/src/storage/in-memory.ts +55 -63
  75. package/src/testing/customer.ts +1 -1
  76. package/src/types.ts +51 -31
  77. package/src/repositories/quote-request.ts +0 -17
  78. package/src/repositories/quote.ts +0 -14
  79. package/src/repositories/staged-quote.ts +0 -17
package/dist/index.js CHANGED
@@ -144,7 +144,7 @@ var getBearerToken = (request) => {
144
144
  };
145
145
 
146
146
  // src/oauth/store.ts
147
- import { randomBytes } from "node:crypto";
147
+ import { randomBytes } from "crypto";
148
148
  import { v4 as uuidv43 } from "uuid";
149
149
  var OAuth2Store = class {
150
150
  tokens = [];
@@ -209,7 +209,8 @@ var OAuth2Store = class {
209
209
  };
210
210
  }
211
211
  validateToken(token) {
212
- if (!this.validate) return true;
212
+ if (!this.validate)
213
+ return true;
213
214
  const foundToken = this.tokens.find((t) => t.access_token === token);
214
215
  if (foundToken) {
215
216
  return true;
@@ -343,7 +344,8 @@ var OAuth2Server = class {
343
344
  request.query.scope?.toString()
344
345
  );
345
346
  return response.status(200).send(token);
346
- } else if (grantType === "refresh_token") {
347
+ }
348
+ if (grantType === "refresh_token") {
347
349
  const refreshToken = request.query.refresh_token?.toString() || request.body.refresh_token;
348
350
  if (!refreshToken) {
349
351
  return next(
@@ -375,17 +377,16 @@ var OAuth2Server = class {
375
377
  );
376
378
  }
377
379
  return response.status(200).send(token);
378
- } else {
379
- return next(
380
- new CommercetoolsError(
381
- {
382
- code: "unsupported_grant_type",
383
- message: `Invalid parameter: grant_type: Invalid grant type: ${grantType}`
384
- },
385
- 400
386
- )
387
- );
388
380
  }
381
+ return next(
382
+ new CommercetoolsError(
383
+ {
384
+ code: "unsupported_grant_type",
385
+ message: `Invalid parameter: grant_type: Invalid grant type: ${grantType}`
386
+ },
387
+ 400
388
+ )
389
+ );
389
390
  }
390
391
  async customerTokenHandler(request, response, next) {
391
392
  const projectKey = request.params.projectKey;
@@ -552,7 +553,8 @@ import deepEqual from "deep-equal";
552
553
 
553
554
  // src/repositories/errors.ts
554
555
  var checkConcurrentModification = (currentVersion, expectedVersion, identifier) => {
555
- if (currentVersion === expectedVersion) return;
556
+ if (currentVersion === expectedVersion)
557
+ return;
556
558
  throw new CommercetoolsError(
557
559
  {
558
560
  message: `Object ${identifier} has a different version than expected. Expected: ${expectedVersion} - Actual: ${currentVersion}.`,
@@ -743,7 +745,8 @@ import { v4 as uuidv46 } from "uuid";
743
745
  import { Decimal } from "decimal.js/decimal";
744
746
  import { v4 as uuidv44 } from "uuid";
745
747
  var createAddress = (base, projectKey, storage) => {
746
- if (!base) return void 0;
748
+ if (!base)
749
+ return void 0;
747
750
  if (!base?.country) {
748
751
  throw new Error("Country is required");
749
752
  }
@@ -752,9 +755,12 @@ var createAddress = (base, projectKey, storage) => {
752
755
  };
753
756
  };
754
757
  var createCustomFields = (draft, projectKey, storage) => {
755
- if (!draft) return void 0;
756
- if (!draft.type) return void 0;
757
- if (!draft.type.typeId) return void 0;
758
+ if (!draft)
759
+ return void 0;
760
+ if (!draft.type)
761
+ return void 0;
762
+ if (!draft.type.typeId)
763
+ return void 0;
758
764
  const typeResource = storage.getByResourceIdentifier(
759
765
  projectKey,
760
766
  draft.type
@@ -837,7 +843,8 @@ var createTypedMoney = (value) => {
837
843
  return result;
838
844
  };
839
845
  var resolveStoreReference = (ref, projectKey, storage) => {
840
- if (!ref) return void 0;
846
+ if (!ref)
847
+ return void 0;
841
848
  const resource = storage.getByResourceIdentifier(projectKey, ref);
842
849
  if (!resource) {
843
850
  throw new Error("No such store");
@@ -905,7 +912,8 @@ var getRepositoryContext = (request) => ({
905
912
  storeKey: request.params.storeKey
906
913
  });
907
914
  var createAssociate = (a, projectKey, storage) => {
908
- if (!a) return void 0;
915
+ if (!a)
916
+ return void 0;
909
917
  if (!a.associateRoleAssignments) {
910
918
  throw new Error("AssociateRoleAssignments is required");
911
919
  }
@@ -992,10 +1000,6 @@ var markMatchingShippingRatePriceTiers = (cart, tiers) => {
992
1000
  switch (tierType) {
993
1001
  case "CartValue":
994
1002
  return markMatchingCartValueTiers(cart, tiers);
995
- // case 'CartClassification':
996
- // return markMatchingCartClassificationTiers(cart, tiers)
997
- // case 'CartScore':
998
- // return markMatchingCartScoreTiers(cart, tiers)
999
1003
  default:
1000
1004
  throw new Error(`Unsupported tier type: ${tierType}`);
1001
1005
  }
@@ -1008,7 +1012,8 @@ var markMatchingCartValueTiers = (cart, tiers) => {
1008
1012
  let hasMatchingTier = false;
1009
1013
  for (const tier of sortedTiers) {
1010
1014
  const isMatching = !hasMatchingTier && cart.totalPrice.currencyCode === tier.price.currencyCode && cart.totalPrice.centAmount >= tier.minimumCentAmount;
1011
- if (isMatching) hasMatchingTier = true;
1015
+ if (isMatching)
1016
+ hasMatchingTier = true;
1012
1017
  result[tier.minimumCentAmount] = {
1013
1018
  ...tier,
1014
1019
  isMatching
@@ -1032,12 +1037,12 @@ var getShippingMethodsMatchingCart = (context, storage, cart, params = {}) => {
1032
1037
  context.projectKey,
1033
1038
  "shipping-method",
1034
1039
  {
1035
- "where": [
1036
- `zoneRates(zone(id in (:zoneIds)))`,
1040
+ where: [
1041
+ "zoneRates(zone(id in (:zoneIds)))",
1037
1042
  `zoneRates(shippingRates(price(currencyCode="${cart.totalPrice.currencyCode}")))`
1038
1043
  ],
1039
1044
  "var.zoneIds": zoneIds,
1040
- "expand": params.expand
1045
+ expand: params.expand
1041
1046
  }
1042
1047
  );
1043
1048
  const results = shippingMethods.results.map((shippingMethod) => {
@@ -1073,7 +1078,7 @@ var selectPrice = ({
1073
1078
  return countryMatch && currencyMatch;
1074
1079
  });
1075
1080
  };
1076
- var calculateLineItemTotalPrice = (lineItem) => lineItem.price.value.centAmount * lineItem.quantity;
1081
+ var calculateLineItemTotalPrice = (lineItem) => lineItem.price?.value.centAmount * lineItem.quantity;
1077
1082
  var calculateCartTotalPrice = (cart) => cart.lineItems.reduce((cur, item) => cur + item.totalPrice.centAmount, 0);
1078
1083
 
1079
1084
  // src/repositories/cart/actions.ts
@@ -1120,8 +1125,10 @@ var CartUpdateHandler = class extends AbstractUpdateHandler {
1120
1125
  product.masterData.current.masterVariant,
1121
1126
  ...product.masterData.current.variants
1122
1127
  ].find((x) => {
1123
- if (sku) return x.sku === sku;
1124
- if (variantId) return x.id === variantId;
1128
+ if (sku)
1129
+ return x.sku === sku;
1130
+ if (variantId)
1131
+ return x.id === variantId;
1125
1132
  return false;
1126
1133
  });
1127
1134
  if (!variant) {
@@ -1207,7 +1214,7 @@ var CartUpdateHandler = class extends AbstractUpdateHandler {
1207
1214
  } else {
1208
1215
  throw new CommercetoolsError({
1209
1216
  code: "General",
1210
- message: `Either lineItemid or lineItemKey needs to be provided.`
1217
+ message: "Either lineItemid or lineItemKey needs to be provided."
1211
1218
  });
1212
1219
  }
1213
1220
  if (quantity === 0) {
@@ -1474,7 +1481,7 @@ var CartUpdateHandler = class extends AbstractUpdateHandler {
1474
1481
  });
1475
1482
  }
1476
1483
  const zoneRate = method.zoneRates.find(
1477
- (rate) => rate.zone.obj.locations.some((loc) => loc.country === country)
1484
+ (rate) => rate.zone.obj?.locations.some((loc) => loc.country === country)
1478
1485
  );
1479
1486
  if (!zoneRate) {
1480
1487
  throw new Error("Zone rate not found");
@@ -1649,8 +1656,10 @@ var CartRepository = class extends AbstractResourceRepository {
1649
1656
  product.masterData.current.masterVariant,
1650
1657
  ...product.masterData.current.variants
1651
1658
  ].find((x) => {
1652
- if (sku) return x.sku === sku;
1653
- if (variantId) return x.id === variantId;
1659
+ if (sku)
1660
+ return x.sku === sku;
1661
+ if (variantId)
1662
+ return x.id === variantId;
1654
1663
  return false;
1655
1664
  });
1656
1665
  if (!variant) {
@@ -1832,7 +1841,8 @@ var OrderUpdateHandler = class extends AbstractUpdateHandler {
1832
1841
  );
1833
1842
  }
1834
1843
  setStore(context, resource, { store }) {
1835
- if (!store) return;
1844
+ if (!store)
1845
+ return;
1836
1846
  const resolvedType = this._storage.getByResourceIdentifier(
1837
1847
  context.projectKey,
1838
1848
  store
@@ -1863,7 +1873,8 @@ var OrderUpdateHandler = class extends AbstractUpdateHandler {
1863
1873
  };
1864
1874
  }
1865
1875
  updateSyncInfo(context, resource, { channel, externalId, syncedAt }) {
1866
- if (!channel) return;
1876
+ if (!channel)
1877
+ return;
1867
1878
  const resolvedType = this._storage.getByResourceIdentifier(
1868
1879
  context.projectKey,
1869
1880
  channel
@@ -2259,7 +2270,8 @@ var BusinessUnitRepository = class extends AbstractResourceRepository {
2259
2270
  };
2260
2271
  this.saveNew(context, division);
2261
2272
  return division;
2262
- } else if (this._isCompanyDraft(draft)) {
2273
+ }
2274
+ if (this._isCompanyDraft(draft)) {
2263
2275
  const company = resource;
2264
2276
  this.saveNew(context, company);
2265
2277
  return company;
@@ -2381,7 +2393,7 @@ var CartDiscountUpdateHandler = class extends AbstractUpdateHandler {
2381
2393
  throw new CommercetoolsError(
2382
2394
  {
2383
2395
  code: "InvalidOperation",
2384
- message: "Cannot remove custom field " + name + " because it does not exist."
2396
+ message: `Cannot remove custom field ${name} because it does not exist.`
2385
2397
  },
2386
2398
  400
2387
2399
  );
@@ -2561,15 +2573,11 @@ var CategoryUpdateHandler = class extends AbstractUpdateHandler {
2561
2573
  return;
2562
2574
  }
2563
2575
  if (assetId) {
2564
- resource.assets = resource.assets.filter(function(obj) {
2565
- return obj.id !== assetId;
2566
- });
2576
+ resource.assets = resource.assets.filter((obj) => obj.id !== assetId);
2567
2577
  return;
2568
2578
  }
2569
2579
  if (assetKey) {
2570
- resource.assets = resource.assets.filter(function(obj) {
2571
- return obj.key !== assetKey;
2572
- });
2580
+ resource.assets = resource.assets.filter((obj) => obj.key !== assetKey);
2573
2581
  return;
2574
2582
  }
2575
2583
  }
@@ -2792,26 +2800,25 @@ var CustomObjectRepository = class extends AbstractResourceRepository {
2792
2800
  return updated;
2793
2801
  }
2794
2802
  return current;
2795
- } else {
2796
- if (draft.version) {
2797
- throw new CommercetoolsError(
2798
- {
2799
- code: "InvalidOperation",
2800
- message: "version on create must be 0"
2801
- },
2802
- 400
2803
- );
2804
- }
2805
- const baseProperties = getBaseResourceProperties();
2806
- const resource = {
2807
- ...baseProperties,
2808
- container: draft.container,
2809
- key: draft.key,
2810
- value: draft.value
2811
- };
2812
- this.saveNew(context, resource);
2813
- return resource;
2814
2803
  }
2804
+ if (draft.version) {
2805
+ throw new CommercetoolsError(
2806
+ {
2807
+ code: "InvalidOperation",
2808
+ message: "version on create must be 0"
2809
+ },
2810
+ 400
2811
+ );
2812
+ }
2813
+ const baseProperties = getBaseResourceProperties();
2814
+ const resource = {
2815
+ ...baseProperties,
2816
+ container: draft.container,
2817
+ key: draft.key,
2818
+ value: draft.value
2819
+ };
2820
+ this.saveNew(context, resource);
2821
+ return resource;
2815
2822
  }
2816
2823
  getWithContainerAndKey(context, container, key) {
2817
2824
  const items = this._storage.all(context.projectKey, this.getTypeId());
@@ -2836,7 +2843,7 @@ var CustomObjectRepository = class extends AbstractResourceRepository {
2836
2843
  };
2837
2844
 
2838
2845
  // src/repositories/customer/actions.ts
2839
- import assert2 from "node:assert";
2846
+ import assert2 from "assert";
2840
2847
  var CustomerUpdateHandler = class extends AbstractUpdateHandler {
2841
2848
  addAddress(_context, resource, { address }) {
2842
2849
  resource.addresses.push({
@@ -2950,7 +2957,7 @@ var CustomerUpdateHandler = class extends AbstractUpdateHandler {
2950
2957
  }
2951
2958
  resource.authenticationMode = authMode;
2952
2959
  if (authMode === "ExternalAuth") {
2953
- delete resource.password;
2960
+ resource.password = void 0;
2954
2961
  return;
2955
2962
  }
2956
2963
  if (authMode === "Password") {
@@ -3504,7 +3511,8 @@ var ExtensionRepository = class extends AbstractResourceRepository {
3504
3511
  extension,
3505
3512
  "destination.authentication.headerValue"
3506
3513
  );
3507
- } else if (extension.destination.type === "AWSLambda") {
3514
+ }
3515
+ if (extension.destination.type === "AWSLambda") {
3508
3516
  return maskSecretValue(resource, "destination.accessSecret");
3509
3517
  }
3510
3518
  }
@@ -3979,16 +3987,19 @@ function toRegExp(str) {
3979
3987
  return new RegExp(str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"));
3980
3988
  }
3981
3989
  function normalize(regex) {
3982
- if (typeof regex === "string") regex = toRegExp(regex);
3990
+ if (typeof regex === "string")
3991
+ regex = toRegExp(regex);
3983
3992
  if (!regex.source.startsWith("^"))
3984
3993
  return new RegExp(`^${regex.source}`, regex.flags);
3985
- else return regex;
3994
+ else
3995
+ return regex;
3986
3996
  }
3987
3997
  function first(arr, predicate) {
3988
3998
  let i = 0;
3989
3999
  for (const item of arr) {
3990
4000
  const result = predicate(item, i++);
3991
- if (result) return { item, result };
4001
+ if (result)
4002
+ return { item, result };
3992
4003
  }
3993
4004
  }
3994
4005
  var TokenTypes = class {
@@ -4152,7 +4163,8 @@ var Lexer = class {
4152
4163
  */
4153
4164
  peek(position = this._state.position) {
4154
4165
  const read = (i = position) => {
4155
- if (i >= this._state.source.length) return EOF(this);
4166
+ if (i >= this._state.source.length)
4167
+ return EOF(this);
4156
4168
  const n = this._tokenTypes.peek(this._state.source, i);
4157
4169
  if (!n || !n.result) {
4158
4170
  throw new Error(
@@ -4172,7 +4184,8 @@ var Lexer = class {
4172
4184
  ) : null;
4173
4185
  };
4174
4186
  const t = read();
4175
- if (t) return t;
4187
+ if (t)
4188
+ return t;
4176
4189
  let unexpected = this._state.source.substring(position, position + 1);
4177
4190
  try {
4178
4191
  this.peek(position + 1);
@@ -4194,7 +4207,8 @@ var Lexer = class {
4194
4207
  */
4195
4208
  strpos(i) {
4196
4209
  let lines = this._state.source.substring(0, i).split(/\r?\n/);
4197
- if (!Array.isArray(lines)) lines = [lines];
4210
+ if (!Array.isArray(lines))
4211
+ lines = [lines];
4198
4212
  const line = lines.length;
4199
4213
  const column = lines[lines.length - 1].length + 1;
4200
4214
  return { line, column };
@@ -4293,7 +4307,8 @@ var Parser = class {
4293
4307
  * @returns {number} The binding power of the specified token type
4294
4308
  */
4295
4309
  bp(tokenOrType) {
4296
- if (tokenOrType == null) return Number.NEGATIVE_INFINITY;
4310
+ if (tokenOrType == null)
4311
+ return Number.NEGATIVE_INFINITY;
4297
4312
  if (tokenOrType && typeof tokenOrType.isEof == "function" && tokenOrType.isEof())
4298
4313
  return Number.NEGATIVE_INFINITY;
4299
4314
  const type = this._type(tokenOrType);
@@ -4338,21 +4353,27 @@ var Parser = class {
4338
4353
  parse(opts = { terminals: [0] }) {
4339
4354
  const stop = opts.stop = opts.stop || createStop();
4340
4355
  const check = () => {
4341
- if (stop.isStopped()) return false;
4356
+ if (stop.isStopped())
4357
+ return false;
4342
4358
  const t = this.lexer.peek();
4343
4359
  const bp = this.bp(t);
4344
4360
  return opts.terminals.reduce((canContinue, rbpOrType) => {
4345
- if (!canContinue) return false;
4346
- if (typeof rbpOrType == "number") return rbpOrType < bp;
4347
- if (typeof rbpOrType == "string") return t.type != rbpOrType;
4361
+ if (!canContinue)
4362
+ return false;
4363
+ if (typeof rbpOrType == "number")
4364
+ return rbpOrType < bp;
4365
+ if (typeof rbpOrType == "string")
4366
+ return t.type != rbpOrType;
4348
4367
  }, true);
4349
4368
  };
4350
4369
  const mkinfo = (token) => {
4351
4370
  const bp = this.bp(token);
4352
4371
  return { token, bp, stop, ctx: opts.ctx, options: opts };
4353
4372
  };
4354
- if (!opts.terminals) opts.terminals = [0];
4355
- if (opts.terminals.length == 0) opts.terminals.push(0);
4373
+ if (!opts.terminals)
4374
+ opts.terminals = [0];
4375
+ if (opts.terminals.length == 0)
4376
+ opts.terminals.push(0);
4356
4377
  let left = this.nud(mkinfo(this.lexer.next()));
4357
4378
  while (check()) {
4358
4379
  const operator = this.lexer.next();
@@ -4484,7 +4505,7 @@ var parseFilter = (filter) => {
4484
4505
  (t) => ({
4485
4506
  type: "Symbol",
4486
4507
  kind: "int",
4487
- value: parseInt(t.token.match, 10)
4508
+ value: Number.parseInt(t.token.match, 10)
4488
4509
  })
4489
4510
  ).nud("STAR", 5, (_) => ({
4490
4511
  type: "Symbol",
@@ -4508,9 +4529,8 @@ var parseFilter = (filter) => {
4508
4529
  const expr = parser.parse({ terminals: [bp - 1] });
4509
4530
  if (Array.isArray(expr)) {
4510
4531
  return [left, ...expr];
4511
- } else {
4512
- return [left, expr];
4513
4532
  }
4533
+ return [left, expr];
4514
4534
  }).nud("(", 100, (t) => {
4515
4535
  const expr = parser.parse({ terminals: [")"] });
4516
4536
  lexer.expect(")");
@@ -4556,7 +4576,8 @@ var generateMatchFunc = (filter) => {
4556
4576
  throw new Error(`Syntax error while parsing '${filter}'.`);
4557
4577
  }
4558
4578
  return (obj) => {
4559
- if (!result.children) return false;
4579
+ if (!result.children)
4580
+ return false;
4560
4581
  return result.children.some((c) => c.match(obj));
4561
4582
  };
4562
4583
  };
@@ -4662,6 +4683,12 @@ var parseSearchQuery = (searchQuery) => {
4662
4683
  return generateFieldMatchFunc(generateRangeMatchFunc, searchQuery.range);
4663
4684
  }
4664
4685
  if (isSearchExactExpression(searchQuery)) {
4686
+ if (Array.isArray(searchQuery.exact.values)) {
4687
+ return generateFieldMatchFunc(
4688
+ (value) => (searchQuery.exact.values ?? []).includes(value),
4689
+ searchQuery.exact
4690
+ );
4691
+ }
4665
4692
  return generateFieldMatchFunc(
4666
4693
  (value) => value === searchQuery.exact.value,
4667
4694
  searchQuery.exact
@@ -5280,7 +5307,7 @@ var ProductUpdateHandler = class extends AbstractUpdateHandler {
5280
5307
  }
5281
5308
  if (position >= variantImages.length) {
5282
5309
  throw new Error(
5283
- `Invalid position given. Position in images where the image should be moved. Must be between 0 and the total number of images minus 1.`
5310
+ "Invalid position given. Position in images where the image should be moved. Must be between 0 and the total number of images minus 1."
5284
5311
  );
5285
5312
  }
5286
5313
  variant.images = variantImages.filter((image) => image.url !== imageUrl);
@@ -5913,9 +5940,8 @@ var parseQueryExpression = (predicate) => {
5913
5940
  if (Array.isArray(predicate)) {
5914
5941
  const callbacks = predicate.map((item) => generateMatchFunc2(item));
5915
5942
  return (target, variables) => callbacks.every((callback) => callback(target, variables));
5916
- } else {
5917
- return generateMatchFunc2(predicate);
5918
5943
  }
5944
+ return generateMatchFunc2(predicate);
5919
5945
  };
5920
5946
  var validateSymbol = (val) => {
5921
5947
  if (!val.type) {
@@ -5970,7 +5996,7 @@ var generateMatchFunc2 = (predicate) => {
5970
5996
  1,
5971
5997
  (t) => ({
5972
5998
  type: "boolean",
5973
- value: t.token.match === "true" ? true : false,
5999
+ value: t.token.match === "true",
5974
6000
  pos: t.token.strpos()
5975
6001
  })
5976
6002
  ).nud(
@@ -5996,7 +6022,7 @@ var generateMatchFunc2 = (predicate) => {
5996
6022
  1,
5997
6023
  (t) => ({
5998
6024
  type: "int",
5999
- value: parseInt(t.token.match, 10),
6025
+ value: Number.parseInt(t.token.match, 10),
6000
6026
  pos: t.token.strpos()
6001
6027
  })
6002
6028
  ).nud(
@@ -6004,7 +6030,7 @@ var generateMatchFunc2 = (predicate) => {
6004
6030
  1,
6005
6031
  (t) => ({
6006
6032
  type: "float",
6007
- value: parseFloat(t.token.match),
6033
+ value: Number.parseFloat(t.token.match),
6008
6034
  pos: t.token.strpos()
6009
6035
  })
6010
6036
  ).nud("NOT", 100, ({ bp }) => {
@@ -6020,9 +6046,8 @@ var generateMatchFunc2 = (predicate) => {
6020
6046
  const expr = parser.parse({ terminals: [bp - 1] });
6021
6047
  if (Array.isArray(expr)) {
6022
6048
  return [left, ...expr];
6023
- } else {
6024
- return [left, expr];
6025
6049
  }
6050
+ return [left, expr];
6026
6051
  }).nud("(", 100, (t) => {
6027
6052
  const expr = parser.parse({ terminals: [")"] });
6028
6053
  return expr;
@@ -6032,22 +6057,21 @@ var generateMatchFunc2 = (predicate) => {
6032
6057
  return (obj, vars) => {
6033
6058
  if (Array.isArray(obj)) {
6034
6059
  return obj.some((item) => {
6035
- const value = resolveValue(item, left);
6036
- if (value) {
6037
- return expr(value, vars);
6060
+ const value2 = resolveValue(item, left);
6061
+ if (value2) {
6062
+ return expr(value2, vars);
6038
6063
  }
6039
6064
  return false;
6040
6065
  });
6041
- } else {
6042
- const value = resolveValue(obj, left);
6043
- if (value) {
6044
- if (Array.isArray(value)) {
6045
- return value.some((item) => expr(item, vars));
6046
- }
6047
- return expr(value, vars);
6066
+ }
6067
+ const value = resolveValue(obj, left);
6068
+ if (value) {
6069
+ if (Array.isArray(value)) {
6070
+ return value.some((item) => expr(item, vars));
6048
6071
  }
6049
- return false;
6072
+ return expr(value, vars);
6050
6073
  }
6074
+ return false;
6051
6075
  };
6052
6076
  }).bp(")", 0).led("=", 20, ({ left, bp }) => {
6053
6077
  const expr = parser.parse({ terminals: [bp - 1] });
@@ -6062,14 +6086,13 @@ var generateMatchFunc2 = (predicate) => {
6062
6086
  }
6063
6087
  return value === other;
6064
6088
  });
6065
- } else {
6066
- const resolvedValue = resolveValue(obj, left);
6067
- const resolvedSymbol = resolveSymbol(expr, vars);
6068
- if (Array.isArray(resolvedValue)) {
6069
- return !!resolvedValue.some((elem) => elem === resolvedSymbol);
6070
- }
6071
- return resolvedValue === resolvedSymbol;
6072
6089
  }
6090
+ const resolvedValue = resolveValue(obj, left);
6091
+ const resolvedSymbol = resolveSymbol(expr, vars);
6092
+ if (Array.isArray(resolvedValue)) {
6093
+ return !!resolvedValue.some((elem) => elem === resolvedSymbol);
6094
+ }
6095
+ return resolvedValue === resolvedSymbol;
6073
6096
  };
6074
6097
  }).led("!=", 20, ({ left, bp }) => {
6075
6098
  const expr = parser.parse({ terminals: [bp - 1] });
@@ -6106,12 +6129,11 @@ var generateMatchFunc2 = (predicate) => {
6106
6129
  const val = resolveValue(obj, left);
6107
6130
  return val.length === 0;
6108
6131
  };
6109
- } else {
6110
- return (obj, vars) => {
6111
- const val = resolveValue(obj, left);
6112
- return val.length !== 0;
6113
- };
6114
6132
  }
6133
+ return (obj, vars) => {
6134
+ const val = resolveValue(obj, left);
6135
+ return val.length !== 0;
6136
+ };
6115
6137
  }
6116
6138
  case "defined": {
6117
6139
  if (!invert) {
@@ -6119,12 +6141,11 @@ var generateMatchFunc2 = (predicate) => {
6119
6141
  const val = resolveValue(obj, left);
6120
6142
  return val !== void 0;
6121
6143
  };
6122
- } else {
6123
- return (obj, vars) => {
6124
- const val = resolveValue(obj, left);
6125
- return val === void 0;
6126
- };
6127
6144
  }
6145
+ return (obj, vars) => {
6146
+ const val = resolveValue(obj, left);
6147
+ return val === void 0;
6148
+ };
6128
6149
  }
6129
6150
  default: {
6130
6151
  throw new Error("Unexpected");
@@ -6167,7 +6188,8 @@ var generateMatchFunc2 = (predicate) => {
6167
6188
  const expr = parser.parse({ terminals: [")"] });
6168
6189
  return (obj, vars) => {
6169
6190
  const value = resolveValue(obj, left);
6170
- if (!value) return false;
6191
+ if (!value)
6192
+ return false;
6171
6193
  const maxDistance = resolveSymbol(expr[2], vars);
6172
6194
  const distance = haversineDistance(
6173
6195
  {
@@ -6197,9 +6219,8 @@ var generateMatchFunc2 = (predicate) => {
6197
6219
  const array = expr.map((item) => resolveSymbol(item, vars));
6198
6220
  if (keyword.type === "ALL") {
6199
6221
  return array.every((item) => value.includes(item));
6200
- } else {
6201
- return array.some((item) => value.includes(item));
6202
6222
  }
6223
+ return array.some((item) => value.includes(item));
6203
6224
  };
6204
6225
  }).build();
6205
6226
  const result = parser.parse();
@@ -6306,7 +6327,8 @@ var ProductProjectionSearch = class {
6306
6327
  };
6307
6328
  }
6308
6329
  getFacets(params, products) {
6309
- if (!params.facet) return {};
6330
+ if (!params.facet)
6331
+ return {};
6310
6332
  const result = {};
6311
6333
  const regexp = new RegExp(/ counting products$/);
6312
6334
  for (let facet of params.facet) {
@@ -6440,9 +6462,8 @@ var ProductProjectionSearch = class {
6440
6462
  max: numValues > 0 ? Math.max(...values) : 0,
6441
6463
  mean: numValues > 0 ? mean(values) : 0
6442
6464
  };
6443
- } else {
6444
- throw new Error("not supported");
6445
6465
  }
6466
+ throw new Error("not supported");
6446
6467
  }) || [];
6447
6468
  const data = {
6448
6469
  type: "range",
@@ -6789,23 +6810,289 @@ var ProjectUpdateHandler = class extends AbstractUpdateHandler {
6789
6810
  }
6790
6811
  };
6791
6812
 
6792
- // src/repositories/quote.ts
6813
+ // src/repositories/quote/actions.ts
6814
+ var QuoteUpdateHandler = class extends AbstractUpdateHandler {
6815
+ setCustomField(context, resource, { name, value }) {
6816
+ if (!resource.custom) {
6817
+ throw new Error("Resource has no custom field");
6818
+ }
6819
+ resource.custom.fields[name] = value;
6820
+ }
6821
+ setCustomType(context, resource, { type, fields }) {
6822
+ if (!type) {
6823
+ resource.custom = void 0;
6824
+ } else {
6825
+ const resolvedType = this._storage.getByResourceIdentifier(
6826
+ context.projectKey,
6827
+ type
6828
+ );
6829
+ if (!resolvedType) {
6830
+ throw new Error(`Type ${type} not found`);
6831
+ }
6832
+ resource.custom = {
6833
+ type: {
6834
+ typeId: "type",
6835
+ id: resolvedType.id
6836
+ },
6837
+ fields: fields || {}
6838
+ };
6839
+ }
6840
+ }
6841
+ transitionState(context, resource, { state, force }) {
6842
+ let stateReference = void 0;
6843
+ if (state) {
6844
+ stateReference = getReferenceFromResourceIdentifier(
6845
+ state,
6846
+ context.projectKey,
6847
+ this._storage
6848
+ );
6849
+ resource.state = stateReference;
6850
+ } else {
6851
+ throw new CommercetoolsError(
6852
+ {
6853
+ code: "InvalidJsonInput",
6854
+ message: "Request body does not contain valid JSON.",
6855
+ detailedErrorMessage: "actions -> state: Missing required value"
6856
+ },
6857
+ 400
6858
+ );
6859
+ }
6860
+ return resource;
6861
+ }
6862
+ };
6863
+
6864
+ // src/repositories/quote/index.ts
6793
6865
  var QuoteRepository = class extends AbstractResourceRepository {
6794
6866
  constructor(config) {
6795
6867
  super("quote", config);
6868
+ this.actions = new QuoteUpdateHandler(config.storage);
6796
6869
  }
6797
6870
  create(context, draft) {
6798
- throw new Error("not implemented");
6871
+ const staged = this._storage.getByResourceIdentifier(
6872
+ context.projectKey,
6873
+ draft.stagedQuote
6874
+ );
6875
+ const cart = this._storage.getByResourceIdentifier(
6876
+ context.projectKey,
6877
+ staged.quotationCart
6878
+ );
6879
+ if (!cart.customerId) {
6880
+ throw new Error("Cart does not have a customer");
6881
+ }
6882
+ const resource = {
6883
+ ...getBaseResourceProperties(),
6884
+ quoteState: "Accepted",
6885
+ quoteRequest: staged.quoteRequest,
6886
+ lineItems: cart.lineItems,
6887
+ customLineItems: cart.customLineItems,
6888
+ customer: {
6889
+ typeId: "customer",
6890
+ id: cart.customerId
6891
+ },
6892
+ stagedQuote: {
6893
+ typeId: "staged-quote",
6894
+ id: staged.id
6895
+ },
6896
+ totalPrice: cart.totalPrice,
6897
+ taxedPrice: cart.taxedPrice,
6898
+ taxMode: cart.taxMode,
6899
+ taxRoundingMode: cart.taxRoundingMode,
6900
+ taxCalculationMode: cart.taxCalculationMode,
6901
+ billingAddress: cart.billingAddress,
6902
+ shippingAddress: cart.shippingAddress
6903
+ };
6904
+ return resource;
6905
+ }
6906
+ };
6907
+
6908
+ // src/repositories/quote-request/index.ts
6909
+ import assert4 from "assert";
6910
+
6911
+ // src/repositories/quote-request/actions.ts
6912
+ var QuoteRequestUpdateHandler = class extends AbstractUpdateHandler {
6913
+ setCustomField(context, resource, { name, value }) {
6914
+ if (!resource.custom) {
6915
+ throw new Error("Resource has no custom field");
6916
+ }
6917
+ resource.custom.fields[name] = value;
6918
+ }
6919
+ setCustomType(context, resource, { type, fields }) {
6920
+ if (!type) {
6921
+ resource.custom = void 0;
6922
+ } else {
6923
+ const resolvedType = this._storage.getByResourceIdentifier(
6924
+ context.projectKey,
6925
+ type
6926
+ );
6927
+ if (!resolvedType) {
6928
+ throw new Error(`Type ${type} not found`);
6929
+ }
6930
+ resource.custom = {
6931
+ type: {
6932
+ typeId: "type",
6933
+ id: resolvedType.id
6934
+ },
6935
+ fields: fields || {}
6936
+ };
6937
+ }
6938
+ }
6939
+ transitionState(context, resource, { state, force }) {
6940
+ let stateReference = void 0;
6941
+ if (state) {
6942
+ stateReference = getReferenceFromResourceIdentifier(
6943
+ state,
6944
+ context.projectKey,
6945
+ this._storage
6946
+ );
6947
+ resource.state = stateReference;
6948
+ } else {
6949
+ throw new CommercetoolsError(
6950
+ {
6951
+ code: "InvalidJsonInput",
6952
+ message: "Request body does not contain valid JSON.",
6953
+ detailedErrorMessage: "actions -> state: Missing required value"
6954
+ },
6955
+ 400
6956
+ );
6957
+ }
6958
+ return resource;
6799
6959
  }
6800
6960
  };
6801
6961
 
6802
- // src/repositories/quote-request.ts
6962
+ // src/repositories/quote-request/index.ts
6803
6963
  var QuoteRequestRepository = class extends AbstractResourceRepository {
6804
6964
  constructor(config) {
6805
6965
  super("quote-request", config);
6966
+ this.actions = new QuoteRequestUpdateHandler(config.storage);
6967
+ }
6968
+ create(context, draft) {
6969
+ assert4(draft.cart, "draft.cart is missing");
6970
+ return this.createFromCart(context, {
6971
+ id: draft.cart.id,
6972
+ typeId: "cart"
6973
+ });
6974
+ }
6975
+ createFromCart(context, cartReference) {
6976
+ const cart = this._storage.getByResourceIdentifier(
6977
+ context.projectKey,
6978
+ cartReference
6979
+ );
6980
+ if (!cart) {
6981
+ throw new Error("Cannot find cart");
6982
+ }
6983
+ if (!cart.customerId) {
6984
+ throw new Error("Cart does not have a customer");
6985
+ }
6986
+ const resource = {
6987
+ ...getBaseResourceProperties(),
6988
+ billingAddress: cart.billingAddress,
6989
+ cart: cartReference,
6990
+ country: cart.country,
6991
+ custom: cart.custom,
6992
+ customer: {
6993
+ typeId: "customer",
6994
+ id: cart.customerId
6995
+ },
6996
+ customerGroup: cart.customerGroup,
6997
+ customLineItems: [],
6998
+ directDiscounts: cart.directDiscounts,
6999
+ lineItems: cart.lineItems,
7000
+ paymentInfo: cart.paymentInfo,
7001
+ quoteRequestState: "Submitted",
7002
+ shippingAddress: cart.shippingAddress,
7003
+ taxCalculationMode: cart.taxCalculationMode,
7004
+ taxedPrice: cart.taxedPrice,
7005
+ taxMode: cart.taxMode,
7006
+ taxRoundingMode: cart.taxRoundingMode,
7007
+ totalPrice: cart.totalPrice,
7008
+ store: cart.store
7009
+ };
7010
+ return this.saveNew(context, resource);
7011
+ }
7012
+ };
7013
+
7014
+ // src/repositories/quote-staged/actions.ts
7015
+ var StagedQuoteUpdateHandler = class extends AbstractUpdateHandler {
7016
+ setCustomField(context, resource, { name, value }) {
7017
+ if (!resource.custom) {
7018
+ throw new Error("Resource has no custom field");
7019
+ }
7020
+ resource.custom.fields[name] = value;
7021
+ }
7022
+ setCustomType(context, resource, { type, fields }) {
7023
+ if (!type) {
7024
+ resource.custom = void 0;
7025
+ } else {
7026
+ const resolvedType = this._storage.getByResourceIdentifier(
7027
+ context.projectKey,
7028
+ type
7029
+ );
7030
+ if (!resolvedType) {
7031
+ throw new Error(`Type ${type} not found`);
7032
+ }
7033
+ resource.custom = {
7034
+ type: {
7035
+ typeId: "type",
7036
+ id: resolvedType.id
7037
+ },
7038
+ fields: fields || {}
7039
+ };
7040
+ }
7041
+ }
7042
+ transitionState(context, resource, { state, force }) {
7043
+ let stateReference = void 0;
7044
+ if (state) {
7045
+ stateReference = getReferenceFromResourceIdentifier(
7046
+ state,
7047
+ context.projectKey,
7048
+ this._storage
7049
+ );
7050
+ resource.state = stateReference;
7051
+ } else {
7052
+ throw new CommercetoolsError(
7053
+ {
7054
+ code: "InvalidJsonInput",
7055
+ message: "Request body does not contain valid JSON.",
7056
+ detailedErrorMessage: "actions -> state: Missing required value"
7057
+ },
7058
+ 400
7059
+ );
7060
+ }
7061
+ return resource;
7062
+ }
7063
+ };
7064
+
7065
+ // src/repositories/quote-staged/index.ts
7066
+ var StagedQuoteRepository = class extends AbstractResourceRepository {
7067
+ constructor(config) {
7068
+ super("staged-quote", config);
7069
+ this.actions = new StagedQuoteUpdateHandler(config.storage);
6806
7070
  }
6807
7071
  create(context, draft) {
6808
- throw new Error("not implemented");
7072
+ const quoteRequest = this._storage.getByResourceIdentifier(
7073
+ context.projectKey,
7074
+ draft.quoteRequest
7075
+ );
7076
+ if (!quoteRequest.cart) {
7077
+ throw new Error("Cannot find quote request");
7078
+ }
7079
+ const cart = this._storage.getByResourceIdentifier(
7080
+ context.projectKey,
7081
+ quoteRequest.cart
7082
+ );
7083
+ const resource = {
7084
+ ...getBaseResourceProperties(),
7085
+ stagedQuoteState: "InProgress",
7086
+ quoteRequest: {
7087
+ typeId: "quote-request",
7088
+ id: quoteRequest.id
7089
+ },
7090
+ quotationCart: {
7091
+ typeId: "cart",
7092
+ id: cart.id
7093
+ }
7094
+ };
7095
+ return resource;
6809
7096
  }
6810
7097
  };
6811
7098
 
@@ -6815,7 +7102,8 @@ var ReviewRepository = class extends AbstractResourceRepository {
6815
7102
  super("review", config);
6816
7103
  }
6817
7104
  create(context, draft) {
6818
- if (!draft.target) throw new Error("Missing target");
7105
+ if (!draft.target)
7106
+ throw new Error("Missing target");
6819
7107
  const resource = {
6820
7108
  ...getBaseResourceProperties(),
6821
7109
  locale: draft.locale,
@@ -7087,7 +7375,7 @@ var ShoppingListUpdateHandler = class extends AbstractUpdateHandler {
7087
7375
  } else {
7088
7376
  throw new CommercetoolsError({
7089
7377
  code: "General",
7090
- message: `Either lineItemid or lineItemKey needs to be provided.`
7378
+ message: "Either lineItemid or lineItemKey needs to be provided."
7091
7379
  });
7092
7380
  }
7093
7381
  if (quantity === 0) {
@@ -7212,7 +7500,12 @@ var ShoppingListRepository = class extends AbstractResourceRepository {
7212
7500
  context.projectKey,
7213
7501
  this._storage
7214
7502
  ) : void 0,
7215
- store: draft.store ? getStoreKeyReference(draft.store, context.projectKey, this._storage) : void 0
7503
+ store: draft.store ? getStoreKeyReference(draft.store, context.projectKey, this._storage) : void 0,
7504
+ businessUnit: draft.businessUnit ? getBusinessUnitKeyReference(
7505
+ draft.businessUnit,
7506
+ context.projectKey,
7507
+ this._storage
7508
+ ) : void 0
7216
7509
  };
7217
7510
  return this.saveNew(context, resource);
7218
7511
  }
@@ -7267,21 +7560,11 @@ var ShoppingListRepository = class extends AbstractResourceRepository {
7267
7560
  return lineItem;
7268
7561
  }
7269
7562
  throw new Error(
7270
- `must provide either sku, productId or variantId for ShoppingListLineItem`
7563
+ "must provide either sku, productId or variantId for ShoppingListLineItem"
7271
7564
  );
7272
7565
  };
7273
7566
  };
7274
7567
 
7275
- // src/repositories/staged-quote.ts
7276
- var StagedQuoteRepository = class extends AbstractResourceRepository {
7277
- constructor(config) {
7278
- super("staged-quote", config);
7279
- }
7280
- create(context, draft) {
7281
- throw new Error("not implemented");
7282
- }
7283
- };
7284
-
7285
7568
  // src/repositories/standalone-price.ts
7286
7569
  var StandAlonePriceRepository = class extends AbstractResourceRepository {
7287
7570
  constructor(config) {
@@ -7426,7 +7709,8 @@ var StoreRepository = class extends AbstractResourceRepository {
7426
7709
  }
7427
7710
  };
7428
7711
  var transformChannels = (context, storage, channels) => {
7429
- if (!channels) return [];
7712
+ if (!channels)
7713
+ return [];
7430
7714
  return channels.map(
7431
7715
  (ref) => getReferenceFromResourceIdentifier(
7432
7716
  ref,
@@ -7505,7 +7789,8 @@ var SubscriptionRepository = class extends AbstractResourceRepository {
7505
7789
  },
7506
7790
  key: draft.key,
7507
7791
  messages: draft.messages || [],
7508
- status: "Healthy"
7792
+ status: "Healthy",
7793
+ events: draft.events || []
7509
7794
  };
7510
7795
  return this.saveNew(context, resource);
7511
7796
  }
@@ -7727,44 +8012,44 @@ var createRepositories = (config) => ({
7727
8012
  "associate-role": new AssociateRoleRepository(config),
7728
8013
  "attribute-group": new AttributeGroupRepository(config),
7729
8014
  "business-unit": new BusinessUnitRepository(config),
7730
- "category": new CategoryRepository(config),
7731
- "cart": new CartRepository(config),
8015
+ category: new CategoryRepository(config),
8016
+ cart: new CartRepository(config),
7732
8017
  "cart-discount": new CartDiscountRepository(config),
7733
- "customer": new CustomerRepository(config),
7734
- "channel": new ChannelRepository(config),
8018
+ customer: new CustomerRepository(config),
8019
+ channel: new ChannelRepository(config),
7735
8020
  "customer-group": new CustomerGroupRepository(config),
7736
8021
  "discount-code": new DiscountCodeRepository(config),
7737
- "extension": new ExtensionRepository(config),
8022
+ extension: new ExtensionRepository(config),
7738
8023
  "inventory-entry": new InventoryEntryRepository(config),
7739
8024
  "key-value-document": new CustomObjectRepository(config),
7740
- "order": new OrderRepository(config),
8025
+ order: new OrderRepository(config),
7741
8026
  "order-edit": new OrderEditRepository(config),
7742
- "payment": new PaymentRepository(config),
8027
+ payment: new PaymentRepository(config),
7743
8028
  "my-cart": new CartRepository(config),
7744
8029
  "my-order": new MyOrderRepository(config),
7745
8030
  "my-customer": new MyCustomerRepository(config),
7746
8031
  "my-payment": new PaymentRepository(config),
7747
8032
  "my-shopping-list": new ShoppingListRepository(config),
7748
- "product": new ProductRepository(config),
8033
+ product: new ProductRepository(config),
7749
8034
  "product-type": new ProductTypeRepository(config),
7750
8035
  "product-discount": new ProductDiscountRepository(config),
7751
8036
  "product-projection": new ProductProjectionRepository(config),
7752
8037
  "product-selection": new ProductSelectionRepository(config),
7753
8038
  "product-tailoring": new ProductTailoringRepository(config),
7754
- "project": new ProjectRepository(config),
7755
- "review": new ReviewRepository(config),
7756
- "quote": new QuoteRepository(config),
8039
+ project: new ProjectRepository(config),
8040
+ review: new ReviewRepository(config),
8041
+ quote: new QuoteRepository(config),
7757
8042
  "quote-request": new QuoteRequestRepository(config),
7758
8043
  "shipping-method": new ShippingMethodRepository(config),
7759
8044
  "shopping-list": new ShoppingListRepository(config),
7760
8045
  "staged-quote": new StagedQuoteRepository(config),
7761
8046
  "standalone-price": new StandAlonePriceRepository(config),
7762
- "state": new StateRepository(config),
7763
- "store": new StoreRepository(config),
7764
- "subscription": new SubscriptionRepository(config),
8047
+ state: new StateRepository(config),
8048
+ store: new StoreRepository(config),
8049
+ subscription: new SubscriptionRepository(config),
7765
8050
  "tax-category": new TaxCategoryRepository(config),
7766
- "type": new TypeRepository(config),
7767
- "zone": new ZoneRepository(config)
8051
+ type: new TypeRepository(config),
8052
+ zone: new ZoneRepository(config)
7768
8053
  });
7769
8054
 
7770
8055
  // src/services/as-associate.ts
@@ -7845,7 +8130,7 @@ var AbstractService = class {
7845
8130
  return response.status(200).send(result);
7846
8131
  }
7847
8132
  getWithId(request, response) {
7848
- const result = this._expandWithId(request, request.params["id"]);
8133
+ const result = this._expandWithId(request, request.params.id);
7849
8134
  if (!result) {
7850
8135
  return response.status(404).send();
7851
8136
  }
@@ -7854,18 +8139,19 @@ var AbstractService = class {
7854
8139
  getWithKey(request, response) {
7855
8140
  const result = this.repository.getByKey(
7856
8141
  getRepositoryContext(request),
7857
- request.params["key"],
8142
+ request.params.key,
7858
8143
  {
7859
8144
  expand: this._parseParam(request.query.expand)
7860
8145
  }
7861
8146
  );
7862
- if (!result) return response.status(404).send();
8147
+ if (!result)
8148
+ return response.status(404).send();
7863
8149
  return response.status(200).send(result);
7864
8150
  }
7865
8151
  deleteWithId(request, response) {
7866
8152
  const result = this.repository.delete(
7867
8153
  getRepositoryContext(request),
7868
- request.params["id"],
8154
+ request.params.id,
7869
8155
  {
7870
8156
  expand: this._parseParam(request.query.expand)
7871
8157
  }
@@ -7878,7 +8164,7 @@ var AbstractService = class {
7878
8164
  deleteWithKey(request, response) {
7879
8165
  const resource = this.repository.getByKey(
7880
8166
  getRepositoryContext(request),
7881
- request.params["key"]
8167
+ request.params.key
7882
8168
  );
7883
8169
  if (!resource) {
7884
8170
  return response.status(404).send("Not found");
@@ -7911,7 +8197,7 @@ var AbstractService = class {
7911
8197
  );
7912
8198
  const resource = this.repository.get(
7913
8199
  getRepositoryContext(request),
7914
- request.params["id"]
8200
+ request.params.id
7915
8201
  );
7916
8202
  if (!resource) {
7917
8203
  return response.status(404).send("Not found");
@@ -7932,7 +8218,7 @@ var AbstractService = class {
7932
8218
  );
7933
8219
  const resource = this.repository.getByKey(
7934
8220
  getRepositoryContext(request),
7935
- request.params["key"]
8221
+ request.params.key
7936
8222
  );
7937
8223
  if (!resource) {
7938
8224
  return response.status(404).send("Not found");
@@ -8628,19 +8914,19 @@ var ProductProjectionService = class extends AbstractService {
8628
8914
  search(request, response) {
8629
8915
  const query = request.query;
8630
8916
  const searchParams = {
8631
- "filter": queryParamsArray(query.filter),
8917
+ filter: queryParamsArray(query.filter),
8632
8918
  "filter.query": queryParamsArray(query["filter.query"]),
8633
- "facet": queryParamsArray(query.facet),
8634
- "expand": queryParamsArray(query.expand),
8635
- "staged": queryParamsValue(query.staged) === "true",
8636
- "localeProjection": queryParamsValue(query.localeProjection),
8637
- "storeProjection": queryParamsValue(query.storeProjection),
8638
- "priceChannel": queryParamsValue(query.priceChannel),
8639
- "priceCountry": queryParamsValue(query.priceCountry),
8640
- "priceCurrency": queryParamsValue(query.priceCurrency),
8641
- "priceCustomerGroup": queryParamsValue(query.priceCustomerGroup),
8642
- "offset": query.offset ? Number(queryParamsValue(query.offset)) : void 0,
8643
- "limit": query.limit ? Number(queryParamsValue(query.limit)) : void 0
8919
+ facet: queryParamsArray(query.facet),
8920
+ expand: queryParamsArray(query.expand),
8921
+ staged: queryParamsValue(query.staged) === "true",
8922
+ localeProjection: queryParamsValue(query.localeProjection),
8923
+ storeProjection: queryParamsValue(query.storeProjection),
8924
+ priceChannel: queryParamsValue(query.priceChannel),
8925
+ priceCountry: queryParamsValue(query.priceCountry),
8926
+ priceCurrency: queryParamsValue(query.priceCurrency),
8927
+ priceCustomerGroup: queryParamsValue(query.priceCustomerGroup),
8928
+ offset: query.offset ? Number(queryParamsValue(query.offset)) : void 0,
8929
+ limit: query.limit ? Number(queryParamsValue(query.limit)) : void 0
8644
8930
  };
8645
8931
  const resource = this.repository.search(
8646
8932
  getRepositoryContext(request),
@@ -8674,6 +8960,42 @@ var ProductTypeService = class extends AbstractService {
8674
8960
  }
8675
8961
  };
8676
8962
 
8963
+ // src/services/quote.ts
8964
+ var QuoteService = class extends AbstractService {
8965
+ repository;
8966
+ constructor(parent, repository) {
8967
+ super(parent);
8968
+ this.repository = repository;
8969
+ }
8970
+ getBasePath() {
8971
+ return "quotes";
8972
+ }
8973
+ };
8974
+
8975
+ // src/services/quote-request.ts
8976
+ var QuoteRequestService = class extends AbstractService {
8977
+ repository;
8978
+ constructor(parent, repository) {
8979
+ super(parent);
8980
+ this.repository = repository;
8981
+ }
8982
+ getBasePath() {
8983
+ return "quote-requests";
8984
+ }
8985
+ };
8986
+
8987
+ // src/services/quote-staged.ts
8988
+ var StagedQuoteService = class extends AbstractService {
8989
+ repository;
8990
+ constructor(parent, repository) {
8991
+ super(parent);
8992
+ this.repository = repository;
8993
+ }
8994
+ getBasePath() {
8995
+ return "staged-quotes";
8996
+ }
8997
+ };
8998
+
8677
8999
  // src/services/reviews.ts
8678
9000
  var ReviewService = class extends AbstractService {
8679
9001
  repository;
@@ -8817,14 +9139,14 @@ var createServices = (router, repos) => ({
8817
9139
  "associate-role": new AssociateRoleServices(router, repos["associate-role"]),
8818
9140
  "as-associate": new AsAssociateService(router, repos["as-associate"]),
8819
9141
  "business-unit": new BusinessUnitServices(router, repos["business-unit"]),
8820
- "category": new CategoryServices(router, repos["category"]),
8821
- "cart": new CartService(router, repos["cart"], repos["order"]),
9142
+ category: new CategoryServices(router, repos.category),
9143
+ cart: new CartService(router, repos.cart, repos.order),
8822
9144
  "cart-discount": new CartDiscountService(router, repos["cart-discount"]),
8823
- "customer": new CustomerService(router, repos["customer"]),
8824
- "channel": new ChannelService(router, repos["channel"]),
9145
+ customer: new CustomerService(router, repos.customer),
9146
+ channel: new ChannelService(router, repos.channel),
8825
9147
  "customer-group": new CustomerGroupService(router, repos["customer-group"]),
8826
9148
  "discount-code": new DiscountCodeService(router, repos["discount-code"]),
8827
- "extension": new ExtensionServices(router, repos["extension"]),
9149
+ extension: new ExtensionServices(router, repos.extension),
8828
9150
  "inventory-entry": new InventoryEntryService(
8829
9151
  router,
8830
9152
  repos["inventory-entry"]
@@ -8833,8 +9155,8 @@ var createServices = (router, repos) => ({
8833
9155
  router,
8834
9156
  repos["key-value-document"]
8835
9157
  ),
8836
- "order": new OrderService(router, repos["order"]),
8837
- "payment": new PaymentService(router, repos["payment"]),
9158
+ order: new OrderService(router, repos.order),
9159
+ payment: new PaymentService(router, repos.payment),
8838
9160
  "standalone-price": new StandAlonePriceService(
8839
9161
  router,
8840
9162
  repos["standalone-price"]
@@ -8853,7 +9175,7 @@ var createServices = (router, repos) => ({
8853
9175
  repos["shipping-method"]
8854
9176
  ),
8855
9177
  "product-type": new ProductTypeService(router, repos["product-type"]),
8856
- "product": new ProductService(router, repos["product"]),
9178
+ product: new ProductService(router, repos.product),
8857
9179
  "product-discount": new ProductDiscountService(
8858
9180
  router,
8859
9181
  repos["product-discount"]
@@ -8866,18 +9188,21 @@ var createServices = (router, repos) => ({
8866
9188
  router,
8867
9189
  repos["product-selection"]
8868
9190
  ),
8869
- "reviews": new ReviewService(router, repos["review"]),
9191
+ quotes: new QuoteService(router, repos.quote),
9192
+ "quote-request": new QuoteRequestService(router, repos["quote-request"]),
9193
+ reviews: new ReviewService(router, repos.review),
8870
9194
  "shopping-list": new ShoppingListService(router, repos["shopping-list"]),
8871
- "state": new StateService(router, repos["state"]),
8872
- "store": new StoreService(router, repos["store"]),
8873
- "subscription": new SubscriptionService(router, repos["subscription"]),
9195
+ "staged-quote": new StagedQuoteService(router, repos["staged-quote"]),
9196
+ state: new StateService(router, repos.state),
9197
+ store: new StoreService(router, repos.store),
9198
+ subscription: new SubscriptionService(router, repos.subscription),
8874
9199
  "tax-category": new TaxCategoryService(router, repos["tax-category"]),
8875
9200
  "attribute-group": new AttributeGroupService(
8876
9201
  router,
8877
9202
  repos["attribute-group"]
8878
9203
  ),
8879
- "type": new TypeService(router, repos["type"]),
8880
- "zone": new ZoneService(router, repos["zone"])
9204
+ type: new TypeService(router, repos.type),
9205
+ zone: new ZoneService(router, repos.zone)
8881
9206
  });
8882
9207
 
8883
9208
  // src/services/project.ts
@@ -8919,7 +9244,7 @@ var AbstractStorage = class {
8919
9244
  };
8920
9245
 
8921
9246
  // src/storage/in-memory.ts
8922
- import assert4 from "assert";
9247
+ import assert5 from "assert";
8923
9248
  var InMemoryStorage = class extends AbstractStorage {
8924
9249
  resources = {};
8925
9250
  projects = {};
@@ -8966,7 +9291,8 @@ var InMemoryStorage = class extends AbstractStorage {
8966
9291
  getProject = (projectKey) => this.addProject(projectKey);
8967
9292
  // Expand resolves a nested reference and injects the object in the given obj
8968
9293
  expand = (projectKey, obj, clause) => {
8969
- if (!clause) return obj;
9294
+ if (!clause)
9295
+ return obj;
8970
9296
  const newObj = cloneObject(obj);
8971
9297
  if (Array.isArray(clause)) {
8972
9298
  for (const c of clause) {
@@ -8997,13 +9323,15 @@ var InMemoryStorage = class extends AbstractStorage {
8997
9323
  this._resolveReference(projectKey, reference, params.rest);
8998
9324
  } else if (params.index === "*") {
8999
9325
  const reference = obj[params.element];
9000
- if (reference === void 0 || !Array.isArray(reference)) return;
9326
+ if (reference === void 0 || !Array.isArray(reference))
9327
+ return;
9001
9328
  for (const itemRef of reference) {
9002
9329
  this._resolveReference(projectKey, itemRef, params.rest);
9003
9330
  }
9004
9331
  } else {
9005
9332
  const reference = obj[params.element][params.index];
9006
- if (reference === void 0) return;
9333
+ if (reference === void 0)
9334
+ return;
9007
9335
  this._resolveReference(projectKey, reference, params.rest);
9008
9336
  }
9009
9337
  };
@@ -9015,38 +9343,38 @@ var InMemoryStorage = class extends AbstractStorage {
9015
9343
  "associate-role": /* @__PURE__ */ new Map(),
9016
9344
  "attribute-group": /* @__PURE__ */ new Map(),
9017
9345
  "business-unit": /* @__PURE__ */ new Map(),
9018
- "cart": /* @__PURE__ */ new Map(),
9346
+ cart: /* @__PURE__ */ new Map(),
9019
9347
  "cart-discount": /* @__PURE__ */ new Map(),
9020
- "category": /* @__PURE__ */ new Map(),
9021
- "channel": /* @__PURE__ */ new Map(),
9022
- "customer": /* @__PURE__ */ new Map(),
9348
+ category: /* @__PURE__ */ new Map(),
9349
+ channel: /* @__PURE__ */ new Map(),
9350
+ customer: /* @__PURE__ */ new Map(),
9023
9351
  "customer-group": /* @__PURE__ */ new Map(),
9024
9352
  "discount-code": /* @__PURE__ */ new Map(),
9025
- "extension": /* @__PURE__ */ new Map(),
9353
+ extension: /* @__PURE__ */ new Map(),
9026
9354
  "inventory-entry": /* @__PURE__ */ new Map(),
9027
9355
  "key-value-document": /* @__PURE__ */ new Map(),
9028
- "order": /* @__PURE__ */ new Map(),
9356
+ order: /* @__PURE__ */ new Map(),
9029
9357
  "order-edit": /* @__PURE__ */ new Map(),
9030
- "payment": /* @__PURE__ */ new Map(),
9031
- "product": /* @__PURE__ */ new Map(),
9032
- "quote": /* @__PURE__ */ new Map(),
9358
+ payment: /* @__PURE__ */ new Map(),
9359
+ product: /* @__PURE__ */ new Map(),
9360
+ quote: /* @__PURE__ */ new Map(),
9033
9361
  "quote-request": /* @__PURE__ */ new Map(),
9034
9362
  "product-discount": /* @__PURE__ */ new Map(),
9035
9363
  "product-selection": /* @__PURE__ */ new Map(),
9036
9364
  "product-type": /* @__PURE__ */ new Map(),
9037
9365
  "product-projection": /* @__PURE__ */ new Map(),
9038
9366
  "product-tailoring": /* @__PURE__ */ new Map(),
9039
- "review": /* @__PURE__ */ new Map(),
9367
+ review: /* @__PURE__ */ new Map(),
9040
9368
  "shipping-method": /* @__PURE__ */ new Map(),
9041
9369
  "staged-quote": /* @__PURE__ */ new Map(),
9042
- "state": /* @__PURE__ */ new Map(),
9043
- "store": /* @__PURE__ */ new Map(),
9370
+ state: /* @__PURE__ */ new Map(),
9371
+ store: /* @__PURE__ */ new Map(),
9044
9372
  "shopping-list": /* @__PURE__ */ new Map(),
9045
9373
  "standalone-price": /* @__PURE__ */ new Map(),
9046
- "subscription": /* @__PURE__ */ new Map(),
9374
+ subscription: /* @__PURE__ */ new Map(),
9047
9375
  "tax-category": /* @__PURE__ */ new Map(),
9048
- "type": /* @__PURE__ */ new Map(),
9049
- "zone": /* @__PURE__ */ new Map()
9376
+ type: /* @__PURE__ */ new Map(),
9377
+ zone: /* @__PURE__ */ new Map()
9050
9378
  };
9051
9379
  }
9052
9380
  return projectStorage;
@@ -9069,7 +9397,7 @@ var InMemoryStorage = class extends AbstractStorage {
9069
9397
  const store = this.forProjectKey(projectKey);
9070
9398
  store[typeId]?.set(obj.id, obj);
9071
9399
  const resource = this.get(projectKey, typeId, obj.id, params);
9072
- assert4(
9400
+ assert5(
9073
9401
  resource,
9074
9402
  `resource of type ${typeId} with id ${obj.id} not created`
9075
9403
  );
@@ -9214,7 +9542,8 @@ var InMemoryStorage = class extends AbstractStorage {
9214
9542
  });
9215
9543
  }
9216
9544
  _resolveReference(projectKey, reference, expand) {
9217
- if (reference === void 0) return;
9545
+ if (reference === void 0)
9546
+ return;
9218
9547
  if (reference.typeId !== void 0 && (reference.id !== void 0 || reference.key !== void 0)) {
9219
9548
  if (!reference.obj) {
9220
9549
  reference.obj = this.getByResourceIdentifier(projectKey, {
@@ -9367,12 +9696,11 @@ var CommercetoolsMock = class {
9367
9696
  message: err.message,
9368
9697
  errors: [err.info]
9369
9698
  });
9370
- } else {
9371
- console.error(err);
9372
- return resp.status(500).send({
9373
- error: err.message
9374
- });
9375
9699
  }
9700
+ console.error(err);
9701
+ return resp.status(500).send({
9702
+ error: err.message
9703
+ });
9376
9704
  });
9377
9705
  return app;
9378
9706
  }
@@ -9390,7 +9718,7 @@ var CommercetoolsMock = class {
9390
9718
  const body = await request.text();
9391
9719
  const url = new URL(request.url);
9392
9720
  const headers = copyHeaders(request.headers);
9393
- const res = await inject(app).post(url.pathname + "?" + url.searchParams.toString()).body(body).headers(headers).end();
9721
+ const res = await inject(app).post(`${url.pathname}?${url.searchParams.toString()}`).body(body).headers(headers).end();
9394
9722
  return new HttpResponse(res.body, {
9395
9723
  status: res.statusCode,
9396
9724
  headers: mapHeaderType(res.headers)
@@ -9400,7 +9728,7 @@ var CommercetoolsMock = class {
9400
9728
  const body = await request.text();
9401
9729
  const url = new URL(request.url);
9402
9730
  const headers = copyHeaders(request.headers);
9403
- const res = await inject(app).get(url.pathname + "?" + url.searchParams.toString()).body(body).headers(headers).end();
9731
+ const res = await inject(app).get(`${url.pathname}?${url.searchParams.toString()}`).body(body).headers(headers).end();
9404
9732
  if (res.statusCode === 200) {
9405
9733
  const parsedBody = JSON.parse(res.body);
9406
9734
  const resultCount = "count" in parsedBody ? parsedBody.count : Object.keys(parsedBody).length;
@@ -9418,7 +9746,7 @@ var CommercetoolsMock = class {
9418
9746
  const body = await request.text();
9419
9747
  const url = new URL(request.url);
9420
9748
  const headers = copyHeaders(request.headers);
9421
- const res = await inject(app).get(url.pathname + "?" + url.searchParams.toString()).body(body).headers(headers).end();
9749
+ const res = await inject(app).get(`${url.pathname}?${url.searchParams.toString()}`).body(body).headers(headers).end();
9422
9750
  return new HttpResponse(res.body, {
9423
9751
  status: res.statusCode,
9424
9752
  headers: mapHeaderType(res.headers)
@@ -9428,7 +9756,7 @@ var CommercetoolsMock = class {
9428
9756
  const body = await request.text();
9429
9757
  const url = new URL(request.url);
9430
9758
  const headers = copyHeaders(request.headers);
9431
- const res = await inject(app).post(url.pathname + "?" + url.searchParams.toString()).body(body).headers(headers).end();
9759
+ const res = await inject(app).post(`${url.pathname}?${url.searchParams.toString()}`).body(body).headers(headers).end();
9432
9760
  return new HttpResponse(res.body, {
9433
9761
  status: res.statusCode,
9434
9762
  headers: mapHeaderType(res.headers)
@@ -9438,7 +9766,7 @@ var CommercetoolsMock = class {
9438
9766
  const body = await request.text();
9439
9767
  const url = new URL(request.url);
9440
9768
  const headers = copyHeaders(request.headers);
9441
- const res = await inject(app).delete(url.pathname + "?" + url.searchParams.toString()).body(body).headers(headers).end();
9769
+ const res = await inject(app).delete(`${url.pathname}?${url.searchParams.toString()}`).body(body).headers(headers).end();
9442
9770
  return new HttpResponse(res.body, {
9443
9771
  status: res.statusCode,
9444
9772
  headers: mapHeaderType(res.headers)
@@ -9453,10 +9781,9 @@ var CommercetoolsMock = class {
9453
9781
  if (_globalListeners.length > 0) {
9454
9782
  if (this._mswServer !== void 0) {
9455
9783
  throw new Error("Server already started");
9456
- } else {
9457
- process.emitWarning("Server wasn't stopped properly, clearing");
9458
- _globalListeners.forEach((listener) => listener.close());
9459
9784
  }
9785
+ process.emitWarning("Server wasn't stopped properly, clearing");
9786
+ _globalListeners.forEach((listener) => listener.close());
9460
9787
  }
9461
9788
  const server = setupServer();
9462
9789
  this.registerHandlers(server);