@labdigital/commercetools-mock 0.10.0 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/dist/index.d.ts +353 -188
  2. package/dist/index.global.js +930 -874
  3. package/dist/index.global.js.map +1 -1
  4. package/dist/index.js +271 -215
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.mjs +271 -215
  7. package/dist/index.mjs.map +1 -1
  8. package/package.json +3 -2
  9. package/src/ctMock.ts +15 -9
  10. package/src/helpers.ts +1 -1
  11. package/src/lib/projectionSearchFilter.ts +3 -2
  12. package/src/priceSelector.test.ts +1 -3
  13. package/src/product-projection-search.ts +1 -3
  14. package/src/projectAPI.test.ts +7 -0
  15. package/src/projectAPI.ts +17 -22
  16. package/src/repositories/abstract.ts +31 -24
  17. package/src/repositories/cart-discount.ts +3 -4
  18. package/src/repositories/cart.ts +20 -15
  19. package/src/repositories/category.ts +6 -7
  20. package/src/repositories/channel.ts +4 -5
  21. package/src/repositories/custom-object.ts +9 -13
  22. package/src/repositories/customer-group.ts +3 -4
  23. package/src/repositories/customer.ts +4 -5
  24. package/src/repositories/discount-code.ts +4 -5
  25. package/src/repositories/errors.ts +1 -3
  26. package/src/repositories/extension.ts +7 -8
  27. package/src/repositories/helpers.ts +2 -2
  28. package/src/repositories/index.ts +19 -3
  29. package/src/repositories/inventory-entry.ts +4 -5
  30. package/src/repositories/my-order.ts +2 -2
  31. package/src/repositories/order-edit.ts +39 -0
  32. package/src/repositories/order.test.ts +16 -11
  33. package/src/repositories/order.ts +15 -8
  34. package/src/repositories/payment.ts +6 -7
  35. package/src/repositories/product-discount.ts +4 -24
  36. package/src/repositories/product-projection.ts +11 -5
  37. package/src/repositories/product-selection.ts +40 -0
  38. package/src/repositories/product-type.ts +11 -28
  39. package/src/repositories/product.ts +7 -8
  40. package/src/repositories/project.ts +8 -8
  41. package/src/repositories/quote-request.ts +28 -0
  42. package/src/repositories/quote.ts +28 -0
  43. package/src/repositories/review.ts +34 -0
  44. package/src/repositories/shipping-method.ts +10 -11
  45. package/src/repositories/shopping-list.ts +4 -4
  46. package/src/repositories/staged-quote.ts +29 -0
  47. package/src/repositories/standalone-price.ts +36 -0
  48. package/src/repositories/state.ts +7 -8
  49. package/src/repositories/store.ts +11 -27
  50. package/src/repositories/subscription.ts +3 -4
  51. package/src/repositories/tax-category.ts +5 -22
  52. package/src/repositories/type.ts +12 -13
  53. package/src/repositories/zone.ts +4 -5
  54. package/src/server.ts +4 -4
  55. package/src/services/abstract.ts +3 -5
  56. package/src/services/cart-discount.ts +1 -1
  57. package/src/services/cart.test.ts +1 -1
  58. package/src/services/cart.ts +40 -33
  59. package/src/services/category.ts +1 -1
  60. package/src/services/channel.ts +1 -1
  61. package/src/services/custom-object.test.ts +1 -1
  62. package/src/services/custom-object.ts +2 -2
  63. package/src/services/customer-group.ts +1 -1
  64. package/src/services/customer.test.ts +1 -1
  65. package/src/services/customer.ts +3 -3
  66. package/src/services/discount-code.ts +1 -1
  67. package/src/services/extension.ts +1 -1
  68. package/src/services/inventory-entry.test.ts +1 -1
  69. package/src/services/inventory-entry.ts +1 -1
  70. package/src/services/my-cart.test.ts +2 -0
  71. package/src/services/my-cart.ts +1 -1
  72. package/src/services/my-customer.ts +1 -1
  73. package/src/services/my-order.ts +1 -1
  74. package/src/services/my-payment.ts +1 -1
  75. package/src/services/order.test.ts +24 -20
  76. package/src/services/order.ts +2 -2
  77. package/src/services/payment.ts +1 -1
  78. package/src/services/product-discount.ts +1 -17
  79. package/src/services/product-projection.test.ts +1 -1
  80. package/src/services/product-projection.ts +2 -2
  81. package/src/services/product-type.ts +1 -17
  82. package/src/services/product.test.ts +1 -1
  83. package/src/services/product.ts +1 -1
  84. package/src/services/project.ts +2 -3
  85. package/src/services/shipping-method.ts +1 -1
  86. package/src/services/shopping-list.ts +1 -1
  87. package/src/services/state.ts +1 -1
  88. package/src/services/store.ts +2 -18
  89. package/src/services/subscription.ts +1 -1
  90. package/src/services/tax-category.ts +1 -17
  91. package/src/services/type.ts +1 -1
  92. package/src/services/zone.ts +1 -1
  93. package/src/storage/abstract.ts +82 -0
  94. package/src/{storage.ts → storage/in-memory.ts} +57 -118
  95. package/src/storage/index.ts +2 -0
  96. package/src/types.ts +48 -119
