@reactionary/source 0.6.1 → 0.6.3

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 (453) hide show
  1. package/README.md +33 -11
  2. package/examples/node/package.json +7 -7
  3. package/examples/node/src/basic/basic-node-provider-model-extension.spec.ts +11 -5
  4. package/examples/node/src/basic/basic-node-provider-query-extension.spec.ts +9 -3
  5. package/examples/node/src/basic/basic-node-setup.spec.ts +6 -2
  6. package/examples/node/src/basic/client-creation.spec.ts +6 -6
  7. package/examples/node/src/utils.ts +48 -48
  8. package/examples/node/tsconfig.lib.json +2 -1
  9. package/package.json +1 -1
  10. package/packages/algolia/README.md +11 -0
  11. package/{providers/google-analytics → packages/algolia}/eslint.config.mjs +0 -2
  12. package/{providers → packages}/algolia/package.json +7 -5
  13. package/{providers/posthog → packages/algolia}/project.json +6 -6
  14. package/{providers/algolia/src/providers/analytics.provider.ts → packages/algolia/src/capabilities/analytics.capability.ts} +6 -6
  15. package/packages/algolia/src/capabilities/index.ts +3 -0
  16. package/{providers/algolia/src/providers/product-recommendations.provider.ts → packages/algolia/src/capabilities/product-recommendations.capability.ts} +3 -3
  17. package/packages/algolia/src/capabilities/product-search.capability.ts +119 -0
  18. package/packages/algolia/src/core/initialize.ts +82 -0
  19. package/packages/algolia/src/core/initialize.types.ts +107 -0
  20. package/packages/algolia/src/factories/index.ts +1 -0
  21. package/packages/algolia/src/factories/product-search/product-search.factory.ts +182 -0
  22. package/{providers/fake → packages/algolia}/src/index.ts +3 -2
  23. package/packages/algolia/src/schema/capabilities.schema.ts +84 -0
  24. package/{providers → packages}/algolia/src/test/analytics.spec.ts +12 -4
  25. package/packages/algolia/src/test/client-builder-product-search-extension.example.ts +85 -0
  26. package/packages/algolia/vite.config.ts +26 -0
  27. package/packages/algolia/vitest.config.mts +21 -0
  28. package/packages/commercetools/README.md +11 -0
  29. package/{core → packages/commercetools}/eslint.config.mjs +2 -2
  30. package/packages/commercetools/package.json +17 -0
  31. package/{providers → packages}/commercetools/project.json +7 -8
  32. package/{providers/commercetools/src/providers/cart.provider.ts → packages/commercetools/src/capabilities/cart.capability.ts} +68 -194
  33. package/{providers/commercetools/src/providers/category.provider.ts → packages/commercetools/src/capabilities/category.capability.ts} +26 -66
  34. package/{providers/commercetools/src/providers/checkout.provider.ts → packages/commercetools/src/capabilities/checkout.capability.ts} +51 -323
  35. package/{providers/commercetools/src/providers/identity.provider.ts → packages/commercetools/src/capabilities/identity.capability.ts} +36 -16
  36. package/packages/commercetools/src/capabilities/index.ts +15 -0
  37. package/{providers/commercetools/src/providers/inventory.provider.ts → packages/commercetools/src/capabilities/inventory.capability.ts} +14 -32
  38. package/packages/commercetools/src/capabilities/order-search.capability.ts +135 -0
  39. package/packages/commercetools/src/capabilities/order.capability.ts +67 -0
  40. package/{providers/commercetools/src/providers/price.provider.ts → packages/commercetools/src/capabilities/price.capability.ts} +38 -52
  41. package/{providers/commercetools/src/providers/product-associations.provider.ts → packages/commercetools/src/capabilities/product-associations.capability.ts} +40 -105
  42. package/{providers/commercetools/src/providers/product-list.provider.ts → packages/commercetools/src/capabilities/product-list.capability.ts} +39 -24
  43. package/{providers/commercetools/src/providers/product-reviews.provider.ts → packages/commercetools/src/capabilities/product-reviews.capability.ts} +35 -15
  44. package/{providers/commercetools/src/providers/product-search.provider.ts → packages/commercetools/src/capabilities/product-search.capability.ts} +18 -171
  45. package/packages/commercetools/src/capabilities/product.capability.ts +133 -0
  46. package/{providers/commercetools/src/providers/profile.provider.ts → packages/commercetools/src/capabilities/profile.capability.ts} +28 -74
  47. package/{providers/commercetools/src/providers/store.provider.ts → packages/commercetools/src/capabilities/store.capability.ts} +14 -32
  48. package/packages/commercetools/src/core/capability-descriptors.ts +324 -0
  49. package/{providers → packages}/commercetools/src/core/client.ts +2 -2
  50. package/packages/commercetools/src/core/initialize.ts +58 -0
  51. package/packages/commercetools/src/core/initialize.types.ts +174 -0
  52. package/packages/commercetools/src/factories/cart/cart.factory.ts +142 -0
  53. package/packages/commercetools/src/factories/category/category.factory.ts +77 -0
  54. package/packages/commercetools/src/factories/checkout/checkout-initializer-overrides.example.ts +94 -0
  55. package/packages/commercetools/src/factories/checkout/checkout.factory.ts +338 -0
  56. package/packages/commercetools/src/factories/identity/identity.factory.ts +26 -0
  57. package/packages/commercetools/src/factories/inventory/inventory.factory.ts +49 -0
  58. package/packages/commercetools/src/factories/order/order.factory.ts +149 -0
  59. package/packages/commercetools/src/factories/order-search/order-search.factory.ts +108 -0
  60. package/packages/commercetools/src/factories/price/price.factory.ts +76 -0
  61. package/packages/commercetools/src/factories/product/product-capability-custom-method-only.example.ts +47 -0
  62. package/packages/commercetools/src/factories/product/product-capability-schema-signature-extension.example.ts +61 -0
  63. package/packages/commercetools/src/factories/product/product-factory-baseline.example.ts +14 -0
  64. package/packages/commercetools/src/factories/product/product-factory-schema-and-parse-extension.example.ts +35 -0
  65. package/packages/commercetools/src/factories/product/product-factory-schema-extension.example.ts +23 -0
  66. package/packages/commercetools/src/factories/product/product-initializer-factory-extension.example.ts +41 -0
  67. package/packages/commercetools/src/factories/product/product.factory.ts +220 -0
  68. package/packages/commercetools/src/factories/product/utils.example.ts +9 -0
  69. package/packages/commercetools/src/factories/product-associations/product-associations.factory.ts +103 -0
  70. package/packages/commercetools/src/factories/product-list/product-list.factory.ts +122 -0
  71. package/packages/commercetools/src/factories/product-reviews/product-reviews.factory.ts +81 -0
  72. package/packages/commercetools/src/factories/product-search/product-search.factory.ts +182 -0
  73. package/packages/commercetools/src/factories/profile/profile.factory.ts +94 -0
  74. package/packages/commercetools/src/factories/store/store.factory.ts +49 -0
  75. package/packages/commercetools/src/index.ts +30 -0
  76. package/packages/commercetools/src/schema/capabilities.schema.ts +260 -0
  77. package/{providers → packages}/commercetools/src/test/caching.spec.ts +24 -8
  78. package/packages/commercetools/src/test/client-builder-merge-extensions.example.ts +125 -0
  79. package/{providers/algolia → packages/commercetools}/tsconfig.json +1 -1
  80. package/{core → packages/commercetools}/tsconfig.lib.json +1 -1
  81. package/packages/commercetools/tsconfig.spec.json +28 -0
  82. package/packages/commercetools/vite.config.ts +26 -0
  83. package/packages/commercetools/vitest.config.mts +21 -0
  84. package/{providers/fake → packages/core}/eslint.config.mjs +2 -1
  85. package/{core → packages/core}/package.json +7 -7
  86. package/packages/core/project.json +33 -0
  87. package/{core/src/providers/analytics.provider.ts → packages/core/src/capabilities/analytics.capability.ts} +8 -8
  88. package/{core/src/providers/base.provider.ts → packages/core/src/capabilities/base.capability.ts} +2 -2
  89. package/{core/src/providers/cart.provider.ts → packages/core/src/capabilities/cart.capability.ts} +13 -11
  90. package/{core/src/providers/category.provider.ts → packages/core/src/capabilities/category.capability.ts} +12 -10
  91. package/{core/src/providers/checkout.provider.ts → packages/core/src/capabilities/checkout.capability.ts} +15 -11
  92. package/{core/src/providers/identity.provider.ts → packages/core/src/capabilities/identity.capability.ts} +8 -8
  93. package/packages/core/src/capabilities/index.ts +18 -0
  94. package/{core/src/providers/inventory.provider.ts → packages/core/src/capabilities/inventory.capability.ts} +5 -5
  95. package/{core/src/providers/order-search.provider.ts → packages/core/src/capabilities/order-search.capability.ts} +5 -3
  96. package/{core/src/providers/order.provider.ts → packages/core/src/capabilities/order.capability.ts} +5 -5
  97. package/{core/src/providers/price.provider.ts → packages/core/src/capabilities/price.capability.ts} +6 -6
  98. package/{core/src/providers/product-associations.provider.ts → packages/core/src/capabilities/product-associations.capability.ts} +7 -5
  99. package/{core/src/providers/product-list.provider.ts → packages/core/src/capabilities/product-list.capability.ts} +14 -9
  100. package/{core/src/providers/product-recommendations.provider.ts → packages/core/src/capabilities/product-recommendations.capability.ts} +21 -21
  101. package/{core/src/providers/product-reviews.provider.ts → packages/core/src/capabilities/product-reviews.capability.ts} +9 -5
  102. package/packages/core/src/capabilities/product-search.capability.ts +48 -0
  103. package/{core/src/providers/product.provider.ts → packages/core/src/capabilities/product.capability.ts} +7 -7
  104. package/{core/src/providers/profile.provider.ts → packages/core/src/capabilities/profile.capability.ts} +9 -9
  105. package/{core/src/providers/store.provider.ts → packages/core/src/capabilities/store.capability.ts} +3 -3
  106. package/packages/core/src/client/client-builder.ts +131 -0
  107. package/packages/core/src/client/client.ts +35 -0
  108. package/{core → packages/core}/src/decorators/reactionary.decorator.ts +7 -7
  109. package/packages/core/src/factories/cart.factory.ts +40 -0
  110. package/packages/core/src/factories/category.factory.ts +40 -0
  111. package/packages/core/src/factories/checkout.factory.ts +59 -0
  112. package/packages/core/src/factories/identity.factory.ts +26 -0
  113. package/packages/core/src/factories/index.ts +15 -0
  114. package/packages/core/src/factories/inventory.factory.ts +26 -0
  115. package/packages/core/src/factories/order-search.factory.ts +33 -0
  116. package/packages/core/src/factories/order.factory.ts +21 -0
  117. package/packages/core/src/factories/price.factory.ts +29 -0
  118. package/packages/core/src/factories/product-associations.factory.ts +30 -0
  119. package/packages/core/src/factories/product-list.factory.ts +82 -0
  120. package/packages/core/src/factories/product-reviews.factory.ts +58 -0
  121. package/packages/core/src/factories/product-search.factory.ts +31 -0
  122. package/packages/core/src/factories/product.factory.ts +21 -0
  123. package/packages/core/src/factories/profile.factory.ts +23 -0
  124. package/packages/core/src/factories/store.factory.ts +21 -0
  125. package/packages/core/src/index.ts +8 -0
  126. package/packages/core/src/test/client-builder.spec.ts +141 -0
  127. package/{core → packages/core}/src/test/reactionary.decorator.spec.ts +27 -27
  128. package/{providers/meilisearch → packages/core}/tsconfig.json +1 -1
  129. package/{providers/medusa → packages/core}/tsconfig.lib.json +1 -2
  130. package/packages/core/tsconfig.spec.json +28 -0
  131. package/packages/core/vite.config.ts +26 -0
  132. package/packages/core/vitest.config.mts +21 -0
  133. package/packages/fake/README.md +11 -0
  134. package/{providers/algolia → packages/fake}/eslint.config.mjs +2 -1
  135. package/{providers → packages}/fake/package.json +6 -4
  136. package/{providers → packages}/fake/project.json +7 -8
  137. package/{providers/fake/src/providers/analytics.provider.ts → packages/fake/src/capabilities/analytics.capability.ts} +2 -2
  138. package/{providers/fake/src/providers/cart.provider.ts → packages/fake/src/capabilities/cart.capability.ts} +24 -15
  139. package/packages/fake/src/capabilities/category.capability.ts +199 -0
  140. package/{providers/fake/src/providers/checkout.provider.ts → packages/fake/src/capabilities/checkout.capability.ts} +40 -21
  141. package/{providers/fake/src/providers/identity.provider.ts → packages/fake/src/capabilities/identity.capability.ts} +40 -34
  142. package/packages/fake/src/capabilities/index.ts +15 -0
  143. package/packages/fake/src/capabilities/inventory.capability.ts +74 -0
  144. package/packages/fake/src/capabilities/order-search.capability.ts +86 -0
  145. package/{providers/fake/src/providers/order.provider.ts → packages/fake/src/capabilities/order.capability.ts} +22 -38
  146. package/{providers/fake/src/providers/price.provider.ts → packages/fake/src/capabilities/price.capability.ts} +42 -34
  147. package/{providers/fake/src/providers/product-associations.provider.ts → packages/fake/src/capabilities/product-associations.capability.ts} +24 -11
  148. package/{providers/fake/src/providers/product-reviews.provider.ts → packages/fake/src/capabilities/product-reviews.capability.ts} +72 -70
  149. package/{providers/fake/src/providers/product-search.provider.ts → packages/fake/src/capabilities/product-search.capability.ts} +44 -71
  150. package/{providers/fake/src/providers/product.provider.ts → packages/fake/src/capabilities/product.capability.ts} +35 -33
  151. package/packages/fake/src/capabilities/profile.capability.ts +154 -0
  152. package/packages/fake/src/capabilities/store.capability.ts +72 -0
  153. package/packages/fake/src/core/initialize.ts +274 -0
  154. package/packages/fake/src/core/initialize.types.ts +164 -0
  155. package/packages/fake/src/factories/cart/cart.factory.ts +34 -0
  156. package/packages/fake/src/factories/category/category.factory.ts +40 -0
  157. package/packages/fake/src/factories/checkout/checkout.factory.ts +53 -0
  158. package/packages/fake/src/factories/identity/identity.factory.ts +25 -0
  159. package/packages/fake/src/factories/index.ts +14 -0
  160. package/packages/fake/src/factories/inventory/inventory.factory.ts +25 -0
  161. package/packages/fake/src/factories/order/order.factory.ts +22 -0
  162. package/packages/fake/src/factories/order-search/order-search.factory.ts +27 -0
  163. package/packages/fake/src/factories/price/price.factory.ts +26 -0
  164. package/packages/fake/src/factories/product/product.factory.ts +22 -0
  165. package/packages/fake/src/factories/product-associations/product-associations.factory.ts +25 -0
  166. package/packages/fake/src/factories/product-reviews/product-reviews.factory.ts +53 -0
  167. package/packages/fake/src/factories/product-search/product-search.factory.ts +27 -0
  168. package/packages/fake/src/factories/profile/profile.factory.ts +22 -0
  169. package/packages/fake/src/factories/store/store.factory.ts +22 -0
  170. package/{providers/algolia → packages/fake}/src/index.ts +4 -3
  171. package/packages/fake/src/schema/capabilities.schema.ts +178 -0
  172. package/{providers/fake/src/test/cart.provider.spec.ts → packages/fake/src/test/cart.capability.spec.ts} +24 -7
  173. package/{providers/fake/src/test/category.provider.spec.ts → packages/fake/src/test/category.capability.spec.ts} +7 -4
  174. package/{providers/fake/src/test/checkout.provider.spec.ts → packages/fake/src/test/checkout.capability.spec.ts} +15 -5
  175. package/packages/fake/src/test/client-builder-product-extension.example.ts +75 -0
  176. package/{providers/fake/src/test/order-search.provider.spec.ts → packages/fake/src/test/order-search.capability.spec.ts} +7 -10
  177. package/{providers/fake/src/test/order.provider.spec.ts → packages/fake/src/test/order.capability.spec.ts} +7 -9
  178. package/{providers/fake/src/test/price.provider.spec.ts → packages/fake/src/test/price.capability.spec.ts} +6 -4
  179. package/{providers/fake/src/test/product.provider.spec.ts → packages/fake/src/test/product.capability.spec.ts} +10 -4
  180. package/{providers/fake/src/test/profile.provider.spec.ts → packages/fake/src/test/profile.capability.spec.ts} +7 -5
  181. package/{providers/commercetools → packages/fake}/tsconfig.json +1 -1
  182. package/packages/fake/tsconfig.lib.json +23 -0
  183. package/packages/fake/tsconfig.spec.json +28 -0
  184. package/packages/fake/vite.config.ts +26 -0
  185. package/packages/fake/vitest.config.mts +21 -0
  186. package/packages/google-analytics/eslint.config.mjs +23 -0
  187. package/{providers → packages}/google-analytics/package.json +7 -5
  188. package/{providers → packages}/google-analytics/project.json +5 -5
  189. package/{providers/google-analytics/src/providers/analytics.provider.ts → packages/google-analytics/src/capabilities/analytics.capability.ts} +2 -2
  190. package/packages/google-analytics/src/core/initialize.ts +41 -0
  191. package/packages/google-analytics/src/core/initialize.types.ts +47 -0
  192. package/{providers → packages}/google-analytics/src/index.ts +2 -1
  193. package/packages/google-analytics/src/schema/capabilities.schema.ts +36 -0
  194. package/{providers/google-analytics/src/test/analytics.provider.spec.ts → packages/google-analytics/src/test/analytics.capability.spec.ts} +7 -7
  195. package/packages/google-analytics/tsconfig.json +24 -0
  196. package/packages/google-analytics/tsconfig.lib.json +23 -0
  197. package/packages/google-analytics/tsconfig.spec.json +28 -0
  198. package/{providers → packages}/google-analytics/vite.config.ts +2 -2
  199. package/{providers → packages}/google-analytics/vitest.config.mts +2 -2
  200. package/packages/medusa/README.md +11 -0
  201. package/packages/medusa/eslint.config.mjs +23 -0
  202. package/packages/medusa/package.json +17 -0
  203. package/{providers → packages}/medusa/project.json +7 -8
  204. package/{providers/medusa/src/providers/cart.provider.ts → packages/medusa/src/capabilities/cart.capability.ts} +34 -21
  205. package/{providers/medusa/src/providers/category.provider.ts → packages/medusa/src/capabilities/category.capability.ts} +31 -13
  206. package/{providers/medusa/src/providers/checkout.provider.ts → packages/medusa/src/capabilities/checkout.capability.ts} +43 -18
  207. package/{providers/medusa/src/providers/identity.provider.ts → packages/medusa/src/capabilities/identity.capability.ts} +3 -3
  208. package/{providers/medusa/src/providers/inventory.provider.ts → packages/medusa/src/capabilities/inventory.capability.ts} +22 -8
  209. package/{providers/medusa/src/providers/order-search.provider.ts → packages/medusa/src/capabilities/order-search.capability.ts} +17 -6
  210. package/{providers/medusa/src/providers/order.provider.ts → packages/medusa/src/capabilities/order.capability.ts} +18 -6
  211. package/{providers/medusa/src/providers/price.provider.ts → packages/medusa/src/capabilities/price.capability.ts} +27 -8
  212. package/{providers/medusa/src/providers/product-associations.provider.ts → packages/medusa/src/capabilities/product-associations.capability.ts} +20 -9
  213. package/{providers/medusa/src/providers/product-recommendations.provider.ts → packages/medusa/src/capabilities/product-recommendations.capability.ts} +3 -3
  214. package/{providers/medusa/src/providers/product-search.provider.ts → packages/medusa/src/capabilities/product-search.capability.ts} +20 -32
  215. package/{providers/medusa/src/providers/product.provider.ts → packages/medusa/src/capabilities/product.capability.ts} +48 -12
  216. package/{providers/medusa/src/providers/profile.provider.ts → packages/medusa/src/capabilities/profile.capability.ts} +37 -13
  217. package/packages/medusa/src/core/initialize.ts +330 -0
  218. package/packages/medusa/src/core/initialize.types.ts +184 -0
  219. package/packages/medusa/src/factories/cart/cart.factory.ts +34 -0
  220. package/packages/medusa/src/factories/category/category.factory.ts +37 -0
  221. package/packages/medusa/src/factories/checkout/checkout.factory.ts +50 -0
  222. package/packages/medusa/src/factories/identity/identity.factory.ts +22 -0
  223. package/packages/medusa/src/factories/index.ts +12 -0
  224. package/packages/medusa/src/factories/inventory/inventory.factory.ts +25 -0
  225. package/packages/medusa/src/factories/order/order.factory.ts +22 -0
  226. package/packages/medusa/src/factories/order-search/order-search.factory.ts +27 -0
  227. package/packages/medusa/src/factories/price/price.factory.ts +26 -0
  228. package/packages/medusa/src/factories/product/product.factory.ts +22 -0
  229. package/packages/medusa/src/factories/product-associations/product-associations.factory.ts +25 -0
  230. package/packages/medusa/src/factories/product-search/product-search.factory.ts +27 -0
  231. package/packages/medusa/src/factories/profile/profile.factory.ts +22 -0
  232. package/packages/medusa/src/index.ts +17 -0
  233. package/packages/medusa/src/schema/capabilities.schema.ts +231 -0
  234. package/{providers/medusa/src/test/cart.provider.spec.ts → packages/medusa/src/test/cart.capability.spec.ts} +20 -4
  235. package/{providers/medusa/src/test/category.provider.spec.ts → packages/medusa/src/test/category.capability.spec.ts} +7 -4
  236. package/{providers → packages}/medusa/src/test/checkout.spec.ts +9 -9
  237. package/{providers/medusa/src/test/identity.provider.spec.ts → packages/medusa/src/test/identity.capability.spec.ts} +3 -3
  238. package/{providers/medusa/src/test/inventory.provider.spec.ts → packages/medusa/src/test/inventory.capability.spec.ts} +6 -4
  239. package/{providers/medusa/src/test/large-cart.provider.spec.ts → packages/medusa/src/test/large-cart.capability.spec.ts} +14 -8
  240. package/{providers/medusa/src/test/price.provider.spec.ts → packages/medusa/src/test/price.capability.spec.ts} +10 -3
  241. package/{providers/medusa/src/test/product.provider.spec.ts → packages/medusa/src/test/product.capability.spec.ts} +6 -4
  242. package/{providers/medusa/src/test/search.provider.spec.ts → packages/medusa/src/test/search.capability.spec.ts} +20 -7
  243. package/{providers → packages}/medusa/src/utils/medusa-helpers.ts +1 -1
  244. package/packages/medusa/tsconfig.json +24 -0
  245. package/packages/medusa/tsconfig.lib.json +23 -0
  246. package/packages/medusa/tsconfig.spec.json +28 -0
  247. package/packages/medusa/vite.config.ts +26 -0
  248. package/packages/medusa/vitest.config.mts +21 -0
  249. package/packages/meilisearch/README.md +11 -0
  250. package/packages/meilisearch/eslint.config.mjs +23 -0
  251. package/packages/meilisearch/package.json +15 -0
  252. package/{providers → packages}/meilisearch/project.json +7 -8
  253. package/packages/meilisearch/src/capabilities/index.ts +3 -0
  254. package/{providers/meilisearch/src/providers/order-search.provider.ts → packages/meilisearch/src/capabilities/order-search.capability.ts} +22 -7
  255. package/{providers/meilisearch/src/providers/product-recommendations.provider.ts → packages/meilisearch/src/capabilities/product-recommendations.capability.ts} +3 -3
  256. package/{providers/meilisearch/src/providers/product-search.provider.ts → packages/meilisearch/src/capabilities/product-search.capability.ts} +25 -9
  257. package/packages/meilisearch/src/core/initialize.ts +94 -0
  258. package/packages/meilisearch/src/core/initialize.types.ts +119 -0
  259. package/packages/meilisearch/src/factories/index.ts +2 -0
  260. package/packages/meilisearch/src/factories/order-search/order-search.factory.ts +27 -0
  261. package/packages/meilisearch/src/factories/product-search/product-search.factory.ts +27 -0
  262. package/packages/meilisearch/src/index.ts +9 -0
  263. package/packages/meilisearch/src/schema/capabilities.schema.ts +98 -0
  264. package/packages/meilisearch/tsconfig.json +24 -0
  265. package/packages/meilisearch/tsconfig.lib.json +23 -0
  266. package/packages/meilisearch/tsconfig.spec.json +28 -0
  267. package/packages/meilisearch/vite.config.ts +26 -0
  268. package/packages/meilisearch/vitest.config.mts +21 -0
  269. package/tsconfig.base.json +13 -21
  270. package/core/project.json +0 -34
  271. package/core/src/client/client-builder.ts +0 -84
  272. package/core/src/client/client.ts +0 -35
  273. package/core/src/index.ts +0 -6
  274. package/core/src/providers/index.ts +0 -18
  275. package/core/src/providers/product-search.provider.ts +0 -61
  276. package/core/src/test/client-builder.spec.ts +0 -60
  277. package/core/tsconfig.json +0 -24
  278. package/core/tsconfig.spec.json +0 -4
  279. package/core/vitest.config.ts +0 -14
  280. package/providers/algolia/README.md +0 -56
  281. package/providers/algolia/project.json +0 -34
  282. package/providers/algolia/src/core/initialize.ts +0 -27
  283. package/providers/algolia/src/providers/index.ts +0 -3
  284. package/providers/algolia/src/providers/product-search.provider.ts +0 -236
  285. package/providers/algolia/src/schema/capabilities.schema.ts +0 -10
  286. package/providers/algolia/tsconfig.lib.json +0 -10
  287. package/providers/algolia/tsconfig.spec.json +0 -4
  288. package/providers/algolia/vitest.config.ts +0 -14
  289. package/providers/commercetools/README.md +0 -65
  290. package/providers/commercetools/eslint.config.mjs +0 -22
  291. package/providers/commercetools/package.json +0 -15
  292. package/providers/commercetools/src/core/initialize.ts +0 -174
  293. package/providers/commercetools/src/index.ts +0 -15
  294. package/providers/commercetools/src/providers/index.ts +0 -15
  295. package/providers/commercetools/src/providers/order-search.provider.ts +0 -229
  296. package/providers/commercetools/src/providers/order.provider.ts +0 -198
  297. package/providers/commercetools/src/providers/product.provider.ts +0 -312
  298. package/providers/commercetools/src/schema/capabilities.schema.ts +0 -22
  299. package/providers/commercetools/tsconfig.lib.json +0 -10
  300. package/providers/commercetools/tsconfig.spec.json +0 -4
  301. package/providers/commercetools/vitest.config.ts +0 -15
  302. package/providers/fake/README.md +0 -23
  303. package/providers/fake/src/core/initialize.ts +0 -105
  304. package/providers/fake/src/providers/category.provider.ts +0 -184
  305. package/providers/fake/src/providers/index.ts +0 -15
  306. package/providers/fake/src/providers/inventory.provider.ts +0 -72
  307. package/providers/fake/src/providers/order-search.provider.ts +0 -78
  308. package/providers/fake/src/providers/profile.provider.ts +0 -147
  309. package/providers/fake/src/providers/store.provider.ts +0 -56
  310. package/providers/fake/src/schema/capabilities.schema.ts +0 -21
  311. package/providers/fake/tsconfig.json +0 -25
  312. package/providers/fake/tsconfig.lib.json +0 -11
  313. package/providers/fake/tsconfig.spec.json +0 -4
  314. package/providers/fake/vitest.config.ts +0 -14
  315. package/providers/google-analytics/src/core/initialize.ts +0 -16
  316. package/providers/google-analytics/src/schema/capabilities.schema.ts +0 -10
  317. package/providers/medusa/README.md +0 -30
  318. package/providers/medusa/TESTING.md +0 -98
  319. package/providers/medusa/eslint.config.mjs +0 -19
  320. package/providers/medusa/package.json +0 -15
  321. package/providers/medusa/src/core/initialize.ts +0 -87
  322. package/providers/medusa/src/index.ts +0 -15
  323. package/providers/medusa/src/schema/capabilities.schema.ts +0 -20
  324. package/providers/medusa/tsconfig.json +0 -24
  325. package/providers/medusa/tsconfig.spec.json +0 -4
  326. package/providers/medusa/vitest.config.ts +0 -15
  327. package/providers/meilisearch/README.md +0 -48
  328. package/providers/meilisearch/eslint.config.mjs +0 -22
  329. package/providers/meilisearch/package.json +0 -13
  330. package/providers/meilisearch/src/core/initialize.ts +0 -27
  331. package/providers/meilisearch/src/index.ts +0 -7
  332. package/providers/meilisearch/src/providers/index.ts +0 -2
  333. package/providers/meilisearch/src/schema/capabilities.schema.ts +0 -11
  334. package/providers/meilisearch/tsconfig.lib.json +0 -10
  335. package/providers/meilisearch/tsconfig.spec.json +0 -4
  336. package/providers/meilisearch/vitest.config.ts +0 -14
  337. package/providers/posthog/README.md +0 -7
  338. package/providers/posthog/eslint.config.mjs +0 -22
  339. package/providers/posthog/package.json +0 -12
  340. package/providers/posthog/src/core/initialize.ts +0 -11
  341. package/providers/posthog/src/index.ts +0 -4
  342. package/providers/posthog/src/schema/capabilities.schema.ts +0 -8
  343. package/providers/posthog/src/schema/configuration.schema.ts +0 -8
  344. package/providers/posthog/tsconfig.json +0 -21
  345. package/providers/posthog/tsconfig.lib.json +0 -9
  346. /package/{providers → packages}/algolia/src/schema/configuration.schema.ts +0 -0
  347. /package/{providers → packages}/algolia/src/schema/index.ts +0 -0
  348. /package/{providers → packages}/algolia/src/schema/product-recommendation.schema.ts +0 -0
  349. /package/{providers → packages}/algolia/src/schema/search.schema.ts +0 -0
  350. /package/{providers/google-analytics → packages/algolia}/tsconfig.json +0 -0
  351. /package/{providers/google-analytics → packages/algolia}/tsconfig.lib.json +0 -0
  352. /package/{providers/google-analytics → packages/algolia}/tsconfig.spec.json +0 -0
  353. /package/{providers → packages}/commercetools/src/core/token-cache.ts +0 -0
  354. /package/{providers → packages}/commercetools/src/schema/commercetools.schema.ts +0 -0
  355. /package/{providers → packages}/commercetools/src/schema/configuration.schema.ts +0 -0
  356. /package/{providers → packages}/commercetools/src/schema/session.schema.ts +0 -0
  357. /package/{providers → packages}/commercetools/src/test/identity.spec.ts +0 -0
  358. /package/{providers → packages}/commercetools/src/test/test-utils.ts +0 -0
  359. /package/{core → packages/core}/README.md +0 -0
  360. /package/{core → packages/core}/src/cache/cache.interface.ts +0 -0
  361. /package/{core → packages/core}/src/cache/index.ts +0 -0
  362. /package/{core → packages/core}/src/cache/memory-cache.ts +0 -0
  363. /package/{core → packages/core}/src/cache/noop-cache.ts +0 -0
  364. /package/{core → packages/core}/src/cache/redis-cache.ts +0 -0
  365. /package/{core → packages/core}/src/client/index.ts +0 -0
  366. /package/{core → packages/core}/src/decorators/index.ts +0 -0
  367. /package/{core → packages/core}/src/initialization.ts +0 -0
  368. /package/{core → packages/core}/src/metrics/metrics.ts +0 -0
  369. /package/{core → packages/core}/src/schemas/capabilities.schema.ts +0 -0
  370. /package/{core → packages/core}/src/schemas/errors/generic.error.ts +0 -0
  371. /package/{core → packages/core}/src/schemas/errors/index.ts +0 -0
  372. /package/{core → packages/core}/src/schemas/errors/invalid-input.error.ts +0 -0
  373. /package/{core → packages/core}/src/schemas/errors/invalid-output.error.ts +0 -0
  374. /package/{core → packages/core}/src/schemas/errors/not-found.error.ts +0 -0
  375. /package/{core → packages/core}/src/schemas/index.ts +0 -0
  376. /package/{core → packages/core}/src/schemas/models/analytics.model.ts +0 -0
  377. /package/{core → packages/core}/src/schemas/models/base.model.ts +0 -0
  378. /package/{core → packages/core}/src/schemas/models/cart.model.ts +0 -0
  379. /package/{core → packages/core}/src/schemas/models/category.model.ts +0 -0
  380. /package/{core → packages/core}/src/schemas/models/checkout.model.ts +0 -0
  381. /package/{core → packages/core}/src/schemas/models/cost.model.ts +0 -0
  382. /package/{core → packages/core}/src/schemas/models/currency.model.ts +0 -0
  383. /package/{core → packages/core}/src/schemas/models/identifiers.model.ts +0 -0
  384. /package/{core → packages/core}/src/schemas/models/identity.model.ts +0 -0
  385. /package/{core → packages/core}/src/schemas/models/index.ts +0 -0
  386. /package/{core → packages/core}/src/schemas/models/inventory.model.ts +0 -0
  387. /package/{core → packages/core}/src/schemas/models/order-search.model.ts +0 -0
  388. /package/{core → packages/core}/src/schemas/models/order.model.ts +0 -0
  389. /package/{core → packages/core}/src/schemas/models/payment.model.ts +0 -0
  390. /package/{core → packages/core}/src/schemas/models/price.model.ts +0 -0
  391. /package/{core → packages/core}/src/schemas/models/product-associations.model.ts +0 -0
  392. /package/{core → packages/core}/src/schemas/models/product-list.model.ts +0 -0
  393. /package/{core → packages/core}/src/schemas/models/product-recommendations.model.ts +0 -0
  394. /package/{core → packages/core}/src/schemas/models/product-reviews.model.ts +0 -0
  395. /package/{core → packages/core}/src/schemas/models/product-search.model.ts +0 -0
  396. /package/{core → packages/core}/src/schemas/models/product.model.ts +0 -0
  397. /package/{core → packages/core}/src/schemas/models/profile.model.ts +0 -0
  398. /package/{core → packages/core}/src/schemas/models/shipping-method.model.ts +0 -0
  399. /package/{core → packages/core}/src/schemas/models/store.model.ts +0 -0
  400. /package/{core → packages/core}/src/schemas/mutations/analytics/index.ts +0 -0
  401. /package/{core → packages/core}/src/schemas/mutations/analytics/product-add-to-cart.mutation.ts +0 -0
  402. /package/{core → packages/core}/src/schemas/mutations/analytics/product-details-view.mutation.ts +0 -0
  403. /package/{core → packages/core}/src/schemas/mutations/analytics/product-summary-click.mutation.ts +0 -0
  404. /package/{core → packages/core}/src/schemas/mutations/analytics/product-summary-view.mutation.ts +0 -0
  405. /package/{core → packages/core}/src/schemas/mutations/analytics/purchase.mutation.ts +0 -0
  406. /package/{core → packages/core}/src/schemas/mutations/base.mutation.ts +0 -0
  407. /package/{core → packages/core}/src/schemas/mutations/cart.mutation.ts +0 -0
  408. /package/{core → packages/core}/src/schemas/mutations/checkout.mutation.ts +0 -0
  409. /package/{core → packages/core}/src/schemas/mutations/identity.mutation.ts +0 -0
  410. /package/{core → packages/core}/src/schemas/mutations/index.ts +0 -0
  411. /package/{core → packages/core}/src/schemas/mutations/inventory.mutation.ts +0 -0
  412. /package/{core → packages/core}/src/schemas/mutations/price.mutation.ts +0 -0
  413. /package/{core → packages/core}/src/schemas/mutations/product-list.mutation.ts +0 -0
  414. /package/{core → packages/core}/src/schemas/mutations/product-reviews.mutation.ts +0 -0
  415. /package/{core → packages/core}/src/schemas/mutations/product.mutation.ts +0 -0
  416. /package/{core → packages/core}/src/schemas/mutations/profile.mutation.ts +0 -0
  417. /package/{core → packages/core}/src/schemas/mutations/search.mutation.ts +0 -0
  418. /package/{core → packages/core}/src/schemas/queries/analytics.query.ts +0 -0
  419. /package/{core → packages/core}/src/schemas/queries/base.query.ts +0 -0
  420. /package/{core → packages/core}/src/schemas/queries/cart.query.ts +0 -0
  421. /package/{core → packages/core}/src/schemas/queries/category.query.ts +0 -0
  422. /package/{core → packages/core}/src/schemas/queries/checkout.query.ts +0 -0
  423. /package/{core → packages/core}/src/schemas/queries/identity.query.ts +0 -0
  424. /package/{core → packages/core}/src/schemas/queries/index.ts +0 -0
  425. /package/{core → packages/core}/src/schemas/queries/inventory.query.ts +0 -0
  426. /package/{core → packages/core}/src/schemas/queries/order-search.query.ts +0 -0
  427. /package/{core → packages/core}/src/schemas/queries/order.query.ts +0 -0
  428. /package/{core → packages/core}/src/schemas/queries/price.query.ts +0 -0
  429. /package/{core → packages/core}/src/schemas/queries/product-associations.query.ts +0 -0
  430. /package/{core → packages/core}/src/schemas/queries/product-list.query.ts +0 -0
  431. /package/{core → packages/core}/src/schemas/queries/product-recommendations.query.ts +0 -0
  432. /package/{core → packages/core}/src/schemas/queries/product-reviews.query.ts +0 -0
  433. /package/{core → packages/core}/src/schemas/queries/product-search.query.ts +0 -0
  434. /package/{core → packages/core}/src/schemas/queries/product.query.ts +0 -0
  435. /package/{core → packages/core}/src/schemas/queries/profile.query.ts +0 -0
  436. /package/{core → packages/core}/src/schemas/queries/store.query.ts +0 -0
  437. /package/{core → packages/core}/src/schemas/result.ts +0 -0
  438. /package/{core → packages/core}/src/schemas/session.schema.ts +0 -0
  439. /package/{core → packages/core}/src/test/request-context.spec.ts +0 -0
  440. /package/{core → packages/core}/src/zod-utils.ts +0 -0
  441. /package/{providers → packages}/fake/src/schema/configuration.schema.ts +0 -0
  442. /package/{providers → packages}/fake/src/test/test-utils.ts +0 -0
  443. /package/{providers → packages}/fake/src/utilities/jitter.ts +0 -0
  444. /package/{providers → packages}/fake/src/utilities/seed.ts +0 -0
  445. /package/{providers → packages}/google-analytics/README.md +0 -0
  446. /package/{providers → packages}/google-analytics/src/schema/configuration.schema.ts +0 -0
  447. /package/{providers → packages}/medusa/src/core/client.ts +0 -0
  448. /package/{providers → packages}/medusa/src/schema/configuration.schema.ts +0 -0
  449. /package/{providers → packages}/medusa/src/schema/medusa.schema.ts +0 -0
  450. /package/{providers → packages}/medusa/src/test/test-utils.ts +0 -0
  451. /package/{providers → packages}/meilisearch/src/schema/configuration.schema.ts +0 -0
  452. /package/{providers → packages}/meilisearch/src/schema/index.ts +0 -0
  453. /package/{providers → packages}/meilisearch/src/schema/search.schema.ts +0 -0
