@labdigital/commercetools-mock 0.10.0 → 0.11.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 (96) hide show
  1. package/dist/index.d.ts +353 -188
  2. package/dist/index.global.js +1007 -876
  3. package/dist/index.global.js.map +1 -1
  4. package/dist/index.js +348 -217
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.mjs +348 -217
  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 +117 -10
  40. package/src/repositories/project.ts +9 -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 +15 -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 +63 -2
  83. package/src/services/product.ts +1 -1
  84. package/src/services/project.ts +4 -5
  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
  }
@@ -1031,13 +1035,13 @@ var ProjectService = class {
1031
1035
  if (!project) {
1032
1036
  return response.status(404).send({});
1033
1037
  }
1034
- this.repository.processUpdateActions(
1038
+ const updatedResource = this.repository.processUpdateActions(
1035
1039
  getRepositoryContext(request),
1036
1040
  project,
1037
1041
  updateRequest.version,
1038
1042
  updateRequest.actions
1039
1043
  );
1040
- return response.status(200).send({});
1044
+ return response.status(200).send(updatedResource);
1041
1045
  }
1042
1046
  };
1043
1047
 
@@ -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,9 +2667,80 @@ 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;
2673
+ },
2674
+ addExternalImage: (context, resource, { variantId, sku, image, staged }) => {
2675
+ const addImg = (data) => {
2676
+ const { variant, isMasterVariant, variantIndex } = getVariant(
2677
+ data,
2678
+ variantId,
2679
+ sku
2680
+ );
2681
+ if (!variant) {
2682
+ throw new Error(
2683
+ `Variant with id ${variantId} or sku ${sku} not found on product ${resource.id}`
2684
+ );
2685
+ }
2686
+ if (!variant.images) {
2687
+ variant.images = [];
2688
+ } else {
2689
+ const existingImage = variant.images.find((x) => x.url === image.url);
2690
+ if (existingImage) {
2691
+ throw new Error(
2692
+ `Cannot add image '${image.url}' because product '${resource.id}' already has that image.`
2693
+ );
2694
+ }
2695
+ }
2696
+ variant.images.push(image);
2697
+ if (isMasterVariant) {
2698
+ data.masterVariant = variant;
2699
+ } else {
2700
+ data.variants[variantIndex] = variant;
2701
+ }
2702
+ };
2703
+ const onlyStaged = staged !== void 0 ? staged : true;
2704
+ addImg(resource.masterData.staged);
2705
+ if (!onlyStaged) {
2706
+ addImg(resource.masterData.current);
2707
+ }
2708
+ checkForStagedChanges(resource);
2709
+ return resource;
2710
+ },
2711
+ removeImage: (context, resource, { variantId, sku, imageUrl, staged }) => {
2712
+ const removeImg = (data) => {
2713
+ const { variant, isMasterVariant, variantIndex } = getVariant(
2714
+ data,
2715
+ variantId,
2716
+ sku
2717
+ );
2718
+ if (!variant) {
2719
+ throw new Error(
2720
+ `Variant with id ${variantId} or sku ${sku} not found on product ${resource.id}`
2721
+ );
2722
+ }
2723
+ const variantImages = variant.images ?? [];
2724
+ const existingImage = variantImages.find((x) => x.url === imageUrl);
2725
+ if (!existingImage) {
2726
+ throw new Error(
2727
+ `Cannot remove image '${imageUrl}' because product '${resource.id}' does not have that image.`
2728
+ );
2729
+ }
2730
+ variant.images = variantImages.filter((image) => image.url !== imageUrl);
2731
+ if (isMasterVariant) {
2732
+ data.masterVariant = variant;
2733
+ } else {
2734
+ data.variants[variantIndex] = variant;
2735
+ }
2736
+ };
2737
+ const onlyStaged = staged !== void 0 ? staged : true;
2738
+ removeImg(resource.masterData.staged);
2739
+ if (!onlyStaged) {
2740
+ removeImg(resource.masterData.current);
2741
+ }
2742
+ checkForStagedChanges(resource);
2743
+ return resource;
2636
2744
  }
2637
2745
  };