package/dist/index.js CHANGED
@@ -37,9 +37,56 @@ var import_express6 = __toESM(require("express"));
37
37
  var import_supertest = __toESM(require("supertest"));
38
38
  var import_morgan = __toESM(require("morgan"));
39
39
 
40
- // src/storage.ts
40
+ // src/storage/abstract.ts
41
+ var AbstractStorage = class {
42
+ };
43
+
44
+ // src/storage/in-memory.ts
41
45
  var import_assert = __toESM(require("assert"));
42
46
 
47
+ // src/exceptions.ts
48
+ var CommercetoolsError = class extends Error {
49
+ constructor(info, statusCode = 400) {
50
+ super(info.message);
51
+ this.info = info;
52
+ this.statusCode = statusCode || 500;
53
+ }
54
+ };
55
+
56
+ // src/helpers.ts
57
+ var import_uuid = require("uuid");
58
+ var getBaseResourceProperties = () => ({
59
+ id: (0, import_uuid.v4)(),
60
+ createdAt: new Date().toISOString(),
61
+ lastModifiedAt: new Date().toISOString(),
62
+ version: 0
63
+ });
64
+ var nestedLookup = (obj, path) => {
65
+ if (!path || path === "") {
66
+ return obj;
67
+ }
68
+ const parts = path.split(".");
69
+ let val = obj;
70
+ for (let i = 0; i < parts.length; i++) {
71
+ const part = parts[i];
72
+ if (val == void 0) {
73
+ return void 0;
74
+ }
75
+ val = val[part];
76
+ }
77
+ return val;
78
+ };
79
+ var QueryParamsAsArray = (input) => {
80
+ if (input == void 0) {
81
+ return [];
82
+ }
83
+ if (Array.isArray(input)) {
84
+ return input;
85
+ }
86
+ return [input];
87
+ };
88
+ var cloneObject = (o) => JSON.parse(JSON.stringify(o));
89
+
43
90
  // src/lib/expandParser.ts
