@reactionary/source 0.3.18 → 0.6.2

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 (191) hide show
  1. package/README.md +28 -14
  2. package/core/src/client/client-builder.ts +54 -6
  3. package/core/src/factories/cart.factory.ts +40 -0
  4. package/core/src/factories/category.factory.ts +40 -0
  5. package/core/src/factories/checkout.factory.ts +59 -0
  6. package/core/src/factories/identity.factory.ts +26 -0
  7. package/core/src/factories/index.ts +15 -0
  8. package/core/src/factories/inventory.factory.ts +26 -0
  9. package/core/src/factories/order-search.factory.ts +33 -0
  10. package/core/src/factories/order.factory.ts +21 -0
  11. package/core/src/factories/price.factory.ts +29 -0
  12. package/core/src/factories/product-associations.factory.ts +30 -0
  13. package/core/src/factories/product-list.factory.ts +82 -0
  14. package/core/src/factories/product-reviews.factory.ts +58 -0
  15. package/core/src/factories/product-search.factory.ts +31 -0
  16. package/core/src/factories/product.factory.ts +21 -0
  17. package/core/src/factories/profile.factory.ts +23 -0
  18. package/core/src/factories/store.factory.ts +21 -0
  19. package/core/src/index.ts +3 -1
  20. package/core/src/providers/cart.provider.ts +12 -10
  21. package/core/src/providers/category.provider.ts +9 -7
  22. package/core/src/providers/checkout.provider.ts +14 -10
  23. package/core/src/providers/identity.provider.ts +7 -7
  24. package/core/src/providers/inventory.provider.ts +4 -4
  25. package/core/src/providers/order-search.provider.ts +4 -2
  26. package/core/src/providers/order.provider.ts +4 -4
  27. package/core/src/providers/price.provider.ts +5 -5
  28. package/core/src/providers/product-associations.provider.ts +6 -4
  29. package/core/src/providers/product-list.provider.ts +13 -8
  30. package/core/src/providers/product-reviews.provider.ts +8 -4
  31. package/core/src/providers/product-search.provider.ts +15 -28
  32. package/core/src/providers/product.provider.ts +6 -6
  33. package/core/src/providers/profile.provider.ts +8 -8
  34. package/core/src/providers/store.provider.ts +2 -2
  35. package/core/src/test/client-builder.spec.ts +81 -0
  36. package/examples/node/package.json +7 -7
  37. package/examples/node/src/basic/basic-node-provider-model-extension.spec.ts +10 -4
  38. package/examples/node/src/basic/basic-node-provider-query-extension.spec.ts +8 -2
  39. package/examples/node/src/basic/basic-node-setup.spec.ts +5 -1
  40. package/examples/node/src/basic/client-creation.spec.ts +3 -3
  41. package/examples/node/src/utils.ts +41 -41
  42. package/examples/node/tsconfig.lib.json +2 -1
  43. package/package.json +1 -1
  44. package/providers/algolia/src/core/initialize.ts +76 -21
  45. package/providers/algolia/src/core/initialize.types.ts +107 -0
  46. package/providers/algolia/src/factories/index.ts +1 -0
  47. package/providers/algolia/src/factories/product-search/product-search.factory.ts +182 -0
  48. package/providers/algolia/src/index.ts +2 -2
  49. package/providers/algolia/src/providers/analytics.provider.ts +4 -4
  50. package/providers/algolia/src/providers/product-search.provider.ts +67 -184
  51. package/providers/algolia/src/schema/capabilities.schema.ts +81 -7
  52. package/providers/algolia/src/test/analytics.spec.ts +9 -1
  53. package/providers/algolia/src/test/client-builder-product-search-extension.example.ts +85 -0
  54. package/providers/commercetools/src/core/capability-descriptors.ts +324 -0
  55. package/providers/commercetools/src/core/initialize.ts +35 -151
  56. package/providers/commercetools/src/core/initialize.types.ts +174 -0
  57. package/providers/commercetools/src/factories/cart/cart.factory.ts +142 -0
  58. package/providers/commercetools/src/factories/category/category.factory.ts +77 -0
  59. package/providers/commercetools/src/factories/checkout/checkout-initializer-overrides.example.ts +94 -0
  60. package/providers/commercetools/src/factories/checkout/checkout.factory.ts +338 -0
  61. package/providers/commercetools/src/factories/identity/identity.factory.ts +26 -0
  62. package/providers/commercetools/src/factories/inventory/inventory.factory.ts +49 -0
  63. package/providers/commercetools/src/factories/order/order.factory.ts +149 -0
  64. package/providers/commercetools/src/factories/order-search/order-search.factory.ts +108 -0
  65. package/providers/commercetools/src/factories/price/price.factory.ts +76 -0
  66. package/providers/commercetools/src/factories/product/product-factory-baseline.example.ts +14 -0
  67. package/providers/commercetools/src/factories/product/product-factory-schema-and-parse-extension.example.ts +35 -0
  68. package/providers/commercetools/src/factories/product/product-factory-schema-extension.example.ts +23 -0
  69. package/providers/commercetools/src/factories/product/product-initializer-factory-extension.example.ts +41 -0
  70. package/providers/commercetools/src/factories/product/product-provider-custom-method-only.example.ts +47 -0
  71. package/providers/commercetools/src/factories/product/product-provider-schema-signature-extension.example.ts +61 -0
  72. package/providers/commercetools/src/factories/product/product.factory.ts +220 -0
  73. package/providers/commercetools/src/factories/product/utils.example.ts +9 -0
  74. package/providers/commercetools/src/factories/product-associations/product-associations.factory.ts +103 -0
  75. package/providers/commercetools/src/factories/product-list/product-list.factory.ts +122 -0
  76. package/providers/commercetools/src/factories/product-reviews/product-reviews.factory.ts +81 -0
  77. package/providers/commercetools/src/factories/product-search/product-search.factory.ts +182 -0
  78. package/providers/commercetools/src/factories/profile/profile.factory.ts +94 -0
  79. package/providers/commercetools/src/factories/store/store.factory.ts +49 -0
  80. package/providers/commercetools/src/index.ts +15 -0
  81. package/providers/commercetools/src/providers/cart.provider.ts +67 -193
  82. package/providers/commercetools/src/providers/category.provider.ts +24 -64
  83. package/providers/commercetools/src/providers/checkout.provider.ts +50 -322
  84. package/providers/commercetools/src/providers/identity.provider.ts +35 -15
  85. package/providers/commercetools/src/providers/inventory.provider.ts +13 -31
  86. package/providers/commercetools/src/providers/order-search.provider.ts +16 -110
  87. package/providers/commercetools/src/providers/order.provider.ts +13 -144
  88. package/providers/commercetools/src/providers/price.provider.ts +37 -51
  89. package/providers/commercetools/src/providers/product-associations.provider.ts +39 -104
  90. package/providers/commercetools/src/providers/product-list.provider.ts +38 -23
  91. package/providers/commercetools/src/providers/product-reviews.provider.ts +34 -14
  92. package/providers/commercetools/src/providers/product-search.provider.ts +17 -170
  93. package/providers/commercetools/src/providers/product.provider.ts +20 -199
  94. package/providers/commercetools/src/providers/profile.provider.ts +27 -73
  95. package/providers/commercetools/src/providers/store.provider.ts +13 -31
  96. package/providers/commercetools/src/schema/capabilities.schema.ts +258 -20
  97. package/providers/commercetools/src/test/caching.spec.ts +18 -2
  98. package/providers/commercetools/src/test/client-builder-merge-extensions.example.ts +125 -0
  99. package/providers/fake/src/core/initialize.ts +213 -44
  100. package/providers/fake/src/core/initialize.types.ts +164 -0
  101. package/providers/fake/src/factories/cart/cart.factory.ts +34 -0
  102. package/providers/fake/src/factories/category/category.factory.ts +40 -0
  103. package/providers/fake/src/factories/checkout/checkout.factory.ts +53 -0
  104. package/providers/fake/src/factories/identity/identity.factory.ts +25 -0
  105. package/providers/fake/src/factories/index.ts +14 -0
  106. package/providers/fake/src/factories/inventory/inventory.factory.ts +25 -0
  107. package/providers/fake/src/factories/order/order.factory.ts +22 -0
  108. package/providers/fake/src/factories/order-search/order-search.factory.ts +27 -0
  109. package/providers/fake/src/factories/price/price.factory.ts +26 -0
  110. package/providers/fake/src/factories/product/product.factory.ts +22 -0
  111. package/providers/fake/src/factories/product-associations/product-associations.factory.ts +25 -0
  112. package/providers/fake/src/factories/product-reviews/product-reviews.factory.ts +53 -0
  113. package/providers/fake/src/factories/product-search/product-search.factory.ts +27 -0
  114. package/providers/fake/src/factories/profile/profile.factory.ts +22 -0
  115. package/providers/fake/src/factories/store/store.factory.ts +22 -0
  116. package/providers/fake/src/index.ts +2 -0
  117. package/providers/fake/src/providers/cart.provider.ts +23 -14
  118. package/providers/fake/src/providers/category.provider.ts +120 -105
  119. package/providers/fake/src/providers/checkout.provider.ts +39 -20
  120. package/providers/fake/src/providers/identity.provider.ts +40 -34
  121. package/providers/fake/src/providers/inventory.provider.ts +26 -24
  122. package/providers/fake/src/providers/order-search.provider.ts +38 -30
  123. package/providers/fake/src/providers/order.provider.ts +21 -37
  124. package/providers/fake/src/providers/price.provider.ts +42 -34
  125. package/providers/fake/src/providers/product-associations.provider.ts +23 -10
  126. package/providers/fake/src/providers/product-reviews.provider.ts +71 -69
  127. package/providers/fake/src/providers/product-search.provider.ts +43 -70
  128. package/providers/fake/src/providers/product.provider.ts +34 -32
  129. package/providers/fake/src/providers/profile.provider.ts +62 -55
  130. package/providers/fake/src/providers/store.provider.ts +38 -22
  131. package/providers/fake/src/schema/capabilities.schema.ts +175 -18
  132. package/providers/fake/src/test/cart.provider.spec.ts +20 -3
  133. package/providers/fake/src/test/category.provider.spec.ts +4 -1
  134. package/providers/fake/src/test/checkout.provider.spec.ts +12 -2
  135. package/providers/fake/src/test/client-builder-product-extension.example.ts +75 -0
  136. package/providers/fake/src/test/order-search.provider.spec.ts +4 -7
  137. package/providers/fake/src/test/order.provider.spec.ts +4 -6
  138. package/providers/fake/src/test/price.provider.spec.ts +3 -1
  139. package/providers/fake/src/test/product.provider.spec.ts +8 -2
  140. package/providers/fake/src/test/profile.provider.spec.ts +4 -2
  141. package/providers/google-analytics/src/core/initialize.ts +37 -12
  142. package/providers/google-analytics/src/core/initialize.types.ts +47 -0
  143. package/providers/google-analytics/src/index.ts +1 -0
  144. package/providers/google-analytics/src/schema/capabilities.schema.ts +31 -5
  145. package/providers/medusa/src/core/initialize.ts +324 -81
  146. package/providers/medusa/src/core/initialize.types.ts +184 -0
  147. package/providers/medusa/src/factories/cart/cart.factory.ts +34 -0
  148. package/providers/medusa/src/factories/category/category.factory.ts +37 -0
  149. package/providers/medusa/src/factories/checkout/checkout.factory.ts +50 -0
  150. package/providers/medusa/src/factories/identity/identity.factory.ts +22 -0
  151. package/providers/medusa/src/factories/index.ts +12 -0
  152. package/providers/medusa/src/factories/inventory/inventory.factory.ts +25 -0
  153. package/providers/medusa/src/factories/order/order.factory.ts +22 -0
  154. package/providers/medusa/src/factories/order-search/order-search.factory.ts +27 -0
  155. package/providers/medusa/src/factories/price/price.factory.ts +26 -0
  156. package/providers/medusa/src/factories/product/product.factory.ts +22 -0
  157. package/providers/medusa/src/factories/product-associations/product-associations.factory.ts +25 -0
  158. package/providers/medusa/src/factories/product-search/product-search.factory.ts +27 -0
  159. package/providers/medusa/src/factories/profile/profile.factory.ts +22 -0
  160. package/providers/medusa/src/index.ts +2 -0
  161. package/providers/medusa/src/providers/cart.provider.ts +33 -20
  162. package/providers/medusa/src/providers/category.provider.ts +30 -12
  163. package/providers/medusa/src/providers/checkout.provider.ts +42 -17
  164. package/providers/medusa/src/providers/identity.provider.ts +1 -1
  165. package/providers/medusa/src/providers/inventory.provider.ts +21 -7
  166. package/providers/medusa/src/providers/order-search.provider.ts +16 -5
  167. package/providers/medusa/src/providers/order.provider.ts +17 -5
  168. package/providers/medusa/src/providers/price.provider.ts +26 -7
  169. package/providers/medusa/src/providers/product-associations.provider.ts +19 -8
  170. package/providers/medusa/src/providers/product-search.provider.ts +19 -31
  171. package/providers/medusa/src/providers/product.provider.ts +47 -11
  172. package/providers/medusa/src/providers/profile.provider.ts +35 -11
  173. package/providers/medusa/src/schema/capabilities.schema.ts +229 -18
  174. package/providers/medusa/src/test/cart.provider.spec.ts +18 -2
  175. package/providers/medusa/src/test/category.provider.spec.ts +4 -1
  176. package/providers/medusa/src/test/checkout.spec.ts +9 -9
  177. package/providers/medusa/src/test/inventory.provider.spec.ts +3 -1
  178. package/providers/medusa/src/test/large-cart.provider.spec.ts +8 -2
  179. package/providers/medusa/src/test/price.provider.spec.ts +8 -1
  180. package/providers/medusa/src/test/product.provider.spec.ts +3 -1
  181. package/providers/medusa/src/test/search.provider.spec.ts +16 -3
  182. package/providers/meilisearch/src/core/initialize.ts +88 -21
  183. package/providers/meilisearch/src/core/initialize.types.ts +119 -0
  184. package/providers/meilisearch/src/factories/index.ts +2 -0
  185. package/providers/meilisearch/src/factories/order-search/order-search.factory.ts +27 -0
  186. package/providers/meilisearch/src/factories/product-search/product-search.factory.ts +27 -0
  187. package/providers/meilisearch/src/index.ts +2 -0
  188. package/providers/meilisearch/src/providers/index.ts +1 -0
  189. package/providers/meilisearch/src/providers/order-search.provider.ts +21 -6
  190. package/providers/meilisearch/src/providers/product-search.provider.ts +24 -8
  191. package/providers/meilisearch/src/schema/capabilities.schema.ts +95 -8
