@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.mjs CHANGED
@@ -4,9 +4,56 @@ import express2 from "express";
4
4
  import supertest from "supertest";
5
5
  import morgan from "morgan";
6
6
 
7
- // src/storage.ts
7
+ // src/storage/abstract.ts
8
+ var AbstractStorage = class {
9
+ };
10
+
11
+ // src/storage/in-memory.ts
8
12
  import assert from "assert";
9
13
 
14
+ // src/exceptions.ts
15
+ var CommercetoolsError = class extends Error {
16
+ constructor(info, statusCode = 400) {
17
+ super(info.message);
18
+ this.info = info;
19
+ this.statusCode = statusCode || 500;
20
+ }
21
+ };
22
+
23
+ // src/helpers.ts
24
+ import { v4 as uuidv4 } from "uuid";
25
+ var getBaseResourceProperties = () => ({
26
+ id: uuidv4(),
27
+ createdAt: new Date().toISOString(),
28
+ lastModifiedAt: new Date().toISOString(),
29
+ version: 0
30
+ });
31
+ var nestedLookup = (obj, path) => {
32
+ if (!path || path === "") {
33
+ return obj;
34
+ }
35
+ const parts = path.split(".");
36
+ let val = obj;
37
+ for (let i = 0; i < parts.length; i++) {
38
+ const part = parts[i];
39
+ if (val == void 0) {
40
+ return void 0;
41
+ }
42
+ val = val[part];
43
+ }
44
+ return val;
45
+ };
46
+ var QueryParamsAsArray = (input) => {
47
+ if (input == void 0) {
48
+ return [];
49
+ }
50
+ if (Array.isArray(input)) {
51
+ return input;
52
+ }
53
+ return [input];
54
+ };
55
+ var cloneObject = (o) => JSON.parse(JSON.stringify(o));
56
+
10
57
  // src/lib/expandParser.ts
