@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
@@ -0,0 +1,174 @@
1
+ import type {
2
+ CartFactory,
3
+ CategoryFactory,
4
+ CheckoutFactory,
5
+ ClientFromCapabilities,
6
+ IdentityFactory,
7
+ InventoryFactory,
8
+ OrderFactory,
9
+ OrderSearchFactory,
10
+ PriceFactory,
11
+ ProductAssociationsFactory,
12
+ ProductFactory,
13
+ ProductListFactory,
14
+ ProductReviewsFactory,
15
+ ProductSearchFactory,
16
+ ProfileFactory,
17
+ StoreFactory,
18
+ } from '@reactionary/core';
19
+ import type { CommercetoolsCapabilities } from '../schema/capabilities.schema.js';
20
+ import type { OverridableCapabilityKey } from './capability-descriptors.js';
21
+ import type { CommercetoolsCartFactory } from '../factories/cart/cart.factory.js';
22
+ import type { CommercetoolsCategoryFactory } from '../factories/category/category.factory.js';
23
+ import type { CommercetoolsCheckoutFactory } from '../factories/checkout/checkout.factory.js';
24
+ import type { CommercetoolsIdentityFactory } from '../factories/identity/identity.factory.js';
25
+ import type { CommercetoolsInventoryFactory } from '../factories/inventory/inventory.factory.js';
26
+ import type { CommercetoolsOrderFactory } from '../factories/order/order.factory.js';
27
+ import type { CommercetoolsOrderSearchFactory } from '../factories/order-search/order-search.factory.js';
28
+ import type { CommercetoolsPriceFactory } from '../factories/price/price.factory.js';
29
+ import type { CommercetoolsProductAssociationsFactory } from '../factories/product-associations/product-associations.factory.js';
30
+ import type { CommercetoolsProductFactory } from '../factories/product/product.factory.js';
31
+ import type { CommercetoolsProductListFactory } from '../factories/product-list/product-list.factory.js';
32
+ import type { CommercetoolsProductReviewsFactory } from '../factories/product-reviews/product-reviews.factory.js';
33
+ import type { CommercetoolsProductSearchFactory } from '../factories/product-search/product-search.factory.js';
34
+ import type { CommercetoolsProfileFactory } from '../factories/profile/profile.factory.js';
35
+ import type { CommercetoolsStoreFactory } from '../factories/store/store.factory.js';
36
+ import type { CommercetoolsCartProvider } from '../providers/cart.provider.js';
37
+ import type { CommercetoolsCategoryProvider } from '../providers/category.provider.js';
38
+ import type { CommercetoolsCheckoutProvider } from '../providers/checkout.provider.js';
39
+ import type { CommercetoolsIdentityProvider } from '../providers/identity.provider.js';
40
+ import type { CommercetoolsInventoryProvider } from '../providers/inventory.provider.js';
41
+ import type { CommercetoolsOrderSearchProvider } from '../providers/order-search.provider.js';
42
+ import type { CommercetoolsOrderProvider } from '../providers/order.provider.js';
43
+ import type { CommercetoolsPriceProvider } from '../providers/price.provider.js';
44
+ import type { CommercetoolsProductAssociationsProvider } from '../providers/product-associations.provider.js';
45
+ import type { CommercetoolsProductListProvider } from '../providers/product-list.provider.js';
46
+ import type { CommercetoolsProductProvider } from '../providers/product.provider.js';
47
+ import type { CommercetoolsProductReviewsProvider } from '../providers/product-reviews.provider.js';
48
+ import type { CommercetoolsSearchProvider } from '../providers/product-search.provider.js';
49
+ import type { CommercetoolsProfileProvider } from '../providers/profile.provider.js';
50
+ import type { CommercetoolsStoreProvider } from '../providers/store.provider.js';
51
+
52
+ type EnabledCapability<TCapability> =
53
+ TCapability extends { enabled: true } ? true : false;
54
+
55
+ type NormalizeConfiguredCapabilities<T extends CommercetoolsCapabilities> =
56
+ Omit<T, OverridableCapabilityKey> & {
57
+ [K in OverridableCapabilityKey]?: EnabledCapability<T[K]>;
58
+ };
59
+
60
+ type ExtractCapabilityFactory<TCapability, TContract, TDefaultFactory> =
61
+ TCapability extends { enabled: true; factory?: infer TFactory }
62
+ ? TFactory extends TContract
63
+ ? TFactory
64
+ : TDefaultFactory
65
+ : TDefaultFactory;
66
+
67
+ type ExtractCapabilityProvider<TCapability, TDefaultProvider> =
68
+ TCapability extends { enabled: true; provider?: infer TProviderFactory }
69
+ ? TProviderFactory extends (...args: any[]) => infer TProvider
70
+ ? TProvider
71
+ : TDefaultProvider
72
+ : TDefaultProvider;
73
+
74
+ type FactoryContractMap = {
75
+ product: ProductFactory;
76
+ productSearch: ProductSearchFactory;
77
+ productAssociations: ProductAssociationsFactory;
78
+ productReviews: ProductReviewsFactory;
79
+ productList: ProductListFactory;
80
+ identity: IdentityFactory;
81
+ cart: CartFactory;
82
+ checkout: CheckoutFactory;
83
+ order: OrderFactory;
84
+ orderSearch: OrderSearchFactory;
85
+ inventory: InventoryFactory;
86
+ price: PriceFactory;
87
+ category: CategoryFactory;
88
+ store: StoreFactory;
89
+ profile: ProfileFactory;
90
+ };
91
+
92
+ type DefaultFactoryMap = {
93
+ product: CommercetoolsProductFactory;
94
+ productSearch: CommercetoolsProductSearchFactory;
95
+ productAssociations: CommercetoolsProductAssociationsFactory;
96
+ productReviews: CommercetoolsProductReviewsFactory;
97
+ productList: CommercetoolsProductListFactory;
98
+ identity: CommercetoolsIdentityFactory;
99
+ cart: CommercetoolsCartFactory;
100
+ checkout: CommercetoolsCheckoutFactory;
101
+ order: CommercetoolsOrderFactory;
102
+ orderSearch: CommercetoolsOrderSearchFactory;
103
+ inventory: CommercetoolsInventoryFactory;
104
+ price: CommercetoolsPriceFactory;
105
+ category: CommercetoolsCategoryFactory;
106
+ store: CommercetoolsStoreFactory;
107
+ profile: CommercetoolsProfileFactory;
108
+ };
109
+
110
+ type ResolvedFactoryMap<T extends CommercetoolsCapabilities> = {
111
+ [K in OverridableCapabilityKey]: ExtractCapabilityFactory<
112
+ T[K],
113
+ FactoryContractMap[K],
114
+ DefaultFactoryMap[K]
115
+ >;
116
+ };
117
+
118
+ type DefaultProviderMap<T extends CommercetoolsCapabilities> = {
119
+ product: CommercetoolsProductProvider<ResolvedFactoryMap<T>['product']>;
120
+ productSearch: CommercetoolsSearchProvider<ResolvedFactoryMap<T>['productSearch']>;
121
+ productAssociations: CommercetoolsProductAssociationsProvider<
122
+ ResolvedFactoryMap<T>['productAssociations']
123
+ >;
124
+ productReviews: CommercetoolsProductReviewsProvider<
125
+ ResolvedFactoryMap<T>['productReviews']
126
+ >;
127
+ productList: CommercetoolsProductListProvider<ResolvedFactoryMap<T>['productList']>;
128
+ identity: CommercetoolsIdentityProvider<ResolvedFactoryMap<T>['identity']>;
129
+ cart: CommercetoolsCartProvider<ResolvedFactoryMap<T>['cart']>;
130
+ checkout: CommercetoolsCheckoutProvider<ResolvedFactoryMap<T>['checkout']>;
131
+ order: CommercetoolsOrderProvider<ResolvedFactoryMap<T>['order']>;
132
+ orderSearch: CommercetoolsOrderSearchProvider<ResolvedFactoryMap<T>['orderSearch']>;
133
+ inventory: CommercetoolsInventoryProvider<ResolvedFactoryMap<T>['inventory']>;
134
+ price: CommercetoolsPriceProvider<ResolvedFactoryMap<T>['price']>;
135
+ category: CommercetoolsCategoryProvider<ResolvedFactoryMap<T>['category']>;
136
+ store: CommercetoolsStoreProvider<ResolvedFactoryMap<T>['store']>;
137
+ profile: CommercetoolsProfileProvider<ResolvedFactoryMap<T>['profile']>;
138
+ };
139
+
140
+ type CapabilityProviderTypeMap<T extends CommercetoolsCapabilities> = {
141
+ [K in OverridableCapabilityKey]: ExtractCapabilityProvider<T[K], DefaultProviderMap<T>[K]>;
142
+ };
143
+
144
+ type EnabledCapabilityOverrideMap<T extends CommercetoolsCapabilities> = {
145
+ [K in OverridableCapabilityKey as T[K] extends { enabled: true } ? K : never]:
146
+ CapabilityProviderTypeMap<T>[K];
147
+ };
148
+
149
+ export type CommercetoolsClientFromCapabilities<
150
+ T extends CommercetoolsCapabilities,
151
+ > = Omit<
152
+ ClientFromCapabilities<NormalizeConfiguredCapabilities<T>>,
153
+ OverridableCapabilityKey
154
+ > &
155
+ EnabledCapabilityOverrideMap<T>;
156
+
157
+ export function resolveCapabilityProvider<TFactory, TProvider, TProviderArgs>(
158
+ capability:
159
+ | {
160
+ factory?: TFactory;
161
+ provider?: (args: TProviderArgs) => TProvider;
162
+ }
163
+ | undefined,
164
+ defaults: {
165
+ factory: TFactory;
166
+ provider: (args: TProviderArgs) => TProvider;
167
+ },
168
+ buildProviderArgs: (factory: TFactory) => TProviderArgs,
169
+ ): TProvider {
170
+ const factory = capability?.factory ?? defaults.factory;
171
+ const provider = capability?.provider ?? defaults.provider;
172
+
173
+ return provider(buildProviderArgs(factory));
174
+ }
@@ -0,0 +1,142 @@
1
+ import type { Cart as CTCart, LineItem } from '@commercetools/platform-sdk';
2
+ import type {
3
+ CartIdentifierSchema,
4
+ CartSchema} from '@reactionary/core';
5
+ import {
6
+ CartItemSchema,
7
+ type AnyCartIdentifierSchema,
8
+ type AnyCartSchema,
9
+ type Cart,
10
+ type CartFactory,
11
+ type CartIdentifier,
12
+ type CartItem,
13
+ type CostBreakDown,
14
+ type Currency,
15
+ type RequestContext,
16
+ } from '@reactionary/core';
17
+ import type * as z from 'zod';
18
+
19
+ export class CommercetoolsCartFactory<
20
+ TCartSchema extends AnyCartSchema = typeof CartSchema,
21
+ TCartIdentifierSchema extends AnyCartIdentifierSchema = typeof CartIdentifierSchema,
22
+ > implements CartFactory<TCartSchema, TCartIdentifierSchema>
23
+ {
24
+ public readonly cartSchema: TCartSchema;
25
+ public readonly cartIdentifierSchema: TCartIdentifierSchema;
26
+
27
+ constructor(cartSchema: TCartSchema, cartIdentifierSchema: TCartIdentifierSchema) {
28
+ this.cartSchema = cartSchema;
29
+ this.cartIdentifierSchema = cartIdentifierSchema;
30
+ }
31
+
32
+ public parseCartIdentifier(
33
+ _context: RequestContext,
34
+ data: { key?: string },
35
+ ): z.output<TCartIdentifierSchema> {
36
+ return this.cartIdentifierSchema.parse({
37
+ key: data.key || '',
38
+ } satisfies Partial<CartIdentifier>);
39
+ }
40
+
41
+ public parseCart(
42
+ context: RequestContext,
43
+ data: CTCart,
44
+ ): z.output<TCartSchema> {
45
+ const identifier = this.parseCartIdentifier(context, {
46
+ key: data.id,
47
+ });
48
+
49
+ const grandTotal = data.totalPrice.centAmount || 0;
50
+ const shippingTotal = data.shippingInfo?.price.centAmount || 0;
51
+ const productTotal = grandTotal - shippingTotal;
52
+ const taxTotal = data.taxedPrice?.totalTax?.centAmount || 0;
53
+ const discountTotal = data.discountOnTotalPrice?.discountedAmount.centAmount || 0;
54
+ const surchargeTotal = 0;
55
+ const currency = data.totalPrice.currencyCode as Currency;
56
+
57
+ const price = {
58
+ totalTax: {
59
+ value: taxTotal / 100,
60
+ currency,
61
+ },
62
+ totalDiscount: {
63
+ value: discountTotal / 100,
64
+ currency,
65
+ },
66
+ totalSurcharge: {
67
+ value: surchargeTotal / 100,
68
+ currency,
69
+ },
70
+ totalShipping: {
71
+ value: shippingTotal / 100,
72
+ currency,
73
+ },
74
+ totalProductPrice: {
75
+ value: productTotal / 100,
76
+ currency,
77
+ },
78
+ grandTotal: {
79
+ value: grandTotal / 100,
80
+ currency,
81
+ },
82
+ } satisfies CostBreakDown;
83
+
84
+ const items: CartItem[] = [];
85
+ for (const lineItem of data.lineItems) {
86
+ items.push(this.parseCartItem(lineItem));
87
+ }
88
+
89
+ const result = {
90
+ identifier,
91
+ userId: {
92
+ userId: '???',
93
+ },
94
+ name: data.custom?.fields['name'] || '',
95
+ description: data.custom?.fields['description'] || '',
96
+ price,
97
+ items,
98
+ appliedPromotions: [],
99
+ } satisfies Cart;
100
+
101
+ return this.cartSchema.parse(result);
102
+ }
103
+
104
+ protected parseCartItem(lineItem: LineItem): CartItem {
105
+ const unitPrice = lineItem.price.value.centAmount;
106
+ const totalPrice = lineItem.totalPrice.centAmount || 0;
107
+ const totalDiscount = lineItem.price.discounted?.value.centAmount || 0;
108
+ const unitDiscount = totalDiscount / lineItem.quantity;
109
+ const currency = lineItem.price.value.currencyCode.toUpperCase() as Currency;
110
+
111
+ return CartItemSchema.parse({
112
+ identifier: {
113
+ key: lineItem.id,
114
+ },
115
+ product: {
116
+ key: lineItem.productId,
117
+ },
118
+ variant: {
119
+ sku: lineItem.variant.sku || '',
120
+ },
121
+ quantity: lineItem.quantity,
122
+ price: {
123
+ unitPrice: {
124
+ value: unitPrice / 100,
125
+ currency,
126
+ },
127
+ unitDiscount: {
128
+ value: unitDiscount / 100,
129
+ currency,
130
+ },
131
+ totalPrice: {
132
+ value: totalPrice / 100,
133
+ currency,
134
+ },
135
+ totalDiscount: {
136
+ value: totalDiscount / 100,
137
+ currency,
138
+ },
139
+ },
140
+ } satisfies Partial<CartItem>);
141
+ }
142
+ }
@@ -0,0 +1,77 @@
1
+ import type { Category as CTCategory, CategoryPagedQueryResponse } from '@commercetools/platform-sdk';
2
+ import type {
3
+ CategoryPaginatedResultSchema,
4
+ CategorySchema} from '@reactionary/core';
5
+ import {
6
+ type AnyCategoryPaginatedResultSchema,
7
+ type AnyCategorySchema,
8
+ type Category,
9
+ type CategoryFactory,
10
+ type CategoryIdentifier,
11
+ type CategoryPaginatedResult,
12
+ type RequestContext,
13
+ } from '@reactionary/core';
14
+ import type * as z from 'zod';
15
+
16
+ export class CommercetoolsCategoryFactory<
17
+ TCategorySchema extends AnyCategorySchema = typeof CategorySchema,
18
+ TCategoryPaginatedSchema extends AnyCategoryPaginatedResultSchema = typeof CategoryPaginatedResultSchema,
19
+ > implements CategoryFactory<TCategorySchema, TCategoryPaginatedSchema>
20
+ {
21
+ public readonly categorySchema: TCategorySchema;
22
+ public readonly categoryPaginatedResultSchema: TCategoryPaginatedSchema;
23
+
24
+ constructor(
25
+ categorySchema: TCategorySchema,
26
+ categoryPaginatedResultSchema: TCategoryPaginatedSchema,
27
+ ) {
28
+ this.categorySchema = categorySchema;
29
+ this.categoryPaginatedResultSchema = categoryPaginatedResultSchema;
30
+ }
31
+
32
+ public parseCategory(
33
+ context: RequestContext,
34
+ data: CTCategory,
35
+ ): z.output<TCategorySchema> {
36
+ const identifier = { key: data.key || '' } satisfies CategoryIdentifier;
37
+ const result = {
38
+ identifier,
39
+ name: data.name[context.languageContext.locale] || 'No Name',
40
+ slug: data.slug ? data.slug[context.languageContext.locale] || '' : '',
41
+ text: data.description ? data.description[context.languageContext.locale] || '' : '',
42
+ parentCategory:
43
+ data.parent && data.parent.obj && data.parent.obj?.key
44
+ ? { key: data.parent.obj.key }
45
+ : undefined,
46
+ images: (data.assets || [])
47
+ .filter((asset) => asset.sources.length > 0)
48
+ .filter((asset) => asset.sources[0].contentType?.startsWith('image/'))
49
+ .map((asset) => ({
50
+ sourceUrl: asset.sources[0].uri,
51
+ altText:
52
+ asset.description?.[context.languageContext.locale] ||
53
+ asset.name[context.languageContext.locale] ||
54
+ '',
55
+ height: asset.sources[0].dimensions?.h || 0,
56
+ width: asset.sources[0].dimensions?.w || 0,
57
+ })),
58
+ } satisfies Category;
59
+
60
+ return this.categorySchema.parse(result);
61
+ }
62
+
63
+ public parseCategoryPaginatedResult(
64
+ context: RequestContext,
65
+ data: CategoryPagedQueryResponse,
66
+ ): z.output<TCategoryPaginatedSchema> {
67
+ const result = {
68
+ pageNumber: Math.floor(data.offset / data.count) + 1,
69
+ pageSize: data.count,
70
+ totalCount: data.total || 0,
71
+ totalPages: Math.ceil((data.total ?? 0) / data.count),
72
+ items: data.results.map((category) => this.parseCategory(context, category)),
73
+ } satisfies CategoryPaginatedResult;
74
+
75
+ return this.categoryPaginatedResultSchema.parse(result);
76
+ }
77
+ }
@@ -0,0 +1,94 @@
1
+ import type { Cart as CTCart } from "@commercetools/platform-sdk";
2
+ import {
3
+ CheckoutSchema,
4
+ PaymentMethodSchema,
5
+ ShippingMethodSchema,
6
+ type CheckoutQueryById,
7
+ type RequestContext,
8
+ unwrapValue,
9
+ } from "@reactionary/core";
10
+ import { withCommercetoolsCapabilities } from "../../core/initialize.js";
11
+ import { CommercetoolsCheckoutProvider } from "../../providers/checkout.provider.js";
12
+ import { assertNotAny, assertType } from "../product/utils.example.js";
13
+ import { CommercetoolsCheckoutFactory } from "./checkout.factory.js";
14
+ import * as z from "zod";
15
+
16
+ const cache = {} as any;
17
+ const context = {} as any;
18
+ const config = {} as any;
19
+
20
+ const ExtendedCheckoutSchema = CheckoutSchema.safeExtend({
21
+ extendedValue: z.string().default(""),
22
+ });
23
+
24
+ type ExtendedCheckout = z.output<typeof ExtendedCheckoutSchema>;
25
+
26
+ class ExtendedCommercetoolsCheckoutFactory extends CommercetoolsCheckoutFactory<
27
+ typeof ExtendedCheckoutSchema,
28
+ typeof ShippingMethodSchema,
29
+ typeof PaymentMethodSchema
30
+ > {
31
+ constructor() {
32
+ super(ExtendedCheckoutSchema, ShippingMethodSchema, PaymentMethodSchema);
33
+ }
34
+
35
+ public override parseCheckout(
36
+ context: RequestContext,
37
+ data: CTCart,
38
+ ): ExtendedCheckout {
39
+ const base = super.parseCheckout(context, data);
40
+ return {
41
+ ...base,
42
+ extendedValue: "from-factory",
43
+ };
44
+ }
45
+ }
46
+
47
+ class ExtendedCommercetoolsCheckoutProvider extends CommercetoolsCheckoutProvider<ExtendedCommercetoolsCheckoutFactory> {
48
+ public async getByIdOrThrow(payload: CheckoutQueryById): Promise<ExtendedCheckout> {
49
+ const result = await this.getById(payload);
50
+ return unwrapValue(result);
51
+ }
52
+ }
53
+
54
+ const extendedFactory = new ExtendedCommercetoolsCheckoutFactory();
55
+
56
+ const capabilityFactory = withCommercetoolsCapabilities(config, {
57
+ checkout: {
58
+ enabled: true,
59
+ factory: extendedFactory,
60
+ provider: ({ cache, context, config, commercetoolsApi }) =>
61
+ new ExtendedCommercetoolsCheckoutProvider(
62
+ config,
63
+ cache,
64
+ context,
65
+ commercetoolsApi,
66
+ extendedFactory,
67
+ ),
68
+ },
69
+ });
70
+
71
+ const client = capabilityFactory(cache, context);
72
+
73
+ client.checkout
74
+ .getById({
75
+ identifier: { key: "checkout-1" },
76
+ })
77
+ .then((result) => {
78
+ assertNotAny(result);
79
+ if (result.success) {
80
+ assertNotAny(result.value);
81
+ assertNotAny(result.value.extendedValue);
82
+ assertType<string>(result.value.extendedValue);
83
+ }
84
+ });
85
+
86
+ client.checkout
87
+ .getByIdOrThrow({
88
+ identifier: { key: "checkout-2" },
89
+ })
90
+ .then((checkout) => {
91
+ assertNotAny(checkout);
92
+ assertNotAny(checkout.extendedValue);
93
+ assertType<string>(checkout.extendedValue);
94
+ });