@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
@@ -1,87 +1,330 @@
1
1
  import type {
2
2
  Cache,
3
- ClientFromCapabilities,
4
- RequestContext
5
- } from "@reactionary/core";
6
- import { MedusaCartProvider } from "../providers/cart.provider.js";
7
- import { MedusaCategoryProvider } from "../providers/category.provider.js";
8
- import { MedusaCheckoutProvider } from "../providers/checkout.provider.js";
9
- import { MedusaIdentityProvider } from "../providers/identity.provider.js";
10
- import { MedusaInventoryProvider } from "../providers/inventory.provider.js";
11
- import { MedusaOrderSearchProvider } from "../providers/order-search.provider.js";
12
- import { MedusaOrderProvider } from "../providers/order.provider.js";
13
- import { MedusaPriceProvider } from "../providers/price.provider.js";
14
- import { MedusaSearchProvider } from "../providers/product-search.provider.js";
15
- import { MedusaProductRecommendationsProvider } from "../providers/product-recommendations.provider.js";
16
- import { MedusaProductProvider } from "../providers/product.provider.js";
17
- import { MedusaProductAssociationsProvider } from "../providers/product-associations.provider.js";
18
- import { MedusaProfileProvider } from "../providers/profile.provider.js";
19
- import { MedusaCapabilitiesSchema, type MedusaCapabilities } from "../schema/capabilities.schema.js";
20
- import { MedusaConfigurationSchema, type MedusaConfiguration } from "../schema/configuration.schema.js";
21
- import { MedusaAPI } from "./client.js";
3
+ RequestContext,
4
+ } from '@reactionary/core';
5
+ import {
6
+ CartIdentifierSchema,
7
+ CartSchema,
8
+ CategoryPaginatedResultSchema,
9
+ CategorySchema,
10
+ CheckoutSchema,
11
+ InventorySchema,
12
+ OrderSchema,
13
+ OrderSearchResultSchema,
14
+ PaymentMethodSchema,
15
+ PriceSchema,
16
+ ProductAssociationSchema,
17
+ ProductSchema,
18
+ ProductSearchResultSchema,
19
+ ProfileSchema,
20
+ ShippingMethodSchema,
21
+ } from '@reactionary/core';
22
+ import { MedusaCartProvider } from '../providers/cart.provider.js';
23
+ import { MedusaCategoryProvider } from '../providers/category.provider.js';
24
+ import { MedusaCheckoutProvider } from '../providers/checkout.provider.js';
25
+ import { MedusaIdentityProvider } from '../providers/identity.provider.js';
26
+ import { MedusaInventoryProvider } from '../providers/inventory.provider.js';
27
+ import { MedusaOrderSearchProvider } from '../providers/order-search.provider.js';
28
+ import { MedusaOrderProvider } from '../providers/order.provider.js';
29
+ import { MedusaPriceProvider } from '../providers/price.provider.js';
30
+ import { MedusaSearchProvider } from '../providers/product-search.provider.js';
31
+ import { MedusaProductRecommendationsProvider } from '../providers/product-recommendations.provider.js';
32
+ import { MedusaProductProvider } from '../providers/product.provider.js';
33
+ import { MedusaProductAssociationsProvider } from '../providers/product-associations.provider.js';
34
+ import { MedusaProfileProvider } from '../providers/profile.provider.js';
35
+ import {
36
+ MedusaCapabilitiesSchema,
37
+ type MedusaCapabilities,
38
+ } from '../schema/capabilities.schema.js';
39
+ import {
40
+ MedusaConfigurationSchema,
41
+ type MedusaConfiguration,
42
+ } from '../schema/configuration.schema.js';
43
+ import { MedusaAPI } from './client.js';
44
+ import {
45
+ MedusaCartFactory,
46
+ MedusaCategoryFactory,
47
+ MedusaCheckoutFactory,
48
+ MedusaInventoryFactory,
49
+ MedusaOrderFactory,
50
+ MedusaOrderSearchFactory,
51
+ MedusaPriceFactory,
52
+ MedusaProductAssociationsFactory,
53
+ MedusaProductFactory,
54
+ MedusaProductSearchFactory,
55
+ MedusaProfileFactory,
56
+ } from '../factories/index.js';
57
+ import {
58
+ type MedusaClientFromCapabilities,
59
+ resolveCapabilityProvider,
60
+ resolveProviderOnlyCapability,
61
+ } from './initialize.types.js';
22
62
 