11
58
  var parseExpandClause = (clause) => {
12
59
  const result = {
@@ -324,52 +371,7 @@ var generateMatchFunc = (predicate) => {
324
371
  return result;
325
372
  };
326
373
 
327
- // src/exceptions.ts
328
- var CommercetoolsError = class extends Error {
329
- constructor(info, statusCode = 400) {
330
- super(info.message);
331
- this.info = info;
332
- this.statusCode = statusCode || 500;
333
- }
334
- };
335
-
336
- // src/helpers.ts
337
- import { v4 as uuidv4 } from "uuid";
338
- var getBaseResourceProperties = () => ({
339
- id: uuidv4(),
340
- createdAt: new Date().toISOString(),
341
- lastModifiedAt: new Date().toISOString(),
342
- version: 0
343
- });
344
- var nestedLookup = (obj, path) => {
345
- if (!path || path === "") {
346
- return obj;
347
- }
348
- const parts = path.split(".");
349
- let val = obj;
350
- for (let i = 0; i < parts.length; i++) {
351
- const part = parts[i];
352
- if (val == void 0) {
353
- return void 0;
354
- }
355
- val = val[part];
356
- }
357
- return val;
358
- };
359
- var QueryParamsAsArray = (input) => {
360
- if (input == void 0) {
361
- return [];
362
- }
363
- if (Array.isArray(input)) {
364
- return input;
365
- }
366
- return [input];
367
- };
368
- var cloneObject = (o) => JSON.parse(JSON.stringify(o));
369
-
370
- // src/storage.ts
371
- var AbstractStorage = class {
372
- };
374
+ // src/storage/in-memory.ts
373
375
  var InMemoryStorage = class extends AbstractStorage {
374
376
  constructor() {
375
377
  super(...arguments);
@@ -465,13 +467,15 @@ var InMemoryStorage = class extends AbstractStorage {
465
467
  "order-edit": /* @__PURE__ */ new Map(),
466
468
  payment: /* @__PURE__ */ new Map(),
467
469
  product: /* @__PURE__ */ new Map(),
470
+ quote: /* @__PURE__ */ new Map(),
471
+ "quote-request": /* @__PURE__ */ new Map(),
468
472
  "product-discount": /* @__PURE__ */ new Map(),
469
- "product-price": /* @__PURE__ */ new Map(),
470
473
  "product-selection": /* @__PURE__ */ new Map(),
471
474
  "product-type": /* @__PURE__ */ new Map(),
472
475
  "product-projection": /* @__PURE__ */ new Map(),
473
476
  review: /* @__PURE__ */ new Map(),
474
477
  "shipping-method": /* @__PURE__ */ new Map(),
478
+ "staged-quote": /* @__PURE__ */ new Map(),
475
479
  state: /* @__PURE__ */ new Map(),
476
480
  store: /* @__PURE__ */ new Map(),
477
481
  "shopping-list": /* @__PURE__ */ new Map(),
@@ -543,7 +547,7 @@ var InMemoryStorage = class extends AbstractStorage {
543
547
  if (!store) {
544
548
  throw new Error("No type");
545
549
  }
546
- let resources = Array.from(store.values());
550
+ let resources = this.all(projectKey, typeId);
547
551
  if (params.where) {
548
552
  try {
549
553
  const filterFunc = parseQueryExpression(params.where);
@@ -617,7 +621,7 @@ var InMemoryStorage = class extends AbstractStorage {
617
621
  console.error(
618
622
  `No resource found with typeId=${identifier.typeId}, id=${identifier.id}`
619
623
  );
620
- return void 0;
624
+ return null;
621
625
  }
622
626
  if (identifier.key) {
623
627
  const store = this.forProjectKey(projectKey)[identifier.typeId];
@@ -634,7 +638,7 @@ var InMemoryStorage = class extends AbstractStorage {
634
638
  );
635
639
  }
636
640
  }
637
- return void 0;
641
+ return null;
638
642
  }
639
643
  _resolveReference(projectKey, reference, expand) {
640
644
  if (reference === void 0)
@@ -801,14 +805,14 @@ var OAuth2Server = class {
801
805
 
802
806
  // src/projectAPI.ts
803
807
  var ProjectAPI = class {
804
- constructor(projectKey, services, storage) {
808
+ constructor(projectKey, repositories, storage) {
805
809
  this.projectKey = projectKey;
806
810
  this._storage = storage;
807
- this._services = services;
811
+ this._repositories = repositories;
808
812
  }
809
813
  add(typeId, resource) {
810
- const service = this._services[typeId];
811
- if (service) {
814
+ const repository = this._repositories[typeId];
815
+ if (repository) {
812
816
  this._storage.add(this.projectKey, typeId, {
813
817
  ...getBaseResourceProperties(),
814
818
  ...resource
@@ -826,9 +830,9 @@ var ProjectAPI = class {
826
830
  );
827
831
  }
828
832
  getRepository(typeId) {
829
- const service = this._services[typeId];
830
- if (service !== void 0) {
831
- return service.repository;
833
+ const repository = this._repositories[typeId];
834
+ if (repository !== void 0) {
835
+ return repository;
832
836
  }
833
837
  throw new Error("No such repository");
834
838
  }
@@ -1064,14 +1068,14 @@ var AbstractRepository = class {
1064
1068
  }
1065
1069
  return result;
1066
1070
  }
1067
- postProcessResource(resource) {
1068
- return resource;
1069
- }
1070
1071
  };
1071
1072
  var AbstractResourceRepository = class extends AbstractRepository {
1072
1073
  constructor(storage) {
1073
1074
  super(storage);
1074
1075
  }
1076
+ postProcessResource(resource) {
1077
+ return resource;
1078
+ }
1075
1079
  query(context, params = {}) {
1076
1080
  const result = this._storage.query(context.projectKey, this.getTypeId(), {
1077
1081
  expand: params.expand,
@@ -1218,11 +1222,13 @@ var CartRepository = class extends AbstractResourceRepository {
1218
1222
  id: uuidv43(),
1219
1223
  productId: product.id,
1220
1224
  productKey: product.key,
1221
- name: product.masterData.current.name,
1222
1225
  productSlug: product.masterData.current.slug,
1223
1226
  productType: product.productType,
1227
+ name: product.masterData.current.name,
1224
1228
  variant,
1225
1229
  price,
1230
+ taxedPricePortions: [],
1231
+ perMethodTaxRate: [],
1226
1232
  totalPrice: {
1227
1233
  ...price.value,
1228
1234
  centAmount: price.value.centAmount * quantity
@@ -1369,15 +1375,17 @@ var CartRepository = class extends AbstractResourceRepository {
1369
1375
  id: uuidv43(),
1370
1376
  productId: product.id,
1371
1377
  productKey: product.key,
1372
- name: product.masterData.current.name,
1373
1378
  productSlug: product.masterData.current.slug,
1374
1379
  productType: product.productType,
1380
+ name: product.masterData.current.name,
1375
1381
  variant,
1376
1382
  price,
1377
1383
  totalPrice: {
1378
1384
  ...price.value,
1379
1385
  centAmount: price.value.centAmount * quant
1380
1386
  },
1387
+ taxedPricePortions: [],
1388
+ perMethodTaxRate: [],
1381
1389
  quantity: quant,
1382
1390
  discountedPricePerQuantity: [],
1383
1391
  lineItemMode: "Standard",
@@ -1402,21 +1410,23 @@ var CartRepository = class extends AbstractResourceRepository {
1402
1410
  const resource = {
1403
1411
  ...getBaseResourceProperties(),
1404
1412
  cartState: "Active",
1405
- lineItems,
1413
+ country: draft.country,
1406
1414
  customLineItems: [],
1415
+ lineItems,
1416
+ locale: draft.locale,
1417
+ taxCalculationMode: draft.taxCalculationMode ?? "LineItemLevel",
1418
+ taxMode: draft.taxMode ?? "Platform",
1419
+ taxRoundingMode: draft.taxRoundingMode ?? "HalfEven",
1407
1420
  totalPrice: {
1408
1421
  type: "centPrecision",
1409
1422
  centAmount: 0,
1410
1423
  currencyCode: draft.currency,
1411
1424
  fractionDigits: 0
1412
1425
  },
1413
- taxMode: draft.taxMode ?? "Platform",
1414
- taxRoundingMode: draft.taxRoundingMode ?? "HalfEven",
1415
- taxCalculationMode: draft.taxCalculationMode ?? "LineItemLevel",
1416
- refusedGifts: [],
1417
- locale: draft.locale,
1418
- country: draft.country,
1426
+ shippingMode: "Single",
1427
+ shipping: [],
1419
1428
  origin: draft.origin ?? "Customer",
1429
+ refusedGifts: [],
1420
1430
  custom: createCustomFields(
1421
1431
  draft.custom,
1422
1432
  context.projectKey,
@@ -1770,10 +1780,7 @@ var CustomObjectRepository = class extends AbstractResourceRepository {
1770
1780
  }
1771
1781
  }
1772
1782
  getWithContainerAndKey(context, container, key) {
1773
- const items = this._storage.all(
1774
- context.projectKey,
1775
- this.getTypeId()
1776
- );
1783
+ const items = this._storage.all(context.projectKey, this.getTypeId());
1777
1784
  return items.find(
1778
1785
  (item) => item.container === container && item.key === key
1779
1786
  );
@@ -1880,7 +1887,7 @@ var CustomerGroupRepository = class extends AbstractResourceRepository {
1880
1887
  };
1881
1888
  }
1882
1889
  getTypeId() {
1883
- return "customer";
1890
+ return "customer-group";
1884
1891
  }
1885
1892
  create(context, draft) {
1886
1893
  const resource = {
@@ -1965,7 +1972,7 @@ var DiscountCodeRepository = class extends AbstractResourceRepository {
1965
1972
  };
1966
1973
  }
1967
1974
  getTypeId() {
1968
- return "cart-discount";
1975
+ return "discount-code";
1969
1976
  }
1970
1977
  create(context, draft) {
1971
1978
  const resource = {
@@ -2276,6 +2283,8 @@ var OrderRepository = class extends AbstractResourceRepository {
2276
2283
  refusedGifts: [],
2277
2284
  origin: "Customer",
2278
2285
  syncInfo: [],
2286
+ shippingMode: cart.shippingMode,
2287
+ shipping: cart.shipping,
2279
2288
  store: context.storeKey ? {
2280
2289
  key: context.storeKey,
2281
2290
  typeId: "store"
@@ -2304,6 +2313,8 @@ var OrderRepository = class extends AbstractResourceRepository {
2304
2313
  origin: draft.origin || "Customer",
2305
2314
  paymentState: draft.paymentState,
2306
2315
  refusedGifts: [],
2316
+ shippingMode: "Single",
2317
+ shipping: [],
2307
2318
  store: resolveStoreReference(
2308
2319
  draft.store,
2309
2320
  context.projectKey,
@@ -2375,6 +2386,8 @@ var OrderRepository = class extends AbstractResourceRepository {
2375
2386
  quantity: draft.quantity,
2376
2387
  state: draft.state || [],
2377
2388
  taxRate: draft.taxRate,
2389
+ taxedPricePortions: [],
2390
+ perMethodTaxRate: [],
2378
2391
  totalPrice: createTypedMoney(draft.price.value),
2379
2392
  variant: {
2380
2393
  id: variant.id,
@@ -2396,6 +2409,7 @@ var OrderRepository = class extends AbstractResourceRepository {
2396
2409
  money: createTypedMoney(draft.money),
2397
2410
  name: draft.name,
2398
2411
  quantity: draft.quantity,
2412
+ priceMode: draft.priceMode,
2399
2413
  slug: draft.slug,
2400
2414
  state: [],
2401
2415
  totalPrice: createTypedMoney(draft.money)
@@ -2429,6 +2443,29 @@ var MyOrderRepository = class extends OrderRepository {
2429
2443
  }
2430
2444
  };
2431
2445
 
2446
+ // src/repositories/order-edit.ts
2447
+ var OrderEditRepository = class extends AbstractResourceRepository {
2448
+ constructor() {
2449
+ super(...arguments);
2450
+ this.actions = {};
2451
+ }
2452
+ getTypeId() {
2453
+ return "order-edit";
2454
+ }
2455
+ create(context, draft) {
2456
+ const resource = {
2457
+ ...getBaseResourceProperties(),
2458
+ stagedActions: draft.stagedActions ?? [],
2459
+ resource: draft.resource,
2460
+ result: {
2461
+ type: "NotProcessed"
2462
+ }
2463
+ };
2464
+ this.saveNew(context, resource);
2465
+ return resource;
2466
+ }
2467
+ };
2468
+
2432
2469
  // src/repositories/payment.ts
2433
2470
  import { v4 as uuidv45 } from "uuid";
2434
2471
  var PaymentRepository = class extends AbstractResourceRepository {
@@ -2588,7 +2625,7 @@ var ProductRepository = class extends AbstractResourceRepository {
2588
2625
  checkForStagedChanges(resource);
2589
2626
  return resource;
2590
2627
  },
2591
- "setDescription": (context, resource, { description, staged }) => {
2628
+ setDescription: (context, resource, { description, staged }) => {
2592
2629
  const onlyStaged = staged !== void 0 ? staged : true;
2593
2630
  resource.masterData.staged.description = description;
2594
2631
  if (!onlyStaged) {
@@ -2597,7 +2634,7 @@ var ProductRepository = class extends AbstractResourceRepository {
2597
2634
  checkForStagedChanges(resource);
2598
2635
  return resource;
2599
2636
  },
2600
- "setKey": (context, resource, { key }) => {
2637
+ setKey: (context, resource, { key }) => {
2601
2638
  resource.key = key;
2602
2639
  return resource;
2603
2640
  }
@@ -2783,18 +2820,6 @@ var ProductDiscountRepository = class extends AbstractResourceRepository {
2783
2820
  }
2784
2821
  }
2785
2822
  }
2786
- getWithKey(context, key) {
2787
- const result = this._storage.query(context.projectKey, this.getTypeId(), {
2788
- where: [`key="${key}"`]
2789
- });
2790
- if (result.count === 1) {
2791
- return result.results[0];
2792
- }
2793
- if (result.count > 1) {
2794
- throw new Error("Duplicate product discount key");
2795
- }
2796
- return;
2797
- }
2798
2823
  };
2799
2824
 
2800
2825
  // src/lib/projectionSearchFilter.ts
@@ -3042,7 +3067,7 @@ var ProductProjectionSearch = class {
3042
3067
  this._storage = storage;
3043
3068
  }
3044
3069
  search(projectKey, params) {
3045
- let resources = this._storage.all(projectKey, "product").map((r) => this.transform(r, params.staged ?? false)).filter((p) => p !== null).filter((p) => {
3070
+ let resources = this._storage.all(projectKey, "product").map((r) => this.transform(r, params.staged ?? false)).filter((p) => {
3046
3071
  if (!params.staged) {
3047
3072
  return p.published;
3048
3073
  }
@@ -3109,8 +3134,6 @@ var ProductProjectionSearch = class {
3109
3134
  }
3110
3135
  transform(product, staged) {
3111
3136
  const obj = !staged ? product.masterData.current : product.masterData.staged;
3112
- if (!obj)
3113
- return null;
3114
3137
  return {
3115
3138
  id: product.id,
3116
3139
  createdAt: product.createdAt,
@@ -3282,12 +3305,18 @@ var ProductProjectionRepository = class extends AbstractResourceRepository {
3282
3305
  throw new Error("No valid action");
3283
3306
  }
3284
3307
  query(context, params = {}) {
3285
- return this._storage.query(context.projectKey, "product", {
3308
+ const response = this._storage.query(context.projectKey, "product", {
3286
3309
  expand: params.expand,
3287
3310
  where: params.where,
3288
3311
  offset: params.offset,
3289
3312
  limit: params.limit
3290
3313
  });
3314
+ return {
3315
+ ...response,
3316
+ results: response.results.map(
3317
+ (r) => this._searchService.transform(r, false)
3318
+ )
3319
+ };
3291
3320
  }
3292
3321
  search(context, query) {
3293
3322
  const results = this._searchService.search(context.projectKey, {
@@ -3303,6 +3332,27 @@ var ProductProjectionRepository = class extends AbstractResourceRepository {
3303
3332
  }
3304
3333
  };
3305
3334
 
3335
+ // src/repositories/product-selection.ts
3336
+ var ProductSelectionRepository = class extends AbstractResourceRepository {
3337
+ constructor() {
3338
+ super(...arguments);
3339
+ this.actions = {};
3340
+ }
3341
+ getTypeId() {
3342
+ return "product-selection";
3343
+ }
3344
+ create(context, draft) {
3345
+ const resource = {
3346
+ ...getBaseResourceProperties(),
3347
+ productCount: 0,
3348
+ name: draft.name,
3349
+ type: "individual"
3350
+ };
3351
+ this.saveNew(context, resource);
3352
+ return resource;
3353
+ }
3354
+ };
3355
+
3306
3356
  // src/repositories/product-type.ts
3307
3357
  var ProductTypeRepository = class extends AbstractResourceRepository {
3308
3358
  constructor() {
@@ -3354,20 +3404,20 @@ var ProductTypeRepository = class extends AbstractResourceRepository {
3354
3404
  this.attributeDefinitionFromAttributeDefinitionDraft(context, attribute)
3355
3405
  );
3356
3406
  },
3357
- changeAttributeOrder: (context, resource, { attributes }) => {
3407
+ changeAttributeOrderByName: (context, resource, { attributeNames }) => {
3358
3408
  var _a;
3359
3409
  const attrs = new Map(
3360
3410
  (_a = resource.attributes) == null ? void 0 : _a.map((item) => [item.name, item])
3361
3411
  );
3362
3412
  const result = [];
3363
3413
  let current = resource.attributes;
3364
- attributes.forEach((iAttr) => {
3365
- const attr = attrs.get(iAttr.name);
3414
+ attributeNames.forEach((attrName) => {
3415
+ const attr = attrs.get(attrName);
3366
3416
  if (attr === void 0) {
3367
3417
  throw new Error("New attr");
3368
3418
  }
3369
3419
  result.push(attr);
3370
- current = current == null ? void 0 : current.filter((f) => f.name !== iAttr.name);
3420
+ current = current == null ? void 0 : current.filter((f) => f.name !== attrName);
3371
3421
  });
3372
3422
  resource.attributes = result;
3373
3423
  if (current) {
@@ -3415,18 +3465,6 @@ var ProductTypeRepository = class extends AbstractResourceRepository {
3415
3465
  this.saveNew(context, resource);
3416
3466
  return resource;
3417
3467
  }
3418
- getWithKey(context, key) {
3419
- const result = this._storage.query(context.projectKey, this.getTypeId(), {
3420
- where: [`key="${key}"`]
3421
- });
3422
- if (result.count === 1) {
3423
- return result.results[0];
3424
- }
3425
- if (result.count > 1) {
3426
- throw new Error("Duplicate product type key");
3427
- }
3428
- return;
3429
- }
3430
3468
  };
3431
3469
 
3432
3470
  // src/repositories/project.ts
@@ -3446,8 +3484,8 @@ var ProjectRepository = class extends AbstractRepository {
3446
3484
  changeLanguages: (context, resource, { languages }) => {
3447
3485
  resource.languages = languages;
3448
3486
  },
3449
- changeMessagesEnabled: (context, resource, { messagesEnabled }) => {
3450
- resource.messages.enabled = messagesEnabled;
3487
+ changeMessagesConfiguration: (context, resource, { messagesConfiguration }) => {
3488
+ resource.messages.enabled = messagesConfiguration.enabled;
3451
3489
  },
3452
3490
  changeProductSearchIndexingEnabled: (context, resource, { enabled }) => {
3453
3491
  var _a;
@@ -3503,6 +3541,53 @@ var ProjectRepository = class extends AbstractRepository {
3503
3541
  }
3504
3542
  };
3505
3543
 
3544
+ // src/repositories/quote.ts
3545
+ var QuoteRepository = class extends AbstractResourceRepository {
3546
+ constructor() {
3547
+ super(...arguments);
3548
+ this.actions = {};
3549
+ }
3550
+ getTypeId() {
3551
+ return "quote";
3552
+ }
3553
+ create(context, draft) {
3554
+ throw new Error("not implemented");
3555
+ }
3556
+ };
3557
+
3558
+ // src/repositories/quote-request.ts
3559
+ var QuoteRequestRepository = class extends AbstractResourceRepository {
3560
+ constructor() {
3561
+ super(...arguments);
3562
+ this.actions = {};
3563
+ }
3564
+ getTypeId() {
3565
+ return "quote-request";
3566
+ }
3567
+ create(context, draft) {
3568
+ throw new Error("not implemented");
3569
+ }
3570
+ };
3571
+
3572
+ // src/repositories/review.ts
3573
+ var ReviewRepository = class extends AbstractResourceRepository {
3574
+ constructor() {
3575
+ super(...arguments);
3576
+ this.actions = {};
3577
+ }
3578
+ getTypeId() {
3579
+ return "review";
3580
+ }
3581
+ create(context, draft) {
3582
+ const resource = {
3583
+ ...getBaseResourceProperties(),
3584
+ includedInStatistics: false
3585
+ };
3586
+ this.saveNew(context, resource);
3587
+ return resource;
3588
+ }
3589
+ };
3590
+
3506
3591
  // src/repositories/shipping-method.ts
3507
3592
  import deepEqual3 from "deep-equal";
3508
3593
  var ShippingMethodRepository = class extends AbstractResourceRepository {
@@ -3677,6 +3762,41 @@ var ShoppingListRepository = class extends AbstractResourceRepository {
3677
3762
  }
3678
3763
  };
3679
3764
 
3765
+ // src/repositories/staged-quote.ts
3766
+ var StagedQuoteRepository = class extends AbstractResourceRepository {
3767
+ constructor() {
3768
+ super(...arguments);
3769
+ this.actions = {};
3770
+ }
3771
+ getTypeId() {
3772
+ return "staged-quote";
3773
+ }
3774
+ create(context, draft) {
3775
+ throw new Error("not implemented");
3776
+ }
3777
+ };
3778
+
3779
+ // src/repositories/standalone-price.ts
3780
+ var StandAlonePriceRepository = class extends AbstractResourceRepository {
3781
+ constructor() {
3782
+ super(...arguments);
3783
+ this.actions = {};
3784
+ }
3785
+ getTypeId() {
3786
+ return "standalone-price";
3787
+ }
3788
+ create(context, draft) {
3789
+ const resource = {
3790
+ ...getBaseResourceProperties(),
3791
+ active: draft.active,
3792
+ sku: draft.sku,
3793
+ value: draft.value
3794
+ };
3795
+ this.saveNew(context, resource);
3796
+ return resource;
3797
+ }
3798
+ };
3799
+
3680
3800
  // src/repositories/state.ts
3681
3801
  var StateRepository = class extends AbstractResourceRepository {
3682
3802
  constructor() {
@@ -3797,18 +3917,6 @@ var StoreRepository = class extends AbstractResourceRepository {
3797
3917
  )
3798
3918
  );
3799
3919
  }
3800
- getWithKey(context, key) {
3801
- const result = this._storage.query(context.projectKey, this.getTypeId(), {
3802
- where: [`key="${key}"`]
3803
- });
3804
- if (result.count === 1) {
3805
- return result.results[0];
3806
- }
3807
- if (result.count > 1) {
3808
- throw new Error("Duplicate store key");
3809
- }
3810
- return;
3811
- }
3812
3920
  };
3813
3921
 
3814
3922
  // src/repositories/subscription.ts
@@ -3908,18 +4016,6 @@ var TaxCategoryRepository = class extends AbstractResourceRepository {
3908
4016
  this.saveNew(context, resource);
3909
4017
  return resource;
3910
4018
  }
3911
- getWithKey(context, key) {
3912
- const result = this._storage.query(context.projectKey, this.getTypeId(), {
3913
- where: [`key="${key}"`]
3914
- });
3915
- if (result.count === 1) {
3916
- return result.results[0];
3917
- }
3918
- if (result.count > 1) {
3919
- throw new Error("Duplicate tax category key");
3920
- }
3921
- return;
3922
- }
3923
4019
  };
3924
4020
 
3925
4021
  // src/repositories/type.ts
@@ -4078,18 +4174,25 @@ var createRepositories = (storage) => ({
4078
4174
  "inventory-entry": new InventoryEntryRepository(storage),
4079
4175
  "key-value-document": new CustomObjectRepository(storage),
4080
4176
  order: new OrderRepository(storage),
4177
+ "order-edit": new OrderEditRepository(storage),
4081
4178
  payment: new PaymentRepository(storage),
4082
4179
  "my-cart": new CartRepository(storage),
4083
4180
  "my-order": new MyOrderRepository(storage),
4084
4181
  "my-customer": new CustomerRepository(storage),
4085
4182
  "my-payment": new PaymentRepository(storage),
4086
- "shipping-method": new ShippingMethodRepository(storage),
4087
- "product-type": new ProductTypeRepository(storage),
4088
4183
  product: new ProductRepository(storage),
4089
- project: new ProjectRepository(storage),
4184
+ "product-type": new ProductTypeRepository(storage),
4090
4185
  "product-discount": new ProductDiscountRepository(storage),
4091
4186
  "product-projection": new ProductProjectionRepository(storage),
4187
+ "product-selection": new ProductSelectionRepository(storage),
4188
+ project: new ProjectRepository(storage),
4189
+ review: new ReviewRepository(storage),
4190
+ quote: new QuoteRepository(storage),
4191
+ "quote-request": new QuoteRequestRepository(storage),
4192
+ "shipping-method": new ShippingMethodRepository(storage),
4092
4193
  "shopping-list": new ShoppingListRepository(storage),
4194
+ "staged-quote": new StagedQuoteRepository(storage),
4195
+ "standalone-price": new StandAlonePriceRepository(storage),
4093
4196
  state: new StateRepository(storage),
4094
4197
  store: new StoreRepository(storage),
4095
4198
  subscription: new SubscriptionRepository(storage),
@@ -4258,25 +4361,27 @@ var CartService = class extends AbstractService {
4258
4361
  return "carts";
4259
4362
  }
4260
4363
  extraRoutes(parent) {
4261
- parent.post("/replicate", (request, response) => {
4262
- const context = getRepositoryContext(request);
4263
- const cartOrOrder = request.body.reference.typeId === "order" ? this.orderRepository.get(context, request.body.reference.id) : this.repository.get(context, request.body.reference.id);
4264
- if (!cartOrOrder) {
4265
- return response.status(400).send();
4266
- }
4267
- const cartDraft = {
4268
- ...cartOrOrder,
4269
- currency: cartOrOrder.totalPrice.currencyCode,
4270
- discountCodes: [],
4271
- lineItems: cartOrOrder.lineItems.map((lineItem) => ({
4272
- ...lineItem,
4273
- variantId: lineItem.variant.id,
4274
- sku: lineItem.variant.sku
4275
- }))
4276
- };
4277
- const newCart = this.repository.create(context, cartDraft);
4278
- return response.status(200).send(newCart);
4279
- });
4364
+ parent.post("/replicate", this.replicate.bind(this));
4365
+ }
4366
+ replicate(request, response) {
4367
+ const context = getRepositoryContext(request);
4368
+ const cartOrOrder = request.body.reference.typeId === "order" ? this.orderRepository.get(context, request.body.reference.id) : this.repository.get(context, request.body.reference.id);
4369
+ if (!cartOrOrder) {
4370
+ return response.status(400).send();
4371
+ }
4372
+ const cartDraft = {
4373
+ ...cartOrOrder,
4374
+ currency: cartOrOrder.totalPrice.currencyCode,
4375
+ discountCodes: [],
4376
+ shipping: [],
4377
+ lineItems: cartOrOrder.lineItems.map((lineItem) => ({
4378
+ ...lineItem,
4379
+ variantId: lineItem.variant.id,
4380
+ sku: lineItem.variant.sku
4381
+ }))
4382
+ };
4383
+ const newCart = this.repository.create(context, cartDraft);
4384
+ return response.status(200).send(newCart);
4280
4385
  }
4281
4386
  };
4282
4387
 
@@ -4621,19 +4726,6 @@ var ProductDiscountService = class extends AbstractService {
4621
4726
  getBasePath() {
4622
4727
  return "product-discounts";
4623
4728
  }
4624
- extraRoutes(router) {
4625
- router.get("/key=:key", this.getWithKey.bind(this));
4626
- }
4627
- getWithKey(request, response) {
4628
- const resource = this.repository.getWithKey(
4629
- getRepositoryContext(request),
4630
- request.params.key
4631
- );
4632
- if (resource) {
4633
- return response.status(200).send(resource);
4634
- }
4635
- return response.status(404).send("Not found");
4636
- }
4637
4729
  };
4638
4730
 
4639
4731
  // src/services/product-projection.ts
@@ -4666,19 +4758,6 @@ var ProductTypeService = class extends AbstractService {
4666
4758
  getBasePath() {
4667
4759
  return "product-types";
4668
4760
  }
4669
- extraRoutes(router) {
4670
- router.get("/key=:key", this.getWithKey.bind(this));
4671
- }
4672
- getWithKey(request, response) {
4673
- const resource = this.repository.getWithKey(
4674
- getRepositoryContext(request),
4675
- request.params.key
4676
- );
4677
- if (resource) {
4678
- return response.status(200).send(resource);
4679
- }
4680
- return response.status(404).send("Not found");
4681
- }
4682
4761
  };
4683
4762
 
4684
4763
  // src/services/shipping-method.ts
@@ -4727,19 +4806,6 @@ var StoreService = class extends AbstractService {
4727
4806
  getBasePath() {
4728
4807
  return "stores";
4729
4808
  }
4730
- extraRoutes(router) {
4731
- router.get("/key=:key", this.getWithKey.bind(this));
4732
- }
4733
- getWithKey(request, response) {
4734
- const resource = this.repository.getWithKey(
4735
- getRepositoryContext(request),
4736
- request.params.key
4737
- );
4738
- if (resource) {
4739
- return response.status(200).send(resource);
4740
- }
4741
- return response.status(404).send("Not found");
4742
- }
4743
4809
  };
4744
4810
 
4745
4811
  // src/services/subscription.ts
@@ -4762,19 +4828,6 @@ var TaxCategoryService = class extends AbstractService {
4762
4828
  getBasePath() {
4763
4829
  return "tax-categories";
4764
4830
  }
4765
- extraRoutes(router) {
4766
- router.get("/key=:key", this.getWithKey.bind(this));
4767
- }
4768
- getWithKey(request, response) {
4769
- const resource = this.repository.getWithKey(
4770
- getRepositoryContext(request),
4771
- request.params.key
4772
- );
4773
- if (resource) {
4774
- return response.status(200).send(resource);
4775
- }
4776
- return response.status(404).send("Not found");
4777
- }
4778
4831
  };
4779
4832
 
4780
4833
  // src/services/type.ts
@@ -4859,8 +4912,8 @@ var CommercetoolsMock = class {
4859
4912
  constructor(options = {}) {
4860
4913
  this._nockScopes = { auth: void 0, api: void 0 };
4861
4914
  this.options = { ...DEFAULT_OPTIONS, ...options };
4862
- this._services = {};
4863
- this._repositories = {};
4915
+ this._services = null;
4916
+ this._repositories = null;
4864
4917
  this._projectService = void 0;
4865
4918
  this._storage = new InMemoryStorage();
4866
4919
  this._oauth2 = new OAuth2Server({
@@ -4887,9 +4940,12 @@ var CommercetoolsMock = class {
4887
4940
  if (!projectKey && !this.options.defaultProjectKey) {
4888
4941
  throw new Error("No projectKey passed and no default set");
4889
4942
  }
4943
+ if (this._repositories === null) {
4944
+ throw new Error("repositories not initialized yet");
4945
+ }
4890
4946
  return new ProjectAPI(
4891
4947
  projectKey || this.options.defaultProjectKey,
4892
- this._services,
4948
+ this._repositories,
4893
4949
  this._storage
4894
4950
  );
4895
4951
  }
@@ -4900,6 +4956,7 @@ var CommercetoolsMock = class {
4900
4956
  server.keepAliveTimeout = 60 * 1e3;
4901
4957
  }
4902
4958
  createApp(options) {
4959
+ this._repositories = createRepositories(this._storage);
4903
4960
  const app = express2();
4904
4961
  const projectRouter = express2.Router({ mergeParams: true });
4905
4962
  projectRouter.use(express2.json());
@@ -4918,12 +4975,11 @@ var CommercetoolsMock = class {
4918
4975
  app.use("/:projectKey", projectRouter);
4919
4976
  app.use("/:projectKey/in-store/key=:storeKey", projectRouter);
4920
4977
  }
4921
- this._repositories = createRepositories(this._storage);
4978
+ this._services = createServices(projectRouter, this._repositories);
4922
4979
  this._projectService = new ProjectService(
4923
4980
  projectRouter,
4924
4981
  this._repositories.project
4925
4982
  );
4926
- this._services = createServices(projectRouter, this._repositories);
4927
4983
  app.use((err, req, resp, next) => {
4928
4984
  if (err instanceof CommercetoolsError) {
4929
4985
  return resp.status(err.statusCode).send({