@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,5 +1,5 @@
1
1
  import {
2
- ProductAssociationsProvider,
2
+ ProductAssociationsCapability,
3
3
  Reactionary,
4
4
  type ProductAssociationsGetAccessoriesQuery,
5
5
  type ProductAssociationsGetSparepartsQuery,
@@ -7,23 +7,36 @@ import {
7
7
  type Result,
8
8
  success,
9
9
  type ProductAssociation,
10
+ type Cache,
10
11
  type ProductSearchResultItem,
12
+ type RequestContext,
13
+ } from '@reactionary/core';
14
+ import type {
15
+ ProductAssociationsFactory,
16
+ ProductAssociationsFactoryOutput,
17
+ ProductAssociationsFactoryWithOutput,
11
18
  } from '@reactionary/core';
12
19
  import type { FakeConfiguration } from '../schema/configuration.schema.js';
13
- import { base, en, Faker } from '@faker-js/faker';
20
+ import { en, Faker } from '@faker-js/faker';
14
21
  import { calcSeed } from '../utilities/seed.js';
22
+ import type { FakeProductAssociationsFactory } from '../factories/product-associations/product-associations.factory.js';
15
23
 
16
- export class FakeProductAssociationsProvider extends ProductAssociationsProvider {
24
+ export class FakeProductAssociationsCapability<
25
+ TFactory extends ProductAssociationsFactory = FakeProductAssociationsFactory,
26
+ > extends ProductAssociationsCapability<ProductAssociationsFactoryOutput<TFactory>> {
17
27
  protected config: FakeConfiguration;
28
+ protected factory: ProductAssociationsFactoryWithOutput<TFactory>;
18
29
  protected faker: Faker;
19
30
 
20
31
  constructor(
21
32
  config: FakeConfiguration,
22
- cache: any,
23
- context: any
33
+ cache: Cache,
34
+ context: RequestContext,
35
+ factory: ProductAssociationsFactoryWithOutput<TFactory>,
24
36
  ) {
25
37
  super(cache, context);
26
38
  this.config = config;
39
+ this.factory = factory;
27
40
  this.faker = new Faker({ locale: [en] });
28
41
  }
29
42
 
@@ -35,7 +48,7 @@ export class FakeProductAssociationsProvider extends ProductAssociationsProvider
35
48
  })
36
49
  public override async getAccessories(
37
50
  query: ProductAssociationsGetAccessoriesQuery
38
- ): Promise<Result<ProductAssociation[]>> {
51
+ ): Promise<Result<ProductAssociationsFactoryOutput<TFactory>[]>> {
39
52
  const associatedProducts = this.generateFakeAssociatedProducts(query.forProduct.key, query.numberOfAccessories || 4, 'accessory');
40
53
 
41
54
  const result: ProductAssociation[] = associatedProducts.map(product => ({
@@ -46,7 +59,7 @@ export class FakeProductAssociationsProvider extends ProductAssociationsProvider
46
59
  product,
47
60
  } satisfies ProductAssociation));
48
61
 
49
- return success(result);
62
+ return success(result.map((x) => this.factory.parseAssociation(this.context, x)));
50
63
  }
51
64
 
52
65
  @Reactionary({
@@ -57,7 +70,7 @@ export class FakeProductAssociationsProvider extends ProductAssociationsProvider
57
70
  })
58
71
  public override async getSpareparts(
59
72
  query: ProductAssociationsGetSparepartsQuery
60
- ): Promise<Result<ProductAssociation[]>> {
73
+ ): Promise<Result<ProductAssociationsFactoryOutput<TFactory>[]>> {
61
74
  const associatedProducts = this.generateFakeAssociatedProducts(query.forProduct.key, query.numberOfSpareparts || 4, 'sparepart');
62
75
 
63
76
  const result: ProductAssociation[] = associatedProducts.map(product => ({
@@ -68,7 +81,7 @@ export class FakeProductAssociationsProvider extends ProductAssociationsProvider
68
81
  product,
69
82
  } satisfies ProductAssociation));
70
83
 
71
- return success(result);
84
+ return success(result.map((x) => this.factory.parseAssociation(this.context, x)));
72
85
  }
73
86
 
74
87
  @Reactionary({
@@ -79,7 +92,7 @@ export class FakeProductAssociationsProvider extends ProductAssociationsProvider
79
92
  })
80
93
  public override async getReplacements(
81
94
  query: ProductAssociationsGetReplacementsQuery
82
- ): Promise<Result<ProductAssociation[]>> {
95
+ ): Promise<Result<ProductAssociationsFactoryOutput<TFactory>[]>> {
83
96
  const associatedProducts = this.generateFakeAssociatedProducts(query.forProduct.key, query.numberOfReplacements || 4, 'replacement');
84
97
 
85
98
  const result: ProductAssociation[] = associatedProducts.map(product => ({
@@ -90,7 +103,7 @@ export class FakeProductAssociationsProvider extends ProductAssociationsProvider
90
103
  product,
91
104
  } satisfies ProductAssociation));
92
105
 
93
- return success(result);
106
+ return success(result.map((x) => this.factory.parseAssociation(this.context, x)));
94
107
  }
95
108
 
96
109
  private generateFakeAssociatedProducts(baseProductKey: string, count: number, type: string): ProductSearchResultItem[] {
@@ -1,54 +1,61 @@
1
1
  import {
2
- ProductReviewsProvider,
3
- Reactionary,
4
- success,
5
- error,
6
- ProductReviewSchema,
7
2
  ProductRatingSummarySchema,
8
3
  ProductReviewPaginatedResultSchema,
9
- } from '@reactionary/core';
10
- import type {
11
- ProductReview,
12
- ProductRatingSummary,
13
- ProductReviewPaginatedResult,
14
- ProductReviewsListQuery,
15
- ProductReviewsGetRatingSummaryQuery,
16
- ProductReviewMutationSubmit,
17
- Result,
18
- RequestContext,
19
- Cache,
20
- NotFoundError,
21
- InvalidInputError,
22
- ProductIdentifier,
4
+ ProductReviewSchema,
5
+ ProductReviewsCapability,
6
+ Reactionary,
7
+ error,
8
+ success,
9
+ type Cache,
10
+ type InvalidInputError,
11
+ type ProductIdentifier,
12
+ type ProductRatingSummary,
13
+ type ProductReviewsFactory,
14
+ type ProductReviewsFactoryRatingOutput,
15
+ type ProductReviewsFactoryReviewOutput,
16
+ type ProductReviewsFactoryReviewPaginatedOutput,
17
+ type ProductReviewsFactoryWithOutput,
18
+ type ProductReviewsGetRatingSummaryQuery,
19
+ type ProductReviewsListQuery,
20
+ type ProductReview,
21
+ type ProductReviewMutationSubmit,
22
+ type RequestContext,
23
+ type Result,
23
24
  } from '@reactionary/core';
24
25
  import type { FakeConfiguration } from '../schema/configuration.schema.js';
25
26
  import { base, en, Faker } from '@faker-js/faker';
26
27
  import { calcSeed } from '../utilities/seed.js';
27
-
28
- export class FakeProductReviewsProvider extends ProductReviewsProvider {
28
+ import type { FakeProductReviewsFactory } from '../factories/product-reviews/product-reviews.factory.js';
29
+
30
+ export class FakeProductReviewsCapability<
31
+ TFactory extends ProductReviewsFactory = FakeProductReviewsFactory,
32
+ > extends ProductReviewsCapability<
33
+ ProductReviewsFactoryRatingOutput<TFactory>,
34
+ ProductReviewsFactoryReviewPaginatedOutput<TFactory>,
35
+ ProductReviewsFactoryReviewOutput<TFactory>
36
+ > {
29
37
  protected config: FakeConfiguration;
38
+ protected factory: ProductReviewsFactoryWithOutput<TFactory>;
30
39
  private faker: Faker;
31
40
 
32
41
  constructor(
33
42
  config: FakeConfiguration,
34
43
  cache: Cache,
35
- context: RequestContext
44
+ context: RequestContext,
45
+ factory: ProductReviewsFactoryWithOutput<TFactory>,
36
46
  ) {
37
47
  super(cache, context);
38
48
  this.config = config;
39
- this.faker = new Faker({ locale: [en] });
49
+ this.factory = factory;
50
+ this.faker = new Faker({ locale: [en, base] });
40
51
  }
41
52
 
42
53
  protected createReviewsForProduct(productIdentifier: ProductIdentifier): ProductReview[] {
43
54
  const seed = calcSeed(productIdentifier.key);
44
- this.faker.seed(seed); // Seed faker with product key for consistent results
45
-
46
- const hasAnyReviews = this.faker.datatype.boolean({ probability: 0.5 }); // 50% chance that the product has reviews
47
- if (!hasAnyReviews) {
48
- return [];
49
- }
55
+ this.faker.seed(seed);
50
56
 
51
- if (productIdentifier.key === 'unknown-product-id') {
57
+ const hasAnyReviews = this.faker.datatype.boolean({ probability: 0.5 });
58
+ if (!hasAnyReviews || productIdentifier.key === 'unknown-product-id') {
52
59
  return [];
53
60
  }
54
61
 
@@ -56,9 +63,9 @@ export class FakeProductReviewsProvider extends ProductReviewsProvider {
56
63
  const totalReviews = this.faker.number.int({ min: 1, max: 20 });
57
64
 
58
65
  for (let i = 0; i < totalReviews; i++) {
59
- const hasReply = this.faker.datatype.boolean({ probability: 0.3 }); // 30% chance that the review has a reply
66
+ const hasReply = this.faker.datatype.boolean({ probability: 0.3 });
60
67
 
61
- const review = {
68
+ reviews.push({
62
69
  identifier: {
63
70
  key: `fake-review-${productIdentifier.key}-${i}`,
64
71
  },
@@ -69,48 +76,38 @@ export class FakeProductReviewsProvider extends ProductReviewsProvider {
69
76
  title: this.faker.lorem.sentence(),
70
77
  content: this.faker.lorem.paragraphs({ min: 1, max: 5 }),
71
78
  createdAt: this.faker.date.past({ years: 1 }).toISOString(),
72
- updatedAt: this.faker.datatype.boolean() ? this.faker.date.recent({ days: 30 }).toISOString() : undefined,
79
+ updatedAt: this.faker.datatype.boolean()
80
+ ? this.faker.date.recent({ days: 30 }).toISOString()
81
+ : undefined,
73
82
  verified: this.faker.datatype.boolean(),
74
83
  reply: hasReply ? this.faker.lorem.sentences(2) : undefined,
75
84
  repliedAt: hasReply ? this.faker.date.recent({ days: 7 }).toISOString() : undefined,
76
-
77
- } satisfies ProductReview;
78
-
79
- reviews.push(review);
85
+ });
80
86
  }
81
87
 
82
- return reviews.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()); // Sort reviews by created date descending
88
+ return reviews.sort(
89
+ (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),
90
+ );
83
91
  }
84
92
 
85
-
86
93
  @Reactionary({
87
94
  outputSchema: ProductRatingSummarySchema,
88
95
  cache: true,
89
96
  cacheTimeToLiveInSeconds: 300,
90
97
  currencyDependentCaching: false,
91
- localeDependentCaching: false
98
+ localeDependentCaching: false,
92
99
  })
93
100
  public override async getRatingSummary(
94
- query: ProductReviewsGetRatingSummaryQuery
95
- ): Promise<Result<ProductRatingSummary>> {
96
-
101
+ query: ProductReviewsGetRatingSummaryQuery,
102
+ ): Promise<Result<ProductReviewsFactoryRatingOutput<TFactory>>> {
97
103
  const reviews = this.createReviewsForProduct(query.product);
98
104
  if (reviews.length === 0) {
99
- // If there are no reviews, return a summary with averageRating 0 and totalRatings 0
100
105
  const emptySummary = this.createEmptyProductRatingSummary({ product: query.product });
101
- return success(emptySummary);
106
+ return success(this.factory.parseRatingSummary(this.context, emptySummary));
102
107
  }
103
108
 
104
109
  const totalRatings = reviews.length;
105
- const averageRating = reviews.reduce((sum, review) => sum + review.rating, 0) / (totalRatings || 1);
106
-
107
- const ratingDistribution = {
108
- '1': reviews.filter(x => x.rating === 1).length,
109
- '2': reviews.filter(x => x.rating === 2).length,
110
- '3': reviews.filter(x => x.rating === 3).length,
111
- '4': reviews.filter(x => x.rating === 4).length,
112
- '5': reviews.filter(x => x.rating === 5).length,
113
- };
110
+ const averageRating = reviews.reduce((sum, review) => sum + review.rating, 0) / totalRatings;
114
111
 
115
112
  const summary: ProductRatingSummary = {
116
113
  identifier: {
@@ -118,10 +115,16 @@ export class FakeProductReviewsProvider extends ProductReviewsProvider {
118
115
  },
119
116
  averageRating,
120
117
  totalRatings,
121
- ratingDistribution,
118
+ ratingDistribution: {
119
+ '1': reviews.filter((x) => x.rating === 1).length,
120
+ '2': reviews.filter((x) => x.rating === 2).length,
121
+ '3': reviews.filter((x) => x.rating === 3).length,
122
+ '4': reviews.filter((x) => x.rating === 4).length,
123
+ '5': reviews.filter((x) => x.rating === 5).length,
124
+ },
122
125
  };
123
126
 
124
- return success(summary);
127
+ return success(this.factory.parseRatingSummary(this.context, summary));
125
128
  }
126
129
 
127
130
  @Reactionary({
@@ -129,19 +132,18 @@ export class FakeProductReviewsProvider extends ProductReviewsProvider {
129
132
  cache: true,
130
133
  cacheTimeToLiveInSeconds: 60,
131
134
  currencyDependentCaching: false,
132
- localeDependentCaching: true
135
+ localeDependentCaching: true,
133
136
  })
134
137
  public override async findReviews(
135
- query: ProductReviewsListQuery
136
- ): Promise<Result<ProductReviewPaginatedResult>> {
138
+ query: ProductReviewsListQuery,
139
+ ): Promise<Result<ProductReviewsFactoryReviewPaginatedOutput<TFactory>>> {
137
140
  const pageSize = query.paginationOptions?.pageSize ?? 20;
138
141
  const pageNumber = query.paginationOptions?.pageNumber ?? 1;
139
142
 
140
143
  const reviews = this.createReviewsForProduct(query.product);
141
-
142
144
  const returnedReviews = reviews.slice((pageNumber - 1) * pageSize, pageNumber * pageSize);
143
145
 
144
- const paginatedResult: ProductReviewPaginatedResult = {
146
+ const result = {
145
147
  items: returnedReviews,
146
148
  totalCount: reviews.length,
147
149
  pageSize,
@@ -149,7 +151,7 @@ export class FakeProductReviewsProvider extends ProductReviewsProvider {
149
151
  totalPages: Math.ceil(reviews.length / Math.max(pageSize, 1)),
150
152
  };
151
153
 
152
- return success(paginatedResult);
154
+ return success(this.factory.parseReviewPaginatedResult(this.context, result));
153
155
  }
154
156
 
155
157
  @Reactionary({
@@ -157,18 +159,18 @@ export class FakeProductReviewsProvider extends ProductReviewsProvider {
157
159
  cache: false,
158
160
  cacheTimeToLiveInSeconds: 0,
159
161
  currencyDependentCaching: false,
160
- localeDependentCaching: false
162
+ localeDependentCaching: false,
161
163
  })
162
164
  public override async submitReview(
163
- mutation: ProductReviewMutationSubmit
164
- ): Promise<Result<ProductReview>> {
165
- // For fake provider, we always succeed and return a fake review
166
-
165
+ mutation: ProductReviewMutationSubmit,
166
+ ): Promise<Result<ProductReviewsFactoryReviewOutput<TFactory>>> {
167
167
  if (this.context.session.identityContext.identity.type !== 'Registered') {
168
- return error<InvalidInputError>({ type: 'InvalidInput', error: 'Only registered users can submit reviews.' });
168
+ return error<InvalidInputError>({
169
+ type: 'InvalidInput',
170
+ error: 'Only registered users can submit reviews.',
171
+ });
169
172
  }
170
173
 
171
-
172
174
  const review: ProductReview = {
173
175
  identifier: {
174
176
  key: this.faker.string.uuid(),
@@ -182,6 +184,6 @@ export class FakeProductReviewsProvider extends ProductReviewsProvider {
182
184
  verified: this.faker.datatype.boolean(),
183
185
  };
184
186
 
185
- return success(review);
187
+ return success(this.factory.parseReview(this.context, review));
186
188
  }
187
189
  }
@@ -1,45 +1,47 @@
1
1
  import {
2
2
  ImageSchema,
3
- ProductSearchProvider,
3
+ ProductSearchCapability,
4
4
  ProductSearchQueryByTermSchema,
5
5
  ProductSearchResultItemSchema,
6
6
  ProductSearchResultSchema,
7
7
  Reactionary,
8
8
  success,
9
- error,
10
- } from '@reactionary/core';
11
- import type {
12
- ProductSearchResult,
13
- ProductSearchResultFacet,
14
- ProductSearchResultItem,
15
- Cache as ReactionaryCache,
16
- Image,
17
- FacetIdentifier,
18
- FacetValueIdentifier,
19
- ProductSearchResultFacetValue,
20
- ProductSearchResultItemVariant,
21
- ProductSearchQueryCreateNavigationFilter,
22
- Result,
23
- } from '@reactionary/core';
24
- import type {
25
- RequestContext,
26
- ProductSearchQueryByTerm,
9
+ type Cache,
10
+ type FacetIdentifier,
11
+ type FacetValueIdentifier,
12
+ type ProductSearchFactory,
13
+ type ProductSearchFactoryOutput,
14
+ type ProductSearchFactoryWithOutput,
15
+ type ProductSearchQueryByTerm,
16
+ type ProductSearchQueryCreateNavigationFilter,
17
+ type ProductSearchResult,
18
+ type ProductSearchResultFacet,
19
+ type ProductSearchResultItem,
20
+ type ProductSearchResultItemVariant,
21
+ type RequestContext,
22
+ type Result,
27
23
  } from '@reactionary/core';
28
24
  import type { FakeConfiguration } from '../schema/configuration.schema.js';
29
25
  import { Faker, en, base } from '@faker-js/faker';
30
26
  import { jitter } from '../utilities/jitter.js';
27
+ import type { FakeProductSearchFactory } from '../factories/product-search/product-search.factory.js';
31
28
 
32
- export class FakeSearchProvider extends ProductSearchProvider {
29
+ export class FakeProductSearchCapability<
30
+ TFactory extends ProductSearchFactory = FakeProductSearchFactory,
31
+ > extends ProductSearchCapability<ProductSearchFactoryOutput<TFactory>> {
33
32
  protected config: FakeConfiguration;
33
+ protected factory: ProductSearchFactoryWithOutput<TFactory>;
34
34
 
35
35
  constructor(
36
36
  config: FakeConfiguration,
37
- cache: ReactionaryCache,
38
- context: RequestContext
37
+ cache: Cache,
38
+ context: RequestContext,
39
+ factory: ProductSearchFactoryWithOutput<TFactory>,
39
40
  ) {
40
41
  super(cache, context);
41
42
 
42
43
  this.config = config;
44
+ this.factory = factory;
43
45
  }
44
46
 
45
47
  @Reactionary({
@@ -47,25 +49,17 @@ export class FakeSearchProvider extends ProductSearchProvider {
47
49
  outputSchema: ProductSearchResultSchema,
48
50
  })
49
51
  public override async queryByTerm(
50
- payload: ProductSearchQueryByTerm
51
- ): Promise<Result<ProductSearchResult>> {
52
+ payload: ProductSearchQueryByTerm,
53
+ ): Promise<Result<ProductSearchFactoryOutput<TFactory>>> {
52
54
  await jitter(this.config.jitter.mean, this.config.jitter.deviation);
53
55
 
54
56
  const query = payload.search;
55
57
 
56
58
  const querySpecificity =
57
- 20 -
58
- query.term.length -
59
- query.paginationOptions.pageNumber -
60
- query.facets.length;
59
+ 20 - query.term.length - query.paginationOptions.pageNumber - query.facets.length;
61
60
  const totalProducts = 10 * querySpecificity;
62
- const totalPages = Math.ceil(
63
- totalProducts / query.paginationOptions.pageSize
64
- );
65
- const productsOnPage = Math.min(
66
- totalProducts,
67
- query.paginationOptions.pageSize
68
- );
61
+ const totalPages = Math.ceil(totalProducts / query.paginationOptions.pageSize);
62
+ const productsOnPage = Math.min(totalProducts, query.paginationOptions.pageSize);
69
63
 
70
64
  const productGenerator = new Faker({
71
65
  seed: querySpecificity,
@@ -77,8 +71,8 @@ export class FakeSearchProvider extends ProductSearchProvider {
77
71
  locale: [en, base],
78
72
  });
79
73
 
80
- const products = new Array<ProductSearchResultItem>();
81
- const facets = new Array<ProductSearchResultFacet>();
74
+ const products: ProductSearchResultItem[] = [];
75
+ const facets: ProductSearchResultFacet[] = [];
82
76
 
83
77
  for (let i = 0; i < productsOnPage; i++) {
84
78
  const srcUrl = productGenerator.image.urlPicsumPhotos({
@@ -93,12 +87,12 @@ export class FakeSearchProvider extends ProductSearchProvider {
93
87
  altText: 'Fake product image',
94
88
  height: 300,
95
89
  width: 300,
96
- } satisfies Partial<Image>);
90
+ });
97
91
 
98
92
  products.push(
99
93
  ProductSearchResultItemSchema.parse({
100
94
  identifier: {
101
- key: 'product_' + productGenerator.commerce.isbn(),
95
+ key: `product_${productGenerator.commerce.isbn()}`,
102
96
  },
103
97
  name: productGenerator.commerce.productName(),
104
98
  slug: productGenerator.lorem.slug(),
@@ -111,18 +105,16 @@ export class FakeSearchProvider extends ProductSearchProvider {
111
105
  options: undefined,
112
106
  } satisfies Partial<ProductSearchResultItemVariant>,
113
107
  ],
114
- } satisfies Partial<ProductSearchResultItem>)
108
+ }),
115
109
  );
116
110
  }
117
111
 
118
- const facetBase = ['color', 'size'];
119
-
120
- for (const base of facetBase) {
112
+ for (const baseFacet of ['color', 'size']) {
121
113
  const facet: ProductSearchResultFacet = {
122
114
  identifier: {
123
- key: base,
115
+ key: baseFacet,
124
116
  },
125
- name: base,
117
+ name: baseFacet,
126
118
  values: [],
127
119
  };
128
120
 
@@ -130,7 +122,7 @@ export class FakeSearchProvider extends ProductSearchProvider {
130
122
  const valueKey = i.toString();
131
123
  const isActive =
132
124
  query.facets.find(
133
- (x) => x.facet.key === facet.identifier.key && x.key === valueKey
125
+ (x) => x.facet.key === facet.identifier.key && x.key === valueKey,
134
126
  ) !== undefined;
135
127
 
136
128
  facet.values.push({
@@ -149,7 +141,7 @@ export class FakeSearchProvider extends ProductSearchProvider {
149
141
  facets.push(facet);
150
142
  }
151
143
 
152
- const result = ProductSearchResultSchema.parse({
144
+ const result = {
153
145
  identifier: {
154
146
  term: query.term,
155
147
  paginationOptions: {
@@ -159,19 +151,19 @@ export class FakeSearchProvider extends ProductSearchProvider {
159
151
  facets: query.facets,
160
152
  filters: [],
161
153
  },
162
- facets: facets,
154
+ facets,
163
155
  items: products,
164
156
  pageNumber: query.paginationOptions.pageNumber,
165
157
  pageSize: query.paginationOptions.pageSize,
166
158
  totalCount: totalProducts,
167
- totalPages: totalPages,
168
- } satisfies ProductSearchResult);
159
+ totalPages,
160
+ } satisfies ProductSearchResult;
169
161
 
170
- return success(result);
162
+ return success(this.factory.parseSearchResult(this.context, result, payload));
171
163
  }
172
164
 
173
165
  public override async createCategoryNavigationFilter(
174
- payload: ProductSearchQueryCreateNavigationFilter
166
+ payload: ProductSearchQueryCreateNavigationFilter,
175
167
  ): Promise<Result<FacetValueIdentifier>> {
176
168
  const facetIdentifier = {
177
169
  key: 'category',
@@ -184,23 +176,4 @@ export class FakeSearchProvider extends ProductSearchProvider {
184
176
  return success(facetValueIdentifier);
185
177
  }
186
178
 
187
- protected override parseFacetValue(
188
- facetValueIdentifier: FacetValueIdentifier,
189
- label: string,
190
- count: number
191
- ): ProductSearchResultFacetValue {
192
- throw new Error('Method not implemented.');
193
- }
194
- protected override parseFacet(
195
- facetIdentifier: FacetIdentifier,
196
- facetValue: unknown
197
- ): ProductSearchResultFacet {
198
- throw new Error('Method not implemented.');
199
- }
200
- protected override parseVariant(
201
- variant: unknown,
202
- product: unknown
203
- ): ProductSearchResultItemVariant {
204
- throw new Error('Method not implemented.');
205
- }
206
179
  }