@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.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");
@@ -1552,6 +1559,18 @@ var CartRepository = class extends AbstractResourceRepository {
1552
1559
  this.actions = new CartUpdateHandler(this._storage);
1553
1560
  }
1554
1561
  create(context, draft) {
1562
+ if (draft.anonymousId && draft.customerId) {
1563
+ throw new CommercetoolsError({
1564
+ code: "InvalidOperation",
1565
+ message: "Can set only one of customer OR anonymousId"
1566
+ });
1567
+ }
1568
+ if (draft.customerId) {
1569
+ this._storage.getByResourceIdentifier(context.projectKey, {
1570
+ typeId: "customer",
1571
+ id: draft.customerId
1572
+ });
1573
+ }
1555
1574
  const lineItems = draft.lineItems?.map(
1556
1575
  (draftLineItem) => this.draftLineItemtoLineItem(
1557
1576
  context.projectKey,
@@ -1566,6 +1585,7 @@ var CartRepository = class extends AbstractResourceRepository {
1566
1585
  billingAddress: draft.billingAddress ? createAddress(draft.billingAddress, context.projectKey, this._storage) : void 0,
1567
1586
  cartState: "Active",
1568
1587
  country: draft.country,
1588
+ customerId: draft.customerId,
1569
1589
  customerEmail: draft.customerEmail,
1570
1590
  customLineItems: [],
1571
1591
  directDiscounts: [],
@@ -1636,8 +1656,10 @@ var CartRepository = class extends AbstractResourceRepository {
1636
1656
  product.masterData.current.masterVariant,
1637
1657
  ...product.masterData.current.variants
1638
1658
  ].find((x) => {
1639
- if (sku) return x.sku === sku;
1640
- if (variantId) return x.id === variantId;
1659
+ if (sku)
1660
+ return x.sku === sku;
1661
+ if (variantId)
1662
+ return x.id === variantId;
1641
1663
  return false;
1642
1664
  });
1643
1665
  if (!variant) {
@@ -1819,7 +1841,8 @@ var OrderUpdateHandler = class extends AbstractUpdateHandler {
1819
1841
  );
1820
1842
  }
1821
1843
  setStore(context, resource, { store }) {
1822
- if (!store) return;
1844
+ if (!store)
1845
+ return;
1823
1846
  const resolvedType = this._storage.getByResourceIdentifier(
1824
1847
  context.projectKey,
1825
1848
  store
@@ -1850,7 +1873,8 @@ var OrderUpdateHandler = class extends AbstractUpdateHandler {
1850
1873
  };
1851
1874
  }
1852
1875
  updateSyncInfo(context, resource, { channel, externalId, syncedAt }) {
1853
- if (!channel) return;
1876
+ if (!channel)
1877
+ return;
1854
1878
  const resolvedType = this._storage.getByResourceIdentifier(
1855
1879
  context.projectKey,
1856
1880
  channel
@@ -2246,7 +2270,8 @@ var BusinessUnitRepository = class extends AbstractResourceRepository {
2246
2270
  };
2247
2271
  this.saveNew(context, division);
2248
2272
  return division;
2249
- } else if (this._isCompanyDraft(draft)) {
2273
+ }
2274
+ if (this._isCompanyDraft(draft)) {
2250
2275
  const company = resource;
2251
2276
  this.saveNew(context, company);
2252
2277
  return company;
@@ -2368,7 +2393,7 @@ var CartDiscountUpdateHandler = class extends AbstractUpdateHandler {
2368
2393
  throw new CommercetoolsError(
2369
2394
  {
2370
2395
  code: "InvalidOperation",
2371
- message: "Cannot remove custom field " + name + " because it does not exist."
2396
+ message: `Cannot remove custom field ${name} because it does not exist.`
2372
2397
  },
2373
2398
  400
2374
2399
  );
@@ -2548,15 +2573,11 @@ var CategoryUpdateHandler = class extends AbstractUpdateHandler {
2548
2573
  return;
2549
2574
  }
2550
2575
  if (assetId) {
2551
- resource.assets = resource.assets.filter(function(obj) {
2552
- return obj.id !== assetId;
2553
- });
2576
+ resource.assets = resource.assets.filter((obj) => obj.id !== assetId);
2554
2577
  return;
2555
2578
  }
2556
2579
  if (assetKey) {
2557
- resource.assets = resource.assets.filter(function(obj) {
2558
- return obj.key !== assetKey;
2559
- });
2580
+ resource.assets = resource.assets.filter((obj) => obj.key !== assetKey);
2560
2581
  return;
2561
2582
  }
2562
2583
  }
@@ -2779,26 +2800,25 @@ var CustomObjectRepository = class extends AbstractResourceRepository {
2779
2800
  return updated;
2780
2801
  }
2781
2802
  return current;
2782
- } else {
2783
- if (draft.version) {
2784
- throw new CommercetoolsError(
2785
- {
2786
- code: "InvalidOperation",
2787
- message: "version on create must be 0"
2788
- },
2789
- 400
2790
- );
2791
- }
2792
- const baseProperties = getBaseResourceProperties();
2793
- const resource = {
2794
- ...baseProperties,
2795
- container: draft.container,
2796
- key: draft.key,
2797
- value: draft.value
2798
- };
2799
- this.saveNew(context, resource);
2800
- return resource;
2801
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;
2802
2822
  }
2803
2823
  getWithContainerAndKey(context, container, key) {
2804
2824
  const items = this._storage.all(context.projectKey, this.getTypeId());
@@ -2823,7 +2843,7 @@ var CustomObjectRepository = class extends AbstractResourceRepository {
2823
2843
  };
2824
2844
 
2825
2845
  // src/repositories/customer/actions.ts
2826
- import assert2 from "node:assert";
2846
+ import assert2 from "assert";
2827
2847
  var CustomerUpdateHandler = class extends AbstractUpdateHandler {
2828
2848
  addAddress(_context, resource, { address }) {
2829
2849
  resource.addresses.push({
@@ -2937,7 +2957,7 @@ var CustomerUpdateHandler = class extends AbstractUpdateHandler {
2937
2957
  }
2938
2958
  resource.authenticationMode = authMode;
2939
2959
  if (authMode === "ExternalAuth") {
2940
- delete resource.password;
2960
+ resource.password = void 0;
2941
2961
  return;
2942
2962
  }
2943
2963
  if (authMode === "Password") {
@@ -3491,7 +3511,8 @@ var ExtensionRepository = class extends AbstractResourceRepository {
3491
3511
  extension,
3492
3512
  "destination.authentication.headerValue"
3493
3513
  );
3494
- } else if (extension.destination.type === "AWSLambda") {
3514
+ }
3515
+ if (extension.destination.type === "AWSLambda") {
3495
3516
  return maskSecretValue(resource, "destination.accessSecret");
3496
3517
  }
3497
3518
  }
@@ -3966,16 +3987,19 @@ function toRegExp(str) {
3966
3987
  return new RegExp(str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"));
3967
3988
  }
3968
3989
  function normalize(regex) {
3969
- if (typeof regex === "string") regex = toRegExp(regex);
3990
+ if (typeof regex === "string")
3991
+ regex = toRegExp(regex);
3970
3992
  if (!regex.source.startsWith("^"))
3971
3993
  return new RegExp(`^${regex.source}`, regex.flags);
3972
- else return regex;
3994
+ else
3995
+ return regex;
3973
3996
  }
3974
3997
  function first(arr, predicate) {
3975
3998
  let i = 0;
3976
3999
  for (const item of arr) {
3977
4000
  const result = predicate(item, i++);
3978
- if (result) return { item, result };
4001
+ if (result)
4002
+ return { item, result };
3979
4003
  }
3980
4004
  }
3981
4005
  var TokenTypes = class {
@@ -4139,7 +4163,8 @@ var Lexer = class {
4139
4163
  */
4140
4164
  peek(position = this._state.position) {
4141
4165
  const read = (i = position) => {
4142
- if (i >= this._state.source.length) return EOF(this);
4166
+ if (i >= this._state.source.length)
4167
+ return EOF(this);
4143
4168
  const n = this._tokenTypes.peek(this._state.source, i);
4144
4169
  if (!n || !n.result) {
4145
4170
  throw new Error(
@@ -4159,7 +4184,8 @@ var Lexer = class {
4159
4184
  ) : null;
4160
4185
  };
4161
4186
  const t = read();
4162
- if (t) return t;
4187
+ if (t)
4188
+ return t;
4163
4189
  let unexpected = this._state.source.substring(position, position + 1);
4164
4190
  try {
4165
4191
  this.peek(position + 1);
@@ -4181,7 +4207,8 @@ var Lexer = class {
4181
4207
  */
4182
4208
  strpos(i) {
4183
4209
  let lines = this._state.source.substring(0, i).split(/\r?\n/);
4184
- if (!Array.isArray(lines)) lines = [lines];
4210
+ if (!Array.isArray(lines))
4211
+ lines = [lines];
4185
4212
  const line = lines.length;
4186
4213
  const column = lines[lines.length - 1].length + 1;
4187
4214
  return { line, column };
@@ -4280,7 +4307,8 @@ var Parser = class {
4280
4307
  * @returns {number} The binding power of the specified token type
4281
4308
  */
4282
4309
  bp(tokenOrType) {
4283
- if (tokenOrType == null) return Number.NEGATIVE_INFINITY;
4310
+ if (tokenOrType == null)
4311
+ return Number.NEGATIVE_INFINITY;
4284
4312
  if (tokenOrType && typeof tokenOrType.isEof == "function" && tokenOrType.isEof())
4285
4313
  return Number.NEGATIVE_INFINITY;
4286
4314
  const type = this._type(tokenOrType);
@@ -4325,21 +4353,27 @@ var Parser = class {
4325
4353
  parse(opts = { terminals: [0] }) {
4326
4354
  const stop = opts.stop = opts.stop || createStop();
4327
4355
  const check = () => {
4328
- if (stop.isStopped()) return false;
4356
+ if (stop.isStopped())
4357
+ return false;
4329
4358
  const t = this.lexer.peek();
4330
4359
  const bp = this.bp(t);
4331
4360
  return opts.terminals.reduce((canContinue, rbpOrType) => {
4332
- if (!canContinue) return false;
4333
- if (typeof rbpOrType == "number") return rbpOrType < bp;
4334
- 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;
4335
4367
  }, true);
4336
4368
  };
4337
4369
  const mkinfo = (token) => {
4338
4370
  const bp = this.bp(token);
4339
4371
  return { token, bp, stop, ctx: opts.ctx, options: opts };
4340
4372
  };
4341
- if (!opts.terminals) opts.terminals = [0];
4342
- 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);
4343
4377
  let left = this.nud(mkinfo(this.lexer.next()));
4344
4378
  while (check()) {
4345
4379
  const operator = this.lexer.next();
@@ -4471,7 +4505,7 @@ var parseFilter = (filter) => {
4471
4505
  (t) => ({
4472
4506
  type: "Symbol",
4473
4507
  kind: "int",
4474
- value: parseInt(t.token.match, 10)
4508
+ value: Number.parseInt(t.token.match, 10)
4475
4509
  })
4476
4510
  ).nud("STAR", 5, (_) => ({
4477
4511
  type: "Symbol",
@@ -4495,9 +4529,8 @@ var parseFilter = (filter) => {
4495
4529
  const expr = parser.parse({ terminals: [bp - 1] });
4496
4530
  if (Array.isArray(expr)) {
4497
4531
  return [left, ...expr];
4498
- } else {
4499
- return [left, expr];
4500
4532
  }
4533
+ return [left, expr];
4501
4534
  }).nud("(", 100, (t) => {
4502
4535
  const expr = parser.parse({ terminals: [")"] });
4503
4536
  lexer.expect(")");
@@ -4543,7 +4576,8 @@ var generateMatchFunc = (filter) => {
4543
4576
  throw new Error(`Syntax error while parsing '${filter}'.`);
4544
4577
  }
4545
4578
  return (obj) => {
4546
- if (!result.children) return false;
4579
+ if (!result.children)
4580
+ return false;
4547
4581
  return result.children.some((c) => c.match(obj));
4548
4582
  };
4549
4583
  };
@@ -4649,6 +4683,12 @@ var parseSearchQuery = (searchQuery) => {
4649
4683
  return generateFieldMatchFunc(generateRangeMatchFunc, searchQuery.range);
4650
4684
  }
4651
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
+ }
4652
4692
  return generateFieldMatchFunc(
4653
4693
  (value) => value === searchQuery.exact.value,
4654
4694
  searchQuery.exact
@@ -4854,8 +4894,23 @@ var ProductSearch = class {
4854
4894
  this._storage = config.storage;
4855
4895
  }
4856
4896
  search(projectKey, params) {
4857
- let resources = this._storage.all(projectKey, "product").map(
4858
- (r) => this.transform(r, params.productProjectionParameters?.staged ?? false)
4897
+ const availabilityBySku = this._storage.all(projectKey, "inventory-entry").reduce((acc, entry) => {
4898
+ const existingEntry = acc.get(entry.sku);
4899
+ acc.set(entry.sku, {
4900
+ isOnStock: existingEntry?.isOnStock || entry.quantityOnStock > 0,
4901
+ availableQuantity: existingEntry?.availableQuantity ?? 0 + entry.quantityOnStock,
4902
+ // NOTE: This doesn't handle inventory entries for multiple channels,
4903
+ // so it doesn't exactly replicate the behavior of the commercetools api.
4904
+ isOnStockForChannel: existingEntry?.isOnStockForChannel ?? entry.supplyChannel?.id
4905
+ });
4906
+ return acc;
4907
+ }, /* @__PURE__ */ new Map());
4908
+ let productResources = this._storage.all(projectKey, "product").map(
4909
+ (r) => this.transformProduct(
4910
+ r,
4911
+ params.productProjectionParameters?.staged ?? false,
4912
+ availabilityBySku
4913
+ )
4859
4914
  ).filter((p) => {
4860
4915
  if (!(params.productProjectionParameters?.staged ?? false)) {
4861
4916
  return p.published;
@@ -4867,7 +4922,7 @@ var ProductSearch = class {
4867
4922
  try {
4868
4923
  validateSearchQuery(params.query);
4869
4924
  const matchFunc = parseSearchQuery(params.query);
4870
- resources = resources.filter(
4925
+ productResources = productResources.filter(
4871
4926
  (resource) => matchFunc(resource, markMatchingVariant)
4872
4927
  );
4873
4928
  } catch (err) {
@@ -4882,7 +4937,7 @@ var ProductSearch = class {
4882
4937
  }
4883
4938
  }
4884
4939
  if (params.productProjectionParameters) {
4885
- applyPriceSelector(resources, {
4940
+ applyPriceSelector(productResources, {
4886
4941
  country: params.productProjectionParameters.priceCountry,
4887
4942
  channel: params.productProjectionParameters.priceChannel,
4888
4943
  customerGroup: params.productProjectionParameters.priceCustomerGroup,
@@ -4891,7 +4946,10 @@ var ProductSearch = class {
4891
4946
  }
4892
4947
  const offset = params.offset || 0;
4893
4948
  const limit = params.limit || 20;
4894
- const productProjectionsResult = resources.slice(offset, offset + limit);
4949
+ const productProjectionsResult = productResources.slice(
4950
+ offset,
4951
+ offset + limit
4952
+ );
4895
4953
  const productProjectionsParameterGiven = !!params?.productProjectionParameters;
4896
4954
  const results = productProjectionsResult.map(
4897
4955
  (product) => ({
@@ -4904,14 +4962,14 @@ var ProductSearch = class {
4904
4962
  })
4905
4963
  );
4906
4964
  return {
4907
- total: resources.length,
4965
+ total: productResources.length,
4908
4966
  offset,
4909
4967
  limit,
4910
4968
  results,
4911
4969
  facets: []
4912
4970
  };
4913
4971
  }
4914
- transform(product, staged) {
4972
+ transformProduct(product, staged, availabilityBySku) {
4915
4973
  const obj = !staged ? product.masterData.current : product.masterData.staged;
4916
4974
  return {
4917
4975
  id: product.id,
@@ -4925,7 +4983,10 @@ var ProductSearch = class {
4925
4983
  slug: obj.slug,
4926
4984
  categories: obj.categories,
4927
4985
  masterVariant: obj.masterVariant,
4928
- variants: obj.variants,
4986
+ variants: obj.variants.map((variant) => ({
4987
+ ...variant,
4988
+ availability: variant.sku ? availabilityBySku.get(variant.sku) : { isOnStock: false, availableQuantity: 0, isOnStockForChannel: [] }
4989
+ })),
4929
4990
  productType: product.productType,
4930
4991
  hasStagedChanges: product.masterData.hasStagedChanges,
4931
4992
  published: product.masterData.published
@@ -5246,7 +5307,7 @@ var ProductUpdateHandler = class extends AbstractUpdateHandler {
5246
5307
  }
5247
5308
  if (position >= variantImages.length) {
5248
5309
  throw new Error(
5249
- `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."
5250
5311
  );
5251
5312
  }
5252
5313
  variant.images = variantImages.filter((image) => image.url !== imageUrl);
@@ -5879,9 +5940,8 @@ var parseQueryExpression = (predicate) => {
5879
5940
  if (Array.isArray(predicate)) {
5880
5941
  const callbacks = predicate.map((item) => generateMatchFunc2(item));
5881
5942
  return (target, variables) => callbacks.every((callback) => callback(target, variables));
5882
- } else {
5883
- return generateMatchFunc2(predicate);
5884
5943
  }
5944
+ return generateMatchFunc2(predicate);
5885
5945
  };
5886
5946
  var validateSymbol = (val) => {
5887
5947
  if (!val.type) {
@@ -5917,7 +5977,10 @@ var resolveValue = (obj, val) => {
5917
5977
  }
5918
5978
  return obj[val.value];
5919
5979
  };
5920
- 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);
5980
+ 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(
5981
+ "IDENTIFIER",
5982
+ /[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}/
5983
+ ).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);
5921
5984
  var generateMatchFunc2 = (predicate) => {
5922
5985
  const lexer = getLexer2(predicate);
5923
5986
  const parser = new Parser(lexer).builder().nud(
@@ -5933,7 +5996,7 @@ var generateMatchFunc2 = (predicate) => {
5933
5996
  1,
5934
5997
  (t) => ({
5935
5998
  type: "boolean",
5936
- value: t.token.match === "true" ? true : false,
5999
+ value: t.token.match === "true",
5937
6000
  pos: t.token.strpos()
5938
6001
  })
5939
6002
  ).nud(
@@ -5959,7 +6022,7 @@ var generateMatchFunc2 = (predicate) => {
5959
6022
  1,
5960
6023
  (t) => ({
5961
6024
  type: "int",
5962
- value: parseInt(t.token.match, 10),
6025
+ value: Number.parseInt(t.token.match, 10),
5963
6026
  pos: t.token.strpos()
5964
6027
  })
5965
6028
  ).nud(
@@ -5967,7 +6030,7 @@ var generateMatchFunc2 = (predicate) => {
5967
6030
  1,
5968
6031
  (t) => ({
5969
6032
  type: "float",
5970
- value: parseFloat(t.token.match),
6033
+ value: Number.parseFloat(t.token.match),
5971
6034
  pos: t.token.strpos()
5972
6035
  })
5973
6036
  ).nud("NOT", 100, ({ bp }) => {
@@ -5983,9 +6046,8 @@ var generateMatchFunc2 = (predicate) => {
5983
6046
  const expr = parser.parse({ terminals: [bp - 1] });
5984
6047
  if (Array.isArray(expr)) {
5985
6048
  return [left, ...expr];
5986
- } else {
5987
- return [left, expr];
5988
6049
  }
6050
+ return [left, expr];
5989
6051
  }).nud("(", 100, (t) => {
5990
6052
  const expr = parser.parse({ terminals: [")"] });
5991
6053
  return expr;
@@ -5995,22 +6057,21 @@ var generateMatchFunc2 = (predicate) => {
5995
6057
  return (obj, vars) => {
5996
6058
  if (Array.isArray(obj)) {
5997
6059
  return obj.some((item) => {
5998
- const value = resolveValue(item, left);
5999
- if (value) {
6000
- return expr(value, vars);
6060
+ const value2 = resolveValue(item, left);
6061
+ if (value2) {
6062
+ return expr(value2, vars);
6001
6063
  }
6002
6064
  return false;
6003
6065
  });
6004
- } else {
6005
- const value = resolveValue(obj, left);
6006
- if (value) {
6007
- if (Array.isArray(value)) {
6008
- return value.some((item) => expr(item, vars));
6009
- }
6010
- 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));
6011
6071
  }
6012
- return false;
6072
+ return expr(value, vars);
6013
6073
  }
6074
+ return false;
6014
6075
  };
6015
6076
  }).bp(")", 0).led("=", 20, ({ left, bp }) => {
6016
6077
  const expr = parser.parse({ terminals: [bp - 1] });
@@ -6025,14 +6086,13 @@ var generateMatchFunc2 = (predicate) => {
6025
6086
  }
6026
6087
  return value === other;
6027
6088
  });
6028
- } else {
6029
- const resolvedValue = resolveValue(obj, left);
6030
- const resolvedSymbol = resolveSymbol(expr, vars);
6031
- if (Array.isArray(resolvedValue)) {
6032
- return !!resolvedValue.some((elem) => elem === resolvedSymbol);
6033
- }
6034
- return resolvedValue === resolvedSymbol;
6035
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;
6036
6096
  };
6037
6097
  }).led("!=", 20, ({ left, bp }) => {
6038
6098
  const expr = parser.parse({ terminals: [bp - 1] });
@@ -6069,12 +6129,11 @@ var generateMatchFunc2 = (predicate) => {
6069
6129
  const val = resolveValue(obj, left);
6070
6130
  return val.length === 0;
6071
6131
  };
6072
- } else {
6073
- return (obj, vars) => {
6074
- const val = resolveValue(obj, left);
6075
- return val.length !== 0;
6076
- };
6077
6132
  }
6133
+ return (obj, vars) => {
6134
+ const val = resolveValue(obj, left);
6135
+ return val.length !== 0;
6136
+ };
6078
6137
  }
6079
6138
  case "defined": {
6080
6139
  if (!invert) {
@@ -6082,12 +6141,11 @@ var generateMatchFunc2 = (predicate) => {
6082
6141
  const val = resolveValue(obj, left);
6083
6142
  return val !== void 0;
6084
6143
  };
6085
- } else {
6086
- return (obj, vars) => {
6087
- const val = resolveValue(obj, left);
6088
- return val === void 0;
6089
- };
6090
6144
  }
6145
+ return (obj, vars) => {
6146
+ const val = resolveValue(obj, left);
6147
+ return val === void 0;
6148
+ };
6091
6149
  }
6092
6150
  default: {
6093
6151
  throw new Error("Unexpected");
@@ -6130,7 +6188,8 @@ var generateMatchFunc2 = (predicate) => {
6130
6188
  const expr = parser.parse({ terminals: [")"] });
6131
6189
  return (obj, vars) => {
6132
6190
  const value = resolveValue(obj, left);
6133
- if (!value) return false;
6191
+ if (!value)
6192
+ return false;
6134
6193
  const maxDistance = resolveSymbol(expr[2], vars);
6135
6194
  const distance = haversineDistance(
6136
6195
  {
@@ -6160,9 +6219,8 @@ var generateMatchFunc2 = (predicate) => {
6160
6219
  const array = expr.map((item) => resolveSymbol(item, vars));
6161
6220
  if (keyword.type === "ALL") {
6162
6221
  return array.every((item) => value.includes(item));
6163
- } else {
6164
- return array.some((item) => value.includes(item));
6165
6222
  }
6223
+ return array.some((item) => value.includes(item));
6166
6224
  };
6167
6225
  }).build();
6168
6226
  const result = parser.parse();
@@ -6269,7 +6327,8 @@ var ProductProjectionSearch = class {
6269
6327
  };
6270
6328
  }
6271
6329
  getFacets(params, products) {
6272
- if (!params.facet) return {};
6330
+ if (!params.facet)
6331
+ return {};
6273
6332
  const result = {};
6274
6333
  const regexp = new RegExp(/ counting products$/);
6275
6334
  for (let facet of params.facet) {
@@ -6403,9 +6462,8 @@ var ProductProjectionSearch = class {
6403
6462
  max: numValues > 0 ? Math.max(...values) : 0,
6404
6463
  mean: numValues > 0 ? mean(values) : 0
6405
6464
  };
6406
- } else {
6407
- throw new Error("not supported");
6408
6465
  }
6466
+ throw new Error("not supported");
6409
6467
  }) || [];
6410
6468
  const data = {
6411
6469
  type: "range",
@@ -6752,23 +6810,289 @@ var ProjectUpdateHandler = class extends AbstractUpdateHandler {
6752
6810
  }
6753
6811
  };
6754
6812
 
6755
- // 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
6756
6865
  var QuoteRepository = class extends AbstractResourceRepository {
6757
6866
  constructor(config) {
6758
6867
  super("quote", config);
6868
+ this.actions = new QuoteUpdateHandler(config.storage);
6759
6869
  }
6760
6870
  create(context, draft) {
6761
- 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;
6762
6959
  }
6763
6960
  };
6764
6961
 
6765
- // src/repositories/quote-request.ts
6962
+ // src/repositories/quote-request/index.ts
6766
6963
  var QuoteRequestRepository = class extends AbstractResourceRepository {
6767
6964
  constructor(config) {
6768
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);
6769
7070
  }
6770
7071
  create(context, draft) {
6771
- 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;
6772
7096
  }
6773
7097
  };
6774
7098
 
@@ -6778,7 +7102,8 @@ var ReviewRepository = class extends AbstractResourceRepository {
6778
7102
  super("review", config);
6779
7103
  }
6780
7104
  create(context, draft) {
6781
- if (!draft.target) throw new Error("Missing target");
7105
+ if (!draft.target)
7106
+ throw new Error("Missing target");
6782
7107
  const resource = {
6783
7108
  ...getBaseResourceProperties(),
6784
7109
  locale: draft.locale,
@@ -7050,7 +7375,7 @@ var ShoppingListUpdateHandler = class extends AbstractUpdateHandler {
7050
7375
  } else {
7051
7376
  throw new CommercetoolsError({
7052
7377
  code: "General",
7053
- message: `Either lineItemid or lineItemKey needs to be provided.`
7378
+ message: "Either lineItemid or lineItemKey needs to be provided."
7054
7379
  });
7055
7380
  }
7056
7381
  if (quantity === 0) {
@@ -7175,7 +7500,12 @@ var ShoppingListRepository = class extends AbstractResourceRepository {
7175
7500
  context.projectKey,
7176
7501
  this._storage
7177
7502
  ) : void 0,
7178
- 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
7179
7509
  };
7180
7510
  return this.saveNew(context, resource);
7181
7511
  }
@@ -7230,21 +7560,11 @@ var ShoppingListRepository = class extends AbstractResourceRepository {
7230
7560
  return lineItem;
7231
7561
  }
7232
7562
  throw new Error(
7233
- `must provide either sku, productId or variantId for ShoppingListLineItem`
7563
+ "must provide either sku, productId or variantId for ShoppingListLineItem"
7234
7564
  );
7235
7565
  };
7236
7566
  };
7237
7567
 
7238
- // src/repositories/staged-quote.ts
7239
- var StagedQuoteRepository = class extends AbstractResourceRepository {
7240
- constructor(config) {
7241
- super("staged-quote", config);
7242
- }
7243
- create(context, draft) {
7244
- throw new Error("not implemented");
7245
- }
7246
- };
7247
-
7248
7568
  // src/repositories/standalone-price.ts
7249
7569
  var StandAlonePriceRepository = class extends AbstractResourceRepository {
7250
7570
  constructor(config) {
@@ -7389,7 +7709,8 @@ var StoreRepository = class extends AbstractResourceRepository {
7389
7709
  }
7390
7710
  };
7391
7711
  var transformChannels = (context, storage, channels) => {
7392
- if (!channels) return [];
7712
+ if (!channels)
7713
+ return [];
7393
7714
  return channels.map(
7394
7715
  (ref) => getReferenceFromResourceIdentifier(
7395
7716
  ref,
@@ -7468,7 +7789,8 @@ var SubscriptionRepository = class extends AbstractResourceRepository {
7468
7789
  },
7469
7790
  key: draft.key,
7470
7791
  messages: draft.messages || [],
7471
- status: "Healthy"
7792
+ status: "Healthy",
7793
+ events: draft.events || []
7472
7794
  };
7473
7795
  return this.saveNew(context, resource);
7474
7796
  }
@@ -7690,44 +8012,44 @@ var createRepositories = (config) => ({
7690
8012
  "associate-role": new AssociateRoleRepository(config),
7691
8013
  "attribute-group": new AttributeGroupRepository(config),
7692
8014
  "business-unit": new BusinessUnitRepository(config),
7693
- "category": new CategoryRepository(config),
7694
- "cart": new CartRepository(config),
8015
+ category: new CategoryRepository(config),
8016
+ cart: new CartRepository(config),
7695
8017
  "cart-discount": new CartDiscountRepository(config),
7696
- "customer": new CustomerRepository(config),
7697
- "channel": new ChannelRepository(config),
8018
+ customer: new CustomerRepository(config),
8019
+ channel: new ChannelRepository(config),
7698
8020
  "customer-group": new CustomerGroupRepository(config),
7699
8021
  "discount-code": new DiscountCodeRepository(config),
7700
- "extension": new ExtensionRepository(config),
8022
+ extension: new ExtensionRepository(config),
7701
8023
  "inventory-entry": new InventoryEntryRepository(config),
7702
8024
  "key-value-document": new CustomObjectRepository(config),
7703
- "order": new OrderRepository(config),
8025
+ order: new OrderRepository(config),
7704
8026
  "order-edit": new OrderEditRepository(config),
7705
- "payment": new PaymentRepository(config),
8027
+ payment: new PaymentRepository(config),
7706
8028
  "my-cart": new CartRepository(config),
7707
8029
  "my-order": new MyOrderRepository(config),
7708
8030
  "my-customer": new MyCustomerRepository(config),
7709
8031
  "my-payment": new PaymentRepository(config),
7710
8032
  "my-shopping-list": new ShoppingListRepository(config),
7711
- "product": new ProductRepository(config),
8033
+ product: new ProductRepository(config),
7712
8034
  "product-type": new ProductTypeRepository(config),
7713
8035
  "product-discount": new ProductDiscountRepository(config),
7714
8036
  "product-projection": new ProductProjectionRepository(config),
7715
8037
  "product-selection": new ProductSelectionRepository(config),
7716
8038
  "product-tailoring": new ProductTailoringRepository(config),
7717
- "project": new ProjectRepository(config),
7718
- "review": new ReviewRepository(config),
7719
- "quote": new QuoteRepository(config),
8039
+ project: new ProjectRepository(config),
8040
+ review: new ReviewRepository(config),
8041
+ quote: new QuoteRepository(config),
7720
8042
  "quote-request": new QuoteRequestRepository(config),
7721
8043
  "shipping-method": new ShippingMethodRepository(config),
7722
8044
  "shopping-list": new ShoppingListRepository(config),
7723
8045
  "staged-quote": new StagedQuoteRepository(config),
7724
8046
  "standalone-price": new StandAlonePriceRepository(config),
7725
- "state": new StateRepository(config),
7726
- "store": new StoreRepository(config),
7727
- "subscription": new SubscriptionRepository(config),
8047
+ state: new StateRepository(config),
8048
+ store: new StoreRepository(config),
8049
+ subscription: new SubscriptionRepository(config),
7728
8050
  "tax-category": new TaxCategoryRepository(config),
7729
- "type": new TypeRepository(config),
7730
- "zone": new ZoneRepository(config)
8051
+ type: new TypeRepository(config),
8052
+ zone: new ZoneRepository(config)
7731
8053
  });
7732
8054
 
7733
8055
  // src/services/as-associate.ts
@@ -7808,7 +8130,7 @@ var AbstractService = class {
7808
8130
  return response.status(200).send(result);
7809
8131
  }
7810
8132
  getWithId(request, response) {
7811
- const result = this._expandWithId(request, request.params["id"]);
8133
+ const result = this._expandWithId(request, request.params.id);
7812
8134
  if (!result) {
7813
8135
  return response.status(404).send();
7814
8136
  }
@@ -7817,18 +8139,19 @@ var AbstractService = class {
7817
8139
  getWithKey(request, response) {
7818
8140
  const result = this.repository.getByKey(
7819
8141
  getRepositoryContext(request),
7820
- request.params["key"],
8142
+ request.params.key,
7821
8143
  {
7822
8144
  expand: this._parseParam(request.query.expand)
7823
8145
  }
7824
8146
  );
7825
- if (!result) return response.status(404).send();
8147
+ if (!result)
8148
+ return response.status(404).send();
7826
8149
  return response.status(200).send(result);
7827
8150
  }
7828
8151
  deleteWithId(request, response) {
7829
8152
  const result = this.repository.delete(
7830
8153
  getRepositoryContext(request),
7831
- request.params["id"],
8154
+ request.params.id,
7832
8155
  {
7833
8156
  expand: this._parseParam(request.query.expand)
7834
8157
  }
@@ -7841,7 +8164,7 @@ var AbstractService = class {
7841
8164
  deleteWithKey(request, response) {
7842
8165
  const resource = this.repository.getByKey(
7843
8166
  getRepositoryContext(request),
7844
- request.params["key"]
8167
+ request.params.key
7845
8168
  );
7846
8169
  if (!resource) {
7847
8170
  return response.status(404).send("Not found");
@@ -7874,7 +8197,7 @@ var AbstractService = class {
7874
8197
  );
7875
8198
  const resource = this.repository.get(
7876
8199
  getRepositoryContext(request),
7877
- request.params["id"]
8200
+ request.params.id
7878
8201
  );
7879
8202
  if (!resource) {
7880
8203
  return response.status(404).send("Not found");
@@ -7895,7 +8218,7 @@ var AbstractService = class {
7895
8218
  );
7896
8219
  const resource = this.repository.getByKey(
7897
8220
  getRepositoryContext(request),
7898
- request.params["key"]
8221
+ request.params.key
7899
8222
  );
7900
8223
  if (!resource) {
7901
8224
  return response.status(404).send("Not found");
@@ -8591,19 +8914,19 @@ var ProductProjectionService = class extends AbstractService {
8591
8914
  search(request, response) {
8592
8915
  const query = request.query;
8593
8916
  const searchParams = {
8594
- "filter": queryParamsArray(query.filter),
8917
+ filter: queryParamsArray(query.filter),
8595
8918
  "filter.query": queryParamsArray(query["filter.query"]),
8596
- "facet": queryParamsArray(query.facet),
8597
- "expand": queryParamsArray(query.expand),
8598
- "staged": queryParamsValue(query.staged) === "true",
8599
- "localeProjection": queryParamsValue(query.localeProjection),
8600
- "storeProjection": queryParamsValue(query.storeProjection),
8601
- "priceChannel": queryParamsValue(query.priceChannel),
8602
- "priceCountry": queryParamsValue(query.priceCountry),
8603
- "priceCurrency": queryParamsValue(query.priceCurrency),
8604
- "priceCustomerGroup": queryParamsValue(query.priceCustomerGroup),
8605
- "offset": query.offset ? Number(queryParamsValue(query.offset)) : void 0,
8606
- "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
8607
8930
  };
8608
8931
  const resource = this.repository.search(
8609
8932
  getRepositoryContext(request),
@@ -8637,6 +8960,42 @@ var ProductTypeService = class extends AbstractService {
8637
8960
  }
8638
8961
  };
8639
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
+
8640
8999
  // src/services/reviews.ts
8641
9000
  var ReviewService = class extends AbstractService {
8642
9001
  repository;
@@ -8780,14 +9139,14 @@ var createServices = (router, repos) => ({
8780
9139
  "associate-role": new AssociateRoleServices(router, repos["associate-role"]),
8781
9140
  "as-associate": new AsAssociateService(router, repos["as-associate"]),
8782
9141
  "business-unit": new BusinessUnitServices(router, repos["business-unit"]),
8783
- "category": new CategoryServices(router, repos["category"]),
8784
- "cart": new CartService(router, repos["cart"], repos["order"]),
9142
+ category: new CategoryServices(router, repos.category),
9143
+ cart: new CartService(router, repos.cart, repos.order),
8785
9144
  "cart-discount": new CartDiscountService(router, repos["cart-discount"]),
8786
- "customer": new CustomerService(router, repos["customer"]),
8787
- "channel": new ChannelService(router, repos["channel"]),
9145
+ customer: new CustomerService(router, repos.customer),
9146
+ channel: new ChannelService(router, repos.channel),
8788
9147
  "customer-group": new CustomerGroupService(router, repos["customer-group"]),
8789
9148
  "discount-code": new DiscountCodeService(router, repos["discount-code"]),
8790
- "extension": new ExtensionServices(router, repos["extension"]),
9149
+ extension: new ExtensionServices(router, repos.extension),
8791
9150
  "inventory-entry": new InventoryEntryService(
8792
9151
  router,
8793
9152
  repos["inventory-entry"]
@@ -8796,8 +9155,8 @@ var createServices = (router, repos) => ({
8796
9155
  router,
8797
9156
  repos["key-value-document"]
8798
9157
  ),
8799
- "order": new OrderService(router, repos["order"]),
8800
- "payment": new PaymentService(router, repos["payment"]),
9158
+ order: new OrderService(router, repos.order),
9159
+ payment: new PaymentService(router, repos.payment),
8801
9160
  "standalone-price": new StandAlonePriceService(
8802
9161
  router,
8803
9162
  repos["standalone-price"]
@@ -8816,7 +9175,7 @@ var createServices = (router, repos) => ({
8816
9175
  repos["shipping-method"]
8817
9176
  ),
8818
9177
  "product-type": new ProductTypeService(router, repos["product-type"]),
8819
- "product": new ProductService(router, repos["product"]),
9178
+ product: new ProductService(router, repos.product),
8820
9179
  "product-discount": new ProductDiscountService(
8821
9180
  router,
8822
9181
  repos["product-discount"]
@@ -8829,18 +9188,21 @@ var createServices = (router, repos) => ({
8829
9188
  router,
8830
9189
  repos["product-selection"]
8831
9190
  ),
8832
- "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),
8833
9194
  "shopping-list": new ShoppingListService(router, repos["shopping-list"]),
8834
- "state": new StateService(router, repos["state"]),
8835
- "store": new StoreService(router, repos["store"]),
8836
- "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),
8837
9199
  "tax-category": new TaxCategoryService(router, repos["tax-category"]),
8838
9200
  "attribute-group": new AttributeGroupService(
8839
9201
  router,
8840
9202
  repos["attribute-group"]
8841
9203
  ),
8842
- "type": new TypeService(router, repos["type"]),
8843
- "zone": new ZoneService(router, repos["zone"])
9204
+ type: new TypeService(router, repos.type),
9205
+ zone: new ZoneService(router, repos.zone)
8844
9206
  });
8845
9207
 
8846
9208
  // src/services/project.ts
@@ -8882,7 +9244,7 @@ var AbstractStorage = class {
8882
9244
  };
8883
9245
 
8884
9246
  // src/storage/in-memory.ts
8885
- import assert4 from "assert";
9247
+ import assert5 from "assert";
8886
9248
  var InMemoryStorage = class extends AbstractStorage {
8887
9249
  resources = {};
8888
9250
  projects = {};
@@ -8929,7 +9291,8 @@ var InMemoryStorage = class extends AbstractStorage {
8929
9291
  getProject = (projectKey) => this.addProject(projectKey);
8930
9292
  // Expand resolves a nested reference and injects the object in the given obj
8931
9293
  expand = (projectKey, obj, clause) => {
8932
- if (!clause) return obj;
9294
+ if (!clause)
9295
+ return obj;
8933
9296
  const newObj = cloneObject(obj);
8934
9297
  if (Array.isArray(clause)) {
8935
9298
  for (const c of clause) {
@@ -8960,13 +9323,15 @@ var InMemoryStorage = class extends AbstractStorage {
8960
9323
  this._resolveReference(projectKey, reference, params.rest);
8961
9324
  } else if (params.index === "*") {
8962
9325
  const reference = obj[params.element];
8963
- if (reference === void 0 || !Array.isArray(reference)) return;
9326
+ if (reference === void 0 || !Array.isArray(reference))
9327
+ return;
8964
9328
  for (const itemRef of reference) {
8965
9329
  this._resolveReference(projectKey, itemRef, params.rest);
8966
9330
  }
8967
9331
  } else {
8968
9332
  const reference = obj[params.element][params.index];
8969
- if (reference === void 0) return;
9333
+ if (reference === void 0)
9334
+ return;
8970
9335
  this._resolveReference(projectKey, reference, params.rest);
8971
9336
  }
8972
9337
  };
@@ -8978,38 +9343,38 @@ var InMemoryStorage = class extends AbstractStorage {
8978
9343
  "associate-role": /* @__PURE__ */ new Map(),
8979
9344
  "attribute-group": /* @__PURE__ */ new Map(),
8980
9345
  "business-unit": /* @__PURE__ */ new Map(),
8981
- "cart": /* @__PURE__ */ new Map(),
9346
+ cart: /* @__PURE__ */ new Map(),
8982
9347
  "cart-discount": /* @__PURE__ */ new Map(),
8983
- "category": /* @__PURE__ */ new Map(),
8984
- "channel": /* @__PURE__ */ new Map(),
8985
- "customer": /* @__PURE__ */ new Map(),
9348
+ category: /* @__PURE__ */ new Map(),
9349
+ channel: /* @__PURE__ */ new Map(),
9350
+ customer: /* @__PURE__ */ new Map(),
8986
9351
  "customer-group": /* @__PURE__ */ new Map(),
8987
9352
  "discount-code": /* @__PURE__ */ new Map(),
8988
- "extension": /* @__PURE__ */ new Map(),
9353
+ extension: /* @__PURE__ */ new Map(),
8989
9354
  "inventory-entry": /* @__PURE__ */ new Map(),
8990
9355
  "key-value-document": /* @__PURE__ */ new Map(),
8991
- "order": /* @__PURE__ */ new Map(),
9356
+ order: /* @__PURE__ */ new Map(),
8992
9357
  "order-edit": /* @__PURE__ */ new Map(),
8993
- "payment": /* @__PURE__ */ new Map(),
8994
- "product": /* @__PURE__ */ new Map(),
8995
- "quote": /* @__PURE__ */ new Map(),
9358
+ payment: /* @__PURE__ */ new Map(),
9359
+ product: /* @__PURE__ */ new Map(),
9360
+ quote: /* @__PURE__ */ new Map(),
8996
9361
  "quote-request": /* @__PURE__ */ new Map(),
8997
9362
  "product-discount": /* @__PURE__ */ new Map(),
8998
9363
  "product-selection": /* @__PURE__ */ new Map(),
8999
9364
  "product-type": /* @__PURE__ */ new Map(),
9000
9365
  "product-projection": /* @__PURE__ */ new Map(),
9001
9366
  "product-tailoring": /* @__PURE__ */ new Map(),
9002
- "review": /* @__PURE__ */ new Map(),
9367
+ review: /* @__PURE__ */ new Map(),
9003
9368
  "shipping-method": /* @__PURE__ */ new Map(),
9004
9369
  "staged-quote": /* @__PURE__ */ new Map(),
9005
- "state": /* @__PURE__ */ new Map(),
9006
- "store": /* @__PURE__ */ new Map(),
9370
+ state: /* @__PURE__ */ new Map(),
9371
+ store: /* @__PURE__ */ new Map(),
9007
9372
  "shopping-list": /* @__PURE__ */ new Map(),
9008
9373
  "standalone-price": /* @__PURE__ */ new Map(),
9009
- "subscription": /* @__PURE__ */ new Map(),
9374
+ subscription: /* @__PURE__ */ new Map(),
9010
9375
  "tax-category": /* @__PURE__ */ new Map(),
9011
- "type": /* @__PURE__ */ new Map(),
9012
- "zone": /* @__PURE__ */ new Map()
9376
+ type: /* @__PURE__ */ new Map(),
9377
+ zone: /* @__PURE__ */ new Map()
9013
9378
  };
9014
9379
  }
9015
9380
  return projectStorage;
@@ -9032,7 +9397,7 @@ var InMemoryStorage = class extends AbstractStorage {
9032
9397
  const store = this.forProjectKey(projectKey);
9033
9398
  store[typeId]?.set(obj.id, obj);
9034
9399
  const resource = this.get(projectKey, typeId, obj.id, params);
9035
- assert4(
9400
+ assert5(
9036
9401
  resource,
9037
9402
  `resource of type ${typeId} with id ${obj.id} not created`
9038
9403
  );
@@ -9177,7 +9542,8 @@ var InMemoryStorage = class extends AbstractStorage {
9177
9542
  });
9178
9543
  }
9179
9544
  _resolveReference(projectKey, reference, expand) {
9180
- if (reference === void 0) return;
9545
+ if (reference === void 0)
9546
+ return;
9181
9547
  if (reference.typeId !== void 0 && (reference.id !== void 0 || reference.key !== void 0)) {
9182
9548
  if (!reference.obj) {
9183
9549
  reference.obj = this.getByResourceIdentifier(projectKey, {
@@ -9330,12 +9696,11 @@ var CommercetoolsMock = class {
9330
9696
  message: err.message,
9331
9697
  errors: [err.info]
9332
9698
  });
9333
- } else {
9334
- console.error(err);
9335
- return resp.status(500).send({
9336
- error: err.message
9337
- });
9338
9699
  }
9700
+ console.error(err);
9701
+ return resp.status(500).send({
9702
+ error: err.message
9703
+ });
9339
9704
  });
9340
9705
  return app;
9341
9706
  }
@@ -9353,7 +9718,7 @@ var CommercetoolsMock = class {
9353
9718
  const body = await request.text();
9354
9719
  const url = new URL(request.url);
9355
9720
  const headers = copyHeaders(request.headers);
9356
- 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();
9357
9722
  return new HttpResponse(res.body, {
9358
9723
  status: res.statusCode,
9359
9724
  headers: mapHeaderType(res.headers)
@@ -9363,7 +9728,7 @@ var CommercetoolsMock = class {
9363
9728
  const body = await request.text();
9364
9729
  const url = new URL(request.url);
9365
9730
  const headers = copyHeaders(request.headers);
9366
- 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();
9367
9732
  if (res.statusCode === 200) {
9368
9733
  const parsedBody = JSON.parse(res.body);
9369
9734
  const resultCount = "count" in parsedBody ? parsedBody.count : Object.keys(parsedBody).length;
@@ -9381,7 +9746,7 @@ var CommercetoolsMock = class {
9381
9746
  const body = await request.text();
9382
9747
  const url = new URL(request.url);
9383
9748
  const headers = copyHeaders(request.headers);
9384
- 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();
9385
9750
  return new HttpResponse(res.body, {
9386
9751
  status: res.statusCode,
9387
9752
  headers: mapHeaderType(res.headers)
@@ -9391,7 +9756,7 @@ var CommercetoolsMock = class {
9391
9756
  const body = await request.text();
9392
9757
  const url = new URL(request.url);
9393
9758
  const headers = copyHeaders(request.headers);
9394
- 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();
9395
9760
  return new HttpResponse(res.body, {
9396
9761
  status: res.statusCode,
9397
9762
  headers: mapHeaderType(res.headers)
@@ -9401,7 +9766,7 @@ var CommercetoolsMock = class {
9401
9766
  const body = await request.text();
9402
9767
  const url = new URL(request.url);
9403
9768
  const headers = copyHeaders(request.headers);
9404
- 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();
9405
9770
  return new HttpResponse(res.body, {
9406
9771
  status: res.statusCode,
9407
9772
  headers: mapHeaderType(res.headers)
@@ -9416,10 +9781,9 @@ var CommercetoolsMock = class {
9416
9781
  if (_globalListeners.length > 0) {
9417
9782
  if (this._mswServer !== void 0) {
9418
9783
  throw new Error("Server already started");
9419
- } else {
9420
- process.emitWarning("Server wasn't stopped properly, clearing");
9421
- _globalListeners.forEach((listener) => listener.close());
9422
9784
  }
9785
+ process.emitWarning("Server wasn't stopped properly, clearing");
9786
+ _globalListeners.forEach((listener) => listener.close());
9423
9787
  }
9424
9788
  const server = setupServer();
9425
9789
  this.registerHandlers(server);