@labdigital/commercetools-mock 2.45.1 → 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 (80) hide show
  1. package/dist/index.cjs +614 -250
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +788 -59
  4. package/dist/index.d.ts +788 -59
  5. package/dist/index.js +602 -238
  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 +91 -60
  11. package/src/lib/predicateParser.ts +38 -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/product-search.ts +48 -8
  21. package/src/repositories/business-unit.ts +17 -16
  22. package/src/repositories/cart/actions.ts +32 -32
  23. package/src/repositories/cart/helpers.ts +1 -1
  24. package/src/repositories/cart/index.ts +25 -8
  25. package/src/repositories/cart-discount/actions.ts +1 -4
  26. package/src/repositories/category/actions.ts +2 -6
  27. package/src/repositories/custom-object.ts +20 -21
  28. package/src/repositories/customer/actions.ts +4 -4
  29. package/src/repositories/errors.ts +1 -1
  30. package/src/repositories/extension.ts +2 -1
  31. package/src/repositories/helpers.ts +27 -27
  32. package/src/repositories/index.ts +17 -17
  33. package/src/repositories/my-customer.ts +1 -1
  34. package/src/repositories/my-order.ts +2 -2
  35. package/src/repositories/order/index.ts +1 -1
  36. package/src/repositories/product/actions.ts +1 -1
  37. package/src/repositories/quote/actions.ts +83 -0
  38. package/src/repositories/quote/index.ts +54 -0
  39. package/src/repositories/quote-request/actions.ts +84 -0
  40. package/src/repositories/quote-request/index.test.ts +167 -0
  41. package/src/repositories/quote-request/index.ts +67 -0
  42. package/src/repositories/quote-staged/actions.ts +84 -0
  43. package/src/repositories/quote-staged/index.ts +47 -0
  44. package/src/repositories/review.ts +4 -4
  45. package/src/repositories/shipping-method/actions.ts +17 -17
  46. package/src/repositories/shipping-method/index.ts +6 -6
  47. package/src/repositories/shopping-list/actions.ts +1 -1
  48. package/src/repositories/shopping-list/index.ts +9 -1
  49. package/src/repositories/subscription.ts +2 -4
  50. package/src/server.ts +3 -2
  51. package/src/services/abstract.ts +7 -7
  52. package/src/services/as-associate-order.test.ts +1 -1
  53. package/src/services/cart-discount.test.ts +1 -1
  54. package/src/services/cart.test.ts +40 -15
  55. package/src/services/category.test.ts +1 -1
  56. package/src/services/customer.test.ts +16 -55
  57. package/src/services/customer.ts +1 -1
  58. package/src/services/index.ts +20 -14
  59. package/src/services/inventory-entry.test.ts +5 -5
  60. package/src/services/my-cart.test.ts +2 -2
  61. package/src/services/my-customer.test.ts +2 -2
  62. package/src/services/order.test.ts +8 -8
  63. package/src/services/product-projection.test.ts +5 -5
  64. package/src/services/product-projection.ts +12 -14
  65. package/src/services/product.test.ts +155 -71
  66. package/src/services/quote-request.test.ts +59 -0
  67. package/src/services/quote-request.ts +16 -0
  68. package/src/services/quote-staged.ts +16 -0
  69. package/src/services/quote.ts +16 -0
  70. package/src/services/standalone-price.test.ts +4 -4
  71. package/src/services/state.test.ts +1 -1
  72. package/src/services/store.test.ts +2 -2
  73. package/src/services/tax-category.test.ts +1 -1
  74. package/src/shipping.ts +3 -3
  75. package/src/storage/in-memory.ts +55 -63
  76. package/src/testing/customer.ts +40 -0
  77. package/src/types.ts +51 -31
  78. package/src/repositories/quote-request.ts +0 -17
  79. package/src/repositories/quote.ts +0 -14
  80. package/src/repositories/staged-quote.ts +0 -17
package/dist/index.cjs CHANGED
@@ -246,7 +246,8 @@ var OAuth2Store = class {
246
246
  };
247
247
  }