23
63
  export function withMedusaCapabilities<T extends MedusaCapabilities>(
24
- configuration: MedusaConfiguration,
25
- capabilities: T
64
+ configuration: MedusaConfiguration,
65
+ capabilities: T,
26
66
  ) {
27
- return (cache: Cache, context: RequestContext): ClientFromCapabilities<T> => {
28
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
- const client: any = {};
30
- const config = MedusaConfigurationSchema.parse(configuration);
31
- const caps = MedusaCapabilitiesSchema.parse(capabilities);
32
-
33
- const medusaApi = new MedusaAPI(config, context);
34
-
35
-
36
- if (caps.productSearch) {
37
- client.productSearch = new MedusaSearchProvider(configuration, cache, context, medusaApi);
38
- }
39
-
40
- if (caps.productRecommendations) {
41
- client.productRecommendations = new MedusaProductRecommendationsProvider(configuration, cache, context, medusaApi);
42
- }
43
-
44
- if (caps.category) {
45
- client.category = new MedusaCategoryProvider(configuration, cache, context, medusaApi);
46
- }
47
-
48
- if (caps.checkout) {
49
- client.checkout = new MedusaCheckoutProvider(configuration, cache, context, medusaApi);
50
- }
51
-
52
- if (caps.product) {
53
- client.product = new MedusaProductProvider(configuration, cache, context, medusaApi);
54
- }
55
-
56
- if (caps.cart) {
57
- client.cart = new MedusaCartProvider(configuration, cache, context, medusaApi);
58
- }
59
-
60
- if (caps.price) {
61
- client.price = new MedusaPriceProvider(configuration, cache, context, medusaApi);
62
- }
63
-
64
- if (caps.inventory) {
65
- client.inventory = new MedusaInventoryProvider(configuration, cache, context, medusaApi);
66
- }
67
-
68
- if (caps.identity) {
69
- client.identity = new MedusaIdentityProvider(configuration, cache, context, medusaApi);
70
- }
71
- if (caps.profile) {
72
- client.profile = new MedusaProfileProvider(configuration, cache, context, medusaApi);
73
- }
74
-
75
- if (caps.order) {
76
- client.order = new MedusaOrderProvider(configuration, cache, context, medusaApi);
77
- }
78
-
79
- if(caps.orderSearch) {
80
- client.orderSearch = new MedusaOrderSearchProvider(configuration, cache, context, medusaApi);
81
- }
82
- if (caps.productAssociations) {
83
- client.productAssociations = new MedusaProductAssociationsProvider(configuration, cache, context, medusaApi);
84
- }
85
- return client;
86
- };
67
+ return (
68
+ cache: Cache,
69
+ context: RequestContext,
70
+ ): MedusaClientFromCapabilities<T> => {
71
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
72
+ const client: any = {};
73
+ const config = MedusaConfigurationSchema.parse(configuration);
74
+ const caps = MedusaCapabilitiesSchema.parse(capabilities);
75
+ const medusaApi = new MedusaAPI(config, context);
76
+
77
+ const buildProviderArgs = <TFactory,>(factory: TFactory) => ({
78
+ cache,
79
+ context,
80
+ config,
81
+ medusaApi,
82
+ factory,
83
+ });
84
+
85
+ if (caps.product?.enabled) {
86
+ client.product = resolveCapabilityProvider(
87
+ capabilities.product,
88
+ {
89
+ factory: new MedusaProductFactory(ProductSchema),
90
+ provider: (args) =>
91
+ new MedusaProductProvider(
92
+ args.config,
93
+ args.cache,
94
+ args.context,
95
+ args.medusaApi,
96
+ args.factory,
97
+ ),
98
+ },
99
+ buildProviderArgs,
100
+ );
101
+ }
102
+
103
+ if (caps.productSearch?.enabled) {
104
+ client.productSearch = resolveCapabilityProvider(
105
+ capabilities.productSearch,
106
+ {
107
+ factory: new MedusaProductSearchFactory(ProductSearchResultSchema),
108
+ provider: (args) =>
109
+ new MedusaSearchProvider(
110
+ args.config,
111
+ args.cache,
112
+ args.context,
113
+ args.medusaApi,
114
+ args.factory,
115
+ ),
116
+ },
117
+ buildProviderArgs,
118
+ );
119
+ }
120
+
121
+ if (caps.category?.enabled) {
122
+ client.category = resolveCapabilityProvider(
123
+ capabilities.category,
124
+ {
125
+ factory: new MedusaCategoryFactory(
126
+ CategorySchema,
127
+ CategoryPaginatedResultSchema,
128
+ ),
129
+ provider: (args) =>
130
+ new MedusaCategoryProvider(
131
+ args.config,
132
+ args.cache,
133
+ args.context,
134
+ args.medusaApi,
135
+ args.factory,
136
+ ),
137
+ },
138
+ buildProviderArgs,
139
+ );
140
+ }
141
+
142
+ if (caps.checkout?.enabled) {
143
+ client.checkout = resolveCapabilityProvider(
144
+ capabilities.checkout,
145
+ {
146
+ factory: new MedusaCheckoutFactory(
147
+ CheckoutSchema,
148
+ ShippingMethodSchema,
149
+ PaymentMethodSchema,
150
+ ),
151
+ provider: (args) =>
152
+ new MedusaCheckoutProvider(
153
+ args.config,
154
+ args.cache,
155
+ args.context,
156
+ args.medusaApi,
157
+ args.factory,
158
+ ),
159
+ },
160
+ buildProviderArgs,
161
+ );
162
+ }
163
+
164
+ if (caps.productRecommendations?.enabled) {
165
+ client.productRecommendations = resolveProviderOnlyCapability(
166
+ capabilities.productRecommendations,
167
+ (args) =>
168
+ new MedusaProductRecommendationsProvider(
169
+ args.config,
170
+ args.cache,
171
+ args.context,
172
+ args.medusaApi,
173
+ ),
174
+ {
175
+ cache,
176
+ context,
177
+ config,
178
+ medusaApi,
179
+ },
180
+ );
181
+ }
182
+
183
+ if (caps.cart?.enabled) {
184
+ client.cart = resolveCapabilityProvider(
185
+ capabilities.cart,
186
+ {
187
+ factory: new MedusaCartFactory(CartSchema, CartIdentifierSchema),
188
+ provider: (args) =>
189
+ new MedusaCartProvider(
190
+ args.config,
191
+ args.cache,
192
+ args.context,
193
+ args.medusaApi,
194
+ args.factory,
195
+ ),
196
+ },
197
+ buildProviderArgs,
198
+ );
199
+ }
200
+
201
+ if (caps.price?.enabled) {
202
+ client.price = resolveCapabilityProvider(
203
+ capabilities.price,
204
+ {
205
+ factory: new MedusaPriceFactory(PriceSchema),
206
+ provider: (args) =>
207
+ new MedusaPriceProvider(
208
+ args.config,
209
+ args.cache,
210
+ args.context,
211
+ args.medusaApi,
212
+ args.factory,
213
+ ),
214
+ },
215
+ buildProviderArgs,
216
+ );
217
+ }
218
+
219
+ if (caps.inventory?.enabled) {
220
+ client.inventory = resolveCapabilityProvider(
221
+ capabilities.inventory,
222
+ {
223
+ factory: new MedusaInventoryFactory(InventorySchema),
224
+ provider: (args) =>
225
+ new MedusaInventoryProvider(
226
+ args.config,
227
+ args.cache,
228
+ args.context,
229
+ args.medusaApi,
230
+ args.factory,
231
+ ),
232
+ },
233
+ buildProviderArgs,
234
+ );
235
+ }
236
+
237
+ if (caps.identity?.enabled) {
238
+ client.identity = resolveProviderOnlyCapability(
239
+ capabilities.identity,
240
+ (args) =>
241
+ new MedusaIdentityProvider(
242
+ args.config,
243
+ args.cache,
244
+ args.context,
245
+ args.medusaApi,
246
+ ),
247
+ {
248
+ cache,
249
+ context,
250
+ config,
251
+ medusaApi,
252
+ },
253
+ );
254
+ }
255
+
256
+ if (caps.profile?.enabled) {
257
+ client.profile = resolveCapabilityProvider(
258
+ capabilities.profile,
259
+ {
260
+ factory: new MedusaProfileFactory(ProfileSchema),
261
+ provider: (args) =>
262
+ new MedusaProfileProvider(
263
+ args.config,
264
+ args.cache,
265
+ args.context,
266
+ args.medusaApi,
267
+ args.factory,
268
+ ),
269
+ },
270
+ buildProviderArgs,
271
+ );
272
+ }
273
+
274
+ if (caps.order?.enabled) {
275
+ client.order = resolveCapabilityProvider(
276
+ capabilities.order,
277
+ {
278
+ factory: new MedusaOrderFactory(OrderSchema),
279
+ provider: (args) =>
280
+ new MedusaOrderProvider(
281
+ args.config,
282
+ args.cache,
283
+ args.context,
284
+ args.medusaApi,
285
+ args.factory,
286
+ ),
287
+ },
288
+ buildProviderArgs,
289
+ );
290
+ }
291
+
292
+ if (caps.orderSearch?.enabled) {
293
+ client.orderSearch = resolveCapabilityProvider(
294
+ capabilities.orderSearch,
295
+ {
296
+ factory: new MedusaOrderSearchFactory(OrderSearchResultSchema),
297
+ provider: (args) =>
298
+ new MedusaOrderSearchProvider(
299
+ args.config,
300
+ args.cache,
301
+ args.context,
302
+ args.medusaApi,
303
+ args.factory,
304
+ ),
305
+ },
306
+ buildProviderArgs,
307
+ );
308
+ }
309
+
310
+ if (caps.productAssociations?.enabled) {
311
+ client.productAssociations = resolveCapabilityProvider(
312
+ capabilities.productAssociations,
313
+ {
314
+ factory: new MedusaProductAssociationsFactory(ProductAssociationSchema),
315
+ provider: (args) =>
316
+ new MedusaProductAssociationsProvider(
317
+ args.config,
318
+ args.cache,
319
+ args.context,
320
+ args.medusaApi,
321
+ args.factory,
322
+ ),
323
+ },
324
+ buildProviderArgs,
325
+ );
326
+ }
327
+
328
+ return client;
329
+ };
87
330
  }
