@labdigital/commercetools-mock 2.17.1 → 2.18.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 (180) hide show
  1. package/dist/index.cjs +4351 -4099
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +266 -413
  4. package/dist/index.d.ts +266 -413
  5. package/dist/index.js +4351 -4099
  6. package/dist/index.js.map +1 -1
  7. package/package.json +47 -47
  8. package/src/constants.ts +2 -2
  9. package/src/ctMock.test.ts +11 -11
  10. package/src/ctMock.ts +141 -127
  11. package/src/deprecation.ts +8 -0
  12. package/src/exceptions.ts +17 -15
  13. package/src/helpers.ts +32 -32
  14. package/src/index.test.ts +128 -128
  15. package/src/index.ts +3 -3
  16. package/src/lib/expandParser.ts +13 -13
  17. package/src/lib/haversine.test.ts +9 -9
  18. package/src/lib/haversine.ts +11 -11
  19. package/src/lib/masking.ts +11 -11
  20. package/src/lib/parser.ts +2 -2
  21. package/src/lib/password.ts +23 -3
  22. package/src/lib/predicateParser.test.ts +185 -183
  23. package/src/lib/predicateParser.ts +234 -234
  24. package/src/lib/projectionSearchFilter.test.ts +103 -101
  25. package/src/lib/projectionSearchFilter.ts +152 -150
  26. package/src/lib/proxy.ts +5 -5
  27. package/src/oauth/errors.ts +4 -4
  28. package/src/oauth/helpers.ts +6 -6
  29. package/src/oauth/server.test.ts +86 -86
  30. package/src/oauth/server.ts +158 -144
  31. package/src/oauth/store.ts +44 -43
  32. package/src/priceSelector.test.ts +35 -35
  33. package/src/priceSelector.ts +30 -30
  34. package/src/product-projection-search.ts +136 -134
  35. package/src/projectAPI.test.ts +7 -7
  36. package/src/projectAPI.ts +24 -22
  37. package/src/repositories/abstract.ts +168 -116
  38. package/src/repositories/associate-role.ts +90 -77
  39. package/src/repositories/attribute-group.ts +51 -40
  40. package/src/repositories/business-unit.ts +168 -148
  41. package/src/repositories/cart/actions.ts +489 -0
  42. package/src/repositories/cart/helpers.ts +30 -0
  43. package/src/repositories/cart/index.ts +180 -0
  44. package/src/repositories/cart-discount/actions.ts +148 -0
  45. package/src/repositories/cart-discount/index.ts +86 -0
  46. package/src/repositories/category/actions.ts +231 -0
  47. package/src/repositories/category/index.ts +52 -0
  48. package/src/repositories/channel.ts +88 -90
  49. package/src/repositories/custom-object.ts +46 -45
  50. package/src/repositories/customer/actions.ts +165 -0
  51. package/src/repositories/customer/index.ts +79 -0
  52. package/src/repositories/customer-group.ts +66 -55
  53. package/src/repositories/discount-code/actions.ts +149 -0
  54. package/src/repositories/discount-code/index.ts +50 -0
  55. package/src/repositories/errors.ts +10 -10
  56. package/src/repositories/extension.ts +64 -62
  57. package/src/repositories/helpers.ts +117 -118
  58. package/src/repositories/index.ts +80 -79
  59. package/src/repositories/inventory-entry/actions.ts +84 -0
  60. package/src/repositories/inventory-entry/index.ts +44 -0
  61. package/src/repositories/my-customer.ts +114 -0
  62. package/src/repositories/my-order.ts +8 -8
  63. package/src/repositories/order/actions.ts +281 -0
  64. package/src/repositories/{order.test.ts → order/index.test.ts} +77 -77
  65. package/src/repositories/order/index.ts +260 -0
  66. package/src/repositories/order-edit.ts +10 -23
  67. package/src/repositories/payment/actions.ts +305 -0
  68. package/src/repositories/payment/helpers.ts +17 -0
  69. package/src/repositories/payment/index.ts +56 -0
  70. package/src/repositories/product/actions.ts +943 -0
  71. package/src/repositories/product/helpers.ts +98 -0
  72. package/src/repositories/product/index.ts +130 -0
  73. package/src/repositories/product-discount.ts +127 -117
  74. package/src/repositories/product-projection.ts +56 -62
  75. package/src/repositories/product-selection.ts +31 -28
  76. package/src/repositories/product-type.ts +136 -134
  77. package/src/repositories/project.ts +133 -118
  78. package/src/repositories/quote-request.ts +7 -19
  79. package/src/repositories/quote.ts +7 -22
  80. package/src/repositories/review.ts +13 -26
  81. package/src/repositories/shipping-method/actions.ts +198 -0
  82. package/src/repositories/shipping-method/helpers.ts +10 -0
  83. package/src/repositories/shipping-method/index.ts +138 -0
  84. package/src/repositories/shopping-list/actions.ts +295 -0
  85. package/src/repositories/shopping-list/index.ts +122 -0
  86. package/src/repositories/staged-quote.ts +7 -20
  87. package/src/repositories/standalone-price.ts +57 -44
  88. package/src/repositories/state.ts +113 -68
  89. package/src/repositories/store.ts +106 -94
  90. package/src/repositories/subscription.ts +46 -22
  91. package/src/repositories/tax-category/actions.ts +94 -0
  92. package/src/repositories/tax-category/helpers.ts +8 -0
  93. package/src/repositories/tax-category/index.ts +25 -0
  94. package/src/repositories/type/actions.ts +162 -0
  95. package/src/repositories/type/index.ts +24 -0
  96. package/src/repositories/zone.ts +62 -58
  97. package/src/schemas/update-request.ts +12 -0
  98. package/src/server.ts +9 -9
  99. package/src/services/abstract.ts +85 -72
  100. package/src/services/associate-roles.test.ts +27 -27
  101. package/src/services/associate-roles.ts +7 -7
  102. package/src/services/attribute-group.ts +7 -7
  103. package/src/services/business-units.test.ts +28 -28
  104. package/src/services/business-units.ts +7 -7
  105. package/src/services/cart-discount.test.ts +199 -199
  106. package/src/services/cart-discount.ts +7 -7
  107. package/src/services/cart.test.ts +261 -261
  108. package/src/services/cart.ts +22 -21
  109. package/src/services/category.test.ts +121 -121
  110. package/src/services/category.ts +7 -7
  111. package/src/services/channel.ts +7 -7
  112. package/src/services/custom-object.test.ts +130 -130
  113. package/src/services/custom-object.ts +34 -31
  114. package/src/services/customer-group.ts +7 -7
  115. package/src/services/customer.test.ts +205 -205
  116. package/src/services/customer.ts +23 -36
  117. package/src/services/discount-code.ts +7 -7
  118. package/src/services/extension.ts +7 -7
  119. package/src/services/index.ts +85 -81
  120. package/src/services/inventory-entry.test.ts +106 -106
  121. package/src/services/inventory-entry.ts +7 -7
  122. package/src/services/my-cart.test.ts +56 -56
  123. package/src/services/my-cart.ts +20 -20
  124. package/src/services/my-customer.test.ts +155 -104
  125. package/src/services/my-customer.ts +66 -75
  126. package/src/services/my-order.ts +16 -16
  127. package/src/services/my-payment.test.ts +40 -40
  128. package/src/services/my-payment.ts +7 -7
  129. package/src/services/my-shopping-list.ts +7 -7
  130. package/src/services/order.test.ts +243 -243
  131. package/src/services/order.ts +23 -18
  132. package/src/services/payment.test.ts +40 -40
  133. package/src/services/payment.ts +7 -7
  134. package/src/services/product-discount.ts +7 -7
  135. package/src/services/product-projection.test.ts +190 -190
  136. package/src/services/product-projection.ts +34 -32
  137. package/src/services/product-selection.test.ts +19 -19
  138. package/src/services/product-selection.ts +7 -7
  139. package/src/services/product-type.test.ts +38 -38
  140. package/src/services/product-type.ts +7 -7
  141. package/src/services/product.test.ts +658 -656
  142. package/src/services/product.ts +7 -7
  143. package/src/services/project.test.ts +29 -24
  144. package/src/services/project.ts +22 -17
  145. package/src/services/reviews.ts +7 -7
  146. package/src/services/shipping-method.test.ts +78 -78
  147. package/src/services/shipping-method.ts +16 -16
  148. package/src/services/shopping-list.test.ts +170 -170
  149. package/src/services/shopping-list.ts +7 -7
  150. package/src/services/standalone-price.test.ts +112 -112
  151. package/src/services/standalone-price.ts +7 -7
  152. package/src/services/state.test.ts +30 -30
  153. package/src/services/state.ts +7 -7
  154. package/src/services/store.test.ts +40 -40
  155. package/src/services/store.ts +7 -7
  156. package/src/services/subscription.ts +7 -7
  157. package/src/services/tax-category.test.ts +43 -43
  158. package/src/services/tax-category.ts +7 -7
  159. package/src/services/type.ts +7 -7
  160. package/src/services/zone.ts +7 -7
  161. package/src/shippingCalculator.test.ts +43 -43
  162. package/src/shippingCalculator.ts +23 -23
  163. package/src/storage/abstract.ts +36 -34
  164. package/src/storage/in-memory.ts +237 -233
  165. package/src/storage/index.ts +2 -2
  166. package/src/types.ts +91 -91
  167. package/src/validate.ts +18 -0
  168. package/src/repositories/cart-discount.ts +0 -219
  169. package/src/repositories/cart.ts +0 -659
  170. package/src/repositories/category.ts +0 -256
  171. package/src/repositories/customer.ts +0 -228
  172. package/src/repositories/discount-code.ts +0 -181
  173. package/src/repositories/inventory-entry.ts +0 -109
  174. package/src/repositories/order.ts +0 -514
  175. package/src/repositories/payment.ts +0 -342
  176. package/src/repositories/product.ts +0 -1106
  177. package/src/repositories/shipping-method.ts +0 -312
  178. package/src/repositories/shopping-list.ts +0 -392
  179. package/src/repositories/tax-category.ts +0 -111
  180. package/src/repositories/type.ts +0 -172