@@ -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 { CommercetoolsCheckoutCapability } from "../../capabilities/checkout.capability.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 ExtendedCommercetoolsCheckoutCapability extends CommercetoolsCheckoutCapability<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
+ capability: ({ cache, context, config, commercetoolsApi }) =>
61
+ new ExtendedCommercetoolsCheckoutCapability(
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
+ });
@@ -0,0 +1,338 @@
1
+ import type {
2
+ Address as CTAddress,
3
+ Cart as CTCart,
4
+ LineItem,
5
+ Payment as CTPayment,
6
+ ShippingMethod as CTShippingMethod,
7
+ } from '@commercetools/platform-sdk';
8
+ import type {
9
+ CheckoutSchema,
10
+ PaymentMethodSchema,
11
+ ShippingMethodSchema} from '@reactionary/core';
12
+ import {
13
+ CheckoutItemSchema,
14
+ type Address,
15
+ type AnyCheckoutSchema,
16
+ type AnyPaymentMethodSchema,
17
+ type AnyShippingMethodSchema,
18
+ type Checkout,
19
+ type CheckoutFactory,
20
+ type CheckoutIdentifier,
21
+ type CheckoutItem,
22
+ type CostBreakDown,
23
+ type Currency,
24
+ type MonetaryAmount,
25
+ type PaymentInstruction,
26
+ type PaymentInstructionIdentifier,
27
+ type PaymentMethod,
28
+ type PaymentMethodIdentifier,
29
+ type PaymentStatus,
30
+ type RequestContext,
31
+ type ShippingInstruction,
32
+ type ShippingMethod,
33
+ type ShippingMethodIdentifier,
34
+ } from '@reactionary/core';
35
+ import type * as z from 'zod';
36
+ import type {
37
+ CommercetoolsCartIdentifier,
38
+ CommercetoolsCheckoutIdentifier,
39
+ } from '../../schema/commercetools.schema.js';
40
+
41
+ export class CommercetoolsCheckoutFactory<
42
+ TCheckoutSchema extends AnyCheckoutSchema = typeof CheckoutSchema,
43
+ TShippingMethodSchema extends AnyShippingMethodSchema = typeof ShippingMethodSchema,
44
+ TPaymentMethodSchema extends AnyPaymentMethodSchema = typeof PaymentMethodSchema,
45
+ > implements
46
+ CheckoutFactory<TCheckoutSchema, TShippingMethodSchema, TPaymentMethodSchema>
47
+ {
48
+ public readonly checkoutSchema: TCheckoutSchema;
49
+ public readonly shippingMethodSchema: TShippingMethodSchema;
50
+ public readonly paymentMethodSchema: TPaymentMethodSchema;
51
+
52
+ constructor(
53
+ checkoutSchema: TCheckoutSchema,
54
+ shippingMethodSchema: TShippingMethodSchema,
55
+ paymentMethodSchema: TPaymentMethodSchema,
56
+ ) {
57
+ this.checkoutSchema = checkoutSchema;
58
+ this.shippingMethodSchema = shippingMethodSchema;
59
+ this.paymentMethodSchema = paymentMethodSchema;
60
+ }
61
+
62
+ public parseCheckout(
63
+ context: RequestContext,
64
+ data: CTCart,
65
+ ): z.output<TCheckoutSchema> {
66
+ const identifier = {
67
+ key: data.id,
68
+ version: data.version || 0,
69
+ } satisfies CommercetoolsCheckoutIdentifier;
70
+
71
+ const originalCartReference = {
72
+ key: data.custom?.fields['commerceToolsCartId'] || '',
73
+ version: 0,
74
+ } satisfies CommercetoolsCartIdentifier;
75
+
76
+ let shippingAddress: Address | undefined;
77
+ if (data.shippingAddress) {
78
+ shippingAddress = this.parseAddress(data.shippingAddress);
79
+ }
80
+
81
+ let billingAddress: Address | undefined;
82
+ if (data.billingAddress) {
83
+ billingAddress = this.parseAddress(data.billingAddress);
84
+ }
85
+
86
+ const paymentInstructions: PaymentInstruction[] = [];
87
+ for (const payment of data.paymentInfo?.payments || []) {
88
+ if (payment.obj) {
89
+ paymentInstructions.push(this.parsePaymentInstruction(context, payment.obj));
90
+ }
91
+ }
92
+
93
+ const grandTotal = data.totalPrice.centAmount || 0;
94
+ const shippingTotal = data.shippingInfo?.price.centAmount || 0;
95
+ const productTotal = grandTotal - shippingTotal;
96
+ const taxTotal = data.taxedPrice?.totalTax?.centAmount || 0;
97
+ const discountTotal = data.discountOnTotalPrice?.discountedAmount.centAmount || 0;
98
+ const surchargeTotal = 0;
99
+ const currency = data.totalPrice.currencyCode as Currency;
100
+
101
+ const price = {
102
+ totalTax: {
103
+ value: taxTotal / 100,
104
+ currency,
105
+ },
106
+ totalDiscount: {
107
+ value: discountTotal / 100,
108
+ currency,
109
+ },
110
+ totalSurcharge: {
111
+ value: surchargeTotal / 100,
112
+ currency,
113
+ },
114
+ totalShipping: {
115
+ value: shippingTotal / 100,
116
+ currency,
117
+ },
118
+ totalProductPrice: {
119
+ value: productTotal / 100,
120
+ currency,
121
+ },
122
+ grandTotal: {
123
+ value: grandTotal / 100,
124
+ currency,
125
+ },
126
+ } satisfies CostBreakDown;
127
+
128
+ const items: CheckoutItem[] = [];
129
+ for (const lineItem of data.lineItems) {
130
+ items.push(this.parseCheckoutItem(lineItem));
131
+ }
132
+
133
+ const shippingInstruction = this.parseShippingInstruction(data);
134
+ const readyForFinalization = this.isReadyForFinalization(
135
+ price,
136
+ paymentInstructions,
137
+ billingAddress,
138
+ shippingAddress,
139
+ shippingInstruction,
140
+ );
141
+
142
+ const result = {
143
+ identifier,
144
+ originalCartReference,
145
+ name: data.custom?.fields['name'] || '',
146
+ description: data.custom?.fields['description'] || '',
147
+ readyForFinalization,
148
+ billingAddress,
149
+ shippingAddress,
150
+ shippingInstruction,
151
+ paymentInstructions,
152
+ items,
153
+ price,
154
+ } satisfies Checkout;
155
+
156
+ return this.checkoutSchema.parse(result);
157
+ }
158
+
159
+ public parseShippingMethod(
160
+ context: RequestContext,
161
+ data: CTShippingMethod,
162
+ ): z.output<TShippingMethodSchema> {
163
+ const identifier = {
164
+ key: data.key || '',
165
+ } satisfies ShippingMethodIdentifier;
166
+
167
+ const result = {
168
+ deliveryTime: '',
169
+ description: data.localizedDescription?.[context.languageContext.locale] || '',
170
+ identifier,
171
+ name: data.name,
172
+ price: data.zoneRates[0].shippingRates[0].price
173
+ ? {
174
+ value: (data.zoneRates[0].shippingRates[0].price.centAmount || 0) / 100,
175
+ currency:
176
+ (data.zoneRates[0].shippingRates[0].price.currencyCode as Currency) ||
177
+ context.languageContext.currencyCode,
178
+ }
179
+ : { value: 0, currency: context.languageContext.currencyCode },
180
+ } satisfies ShippingMethod;
181
+
182
+ return this.shippingMethodSchema.parse(result);
183
+ }
184
+
185
+ public parsePaymentMethod(
186
+ _context: RequestContext,
187
+ data: PaymentMethod,
188
+ ): z.output<TPaymentMethodSchema> {
189
+ return this.paymentMethodSchema.parse(data);
190
+ }
191
+
192
+ protected parseCheckoutItem(remoteItem: LineItem): CheckoutItem {
193
+ const unitPrice = remoteItem.price.value.centAmount;
194
+ const totalPrice = remoteItem.totalPrice.centAmount || 0;
195
+ const totalDiscount = remoteItem.price.discounted?.value.centAmount || 0;
196
+ const unitDiscount = totalDiscount / remoteItem.quantity;
197
+ const currency = remoteItem.price.value.currencyCode.toUpperCase() as Currency;
198
+
199
+ const item = {
200
+ identifier: {
201
+ key: remoteItem.id,
202
+ },
203
+ variant: {
204
+ sku: remoteItem.variant.sku || '',
205
+ },
206
+ quantity: remoteItem.quantity,
207
+ price: {
208
+ unitPrice: {
209
+ value: unitPrice / 100,
210
+ currency,
211
+ },
212
+ unitDiscount: {
213
+ value: unitDiscount / 100,
214
+ currency,
215
+ },
216
+ totalPrice: {
217
+ value: totalPrice / 100,
218
+ currency,
219
+ },
220
+ totalDiscount: {
221
+ value: totalDiscount / 100,
222
+ currency,
223
+ },
224
+ },
225
+ } satisfies CheckoutItem;
226
+
227
+ return CheckoutItemSchema.parse(item);
228
+ }
229
+
230
+ protected isReadyForFinalization(
231
+ price: CostBreakDown,
232
+ paymentInstructions: PaymentInstruction[],
233
+ billingAddress?: Address,
234
+ shippingAddress?: Address,
235
+ shippingInstruction?: ShippingInstruction,
236
+ ): boolean {
237
+ if (!billingAddress) return false;
238
+ if (!shippingInstruction) return false;
239
+ if (!shippingAddress && !shippingInstruction.pickupPoint) return false;
240
+ if (paymentInstructions.length === 0) return false;
241
+
242
+ const authorizedPayments = paymentInstructions
243
+ .filter((paymentInstruction) => paymentInstruction.status === 'authorized')
244
+ .map((paymentInstruction) => paymentInstruction.amount.value)
245
+ .reduce((sum, value) => sum + value, 0);
246
+
247
+ if (price.grandTotal.value !== authorizedPayments) return false;
248
+
249
+ return true;
250
+ }
251
+
252
+ protected parsePaymentInstruction(
253
+ context: RequestContext,
254
+ data: CTPayment,
255
+ ): PaymentInstruction {
256
+ const identifier = {
257
+ key: data.id,
258
+ } satisfies PaymentInstructionIdentifier;
259
+
260
+ const amount = {
261
+ value: data.amountPlanned.centAmount / 100,
262
+ currency: data.amountPlanned.currencyCode as Currency,
263
+ } satisfies MonetaryAmount;
264
+
265
+ const method = data.paymentMethodInfo?.method || 'unknown';
266
+ const paymentProcessor = data.paymentMethodInfo?.paymentInterface || method;
267
+ const paymentName = data.paymentMethodInfo.name?.[context.languageContext.locale];
268
+
269
+ const paymentMethod = {
270
+ method,
271
+ paymentProcessor,
272
+ name: paymentName || method || 'Unknown',
273
+ } satisfies PaymentMethodIdentifier;
274
+
275
+ const customData = data.custom?.fields || {};
276
+ const protocolData = Object.keys(customData).map((key) => ({
277
+ key,
278
+ value: customData[key],
279
+ }));
280
+
281
+ let status: PaymentStatus = 'pending';
282
+ if (data.transactions && data.transactions.length > 0) {
283
+ const lastTransaction = data.transactions[data.transactions.length - 1];
284
+ if (
285
+ lastTransaction.type === 'Authorization' &&
286
+ lastTransaction.state === 'Success'
287
+ ) {
288
+ status = 'authorized';
289
+ }
290
+ }
291
+
292
+ const result = {
293
+ amount,
294
+ identifier,
295
+ paymentMethod,
296
+ protocolData,
297
+ status,
298
+ } satisfies PaymentInstruction;
299
+
300
+ return result;
301
+ }
302
+
303
+ protected parseAddress(data: CTAddress): Address {
304
+ return {
305
+ countryCode: data.country || '',
306
+ firstName: data.firstName || '',
307
+ lastName: data.lastName || '',
308
+ streetAddress: data.streetName || '',
309
+ streetNumber: data.streetNumber || '',
310
+ postalCode: data.postalCode || '',
311
+ city: data.city || '',
312
+ identifier: {
313
+ nickName: '',
314
+ },
315
+ region: '',
316
+ } satisfies Address;
317
+ }
318
+
319
+ protected parseShippingInstruction(data: CTCart): ShippingInstruction | undefined {
320
+ if (!data.shippingInfo) return undefined;
321
+
322
+ const instructions = data.custom?.fields['shippingInstruction'] || '';
323
+ const consentForUnattendedDelivery =
324
+ data.custom?.fields['consentForUnattendedDelivery'] === 'true';
325
+ const pickupPoint = data.custom?.fields['pickupPointId'] || '';
326
+
327
+ const result = {
328
+ shippingMethod: {
329
+ key: data.shippingInfo.shippingMethod?.obj?.key || '',
330
+ },
331
+ pickupPoint,
332
+ instructions,
333
+ consentForUnattendedDelivery,
334
+ } satisfies ShippingInstruction;
335
+
336
+ return result;
337
+ }
338
+ }
@@ -0,0 +1,26 @@
1
+ import type {
2
+ IdentitySchema} from '@reactionary/core';
3
+ import {
4
+ type AnyIdentitySchema,
5
+ type IdentityFactory,
6
+ type RequestContext,
7
+ } from '@reactionary/core';
8
+ import type * as z from 'zod';
9
+
10
+ export class CommercetoolsIdentityFactory<
11
+ TIdentitySchema extends AnyIdentitySchema = typeof IdentitySchema,
12
+ > implements IdentityFactory<TIdentitySchema>
13
+ {
14
+ public readonly identitySchema: TIdentitySchema;
15
+
16
+ constructor(identitySchema: TIdentitySchema) {
17
+ this.identitySchema = identitySchema;
18
+ }
19
+
20
+ public parseIdentity(
21
+ _context: RequestContext,
22
+ data: unknown,
23
+ ): z.output<TIdentitySchema> {
24
+ return this.identitySchema.parse(data);
25
+ }
26
+ }