@@ -0,0 +1,184 @@
1
+ import type {
2
+ CartFactory,
3
+ CategoryFactory,
4
+ CheckoutFactory,
5
+ ClientFromCapabilities,
6
+ InventoryFactory,
7
+ OrderFactory,
8
+ OrderSearchFactory,
9
+ PriceFactory,
10
+ ProductAssociationsFactory,
11
+ ProductFactory,
12
+ ProductRecommendationsProvider,
13
+ ProductSearchFactory,
14
+ ProfileFactory,
15
+ } from '@reactionary/core';
16
+ import type { MedusaCapabilities } from '../schema/capabilities.schema.js';
17
+ import type { MedusaCartFactory } from '../factories/cart/cart.factory.js';
18
+ import type { MedusaCategoryFactory } from '../factories/category/category.factory.js';
19
+ import type { MedusaCheckoutFactory } from '../factories/checkout/checkout.factory.js';
20
+ import type { MedusaInventoryFactory } from '../factories/inventory/inventory.factory.js';
21
+ import type { MedusaOrderFactory } from '../factories/order/order.factory.js';
22
+ import type { MedusaOrderSearchFactory } from '../factories/order-search/order-search.factory.js';
23
+ import type { MedusaPriceFactory } from '../factories/price/price.factory.js';
24
+ import type { MedusaProductAssociationsFactory } from '../factories/product-associations/product-associations.factory.js';
25
+ import type { MedusaProductFactory } from '../factories/product/product.factory.js';
26
+ import type { MedusaProductSearchFactory } from '../factories/product-search/product-search.factory.js';
27
+ import type { MedusaProfileFactory } from '../factories/profile/profile.factory.js';
28
+ import type { MedusaCartProvider } from '../providers/cart.provider.js';
29
+ import type { MedusaCategoryProvider } from '../providers/category.provider.js';
30
+ import type { MedusaCheckoutProvider } from '../providers/checkout.provider.js';
31
+ import type { MedusaInventoryProvider } from '../providers/inventory.provider.js';
32
+ import type { MedusaOrderProvider } from '../providers/order.provider.js';
33
+ import type { MedusaOrderSearchProvider } from '../providers/order-search.provider.js';
34
+ import type { MedusaPriceProvider } from '../providers/price.provider.js';
35
+ import type { MedusaProductAssociationsProvider } from '../providers/product-associations.provider.js';
36
+ import type { MedusaProductProvider } from '../providers/product.provider.js';
37
+ import type { MedusaSearchProvider } from '../providers/product-search.provider.js';
38
+ import type { MedusaProfileProvider } from '../providers/profile.provider.js';
39
+ import type { MedusaProductRecommendationsProvider } from '../providers/product-recommendations.provider.js';
40
+ import type { MedusaIdentityProvider } from '../providers/identity.provider.js';
41
+
42
+ type OverridableCapabilityKey =
43
+ | 'product'
44
+ | 'productSearch'
45
+ | 'cart'
46
+ | 'checkout'
47
+ | 'category'
48
+ | 'price'
49
+ | 'order'
50
+ | 'orderSearch'
51
+ | 'inventory'
52
+ | 'profile'
53
+ | 'productAssociations';
54
+
55
+ type EnabledCapability<TCapability> =
56
+ TCapability extends { enabled: true } ? true : false;
57
+
58
+ type NormalizeConfiguredCapabilities<T extends MedusaCapabilities> =
59
+ Omit<T, OverridableCapabilityKey | 'productRecommendations'> & {
60
+ [K in OverridableCapabilityKey]?: EnabledCapability<T[K]>;
61
+ } & {
62
+ productRecommendations?: EnabledCapability<T['productRecommendations']>;
63
+ identity?: EnabledCapability<T['identity']>;
64
+ };
65
+
66
+ type ExtractCapabilityFactory<TCapability, TContract, TDefaultFactory> =
67
+ TCapability extends { enabled: true; factory?: infer TFactory }
68
+ ? TFactory extends TContract
69
+ ? TFactory
70
+ : TDefaultFactory
71
+ : TDefaultFactory;
72
+
73
+ type ExtractCapabilityProvider<TCapability, TDefaultProvider> =
74
+ TCapability extends { enabled: true; provider?: infer TProviderFactory }
75
+ ? TProviderFactory extends (...args: unknown[]) => infer TProvider
76
+ ? TProvider
77
+ : TDefaultProvider
78
+ : TDefaultProvider;
79
+
80
+ type FactoryContractMap = {
81
+ product: ProductFactory;
82
+ productSearch: ProductSearchFactory;
83
+ cart: CartFactory;
84
+ checkout: CheckoutFactory;
85
+ category: CategoryFactory;
86
+ price: PriceFactory;
87
+ order: OrderFactory;
88
+ orderSearch: OrderSearchFactory;
89
+ inventory: InventoryFactory;
90
+ profile: ProfileFactory;
91
+ productAssociations: ProductAssociationsFactory;
92
+ };
93
+
94
+ type DefaultFactoryMap = {
95
+ product: MedusaProductFactory;
96
+ productSearch: MedusaProductSearchFactory;
97
+ cart: MedusaCartFactory;
98
+ checkout: MedusaCheckoutFactory;
99
+ category: MedusaCategoryFactory;
100
+ price: MedusaPriceFactory;
101
+ order: MedusaOrderFactory;
102
+ orderSearch: MedusaOrderSearchFactory;
103
+ inventory: MedusaInventoryFactory;
104
+ profile: MedusaProfileFactory;
105
+ productAssociations: MedusaProductAssociationsFactory;
106
+ };
107
+
108
+ type ResolvedFactoryMap<T extends MedusaCapabilities> = {
109
+ [K in OverridableCapabilityKey]: ExtractCapabilityFactory<
110
+ T[K],
111
+ FactoryContractMap[K],
112
+ DefaultFactoryMap[K]
113
+ >;
114
+ };
115
+
116
+ type DefaultProviderMap<T extends MedusaCapabilities> = {
117
+ product: MedusaProductProvider<ResolvedFactoryMap<T>['product']>;
118
+ productSearch: MedusaSearchProvider<ResolvedFactoryMap<T>['productSearch']>;
119
+ cart: MedusaCartProvider<ResolvedFactoryMap<T>['cart']>;
120
+ checkout: MedusaCheckoutProvider<ResolvedFactoryMap<T>['checkout']>;
121
+ category: MedusaCategoryProvider<ResolvedFactoryMap<T>['category']>;
122
+ price: MedusaPriceProvider<ResolvedFactoryMap<T>['price']>;
123
+ order: MedusaOrderProvider<ResolvedFactoryMap<T>['order']>;
124
+ orderSearch: MedusaOrderSearchProvider<ResolvedFactoryMap<T>['orderSearch']>;
125
+ inventory: MedusaInventoryProvider<ResolvedFactoryMap<T>['inventory']>;
126
+ profile: MedusaProfileProvider<ResolvedFactoryMap<T>['profile']>;
127
+ productAssociations: MedusaProductAssociationsProvider<
128
+ ResolvedFactoryMap<T>['productAssociations']
129
+ >;
130
+ identity: MedusaIdentityProvider;
131
+ productRecommendations: MedusaProductRecommendationsProvider;
132
+ };
133
+
134
+ type CapabilityProviderTypeMap<T extends MedusaCapabilities> = {
135
+ [K in OverridableCapabilityKey | 'productRecommendations' | 'identity']: ExtractCapabilityProvider<
136
+ T[K],
137
+ DefaultProviderMap<T>[K]
138
+ >;
139
+ };
140
+
141
+ type EnabledCapabilityOverrideMap<T extends MedusaCapabilities> = {
142
+ [K in OverridableCapabilityKey | 'productRecommendations' | 'identity' as T[K] extends {
143
+ enabled: true;
144
+ }
145
+ ? K
146
+ : never]: CapabilityProviderTypeMap<T>[K];
147
+ };
148
+
149
+ export type MedusaClientFromCapabilities<T extends MedusaCapabilities> = Omit<
150
+ ClientFromCapabilities<NormalizeConfiguredCapabilities<T>>,
151
+ OverridableCapabilityKey | 'productRecommendations' | 'identity'
152
+ > &
153
+ EnabledCapabilityOverrideMap<T>;
154
+
155
+ export function resolveCapabilityProvider<TFactory, TProvider, TProviderArgs>(
156
+ capability:
157
+ | {
158
+ factory?: TFactory;
159
+ provider?: (args: TProviderArgs) => TProvider;
160
+ }
161
+ | undefined,
162
+ defaults: {
163
+ factory: TFactory;
164
+ provider: (args: TProviderArgs) => TProvider;
165
+ },
166
+ buildProviderArgs: (factory: TFactory) => TProviderArgs,
167
+ ): TProvider {
168
+ const factory = capability?.factory ?? defaults.factory;
169
+ const provider = capability?.provider ?? defaults.provider;
170
+ return provider(buildProviderArgs(factory));
171
+ }
172
+
173
+ export function resolveProviderOnlyCapability<TProvider, TProviderArgs>(
174
+ capability:
175
+ | {
176
+ provider?: (args: TProviderArgs) => TProvider;
177
+ }
178
+ | undefined,
179
+ defaultProvider: (args: TProviderArgs) => TProvider,
180
+ args: TProviderArgs,
181
+ ): TProvider {
182
+ const provider = capability?.provider ?? defaultProvider;
183
+ return provider(args);
184
+ }
@@ -0,0 +1,34 @@
1
+ import type {
2
+ AnyCartIdentifierSchema,
3
+ AnyCartSchema,
4
+ CartFactory,
5
+ CartIdentifierSchema,
6
+ CartSchema,
7
+ RequestContext,
8
+ } from '@reactionary/core';
9
+ import type * as z from 'zod';
10
+
11
+ export class MedusaCartFactory<
12
+ TCartSchema extends AnyCartSchema = typeof CartSchema,
13
+ TCartIdentifierSchema extends AnyCartIdentifierSchema = typeof CartIdentifierSchema,
14
+ > implements CartFactory<TCartSchema, TCartIdentifierSchema>
15
+ {
16
+ public readonly cartSchema: TCartSchema;
17
+ public readonly cartIdentifierSchema: TCartIdentifierSchema;
18
+
19
+ constructor(cartSchema: TCartSchema, cartIdentifierSchema: TCartIdentifierSchema) {
20
+ this.cartSchema = cartSchema;
21
+ this.cartIdentifierSchema = cartIdentifierSchema;
22
+ }
23
+
24
+ public parseCart(_context: RequestContext, data: unknown): z.output<TCartSchema> {
25
+ return this.cartSchema.parse(data);
26
+ }
27
+
28
+ public parseCartIdentifier(
29
+ _context: RequestContext,
30
+ data: unknown,
31
+ ): z.output<TCartIdentifierSchema> {
32
+ return this.cartIdentifierSchema.parse(data);
33
+ }
34
+ }
@@ -0,0 +1,37 @@
1
+ import type {
2
+ AnyCategoryPaginatedResultSchema,
3
+ AnyCategorySchema,
4
+ CategoryFactory,
5
+ CategoryPaginatedResultSchema,
6
+ CategorySchema,
7
+ RequestContext,
8
+ } from '@reactionary/core';
9
+ import type * as z from 'zod';
10
+
11
+ export class MedusaCategoryFactory<
12
+ TCategorySchema extends AnyCategorySchema = typeof CategorySchema,
13
+ TCategoryPaginatedSchema extends AnyCategoryPaginatedResultSchema = typeof CategoryPaginatedResultSchema,
14
+ > implements CategoryFactory<TCategorySchema, TCategoryPaginatedSchema>
15
+ {
16
+ public readonly categorySchema: TCategorySchema;
17
+ public readonly categoryPaginatedResultSchema: TCategoryPaginatedSchema;
18
+
19
+ constructor(
20
+ categorySchema: TCategorySchema,
21
+ categoryPaginatedResultSchema: TCategoryPaginatedSchema,
22
+ ) {
23
+ this.categorySchema = categorySchema;
24
+ this.categoryPaginatedResultSchema = categoryPaginatedResultSchema;
25
+ }
26
+
27
+ public parseCategory(_context: RequestContext, data: unknown): z.output<TCategorySchema> {
28
+ return this.categorySchema.parse(data);
29
+ }
30
+
31
+ public parseCategoryPaginatedResult(
32
+ _context: RequestContext,
33
+ data: unknown,
34
+ ): z.output<TCategoryPaginatedSchema> {
35
+ return this.categoryPaginatedResultSchema.parse(data);
36
+ }
37
+ }