44
91
  var parseExpandClause = (clause) => {
45
92
  const result = {
@@ -357,52 +404,7 @@ var generateMatchFunc = (predicate) => {
357
404
  return result;
358
405
  };
359
406
 
360
- // src/exceptions.ts
361
- var CommercetoolsError = class extends Error {
362
- constructor(info, statusCode = 400) {
363
- super(info.message);
364
- this.info = info;
365
- this.statusCode = statusCode || 500;
366
- }
367
- };
368
-
369
- // src/helpers.ts
370
- var import_uuid = require("uuid");
371
- var getBaseResourceProperties = () => ({
372
- id: (0, import_uuid.v4)(),
373
- createdAt: new Date().toISOString(),
374
- lastModifiedAt: new Date().toISOString(),
375
- version: 0
376
- });
377
- var nestedLookup = (obj, path) => {
378
- if (!path || path === "") {
379
- return obj;
380
- }
381
- const parts = path.split(".");
382
- let val = obj;
383
- for (let i = 0; i < parts.length; i++) {
384
- const part = parts[i];
385
- if (val == void 0) {
386
- return void 0;
387
- }
388
- val = val[part];
389
- }
390
- return val;
391
- };
392
- var QueryParamsAsArray = (input) => {
393
- if (input == void 0) {
394
- return [];
395
- }
396
- if (Array.isArray(input)) {
397
- return input;
398
- }
399
- return [input];
400
- };
401
- var cloneObject = (o) => JSON.parse(JSON.stringify(o));
402
-
403
- // src/storage.ts
404
- var AbstractStorage = class {
405
- };
407
+ // src/storage/in-memory.ts
406
408
  var InMemoryStorage = class extends AbstractStorage {
407
409
  constructor() {
408
410
  super(...arguments);
@@ -498,13 +500,15 @@ var InMemoryStorage = class extends AbstractStorage {
498
500
  "order-edit": /* @__PURE__ */ new Map(),
499
501
  payment: /* @__PURE__ */ new Map(),
500
502
  product: /* @__PURE__ */ new Map(),
503
+ quote: /* @__PURE__ */ new Map(),
504
+ "quote-request": /* @__PURE__ */ new Map(),
501
505
  "product-discount": /* @__PURE__ */ new Map(),
502
- "product-price": /* @__PURE__ */ new Map(),
503
506
  "product-selection": /* @__PURE__ */ new Map(),
504
507
  "product-type": /* @__PURE__ */ new Map(),
505
508
  "product-projection": /* @__PURE__ */ new Map(),
506
509
  review: /* @__PURE__ */ new Map(),
507
510
  "shipping-method": /* @__PURE__ */ new Map(),
511
+ "staged-quote": /* @__PURE__ */ new Map(),
508
512
  state: /* @__PURE__ */ new Map(),
509
513
  store: /* @__PURE__ */ new Map(),
510
514
  "shopping-list": /* @__PURE__ */ new Map(),
@@ -576,7 +580,7 @@ var InMemoryStorage = class extends AbstractStorage {
576
580
  if (!store) {
577
581
  throw new Error("No type");
578
582
  }
579
- let resources = Array.from(store.values());
583
+ let resources = this.all(projectKey, typeId);
580
584
  if (params.where) {
581
585
  try {
582
586
  const filterFunc = parseQueryExpression(params.where);
@@ -650,7 +654,7 @@ var InMemoryStorage = class extends AbstractStorage {
650
654
  console.error(
651
655
  `No resource found with typeId=${identifier.typeId}, id=${identifier.id}`
652
656
  );
653
- return void 0;
657
+ return null;
654
658
  }
655
659
  if (identifier.key) {
656
660
  const store = this.forProjectKey(projectKey)[identifier.typeId];
@@ -667,7 +671,7 @@ var InMemoryStorage = class extends AbstractStorage {
667
671
  );
668
672
  }
669
673
  }
670
- return void 0;
674
+ return null;
671
675
  }
672
676
  _resolveReference(projectKey, reference, expand) {
673
677
  if (reference === void 0)
@@ -834,14 +838,14 @@ var OAuth2Server = class {
834
838
 
835
839
  // src/projectAPI.ts
836
840
  var ProjectAPI = class {
837
- constructor(projectKey, services, storage) {
841
+ constructor(projectKey, repositories, storage) {
838
842
  this.projectKey = projectKey;
839
843
  this._storage = storage;
840
- this._services = services;
844
+ this._repositories = repositories;
841
845
  }
842
846
  add(typeId, resource) {
843
- const service = this._services[typeId];
844
- if (service) {
847
+ const repository = this._repositories[typeId];
848
+ if (repository) {
845
849
  this._storage.add(this.projectKey, typeId, {
846
850
  ...getBaseResourceProperties(),
847
851
  ...resource
@@ -859,9 +863,9 @@ var ProjectAPI = class {
859
863
  );
860
864
  }
861
865
  getRepository(typeId) {
862
- const service = this._services[typeId];
863
- if (service !== void 0) {
864
- return service.repository;
866
+ const repository = this._repositories[typeId];
867
+ if (repository !== void 0) {
868
+ return repository;
865
869
  }
866
870
  throw new Error("No such repository");
867
871
  }
@@ -1097,14 +1101,14 @@ var AbstractRepository = class {
1097
1101
  }
1098
1102
  return result;
1099
1103
  }
1100
- postProcessResource(resource) {
1101
- return resource;
1102
- }
1103
1104
  };
1104
1105
  var AbstractResourceRepository = class extends AbstractRepository {
1105
1106
  constructor(storage) {
1106
1107
  super(storage);
1107
1108
  }
1109
+ postProcessResource(resource) {
1110
+ return resource;
1111
+ }
1108
1112
  query(context, params = {}) {
1109
1113
  const result = this._storage.query(context.projectKey, this.getTypeId(), {
1110
1114
  expand: params.expand,
@@ -1251,11 +1255,13 @@ var CartRepository = class extends AbstractResourceRepository {
1251
1255
  id: (0, import_uuid3.v4)(),
1252
1256
  productId: product.id,
1253
1257
  productKey: product.key,
1254
- name: product.masterData.current.name,
1255
1258
  productSlug: product.masterData.current.slug,
1256
1259
  productType: product.productType,
1260
+ name: product.masterData.current.name,
1257
1261
  variant,
1258
1262
  price,
1263
+ taxedPricePortions: [],
1264
+ perMethodTaxRate: [],
1259
1265
  totalPrice: {
1260
1266
  ...price.value,
1261
1267
  centAmount: price.value.centAmount * quantity
@@ -1402,15 +1408,17 @@ var CartRepository = class extends AbstractResourceRepository {
1402
1408
  id: (0, import_uuid3.v4)(),
1403
1409
  productId: product.id,
1404
1410
  productKey: product.key,
1405
- name: product.masterData.current.name,
1406
1411
  productSlug: product.masterData.current.slug,
1407
1412
  productType: product.productType,
1413
+ name: product.masterData.current.name,
1408
1414
  variant,
1409
1415
  price,
1410
1416
  totalPrice: {
1411
1417
  ...price.value,
1412
1418
  centAmount: price.value.centAmount * quant
1413
1419
  },
1420
+ taxedPricePortions: [],
1421
+ perMethodTaxRate: [],
1414
1422
  quantity: quant,
1415
1423
  discountedPricePerQuantity: [],
1416
1424
  lineItemMode: "Standard",
@@ -1435,21 +1443,23 @@ var CartRepository = class extends AbstractResourceRepository {
1435
1443
  const resource = {
1436
1444
  ...getBaseResourceProperties(),
1437
1445
  cartState: "Active",
1438
- lineItems,
1446
+ country: draft.country,
1439
1447
  customLineItems: [],
1448
+ lineItems,
1449
+ locale: draft.locale,
1450
+ taxCalculationMode: draft.taxCalculationMode ?? "LineItemLevel",
1451
+ taxMode: draft.taxMode ?? "Platform",
1452
+ taxRoundingMode: draft.taxRoundingMode ?? "HalfEven",
1440
1453
  totalPrice: {
1441
1454
  type: "centPrecision",
1442
1455
  centAmount: 0,
1443
1456
  currencyCode: draft.currency,
1444
1457
  fractionDigits: 0
1445
1458
  },
1446
- taxMode: draft.taxMode ?? "Platform",
1447
- taxRoundingMode: draft.taxRoundingMode ?? "HalfEven",
1448
- taxCalculationMode: draft.taxCalculationMode ?? "LineItemLevel",
1449
- refusedGifts: [],
1450
- locale: draft.locale,
1451
- country: draft.country,
1459
+ shippingMode: "Single",
1460
+ shipping: [],
1452
1461
  origin: draft.origin ?? "Customer",
1462
+ refusedGifts: [],
1453
1463
  custom: createCustomFields(
1454
1464
  draft.custom,
1455
1465
  context.projectKey,
@@ -1803,10 +1813,7 @@ var CustomObjectRepository = class extends AbstractResourceRepository {
1803
1813
  }
1804
1814
  }
1805
1815
  getWithContainerAndKey(context, container, key) {
1806
- const items = this._storage.all(
1807
- context.projectKey,
1808
- this.getTypeId()
1809
- );
1816
+ const items = this._storage.all(context.projectKey, this.getTypeId());
1810
1817
  return items.find(
1811
1818
  (item) => item.container === container && item.key === key
1812
1819
  );
@@ -1913,7 +1920,7 @@ var CustomerGroupRepository = class extends AbstractResourceRepository {
1913
1920
  };
1914
1921
  }
1915
1922
  getTypeId() {
1916
- return "customer";
1923
+ return "customer-group";
1917
1924
  }
1918
1925
  create(context, draft) {
1919
1926
  const resource = {
@@ -1998,7 +2005,7 @@ var DiscountCodeRepository = class extends AbstractResourceRepository {
1998
2005
  };
1999
2006
  }
2000
2007
  getTypeId() {
2001
- return "cart-discount";
2008
+ return "discount-code";
2002
2009
  }
2003
2010
  create(context, draft) {
2004
2011
  const resource = {
@@ -2309,6 +2316,8 @@ var OrderRepository = class extends AbstractResourceRepository {
2309
2316
  refusedGifts: [],
2310
2317
  origin: "Customer",
2311
2318
  syncInfo: [],
2319
+ shippingMode: cart.shippingMode,
2320
+ shipping: cart.shipping,
2312
2321
  store: context.storeKey ? {
2313
2322
  key: context.storeKey,
2314
2323
  typeId: "store"
@@ -2337,6 +2346,8 @@ var OrderRepository = class extends AbstractResourceRepository {
2337
2346
  origin: draft.origin || "Customer",
2338
2347
  paymentState: draft.paymentState,
2339
2348
  refusedGifts: [],
2349
+ shippingMode: "Single",
2350
+ shipping: [],
2340
2351
  store: resolveStoreReference(
2341
2352
  draft.store,
2342
2353
  context.projectKey,
@@ -2408,6 +2419,8 @@ var OrderRepository = class extends AbstractResourceRepository {
2408
2419
  quantity: draft.quantity,
2409
2420
  state: draft.state || [],
2410
2421
  taxRate: draft.taxRate,
2422
+ taxedPricePortions: [],
2423
+ perMethodTaxRate: [],
2411
2424
  totalPrice: createTypedMoney(draft.price.value),
2412
2425
  variant: {
2413
2426
  id: variant.id,
@@ -2429,6 +2442,7 @@ var OrderRepository = class extends AbstractResourceRepository {
2429
2442
  money: createTypedMoney(draft.money),
2430
2443
  name: draft.name,
2431
2444
  quantity: draft.quantity,
2445
+ priceMode: draft.priceMode,
2432
2446
  slug: draft.slug,
2433
2447
  state: [],
2434
2448
  totalPrice: createTypedMoney(draft.money)
@@ -2462,6 +2476,29 @@ var MyOrderRepository = class extends OrderRepository {
2462
2476
  }
2463
2477
  };
2464
2478
 
2479
+ // src/repositories/order-edit.ts
2480
+ var OrderEditRepository = class extends AbstractResourceRepository {
2481
+ constructor() {
2482
+ super(...arguments);
2483
+ this.actions = {};
2484
+ }
2485
+ getTypeId() {
2486
+ return "order-edit";
2487
+ }
2488
+ create(context, draft) {
2489
+ const resource = {
2490
+ ...getBaseResourceProperties(),
2491
+ stagedActions: draft.stagedActions ?? [],
2492
+ resource: draft.resource,
2493
+ result: {
2494
+ type: "NotProcessed"
2495
+ }
2496
+ };
2497
+ this.saveNew(context, resource);
2498
+ return resource;
2499
+ }
2500
+ };
2501
+
2465
2502
  // src/repositories/payment.ts
2466
2503
  var import_uuid5 = require("uuid");
2467
2504
  var PaymentRepository = class extends AbstractResourceRepository {
@@ -2621,7 +2658,7 @@ var ProductRepository = class extends AbstractResourceRepository {
2621
2658
  checkForStagedChanges(resource);
2622
2659
  return resource;
2623
2660
  },
2624
- "setDescription": (context, resource, { description, staged }) => {
2661
+ setDescription: (context, resource, { description, staged }) => {
2625
2662
  const onlyStaged = staged !== void 0 ? staged : true;
2626
2663
  resource.masterData.staged.description = description;
2627
2664
  if (!onlyStaged) {
@@ -2630,7 +2667,7 @@ var ProductRepository = class extends AbstractResourceRepository {
2630
2667
  checkForStagedChanges(resource);
2631
2668
  return resource;
2632
2669
  },
2633
- "setKey": (context, resource, { key }) => {
2670
+ setKey: (context, resource, { key }) => {
2634
2671
  resource.key = key;
2635
2672
  return resource;
2636
2673
  }
@@ -2816,18 +2853,6 @@ var ProductDiscountRepository = class extends AbstractResourceRepository {
2816
2853
  }
2817
2854
  }
2818
2855
  }
2819
- getWithKey(context, key) {
2820
- const result = this._storage.query(context.projectKey, this.getTypeId(), {
2821
- where: [`key="${key}"`]
2822
- });
2823
- if (result.count === 1) {
2824
- return result.results[0];
2825
- }
2826
- if (result.count > 1) {
2827
- throw new Error("Duplicate product discount key");
2828
- }
2829
- return;
2830
- }
2831
2856
  };
2832
2857
 
2833
2858
  // src/lib/projectionSearchFilter.ts
@@ -3075,7 +3100,7 @@ var ProductProjectionSearch = class {
3075
3100
  this._storage = storage;
3076
3101
  }
3077
3102
  search(projectKey, params) {
3078
- let resources = this._storage.all(projectKey, "product").map((r) => this.transform(r, params.staged ?? false)).filter((p) => p !== null).filter((p) => {
3103
+ let resources = this._storage.all(projectKey, "product").map((r) => this.transform(r, params.staged ?? false)).filter((p) => {
3079
3104
  if (!params.staged) {
3080
3105
  return p.published;
3081
3106
  }
@@ -3142,8 +3167,6 @@ var ProductProjectionSearch = class {
3142
3167
  }
3143
3168
  transform(product, staged) {
3144
3169
  const obj = !staged ? product.masterData.current : product.masterData.staged;
3145
- if (!obj)
3146
- return null;
3147
3170
  return {
3148
3171
  id: product.id,
3149
3172
  createdAt: product.createdAt,
@@ -3315,12 +3338,18 @@ var ProductProjectionRepository = class extends AbstractResourceRepository {
3315
3338
  throw new Error("No valid action");
3316
3339
  }
3317
3340
  query(context, params = {}) {
3318
- return this._storage.query(context.projectKey, "product", {
3341
+ const response = this._storage.query(context.projectKey, "product", {
3319
3342
  expand: params.expand,
3320
3343
  where: params.where,
3321
3344
  offset: params.offset,
3322
3345
  limit: params.limit
3323
3346
  });
3347
+ return {
3348
+ ...response,
3349
+ results: response.results.map(
3350
+ (r) => this._searchService.transform(r, false)
3351
+ )
3352
+ };
3324
3353
  }
3325
3354
  search(context, query) {
3326
3355
  const results = this._searchService.search(context.projectKey, {
@@ -3336,6 +3365,27 @@ var ProductProjectionRepository = class extends AbstractResourceRepository {
3336
3365
  }
3337
3366
  };
3338
3367
 
3368
+ // src/repositories/product-selection.ts
3369
+ var ProductSelectionRepository = class extends AbstractResourceRepository {
3370
+ constructor() {
3371
+ super(...arguments);
3372
+ this.actions = {};
3373
+ }
3374
+ getTypeId() {
3375
+ return "product-selection";
3376
+ }
3377
+ create(context, draft) {
3378
+ const resource = {
3379
+ ...getBaseResourceProperties(),
3380
+ productCount: 0,
3381
+ name: draft.name,
3382
+ type: "individual"
3383
+ };
3384
+ this.saveNew(context, resource);
3385
+ return resource;
3386
+ }
3387
+ };
3388
+
3339
3389
  // src/repositories/product-type.ts
3340
3390
  var ProductTypeRepository = class extends AbstractResourceRepository {
3341
3391
  constructor() {
@@ -3387,20 +3437,20 @@ var ProductTypeRepository = class extends AbstractResourceRepository {
3387
3437
  this.attributeDefinitionFromAttributeDefinitionDraft(context, attribute)
3388
3438
  );
3389
3439
  },
3390
- changeAttributeOrder: (context, resource, { attributes }) => {
3440
+ changeAttributeOrderByName: (context, resource, { attributeNames }) => {
3391
3441
  var _a;
3392
3442
  const attrs = new Map(
3393
3443
  (_a = resource.attributes) == null ? void 0 : _a.map((item) => [item.name, item])
3394
3444
  );
3395
3445
  const result = [];
3396
3446
  let current = resource.attributes;
3397
- attributes.forEach((iAttr) => {
3398
- const attr = attrs.get(iAttr.name);
3447
+ attributeNames.forEach((attrName) => {
3448
+ const attr = attrs.get(attrName);
3399
3449
  if (attr === void 0) {
3400
3450
  throw new Error("New attr");
3401
3451
  }
3402
3452
  result.push(attr);
3403
- current = current == null ? void 0 : current.filter((f) => f.name !== iAttr.name);
3453
+ current = current == null ? void 0 : current.filter((f) => f.name !== attrName);
3404
3454
  });
3405
3455
  resource.attributes = result;
3406
3456
  if (current) {
@@ -3448,18 +3498,6 @@ var ProductTypeRepository = class extends AbstractResourceRepository {
3448
3498
  this.saveNew(context, resource);
3449
3499
  return resource;
3450
3500
  }
3451
- getWithKey(context, key) {
3452
- const result = this._storage.query(context.projectKey, this.getTypeId(), {
3453
- where: [`key="${key}"`]
3454
- });
3455
- if (result.count === 1) {
3456
- return result.results[0];
3457
- }
3458
- if (result.count > 1) {
3459
- throw new Error("Duplicate product type key");
3460
- }
3461
- return;
3462
- }
3463
3501
  };
3464
3502
 
3465
3503
  // src/repositories/project.ts
@@ -3479,8 +3517,8 @@ var ProjectRepository = class extends AbstractRepository {
3479
3517
  changeLanguages: (context, resource, { languages }) => {
3480
3518
  resource.languages = languages;
3481
3519
  },
3482
- changeMessagesEnabled: (context, resource, { messagesEnabled }) => {
3483
- resource.messages.enabled = messagesEnabled;
3520
+ changeMessagesConfiguration: (context, resource, { messagesConfiguration }) => {
3521
+ resource.messages.enabled = messagesConfiguration.enabled;
3484
3522
  },
3485
3523
  changeProductSearchIndexingEnabled: (context, resource, { enabled }) => {
3486
3524
  var _a;
@@ -3536,6 +3574,53 @@ var ProjectRepository = class extends AbstractRepository {
3536
3574
  }
3537
3575
  };
3538
3576
 
3577
+ // src/repositories/quote.ts
3578
+ var QuoteRepository = class extends AbstractResourceRepository {
3579
+ constructor() {
3580
+ super(...arguments);
3581
+ this.actions = {};
3582
+ }
3583
+ getTypeId() {
3584
+ return "quote";
3585
+ }
3586
+ create(context, draft) {
3587
+ throw new Error("not implemented");
3588
+ }
3589
+ };
3590
+
3591
+ // src/repositories/quote-request.ts
3592
+ var QuoteRequestRepository = class extends AbstractResourceRepository {
3593
+ constructor() {
3594
+ super(...arguments);
3595
+ this.actions = {};
3596
+ }
3597
+ getTypeId() {
3598
+ return "quote-request";
3599
+ }
3600
+ create(context, draft) {
3601
+ throw new Error("not implemented");
3602
+ }
3603
+ };
3604
+
3605
+ // src/repositories/review.ts
3606
+ var ReviewRepository = class extends AbstractResourceRepository {
3607
+ constructor() {
3608
+ super(...arguments);
3609
+ this.actions = {};
3610
+ }
3611
+ getTypeId() {
3612
+ return "review";
3613
+ }
3614
+ create(context, draft) {
3615
+ const resource = {
3616
+ ...getBaseResourceProperties(),
3617
+ includedInStatistics: false
3618
+ };
3619
+ this.saveNew(context, resource);
3620
+ return resource;
3621
+ }
3622
+ };
3623
+
3539
3624
  // src/repositories/shipping-method.ts
3540
3625
  var import_deep_equal3 = __toESM(require("deep-equal"));
3541
3626
  var ShippingMethodRepository = class extends AbstractResourceRepository {
@@ -3710,6 +3795,41 @@ var ShoppingListRepository = class extends AbstractResourceRepository {
3710
3795
  }
3711
3796
  };
3712
3797
 
3798
+ // src/repositories/staged-quote.ts
3799
+ var StagedQuoteRepository = class extends AbstractResourceRepository {
3800
+ constructor() {
3801
+ super(...arguments);
3802
+ this.actions = {};
3803
+ }
3804
+ getTypeId() {
3805
+ return "staged-quote";
3806
+ }
3807
+ create(context, draft) {
3808
+ throw new Error("not implemented");
3809
+ }
3810
+ };
3811
+
3812
+ // src/repositories/standalone-price.ts
3813
+ var StandAlonePriceRepository = class extends AbstractResourceRepository {
3814
+ constructor() {
3815
+ super(...arguments);
3816
+ this.actions = {};
3817
+ }
3818
+ getTypeId() {
3819
+ return "standalone-price";
3820
+ }
3821
+ create(context, draft) {
3822
+ const resource = {
3823
+ ...getBaseResourceProperties(),
3824
+ active: draft.active,
3825
+ sku: draft.sku,
3826
+ value: draft.value
3827
+ };
3828
+ this.saveNew(context, resource);
3829
+ return resource;
3830
+ }
3831
+ };
3832
+
3713
3833
  // src/repositories/state.ts
3714
3834
  var StateRepository = class extends AbstractResourceRepository {
3715
3835
  constructor() {
@@ -3830,18 +3950,6 @@ var StoreRepository = class extends AbstractResourceRepository {
3830
3950
  )
3831
3951
  );
3832
3952
  }
3833
- getWithKey(context, key) {
3834
- const result = this._storage.query(context.projectKey, this.getTypeId(), {
3835
- where: [`key="${key}"`]
3836
- });
3837
- if (result.count === 1) {
3838
- return result.results[0];
3839
- }
3840
- if (result.count > 1) {
3841
- throw new Error("Duplicate store key");
3842
- }
3843
- return;
3844
- }
3845
3953
  };
3846
3954
 
3847
3955
  // src/repositories/subscription.ts
@@ -3941,18 +4049,6 @@ var TaxCategoryRepository = class extends AbstractResourceRepository {
3941
4049
  this.saveNew(context, resource);
3942
4050
  return resource;
3943
4051
  }
3944
- getWithKey(context, key) {
3945
- const result = this._storage.query(context.projectKey, this.getTypeId(), {
3946
- where: [`key="${key}"`]
3947
- });
3948
- if (result.count === 1) {
3949
- return result.results[0];
3950
- }
3951
- if (result.count > 1) {
3952
- throw new Error("Duplicate tax category key");
3953
- }
3954
- return;
3955
- }
3956
4052
  };
3957
4053
 
3958
4054
  // src/repositories/type.ts
@@ -4111,18 +4207,25 @@ var createRepositories = (storage) => ({
4111
4207
  "inventory-entry": new InventoryEntryRepository(storage),
4112
4208
  "key-value-document": new CustomObjectRepository(storage),
4113
4209
  order: new OrderRepository(storage),
4210
+ "order-edit": new OrderEditRepository(storage),
4114
4211
  payment: new PaymentRepository(storage),
4115
4212
  "my-cart": new CartRepository(storage),
4116
4213
  "my-order": new MyOrderRepository(storage),
4117
4214
  "my-customer": new CustomerRepository(storage),
4118
4215
  "my-payment": new PaymentRepository(storage),
4119
- "shipping-method": new ShippingMethodRepository(storage),
4120
- "product-type": new ProductTypeRepository(storage),
4121
4216
  product: new ProductRepository(storage),
4122
- project: new ProjectRepository(storage),
4217
+ "product-type": new ProductTypeRepository(storage),
4123
4218
  "product-discount": new ProductDiscountRepository(storage),
4124
4219
  "product-projection": new ProductProjectionRepository(storage),
4220
+ "product-selection": new ProductSelectionRepository(storage),
4221
+ project: new ProjectRepository(storage),
4222
+ review: new ReviewRepository(storage),
4223
+ quote: new QuoteRepository(storage),
4224
+ "quote-request": new QuoteRequestRepository(storage),
4225
+ "shipping-method": new ShippingMethodRepository(storage),
4125
4226
  "shopping-list": new ShoppingListRepository(storage),
4227
+ "staged-quote": new StagedQuoteRepository(storage),
4228
+ "standalone-price": new StandAlonePriceRepository(storage),
4126
4229
  state: new StateRepository(storage),
4127
4230
  store: new StoreRepository(storage),
4128
4231
  subscription: new SubscriptionRepository(storage),
@@ -4291,25 +4394,27 @@ var CartService = class extends AbstractService {
4291
4394
  return "carts";
4292
4395
  }
4293
4396
  extraRoutes(parent) {
4294
- parent.post("/replicate", (request, response) => {
4295
- const context = getRepositoryContext(request);
4296
- const cartOrOrder = request.body.reference.typeId === "order" ? this.orderRepository.get(context, request.body.reference.id) : this.repository.get(context, request.body.reference.id);
4297
- if (!cartOrOrder) {
4298
- return response.status(400).send();
4299
- }
4300
- const cartDraft = {
4301
- ...cartOrOrder,
4302
- currency: cartOrOrder.totalPrice.currencyCode,
4303
- discountCodes: [],
4304
- lineItems: cartOrOrder.lineItems.map((lineItem) => ({
4305
- ...lineItem,
4306
- variantId: lineItem.variant.id,
4307
- sku: lineItem.variant.sku
4308
- }))
4309
- };
4310
- const newCart = this.repository.create(context, cartDraft);
4311
- return response.status(200).send(newCart);
4312
- });
4397
+ parent.post("/replicate", this.replicate.bind(this));
4398
+ }
4399
+ replicate(request, response) {
4400
+ const context = getRepositoryContext(request);
4401
+ const cartOrOrder = request.body.reference.typeId === "order" ? this.orderRepository.get(context, request.body.reference.id) : this.repository.get(context, request.body.reference.id);
4402
+ if (!cartOrOrder) {
4403
+ return response.status(400).send();
4404
+ }
4405
+ const cartDraft = {
4406
+ ...cartOrOrder,
4407
+ currency: cartOrOrder.totalPrice.currencyCode,
4408
+ discountCodes: [],
4409
+ shipping: [],
4410
+ lineItems: cartOrOrder.lineItems.map((lineItem) => ({
4411
+ ...lineItem,
4412
+ variantId: lineItem.variant.id,
4413
+ sku: lineItem.variant.sku
4414
+ }))
4415
+ };
4416
+ const newCart = this.repository.create(context, cartDraft);
4417
+ return response.status(200).send(newCart);
4313
4418
  }
4314
4419
  };
4315
4420
 
@@ -4654,19 +4759,6 @@ var ProductDiscountService = class extends AbstractService {
4654
4759
  getBasePath() {
4655
4760
  return "product-discounts";
4656
4761
  }
4657
- extraRoutes(router) {
4658
- router.get("/key=:key", this.getWithKey.bind(this));
4659
- }
4660
- getWithKey(request, response) {
4661
- const resource = this.repository.getWithKey(
4662
- getRepositoryContext(request),
4663
- request.params.key
4664
- );
4665
- if (resource) {
4666
- return response.status(200).send(resource);
4667
- }
4668
- return response.status(404).send("Not found");
4669
- }
4670
4762
  };
4671
4763
 
4672
4764
  // src/services/product-projection.ts
@@ -4699,19 +4791,6 @@ var ProductTypeService = class extends AbstractService {
4699
4791
  getBasePath() {
4700
4792
  return "product-types";
4701
4793
  }
4702
- extraRoutes(router) {
4703
- router.get("/key=:key", this.getWithKey.bind(this));
4704
- }
4705
- getWithKey(request, response) {
4706
- const resource = this.repository.getWithKey(
4707
- getRepositoryContext(request),
4708
- request.params.key
4709
- );
4710
- if (resource) {
4711
- return response.status(200).send(resource);
4712
- }
4713
- return response.status(404).send("Not found");
4714
- }
4715
4794
  };
4716
4795
 
4717
4796
  // src/services/shipping-method.ts
@@ -4760,19 +4839,6 @@ var StoreService = class extends AbstractService {
4760
4839
  getBasePath() {
4761
4840
  return "stores";
4762
4841
  }
4763
- extraRoutes(router) {
4764
- router.get("/key=:key", this.getWithKey.bind(this));
4765
- }
4766
- getWithKey(request, response) {
4767
- const resource = this.repository.getWithKey(
4768
- getRepositoryContext(request),
4769
- request.params.key
4770
- );
4771
- if (resource) {
4772
- return response.status(200).send(resource);
4773
- }
4774
- return response.status(404).send("Not found");
4775
- }
4776
4842
  };
4777
4843
 
4778
4844
  // src/services/subscription.ts
@@ -4795,19 +4861,6 @@ var TaxCategoryService = class extends AbstractService {
4795
4861
  getBasePath() {
4796
4862
  return "tax-categories";
4797
4863
  }
4798
- extraRoutes(router) {
4799
- router.get("/key=:key", this.getWithKey.bind(this));
4800
- }
4801
- getWithKey(request, response) {
4802
- const resource = this.repository.getWithKey(
4803
- getRepositoryContext(request),
4804
- request.params.key
4805
- );
4806
- if (resource) {
4807
- return response.status(200).send(resource);
4808
- }
4809
- return response.status(404).send("Not found");
4810
- }
4811
4864
  };
4812
4865
 
4813
4866
  // src/services/type.ts
@@ -4892,8 +4945,8 @@ var CommercetoolsMock = class {
4892
4945
  constructor(options = {}) {
4893
4946
  this._nockScopes = { auth: void 0, api: void 0 };
4894
4947
  this.options = { ...DEFAULT_OPTIONS, ...options };
4895
- this._services = {};
4896
- this._repositories = {};
4948
+ this._services = null;
4949
+ this._repositories = null;
4897
4950
  this._projectService = void 0;
4898
4951
  this._storage = new InMemoryStorage();
4899
4952
  this._oauth2 = new OAuth2Server({
@@ -4920,9 +4973,12 @@ var CommercetoolsMock = class {
4920
4973
  if (!projectKey && !this.options.defaultProjectKey) {
4921
4974
  throw new Error("No projectKey passed and no default set");
4922
4975
  }
4976
+ if (this._repositories === null) {
4977
+ throw new Error("repositories not initialized yet");
4978
+ }
4923
4979
  return new ProjectAPI(
4924
4980
  projectKey || this.options.defaultProjectKey,
4925
- this._services,
4981
+ this._repositories,
4926
4982
  this._storage
4927
4983
  );
4928
4984
  }
@@ -4933,6 +4989,7 @@ var CommercetoolsMock = class {
4933
4989
  server.keepAliveTimeout = 60 * 1e3;
4934
4990
  }
4935
4991
  createApp(options) {
4992
+ this._repositories = createRepositories(this._storage);
4936
4993
  const app = (0, import_express6.default)();
4937
4994
  const projectRouter = import_express6.default.Router({ mergeParams: true });
4938
4995
  projectRouter.use(import_express6.default.json());
@@ -4951,12 +5008,11 @@ var CommercetoolsMock = class {
4951
5008
  app.use("/:projectKey", projectRouter);
4952
5009
  app.use("/:projectKey/in-store/key=:storeKey", projectRouter);
4953
5010
  }
4954
- this._repositories = createRepositories(this._storage);
5011
+ this._services = createServices(projectRouter, this._repositories);
4955
5012
  this._projectService = new ProjectService(
4956
5013
  projectRouter,
4957
5014
  this._repositories.project
4958
5015
  );
4959
- this._services = createServices(projectRouter, this._repositories);
4960
5016
  app.use((err, req, resp, next) => {
4961
5017
  if (err instanceof CommercetoolsError) {
4962
5018
  return resp.status(err.statusCode).send({