@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
@@ -1,6 +1,12 @@
1
1
  import type { MyShoppingListAddLineItemAction, MyShoppingListDraft, MyShoppingListUpdate, MyShoppingListUpdateAction, ShoppingList, ShoppingListLineItem } from '@commercetools/platform-sdk';
2
2
  import type {
3
3
  Cache,
4
+ ProductListFactory,
5
+ ProductListFactoryItemOutput,
6
+ ProductListFactoryItemPaginatedOutput,
7
+ ProductListFactoryListOutput,
8
+ ProductListFactoryListPaginatedOutput,
9
+ ProductListFactoryWithOutput,
4
10
  NotFoundError,
5
11
  ProductList,
6
12
  ProductListIdentifier,
@@ -8,12 +14,10 @@ import type {
8
14
  ProductListItemMutationCreate,
9
15
  ProductListItemMutationDelete,
10
16
  ProductListItemMutationUpdate,
11
- ProductListItemPaginatedResult,
12
17
  ProductListItemsQuery,
13
18
  ProductListMutationCreate,
14
19
  ProductListMutationDelete,
15
20
  ProductListMutationUpdate,
16
- ProductListPaginatedResult,
17
21
  ProductListQuery,
18
22
  ProductListQueryById,
19
23
  ProductListType,
@@ -33,7 +37,7 @@ import {
33
37
  ProductListMutationDeleteSchema,
34
38
  ProductListMutationUpdateSchema,
35
39
  ProductListPaginatedResultsSchema,
36
- ProductListProvider,
40
+ ProductListCapability,
37
41
  ProductListQueryByIdSchema,
38
42
  ProductListQuerySchema,
39
43
  ProductListSchema,
@@ -42,20 +46,31 @@ import {
42
46
  } from '@reactionary/core';
43
47
  import type { CommercetoolsAPI } from '../core/client.js';
44
48
  import type { CommercetoolsConfiguration } from '../schema/configuration.schema.js';
45
-
46
- export class CommercetoolsProductListProvider extends ProductListProvider {
49
+ import type { CommercetoolsProductListFactory } from '../factories/product-list/product-list.factory.js';
50
+
51
+ export class CommercetoolsProductListCapability<
52
+ TFactory extends ProductListFactory = CommercetoolsProductListFactory,
53
+ > extends ProductListCapability<
54
+ ProductListFactoryListOutput<TFactory>,
55
+ ProductListFactoryItemOutput<TFactory>,
56
+ ProductListFactoryListPaginatedOutput<TFactory>,
57
+ ProductListFactoryItemPaginatedOutput<TFactory>
58
+ > {
47
59
  protected config: CommercetoolsConfiguration;
48
60
  protected commercetools: CommercetoolsAPI;
61
+ protected factory: ProductListFactoryWithOutput<TFactory>;
49
62
 
50
63
  constructor(
51
64
  config: CommercetoolsConfiguration,
52
65
  cache: Cache,
53
66
  context: RequestContext,
54
- commercetools: CommercetoolsAPI
67
+ commercetools: CommercetoolsAPI,
68
+ factory: ProductListFactoryWithOutput<TFactory>,
55
69
  ) {
56
70
  super(cache, context);
57
71
  this.config = config;
58
72
  this.commercetools = commercetools;
73
+ this.factory = factory;
59
74
  }
60
75
 
61
76
  protected async getClient() {
@@ -71,7 +86,7 @@ export class CommercetoolsProductListProvider extends ProductListProvider {
71
86
  inputSchema: ProductListQueryByIdSchema,
72
87
  outputSchema: ProductListSchema
73
88
  })
74
- public override async getById(payload: ProductListQueryById): Promise<Result<ProductList>> {
89
+ public override async getById(payload: ProductListQueryById): Promise<Result<ProductListFactoryListOutput<TFactory>>> {
75
90
  try {
76
91
  const client = await this.getClient();
77
92
  const response = await client.shoppingLists()
@@ -79,7 +94,7 @@ export class CommercetoolsProductListProvider extends ProductListProvider {
79
94
  .get()
80
95
  .execute();
81
96
 
82
- return success(this.parseSingle(response.body));
97
+ return success(this.factory.parseProductList(this.context, this.parseSingle(response.body)));
83
98
  } catch(err: any) {
84
99
  if (err.statusCode === 404) {
85
100
  return error<NotFoundError>({
@@ -101,17 +116,17 @@ export class CommercetoolsProductListProvider extends ProductListProvider {
101
116
  inputSchema: ProductListQuerySchema,
102
117
  outputSchema: ProductListPaginatedResultsSchema
103
118
  })
104
- public override async queryLists(payload: ProductListQuery): Promise<Result<ProductListPaginatedResult>> {
119
+ public override async queryLists(payload: ProductListQuery): Promise<Result<ProductListFactoryListPaginatedOutput<TFactory>>> {
105
120
 
106
121
  if (this.context.session.identityContext?.identity?.type !== 'Registered') {
107
- return success({
122
+ return success(this.factory.parseProductListPaginatedResult(this.context, {
108
123
  items: [],
109
124
  pageNumber: 1,
110
125
  pageSize: payload.search.paginationOptions.pageSize,
111
126
  totalCount: 0,
112
127
  totalPages: 0,
113
128
  identifier: payload.search,
114
- });
129
+ }));
115
130
  }
116
131
 
117
132
  const client = await this.getClient();
@@ -125,14 +140,14 @@ export class CommercetoolsProductListProvider extends ProductListProvider {
125
140
  }
126
141
  }).execute();
127
142
 
128
- return success({
143
+ return success(this.factory.parseProductListPaginatedResult(this.context, {
129
144
  items: response.body.results.map(list => this.parseSingle(list)),
130
145
  pageNumber: payload.search.paginationOptions.pageNumber,
131
146
  pageSize: payload.search.paginationOptions.pageSize,
132
147
  totalCount: response.body.total || 0,
133
148
  totalPages: Math.ceil((response.body.total || 0) / payload.search.paginationOptions.pageSize),
134
149
  identifier: payload.search,
135
- });
150
+ }));
136
151
 
137
152
  }
138
153
 
@@ -141,7 +156,7 @@ export class CommercetoolsProductListProvider extends ProductListProvider {
141
156
  inputSchema: ProductListMutationCreateSchema,
142
157
  outputSchema: ProductListSchema
143
158
  })
144
- public override async addList(mutation: ProductListMutationCreate): Promise<Result<ProductList>> {
159
+ public override async addList(mutation: ProductListMutationCreate): Promise<Result<ProductListFactoryListOutput<TFactory>>> {
145
160
  const client = await this.getClient();
146
161
  const localeString = this.getLocaleString();
147
162
 
@@ -174,7 +189,7 @@ export class CommercetoolsProductListProvider extends ProductListProvider {
174
189
  body: draft
175
190
  }).execute();
176
191
 
177
- return success(this.parseSingle(response.body));
192
+ return success(this.factory.parseProductList(this.context, this.parseSingle(response.body)));
178
193
  }
179
194
 
180
195
  @Reactionary({
@@ -182,7 +197,7 @@ export class CommercetoolsProductListProvider extends ProductListProvider {
182
197
  inputSchema: ProductListMutationUpdateSchema,
183
198
  outputSchema: ProductListSchema
184
199
  })
185
- public override async updateList(mutation: ProductListMutationUpdate): Promise<Result<ProductList>> {
200
+ public override async updateList(mutation: ProductListMutationUpdate): Promise<Result<ProductListFactoryListOutput<TFactory>>> {
186
201
  const client = await this.getClient();
187
202
  const actions: MyShoppingListUpdateAction[] = [];
188
203
  const localeString = this.getLocaleString()
@@ -234,7 +249,7 @@ export class CommercetoolsProductListProvider extends ProductListProvider {
234
249
  .post({ body: update })
235
250
  .execute();
236
251
 
237
- return success(this.parseSingle(response.body));
252
+ return success(this.factory.parseProductList(this.context, this.parseSingle(response.body)));
238
253
  }
239
254
 
240
255
  @Reactionary({
@@ -270,7 +285,7 @@ export class CommercetoolsProductListProvider extends ProductListProvider {
270
285
  inputSchema: ProductListItemQuerySchema,
271
286
  outputSchema: ProductListItemPaginatedResultsSchema
272
287
  })
273
- public override async queryListItems(query: ProductListItemsQuery): Promise<Result<ProductListItemPaginatedResult>> {
288
+ public override async queryListItems(query: ProductListItemsQuery): Promise<Result<ProductListFactoryItemPaginatedOutput<TFactory>>> {
274
289
  const client = await this.getClient();
275
290
 
276
291
  const response = await client.shoppingLists()
@@ -282,14 +297,14 @@ export class CommercetoolsProductListProvider extends ProductListProvider {
282
297
 
283
298
  const items = response.body.lineItems.map(lineItem => this.parseProductListItem(query.search.list, lineItem ));
284
299
 
285
- return success({
300
+ return success(this.factory.parseProductListItemPaginatedResult(this.context, {
286
301
  items: items.slice((query.search.paginationOptions.pageNumber - 1) * query.search.paginationOptions.pageSize, query.search.paginationOptions.pageNumber * query.search.paginationOptions.pageSize),
287
302
  identifier: query.search,
288
303
  pageNumber: query.search.paginationOptions.pageNumber,
289
304
  pageSize: query.search.paginationOptions.pageSize,
290
305
  totalCount: items.length,
291
306
  totalPages: Math.ceil(items.length / query.search.paginationOptions.pageSize),
292
- });
307
+ }));
293
308
  }
294
309
 
295
310
  @Reactionary({
@@ -297,7 +312,7 @@ export class CommercetoolsProductListProvider extends ProductListProvider {
297
312
  inputSchema: ProductListItemMutationCreateSchema,
298
313
  outputSchema: ProductListItemSchema
299
314
  })
300
- public override async addItem(mutation: ProductListItemMutationCreate): Promise<Result<ProductListItem>> {
315
+ public override async addItem(mutation: ProductListItemMutationCreate): Promise<Result<ProductListFactoryItemOutput<TFactory>>> {
301
316
  const client = await this.getClient();
302
317
 
303
318
  const lineItemDraft: MyShoppingListAddLineItemAction = {
@@ -331,7 +346,7 @@ export class CommercetoolsProductListProvider extends ProductListProvider {
331
346
  throw new Error('The added line item is not the last item in the list, cannot reliably determine the identifier of the added item');
332
347
  }
333
348
 
334
- return success(this.parseProductListItem(mutation.list, lastItem ));
349
+ return success(this.factory.parseProductListItem(this.context, this.parseProductListItem(mutation.list, lastItem)));
335
350
  }
336
351
 
337
352
  @Reactionary({
@@ -363,7 +378,7 @@ export class CommercetoolsProductListProvider extends ProductListProvider {
363
378
  inputSchema: ProductListItemMutationUpdateSchema,
364
379
  outputSchema: ProductListItemSchema
365
380
  })
366
- public override async updateItem(mutation: ProductListItemMutationUpdate): Promise<Result<ProductListItem>> {
381
+ public override async updateItem(mutation: ProductListItemMutationUpdate): Promise<Result<ProductListFactoryItemOutput<TFactory>>> {
367
382
  const client = await this.getClient();
368
383
 
369
384
  const actions: MyShoppingListUpdateAction[] = [];
@@ -408,7 +423,7 @@ export class CommercetoolsProductListProvider extends ProductListProvider {
408
423
  throw new Error('Failed to find the updated line item in response');
409
424
  }
410
425
 
411
- return success(this.parseProductListItem(mutation.listItem.list, updatedLineItem));
426
+ return success(this.factory.parseProductListItem(this.context, this.parseProductListItem(mutation.listItem.list, updatedLineItem)));
412
427
  }
413
428
 
414
429
  /**
@@ -1,5 +1,10 @@
1
1
  import {
2
- ProductReviewsProvider,
2
+ type ProductReviewsFactory,
3
+ type ProductReviewsFactoryRatingOutput,
4
+ type ProductReviewsFactoryReviewOutput,
5
+ type ProductReviewsFactoryReviewPaginatedOutput,
6
+ type ProductReviewsFactoryWithOutput,
7
+ ProductReviewsCapability,
3
8
  Reactionary,
4
9
  success,
5
10
  error,
@@ -8,9 +13,8 @@ import {
8
13
  ProductReviewPaginatedResultSchema,
9
14
  } from '@reactionary/core';
10
15
  import type {
11
- ProductReview,
12
16
  ProductRatingSummary,
13
- ProductReviewPaginatedResult,
17
+ ProductReview,
14
18
  ProductReviewsListQuery,
15
19
  ProductReviewsGetRatingSummaryQuery,
16
20
  ProductReviewMutationSubmit,
@@ -23,20 +27,30 @@ import type {
23
27
  import type { CommercetoolsConfiguration } from '../schema/configuration.schema.js';
24
28
  import type { CommercetoolsAPI } from '../core/client.js';
25
29
  import type { Review as CTReview } from '@commercetools/platform-sdk';
30
+ import type { CommercetoolsProductReviewsFactory } from '../factories/product-reviews/product-reviews.factory.js';
26
31
 
27
- export class CommercetoolsProductReviewsProvider extends ProductReviewsProvider {
32
+ export class CommercetoolsProductReviewsCapability<
33
+ TFactory extends ProductReviewsFactory = CommercetoolsProductReviewsFactory,
34
+ > extends ProductReviewsCapability<
35
+ ProductReviewsFactoryRatingOutput<TFactory>,
36
+ ProductReviewsFactoryReviewPaginatedOutput<TFactory>,
37
+ ProductReviewsFactoryReviewOutput<TFactory>
38
+ > {
28
39
  protected config: CommercetoolsConfiguration;
29
40
  protected commercetools: CommercetoolsAPI;
41
+ protected factory: ProductReviewsFactoryWithOutput<TFactory>;
30
42
 
31
43
  constructor(
32
44
  config: CommercetoolsConfiguration,
33
45
  cache: Cache,
34
46
  context: RequestContext,
35
- commercetools: CommercetoolsAPI
47
+ commercetools: CommercetoolsAPI,
48
+ factory: ProductReviewsFactoryWithOutput<TFactory>,
36
49
  ) {
37
50
  super(cache, context);
38
51
  this.config = config;
39
52
  this.commercetools = commercetools;
53
+ this.factory = factory;
40
54
  }
41
55
 
42
56
  protected async getClient() {
@@ -58,7 +72,7 @@ export class CommercetoolsProductReviewsProvider extends ProductReviewsProvider
58
72
  })
59
73
  public override async getRatingSummary(
60
74
  query: ProductReviewsGetRatingSummaryQuery
61
- ): Promise<Result<ProductRatingSummary>> {
75
+ ): Promise<Result<ProductReviewsFactoryRatingOutput<TFactory>>> {
62
76
  const client = await this.getClient();
63
77
 
64
78
  // Get all reviews for the product to calculate summary
@@ -80,6 +94,7 @@ export class CommercetoolsProductReviewsProvider extends ProductReviewsProvider
80
94
  },
81
95
  averageRating: 0,
82
96
  totalRatings: 0,
97
+ ratingDistribution: undefined,
83
98
  }
84
99
 
85
100
  if (response.body.reviewRatingStatistics) {
@@ -93,9 +108,14 @@ export class CommercetoolsProductReviewsProvider extends ProductReviewsProvider
93
108
  '5': response.body.reviewRatingStatistics.ratingsDistribution['5'] ?? 0,
94
109
  };
95
110
  }
96
- return success(summary);
111
+ return success(this.factory.parseRatingSummary(this.context, summary));
97
112
  } else {
98
- return success(this.createEmptyProductRatingSummary({ product: query.product }));
113
+ return success(
114
+ this.factory.parseRatingSummary(
115
+ this.context,
116
+ this.createEmptyProductRatingSummary({ product: query.product }),
117
+ ),
118
+ );
99
119
  }
100
120
  }
101
121
 
@@ -108,7 +128,7 @@ export class CommercetoolsProductReviewsProvider extends ProductReviewsProvider
108
128
  })
109
129
  public override async findReviews(
110
130
  query: ProductReviewsListQuery
111
- ): Promise<Result<ProductReviewPaginatedResult>> {
131
+ ): Promise<Result<ProductReviewsFactoryReviewPaginatedOutput<TFactory>>> {
112
132
  const client = await this.getClient();
113
133
 
114
134
  const pageNumber = query.paginationOptions?.pageNumber ?? 1;
@@ -124,13 +144,13 @@ export class CommercetoolsProductReviewsProvider extends ProductReviewsProvider
124
144
  });
125
145
 
126
146
  if (!product || !product.body) {
127
- return success({
147
+ return success(this.factory.parseReviewPaginatedResult(this.context, {
128
148
  items: [],
129
149
  totalCount: 0,
130
150
  pageSize,
131
151
  pageNumber,
132
152
  totalPages: 0,
133
- })
153
+ }));
134
154
  }
135
155
 
136
156
  // Build where clause
@@ -175,7 +195,7 @@ export class CommercetoolsProductReviewsProvider extends ProductReviewsProvider
175
195
  const reviews = response.body.results.map((review) =>
176
196
  this.parseSingle(review, query.product.key)
177
197
  );
178
- const returnedResult: ProductReviewPaginatedResult = {
198
+ const returnedResult = {
179
199
  items: reviews,
180
200
  totalCount: response.body.total || reviews.length,
181
201
  pageSize,
@@ -183,7 +203,7 @@ export class CommercetoolsProductReviewsProvider extends ProductReviewsProvider
183
203
  totalPages: Math.ceil((response.body.total || reviews.length) / Math.max(pageSize, 1)),
184
204
  };
185
205
 
186
- return success(returnedResult);
206
+ return success(this.factory.parseReviewPaginatedResult(this.context, returnedResult));
187
207
  }
188
208
 
189
209
  @Reactionary({
@@ -195,7 +215,7 @@ export class CommercetoolsProductReviewsProvider extends ProductReviewsProvider
195
215
  })
196
216
  public override async submitReview(
197
217
  mutation: ProductReviewMutationSubmit
198
- ): Promise<Result<ProductReview>> {
218
+ ): Promise<Result<ProductReviewsFactoryReviewOutput<TFactory>>> {
199
219
 
200
220
 
201
221
  if (!(this.context.session.identityContext.identity.type === 'Registered')) {
@@ -227,7 +247,7 @@ export class CommercetoolsProductReviewsProvider extends ProductReviewsProvider
227
247
 
228
248
  const review = this.parseSingle(response.body, mutation.product.key);
229
249
 
230
- return success(review);
250
+ return success(this.factory.parseReview(this.context, review));
231
251
  }
232
252
 
233
253
  protected parseSingle(review: CTReview, productKey: string): ProductReview {
@@ -1,43 +1,24 @@
1
1
  import type {
2
- ProductSearchFacetResult as CTProductSearchFacetResult,
3
- ProductSearchFacetResultBucket as CTProductSearchFacetResultBucket,
4
- ProductVariant as CTProductVariant,
5
- ProductPagedSearchResponse,
6
- ProductProjection,
7
2
  ProductSearchFacetExpression,
8
3
  } from '@commercetools/platform-sdk';
9
4
  import type {
10
5
  Cache,
11
6
  FacetIdentifier,
12
7
  FacetValueIdentifier,
13
- ProductOptionIdentifier,
8
+ ProductSearchFactory,
9
+ ProductSearchFactoryOutput,
10
+ ProductSearchFactoryWithOutput,
14
11
  ProductSearchQueryByTerm,
15
12
  ProductSearchQueryCreateNavigationFilter,
16
- ProductSearchResult,
17
- ProductSearchResultFacet,
18
- ProductSearchResultFacetValue,
19
- ProductSearchResultItem,
20
- ProductSearchResultItemVariant,
21
- ProductVariantIdentifier,
22
- ProductVariantOption,
23
13
  RequestContext,
24
14
  Result,
25
- SearchIdentifier,
26
15
  } from '@reactionary/core';
27
16
  import {
28
- FacetIdentifierSchema,
29
17
  FacetValueIdentifierSchema,
30
- ImageSchema,
31
- ProductOptionIdentifierSchema,
32
- ProductSearchProvider,
18
+ ProductSearchCapability,
33
19
  ProductSearchQueryByTermSchema,
34
20
  ProductSearchQueryCreateNavigationFilterSchema,
35
- ProductSearchResultFacetSchema,
36
- ProductSearchResultFacetValueSchema,
37
- ProductSearchResultItemVariantSchema,
38
21
  ProductSearchResultSchema,
39
- ProductVariantIdentifierSchema,
40
- ProductVariantOptionSchema,
41
22
  Reactionary,
42
23
  success,
43
24
  } from '@reactionary/core';
@@ -46,23 +27,29 @@ import type { CommercetoolsConfiguration } from '../schema/configuration.schema.
46
27
  import createDebug from 'debug';
47
28
  import type { CommercetoolsAPI } from '../core/client.js';
48
29
  import { CommercetoolsCategoryLookupSchema, CommercetoolsResolveCategoryQueryByKeySchema, type CommercetoolsCategoryLookup, type CommercetoolsResolveCategoryQueryById, type CommercetoolsResolveCategoryQueryByKey } from '../schema/commercetools.schema.js';
30
+ import type { CommercetoolsProductSearchFactory } from '../factories/product-search/product-search.factory.js';
49
31
 
50
32
  const debug = createDebug('reactionary:commercetools:search');
51
33
 
52
- export class CommercetoolsSearchProvider extends ProductSearchProvider {
34
+ export class CommercetoolsProductSearchCapability<
35
+ TFactory extends ProductSearchFactory = CommercetoolsProductSearchFactory,
36
+ > extends ProductSearchCapability<ProductSearchFactoryOutput<TFactory>> {
53
37
  protected config: CommercetoolsConfiguration;
54
38
  protected commercetools: CommercetoolsAPI;
39
+ protected factory: ProductSearchFactoryWithOutput<TFactory>;
55
40
 
56
41
  constructor(
57
42
  config: CommercetoolsConfiguration,
58
43
  cache: Cache,
59
44
  context: RequestContext,
60
- commercetools: CommercetoolsAPI
45
+ commercetools: CommercetoolsAPI,
46
+ factory: ProductSearchFactoryWithOutput<TFactory>,
61
47
  ) {
62
48
  super(cache, context);
63
49
 
64
50
  this.config = config;
65
51
  this.commercetools = commercetools;
52
+ this.factory = factory;
66
53
  }
67
54
 
68
55
  protected async getClient() {
@@ -275,7 +262,7 @@ export class CommercetoolsSearchProvider extends ProductSearchProvider {
275
262
  })
276
263
  public override async queryByTerm(
277
264
  payload: ProductSearchQueryByTerm
278
- ): Promise<Result<ProductSearchResult>> {
265
+ ): Promise<Result<ProductSearchFactoryOutput<TFactory>>> {
279
266
  const client = await this.getClient();
280
267
 
281
268
  const facetsToReturn = await this.getFacetsToReturn(payload);
@@ -327,10 +314,11 @@ export class CommercetoolsSearchProvider extends ProductSearchProvider {
327
314
  .execute();
328
315
 
329
316
  const responseBody = response.body;
330
- const result = this.parsePaginatedResult(
317
+ const result = this.factory.parseSearchResult(
318
+ this.context,
331
319
  responseBody,
332
- payload
333
- ) as ProductSearchResult;
320
+ payload,
321
+ );
334
322
 
335
323
 
336
324
  // ok, we have to patch up the categories facet to have the category keys instead of ids
@@ -358,7 +346,7 @@ export class CommercetoolsSearchProvider extends ProductSearchProvider {
358
346
  return success(result);
359
347
  }
360
348
 
361
- protected async patchCategoryFacetValues(result: ProductSearchResult) {
349
+ protected async patchCategoryFacetValues(result: ProductSearchFactoryOutput<TFactory>) {
362
350
  const categoryFacet = result.facets.find(
363
351
  (f) => f.identifier.key === 'categories'
364
352
  );
@@ -384,145 +372,4 @@ export class CommercetoolsSearchProvider extends ProductSearchProvider {
384
372
  }
385
373
 
386
374
 
387
- protected parseSingle(body: ProductProjection) {
388
- const identifier = { key: body.id };
389
- const name = body.name[this.context.languageContext.locale] || body.id;
390
- const slug = body.slug?.[this.context.languageContext.locale] || body.id;
391
- const variants = [body.masterVariant, ...body.variants].map((variant) =>
392
- this.parseVariant(variant, body)
393
- );
394
-
395
- const product = {
396
- identifier,
397
- name,
398
- slug,
399
- variants,
400
- } satisfies ProductSearchResultItem;
401
-
402
- return product;
403
- }
404
-
405
- protected parsePaginatedResult(
406
- body: ProductPagedSearchResponse,
407
- query: ProductSearchQueryByTerm
408
- ) {
409
- const identifier = {
410
- ...query.search,
411
- } satisfies SearchIdentifier;
412
-
413
- const products: ProductSearchResultItem[] = body.results.map((p) =>
414
- this.parseSingle(p.productProjection!)
415
- );
416
- const facets: ProductSearchResultFacet[] = [];
417
-
418
- for (const facet of body.facets) {
419
- const facetIdentifier = FacetIdentifierSchema.parse({
420
- key: facet.name,
421
- } satisfies Partial<FacetIdentifier>);
422
-
423
- const candidateFacet = this.parseFacet(facetIdentifier, facet);
424
- if (candidateFacet.values.length > 0) {
425
- facets.push(candidateFacet);
426
- }
427
- }
428
-
429
- const result = {
430
- identifier,
431
- pageNumber: (Math.ceil(body.offset / body.limit) || 0) + 1,
432
- pageSize: body.limit,
433
- totalCount: body.total || 0,
434
- totalPages: Math.ceil((body.total || 0) / body.limit || 0) + 1,
435
- items: products,
436
- facets,
437
- } satisfies ProductSearchResult;
438
-
439
- return result;
440
- }
441
-
442
- /**
443
- * See version 0.0.81 for ProductProjection based facet parsing
444
- * @param facetIdentifier
445
- * @param facetValue
446
- * @returns
447
- */
448
- protected parseFacet(
449
- facetIdentifier: FacetIdentifier,
450
- facet: CTProductSearchFacetResult
451
- ): ProductSearchResultFacet {
452
- const result: ProductSearchResultFacet =
453
- ProductSearchResultFacetSchema.parse({
454
- identifier: facetIdentifier,
455
- name: facet.name,
456
- values: [],
457
- });
458
-
459
- const distinctFacet = facet as CTProductSearchFacetResultBucket;
460
- if (distinctFacet) {
461
- distinctFacet.buckets.forEach((bucket) => {
462
- const facetValueIdentifier = FacetValueIdentifierSchema.parse({
463
- facet: facetIdentifier,
464
- key: bucket.key,
465
- } satisfies Partial<FacetValueIdentifier>);
466
-
467
- result.values.push(
468
- this.parseFacetValue(facetValueIdentifier, bucket.key, bucket.count)
469
- );
470
- });
471
- }
472
-
473
- return result;
474
- }
475
-
476
- protected parseFacetValue(
477
- facetValueIdentifier: FacetValueIdentifier,
478
- label: string,
479
- count: number
480
- ): ProductSearchResultFacetValue {
481
-
482
- return ProductSearchResultFacetValueSchema.parse({
483
- identifier: facetValueIdentifier,
484
- name: label,
485
- count: count,
486
- active: false,
487
- } satisfies Partial<ProductSearchResultFacetValue>);
488
- }
489
-
490
- protected parseVariant(
491
- variant: CTProductVariant,
492
- product: ProductProjection
493
- ): ProductSearchResultItemVariant {
494
- const sourceImage = variant.images?.[0];
495
-
496
- const img = ImageSchema.parse({
497
- sourceUrl: sourceImage?.url || '',
498
- height: sourceImage?.dimensions.h || undefined,
499
- width: sourceImage?.dimensions.w || undefined,
500
- altText:
501
- sourceImage?.label ||
502
- product.name[this.context.languageContext.locale] ||
503
- undefined,
504
- });
505
-
506
- const mappedOptions =
507
- variant.attributes
508
- ?.filter((x) => x.name === 'Color')
509
- .map((opt) =>
510
- ProductVariantOptionSchema.parse({
511
- identifier: ProductOptionIdentifierSchema.parse({
512
- key: opt.name,
513
- } satisfies Partial<ProductOptionIdentifier>),
514
- name: opt.value || '',
515
- } satisfies Partial<ProductVariantOption>)
516
- ) || [];
517
-
518
- const mappedOption = mappedOptions?.[0];
519
-
520
- return ProductSearchResultItemVariantSchema.parse({
521
- variant: ProductVariantIdentifierSchema.parse({
522
- sku: variant.sku || '',
523
- } satisfies ProductVariantIdentifier),
524
- image: img,
525
- options: mappedOption,
526
- } satisfies Partial<ProductSearchResultItemVariant>);
527
- }
528
375
  }