@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,220 @@
1
+ import {
2
+ ImageSchema,
3
+ ProductAttributeIdentifierSchema,
4
+ ProductAttributeSchema,
5
+ ProductAttributeValueIdentifierSchema,
6
+ ProductAttributeValueSchema,
7
+ type AnyProductSchema,
8
+ type Product,
9
+ type ProductFactory,
10
+ type ProductIdentifier,
11
+ type ProductVariant,
12
+ type ProductVariantIdentifier,
13
+ type RequestContext,
14
+ } from '@reactionary/core';
15
+ import type * as z from 'zod';
16
+ import type {
17
+ ProductProjection,
18
+ ProductVariant as CTProductVariant,
19
+ Attribute as CTAttribute,
20
+ } from '@commercetools/platform-sdk';
21
+ import type {
22
+ Image,
23
+ ProductAttribute,
24
+ ProductAttributeIdentifier,
25
+ ProductAttributeValue,
26
+ ProductAttributeValueIdentifier,
27
+ ProductOptionIdentifier,
28
+ ProductVariantOption,
29
+
30
+ ProductSchema} from '@reactionary/core';
31
+
32
+ export class CommercetoolsProductFactory<
33
+ TProductSchema extends AnyProductSchema = typeof ProductSchema,
34
+ > implements ProductFactory<TProductSchema>
35
+ {
36
+ public readonly productSchema: TProductSchema;
37
+
38
+ // PAIN: not being able to assign a default for productSchema (productSchema: TProductSchema = ProductSchema)
39
+ // because it will invalidate TS' conservative instantiation-point generics
40
+ // PAIN: consider whether we can pass in request context here
41
+ constructor(productSchema: TProductSchema) {
42
+ this.productSchema = productSchema;
43
+ }
44
+
45
+ public parseProduct(
46
+ context: RequestContext,
47
+ data: ProductProjection,
48
+ ): z.output<TProductSchema> {
49
+ const identifier = { key: data.key || data.id } satisfies ProductIdentifier;
50
+ const name = data.name[context.languageContext.locale];
51
+ const slug = data.slug[context.languageContext.locale];
52
+
53
+ let description = '';
54
+ if (data.description) {
55
+ description = data.description[context.languageContext.locale];
56
+ }
57
+
58
+ const variantLevelAttributes =
59
+ data.masterVariant.attributes?.map((x) =>
60
+ this.parseAttribute(context, x),
61
+ ) || [];
62
+
63
+ const specialAttributes = [
64
+ 'reactionaryaccessories',
65
+ 'reactionaryspareparts',
66
+ 'reactionaryreplacements',
67
+ ];
68
+
69
+ const productLevelAttributes =
70
+ data.attributes
71
+ .filter((x) => !specialAttributes.includes(x.name))
72
+ .map((x) => this.parseAttribute(context, x)) || [];
73
+
74
+ const sharedAttributes = [
75
+ ...productLevelAttributes,
76
+ ...variantLevelAttributes,
77
+ ];
78
+ const mainVariant = this.parseVariant(context, data.masterVariant, data);
79
+
80
+ const otherVariants = [];
81
+ for (const variant of data.variants || []) {
82
+ if (variant.id !== data.masterVariant.id) {
83
+ otherVariants.push(this.parseVariant(context, variant, data));
84
+ }
85
+ }
86
+
87
+ const result = {
88
+ identifier,
89
+ name,
90
+ slug,
91
+ description,
92
+ sharedAttributes,
93
+ mainVariant,
94
+ brand: '',
95
+ longDescription: '',
96
+ manufacturer: '',
97
+ options: [],
98
+ parentCategories: [],
99
+ published: true,
100
+ variants: otherVariants,
101
+ } satisfies Product;
102
+
103
+ // PAIN: having to actually do the parse here to guarantee that the generics are satisfied.
104
+ // probably fair, given that this relationship can't be expressed in TS otherwise...
105
+ // unless we were willing to accept ownership of the responsibility and do an 'as T'
106
+ return this.productSchema.parse(result);
107
+ }
108
+
109
+ /**
110
+ * Return true, if the attribute is a defining attribute (ie an option)
111
+ * @param attr a variant attribute
112
+ * @returns true if the attribute is an option
113
+ */
114
+ protected isVariantAttributeAnOption(attr: CTAttribute): boolean {
115
+ // for now, the assumption is that any variant attribute is a defining attribute (ie an option)
116
+ // ideally this should be verified with the product type.
117
+ return true;
118
+ }
119
+
120
+ protected parseVariant(
121
+ context: RequestContext,
122
+ variant: CTProductVariant,
123
+ product: ProductProjection,
124
+ ): ProductVariant {
125
+ const identifier = {
126
+ sku: variant.sku!,
127
+ } satisfies ProductVariantIdentifier;
128
+
129
+ const images = [
130
+ ...(variant.images || []).map((img) =>
131
+ ImageSchema.parse({
132
+ sourceUrl: img.url,
133
+ altText: img.label || '',
134
+ width: img.dimensions?.w,
135
+ height: img.dimensions?.h,
136
+ } satisfies Image),
137
+ ),
138
+ ];
139
+
140
+ const options =
141
+ (variant.attributes ?? [])
142
+ .filter((attr) => this.isVariantAttributeAnOption(attr))
143
+ .map((attr) => {
144
+ const attrVal = this.parseAttributeValue(context, attr);
145
+ const optionIdentifier: ProductOptionIdentifier = {
146
+ key: attr.name,
147
+ };
148
+ const option: ProductVariantOption = {
149
+ identifier: optionIdentifier,
150
+ name: attr.name,
151
+ value: {
152
+ identifier: {
153
+ key: attrVal.value,
154
+ option: optionIdentifier,
155
+ },
156
+ label: attrVal.label,
157
+ },
158
+ };
159
+ return option;
160
+ }) || [];
161
+
162
+ const result = {
163
+ identifier,
164
+ images,
165
+ barcode: '',
166
+ ean: '',
167
+ gtin: '',
168
+ name: product.name[context.languageContext.locale],
169
+ options,
170
+ upc: '',
171
+ } satisfies ProductVariant;
172
+
173
+ return result;
174
+ }
175
+
176
+ protected parseAttribute(
177
+ context: RequestContext,
178
+ attr: CTAttribute,
179
+ ): ProductAttribute {
180
+ const result = ProductAttributeSchema.parse({
181
+ identifier: ProductAttributeIdentifierSchema.parse({
182
+ key: attr.name,
183
+ } satisfies Partial<ProductAttributeIdentifier>),
184
+ group: '',
185
+ name: attr.name,
186
+ values: [this.parseAttributeValue(context, attr)],
187
+ } satisfies Partial<ProductAttribute>);
188
+
189
+ return result;
190
+ }
191
+
192
+ protected parseAttributeValue(context: RequestContext, attr: CTAttribute): ProductAttributeValue {
193
+ let attrValue = '';
194
+ if (attr.value && Array.isArray(attr.value)) {
195
+ attrValue = attr.value[0];
196
+ }
197
+
198
+ if (attr.value && typeof attr.value === 'object') {
199
+ if (context.languageContext.locale in attr.value) {
200
+ attrValue = attr.value[context.languageContext.locale];
201
+ } else {
202
+ attrValue = '-';
203
+ }
204
+ }
205
+
206
+ if (typeof attr.value === 'string') {
207
+ attrValue = attr.value;
208
+ }
209
+
210
+ const attrVal = ProductAttributeValueSchema.parse({
211
+ identifier: ProductAttributeValueIdentifierSchema.parse({
212
+ key: attrValue,
213
+ } satisfies Partial<ProductAttributeValueIdentifier>),
214
+ value: String(attrValue),
215
+ label: String(attrValue),
216
+ } satisfies Partial<ProductAttributeValue>);
217
+
218
+ return attrVal;
219
+ }
220
+ }
@@ -0,0 +1,9 @@
1
+ export const assertType = <T>(_value: T) => {
2
+ void _value;
3
+ };
4
+
5
+ type IsAny<T> = 0 extends (1 & T) ? true : false;
6
+
7
+ export const assertNotAny = <T>(_value: IsAny<T> extends true ? never : T) => {
8
+ void _value;
9
+ };
@@ -0,0 +1,103 @@
1
+ import type { ProductProjection, ProductVariant as CTProductVariant } from '@commercetools/platform-sdk';
2
+ import type {
3
+ ProductAssociationSchema} from '@reactionary/core';
4
+ import {
5
+ ImageSchema,
6
+ ProductOptionIdentifierSchema,
7
+ ProductSearchResultItemVariantSchema,
8
+ ProductVariantIdentifierSchema,
9
+ ProductVariantOptionSchema,
10
+ type AnyProductAssociationSchema,
11
+ type ProductAssociation,
12
+ type ProductAssociationsFactory,
13
+ type ProductOptionIdentifier,
14
+ type ProductSearchResultItem,
15
+ type ProductSearchResultItemVariant,
16
+ type ProductVariantIdentifier,
17
+ type ProductVariantOption,
18
+ type RequestContext,
19
+ } from '@reactionary/core';
20
+ import type * as z from 'zod';
21
+
22
+ export class CommercetoolsProductAssociationsFactory<
23
+ TProductAssociationSchema extends AnyProductAssociationSchema = typeof ProductAssociationSchema,
24
+ > implements ProductAssociationsFactory<TProductAssociationSchema>
25
+ {
26
+ public readonly productAssociationSchema: TProductAssociationSchema;
27
+
28
+ constructor(productAssociationSchema: TProductAssociationSchema) {
29
+ this.productAssociationSchema = productAssociationSchema;
30
+ }
31
+
32
+ public parseAssociation(
33
+ context: RequestContext,
34
+ data: {
35
+ sourceProductKey: string;
36
+ relation: 'accessory' | 'sparepart' | 'replacement';
37
+ product: ProductProjection;
38
+ },
39
+ ): z.output<TProductAssociationSchema> {
40
+ const product = this.parseSearchResultItem(context, data.product);
41
+ const result = {
42
+ associationIdentifier: {
43
+ key: `${data.sourceProductKey}-${data.relation}-${product.identifier.key}`,
44
+ },
45
+ associationReturnType: 'productSearchResultItem',
46
+ product,
47
+ } satisfies ProductAssociation;
48
+
49
+ return this.productAssociationSchema.parse(result);
50
+ }
51
+
52
+ protected parseSearchResultItem(
53
+ context: RequestContext,
54
+ data: ProductProjection,
55
+ ): ProductSearchResultItem {
56
+ const variants = [data.masterVariant, ...data.variants].map((variant) =>
57
+ this.parseVariant(context, variant, data),
58
+ );
59
+
60
+ return {
61
+ identifier: { key: data.id },
62
+ name: data.name[context.languageContext.locale] || data.id,
63
+ slug: data.slug?.[context.languageContext.locale] || data.id,
64
+ variants,
65
+ } satisfies ProductSearchResultItem;
66
+ }
67
+
68
+ protected parseVariant(
69
+ context: RequestContext,
70
+ variant: CTProductVariant,
71
+ product: ProductProjection,
72
+ ): ProductSearchResultItemVariant {
73
+ const sourceImage = variant.images?.[0];
74
+ const image = ImageSchema.parse({
75
+ sourceUrl: sourceImage?.url || '',
76
+ height: sourceImage?.dimensions.h || undefined,
77
+ width: sourceImage?.dimensions.w || undefined,
78
+ altText: sourceImage?.label || product.name[context.languageContext.locale] || undefined,
79
+ });
80
+
81
+ const mappedOptions =
82
+ variant.attributes
83
+ ?.filter((attribute) => attribute.name === 'Color')
84
+ .map((option) =>
85
+ ProductVariantOptionSchema.parse({
86
+ identifier: ProductOptionIdentifierSchema.parse({
87
+ key: option.name,
88
+ } satisfies Partial<ProductOptionIdentifier>),
89
+ name: option.value || '',
90
+ } satisfies Partial<ProductVariantOption>),
91
+ ) || [];
92
+
93
+ const mappedOption = mappedOptions?.[0];
94
+
95
+ return ProductSearchResultItemVariantSchema.parse({
96
+ variant: ProductVariantIdentifierSchema.parse({
97
+ sku: variant.sku || '',
98
+ } satisfies ProductVariantIdentifier),
99
+ image,
100
+ options: mappedOption,
101
+ } satisfies Partial<ProductSearchResultItemVariant>);
102
+ }
103
+ }
@@ -0,0 +1,122 @@
1
+ import type { ShoppingList, ShoppingListLineItem } from '@commercetools/platform-sdk';
2
+ import type {
3
+ ProductListItemPaginatedResultsSchema,
4
+ ProductListItemSchema,
5
+ ProductListPaginatedResultsSchema,
6
+ ProductListSchema} from '@reactionary/core';
7
+ import {
8
+ type AnyProductListItemPaginatedSchema,
9
+ type AnyProductListItemSchema,
10
+ type AnyProductListPaginatedSchema,
11
+ type AnyProductListSchema,
12
+ type ProductList,
13
+ type ProductListFactory,
14
+ type ProductListIdentifier,
15
+ type ProductListItem,
16
+ type ProductListItemPaginatedResult,
17
+ type ProductListPaginatedResult,
18
+ type ProductListType,
19
+ type RequestContext,
20
+ } from '@reactionary/core';
21
+ import type * as z from 'zod';
22
+
23
+ export class CommercetoolsProductListFactory<
24
+ TProductListSchema extends AnyProductListSchema = typeof ProductListSchema,
25
+ TProductListItemSchema extends AnyProductListItemSchema = typeof ProductListItemSchema,
26
+ TProductListPaginatedSchema extends AnyProductListPaginatedSchema = typeof ProductListPaginatedResultsSchema,
27
+ TProductListItemPaginatedSchema extends AnyProductListItemPaginatedSchema = typeof ProductListItemPaginatedResultsSchema,
28
+ > implements
29
+ ProductListFactory<
30
+ TProductListSchema,
31
+ TProductListItemSchema,
32
+ TProductListPaginatedSchema,
33
+ TProductListItemPaginatedSchema
34
+ >
35
+ {
36
+ public readonly productListSchema: TProductListSchema;
37
+ public readonly productListItemSchema: TProductListItemSchema;
38
+ public readonly productListPaginatedSchema: TProductListPaginatedSchema;
39
+ public readonly productListItemPaginatedSchema: TProductListItemPaginatedSchema;
40
+
41
+ constructor(
42
+ productListSchema: TProductListSchema,
43
+ productListItemSchema: TProductListItemSchema,
44
+ productListPaginatedSchema: TProductListPaginatedSchema,
45
+ productListItemPaginatedSchema: TProductListItemPaginatedSchema,
46
+ ) {
47
+ this.productListSchema = productListSchema;
48
+ this.productListItemSchema = productListItemSchema;
49
+ this.productListPaginatedSchema = productListPaginatedSchema;
50
+ this.productListItemPaginatedSchema = productListItemPaginatedSchema;
51
+ }
52
+
53
+ public parseProductList(
54
+ _context: RequestContext,
55
+ data: ProductList,
56
+ ): z.output<TProductListSchema> {
57
+ return this.productListSchema.parse(data);
58
+ }
59
+
60
+ public parseProductListItem(
61
+ _context: RequestContext,
62
+ data: ProductListItem,
63
+ ): z.output<TProductListItemSchema> {
64
+ return this.productListItemSchema.parse(data);
65
+ }
66
+
67
+ public parseProductListPaginatedResult(
68
+ _context: RequestContext,
69
+ data: ProductListPaginatedResult,
70
+ ): z.output<TProductListPaginatedSchema> {
71
+ return this.productListPaginatedSchema.parse(data);
72
+ }
73
+
74
+ public parseProductListItemPaginatedResult(
75
+ _context: RequestContext,
76
+ data: ProductListItemPaginatedResult,
77
+ ): z.output<TProductListItemPaginatedSchema> {
78
+ return this.productListItemPaginatedSchema.parse(data);
79
+ }
80
+
81
+ public parseListFromCommercetools(list: ShoppingList): z.output<TProductListSchema> {
82
+ const listType = (list.custom?.fields['listType'] as ProductListType) || 'favorite';
83
+ const image = list.custom?.fields['imageUrl'] as string | undefined;
84
+ const published = (list.custom?.fields['published'] as boolean) && true;
85
+ const publishDateValue = list.custom?.fields['publishedDate'] as string | undefined;
86
+ const publishDate = publishDateValue ? new Date(publishDateValue).toISOString() : undefined;
87
+
88
+ return this.productListSchema.parse({
89
+ identifier: {
90
+ listType,
91
+ key: list.id,
92
+ },
93
+ type: listType,
94
+ name: list.name['en'] || 'Unnamed List',
95
+ description: list.description?.['en'] || '',
96
+ published,
97
+ publishDate,
98
+ image: {
99
+ sourceUrl: image || '',
100
+ altText: list.name['en'] || 'List Image',
101
+ },
102
+ } satisfies ProductList);
103
+ }
104
+
105
+ public parseListItemFromCommercetools(
106
+ listIdentifier: ProductListIdentifier,
107
+ lineItem: ShoppingListLineItem,
108
+ ): z.output<TProductListItemSchema> {
109
+ return this.productListItemSchema.parse({
110
+ identifier: {
111
+ list: listIdentifier,
112
+ key: lineItem.id,
113
+ },
114
+ variant: {
115
+ sku: lineItem.variant?.sku || '',
116
+ },
117
+ quantity: lineItem.quantity,
118
+ notes: (lineItem.custom?.fields['notes'] as string) || '',
119
+ order: (lineItem.custom?.fields['order'] as number) || 1,
120
+ } satisfies ProductListItem);
121
+ }
122
+ }
@@ -0,0 +1,81 @@
1
+ import type { Review as CTReview } from '@commercetools/platform-sdk';
2
+ import type {
3
+ ProductRatingSummarySchema,
4
+ ProductReviewPaginatedResultSchema,
5
+ ProductReviewSchema} from '@reactionary/core';
6
+ import {
7
+ type AnyProductRatingSummarySchema,
8
+ type AnyProductReviewPaginatedSchema,
9
+ type AnyProductReviewSchema,
10
+ type ProductRatingSummary,
11
+ type ProductReview,
12
+ type ProductReviewPaginatedResult,
13
+ type ProductReviewsFactory,
14
+ type RequestContext,
15
+ } from '@reactionary/core';
16
+ import type * as z from 'zod';
17
+
18
+ export class CommercetoolsProductReviewsFactory<
19
+ TRatingSummarySchema extends AnyProductRatingSummarySchema = typeof ProductRatingSummarySchema,
20
+ TReviewSchema extends AnyProductReviewSchema = typeof ProductReviewSchema,
21
+ TReviewPaginatedSchema extends AnyProductReviewPaginatedSchema = typeof ProductReviewPaginatedResultSchema,
22
+ > implements ProductReviewsFactory<TRatingSummarySchema, TReviewSchema, TReviewPaginatedSchema>
23
+ {
24
+ public readonly ratingSummarySchema: TRatingSummarySchema;
25
+ public readonly reviewSchema: TReviewSchema;
26
+ public readonly reviewPaginatedSchema: TReviewPaginatedSchema;
27
+
28
+ constructor(
29
+ ratingSummarySchema: TRatingSummarySchema,
30
+ reviewSchema: TReviewSchema,
31
+ reviewPaginatedSchema: TReviewPaginatedSchema,
32
+ ) {
33
+ this.ratingSummarySchema = ratingSummarySchema;
34
+ this.reviewSchema = reviewSchema;
35
+ this.reviewPaginatedSchema = reviewPaginatedSchema;
36
+ }
37
+
38
+ public parseRatingSummary(
39
+ _context: RequestContext,
40
+ data: ProductRatingSummary,
41
+ ): z.output<TRatingSummarySchema> {
42
+ return this.ratingSummarySchema.parse(data);
43
+ }
44
+
45
+ public parseReview(
46
+ _context: RequestContext,
47
+ data: ProductReview,
48
+ ): z.output<TReviewSchema> {
49
+ return this.reviewSchema.parse(data);
50
+ }
51
+
52
+ public parseReviewPaginatedResult(
53
+ _context: RequestContext,
54
+ data: ProductReviewPaginatedResult,
55
+ ): z.output<TReviewPaginatedSchema> {
56
+ return this.reviewPaginatedSchema.parse(data);
57
+ }
58
+
59
+ public parseReviewFromCommercetools(
60
+ _context: RequestContext,
61
+ review: CTReview,
62
+ productKey: string,
63
+ ): z.output<TReviewSchema> {
64
+ return this.reviewSchema.parse({
65
+ identifier: {
66
+ key: review.key || '',
67
+ },
68
+ product: {
69
+ key: productKey,
70
+ },
71
+ authorName: review.authorName ?? 'Anonymous',
72
+ authorId: review.customer?.id,
73
+ rating: review.rating ?? 0,
74
+ title: review.title ?? '',
75
+ content: review.text ?? '',
76
+ createdAt: review.createdAt,
77
+ updatedAt: review.lastModifiedAt,
78
+ verified: !!review.customer,
79
+ } satisfies ProductReview);
80
+ }
81
+ }