2638
2746
  }
@@ -2816,18 +2924,6 @@ var ProductDiscountRepository = class extends AbstractResourceRepository {
2816
2924
  }
2817
2925
  }
2818
2926
  }
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
2927
  };
2832
2928
 
2833
2929
  // src/lib/projectionSearchFilter.ts
@@ -3075,7 +3171,7 @@ var ProductProjectionSearch = class {
3075
3171
  this._storage = storage;
3076
3172
  }
3077
3173
  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) => {
3174
+ let resources = this._storage.all(projectKey, "product").map((r) => this.transform(r, params.staged ?? false)).filter((p) => {
3079
3175
  if (!params.staged) {
3080
3176
  return p.published;
3081
3177
  }
@@ -3142,8 +3238,6 @@ var ProductProjectionSearch = class {
3142
3238
  }
3143
3239
  transform(product, staged) {
3144
3240
  const obj = !staged ? product.masterData.current : product.masterData.staged;
3145
- if (!obj)
3146
- return null;
3147
3241
  return {
3148
3242
  id: product.id,
3149
3243
  createdAt: product.createdAt,
@@ -3315,12 +3409,18 @@ var ProductProjectionRepository = class extends AbstractResourceRepository {
3315
3409
  throw new Error("No valid action");
3316
3410
  }
3317
3411
  query(context, params = {}) {
3318
- return this._storage.query(context.projectKey, "product", {
3412
+ const response = this._storage.query(context.projectKey, "product", {
3319
3413
  expand: params.expand,
3320
3414
  where: params.where,
3321
3415
  offset: params.offset,
3322
3416
  limit: params.limit
3323
3417
  });
3418
+ return {
3419
+ ...response,
3420
+ results: response.results.map(
3421
+ (r) => this._searchService.transform(r, false)
3422
+ )
3423
+ };
3324
3424
  }
3325
3425
  search(context, query) {
3326
3426
  const results = this._searchService.search(context.projectKey, {
@@ -3336,6 +3436,27 @@ var ProductProjectionRepository = class extends AbstractResourceRepository {
3336
3436
  }
3337
3437
  };
3338
3438
 
3439
+ // src/repositories/product-selection.ts
3440
+ var ProductSelectionRepository = class extends AbstractResourceRepository {
3441
+ constructor() {
3442
+ super(...arguments);
3443
+ this.actions = {};
3444
+ }
3445
+ getTypeId() {
3446
+ return "product-selection";
3447
+ }
3448
+ create(context, draft) {
3449
+ const resource = {
3450
+ ...getBaseResourceProperties(),
3451
+ productCount: 0,
3452
+ name: draft.name,
3453
+ type: "individual"
3454
+ };
3455
+ this.saveNew(context, resource);
3456
+ return resource;
3457
+ }
3458
+ };
3459
+
3339
3460
  // src/repositories/product-type.ts
3340
3461
  var ProductTypeRepository = class extends AbstractResourceRepository {
3341
3462
  constructor() {
@@ -3387,20 +3508,20 @@ var ProductTypeRepository = class extends AbstractResourceRepository {
3387
3508
  this.attributeDefinitionFromAttributeDefinitionDraft(context, attribute)
3388
3509
  );
3389
3510
  },
3390
- changeAttributeOrder: (context, resource, { attributes }) => {
3511
+ changeAttributeOrderByName: (context, resource, { attributeNames }) => {
3391
3512
  var _a;
3392
3513
  const attrs = new Map(
3393
3514
  (_a = resource.attributes) == null ? void 0 : _a.map((item) => [item.name, item])
3394
3515
  );
3395
3516
  const result = [];
3396
3517
  let current = resource.attributes;
3397
- attributes.forEach((iAttr) => {
3398
- const attr = attrs.get(iAttr.name);
3518
+ attributeNames.forEach((attrName) => {
3519
+ const attr = attrs.get(attrName);
3399
3520
  if (attr === void 0) {
3400
3521
  throw new Error("New attr");
3401
3522
  }
3402
3523
  result.push(attr);
3403
- current = current == null ? void 0 : current.filter((f) => f.name !== iAttr.name);
3524
+ current = current == null ? void 0 : current.filter((f) => f.name !== attrName);
3404
3525
  });
3405
3526
  resource.attributes = result;
3406
3527
  if (current) {
@@ -3448,18 +3569,6 @@ var ProductTypeRepository = class extends AbstractResourceRepository {
3448
3569
  this.saveNew(context, resource);
3449
3570
  return resource;
3450
3571
  }
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
3572
  };
3464
3573
 
3465
3574
  // src/repositories/project.ts
@@ -3479,8 +3588,9 @@ var ProjectRepository = class extends AbstractRepository {
3479
3588
  changeLanguages: (context, resource, { languages }) => {
3480
3589
  resource.languages = languages;
3481
3590
  },
3482
- changeMessagesEnabled: (context, resource, { messagesEnabled }) => {
3483
- resource.messages.enabled = messagesEnabled;
3591
+ changeMessagesConfiguration: (context, resource, { messagesConfiguration }) => {
3592
+ resource.messages.enabled = messagesConfiguration.enabled;
3593
+ resource.messages.deleteDaysAfterCreation = messagesConfiguration.deleteDaysAfterCreation;
3484
3594
  },
3485
3595
  changeProductSearchIndexingEnabled: (context, resource, { enabled }) => {
3486
3596
  var _a;
@@ -3536,6 +3646,53 @@ var ProjectRepository = class extends AbstractRepository {
3536
3646
  }
3537
3647
  };
3538
3648
 
3649
+ // src/repositories/quote.ts
3650
+ var QuoteRepository = class extends AbstractResourceRepository {
3651
+ constructor() {
3652
+ super(...arguments);
3653
+ this.actions = {};
3654
+ }
3655
+ getTypeId() {
3656
+ return "quote";
3657
+ }
3658
+ create(context, draft) {
3659
+ throw new Error("not implemented");
3660
+ }
3661
+ };
3662
+
3663
+ // src/repositories/quote-request.ts
3664
+ var QuoteRequestRepository = class extends AbstractResourceRepository {
3665
+ constructor() {
3666
+ super(...arguments);
3667
+ this.actions = {};
3668
+ }
3669
+ getTypeId() {
3670
+ return "quote-request";
3671
+ }
3672
+ create(context, draft) {
3673
+ throw new Error("not implemented");
3674
+ }
3675
+ };
3676
+
3677
+ // src/repositories/review.ts
3678
+ var ReviewRepository = class extends AbstractResourceRepository {
3679
+ constructor() {
3680
+ super(...arguments);
3681
+ this.actions = {};
3682
+ }
3683
+ getTypeId() {
3684
+ return "review";
3685
+ }
3686
+ create(context, draft) {
3687
+ const resource = {
3688
+ ...getBaseResourceProperties(),
3689
+ includedInStatistics: false
3690
+ };
3691
+ this.saveNew(context, resource);
3692
+ return resource;
3693
+ }
3694
+ };
3695
+
3539
3696
  // src/repositories/shipping-method.ts
3540
3697
  var import_deep_equal3 = __toESM(require("deep-equal"));
3541
3698
  var ShippingMethodRepository = class extends AbstractResourceRepository {
@@ -3710,6 +3867,41 @@ var ShoppingListRepository = class extends AbstractResourceRepository {
3710
3867
  }
3711
3868
  };
3712
3869
 
3870
+ // src/repositories/staged-quote.ts
3871
+ var StagedQuoteRepository = class extends AbstractResourceRepository {
3872
+ constructor() {
3873
+ super(...arguments);
3874
+ this.actions = {};
3875
+ }
3876
+ getTypeId() {
3877
+ return "staged-quote";
3878
+ }
3879
+ create(context, draft) {
3880
+ throw new Error("not implemented");
3881
+ }
3882
+ };
3883
+
3884
+ // src/repositories/standalone-price.ts
3885
+ var StandAlonePriceRepository = class extends AbstractResourceRepository {
3886
+ constructor() {
3887
+ super(...arguments);
3888
+ this.actions = {};
3889
+ }
3890
+ getTypeId() {
3891
+ return "standalone-price";
3892
+ }
3893
+ create(context, draft) {
3894
+ const resource = {
3895
+ ...getBaseResourceProperties(),
3896
+ active: draft.active,
3897
+ sku: draft.sku,
3898
+ value: draft.value
3899
+ };
3900
+ this.saveNew(context, resource);
3901
+ return resource;
3902
+ }
3903
+ };
3904
+
3713
3905
  // src/repositories/state.ts
3714
3906
  var StateRepository = class extends AbstractResourceRepository {
3715
3907
  constructor() {
@@ -3718,6 +3910,9 @@ var StateRepository = class extends AbstractResourceRepository {
3718
3910
  changeKey: (context, resource, { key }) => {
3719
3911
  resource.key = key;
3720
3912
  },
3913
+ changeInitial: (context, resource, { initial }) => {
3914
+ resource.initial = initial;
3915
+ },
3721
3916
  setDescription: (context, resource, { description }) => {
3722
3917
  resource.description = description;
3723
3918
  },
@@ -3830,18 +4025,6 @@ var StoreRepository = class extends AbstractResourceRepository {
3830
4025
  )
3831
4026
  );
3832
4027
  }
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
4028
  };
3846
4029
 
3847
4030
  // src/repositories/subscription.ts
@@ -3941,18 +4124,6 @@ var TaxCategoryRepository = class extends AbstractResourceRepository {
3941
4124
  this.saveNew(context, resource);
3942
4125
  return resource;
3943
4126
  }
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
4127
  };
3957
4128
 
3958
4129
  // src/repositories/type.ts
@@ -4111,18 +4282,25 @@ var createRepositories = (storage) => ({
4111
4282
  "inventory-entry": new InventoryEntryRepository(storage),
4112
4283
  "key-value-document": new CustomObjectRepository(storage),
4113
4284
  order: new OrderRepository(storage),
4285
+ "order-edit": new OrderEditRepository(storage),
4114
4286
  payment: new PaymentRepository(storage),
4115
4287
  "my-cart": new CartRepository(storage),
4116
4288
  "my-order": new MyOrderRepository(storage),
4117
4289
  "my-customer": new CustomerRepository(storage),
4118
4290
  "my-payment": new PaymentRepository(storage),
4119
- "shipping-method": new ShippingMethodRepository(storage),
4120
- "product-type": new ProductTypeRepository(storage),
4121
4291
  product: new ProductRepository(storage),
4122
- project: new ProjectRepository(storage),
4292
+ "product-type": new ProductTypeRepository(storage),
4123
4293
  "product-discount": new ProductDiscountRepository(storage),
4124
4294
  "product-projection": new ProductProjectionRepository(storage),
4295
+ "product-selection": new ProductSelectionRepository(storage),
4296
+ project: new ProjectRepository(storage),
4297
+ review: new ReviewRepository(storage),
4298
+ quote: new QuoteRepository(storage),
4299
+ "quote-request": new QuoteRequestRepository(storage),
4300
+ "shipping-method": new ShippingMethodRepository(storage),
4125
4301
  "shopping-list": new ShoppingListRepository(storage),
4302
+ "staged-quote": new StagedQuoteRepository(storage),
4303
+ "standalone-price": new StandAlonePriceRepository(storage),
4126
4304
  state: new StateRepository(storage),
4127
4305
  store: new StoreRepository(storage),
4128
4306
  subscription: new SubscriptionRepository(storage),
@@ -4291,25 +4469,27 @@ var CartService = class extends AbstractService {
4291
4469
  return "carts";
4292
4470
  }
4293
4471
  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
- });
4472
+ parent.post("/replicate", this.replicate.bind(this));
4473
+ }
4474
+ replicate(request, response) {
4475
+ const context = getRepositoryContext(request);
4476
+ const cartOrOrder = request.body.reference.typeId === "order" ? this.orderRepository.get(context, request.body.reference.id) : this.repository.get(context, request.body.reference.id);
4477
+ if (!cartOrOrder) {
4478
+ return response.status(400).send();
4479
+ }
4480
+ const cartDraft = {
4481
+ ...cartOrOrder,
4482
+ currency: cartOrOrder.totalPrice.currencyCode,
4483
+ discountCodes: [],
4484
+ shipping: [],
4485
+ lineItems: cartOrOrder.lineItems.map((lineItem) => ({
4486
+ ...lineItem,
4487
+ variantId: lineItem.variant.id,
4488
+ sku: lineItem.variant.sku
4489
+ }))
4490
+ };
4491
+ const newCart = this.repository.create(context, cartDraft);
4492
+ return response.status(200).send(newCart);
4313
4493
  }
4314
4494
  };
4315
4495
 
@@ -4654,19 +4834,6 @@ var ProductDiscountService = class extends AbstractService {
4654
4834
  getBasePath() {
4655
4835
  return "product-discounts";
4656
4836
  }
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
4837
  };
4671
4838
 
4672
4839
  // src/services/product-projection.ts
@@ -4699,19 +4866,6 @@ var ProductTypeService = class extends AbstractService {
4699
4866
  getBasePath() {
4700
4867
  return "product-types";
4701
4868
  }
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
4869
  };
4716
4870
 
4717
4871
  // src/services/shipping-method.ts
@@ -4760,19 +4914,6 @@ var StoreService = class extends AbstractService {
4760
4914
  getBasePath() {
4761
4915
  return "stores";
4762
4916
  }
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
4917
  };
4777
4918
 
4778
4919
  // src/services/subscription.ts
@@ -4795,19 +4936,6 @@ var TaxCategoryService = class extends AbstractService {
4795
4936
  getBasePath() {
4796
4937
  return "tax-categories";
4797
4938
  }
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
4939
  };
4812
4940
 
4813
4941
  // src/services/type.ts
@@ -4892,8 +5020,8 @@ var CommercetoolsMock = class {
4892
5020
  constructor(options = {}) {
4893
5021
  this._nockScopes = { auth: void 0, api: void 0 };
4894
5022
  this.options = { ...DEFAULT_OPTIONS, ...options };
4895
- this._services = {};
4896
- this._repositories = {};
5023
+ this._services = null;
5024
+ this._repositories = null;
4897
5025
  this._projectService = void 0;
4898
5026
  this._storage = new InMemoryStorage();
4899
5027
  this._oauth2 = new OAuth2Server({
@@ -4920,9 +5048,12 @@ var CommercetoolsMock = class {
4920
5048
  if (!projectKey && !this.options.defaultProjectKey) {
4921
5049
  throw new Error("No projectKey passed and no default set");
4922
5050
  }
5051
+ if (this._repositories === null) {
5052
+ throw new Error("repositories not initialized yet");
5053
+ }
4923
5054
  return new ProjectAPI(
4924
5055
  projectKey || this.options.defaultProjectKey,
4925
- this._services,
5056
+ this._repositories,
4926
5057
  this._storage
4927
5058
  );
4928
5059
  }
@@ -4933,6 +5064,7 @@ var CommercetoolsMock = class {
4933
5064
  server.keepAliveTimeout = 60 * 1e3;
4934
5065
  }
4935
5066
  createApp(options) {
5067
+ this._repositories = createRepositories(this._storage);
4936
5068
  const app = (0, import_express6.default)();
4937
5069
  const projectRouter = import_express6.default.Router({ mergeParams: true });
4938
5070
  projectRouter.use(import_express6.default.json());
@@ -4951,12 +5083,11 @@ var CommercetoolsMock = class {
4951
5083
  app.use("/:projectKey", projectRouter);
4952
5084
  app.use("/:projectKey/in-store/key=:storeKey", projectRouter);
4953
5085
  }
4954
- this._repositories = createRepositories(this._storage);
5086
+ this._services = createServices(projectRouter, this._repositories);
4955
5087
  this._projectService = new ProjectService(
4956
5088
  projectRouter,
4957
5089
  this._repositories.project
4958
5090
  );
4959
- this._services = createServices(projectRouter, this._repositories);
4960
5091
  app.use((err, req, resp, next) => {
4961
5092
  if (err instanceof CommercetoolsError) {
4962
5093
  return resp.status(err.statusCode).send({