248
248
  validateToken(token) {
249
- if (!this.validate) return true;
249
+ if (!this.validate)
250
+ return true;
250
251
  const foundToken = this.tokens.find((t) => t.access_token === token);
251
252
  if (foundToken) {
252
253
  return true;
@@ -380,7 +381,8 @@ var OAuth2Server = class {
380
381
  request.query.scope?.toString()
381
382
  );
382
383
  return response.status(200).send(token);
383
- } else if (grantType === "refresh_token") {
384
+ }
385
+ if (grantType === "refresh_token") {
384
386
  const refreshToken = request.query.refresh_token?.toString() || request.body.refresh_token;
385
387
  if (!refreshToken) {
386
388
  return next(
@@ -412,17 +414,16 @@ var OAuth2Server = class {
412
414
  );
413
415
  }
414
416
  return response.status(200).send(token);
415
- } else {
416
- return next(
417
- new CommercetoolsError(
418
- {
419
- code: "unsupported_grant_type",
420
- message: `Invalid parameter: grant_type: Invalid grant type: ${grantType}`
421
- },
422
- 400
423
- )
424
- );
425
417
  }
418
+ return next(
419
+ new CommercetoolsError(
420
+ {
421
+ code: "unsupported_grant_type",
422
+ message: `Invalid parameter: grant_type: Invalid grant type: ${grantType}`
423
+ },
424
+ 400
425
+ )
426
+ );
426
427
  }
427
428
  async customerTokenHandler(request, response, next) {
428
429
  const projectKey = request.params.projectKey;
@@ -589,7 +590,8 @@ var import_deep_equal = __toESM(require("deep-equal"), 1);
589
590
 
590
591
  // src/repositories/errors.ts
591
592
  var checkConcurrentModification = (currentVersion, expectedVersion, identifier) => {
592
- if (currentVersion === expectedVersion) return;
593
+ if (currentVersion === expectedVersion)
594
+ return;
593
595
  throw new CommercetoolsError(
594
596
  {
595
597
  message: `Object ${identifier} has a different version than expected. Expected: ${expectedVersion} - Actual: ${currentVersion}.`,
@@ -780,7 +782,8 @@ var import_uuid6 = require("uuid");
780
782
  var import_decimal = require("decimal.js/decimal");
781
783
  var import_uuid4 = require("uuid");
782
784
  var createAddress = (base, projectKey, storage) => {
783
- if (!base) return void 0;
785
+ if (!base)
786
+ return void 0;
784
787
  if (!base?.country) {
785
788
  throw new Error("Country is required");
786
789
  }
@@ -789,9 +792,12 @@ var createAddress = (base, projectKey, storage) => {
789
792
  };
790
793
  };
791
794
  var createCustomFields = (draft, projectKey, storage) => {
792
- if (!draft) return void 0;
793
- if (!draft.type) return void 0;
794
- if (!draft.type.typeId) return void 0;
795
+ if (!draft)
796
+ return void 0;
797
+ if (!draft.type)
798
+ return void 0;
799
+ if (!draft.type.typeId)
800
+ return void 0;
795
801
  const typeResource = storage.getByResourceIdentifier(
796
802
  projectKey,
797
803
  draft.type
@@ -874,7 +880,8 @@ var createTypedMoney = (value) => {
874
880
  return result;
875
881
  };
876
882
  var resolveStoreReference = (ref, projectKey, storage) => {
877
- if (!ref) return void 0;
883
+ if (!ref)
884
+ return void 0;
878
885
  const resource = storage.getByResourceIdentifier(projectKey, ref);
879
886
  if (!resource) {
880
887
  throw new Error("No such store");
@@ -942,7 +949,8 @@ var getRepositoryContext = (request) => ({
942
949
  storeKey: request.params.storeKey
943
950
  });
944
951
  var createAssociate = (a, projectKey, storage) => {
945
- if (!a) return void 0;
952
+ if (!a)
953
+ return void 0;
946
954
  if (!a.associateRoleAssignments) {
947
955
  throw new Error("AssociateRoleAssignments is required");
948
956
  }
@@ -1029,10 +1037,6 @@ var markMatchingShippingRatePriceTiers = (cart, tiers) => {
1029
1037
  switch (tierType) {
1030
1038
  case "CartValue":
1031
1039
  return markMatchingCartValueTiers(cart, tiers);
1032
- // case 'CartClassification':
1033
- // return markMatchingCartClassificationTiers(cart, tiers)
1034
- // case 'CartScore':
1035
- // return markMatchingCartScoreTiers(cart, tiers)
1036
1040
  default:
1037
1041
  throw new Error(`Unsupported tier type: ${tierType}`);
1038
1042
  }
@@ -1045,7 +1049,8 @@ var markMatchingCartValueTiers = (cart, tiers) => {
1045
1049
  let hasMatchingTier = false;
1046
1050
  for (const tier of sortedTiers) {
1047
1051
  const isMatching = !hasMatchingTier && cart.totalPrice.currencyCode === tier.price.currencyCode && cart.totalPrice.centAmount >= tier.minimumCentAmount;
1048
- if (isMatching) hasMatchingTier = true;
1052
+ if (isMatching)
1053
+ hasMatchingTier = true;
1049
1054
  result[tier.minimumCentAmount] = {
1050
1055
  ...tier,
1051
1056
  isMatching
@@ -1069,12 +1074,12 @@ var getShippingMethodsMatchingCart = (context, storage, cart, params = {}) => {
1069
1074
  context.projectKey,
1070
1075
  "shipping-method",
1071
1076
  {
1072
- "where": [
1073
- `zoneRates(zone(id in (:zoneIds)))`,
1077
+ where: [
1078
+ "zoneRates(zone(id in (:zoneIds)))",
1074
1079
  `zoneRates(shippingRates(price(currencyCode="${cart.totalPrice.currencyCode}")))`
1075
1080
  ],
1076
1081
  "var.zoneIds": zoneIds,
1077
- "expand": params.expand
1082
+ expand: params.expand
1078
1083
  }
1079
1084
  );
1080
1085
  const results = shippingMethods.results.map((shippingMethod) => {
@@ -1110,7 +1115,7 @@ var selectPrice = ({
1110
1115
  return countryMatch && currencyMatch;
1111
1116
  });
1112
1117
  };
1113
- var calculateLineItemTotalPrice = (lineItem) => lineItem.price.value.centAmount * lineItem.quantity;
1118
+ var calculateLineItemTotalPrice = (lineItem) => lineItem.price?.value.centAmount * lineItem.quantity;
1114
1119
  var calculateCartTotalPrice = (cart) => cart.lineItems.reduce((cur, item) => cur + item.totalPrice.centAmount, 0);
1115
1120
 
1116
1121
  // src/repositories/cart/actions.ts
@@ -1157,8 +1162,10 @@ var CartUpdateHandler = class extends AbstractUpdateHandler {
1157
1162
  product.masterData.current.masterVariant,
1158
1163
  ...product.masterData.current.variants
1159
1164
  ].find((x) => {
1160
- if (sku) return x.sku === sku;
1161
- if (variantId) return x.id === variantId;
1165
+ if (sku)
1166
+ return x.sku === sku;
1167
+ if (variantId)
1168
+ return x.id === variantId;
1162
1169
  return false;
1163
1170
  });
1164
1171
  if (!variant) {
@@ -1244,7 +1251,7 @@ var CartUpdateHandler = class extends AbstractUpdateHandler {
1244
1251
  } else {
1245
1252
  throw new CommercetoolsError({
1246
1253
  code: "General",
1247
- message: `Either lineItemid or lineItemKey needs to be provided.`
1254
+ message: "Either lineItemid or lineItemKey needs to be provided."
1248
1255
  });
1249
1256
  }
1250
1257
  if (quantity === 0) {
@@ -1511,7 +1518,7 @@ var CartUpdateHandler = class extends AbstractUpdateHandler {
1511
1518
  });
1512
1519
  }
1513
1520
  const zoneRate = method.zoneRates.find(
1514
- (rate) => rate.zone.obj.locations.some((loc) => loc.country === country)
1521
+ (rate) => rate.zone.obj?.locations.some((loc) => loc.country === country)
1515
1522
  );
1516
1523
  if (!zoneRate) {
1517
1524
  throw new Error("Zone rate not found");
@@ -1589,6 +1596,18 @@ var CartRepository = class extends AbstractResourceRepository {
1589
1596
  this.actions = new CartUpdateHandler(this._storage);
1590
1597
  }
1591
1598
  create(context, draft) {
1599
+ if (draft.anonymousId && draft.customerId) {
1600
+ throw new CommercetoolsError({
1601
+ code: "InvalidOperation",
1602
+ message: "Can set only one of customer OR anonymousId"
1603
+ });
1604
+ }
1605
+ if (draft.customerId) {
1606
+ this._storage.getByResourceIdentifier(context.projectKey, {
1607
+ typeId: "customer",
1608
+ id: draft.customerId
1609
+ });
1610
+ }
1592
1611
  const lineItems = draft.lineItems?.map(
1593
1612
  (draftLineItem) => this.draftLineItemtoLineItem(
1594
1613
  context.projectKey,
@@ -1603,6 +1622,7 @@ var CartRepository = class extends AbstractResourceRepository {
1603
1622
  billingAddress: draft.billingAddress ? createAddress(draft.billingAddress, context.projectKey, this._storage) : void 0,
1604
1623
  cartState: "Active",
1605
1624
  country: draft.country,
1625
+ customerId: draft.customerId,
1606
1626
  customerEmail: draft.customerEmail,
1607
1627
  customLineItems: [],
1608
1628
  directDiscounts: [],
@@ -1673,8 +1693,10 @@ var CartRepository = class extends AbstractResourceRepository {
1673
1693
  product.masterData.current.masterVariant,
1674
1694
  ...product.masterData.current.variants
1675
1695
  ].find((x) => {
1676
- if (sku) return x.sku === sku;
1677
- if (variantId) return x.id === variantId;
1696
+ if (sku)
1697
+ return x.sku === sku;
1698
+ if (variantId)
1699
+ return x.id === variantId;
1678
1700
  return false;
1679
1701
  });
1680
1702
  if (!variant) {
@@ -1716,7 +1738,7 @@ var CartRepository = class extends AbstractResourceRepository {
1716
1738
  };
1717
1739
 
1718
1740
  // src/repositories/order/index.ts
1719
- var import_assert = __toESM(require("assert"), 1);
1741
+ var import_node_assert = __toESM(require("assert"), 1);
1720
1742
 
1721
1743
  // src/repositories/order/actions.ts
1722
1744
  var OrderUpdateHandler = class extends AbstractUpdateHandler {
@@ -1856,7 +1878,8 @@ var OrderUpdateHandler = class extends AbstractUpdateHandler {
1856
1878
  );
1857
1879
  }
1858
1880
  setStore(context, resource, { store }) {
1859
- if (!store) return;
1881
+ if (!store)
1882
+ return;
1860
1883
  const resolvedType = this._storage.getByResourceIdentifier(
1861
1884
  context.projectKey,
1862
1885
  store
@@ -1887,7 +1910,8 @@ var OrderUpdateHandler = class extends AbstractUpdateHandler {
1887
1910
  };
1888
1911
  }
1889
1912
  updateSyncInfo(context, resource, { channel, externalId, syncedAt }) {
1890
- if (!channel) return;
1913
+ if (!channel)
1914
+ return;
1891
1915
  const resolvedType = this._storage.getByResourceIdentifier(
1892
1916
  context.projectKey,
1893
1917
  channel
@@ -1921,7 +1945,7 @@ var OrderRepository = class extends AbstractResourceRepository {
1921
1945
  this.actions = new OrderUpdateHandler(config.storage);
1922
1946
  }
1923
1947
  create(context, draft) {
1924
- (0, import_assert.default)(draft.cart, "draft.cart is missing");
1948
+ (0, import_node_assert.default)(draft.cart, "draft.cart is missing");
1925
1949
  return this.createFromCart(
1926
1950
  context,
1927
1951
  {
@@ -1976,7 +2000,7 @@ var OrderRepository = class extends AbstractResourceRepository {
1976
2000
  return this.saveNew(context, resource);
1977
2001
  }
1978
2002
  import(context, draft) {
1979
- (0, import_assert.default)(this, "OrderRepository not valid");
2003
+ (0, import_node_assert.default)(this, "OrderRepository not valid");
1980
2004
  const resource = {
1981
2005
  ...getBaseResourceProperties(),
1982
2006
  billingAddress: createAddress(
@@ -2283,7 +2307,8 @@ var BusinessUnitRepository = class extends AbstractResourceRepository {
2283
2307
  };
2284
2308
  this.saveNew(context, division);
2285
2309
  return division;
2286
- } else if (this._isCompanyDraft(draft)) {
2310
+ }
2311
+ if (this._isCompanyDraft(draft)) {
2287
2312
  const company = resource;
2288
2313
  this.saveNew(context, company);
2289
2314
  return company;
@@ -2405,7 +2430,7 @@ var CartDiscountUpdateHandler = class extends AbstractUpdateHandler {
2405
2430
  throw new CommercetoolsError(
2406
2431
  {
2407
2432
  code: "InvalidOperation",
2408
- message: "Cannot remove custom field " + name + " because it does not exist."
2433
+ message: `Cannot remove custom field ${name} because it does not exist.`
2409
2434
  },
2410
2435
  400
2411
2436
  );
@@ -2585,15 +2610,11 @@ var CategoryUpdateHandler = class extends AbstractUpdateHandler {
2585
2610
  return;
2586
2611
  }
2587
2612
  if (assetId) {
2588
- resource.assets = resource.assets.filter(function(obj) {
2589
- return obj.id !== assetId;
2590
- });
2613
+ resource.assets = resource.assets.filter((obj) => obj.id !== assetId);
2591
2614
  return;
2592
2615
  }
2593
2616
  if (assetKey) {
2594
- resource.assets = resource.assets.filter(function(obj) {
2595
- return obj.key !== assetKey;
2596
- });
2617
+ resource.assets = resource.assets.filter((obj) => obj.key !== assetKey);
2597
2618
  return;
2598
2619
  }
2599
2620
  }
@@ -2816,26 +2837,25 @@ var CustomObjectRepository = class extends AbstractResourceRepository {
2816
2837
  return updated;
2817
2838
  }
2818
2839
  return current;
2819
- } else {
2820
- if (draft.version) {
2821
- throw new CommercetoolsError(
2822
- {
2823
- code: "InvalidOperation",
2824
- message: "version on create must be 0"
2825
- },
2826
- 400
2827
- );
2828
- }
2829
- const baseProperties = getBaseResourceProperties();
2830
- const resource = {
2831
- ...baseProperties,
2832
- container: draft.container,
2833
- key: draft.key,
2834
- value: draft.value
2835
- };
2836
- this.saveNew(context, resource);
2837
- return resource;
2838
2840
  }
2841
+ if (draft.version) {
2842
+ throw new CommercetoolsError(
2843
+ {
2844
+ code: "InvalidOperation",
2845
+ message: "version on create must be 0"
2846
+ },
2847
+ 400
2848
+ );
2849
+ }
2850
+ const baseProperties = getBaseResourceProperties();
2851
+ const resource = {
2852
+ ...baseProperties,
2853
+ container: draft.container,
2854
+ key: draft.key,
2855
+ value: draft.value
2856
+ };
2857
+ this.saveNew(context, resource);
2858
+ return resource;
2839
2859
  }
2840
2860
  getWithContainerAndKey(context, container, key) {
2841
2861
  const items = this._storage.all(context.projectKey, this.getTypeId());
@@ -2860,7 +2880,7 @@ var CustomObjectRepository = class extends AbstractResourceRepository {
2860
2880
  };
2861
2881
 
2862
2882
  // src/repositories/customer/actions.ts
2863
- var import_node_assert = __toESM(require("assert"), 1);
2883
+ var import_node_assert2 = __toESM(require("assert"), 1);
2864
2884
  var CustomerUpdateHandler = class extends AbstractUpdateHandler {
2865
2885
  addAddress(_context, resource, { address }) {
2866
2886
  resource.addresses.push({
@@ -2870,7 +2890,7 @@ var CustomerUpdateHandler = class extends AbstractUpdateHandler {
2870
2890
  }
2871
2891
  addBillingAddressId(_context, resource, { addressId, addressKey }) {
2872
2892
  const address = this._findAddress(resource, addressId, addressKey, true);
2873
- (0, import_node_assert.default)(address?.id);
2893
+ (0, import_node_assert2.default)(address?.id);
2874
2894
  if (resource.billingAddressIds === void 0) {
2875
2895
  resource.billingAddressIds = [];
2876
2896
  }
@@ -2880,7 +2900,7 @@ var CustomerUpdateHandler = class extends AbstractUpdateHandler {
2880
2900
  }
2881
2901
  addShippingAddressId(_context, resource, { addressId, addressKey }) {
2882
2902
  const address = this._findAddress(resource, addressId, addressKey, true);
2883
- (0, import_node_assert.default)(address?.id);
2903
+ (0, import_node_assert2.default)(address?.id);
2884
2904
  if (resource.shippingAddressIds === void 0) {
2885
2905
  resource.shippingAddressIds = [];
2886
2906
  }
@@ -2894,7 +2914,7 @@ var CustomerUpdateHandler = class extends AbstractUpdateHandler {
2894
2914
  }
2895
2915
  changeAddress(context, resource, { addressId, addressKey, address }) {
2896
2916
  const current = this._findAddress(resource, addressId, addressKey, true);
2897
- (0, import_node_assert.default)(current?.id);
2917
+ (0, import_node_assert2.default)(current?.id);
2898
2918
  const oldAddressIndex = resource.addresses.findIndex(
2899
2919
  (a) => a.id === current.id
2900
2920
  );
@@ -2920,7 +2940,7 @@ var CustomerUpdateHandler = class extends AbstractUpdateHandler {
2920
2940
  action.addressKey,
2921
2941
  true
2922
2942
  );
2923
- (0, import_node_assert.default)(address?.id);
2943
+ (0, import_node_assert2.default)(address?.id);
2924
2944
  resource.addresses = resource.addresses.filter((a) => a.id !== address.id);
2925
2945
  }
2926
2946
  removeBillingAddressId(context, resource, action) {
@@ -2930,7 +2950,7 @@ var CustomerUpdateHandler = class extends AbstractUpdateHandler {
2930
2950
  action.addressKey,
2931
2951
  true
2932
2952
  );
2933
- (0, import_node_assert.default)(address?.id);
2953
+ (0, import_node_assert2.default)(address?.id);
2934
2954
  resource.billingAddressIds = resource.billingAddressIds?.filter(
2935
2955
  (id) => id !== address.id
2936
2956
  );
@@ -2945,7 +2965,7 @@ var CustomerUpdateHandler = class extends AbstractUpdateHandler {
2945
2965
  action.addressKey,
2946
2966
  true
2947
2967
  );
2948
- (0, import_node_assert.default)(address?.id);
2968
+ (0, import_node_assert2.default)(address?.id);
2949
2969
  resource.shippingAddressIds = resource.shippingAddressIds?.filter(
2950
2970
  (id) => id !== address.id
2951
2971
  );
@@ -2974,7 +2994,7 @@ var CustomerUpdateHandler = class extends AbstractUpdateHandler {
2974
2994
  }
2975
2995
  resource.authenticationMode = authMode;
2976
2996
  if (authMode === "ExternalAuth") {
2977
- delete resource.password;
2997
+ resource.password = void 0;
2978
2998
  return;
2979
2999
  }
2980
3000
  if (authMode === "Password") {
@@ -3047,7 +3067,7 @@ var CustomerUpdateHandler = class extends AbstractUpdateHandler {
3047
3067
  action.addressKey,
3048
3068
  true
3049
3069
  );
3050
- (0, import_node_assert.default)(address?.id);
3070
+ (0, import_node_assert2.default)(address?.id);
3051
3071
  resource.defaultBillingAddressId = address.id;
3052
3072
  if (resource.billingAddressIds === void 0) {
3053
3073
  resource.billingAddressIds = [];
@@ -3063,7 +3083,7 @@ var CustomerUpdateHandler = class extends AbstractUpdateHandler {
3063
3083
  action.addressKey,
3064
3084
  true
3065
3085
  );
3066
- (0, import_node_assert.default)(address?.id);
3086
+ (0, import_node_assert2.default)(address?.id);
3067
3087
  resource.defaultShippingAddressId = address.id;
3068
3088
  if (resource.shippingAddressIds === void 0) {
3069
3089
  resource.shippingAddressIds = [];
@@ -3528,7 +3548,8 @@ var ExtensionRepository = class extends AbstractResourceRepository {
3528
3548
  extension,
3529
3549
  "destination.authentication.headerValue"
3530
3550
  );
3531
- } else if (extension.destination.type === "AWSLambda") {
3551
+ }
3552
+ if (extension.destination.type === "AWSLambda") {
3532
3553
  return maskSecretValue(resource, "destination.accessSecret");
3533
3554
  }
3534
3555
  }
@@ -3695,10 +3716,10 @@ var MyCustomerRepository = class extends CustomerRepository {
3695
3716
  };
3696
3717
 
3697
3718
  // src/repositories/my-order.ts
3698
- var import_assert2 = __toESM(require("assert"), 1);
3719
+ var import_node_assert3 = __toESM(require("assert"), 1);
3699
3720
  var MyOrderRepository = class extends OrderRepository {
3700
3721
  create(context, draft) {
3701
- (0, import_assert2.default)(draft.id, "draft.id is missing");
3722
+ (0, import_node_assert3.default)(draft.id, "draft.id is missing");
3702
3723
  const cartIdentifier = {
3703
3724
  id: draft.id,
3704
3725
  typeId: "cart"
@@ -4003,16 +4024,19 @@ function toRegExp(str) {
4003
4024
  return new RegExp(str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"));
4004
4025
  }
4005
4026
  function normalize(regex) {
4006
- if (typeof regex === "string") regex = toRegExp(regex);
4027
+ if (typeof regex === "string")
4028
+ regex = toRegExp(regex);
4007
4029
  if (!regex.source.startsWith("^"))
4008
4030
  return new RegExp(`^${regex.source}`, regex.flags);
4009
- else return regex;
4031
+ else
4032
+ return regex;
4010
4033
  }
4011
4034
  function first(arr, predicate) {
4012
4035
  let i = 0;
4013
4036
  for (const item of arr) {
4014
4037
  const result = predicate(item, i++);
4015
- if (result) return { item, result };
4038
+ if (result)
4039
+ return { item, result };
4016
4040
  }
4017
4041
  }
4018
4042
  var TokenTypes = class {
@@ -4176,7 +4200,8 @@ var Lexer = class {
4176
4200
  */
4177
4201
  peek(position = this._state.position) {
4178
4202
  const read = (i = position) => {
4179
- if (i >= this._state.source.length) return EOF(this);
4203
+ if (i >= this._state.source.length)
4204
+ return EOF(this);
4180
4205
  const n = this._tokenTypes.peek(this._state.source, i);
4181
4206
  if (!n || !n.result) {
4182
4207
  throw new Error(
@@ -4196,7 +4221,8 @@ var Lexer = class {
4196
4221
  ) : null;
4197
4222
  };
4198
4223
  const t = read();
4199
- if (t) return t;
4224
+ if (t)
4225
+ return t;
4200
4226
  let unexpected = this._state.source.substring(position, position + 1);
4201
4227
  try {
4202
4228
  this.peek(position + 1);
@@ -4218,7 +4244,8 @@ var Lexer = class {
4218
4244
  */
4219
4245
  strpos(i) {
4220
4246
  let lines = this._state.source.substring(0, i).split(/\r?\n/);
4221
- if (!Array.isArray(lines)) lines = [lines];
4247
+ if (!Array.isArray(lines))
4248
+ lines = [lines];
4222
4249
  const line = lines.length;
4223
4250
  const column = lines[lines.length - 1].length + 1;
4224
4251
  return { line, column };
@@ -4317,7 +4344,8 @@ var Parser = class {
4317
4344
  * @returns {number} The binding power of the specified token type
4318
4345
  */
4319
4346
  bp(tokenOrType) {
4320
- if (tokenOrType == null) return Number.NEGATIVE_INFINITY;
4347
+ if (tokenOrType == null)
4348
+ return Number.NEGATIVE_INFINITY;
4321
4349
  if (tokenOrType && typeof tokenOrType.isEof == "function" && tokenOrType.isEof())
4322
4350
  return Number.NEGATIVE_INFINITY;
4323
4351
  const type = this._type(tokenOrType);
@@ -4362,21 +4390,27 @@ var Parser = class {
4362
4390
  parse(opts = { terminals: [0] }) {
4363
4391
  const stop = opts.stop = opts.stop || createStop();
4364
4392
  const check = () => {
4365
- if (stop.isStopped()) return false;
4393
+ if (stop.isStopped())
4394
+ return false;
4366
4395
  const t = this.lexer.peek();
4367
4396
  const bp = this.bp(t);
4368
4397
  return opts.terminals.reduce((canContinue, rbpOrType) => {
4369
- if (!canContinue) return false;
4370
- if (typeof rbpOrType == "number") return rbpOrType < bp;
4371
- if (typeof rbpOrType == "string") return t.type != rbpOrType;
4398
+ if (!canContinue)
4399
+ return false;
4400
+ if (typeof rbpOrType == "number")
4401
+ return rbpOrType < bp;
4402
+ if (typeof rbpOrType == "string")
4403
+ return t.type != rbpOrType;
4372
4404
  }, true);
4373
4405
  };
4374
4406
  const mkinfo = (token) => {
4375
4407
  const bp = this.bp(token);
4376
4408
  return { token, bp, stop, ctx: opts.ctx, options: opts };
4377
4409
  };
4378
- if (!opts.terminals) opts.terminals = [0];
4379
- if (opts.terminals.length == 0) opts.terminals.push(0);
4410
+ if (!opts.terminals)
4411
+ opts.terminals = [0];
4412
+ if (opts.terminals.length == 0)
4413
+ opts.terminals.push(0);
4380
4414
  let left = this.nud(mkinfo(this.lexer.next()));
4381
4415
  while (check()) {
4382
4416
  const operator = this.lexer.next();
@@ -4508,7 +4542,7 @@ var parseFilter = (filter) => {
4508
4542
  (t) => ({
4509
4543
  type: "Symbol",
4510
4544
  kind: "int",
4511
- value: parseInt(t.token.match, 10)
4545
+ value: Number.parseInt(t.token.match, 10)
4512
4546
  })
4513
4547
  ).nud("STAR", 5, (_) => ({
4514
4548
  type: "Symbol",
@@ -4532,9 +4566,8 @@ var parseFilter = (filter) => {
4532
4566
  const expr = parser.parse({ terminals: [bp - 1] });
4533
4567
  if (Array.isArray(expr)) {
4534
4568
  return [left, ...expr];
4535
- } else {
4536
- return [left, expr];
4537
4569
  }
4570
+ return [left, expr];
4538
4571
  }).nud("(", 100, (t) => {
4539
4572
  const expr = parser.parse({ terminals: [")"] });
4540
4573
  lexer.expect(")");
@@ -4580,7 +4613,8 @@ var generateMatchFunc = (filter) => {
4580
4613
  throw new Error(`Syntax error while parsing '${filter}'.`);
4581
4614
  }
4582
4615
  return (obj) => {
4583
- if (!result.children) return false;
4616
+ if (!result.children)
4617
+ return false;
4584
4618
  return result.children.some((c) => c.match(obj));
4585
4619
  };
4586
4620
  };
@@ -4686,6 +4720,12 @@ var parseSearchQuery = (searchQuery) => {
4686
4720
  return generateFieldMatchFunc(generateRangeMatchFunc, searchQuery.range);
4687
4721
  }
4688
4722
  if (isSearchExactExpression(searchQuery)) {
4723
+ if (Array.isArray(searchQuery.exact.values)) {
4724
+ return generateFieldMatchFunc(
4725
+ (value) => (searchQuery.exact.values ?? []).includes(value),
4726
+ searchQuery.exact
4727
+ );
4728
+ }
4689
4729
  return generateFieldMatchFunc(
4690
4730
  (value) => value === searchQuery.exact.value,
4691
4731
  searchQuery.exact
@@ -4891,8 +4931,23 @@ var ProductSearch = class {
4891
4931
  this._storage = config.storage;
4892
4932
  }
4893
4933
  search(projectKey, params) {
4894
- let resources = this._storage.all(projectKey, "product").map(
4895
- (r) => this.transform(r, params.productProjectionParameters?.staged ?? false)
4934
+ const availabilityBySku = this._storage.all(projectKey, "inventory-entry").reduce((acc, entry) => {
4935
+ const existingEntry = acc.get(entry.sku);
4936
+ acc.set(entry.sku, {
4937
+ isOnStock: existingEntry?.isOnStock || entry.quantityOnStock > 0,
4938
+ availableQuantity: existingEntry?.availableQuantity ?? 0 + entry.quantityOnStock,
4939
+ // NOTE: This doesn't handle inventory entries for multiple channels,
4940
+ // so it doesn't exactly replicate the behavior of the commercetools api.
4941
+ isOnStockForChannel: existingEntry?.isOnStockForChannel ?? entry.supplyChannel?.id
4942
+ });
4943
+ return acc;
4944
+ }, /* @__PURE__ */ new Map());
4945
+ let productResources = this._storage.all(projectKey, "product").map(
4946
+ (r) => this.transformProduct(
4947
+ r,
4948
+ params.productProjectionParameters?.staged ?? false,
4949
+ availabilityBySku
4950
+ )
4896
4951
  ).filter((p) => {
4897
4952
  if (!(params.productProjectionParameters?.staged ?? false)) {
4898
4953
  return p.published;
@@ -4904,7 +4959,7 @@ var ProductSearch = class {
4904
4959
  try {
4905
4960
  validateSearchQuery(params.query);
4906
4961
  const matchFunc = parseSearchQuery(params.query);
4907
- resources = resources.filter(
4962
+ productResources = productResources.filter(
4908
4963
  (resource) => matchFunc(resource, markMatchingVariant)
4909
4964
  );
4910
4965
  } catch (err) {
@@ -4919,7 +4974,7 @@ var ProductSearch = class {
4919
4974
  }
4920
4975
  }
4921
4976
  if (params.productProjectionParameters) {
4922
- applyPriceSelector(resources, {
4977
+ applyPriceSelector(productResources, {
4923
4978
  country: params.productProjectionParameters.priceCountry,
4924
4979
  channel: params.productProjectionParameters.priceChannel,
4925
4980
  customerGroup: params.productProjectionParameters.priceCustomerGroup,
@@ -4928,7 +4983,10 @@ var ProductSearch = class {
4928
4983
  }
4929
4984
  const offset = params.offset || 0;
4930
4985
  const limit = params.limit || 20;
4931
- const productProjectionsResult = resources.slice(offset, offset + limit);
4986
+ const productProjectionsResult = productResources.slice(
4987
+ offset,
4988
+ offset + limit
4989
+ );
4932
4990
  const productProjectionsParameterGiven = !!params?.productProjectionParameters;
4933
4991
  const results = productProjectionsResult.map(
4934
4992
  (product) => ({
@@ -4941,14 +4999,14 @@ var ProductSearch = class {
4941
4999
  })
4942
5000
  );
4943
5001
  return {
4944
- total: resources.length,
5002
+ total: productResources.length,
4945
5003
  offset,
4946
5004
  limit,
4947
5005
  results,
4948
5006
  facets: []
4949
5007
  };
4950
5008
  }
4951
- transform(product, staged) {
5009
+ transformProduct(product, staged, availabilityBySku) {
4952
5010
  const obj = !staged ? product.masterData.current : product.masterData.staged;
4953
5011
  return {
4954
5012
  id: product.id,
@@ -4962,7 +5020,10 @@ var ProductSearch = class {
4962
5020
  slug: obj.slug,
4963
5021
  categories: obj.categories,
4964
5022
  masterVariant: obj.masterVariant,
4965
- variants: obj.variants,
5023
+ variants: obj.variants.map((variant) => ({
5024
+ ...variant,
5025
+ availability: variant.sku ? availabilityBySku.get(variant.sku) : { isOnStock: false, availableQuantity: 0, isOnStockForChannel: [] }
5026
+ })),
4966
5027
  productType: product.productType,
4967
5028
  hasStagedChanges: product.masterData.hasStagedChanges,
4968
5029
  published: product.masterData.published
@@ -5283,7 +5344,7 @@ var ProductUpdateHandler = class extends AbstractUpdateHandler {
5283
5344
  }
5284
5345
  if (position >= variantImages.length) {
5285
5346
  throw new Error(
5286
- `Invalid position given. Position in images where the image should be moved. Must be between 0 and the total number of images minus 1.`
5347
+ "Invalid position given. Position in images where the image should be moved. Must be between 0 and the total number of images minus 1."
5287
5348
  );
5288
5349
  }
5289
5350
  variant.images = variantImages.filter((image) => image.url !== imageUrl);
@@ -5916,9 +5977,8 @@ var parseQueryExpression = (predicate) => {
5916
5977
  if (Array.isArray(predicate)) {
5917
5978
  const callbacks = predicate.map((item) => generateMatchFunc2(item));
5918
5979
  return (target, variables) => callbacks.every((callback) => callback(target, variables));
5919
- } else {
5920
- return generateMatchFunc2(predicate);
5921
5980
  }
5981
+ return generateMatchFunc2(predicate);
5922
5982
  };
5923
5983
  var validateSymbol = (val) => {
5924
5984
  if (!val.type) {
@@ -5954,7 +6014,10 @@ var resolveValue = (obj, val) => {
5954
6014
  }
5955
6015
  return obj[val.value];
5956
6016
  };
5957
- var getLexer2 = (value) => new Lexer(value).token("AND", /and(?![-_a-z0-9]+)/i).token("OR", /or(?![-_a-z0-9]+)/i).token("NOT", /not(?![-_a-z0-9]+)/i).token("WITHIN", /within(?![-_a-z0-9]+)/i).token("IN", /in(?![-_a-z0-9]+)/i).token("MATCHES_IGNORE_CASE", /matches\s+ignore\s+case(?![-_a-z0-9]+)/i).token("CONTAINS", /contains(?![-_a-z0-9]+)/i).token("ALL", /all(?![-_a-z0-9]+)/i).token("ANY", /any(?![-_a-z0-9]+)/i).token("EMPTY", /empty(?![-_a-z0-9]+)/i).token("IS", /is(?![-_a-z0-9]+)/i).token("DEFINED", /defined(?![-_a-z0-9]+)/i).token("FLOAT", /\d+\.\d+/).token("INT", /\d+/).token("VARIABLE", /:([-_A-Za-z0-9]+)/).token("BOOLEAN", /(true|false)/).token("IDENTIFIER", /[-_A-Za-z0-9]+/).token("STRING", /"((?:\\.|[^"\\])*)"/).token("STRING", /'((?:\\.|[^'\\])*)'/).token("COMMA", ",").token("(", "(").token(")", ")").token(">=", ">=").token("<=", "<=").token(">", ">").token("<", "<").token("!=", "!=").token("=", "=").token('"', '"').token("WS", /\s+/, true);
6017
+ var getLexer2 = (value) => new Lexer(value).token("AND", /and(?![-_a-z0-9]+)/i).token("OR", /or(?![-_a-z0-9]+)/i).token("NOT", /not(?![-_a-z0-9]+)/i).token("WITHIN", /within(?![-_a-z0-9]+)/i).token("IN", /in(?![-_a-z0-9]+)/i).token("MATCHES_IGNORE_CASE", /matches\s+ignore\s+case(?![-_a-z0-9]+)/i).token("CONTAINS", /contains(?![-_a-z0-9]+)/i).token("ALL", /all(?![-_a-z0-9]+)/i).token("ANY", /any(?![-_a-z0-9]+)/i).token("EMPTY", /empty(?![-_a-z0-9]+)/i).token("IS", /is(?![-_a-z0-9]+)/i).token("DEFINED", /defined(?![-_a-z0-9]+)/i).token(
6018
+ "IDENTIFIER",
6019
+ /[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}/
6020
+ ).token("FLOAT", /\d+\.\d+/).token("INT", /\d+/).token("VARIABLE", /:([-_A-Za-z0-9]+)/).token("BOOLEAN", /(true|false)/).token("IDENTIFIER", /[-_A-Za-z0-9]+/).token("STRING", /"((?:\\.|[^"\\])*)"/).token("STRING", /'((?:\\.|[^'\\])*)'/).token("COMMA", ",").token("(", "(").token(")", ")").token(">=", ">=").token("<=", "<=").token(">", ">").token("<", "<").token("!=", "!=").token("=", "=").token('"', '"').token("WS", /\s+/, true);
5958
6021
  var generateMatchFunc2 = (predicate) => {
5959
6022
  const lexer = getLexer2(predicate);
5960
6023
  const parser = new Parser(lexer).builder().nud(
@@ -5970,7 +6033,7 @@ var generateMatchFunc2 = (predicate) => {
5970
6033
  1,
5971
6034
  (t) => ({
5972
6035
  type: "boolean",
5973
- value: t.token.match === "true" ? true : false,
6036
+ value: t.token.match === "true",
5974
6037
  pos: t.token.strpos()
5975
6038
  })
5976
6039
  ).nud(
@@ -5996,7 +6059,7 @@ var generateMatchFunc2 = (predicate) => {
5996
6059
  1,
5997
6060
  (t) => ({
5998
6061
  type: "int",
5999
- value: parseInt(t.token.match, 10),
6062
+ value: Number.parseInt(t.token.match, 10),
6000
6063
  pos: t.token.strpos()
6001
6064
  })
6002
6065
  ).nud(
@@ -6004,7 +6067,7 @@ var generateMatchFunc2 = (predicate) => {
6004
6067
  1,
6005
6068
  (t) => ({
6006
6069
  type: "float",
6007
- value: parseFloat(t.token.match),
6070
+ value: Number.parseFloat(t.token.match),
6008
6071
  pos: t.token.strpos()
6009
6072
  })
6010
6073
  ).nud("NOT", 100, ({ bp }) => {
@@ -6020,9 +6083,8 @@ var generateMatchFunc2 = (predicate) => {
6020
6083
  const expr = parser.parse({ terminals: [bp - 1] });
6021
6084
  if (Array.isArray(expr)) {
6022
6085
  return [left, ...expr];
6023
- } else {
6024
- return [left, expr];
6025
6086
  }
6087
+ return [left, expr];
6026
6088
  }).nud("(", 100, (t) => {
6027
6089
  const expr = parser.parse({ terminals: [")"] });
6028
6090
  return expr;
@@ -6032,22 +6094,21 @@ var generateMatchFunc2 = (predicate) => {
6032
6094
  return (obj, vars) => {
6033
6095
  if (Array.isArray(obj)) {
6034
6096
  return obj.some((item) => {
6035
- const value = resolveValue(item, left);
6036
- if (value) {
6037
- return expr(value, vars);
6097
+ const value2 = resolveValue(item, left);
6098
+ if (value2) {
6099
+ return expr(value2, vars);
6038
6100
  }
6039
6101
  return false;
6040
6102
  });
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);
6103
+ }
6104
+ const value = resolveValue(obj, left);
6105
+ if (value) {
6106
+ if (Array.isArray(value)) {
6107
+ return value.some((item) => expr(item, vars));
6048
6108
  }
6049
- return false;
6109
+ return expr(value, vars);
6050
6110
  }
6111
+ return false;
6051
6112
  };
6052
6113
  }).bp(")", 0).led("=", 20, ({ left, bp }) => {
6053
6114
  const expr = parser.parse({ terminals: [bp - 1] });
@@ -6062,14 +6123,13 @@ var generateMatchFunc2 = (predicate) => {
6062
6123
  }
6063
6124
  return value === other;
6064
6125
  });
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
6126
  }
6127
+ const resolvedValue = resolveValue(obj, left);
6128
+ const resolvedSymbol = resolveSymbol(expr, vars);
6129
+ if (Array.isArray(resolvedValue)) {
6130
+ return !!resolvedValue.some((elem) => elem === resolvedSymbol);
6131
+ }
6132
+ return resolvedValue === resolvedSymbol;
6073
6133
  };
6074
6134
  }).led("!=", 20, ({ left, bp }) => {
6075
6135
  const expr = parser.parse({ terminals: [bp - 1] });
@@ -6106,12 +6166,11 @@ var generateMatchFunc2 = (predicate) => {
6106
6166
  const val = resolveValue(obj, left);
6107
6167
  return val.length === 0;
6108
6168
  };
6109
- } else {
6110
- return (obj, vars) => {
6111
- const val = resolveValue(obj, left);
6112
- return val.length !== 0;
6113
- };
6114
6169
  }
6170
+ return (obj, vars) => {
6171
+ const val = resolveValue(obj, left);
6172
+ return val.length !== 0;
6173
+ };
6115
6174
  }
6116
6175
  case "defined": {
6117
6176
  if (!invert) {
@@ -6119,12 +6178,11 @@ var generateMatchFunc2 = (predicate) => {
6119
6178
  const val = resolveValue(obj, left);
6120
6179
  return val !== void 0;
6121
6180
  };
6122
- } else {
6123
- return (obj, vars) => {
6124
- const val = resolveValue(obj, left);
6125
- return val === void 0;
6126
- };
6127
6181
  }
6182
+ return (obj, vars) => {
6183
+ const val = resolveValue(obj, left);
6184
+ return val === void 0;
6185
+ };
6128
6186
  }
6129
6187
  default: {
6130
6188
  throw new Error("Unexpected");
@@ -6167,7 +6225,8 @@ var generateMatchFunc2 = (predicate) => {
6167
6225
  const expr = parser.parse({ terminals: [")"] });
6168
6226
  return (obj, vars) => {
6169
6227
  const value = resolveValue(obj, left);
6170
- if (!value) return false;
6228
+ if (!value)
6229
+ return false;
6171
6230
  const maxDistance = resolveSymbol(expr[2], vars);
6172
6231
  const distance = haversineDistance(
6173
6232
  {
@@ -6197,9 +6256,8 @@ var generateMatchFunc2 = (predicate) => {
6197
6256
  const array = expr.map((item) => resolveSymbol(item, vars));
6198
6257
  if (keyword.type === "ALL") {
6199
6258
  return array.every((item) => value.includes(item));
6200
- } else {
6201
- return array.some((item) => value.includes(item));
6202
6259
  }
6260
+ return array.some((item) => value.includes(item));
6203
6261
  };
6204
6262
  }).build();
6205
6263
  const result = parser.parse();
@@ -6306,7 +6364,8 @@ var ProductProjectionSearch = class {
6306
6364
  };
6307
6365
  }
6308
6366
  getFacets(params, products) {
6309
- if (!params.facet) return {};
6367
+ if (!params.facet)
6368
+ return {};
6310
6369
  const result = {};
6311
6370
  const regexp = new RegExp(/ counting products$/);
6312
6371
  for (let facet of params.facet) {
@@ -6440,9 +6499,8 @@ var ProductProjectionSearch = class {
6440
6499
  max: numValues > 0 ? Math.max(...values) : 0,
6441
6500
  mean: numValues > 0 ? mean(values) : 0
6442
6501
  };
6443
- } else {
6444
- throw new Error("not supported");
6445
6502
  }
6503
+ throw new Error("not supported");
6446
6504
  }) || [];
6447
6505
  const data = {
6448
6506
  type: "range",
@@ -6789,23 +6847,289 @@ var ProjectUpdateHandler = class extends AbstractUpdateHandler {
6789
6847
  }
6790
6848
  };
6791
6849
 
6792
- // src/repositories/quote.ts
6850
+ // src/repositories/quote/actions.ts
6851
+ var QuoteUpdateHandler = class extends AbstractUpdateHandler {
6852
+ setCustomField(context, resource, { name, value }) {
6853
+ if (!resource.custom) {
6854
+ throw new Error("Resource has no custom field");
6855
+ }
6856
+ resource.custom.fields[name] = value;
6857
+ }
6858
+ setCustomType(context, resource, { type, fields }) {
6859
+ if (!type) {
6860
+ resource.custom = void 0;
6861
+ } else {
6862
+ const resolvedType = this._storage.getByResourceIdentifier(
6863
+ context.projectKey,
6864
+ type
6865
+ );
6866
+ if (!resolvedType) {
6867
+ throw new Error(`Type ${type} not found`);
6868
+ }
6869
+ resource.custom = {
6870
+ type: {
6871
+ typeId: "type",
6872
+ id: resolvedType.id
6873
+ },
6874
+ fields: fields || {}
6875
+ };
6876
+ }
6877
+ }
6878
+ transitionState(context, resource, { state, force }) {
6879
+ let stateReference = void 0;
6880
+ if (state) {
6881
+ stateReference = getReferenceFromResourceIdentifier(
6882
+ state,
6883
+ context.projectKey,
6884
+ this._storage
6885
+ );
6886
+ resource.state = stateReference;
6887
+ } else {
6888
+ throw new CommercetoolsError(
6889
+ {
6890
+ code: "InvalidJsonInput",
6891
+ message: "Request body does not contain valid JSON.",
6892
+ detailedErrorMessage: "actions -> state: Missing required value"
6893
+ },
6894
+ 400
6895
+ );
6896
+ }
6897
+ return resource;
6898
+ }
6899
+ };
6900
+
6901
+ // src/repositories/quote/index.ts
6793
6902
  var QuoteRepository = class extends AbstractResourceRepository {
6794
6903
  constructor(config) {
6795
6904
  super("quote", config);
6905
+ this.actions = new QuoteUpdateHandler(config.storage);
6796
6906
  }
6797
6907
  create(context, draft) {
6798
- throw new Error("not implemented");
6908
+ const staged = this._storage.getByResourceIdentifier(
6909
+ context.projectKey,
6910
+ draft.stagedQuote
6911
+ );
6912
+ const cart = this._storage.getByResourceIdentifier(
6913
+ context.projectKey,
6914
+ staged.quotationCart
6915
+ );
6916
+ if (!cart.customerId) {
6917
+ throw new Error("Cart does not have a customer");
6918
+ }
6919
+ const resource = {
6920
+ ...getBaseResourceProperties(),
6921
+ quoteState: "Accepted",
6922
+ quoteRequest: staged.quoteRequest,
6923
+ lineItems: cart.lineItems,
6924
+ customLineItems: cart.customLineItems,
6925
+ customer: {
6926
+ typeId: "customer",
6927
+ id: cart.customerId
6928
+ },
6929
+ stagedQuote: {
6930
+ typeId: "staged-quote",
6931
+ id: staged.id
6932
+ },
6933
+ totalPrice: cart.totalPrice,
6934
+ taxedPrice: cart.taxedPrice,
6935
+ taxMode: cart.taxMode,
6936
+ taxRoundingMode: cart.taxRoundingMode,
6937
+ taxCalculationMode: cart.taxCalculationMode,
6938
+ billingAddress: cart.billingAddress,
6939
+ shippingAddress: cart.shippingAddress
6940
+ };
6941
+ return resource;
6942
+ }
6943
+ };
6944
+
6945
+ // src/repositories/quote-request/index.ts
6946
+ var import_node_assert4 = __toESM(require("assert"), 1);
6947
+
6948
+ // src/repositories/quote-request/actions.ts
6949
+ var QuoteRequestUpdateHandler = class extends AbstractUpdateHandler {
6950
+ setCustomField(context, resource, { name, value }) {
6951
+ if (!resource.custom) {
6952
+ throw new Error("Resource has no custom field");
6953
+ }
6954
+ resource.custom.fields[name] = value;
6955
+ }
6956
+ setCustomType(context, resource, { type, fields }) {
6957
+ if (!type) {
6958
+ resource.custom = void 0;
6959
+ } else {
6960
+ const resolvedType = this._storage.getByResourceIdentifier(
6961
+ context.projectKey,
6962
+ type
6963
+ );
6964
+ if (!resolvedType) {
6965
+ throw new Error(`Type ${type} not found`);
6966
+ }
6967
+ resource.custom = {
6968
+ type: {
6969
+ typeId: "type",
6970
+ id: resolvedType.id
6971
+ },
6972
+ fields: fields || {}
6973
+ };
6974
+ }
6975
+ }
6976
+ transitionState(context, resource, { state, force }) {
6977
+ let stateReference = void 0;
6978
+ if (state) {
6979
+ stateReference = getReferenceFromResourceIdentifier(
6980
+ state,
6981
+ context.projectKey,
6982
+ this._storage
6983
+ );
6984
+ resource.state = stateReference;
6985
+ } else {
6986
+ throw new CommercetoolsError(
6987
+ {
6988
+ code: "InvalidJsonInput",
6989
+ message: "Request body does not contain valid JSON.",
6990
+ detailedErrorMessage: "actions -> state: Missing required value"
6991
+ },
6992
+ 400
6993
+ );
6994
+ }
6995
+ return resource;
6799
6996
  }
6800
6997
  };
6801
6998
 
6802
- // src/repositories/quote-request.ts
6999
+ // src/repositories/quote-request/index.ts
6803
7000
  var QuoteRequestRepository = class extends AbstractResourceRepository {
6804
7001
  constructor(config) {
6805
7002
  super("quote-request", config);
7003
+ this.actions = new QuoteRequestUpdateHandler(config.storage);
7004
+ }
7005
+ create(context, draft) {
7006
+ (0, import_node_assert4.default)(draft.cart, "draft.cart is missing");
7007
+ return this.createFromCart(context, {
7008
+ id: draft.cart.id,
7009
+ typeId: "cart"
7010
+ });
7011
+ }
7012
+ createFromCart(context, cartReference) {
7013
+ const cart = this._storage.getByResourceIdentifier(
7014
+ context.projectKey,
7015
+ cartReference
7016
+ );
7017
+ if (!cart) {
7018
+ throw new Error("Cannot find cart");
7019
+ }
7020
+ if (!cart.customerId) {
7021
+ throw new Error("Cart does not have a customer");
7022
+ }
7023
+ const resource = {
7024
+ ...getBaseResourceProperties(),
7025
+ billingAddress: cart.billingAddress,
7026
+ cart: cartReference,
7027
+ country: cart.country,
7028
+ custom: cart.custom,
7029
+ customer: {
7030
+ typeId: "customer",
7031
+ id: cart.customerId
7032
+ },
7033
+ customerGroup: cart.customerGroup,
7034
+ customLineItems: [],
7035
+ directDiscounts: cart.directDiscounts,
7036
+ lineItems: cart.lineItems,
7037
+ paymentInfo: cart.paymentInfo,
7038
+ quoteRequestState: "Submitted",
7039
+ shippingAddress: cart.shippingAddress,
7040
+ taxCalculationMode: cart.taxCalculationMode,
7041
+ taxedPrice: cart.taxedPrice,
7042
+ taxMode: cart.taxMode,
7043
+ taxRoundingMode: cart.taxRoundingMode,
7044
+ totalPrice: cart.totalPrice,
7045
+ store: cart.store
7046
+ };
7047
+ return this.saveNew(context, resource);
7048
+ }
7049
+ };
7050
+
7051
+ // src/repositories/quote-staged/actions.ts
7052
+ var StagedQuoteUpdateHandler = class extends AbstractUpdateHandler {
7053
+ setCustomField(context, resource, { name, value }) {
7054
+ if (!resource.custom) {
7055
+ throw new Error("Resource has no custom field");
7056
+ }
7057
+ resource.custom.fields[name] = value;
7058
+ }
7059
+ setCustomType(context, resource, { type, fields }) {
7060
+ if (!type) {
7061
+ resource.custom = void 0;
7062
+ } else {
7063
+ const resolvedType = this._storage.getByResourceIdentifier(
7064
+ context.projectKey,
7065
+ type
7066
+ );
7067
+ if (!resolvedType) {
7068
+ throw new Error(`Type ${type} not found`);
7069
+ }
7070
+ resource.custom = {
7071
+ type: {
7072
+ typeId: "type",
7073
+ id: resolvedType.id
7074
+ },
7075
+ fields: fields || {}
7076
+ };
7077
+ }
7078
+ }
7079
+ transitionState(context, resource, { state, force }) {
7080
+ let stateReference = void 0;
7081
+ if (state) {
7082
+ stateReference = getReferenceFromResourceIdentifier(
7083
+ state,
7084
+ context.projectKey,
7085
+ this._storage
7086
+ );
7087
+ resource.state = stateReference;
7088
+ } else {
7089
+ throw new CommercetoolsError(
7090
+ {
7091
+ code: "InvalidJsonInput",
7092
+ message: "Request body does not contain valid JSON.",
7093
+ detailedErrorMessage: "actions -> state: Missing required value"
7094
+ },
7095
+ 400
7096
+ );
7097
+ }
7098
+ return resource;
7099
+ }
7100
+ };
7101
+
7102
+ // src/repositories/quote-staged/index.ts
7103
+ var StagedQuoteRepository = class extends AbstractResourceRepository {
7104
+ constructor(config) {
7105
+ super("staged-quote", config);
7106
+ this.actions = new StagedQuoteUpdateHandler(config.storage);
6806
7107
  }
6807
7108
  create(context, draft) {
6808
- throw new Error("not implemented");
7109
+ const quoteRequest = this._storage.getByResourceIdentifier(
7110
+ context.projectKey,
7111
+ draft.quoteRequest
7112
+ );
7113
+ if (!quoteRequest.cart) {
7114
+ throw new Error("Cannot find quote request");
7115
+ }
7116
+ const cart = this._storage.getByResourceIdentifier(
7117
+ context.projectKey,
7118
+ quoteRequest.cart
7119
+ );
7120
+ const resource = {
7121
+ ...getBaseResourceProperties(),
7122
+ stagedQuoteState: "InProgress",
7123
+ quoteRequest: {
7124
+ typeId: "quote-request",
7125
+ id: quoteRequest.id
7126
+ },
7127
+ quotationCart: {
7128
+ typeId: "cart",
7129
+ id: cart.id
7130
+ }
7131
+ };
7132
+ return resource;
6809
7133
  }
6810
7134
  };
6811
7135
 
@@ -6815,7 +7139,8 @@ var ReviewRepository = class extends AbstractResourceRepository {
6815
7139
  super("review", config);
6816
7140
  }
6817
7141
  create(context, draft) {
6818
- if (!draft.target) throw new Error("Missing target");
7142
+ if (!draft.target)
7143
+ throw new Error("Missing target");
6819
7144
  const resource = {
6820
7145
  ...getBaseResourceProperties(),
6821
7146
  locale: draft.locale,
@@ -7087,7 +7412,7 @@ var ShoppingListUpdateHandler = class extends AbstractUpdateHandler {
7087
7412
  } else {
7088
7413
  throw new CommercetoolsError({
7089
7414
  code: "General",
7090
- message: `Either lineItemid or lineItemKey needs to be provided.`
7415
+ message: "Either lineItemid or lineItemKey needs to be provided."
7091
7416
  });
7092
7417
  }
7093
7418
  if (quantity === 0) {
@@ -7212,7 +7537,12 @@ var ShoppingListRepository = class extends AbstractResourceRepository {
7212
7537
  context.projectKey,
7213
7538
  this._storage
7214
7539
  ) : void 0,
7215
- store: draft.store ? getStoreKeyReference(draft.store, context.projectKey, this._storage) : void 0
7540
+ store: draft.store ? getStoreKeyReference(draft.store, context.projectKey, this._storage) : void 0,
7541
+ businessUnit: draft.businessUnit ? getBusinessUnitKeyReference(
7542
+ draft.businessUnit,
7543
+ context.projectKey,
7544
+ this._storage
7545
+ ) : void 0
7216
7546
  };
7217
7547
  return this.saveNew(context, resource);
7218
7548
  }
@@ -7267,21 +7597,11 @@ var ShoppingListRepository = class extends AbstractResourceRepository {
7267
7597
  return lineItem;
7268
7598
  }
7269
7599
  throw new Error(
7270
- `must provide either sku, productId or variantId for ShoppingListLineItem`
7600
+ "must provide either sku, productId or variantId for ShoppingListLineItem"
7271
7601
  );
7272
7602
  };
7273
7603
  };
7274
7604
 
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
7605
  // src/repositories/standalone-price.ts
7286
7606
  var StandAlonePriceRepository = class extends AbstractResourceRepository {
7287
7607
  constructor(config) {
@@ -7426,7 +7746,8 @@ var StoreRepository = class extends AbstractResourceRepository {
7426
7746
  }
7427
7747
  };
7428
7748
  var transformChannels = (context, storage, channels) => {
7429
- if (!channels) return [];
7749
+ if (!channels)
7750
+ return [];
7430
7751
  return channels.map(
7431
7752
  (ref) => getReferenceFromResourceIdentifier(
7432
7753
  ref,
@@ -7505,7 +7826,8 @@ var SubscriptionRepository = class extends AbstractResourceRepository {
7505
7826
  },
7506
7827
  key: draft.key,
7507
7828
  messages: draft.messages || [],
7508
- status: "Healthy"
7829
+ status: "Healthy",
7830
+ events: draft.events || []
7509
7831
  };
7510
7832
  return this.saveNew(context, resource);
7511
7833
  }
@@ -7727,44 +8049,44 @@ var createRepositories = (config) => ({
7727
8049
  "associate-role": new AssociateRoleRepository(config),
7728
8050
  "attribute-group": new AttributeGroupRepository(config),
7729
8051
  "business-unit": new BusinessUnitRepository(config),
7730
- "category": new CategoryRepository(config),
7731
- "cart": new CartRepository(config),
8052
+ category: new CategoryRepository(config),
8053
+ cart: new CartRepository(config),
7732
8054
  "cart-discount": new CartDiscountRepository(config),
7733
- "customer": new CustomerRepository(config),
7734
- "channel": new ChannelRepository(config),
8055
+ customer: new CustomerRepository(config),
8056
+ channel: new ChannelRepository(config),
7735
8057
  "customer-group": new CustomerGroupRepository(config),
7736
8058
  "discount-code": new DiscountCodeRepository(config),
7737
- "extension": new ExtensionRepository(config),
8059
+ extension: new ExtensionRepository(config),
7738
8060
  "inventory-entry": new InventoryEntryRepository(config),
7739
8061
  "key-value-document": new CustomObjectRepository(config),
7740
- "order": new OrderRepository(config),
8062
+ order: new OrderRepository(config),
7741
8063
  "order-edit": new OrderEditRepository(config),
7742
- "payment": new PaymentRepository(config),
8064
+ payment: new PaymentRepository(config),
7743
8065
  "my-cart": new CartRepository(config),
7744
8066
  "my-order": new MyOrderRepository(config),
7745
8067
  "my-customer": new MyCustomerRepository(config),
7746
8068
  "my-payment": new PaymentRepository(config),
7747
8069
  "my-shopping-list": new ShoppingListRepository(config),
7748
- "product": new ProductRepository(config),
8070
+ product: new ProductRepository(config),
7749
8071
  "product-type": new ProductTypeRepository(config),
7750
8072
  "product-discount": new ProductDiscountRepository(config),
7751
8073
  "product-projection": new ProductProjectionRepository(config),
7752
8074
  "product-selection": new ProductSelectionRepository(config),
7753
8075
  "product-tailoring": new ProductTailoringRepository(config),
7754
- "project": new ProjectRepository(config),
7755
- "review": new ReviewRepository(config),
7756
- "quote": new QuoteRepository(config),
8076
+ project: new ProjectRepository(config),
8077
+ review: new ReviewRepository(config),
8078
+ quote: new QuoteRepository(config),
7757
8079
  "quote-request": new QuoteRequestRepository(config),
7758
8080
  "shipping-method": new ShippingMethodRepository(config),
7759
8081
  "shopping-list": new ShoppingListRepository(config),
7760
8082
  "staged-quote": new StagedQuoteRepository(config),
7761
8083
  "standalone-price": new StandAlonePriceRepository(config),
7762
- "state": new StateRepository(config),
7763
- "store": new StoreRepository(config),
7764
- "subscription": new SubscriptionRepository(config),
8084
+ state: new StateRepository(config),
8085
+ store: new StoreRepository(config),
8086
+ subscription: new SubscriptionRepository(config),
7765
8087
  "tax-category": new TaxCategoryRepository(config),
7766
- "type": new TypeRepository(config),
7767
- "zone": new ZoneRepository(config)
8088
+ type: new TypeRepository(config),
8089
+ zone: new ZoneRepository(config)
7768
8090
  });
7769
8091
 
7770
8092
  // src/services/as-associate.ts
@@ -7845,7 +8167,7 @@ var AbstractService = class {
7845
8167
  return response.status(200).send(result);
7846
8168
  }
7847
8169
  getWithId(request, response) {
7848
- const result = this._expandWithId(request, request.params["id"]);
8170
+ const result = this._expandWithId(request, request.params.id);
7849
8171
  if (!result) {
7850
8172
  return response.status(404).send();
7851
8173
  }
@@ -7854,18 +8176,19 @@ var AbstractService = class {
7854
8176
  getWithKey(request, response) {
7855
8177
  const result = this.repository.getByKey(
7856
8178
  getRepositoryContext(request),
7857
- request.params["key"],
8179
+ request.params.key,
7858
8180
  {
7859
8181
  expand: this._parseParam(request.query.expand)
7860
8182
  }
7861
8183
  );
7862
- if (!result) return response.status(404).send();
8184
+ if (!result)
8185
+ return response.status(404).send();
7863
8186
  return response.status(200).send(result);
7864
8187
  }
7865
8188
  deleteWithId(request, response) {
7866
8189
  const result = this.repository.delete(
7867
8190
  getRepositoryContext(request),
7868
- request.params["id"],
8191
+ request.params.id,
7869
8192
  {
7870
8193
  expand: this._parseParam(request.query.expand)
7871
8194
  }
@@ -7878,7 +8201,7 @@ var AbstractService = class {
7878
8201
  deleteWithKey(request, response) {
7879
8202
  const resource = this.repository.getByKey(
7880
8203
  getRepositoryContext(request),
7881
- request.params["key"]
8204
+ request.params.key
7882
8205
  );
7883
8206
  if (!resource) {
7884
8207
  return response.status(404).send("Not found");
@@ -7911,7 +8234,7 @@ var AbstractService = class {
7911
8234
  );
7912
8235
  const resource = this.repository.get(
7913
8236
  getRepositoryContext(request),
7914
- request.params["id"]
8237
+ request.params.id
7915
8238
  );
7916
8239
  if (!resource) {
7917
8240
  return response.status(404).send("Not found");
@@ -7932,7 +8255,7 @@ var AbstractService = class {
7932
8255
  );
7933
8256
  const resource = this.repository.getByKey(
7934
8257
  getRepositoryContext(request),
7935
- request.params["key"]
8258
+ request.params.key
7936
8259
  );
7937
8260
  if (!resource) {
7938
8261
  return response.status(404).send("Not found");
@@ -8628,19 +8951,19 @@ var ProductProjectionService = class extends AbstractService {
8628
8951
  search(request, response) {
8629
8952
  const query = request.query;
8630
8953
  const searchParams = {
8631
- "filter": queryParamsArray(query.filter),
8954
+ filter: queryParamsArray(query.filter),
8632
8955
  "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
8956
+ facet: queryParamsArray(query.facet),
8957
+ expand: queryParamsArray(query.expand),
8958
+ staged: queryParamsValue(query.staged) === "true",
8959
+ localeProjection: queryParamsValue(query.localeProjection),
8960
+ storeProjection: queryParamsValue(query.storeProjection),
8961
+ priceChannel: queryParamsValue(query.priceChannel),
8962
+ priceCountry: queryParamsValue(query.priceCountry),
8963
+ priceCurrency: queryParamsValue(query.priceCurrency),
8964
+ priceCustomerGroup: queryParamsValue(query.priceCustomerGroup),
8965
+ offset: query.offset ? Number(queryParamsValue(query.offset)) : void 0,
8966
+ limit: query.limit ? Number(queryParamsValue(query.limit)) : void 0
8644
8967
  };
8645
8968
  const resource = this.repository.search(
8646
8969
  getRepositoryContext(request),
@@ -8674,6 +8997,42 @@ var ProductTypeService = class extends AbstractService {
8674
8997
  }
8675
8998
  };
8676
8999
 
9000
+ // src/services/quote.ts
9001
+ var QuoteService = class extends AbstractService {
9002
+ repository;
9003
+ constructor(parent, repository) {
9004
+ super(parent);
9005
+ this.repository = repository;
9006
+ }
9007
+ getBasePath() {
9008
+ return "quotes";
9009
+ }
9010
+ };
9011
+
9012
+ // src/services/quote-request.ts
9013
+ var QuoteRequestService = class extends AbstractService {
9014
+ repository;
9015
+ constructor(parent, repository) {
9016
+ super(parent);
9017
+ this.repository = repository;
9018
+ }
9019
+ getBasePath() {
9020
+ return "quote-requests";
9021
+ }
9022
+ };
9023
+
9024
+ // src/services/quote-staged.ts
9025
+ var StagedQuoteService = class extends AbstractService {
9026
+ repository;
9027
+ constructor(parent, repository) {
9028
+ super(parent);
9029
+ this.repository = repository;
9030
+ }
9031
+ getBasePath() {
9032
+ return "staged-quotes";
9033
+ }
9034
+ };
9035
+
8677
9036
  // src/services/reviews.ts
8678
9037
  var ReviewService = class extends AbstractService {
8679
9038
  repository;
@@ -8817,14 +9176,14 @@ var createServices = (router, repos) => ({
8817
9176
  "associate-role": new AssociateRoleServices(router, repos["associate-role"]),
8818
9177
  "as-associate": new AsAssociateService(router, repos["as-associate"]),
8819
9178
  "business-unit": new BusinessUnitServices(router, repos["business-unit"]),
8820
- "category": new CategoryServices(router, repos["category"]),
8821
- "cart": new CartService(router, repos["cart"], repos["order"]),
9179
+ category: new CategoryServices(router, repos.category),
9180
+ cart: new CartService(router, repos.cart, repos.order),
8822
9181
  "cart-discount": new CartDiscountService(router, repos["cart-discount"]),
8823
- "customer": new CustomerService(router, repos["customer"]),
8824
- "channel": new ChannelService(router, repos["channel"]),
9182
+ customer: new CustomerService(router, repos.customer),
9183
+ channel: new ChannelService(router, repos.channel),
8825
9184
  "customer-group": new CustomerGroupService(router, repos["customer-group"]),
8826
9185
  "discount-code": new DiscountCodeService(router, repos["discount-code"]),
8827
- "extension": new ExtensionServices(router, repos["extension"]),
9186
+ extension: new ExtensionServices(router, repos.extension),
8828
9187
  "inventory-entry": new InventoryEntryService(
8829
9188
  router,
8830
9189
  repos["inventory-entry"]
@@ -8833,8 +9192,8 @@ var createServices = (router, repos) => ({
8833
9192
  router,
8834
9193
  repos["key-value-document"]
8835
9194
  ),
8836
- "order": new OrderService(router, repos["order"]),
8837
- "payment": new PaymentService(router, repos["payment"]),
9195
+ order: new OrderService(router, repos.order),
9196
+ payment: new PaymentService(router, repos.payment),
8838
9197
  "standalone-price": new StandAlonePriceService(
8839
9198
  router,
8840
9199
  repos["standalone-price"]
@@ -8853,7 +9212,7 @@ var createServices = (router, repos) => ({
8853
9212
  repos["shipping-method"]
8854
9213
  ),
8855
9214
  "product-type": new ProductTypeService(router, repos["product-type"]),
8856
- "product": new ProductService(router, repos["product"]),
9215
+ product: new ProductService(router, repos.product),
8857
9216
  "product-discount": new ProductDiscountService(
8858
9217
  router,
8859
9218
  repos["product-discount"]
@@ -8866,18 +9225,21 @@ var createServices = (router, repos) => ({
8866
9225
  router,
8867
9226
  repos["product-selection"]
8868
9227
  ),
8869
- "reviews": new ReviewService(router, repos["review"]),
9228
+ quotes: new QuoteService(router, repos.quote),
9229
+ "quote-request": new QuoteRequestService(router, repos["quote-request"]),
9230
+ reviews: new ReviewService(router, repos.review),
8870
9231
  "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"]),
9232
+ "staged-quote": new StagedQuoteService(router, repos["staged-quote"]),
9233
+ state: new StateService(router, repos.state),
9234
+ store: new StoreService(router, repos.store),
9235
+ subscription: new SubscriptionService(router, repos.subscription),
8874
9236
  "tax-category": new TaxCategoryService(router, repos["tax-category"]),
8875
9237
  "attribute-group": new AttributeGroupService(
8876
9238
  router,
8877
9239
  repos["attribute-group"]
8878
9240
  ),
8879
- "type": new TypeService(router, repos["type"]),
8880
- "zone": new ZoneService(router, repos["zone"])
9241
+ type: new TypeService(router, repos.type),
9242
+ zone: new ZoneService(router, repos.zone)
8881
9243
  });
8882
9244
 
8883
9245
  // src/services/project.ts
@@ -8919,7 +9281,7 @@ var AbstractStorage = class {
8919
9281
  };
8920
9282
 
8921
9283
  // src/storage/in-memory.ts
8922
- var import_assert3 = __toESM(require("assert"), 1);
9284
+ var import_node_assert5 = __toESM(require("assert"), 1);
8923
9285
  var InMemoryStorage = class extends AbstractStorage {
8924
9286
  resources = {};
8925
9287
  projects = {};
@@ -8966,7 +9328,8 @@ var InMemoryStorage = class extends AbstractStorage {
8966
9328
  getProject = (projectKey) => this.addProject(projectKey);
8967
9329
  // Expand resolves a nested reference and injects the object in the given obj
8968
9330
  expand = (projectKey, obj, clause) => {
8969
- if (!clause) return obj;
9331
+ if (!clause)
9332
+ return obj;
8970
9333
  const newObj = cloneObject(obj);
8971
9334
  if (Array.isArray(clause)) {
8972
9335
  for (const c of clause) {
@@ -8997,13 +9360,15 @@ var InMemoryStorage = class extends AbstractStorage {
8997
9360
  this._resolveReference(projectKey, reference, params.rest);
8998
9361
  } else if (params.index === "*") {
8999
9362
  const reference = obj[params.element];
9000
- if (reference === void 0 || !Array.isArray(reference)) return;
9363
+ if (reference === void 0 || !Array.isArray(reference))
9364
+ return;
9001
9365
  for (const itemRef of reference) {
9002
9366
  this._resolveReference(projectKey, itemRef, params.rest);
9003
9367
  }
9004
9368
  } else {
9005
9369
  const reference = obj[params.element][params.index];
9006
- if (reference === void 0) return;
9370
+ if (reference === void 0)
9371
+ return;
9007
9372
  this._resolveReference(projectKey, reference, params.rest);
9008
9373
  }
9009
9374
  };
@@ -9015,38 +9380,38 @@ var InMemoryStorage = class extends AbstractStorage {
9015
9380
  "associate-role": /* @__PURE__ */ new Map(),
9016
9381
  "attribute-group": /* @__PURE__ */ new Map(),
9017
9382
  "business-unit": /* @__PURE__ */ new Map(),
9018
- "cart": /* @__PURE__ */ new Map(),
9383
+ cart: /* @__PURE__ */ new Map(),
9019
9384
  "cart-discount": /* @__PURE__ */ new Map(),
9020
- "category": /* @__PURE__ */ new Map(),
9021
- "channel": /* @__PURE__ */ new Map(),
9022
- "customer": /* @__PURE__ */ new Map(),
9385
+ category: /* @__PURE__ */ new Map(),
9386
+ channel: /* @__PURE__ */ new Map(),
9387
+ customer: /* @__PURE__ */ new Map(),
9023
9388
  "customer-group": /* @__PURE__ */ new Map(),
9024
9389
  "discount-code": /* @__PURE__ */ new Map(),
9025
- "extension": /* @__PURE__ */ new Map(),
9390
+ extension: /* @__PURE__ */ new Map(),
9026
9391
  "inventory-entry": /* @__PURE__ */ new Map(),
9027
9392
  "key-value-document": /* @__PURE__ */ new Map(),
9028
- "order": /* @__PURE__ */ new Map(),
9393
+ order: /* @__PURE__ */ new Map(),
9029
9394
  "order-edit": /* @__PURE__ */ new Map(),
9030
- "payment": /* @__PURE__ */ new Map(),
9031
- "product": /* @__PURE__ */ new Map(),
9032
- "quote": /* @__PURE__ */ new Map(),
9395
+ payment: /* @__PURE__ */ new Map(),
9396
+ product: /* @__PURE__ */ new Map(),
9397
+ quote: /* @__PURE__ */ new Map(),
9033
9398
  "quote-request": /* @__PURE__ */ new Map(),
9034
9399
  "product-discount": /* @__PURE__ */ new Map(),
9035
9400
  "product-selection": /* @__PURE__ */ new Map(),
9036
9401
  "product-type": /* @__PURE__ */ new Map(),
9037
9402
  "product-projection": /* @__PURE__ */ new Map(),
9038
9403
  "product-tailoring": /* @__PURE__ */ new Map(),
9039
- "review": /* @__PURE__ */ new Map(),
9404
+ review: /* @__PURE__ */ new Map(),
9040
9405
  "shipping-method": /* @__PURE__ */ new Map(),
9041
9406
  "staged-quote": /* @__PURE__ */ new Map(),
9042
- "state": /* @__PURE__ */ new Map(),
9043
- "store": /* @__PURE__ */ new Map(),
9407
+ state: /* @__PURE__ */ new Map(),
9408
+ store: /* @__PURE__ */ new Map(),
9044
9409
  "shopping-list": /* @__PURE__ */ new Map(),
9045
9410
  "standalone-price": /* @__PURE__ */ new Map(),
9046
- "subscription": /* @__PURE__ */ new Map(),
9411
+ subscription: /* @__PURE__ */ new Map(),
9047
9412
  "tax-category": /* @__PURE__ */ new Map(),
9048
- "type": /* @__PURE__ */ new Map(),
9049
- "zone": /* @__PURE__ */ new Map()
9413
+ type: /* @__PURE__ */ new Map(),
9414
+ zone: /* @__PURE__ */ new Map()
9050
9415
  };
9051
9416
  }
9052
9417
  return projectStorage;
@@ -9069,7 +9434,7 @@ var InMemoryStorage = class extends AbstractStorage {
9069
9434
  const store = this.forProjectKey(projectKey);
9070
9435
  store[typeId]?.set(obj.id, obj);
9071
9436
  const resource = this.get(projectKey, typeId, obj.id, params);
9072
- (0, import_assert3.default)(
9437
+ (0, import_node_assert5.default)(
9073
9438
  resource,
9074
9439
  `resource of type ${typeId} with id ${obj.id} not created`
9075
9440
  );
@@ -9214,7 +9579,8 @@ var InMemoryStorage = class extends AbstractStorage {
9214
9579
  });
9215
9580
  }
9216
9581
  _resolveReference(projectKey, reference, expand) {
9217
- if (reference === void 0) return;
9582
+ if (reference === void 0)
9583
+ return;
9218
9584
  if (reference.typeId !== void 0 && (reference.id !== void 0 || reference.key !== void 0)) {
9219
9585
  if (!reference.obj) {
9220
9586
  reference.obj = this.getByResourceIdentifier(projectKey, {
@@ -9367,12 +9733,11 @@ var CommercetoolsMock = class {
9367
9733
  message: err.message,
9368
9734
  errors: [err.info]
9369
9735
  });
9370
- } else {
9371
- console.error(err);
9372
- return resp.status(500).send({
9373
- error: err.message
9374
- });
9375
9736
  }
9737
+ console.error(err);
9738
+ return resp.status(500).send({
9739
+ error: err.message
9740
+ });
9376
9741
  });
9377
9742
  return app;
9378
9743
  }
@@ -9390,7 +9755,7 @@ var CommercetoolsMock = class {
9390
9755
  const body = await request.text();
9391
9756
  const url = new URL(request.url);
9392
9757
  const headers = copyHeaders(request.headers);
9393
- const res = await (0, import_light_my_request.default)(app).post(url.pathname + "?" + url.searchParams.toString()).body(body).headers(headers).end();
9758
+ const res = await (0, import_light_my_request.default)(app).post(`${url.pathname}?${url.searchParams.toString()}`).body(body).headers(headers).end();
9394
9759
  return new import_msw.HttpResponse(res.body, {
9395
9760
  status: res.statusCode,
9396
9761
  headers: mapHeaderType(res.headers)
@@ -9400,7 +9765,7 @@ var CommercetoolsMock = class {
9400
9765
  const body = await request.text();
9401
9766
  const url = new URL(request.url);
9402
9767
  const headers = copyHeaders(request.headers);
9403
- const res = await (0, import_light_my_request.default)(app).get(url.pathname + "?" + url.searchParams.toString()).body(body).headers(headers).end();
9768
+ const res = await (0, import_light_my_request.default)(app).get(`${url.pathname}?${url.searchParams.toString()}`).body(body).headers(headers).end();
9404
9769
  if (res.statusCode === 200) {
9405
9770
  const parsedBody = JSON.parse(res.body);
9406
9771
  const resultCount = "count" in parsedBody ? parsedBody.count : Object.keys(parsedBody).length;
@@ -9418,7 +9783,7 @@ var CommercetoolsMock = class {
9418
9783
  const body = await request.text();
9419
9784
  const url = new URL(request.url);
9420
9785
  const headers = copyHeaders(request.headers);
9421
- const res = await (0, import_light_my_request.default)(app).get(url.pathname + "?" + url.searchParams.toString()).body(body).headers(headers).end();
9786
+ const res = await (0, import_light_my_request.default)(app).get(`${url.pathname}?${url.searchParams.toString()}`).body(body).headers(headers).end();
9422
9787
  return new import_msw.HttpResponse(res.body, {
9423
9788
  status: res.statusCode,
9424
9789
  headers: mapHeaderType(res.headers)
@@ -9428,7 +9793,7 @@ var CommercetoolsMock = class {
9428
9793
  const body = await request.text();
9429
9794
  const url = new URL(request.url);
9430
9795
  const headers = copyHeaders(request.headers);
9431
- const res = await (0, import_light_my_request.default)(app).post(url.pathname + "?" + url.searchParams.toString()).body(body).headers(headers).end();
9796
+ const res = await (0, import_light_my_request.default)(app).post(`${url.pathname}?${url.searchParams.toString()}`).body(body).headers(headers).end();
9432
9797
  return new import_msw.HttpResponse(res.body, {
9433
9798
  status: res.statusCode,
9434
9799
  headers: mapHeaderType(res.headers)
@@ -9438,7 +9803,7 @@ var CommercetoolsMock = class {
9438
9803
  const body = await request.text();
9439
9804
  const url = new URL(request.url);
9440
9805
  const headers = copyHeaders(request.headers);
9441
- const res = await (0, import_light_my_request.default)(app).delete(url.pathname + "?" + url.searchParams.toString()).body(body).headers(headers).end();
9806
+ const res = await (0, import_light_my_request.default)(app).delete(`${url.pathname}?${url.searchParams.toString()}`).body(body).headers(headers).end();
9442
9807
  return new import_msw.HttpResponse(res.body, {
9443
9808
  status: res.statusCode,
9444
9809
  headers: mapHeaderType(res.headers)
@@ -9453,10 +9818,9 @@ var CommercetoolsMock = class {
9453
9818
  if (_globalListeners.length > 0) {
9454
9819
  if (this._mswServer !== void 0) {
9455
9820
  throw new Error("Server already started");
9456
- } else {
9457
- process.emitWarning("Server wasn't stopped properly, clearing");
9458
- _globalListeners.forEach((listener) => listener.close());
9459
9821
  }
9822
+ process.emitWarning("Server wasn't stopped properly, clearing");
9823
+ _globalListeners.forEach((listener) => listener.close());
9460
9824
  }
9461
9825
  const server = (0, import_node.setupServer)();
9462
9826
  this.registerHandlers(server);