@@ -12,6 +12,11 @@ import type {
12
12
  CheckoutMutationRemovePaymentInstruction,
13
13
  CheckoutMutationSetShippingAddress,
14
14
  CheckoutMutationSetShippingInstruction,
15
+ CheckoutFactory,
16
+ CheckoutFactoryCheckoutOutput,
17
+ CheckoutFactoryPaymentMethodOutput,
18
+ CheckoutFactoryShippingMethodOutput,
19
+ CheckoutFactoryWithOutput,
15
20
  CheckoutQueryById,
16
21
  CheckoutQueryForAvailablePaymentMethods,
17
22
  CheckoutQueryForAvailableShippingMethods,
@@ -57,6 +62,7 @@ import {
57
62
  type MedusaCartIdentifier,
58
63
  type MedusaOrderIdentifier
59
64
  } from '../schema/medusa.schema.js';
65
+ import type { MedusaCheckoutFactory } from '../factories/checkout/checkout.factory.js';
60
66
  const debug = createDebug('reactionary:medusa:checkout');
61
67
 
62
68
  export class CheckoutNotReadyForFinalizationError extends Error {
@@ -74,8 +80,15 @@ export class CheckoutNotReadyForFinalizationError extends Error {
74
80
  }
75
81
  }
76
82
 
77
- export class MedusaCheckoutProvider extends CheckoutProvider {
83
+ export class MedusaCheckoutProvider<
84
+ TFactory extends CheckoutFactory = MedusaCheckoutFactory,
85
+ > extends CheckoutProvider<
86
+ CheckoutFactoryCheckoutOutput<TFactory>,
87
+ CheckoutFactoryShippingMethodOutput<TFactory>,
88
+ CheckoutFactoryPaymentMethodOutput<TFactory>
89
+ > {
78
90
  protected config: MedusaConfiguration;
91
+ protected factory: CheckoutFactoryWithOutput<TFactory>;
79
92
 
80
93
  /**
81
94
  * This controls which fields are always included when fetching a cart
@@ -91,10 +104,12 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
91
104
  config: MedusaConfiguration,
92
105
  cache: Cache,
93
106
  context: RequestContext,
94
- public medusaApi: MedusaAPI
107
+ public medusaApi: MedusaAPI,
108
+ factory: CheckoutFactoryWithOutput<TFactory>,
95
109
  ) {
96
110
  super(cache, context);
97
111
  this.config = config;
112
+ this.factory = factory;
98
113
  }
99
114
 
100
115
  protected initiateCheckoutForCartPayload(payload: CheckoutMutationInitiateCheckout): StoreUpdateCart {
@@ -118,7 +133,7 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
118
133
  })
119
134
  public override async initiateCheckoutForCart(
120
135
  payload: CheckoutMutationInitiateCheckout
121
- ): Promise<Result<Checkout>> {
136
+ ): Promise<Result<CheckoutFactoryCheckoutOutput<TFactory>>> {
122
137
  const client = await this.medusaApi.getClient();
123
138
  // we should eventually copy the cart.... but for now we just continue with the existing one.
124
139
  if (debug.enabled) {
@@ -144,7 +159,7 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
144
159
  })
145
160
  public override async getById(
146
161
  payload: CheckoutQueryById
147
- ): Promise<Result<Checkout, NotFoundError>> {
162
+ ): Promise<Result<CheckoutFactoryCheckoutOutput<TFactory>, NotFoundError>> {
148
163
  const client = await this.medusaApi.getClient();
149
164
  const response = await client.store.cart.retrieve(payload.identifier.key, {
150
165
  fields: this.includedFields,
@@ -165,7 +180,7 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
165
180
  })
166
181
  public override async setShippingAddress(
167
182
  payload: CheckoutMutationSetShippingAddress
168
- ): Promise<Result<Checkout>> {
183
+ ): Promise<Result<CheckoutFactoryCheckoutOutput<TFactory>>> {
169
184
  const client = await this.medusaApi.getClient();
170
185
 
171
186
  const response = await client.store.cart.update(
@@ -191,7 +206,7 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
191
206
  })
192
207
  public override async getAvailableShippingMethods(
193
208
  payload: CheckoutQueryForAvailableShippingMethods
194
- ): Promise<Result<ShippingMethod[]>> {
209
+ ): Promise<Result<CheckoutFactoryShippingMethodOutput<TFactory>[]>> {
195
210
  const client = await this.medusaApi.getClient();
196
211
 
197
212
  if (debug.enabled) {
@@ -229,7 +244,9 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
229
244
  shippingMethods
230
245
  );
231
246
  }
232
- return success(shippingMethods);
247
+ return success(
248
+ shippingMethods.map((x) => this.factory.parseShippingMethod(this.context, x)),
249
+ );
233
250
  }
234
251
 
235
252
  protected getAvailablePaymentMethodsPayload(payload: CheckoutQueryForAvailablePaymentMethods, regionId: string) {
@@ -244,7 +261,7 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
244
261
  })
245
262
  public override async getAvailablePaymentMethods(
246
263
  payload: CheckoutQueryForAvailablePaymentMethods
247
- ): Promise<Result<PaymentMethod[]>> {
264
+ ): Promise<Result<CheckoutFactoryPaymentMethodOutput<TFactory>[]>> {
248
265
  const client = await this.medusaApi.getClient();
249
266
 
250
267
  if (debug.enabled) {
@@ -286,7 +303,9 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
286
303
  );
287
304
  }
288
305
 
289
- return success(paymentMethods);
306
+ return success(
307
+ paymentMethods.map((x) => this.factory.parsePaymentMethod(this.context, x)),
308
+ );
290
309
  }
291
310
 
292
311
 
@@ -307,7 +326,7 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
307
326
  })
308
327
  public override async addPaymentInstruction(
309
328
  payload: CheckoutMutationAddPaymentInstruction
310
- ): Promise<Result<Checkout>> {
329
+ ): Promise<Result<CheckoutFactoryCheckoutOutput<TFactory>>> {
311
330
  const client = await this.medusaApi.getClient();
312
331
 
313
332
  if (debug.enabled) {
@@ -347,7 +366,7 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
347
366
  })
348
367
  public override removePaymentInstruction(
349
368
  payload: CheckoutMutationRemovePaymentInstruction
350
- ): Promise<Result<Checkout>> {
369
+ ): Promise<Result<CheckoutFactoryCheckoutOutput<TFactory>>> {
351
370
  throw new Error('Method not implemented.');
352
371
  }
353
372
 
@@ -368,7 +387,7 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
368
387
  })
369
388
  public override async setShippingInstruction(
370
389
  payload: CheckoutMutationSetShippingInstruction
371
- ): Promise<Result<Checkout>> {
390
+ ): Promise<Result<CheckoutFactoryCheckoutOutput<TFactory>>> {
372
391
  const client = await this.medusaApi.getClient();
373
392
  const medusaId = payload.checkout as MedusaCartIdentifier;
374
393
  try {
@@ -412,7 +431,7 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
412
431
  })
413
432
  public override async finalizeCheckout(
414
433
  payload: CheckoutMutationFinalizeCheckout
415
- ): Promise<Result<Checkout>> {
434
+ ): Promise<Result<CheckoutFactoryCheckoutOutput<TFactory>>> {
416
435
  const checkout = await this.getById({ identifier: payload.checkout });
417
436
  if (!checkout.success || !checkout.value.readyForFinalization) {
418
437
  throw new CheckoutNotReadyForFinalizationError(payload.checkout);
@@ -432,9 +451,15 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
432
451
  order_display_id: response.order?.display_id ? +'' : '',
433
452
  },
434
453
  });
435
- return this.getById({
454
+ const refreshedCheckout = await this.getById({
436
455
  identifier: payload.checkout,
437
- }) as Promise<Result<Checkout>>;
456
+ });
457
+
458
+ if (!refreshedCheckout.success) {
459
+ throw new Error(`Unable to reload checkout ${payload.checkout.key} after completion`);
460
+ }
461
+
462
+ return success(refreshedCheckout.value);
438
463
  }
439
464
 
440
465
  throw new Error('Something failed during order creation');
@@ -534,7 +559,7 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
534
559
  * @param remote
535
560
  * @returns
536
561
  */
537
- protected parseSingle(remote: StoreCart): Checkout {
562
+ protected parseSingle(remote: StoreCart): CheckoutFactoryCheckoutOutput<TFactory> {
538
563
  const identifier = {
539
564
  key: remote.id,
540
565
  // region_id: remote.region_id,
@@ -668,6 +693,6 @@ export class MedusaCheckoutProvider extends CheckoutProvider {
668
693
  shippingInstruction
669
694
  };
670
695
 
671
- return result;
696
+ return this.factory.parseCheckout(this.context, result);
672
697
  }
673
698
  }
@@ -32,7 +32,7 @@ export class MedusaIdentityProvider extends IdentityProvider {
32
32
  config: MedusaConfiguration,
33
33
  cache: Cache,
34
34
  context: RequestContext,
35
- medusaApi: MedusaAPI
35
+ medusaApi: MedusaAPI,
36
36
  ) {
37
37
  super(cache, context);
38
38
 
@@ -8,6 +8,9 @@ import {
8
8
  InventoryQueryBySKUSchema,
9
9
  Reactionary,
10
10
  type InventoryIdentifier,
11
+ type InventoryFactory,
12
+ type InventoryFactoryOutput,
13
+ type InventoryFactoryWithOutput,
11
14
  type InventoryStatus,
12
15
  type NotFoundError,
13
16
  type Result,
@@ -17,27 +20,35 @@ import type * as z from 'zod';
17
20
  import type { MedusaConfiguration } from '../schema/configuration.schema.js';
18
21
  import { MedusaAdminAPI, type MedusaAPI } from '../core/client.js';
19
22
  import createDebug from 'debug';
23
+ import type { MedusaInventoryFactory } from '../factories/inventory/inventory.factory.js';
20
24
 
21
25
  const debug = createDebug('reactionary:medusa:inventory');
22
26
 
23
- export class MedusaInventoryProvider extends InventoryProvider {
27
+ export class MedusaInventoryProvider<
28
+ TFactory extends InventoryFactory = MedusaInventoryFactory,
29
+ > extends InventoryProvider<InventoryFactoryOutput<TFactory>> {
24
30
  protected config: MedusaConfiguration;
31
+ protected factory: InventoryFactoryWithOutput<TFactory>;
25
32
 
26
33
  constructor(
27
34
  config: MedusaConfiguration,
28
35
  cache: Cache,
29
36
  context: RequestContext,
30
- public medusaApi: MedusaAPI
37
+ public medusaApi: MedusaAPI,
38
+ factory: InventoryFactoryWithOutput<TFactory>,
31
39
  ) {
32
40
  super(cache, context);
33
41
  this.config = config;
42
+ this.factory = factory;
34
43
  }
35
44
 
36
45
  @Reactionary({
37
46
  inputSchema: InventoryQueryBySKUSchema,
38
47
  outputSchema: InventorySchema,
39
48
  })
40
- public override async getBySKU(payload: InventoryQueryBySKU): Promise<Result<Inventory, NotFoundError>> {
49
+ public override async getBySKU(
50
+ payload: InventoryQueryBySKU,
51
+ ): Promise<Result<InventoryFactoryOutput<TFactory>, NotFoundError>> {
41
52
  const sku = payload.variant.sku;
42
53
  const fulfillmentCenterKey = payload.fulfilmentCenter.key;
43
54
 
@@ -112,7 +123,7 @@ export class MedusaInventoryProvider extends InventoryProvider {
112
123
  }
113
124
  }
114
125
 
115
- protected parseSingle(_body: unknown): Inventory {
126
+ protected parseSingle(_body: unknown): InventoryFactoryOutput<TFactory> {
116
127
  const { sku, fulfillmentCenterKey, quantity } = _body as {
117
128
  sku: string;
118
129
  fulfillmentCenterKey: string;
@@ -140,7 +151,7 @@ export class MedusaInventoryProvider extends InventoryProvider {
140
151
  status
141
152
  } satisfies Inventory;
142
153
 
143
- return result;
154
+ return this.factory.parseInventory(this.context, result);
144
155
  }
145
156
 
146
157
  /**
@@ -150,7 +161,10 @@ export class MedusaInventoryProvider extends InventoryProvider {
150
161
  * @param fulfillmentCenterKey
151
162
  * @returns
152
163
  */
153
- protected createEmptyInventoryResult(sku: string, fulfillmentCenterKey: string): Inventory {
164
+ protected createEmptyInventoryResult(
165
+ sku: string,
166
+ fulfillmentCenterKey: string,
167
+ ): InventoryFactoryOutput<TFactory> {
154
168
  const identifier = {
155
169
  variant: { sku },
156
170
  fulfillmentCenter: { key: fulfillmentCenterKey },
@@ -164,7 +178,7 @@ export class MedusaInventoryProvider extends InventoryProvider {
164
178
  status
165
179
  } satisfies Inventory;
166
180
 
167
- return result;
181
+ return this.factory.parseInventory(this.context, result);
168
182
  }
169
183
 
170
184
  protected override getResourceName(): string {
@@ -13,6 +13,9 @@ import type {
13
13
  OrderSearchIdentifier,
14
14
  AddressIdentifier,
15
15
  OrderInventoryStatus,
16
+ OrderSearchFactory,
17
+ OrderSearchFactoryOutput,
18
+ OrderSearchFactoryWithOutput,
16
19
  } from '@reactionary/core';
17
20
  import {
18
21
  AddressIdentifierSchema,
@@ -26,21 +29,27 @@ import type { MedusaConfiguration } from '../schema/configuration.schema.js';
26
29
  import type { MedusaAPI } from '../core/client.js';
27
30
  import createDebug from 'debug';
28
31
  import type { OrderStatus as MedusaOrderStatus, StoreOrder, StoreOrderAddress, StoreOrderListResponse } from '@medusajs/types';
32
+ import type { MedusaOrderSearchFactory } from '../factories/order-search/order-search.factory.js';
29
33
 
30
34
  const debug = createDebug('reactionary:medusa:order-search');
31
35
 
32
- export class MedusaOrderSearchProvider extends OrderSearchProvider {
36
+ export class MedusaOrderSearchProvider<
37
+ TFactory extends OrderSearchFactory = MedusaOrderSearchFactory,
38
+ > extends OrderSearchProvider<OrderSearchFactoryOutput<TFactory>> {
33
39
  protected config: MedusaConfiguration;
40
+ protected factory: OrderSearchFactoryWithOutput<TFactory>;
34
41
 
35
42
  constructor(
36
43
  config: MedusaConfiguration,
37
44
  cache: Cache,
38
45
  context: RequestContext,
39
- public medusaApi: MedusaAPI
46
+ public medusaApi: MedusaAPI,
47
+ factory: OrderSearchFactoryWithOutput<TFactory>,
40
48
  ) {
41
49
  super(cache, context);
42
50
 
43
51
  this.config = config;
52
+ this.factory = factory;
44
53
 
45
54
  }
46
55
 
@@ -99,7 +108,9 @@ export class MedusaOrderSearchProvider extends OrderSearchProvider {
99
108
  inputSchema: OrderSearchQueryByTermSchema,
100
109
  outputSchema: OrderSearchResultSchema,
101
110
  })
102
- public async queryByTerm(payload: OrderSearchQueryByTerm): Promise<Result<OrderSearchResult>> {
111
+ public async queryByTerm(
112
+ payload: OrderSearchQueryByTerm,
113
+ ): Promise<Result<OrderSearchFactoryOutput<TFactory>>> {
103
114
  debug('queryByTerm', payload);
104
115
 
105
116
  const medusa = await this.medusaApi.getClient();
@@ -109,14 +120,14 @@ export class MedusaOrderSearchProvider extends OrderSearchProvider {
109
120
 
110
121
  const response = await medusa.store.order.list(this.queryByTermPayload(payload));
111
122
 
112
- const result = this.parsePaginatedResult(response, payload) as OrderSearchResult;
123
+ const result = this.parsePaginatedResult(response, payload);
113
124
  if (debug.enabled) {
114
125
  debug(
115
126
  `Search for term "${payload.search.term}" returned ${response.orders.length} orders (page ${payload.search.paginationOptions.pageNumber} of ${result.totalPages})`
116
127
  );
117
128
  }
118
129
 
119
- return success(result);
130
+ return success(this.factory.parseOrderSearchResult(this.context, result, payload));
120
131
  }
121
132
 
122
133
  protected composeAddressFromStoreAddress(storeAddress: StoreOrderAddress): Address {
@@ -17,6 +17,9 @@ import type {
17
17
  OrderInventoryStatus,
18
18
  PaymentMethodIdentifier,
19
19
  PaymentInstruction,
20
+ OrderFactory,
21
+ OrderFactoryOutput,
22
+ OrderFactoryWithOutput,
20
23
  } from '@reactionary/core';
21
24
  import {
22
25
  OrderProvider,
@@ -33,27 +36,35 @@ import type { MedusaConfiguration } from '../schema/configuration.schema.js';
33
36
  import { handleProviderError } from '../utils/medusa-helpers.js';
34
37
  import type { StoreOrder, StoreOrderLineItem, StorePaymentCollection } from '@medusajs/types';
35
38
  import { parseMedusaItemPrice, parseMedusaCostBreakdown } from '../utils/medusa-helpers.js'
39
+ import type { MedusaOrderFactory } from '../factories/order/order.factory.js';
36
40
  const debug = createDebug('reactionary:medusa:order');
37
41
 
38
- export class MedusaOrderProvider extends OrderProvider {
42
+ export class MedusaOrderProvider<
43
+ TFactory extends OrderFactory = MedusaOrderFactory,
44
+ > extends OrderProvider<OrderFactoryOutput<TFactory>> {
39
45
  protected config: MedusaConfiguration;
46
+ protected factory: OrderFactoryWithOutput<TFactory>;
40
47
 
41
48
  constructor(
42
49
  config: MedusaConfiguration,
43
50
  cache: Cache,
44
51
  context: RequestContext,
45
- public medusaApi: MedusaAPI
52
+ public medusaApi: MedusaAPI,
53
+ factory: OrderFactoryWithOutput<TFactory>,
46
54
  ) {
47
55
  super(cache, context);
48
56
 
49
57
  this.config = config;
58
+ this.factory = factory;
50
59
  }
51
60
 
52
61
  @Reactionary({
53
62
  inputSchema: OrderQueryByIdSchema,
54
63
  outputSchema: OrderSchema,
55
64
  })
56
- public async getById(payload: OrderQueryById): Promise<Result<Order, NotFoundError>> {
65
+ public async getById(
66
+ payload: OrderQueryById,
67
+ ): Promise<Result<OrderFactoryOutput<TFactory>, NotFoundError>> {
57
68
  debug('getById', payload);
58
69
 
59
70
  const medusa = await this.medusaApi.getClient();
@@ -175,7 +186,7 @@ export class MedusaOrderProvider extends OrderProvider {
175
186
 
176
187
 
177
188
 
178
- protected parseSingle(body: StoreOrder): Order {
189
+ protected parseSingle(body: StoreOrder): OrderFactoryOutput<TFactory> {
179
190
 
180
191
  const identifier = { key: body.id };
181
192
  const userId: IdentityIdentifier = {
@@ -213,7 +224,7 @@ export class MedusaOrderProvider extends OrderProvider {
213
224
  return this.parsePaymentInstruction(pc, body);
214
225
  }) || [];
215
226
 
216
- return {
227
+ const result = {
217
228
  identifier,
218
229
  userId,
219
230
  items,
@@ -222,5 +233,6 @@ export class MedusaOrderProvider extends OrderProvider {
222
233
  inventoryStatus,
223
234
  paymentInstructions
224
235
  } satisfies Order;
236
+ return this.factory.parseOrder(this.context, result);
225
237
  }
226
238
  }
@@ -11,6 +11,9 @@ import {
11
11
  type CustomerPriceQuery,
12
12
  type ListPriceQuery,
13
13
  type Price,
14
+ type PriceFactory,
15
+ type PriceFactoryOutput,
16
+ type PriceFactoryWithOutput,
14
17
  type RequestContext,
15
18
  type PriceIdentifier,
16
19
  type MonetaryAmount,
@@ -20,27 +23,35 @@ import createDebug from 'debug';
20
23
  import type * as z from 'zod';
21
24
  import type { MedusaAPI } from '../core/client.js';
22
25
  import type { MedusaConfiguration } from '../schema/configuration.schema.js';
26
+ import type { MedusaPriceFactory } from '../factories/price/price.factory.js';
23
27
 
24
28
  const debug = createDebug('reactionary:medusa:price');
25
29
 
26
- export class MedusaPriceProvider extends PriceProvider {
30
+ export class MedusaPriceProvider<
31
+ TFactory extends PriceFactory = MedusaPriceFactory,
32
+ > extends PriceProvider<PriceFactoryOutput<TFactory>> {
27
33
  protected config: MedusaConfiguration;
34
+ protected factory: PriceFactoryWithOutput<TFactory>;
28
35
 
29
36
  constructor(
30
37
  config: MedusaConfiguration,
31
38
  cache: Cache,
32
39
  context: RequestContext,
33
- public medusaApi: MedusaAPI
40
+ public medusaApi: MedusaAPI,
41
+ factory: PriceFactoryWithOutput<TFactory>,
34
42
  ) {
35
43
  super(cache, context);
36
44
  this.config = config;
45
+ this.factory = factory;
37
46
  }
38
47
 
39
48
  @Reactionary({
40
49
  inputSchema: ListPriceQuerySchema,
41
50
  outputSchema: PriceSchema,
42
51
  })
43
- public override async getListPrice(payload: ListPriceQuery): Promise<Result<Price>> {
52
+ public override async getListPrice(
53
+ payload: ListPriceQuery,
54
+ ): Promise<Result<PriceFactoryOutput<TFactory>>> {
44
55
  const result = await this.getBySKU(payload, 'list');
45
56
 
46
57
  return success(result);
@@ -50,14 +61,19 @@ export class MedusaPriceProvider extends PriceProvider {
50
61
  inputSchema: CustomerPriceQuerySchema,
51
62
  outputSchema: PriceSchema,
52
63
  })
53
- public override async getCustomerPrice(payload: CustomerPriceQuery): Promise<Result<Price>> {
64
+ public override async getCustomerPrice(
65
+ payload: CustomerPriceQuery,
66
+ ): Promise<Result<PriceFactoryOutput<TFactory>>> {
54
67
  const result = await this.getBySKU(payload, 'customer');
55
68
 
56
69
  return success(result);
57
70
  }
58
71
 
59
72
 
60
- protected async getBySKU(payload: ListPriceQuery | CustomerPriceQuery, mode: 'list' | 'customer' ): Promise<Price> {
73
+ protected async getBySKU(
74
+ payload: ListPriceQuery | CustomerPriceQuery,
75
+ mode: 'list' | 'customer',
76
+ ): Promise<PriceFactoryOutput<TFactory>> {
61
77
  const sku = payload.variant.sku;
62
78
 
63
79
  if (debug.enabled) {
@@ -98,7 +114,10 @@ export class MedusaPriceProvider extends PriceProvider {
98
114
  }
99
115
  }
100
116
 
101
- protected parseSingle(variant: StoreProductVariant, mode: 'list' | 'customer'): Price {
117
+ protected parseSingle(
118
+ variant: StoreProductVariant,
119
+ mode: 'list' | 'customer',
120
+ ): PriceFactoryOutput<TFactory> {
102
121
  const identifier = {
103
122
  variant: {
104
123
  sku: variant.sku || '',
@@ -139,7 +158,7 @@ export class MedusaPriceProvider extends PriceProvider {
139
158
  onSale: isOnSale,
140
159
  } satisfies Price;
141
160
 
142
- return result;
161
+ return this.factory.parsePrice(this.context, result);
143
162
  }
144
163
 
145
164
 
@@ -6,6 +6,11 @@ import {
6
6
  ProductVariantIdentifierSchema,
7
7
  success,
8
8
  } from '@reactionary/core';
9
+ import type {
10
+ ProductAssociationsFactory,
11
+ ProductAssociationsFactoryOutput,
12
+ ProductAssociationsFactoryWithOutput,
13
+ } from '@reactionary/core';
9
14
  import type {
10
15
  ProductVariantIdentifier,
11
16
  ProductIdentifier,
@@ -22,20 +27,26 @@ import type {
22
27
  import type { MedusaConfiguration } from '../schema/configuration.schema.js';
23
28
  import type { MedusaAPI } from '../core/client.js';
24
29
  import type { StoreProduct, StoreProductVariant } from '@medusajs/types';
30
+ import type { MedusaProductAssociationsFactory } from '../factories/product-associations/product-associations.factory.js';
25
31
 
26
- export class MedusaProductAssociationsProvider extends ProductAssociationsProvider {
32
+ export class MedusaProductAssociationsProvider<
33
+ TFactory extends ProductAssociationsFactory = MedusaProductAssociationsFactory,
34
+ > extends ProductAssociationsProvider<ProductAssociationsFactoryOutput<TFactory>> {
27
35
  protected config: MedusaConfiguration;
28
36
  protected medusa: MedusaAPI;
37
+ protected factory: ProductAssociationsFactoryWithOutput<TFactory>;
29
38
 
30
39
  constructor(
31
40
  config: MedusaConfiguration,
32
41
  cache: Cache,
33
42
  context: RequestContext,
34
- medusa: MedusaAPI
43
+ medusa: MedusaAPI,
44
+ factory: ProductAssociationsFactoryWithOutput<TFactory>,
35
45
  ) {
36
46
  super(cache, context);
37
47
  this.config = config;
38
48
  this.medusa = medusa;
49
+ this.factory = factory;
39
50
  }
40
51
 
41
52
  protected async fetchAssociatedProductsFor(productKey: ProductIdentifier, maxNumberOfAssociations: number, attributeName: string): Promise<ProductSearchResultItem[]> {
@@ -87,7 +98,7 @@ export class MedusaProductAssociationsProvider extends ProductAssociationsProvid
87
98
  })
88
99
  public override async getAccessories(
89
100
  query: ProductAssociationsGetAccessoriesQuery
90
- ): Promise<Result<ProductAssociation[]>> {
101
+ ): Promise<Result<ProductAssociationsFactoryOutput<TFactory>[]>> {
91
102
  const associatedProducts = await this.fetchAssociatedProductsFor(query.forProduct, query.numberOfAccessories || 4, 'reactionaryaccessories');
92
103
 
93
104
  const result: ProductAssociation[] = associatedProducts.map(product => ({
@@ -98,7 +109,7 @@ export class MedusaProductAssociationsProvider extends ProductAssociationsProvid
98
109
  product,
99
110
  } satisfies ProductAssociation));
100
111
 
101
- return success(result);
112
+ return success(result.map((x) => this.factory.parseAssociation(this.context, x)));
102
113
  }
103
114
 
104
115
  @Reactionary({
@@ -109,7 +120,7 @@ export class MedusaProductAssociationsProvider extends ProductAssociationsProvid
109
120
  })
110
121
  public override async getSpareparts(
111
122
  query: ProductAssociationsGetSparepartsQuery
112
- ): Promise<Result<ProductAssociation[]>> {
123
+ ): Promise<Result<ProductAssociationsFactoryOutput<TFactory>[]>> {
113
124
  const associatedProducts = await this.fetchAssociatedProductsFor(query.forProduct, query.numberOfSpareparts || 4, 'reactionaryspareparts');
114
125
 
115
126
  const result: ProductAssociation[] = associatedProducts.map(product => ({
@@ -120,7 +131,7 @@ export class MedusaProductAssociationsProvider extends ProductAssociationsProvid
120
131
  product,
121
132
  } satisfies ProductAssociation));
122
133
 
123
- return success(result);
134
+ return success(result.map((x) => this.factory.parseAssociation(this.context, x)));
124
135
  }
125
136
 
126
137
  @Reactionary({
@@ -131,7 +142,7 @@ export class MedusaProductAssociationsProvider extends ProductAssociationsProvid
131
142
  })
132
143
  public override async getReplacements(
133
144
  query: ProductAssociationsGetReplacementsQuery
134
- ): Promise<Result<ProductAssociation[]>> {
145
+ ): Promise<Result<ProductAssociationsFactoryOutput<TFactory>[]>> {
135
146
  const associatedProducts = await this.fetchAssociatedProductsFor(query.forProduct, query.numberOfReplacements || 4, 'reactionaryreplacements');
136
147
 
137
148
  const result: ProductAssociation[] = associatedProducts.map(product => ({
@@ -142,7 +153,7 @@ export class MedusaProductAssociationsProvider extends ProductAssociationsProvid
142
153
  product,
143
154
  } satisfies ProductAssociation));
144
155
 
145
- return success(result);
156
+ return success(result.map((x) => this.factory.parseAssociation(this.context, x)));
146
157
  }
147
158
 
148
159
  protected parseSingle(_body: StoreProduct): ProductSearchResultItem {