@@ -1,28 +1,16 @@
1
1
  import type {
2
2
  QuoteRequest,
3
3
  QuoteRequestDraft,
4
- QuoteRequestUpdateAction,
5
- } from '@commercetools/platform-sdk'
6
- import type { Writable } from '../types.js'
7
- import { AbstractResourceRepository, RepositoryContext } from './abstract.js'
4
+ } from "@commercetools/platform-sdk";
5
+ import { AbstractStorage } from "~src/storage";
6
+ import { AbstractResourceRepository, RepositoryContext } from "./abstract";
8
7
 
9
- export class QuoteRequestRepository extends AbstractResourceRepository<'quote-request'> {
10
- getTypeId() {
11
- return 'quote-request' as const
8
+ export class QuoteRequestRepository extends AbstractResourceRepository<"quote-request"> {
9
+ constructor(storage: AbstractStorage) {
10
+ super("quote-request", storage);
12
11
  }
13
12
 
14
13
  create(context: RepositoryContext, draft: QuoteRequestDraft): QuoteRequest {
15
- throw new Error('not implemented')
14
+ throw new Error("not implemented");
16
15
  }
17
-
18
- actions: Partial<
19
- Record<
20
- QuoteRequestUpdateAction['action'],
21
- (
22
- context: RepositoryContext,
23
- resource: Writable<QuoteRequest>,
24
- action: any
25
- ) => void
26
- >
27
- > = {}
28
16
  }
@@ -1,28 +1,13 @@
1
- import type {
2
- Quote,
3
- QuoteDraft,
4
- QuoteUpdateAction,
5
- } from '@commercetools/platform-sdk'
6
- import type { Writable } from '../types.js'
7
- import { AbstractResourceRepository, RepositoryContext } from './abstract.js'
1
+ import type { Quote, QuoteDraft } from "@commercetools/platform-sdk";
2
+ import { AbstractStorage } from "~src/storage";
3
+ import { AbstractResourceRepository, RepositoryContext } from "./abstract";
8
4
 
9
- export class QuoteRepository extends AbstractResourceRepository<'quote'> {
10
- getTypeId() {
11
- return 'quote' as const
5
+ export class QuoteRepository extends AbstractResourceRepository<"quote"> {
6
+ constructor(storage: AbstractStorage) {
7
+ super("quote", storage);
12
8
  }
13
9
 
14
10
  create(context: RepositoryContext, draft: QuoteDraft): Quote {
15
- throw new Error('not implemented')
11
+ throw new Error("not implemented");
16
12
  }
17
-
18
- actions: Partial<
19
- Record<
20
- QuoteUpdateAction['action'],
21
- (
22
- context: RepositoryContext,
23
- resource: Writable<Quote>,
24
- action: any
25
- ) => void
26
- >
27
- > = {}
28
13
  }
@@ -3,24 +3,23 @@ import {
3
3
  ProductReference,
4
4
  type Review,
5
5
  type ReviewDraft,
6
- type ReviewUpdateAction,
7
6
  type StateReference,
8
- } from '@commercetools/platform-sdk'
9
- import { getBaseResourceProperties } from '../helpers.js'
10
- import type { Writable } from '../types.js'
11
- import { AbstractResourceRepository, RepositoryContext } from './abstract.js'
7
+ } from "@commercetools/platform-sdk";
8
+ import { AbstractStorage } from "~src/storage";
9
+ import { getBaseResourceProperties } from "../helpers";
10
+ import { AbstractResourceRepository, RepositoryContext } from "./abstract";
12
11
  import {
13
12
  createCustomFields,
14
13
  getReferenceFromResourceIdentifier,
15
- } from './helpers.js'
14
+ } from "./helpers";
16
15
 
17
- export class ReviewRepository extends AbstractResourceRepository<'review'> {
18
- getTypeId() {
19
- return 'review' as const
16
+ export class ReviewRepository extends AbstractResourceRepository<"review"> {
17
+ constructor(storage: AbstractStorage) {
18
+ super("review", storage);
20
19
  }
21
20
 
22
21
  create(context: RepositoryContext, draft: ReviewDraft): Review {
23
- if (!draft.target) throw new Error('Missing target')
22
+ if (!draft.target) throw new Error("Missing target");
24
23
  const resource: Review = {
25
24
  ...getBaseResourceProperties(),
26
25
 
@@ -34,7 +33,7 @@ export class ReviewRepository extends AbstractResourceRepository<'review'> {
34
33
  ? getReferenceFromResourceIdentifier<StateReference>(
35
34
  draft.state,
36
35
  context.projectKey,
37
- this._storage
36
+ this._storage,
38
37
  )
39
38
  : undefined,
40
39
  target: draft.target
@@ -46,21 +45,9 @@ export class ReviewRepository extends AbstractResourceRepository<'review'> {
46
45
  custom: createCustomFields(
47
46
  draft.custom,
48
47
  context.projectKey,
49
- this._storage
48
+ this._storage,
50
49
  ),
51
- }
52
- this.saveNew(context, resource)
53
- return resource
50
+ };
51
+ return this.saveNew(context, resource);
54
52
  }
55
-
56
- actions: Partial<
57
- Record<
58
- ReviewUpdateAction['action'],
59
- (
60
- context: RepositoryContext,
61
- resource: Writable<Review>,
62
- action: any
63
- ) => void
64
- >
65
- > = {}
66
53
  }
@@ -0,0 +1,198 @@
1
+ import {
2
+ ShippingMethodChangeTaxCategoryAction,
3
+ ShippingMethodRemoveShippingRateAction,
4
+ type ShippingMethod,
5
+ type ShippingMethodAddShippingRateAction,
6
+ type ShippingMethodAddZoneAction,
7
+ type ShippingMethodChangeIsDefaultAction,
8
+ type ShippingMethodChangeNameAction,
9
+ type ShippingMethodRemoveZoneAction,
10
+ type ShippingMethodSetCustomFieldAction,
11
+ type ShippingMethodSetCustomTypeAction,
12
+ type ShippingMethodSetDescriptionAction,
13
+ type ShippingMethodSetKeyAction,
14
+ type ShippingMethodSetLocalizedDescriptionAction,
15
+ type ShippingMethodSetLocalizedNameAction,
16
+ type ShippingMethodSetPredicateAction,
17
+ type ShippingMethodUpdateAction,
18
+ type ZoneReference,
19
+ } from "@commercetools/platform-sdk";
20
+ import deepEqual from "deep-equal";
21
+ import type { Writable } from "../../types";
22
+ import {
23
+ AbstractUpdateHandler,
24
+ RepositoryContext,
25
+ UpdateHandlerInterface,
26
+ } from "../abstract";
27
+ import {
28
+ createCustomFields,
29
+ getReferenceFromResourceIdentifier,
30
+ } from "../helpers";
31
+ import { transformShippingRate } from "./helpers";
32
+
33
+ export class ShippingMethodUpdateHandler
34
+ extends AbstractUpdateHandler
35
+ implements UpdateHandlerInterface<ShippingMethod, ShippingMethodUpdateAction>
36
+ {
37
+ changeTaxCategory: (
38
+ context: RepositoryContext,
39
+ resource: Writable<ShippingMethod>,
40
+ action: ShippingMethodChangeTaxCategoryAction,
41
+ ) => void;
42
+
43
+ addShippingRate(
44
+ _context: RepositoryContext,
45
+ resource: Writable<ShippingMethod>,
46
+ { shippingRate, zone }: ShippingMethodAddShippingRateAction,
47
+ ) {
48
+ const rate = transformShippingRate(shippingRate);
49
+
50
+ resource.zoneRates.forEach((zoneRate) => {
51
+ if (zoneRate.zone.id === zone.id) {
52
+ zoneRate.shippingRates.push(rate);
53
+ return;
54
+ }
55
+ });
56
+ resource.zoneRates.push({
57
+ zone: {
58
+ typeId: "zone",
59
+ id: zone.id!,
60
+ },
61
+ shippingRates: [rate],
62
+ });
63
+ }
64
+
65
+ addZone(
66
+ context: RepositoryContext,
67
+ resource: Writable<ShippingMethod>,
68
+ { zone }: ShippingMethodAddZoneAction,
69
+ ) {
70
+ const zoneReference = getReferenceFromResourceIdentifier<ZoneReference>(
71
+ zone,
72
+ context.projectKey,
73
+ this._storage,
74
+ );
75
+
76
+ if (resource.zoneRates === undefined) {
77
+ resource.zoneRates = [];
78
+ }
79
+
80
+ resource.zoneRates.push({
81
+ zone: zoneReference,
82
+ shippingRates: [],
83
+ });
84
+ }
85
+
86
+ changeIsDefault(
87
+ _context: RepositoryContext,
88
+ resource: Writable<ShippingMethod>,
89
+ { isDefault }: ShippingMethodChangeIsDefaultAction,
90
+ ) {
91
+ resource.isDefault = isDefault;
92
+ }
93
+
94
+ changeName(
95
+ _context: RepositoryContext,
96
+ resource: Writable<ShippingMethod>,
97
+ { name }: ShippingMethodChangeNameAction,
98
+ ) {
99
+ resource.name = name;
100
+ }
101
+
102
+ removeShippingRate(
103
+ _context: RepositoryContext,
104
+ resource: Writable<ShippingMethod>,
105
+ { shippingRate, zone }: ShippingMethodRemoveShippingRateAction,
106
+ ) {
107
+ const rate = transformShippingRate(shippingRate);
108
+
109
+ resource.zoneRates.forEach((zoneRate) => {
110
+ if (zoneRate.zone.id === zone.id) {
111
+ zoneRate.shippingRates = zoneRate.shippingRates.filter(
112
+ (otherRate) => !deepEqual(rate, otherRate),
113
+ );
114
+ }
115
+ });
116
+ }
117
+
118
+ removeZone(
119
+ _context: RepositoryContext,
120
+ resource: Writable<ShippingMethod>,
121
+ { zone }: ShippingMethodRemoveZoneAction,
122
+ ) {
123
+ resource.zoneRates = resource.zoneRates.filter(
124
+ (zoneRate) => zoneRate.zone.id !== zone.id,
125
+ );
126
+ }
127
+
128
+ setCustomField(
129
+ context: RepositoryContext,
130
+ resource: Writable<ShippingMethod>,
131
+ { name, value }: ShippingMethodSetCustomFieldAction,
132
+ ) {
133
+ if (!resource.custom) {
134
+ return;
135
+ }
136
+ if (value === null) {
137
+ delete resource.custom.fields[name];
138
+ } else {
139
+ resource.custom.fields[name] = value;
140
+ }
141
+ }
142
+
143
+ setCustomType(
144
+ context: RepositoryContext,
145
+ resource: Writable<ShippingMethod>,
146
+ { type, fields }: ShippingMethodSetCustomTypeAction,
147
+ ) {
148
+ if (type) {
149
+ resource.custom = createCustomFields(
150
+ { type, fields },
151
+ context.projectKey,
152
+ this._storage,
153
+ );
154
+ } else {
155
+ resource.custom = undefined;
156
+ }
157
+ }
158
+
159
+ setDescription(
160
+ _context: RepositoryContext,
161
+ resource: Writable<ShippingMethod>,
162
+ { description }: ShippingMethodSetDescriptionAction,
163
+ ) {
164
+ resource.description = description;
165
+ }
166
+
167
+ setKey(
168
+ _context: RepositoryContext,
169
+ resource: Writable<ShippingMethod>,
170
+ { key }: ShippingMethodSetKeyAction,
171
+ ) {
172
+ resource.key = key;
173
+ }
174
+
175
+ setLocalizedDescription(
176
+ _context: RepositoryContext,
177
+ resource: Writable<ShippingMethod>,
178
+ { localizedDescription }: ShippingMethodSetLocalizedDescriptionAction,
179
+ ) {
180
+ resource.localizedDescription = localizedDescription;
181
+ }
182
+
183
+ setLocalizedName(
184
+ _context: RepositoryContext,
185
+ resource: Writable<ShippingMethod>,
186
+ { localizedName }: ShippingMethodSetLocalizedNameAction,
187
+ ) {
188
+ resource.localizedName = localizedName;
189
+ }
190
+
191
+ setPredicate(
192
+ _context: RepositoryContext,
193
+ resource: Writable<ShippingMethod>,
194
+ { predicate }: ShippingMethodSetPredicateAction,
195
+ ) {
196
+ resource.predicate = predicate;
197
+ }
198
+ }
@@ -0,0 +1,10 @@
1
+ import { ShippingRate, ShippingRateDraft } from "@commercetools/platform-sdk";
2
+ import { createTypedMoney } from "../helpers";
3
+
4
+ export const transformShippingRate = (
5
+ rate: ShippingRateDraft,
6
+ ): ShippingRate => ({
7
+ price: createTypedMoney(rate.price),
8
+ freeAbove: rate.freeAbove && createTypedMoney(rate.freeAbove),
9
+ tiers: rate.tiers || [],
10
+ });
@@ -0,0 +1,138 @@
1
+ import {
2
+ InvalidOperationError,
3
+ type ShippingMethod,
4
+ type ShippingMethodDraft,
5
+ type ZoneRate,
6
+ type ZoneRateDraft,
7
+ type ZoneReference,
8
+ } from "@commercetools/platform-sdk";
9
+ import { CommercetoolsError } from "~src/exceptions";
10
+ import { getBaseResourceProperties } from "../../helpers";
11
+ import { markMatchingShippingRate } from "../../shippingCalculator";
12
+ import { AbstractStorage } from "../../storage/abstract";
13
+ import {
14
+ AbstractResourceRepository,
15
+ GetParams,
16
+ RepositoryContext,
17
+ } from "../abstract";
18
+ import {
19
+ createCustomFields,
20
+ getReferenceFromResourceIdentifier,
21
+ } from "../helpers";
22
+ import { ShippingMethodUpdateHandler } from "./actions";
23
+ import { transformShippingRate } from "./helpers";
24
+
25
+ export class ShippingMethodRepository extends AbstractResourceRepository<"shipping-method"> {
26
+ constructor(storage: AbstractStorage) {
27
+ super("shipping-method", storage);
28
+ this.actions = new ShippingMethodUpdateHandler(storage);
29
+ }
30
+
31
+ create(
32
+ context: RepositoryContext,
33
+ draft: ShippingMethodDraft,
34
+ ): ShippingMethod {
35
+ const resource: ShippingMethod = {
36
+ ...getBaseResourceProperties(),
37
+ ...draft,
38
+ taxCategory: getReferenceFromResourceIdentifier(
39
+ draft.taxCategory,
40
+ context.projectKey,
41
+ this._storage,
42
+ ),
43
+ zoneRates: draft.zoneRates?.map((z) =>
44
+ this._transformZoneRateDraft(context, z),
45
+ ),
46
+ custom: createCustomFields(
47
+ draft.custom,
48
+ context.projectKey,
49
+ this._storage,
50
+ ),
51
+ };
52
+ return this.saveNew(context, resource);
53
+ }
54
+
55
+ /*
56
+ * Retrieves all the ShippingMethods that can ship to the shipping address of
57
+ * the given Cart. Each ShippingMethod contains exactly one ShippingRate with
58
+ * the flag isMatching set to true. This ShippingRate is used when the
59
+ * ShippingMethod is added to the Cart.
60
+ */
61
+ public matchingCart(
62
+ context: RepositoryContext,
63
+ cartId: string,
64
+ params: GetParams = {},
65
+ ) {
66
+ const cart = this._storage.get(context.projectKey, "cart", cartId);
67
+ if (!cart) {
68
+ return undefined;
69
+ }
70
+
71
+ if (!cart.shippingAddress?.country) {
72
+ throw new CommercetoolsError<InvalidOperationError>({
73
+ code: "InvalidOperation",
74
+ message: `The cart with ID '${cart.id}' does not have a shipping address set.`,
75
+ });
76
+ }
77
+
78
+ // Get all shipping methods that have a zone that matches the shipping address
79
+ const zones = this._storage.query<"zone">(context.projectKey, "zone", {
80
+ where: [`locations(country="${cart.shippingAddress.country}"))`],
81
+ limit: 100,
82
+ });
83
+ const zoneIds = zones.results.map((zone) => zone.id);
84
+ const shippingMethods = this.query(context, {
85
+ "where": [
86
+ `zoneRates(zone(id in (:zoneIds)))`,
87
+ `zoneRates(shippingRates(price(currencyCode="${cart.totalPrice.currencyCode}")))`,
88
+ ],
89
+ "var.zoneIds": zoneIds,
90
+ "expand": params.expand,
91
+ });
92
+
93
+ // Make sure that each shipping method has exactly one shipping rate and
94
+ // that the shipping rate is marked as matching
95
+ const results = shippingMethods.results
96
+ .map((shippingMethod) => {
97
+ // Iterate through the zoneRates, process the shipping rates and filter
98
+ // out all zoneRates which have no matching shipping rates left
99
+ const rates = shippingMethod.zoneRates
100
+ .map((zoneRate) => ({
101
+ zone: zoneRate.zone,
102
+
103
+ // Iterate through the shippingRates and mark the matching ones
104
+ // then we filter out the non-matching ones
105
+ shippingRates: zoneRate.shippingRates
106
+ .map((rate) => markMatchingShippingRate(cart, rate))
107
+ .filter((rate) => rate.isMatching),
108
+ }))
109
+ .filter((zoneRate) => zoneRate.shippingRates.length > 0);
110
+
111
+ return {
112
+ ...shippingMethod,
113
+ zoneRates: rates,
114
+ };
115
+ })
116
+ .filter((shippingMethod) => shippingMethod.zoneRates.length > 0);
117
+
118
+ return {
119
+ ...shippingMethods,
120
+ results: results,
121
+ };
122
+ }
123
+
124
+ private _transformZoneRateDraft(
125
+ context: RepositoryContext,
126
+ draft: ZoneRateDraft,
127
+ ): ZoneRate {
128
+ return {
129
+ ...draft,
130
+ zone: getReferenceFromResourceIdentifier<ZoneReference>(
131
+ draft.zone,
132
+ context.projectKey,
133
+ this._storage,
134
+ ),
135
+ shippingRates: draft.shippingRates?.map(transformShippingRate),
136
+ };
137
+ }
138
+ }