@reactionary/source 0.6.1 → 0.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (453) hide show
  1. package/README.md +33 -11
  2. package/examples/node/package.json +7 -7
  3. package/examples/node/src/basic/basic-node-provider-model-extension.spec.ts +11 -5
  4. package/examples/node/src/basic/basic-node-provider-query-extension.spec.ts +9 -3
  5. package/examples/node/src/basic/basic-node-setup.spec.ts +6 -2
  6. package/examples/node/src/basic/client-creation.spec.ts +6 -6
  7. package/examples/node/src/utils.ts +48 -48
  8. package/examples/node/tsconfig.lib.json +2 -1
  9. package/package.json +1 -1
  10. package/packages/algolia/README.md +11 -0
  11. package/{providers/google-analytics → packages/algolia}/eslint.config.mjs +0 -2
  12. package/{providers → packages}/algolia/package.json +7 -5
  13. package/{providers/posthog → packages/algolia}/project.json +6 -6
  14. package/{providers/algolia/src/providers/analytics.provider.ts → packages/algolia/src/capabilities/analytics.capability.ts} +6 -6
  15. package/packages/algolia/src/capabilities/index.ts +3 -0
  16. package/{providers/algolia/src/providers/product-recommendations.provider.ts → packages/algolia/src/capabilities/product-recommendations.capability.ts} +3 -3
  17. package/packages/algolia/src/capabilities/product-search.capability.ts +119 -0
  18. package/packages/algolia/src/core/initialize.ts +82 -0
  19. package/packages/algolia/src/core/initialize.types.ts +107 -0
  20. package/packages/algolia/src/factories/index.ts +1 -0
  21. package/packages/algolia/src/factories/product-search/product-search.factory.ts +182 -0
  22. package/{providers/fake → packages/algolia}/src/index.ts +3 -2
  23. package/packages/algolia/src/schema/capabilities.schema.ts +84 -0
  24. package/{providers → packages}/algolia/src/test/analytics.spec.ts +12 -4
  25. package/packages/algolia/src/test/client-builder-product-search-extension.example.ts +85 -0
  26. package/packages/algolia/vite.config.ts +26 -0
  27. package/packages/algolia/vitest.config.mts +21 -0
  28. package/packages/commercetools/README.md +11 -0
  29. package/{core → packages/commercetools}/eslint.config.mjs +2 -2
  30. package/packages/commercetools/package.json +17 -0
  31. package/{providers → packages}/commercetools/project.json +7 -8
  32. package/{providers/commercetools/src/providers/cart.provider.ts → packages/commercetools/src/capabilities/cart.capability.ts} +68 -194
  33. package/{providers/commercetools/src/providers/category.provider.ts → packages/commercetools/src/capabilities/category.capability.ts} +26 -66
  34. package/{providers/commercetools/src/providers/checkout.provider.ts → packages/commercetools/src/capabilities/checkout.capability.ts} +51 -323
  35. package/{providers/commercetools/src/providers/identity.provider.ts → packages/commercetools/src/capabilities/identity.capability.ts} +36 -16
  36. package/packages/commercetools/src/capabilities/index.ts +15 -0
  37. package/{providers/commercetools/src/providers/inventory.provider.ts → packages/commercetools/src/capabilities/inventory.capability.ts} +14 -32
  38. package/packages/commercetools/src/capabilities/order-search.capability.ts +135 -0
  39. package/packages/commercetools/src/capabilities/order.capability.ts +67 -0
  40. package/{providers/commercetools/src/providers/price.provider.ts → packages/commercetools/src/capabilities/price.capability.ts} +38 -52
  41. package/{providers/commercetools/src/providers/product-associations.provider.ts → packages/commercetools/src/capabilities/product-associations.capability.ts} +40 -105
  42. package/{providers/commercetools/src/providers/product-list.provider.ts → packages/commercetools/src/capabilities/product-list.capability.ts} +39 -24
  43. package/{providers/commercetools/src/providers/product-reviews.provider.ts → packages/commercetools/src/capabilities/product-reviews.capability.ts} +35 -15
  44. package/{providers/commercetools/src/providers/product-search.provider.ts → packages/commercetools/src/capabilities/product-search.capability.ts} +18 -171
  45. package/packages/commercetools/src/capabilities/product.capability.ts +133 -0
  46. package/{providers/commercetools/src/providers/profile.provider.ts → packages/commercetools/src/capabilities/profile.capability.ts} +28 -74
  47. package/{providers/commercetools/src/providers/store.provider.ts → packages/commercetools/src/capabilities/store.capability.ts} +14 -32
  48. package/packages/commercetools/src/core/capability-descriptors.ts +324 -0
  49. package/{providers → packages}/commercetools/src/core/client.ts +2 -2
  50. package/packages/commercetools/src/core/initialize.ts +58 -0
  51. package/packages/commercetools/src/core/initialize.types.ts +174 -0
  52. package/packages/commercetools/src/factories/cart/cart.factory.ts +142 -0
  53. package/packages/commercetools/src/factories/category/category.factory.ts +77 -0
  54. package/packages/commercetools/src/factories/checkout/checkout-initializer-overrides.example.ts +94 -0
  55. package/packages/commercetools/src/factories/checkout/checkout.factory.ts +338 -0
  56. package/packages/commercetools/src/factories/identity/identity.factory.ts +26 -0
  57. package/packages/commercetools/src/factories/inventory/inventory.factory.ts +49 -0
  58. package/packages/commercetools/src/factories/order/order.factory.ts +149 -0
  59. package/packages/commercetools/src/factories/order-search/order-search.factory.ts +108 -0
  60. package/packages/commercetools/src/factories/price/price.factory.ts +76 -0
  61. package/packages/commercetools/src/factories/product/product-capability-custom-method-only.example.ts +47 -0
  62. package/packages/commercetools/src/factories/product/product-capability-schema-signature-extension.example.ts +61 -0
  63. package/packages/commercetools/src/factories/product/product-factory-baseline.example.ts +14 -0
  64. package/packages/commercetools/src/factories/product/product-factory-schema-and-parse-extension.example.ts +35 -0
  65. package/packages/commercetools/src/factories/product/product-factory-schema-extension.example.ts +23 -0
  66. package/packages/commercetools/src/factories/product/product-initializer-factory-extension.example.ts +41 -0
  67. package/packages/commercetools/src/factories/product/product.factory.ts +220 -0
  68. package/packages/commercetools/src/factories/product/utils.example.ts +9 -0
  69. package/packages/commercetools/src/factories/product-associations/product-associations.factory.ts +103 -0
  70. package/packages/commercetools/src/factories/product-list/product-list.factory.ts +122 -0
  71. package/packages/commercetools/src/factories/product-reviews/product-reviews.factory.ts +81 -0
  72. package/packages/commercetools/src/factories/product-search/product-search.factory.ts +182 -0
  73. package/packages/commercetools/src/factories/profile/profile.factory.ts +94 -0
  74. package/packages/commercetools/src/factories/store/store.factory.ts +49 -0
  75. package/packages/commercetools/src/index.ts +30 -0
  76. package/packages/commercetools/src/schema/capabilities.schema.ts +260 -0
  77. package/{providers → packages}/commercetools/src/test/caching.spec.ts +24 -8
  78. package/packages/commercetools/src/test/client-builder-merge-extensions.example.ts +125 -0
  79. package/{providers/algolia → packages/commercetools}/tsconfig.json +1 -1
  80. package/{core → packages/commercetools}/tsconfig.lib.json +1 -1
  81. package/packages/commercetools/tsconfig.spec.json +28 -0
  82. package/packages/commercetools/vite.config.ts +26 -0
  83. package/packages/commercetools/vitest.config.mts +21 -0
  84. package/{providers/fake → packages/core}/eslint.config.mjs +2 -1
  85. package/{core → packages/core}/package.json +7 -7
  86. package/packages/core/project.json +33 -0
  87. package/{core/src/providers/analytics.provider.ts → packages/core/src/capabilities/analytics.capability.ts} +8 -8
  88. package/{core/src/providers/base.provider.ts → packages/core/src/capabilities/base.capability.ts} +2 -2
  89. package/{core/src/providers/cart.provider.ts → packages/core/src/capabilities/cart.capability.ts} +13 -11
  90. package/{core/src/providers/category.provider.ts → packages/core/src/capabilities/category.capability.ts} +12 -10
  91. package/{core/src/providers/checkout.provider.ts → packages/core/src/capabilities/checkout.capability.ts} +15 -11
  92. package/{core/src/providers/identity.provider.ts → packages/core/src/capabilities/identity.capability.ts} +8 -8
  93. package/packages/core/src/capabilities/index.ts +18 -0
  94. package/{core/src/providers/inventory.provider.ts → packages/core/src/capabilities/inventory.capability.ts} +5 -5
  95. package/{core/src/providers/order-search.provider.ts → packages/core/src/capabilities/order-search.capability.ts} +5 -3
  96. package/{core/src/providers/order.provider.ts → packages/core/src/capabilities/order.capability.ts} +5 -5
  97. package/{core/src/providers/price.provider.ts → packages/core/src/capabilities/price.capability.ts} +6 -6
  98. package/{core/src/providers/product-associations.provider.ts → packages/core/src/capabilities/product-associations.capability.ts} +7 -5
  99. package/{core/src/providers/product-list.provider.ts → packages/core/src/capabilities/product-list.capability.ts} +14 -9
  100. package/{core/src/providers/product-recommendations.provider.ts → packages/core/src/capabilities/product-recommendations.capability.ts} +21 -21
  101. package/{core/src/providers/product-reviews.provider.ts → packages/core/src/capabilities/product-reviews.capability.ts} +9 -5
  102. package/packages/core/src/capabilities/product-search.capability.ts +48 -0
  103. package/{core/src/providers/product.provider.ts → packages/core/src/capabilities/product.capability.ts} +7 -7
  104. package/{core/src/providers/profile.provider.ts → packages/core/src/capabilities/profile.capability.ts} +9 -9
  105. package/{core/src/providers/store.provider.ts → packages/core/src/capabilities/store.capability.ts} +3 -3
  106. package/packages/core/src/client/client-builder.ts +131 -0
  107. package/packages/core/src/client/client.ts +35 -0
  108. package/{core → packages/core}/src/decorators/reactionary.decorator.ts +7 -7
  109. package/packages/core/src/factories/cart.factory.ts +40 -0
  110. package/packages/core/src/factories/category.factory.ts +40 -0
  111. package/packages/core/src/factories/checkout.factory.ts +59 -0
  112. package/packages/core/src/factories/identity.factory.ts +26 -0
  113. package/packages/core/src/factories/index.ts +15 -0
  114. package/packages/core/src/factories/inventory.factory.ts +26 -0
  115. package/packages/core/src/factories/order-search.factory.ts +33 -0
  116. package/packages/core/src/factories/order.factory.ts +21 -0
  117. package/packages/core/src/factories/price.factory.ts +29 -0
  118. package/packages/core/src/factories/product-associations.factory.ts +30 -0
  119. package/packages/core/src/factories/product-list.factory.ts +82 -0
  120. package/packages/core/src/factories/product-reviews.factory.ts +58 -0
  121. package/packages/core/src/factories/product-search.factory.ts +31 -0
  122. package/packages/core/src/factories/product.factory.ts +21 -0
  123. package/packages/core/src/factories/profile.factory.ts +23 -0
  124. package/packages/core/src/factories/store.factory.ts +21 -0
  125. package/packages/core/src/index.ts +8 -0
  126. package/packages/core/src/test/client-builder.spec.ts +141 -0
  127. package/{core → packages/core}/src/test/reactionary.decorator.spec.ts +27 -27
  128. package/{providers/meilisearch → packages/core}/tsconfig.json +1 -1
  129. package/{providers/medusa → packages/core}/tsconfig.lib.json +1 -2
  130. package/packages/core/tsconfig.spec.json +28 -0
  131. package/packages/core/vite.config.ts +26 -0
  132. package/packages/core/vitest.config.mts +21 -0
  133. package/packages/fake/README.md +11 -0
  134. package/{providers/algolia → packages/fake}/eslint.config.mjs +2 -1
  135. package/{providers → packages}/fake/package.json +6 -4
  136. package/{providers → packages}/fake/project.json +7 -8
  137. package/{providers/fake/src/providers/analytics.provider.ts → packages/fake/src/capabilities/analytics.capability.ts} +2 -2
  138. package/{providers/fake/src/providers/cart.provider.ts → packages/fake/src/capabilities/cart.capability.ts} +24 -15
  139. package/packages/fake/src/capabilities/category.capability.ts +199 -0
  140. package/{providers/fake/src/providers/checkout.provider.ts → packages/fake/src/capabilities/checkout.capability.ts} +40 -21
  141. package/{providers/fake/src/providers/identity.provider.ts → packages/fake/src/capabilities/identity.capability.ts} +40 -34
  142. package/packages/fake/src/capabilities/index.ts +15 -0
  143. package/packages/fake/src/capabilities/inventory.capability.ts +74 -0
  144. package/packages/fake/src/capabilities/order-search.capability.ts +86 -0
  145. package/{providers/fake/src/providers/order.provider.ts → packages/fake/src/capabilities/order.capability.ts} +22 -38
  146. package/{providers/fake/src/providers/price.provider.ts → packages/fake/src/capabilities/price.capability.ts} +42 -34
  147. package/{providers/fake/src/providers/product-associations.provider.ts → packages/fake/src/capabilities/product-associations.capability.ts} +24 -11
  148. package/{providers/fake/src/providers/product-reviews.provider.ts → packages/fake/src/capabilities/product-reviews.capability.ts} +72 -70
  149. package/{providers/fake/src/providers/product-search.provider.ts → packages/fake/src/capabilities/product-search.capability.ts} +44 -71
  150. package/{providers/fake/src/providers/product.provider.ts → packages/fake/src/capabilities/product.capability.ts} +35 -33
  151. package/packages/fake/src/capabilities/profile.capability.ts +154 -0
  152. package/packages/fake/src/capabilities/store.capability.ts +72 -0
  153. package/packages/fake/src/core/initialize.ts +274 -0
  154. package/packages/fake/src/core/initialize.types.ts +164 -0
  155. package/packages/fake/src/factories/cart/cart.factory.ts +34 -0
  156. package/packages/fake/src/factories/category/category.factory.ts +40 -0
  157. package/packages/fake/src/factories/checkout/checkout.factory.ts +53 -0
  158. package/packages/fake/src/factories/identity/identity.factory.ts +25 -0
  159. package/packages/fake/src/factories/index.ts +14 -0
  160. package/packages/fake/src/factories/inventory/inventory.factory.ts +25 -0
  161. package/packages/fake/src/factories/order/order.factory.ts +22 -0
  162. package/packages/fake/src/factories/order-search/order-search.factory.ts +27 -0
  163. package/packages/fake/src/factories/price/price.factory.ts +26 -0
  164. package/packages/fake/src/factories/product/product.factory.ts +22 -0
  165. package/packages/fake/src/factories/product-associations/product-associations.factory.ts +25 -0
  166. package/packages/fake/src/factories/product-reviews/product-reviews.factory.ts +53 -0
  167. package/packages/fake/src/factories/product-search/product-search.factory.ts +27 -0
  168. package/packages/fake/src/factories/profile/profile.factory.ts +22 -0
  169. package/packages/fake/src/factories/store/store.factory.ts +22 -0
  170. package/{providers/algolia → packages/fake}/src/index.ts +4 -3
  171. package/packages/fake/src/schema/capabilities.schema.ts +178 -0
  172. package/{providers/fake/src/test/cart.provider.spec.ts → packages/fake/src/test/cart.capability.spec.ts} +24 -7
  173. package/{providers/fake/src/test/category.provider.spec.ts → packages/fake/src/test/category.capability.spec.ts} +7 -4
  174. package/{providers/fake/src/test/checkout.provider.spec.ts → packages/fake/src/test/checkout.capability.spec.ts} +15 -5
  175. package/packages/fake/src/test/client-builder-product-extension.example.ts +75 -0
  176. package/{providers/fake/src/test/order-search.provider.spec.ts → packages/fake/src/test/order-search.capability.spec.ts} +7 -10
  177. package/{providers/fake/src/test/order.provider.spec.ts → packages/fake/src/test/order.capability.spec.ts} +7 -9
  178. package/{providers/fake/src/test/price.provider.spec.ts → packages/fake/src/test/price.capability.spec.ts} +6 -4
  179. package/{providers/fake/src/test/product.provider.spec.ts → packages/fake/src/test/product.capability.spec.ts} +10 -4
  180. package/{providers/fake/src/test/profile.provider.spec.ts → packages/fake/src/test/profile.capability.spec.ts} +7 -5
  181. package/{providers/commercetools → packages/fake}/tsconfig.json +1 -1
  182. package/packages/fake/tsconfig.lib.json +23 -0
  183. package/packages/fake/tsconfig.spec.json +28 -0
  184. package/packages/fake/vite.config.ts +26 -0
  185. package/packages/fake/vitest.config.mts +21 -0
  186. package/packages/google-analytics/eslint.config.mjs +23 -0
  187. package/{providers → packages}/google-analytics/package.json +7 -5
  188. package/{providers → packages}/google-analytics/project.json +5 -5
  189. package/{providers/google-analytics/src/providers/analytics.provider.ts → packages/google-analytics/src/capabilities/analytics.capability.ts} +2 -2
  190. package/packages/google-analytics/src/core/initialize.ts +41 -0
  191. package/packages/google-analytics/src/core/initialize.types.ts +47 -0
  192. package/{providers → packages}/google-analytics/src/index.ts +2 -1
  193. package/packages/google-analytics/src/schema/capabilities.schema.ts +36 -0
  194. package/{providers/google-analytics/src/test/analytics.provider.spec.ts → packages/google-analytics/src/test/analytics.capability.spec.ts} +7 -7
  195. package/packages/google-analytics/tsconfig.json +24 -0
  196. package/packages/google-analytics/tsconfig.lib.json +23 -0
  197. package/packages/google-analytics/tsconfig.spec.json +28 -0
  198. package/{providers → packages}/google-analytics/vite.config.ts +2 -2
  199. package/{providers → packages}/google-analytics/vitest.config.mts +2 -2
  200. package/packages/medusa/README.md +11 -0
  201. package/packages/medusa/eslint.config.mjs +23 -0
  202. package/packages/medusa/package.json +17 -0
  203. package/{providers → packages}/medusa/project.json +7 -8
  204. package/{providers/medusa/src/providers/cart.provider.ts → packages/medusa/src/capabilities/cart.capability.ts} +34 -21
  205. package/{providers/medusa/src/providers/category.provider.ts → packages/medusa/src/capabilities/category.capability.ts} +31 -13
  206. package/{providers/medusa/src/providers/checkout.provider.ts → packages/medusa/src/capabilities/checkout.capability.ts} +43 -18
  207. package/{providers/medusa/src/providers/identity.provider.ts → packages/medusa/src/capabilities/identity.capability.ts} +3 -3
  208. package/{providers/medusa/src/providers/inventory.provider.ts → packages/medusa/src/capabilities/inventory.capability.ts} +22 -8
  209. package/{providers/medusa/src/providers/order-search.provider.ts → packages/medusa/src/capabilities/order-search.capability.ts} +17 -6
  210. package/{providers/medusa/src/providers/order.provider.ts → packages/medusa/src/capabilities/order.capability.ts} +18 -6
  211. package/{providers/medusa/src/providers/price.provider.ts → packages/medusa/src/capabilities/price.capability.ts} +27 -8
  212. package/{providers/medusa/src/providers/product-associations.provider.ts → packages/medusa/src/capabilities/product-associations.capability.ts} +20 -9
  213. package/{providers/medusa/src/providers/product-recommendations.provider.ts → packages/medusa/src/capabilities/product-recommendations.capability.ts} +3 -3
  214. package/{providers/medusa/src/providers/product-search.provider.ts → packages/medusa/src/capabilities/product-search.capability.ts} +20 -32
  215. package/{providers/medusa/src/providers/product.provider.ts → packages/medusa/src/capabilities/product.capability.ts} +48 -12
  216. package/{providers/medusa/src/providers/profile.provider.ts → packages/medusa/src/capabilities/profile.capability.ts} +37 -13
  217. package/packages/medusa/src/core/initialize.ts +330 -0
  218. package/packages/medusa/src/core/initialize.types.ts +184 -0
  219. package/packages/medusa/src/factories/cart/cart.factory.ts +34 -0
  220. package/packages/medusa/src/factories/category/category.factory.ts +37 -0
  221. package/packages/medusa/src/factories/checkout/checkout.factory.ts +50 -0
  222. package/packages/medusa/src/factories/identity/identity.factory.ts +22 -0
  223. package/packages/medusa/src/factories/index.ts +12 -0
  224. package/packages/medusa/src/factories/inventory/inventory.factory.ts +25 -0
  225. package/packages/medusa/src/factories/order/order.factory.ts +22 -0
  226. package/packages/medusa/src/factories/order-search/order-search.factory.ts +27 -0
  227. package/packages/medusa/src/factories/price/price.factory.ts +26 -0
  228. package/packages/medusa/src/factories/product/product.factory.ts +22 -0
  229. package/packages/medusa/src/factories/product-associations/product-associations.factory.ts +25 -0
  230. package/packages/medusa/src/factories/product-search/product-search.factory.ts +27 -0
  231. package/packages/medusa/src/factories/profile/profile.factory.ts +22 -0
  232. package/packages/medusa/src/index.ts +17 -0
  233. package/packages/medusa/src/schema/capabilities.schema.ts +231 -0
  234. package/{providers/medusa/src/test/cart.provider.spec.ts → packages/medusa/src/test/cart.capability.spec.ts} +20 -4
  235. package/{providers/medusa/src/test/category.provider.spec.ts → packages/medusa/src/test/category.capability.spec.ts} +7 -4
  236. package/{providers → packages}/medusa/src/test/checkout.spec.ts +9 -9
  237. package/{providers/medusa/src/test/identity.provider.spec.ts → packages/medusa/src/test/identity.capability.spec.ts} +3 -3
  238. package/{providers/medusa/src/test/inventory.provider.spec.ts → packages/medusa/src/test/inventory.capability.spec.ts} +6 -4
  239. package/{providers/medusa/src/test/large-cart.provider.spec.ts → packages/medusa/src/test/large-cart.capability.spec.ts} +14 -8
  240. package/{providers/medusa/src/test/price.provider.spec.ts → packages/medusa/src/test/price.capability.spec.ts} +10 -3
  241. package/{providers/medusa/src/test/product.provider.spec.ts → packages/medusa/src/test/product.capability.spec.ts} +6 -4
  242. package/{providers/medusa/src/test/search.provider.spec.ts → packages/medusa/src/test/search.capability.spec.ts} +20 -7
  243. package/{providers → packages}/medusa/src/utils/medusa-helpers.ts +1 -1
  244. package/packages/medusa/tsconfig.json +24 -0
  245. package/packages/medusa/tsconfig.lib.json +23 -0
  246. package/packages/medusa/tsconfig.spec.json +28 -0
  247. package/packages/medusa/vite.config.ts +26 -0
  248. package/packages/medusa/vitest.config.mts +21 -0
  249. package/packages/meilisearch/README.md +11 -0
  250. package/packages/meilisearch/eslint.config.mjs +23 -0
  251. package/packages/meilisearch/package.json +15 -0
  252. package/{providers → packages}/meilisearch/project.json +7 -8
  253. package/packages/meilisearch/src/capabilities/index.ts +3 -0
  254. package/{providers/meilisearch/src/providers/order-search.provider.ts → packages/meilisearch/src/capabilities/order-search.capability.ts} +22 -7
  255. package/{providers/meilisearch/src/providers/product-recommendations.provider.ts → packages/meilisearch/src/capabilities/product-recommendations.capability.ts} +3 -3
  256. package/{providers/meilisearch/src/providers/product-search.provider.ts → packages/meilisearch/src/capabilities/product-search.capability.ts} +25 -9
  257. package/packages/meilisearch/src/core/initialize.ts +94 -0
  258. package/packages/meilisearch/src/core/initialize.types.ts +119 -0
  259. package/packages/meilisearch/src/factories/index.ts +2 -0
  260. package/packages/meilisearch/src/factories/order-search/order-search.factory.ts +27 -0
  261. package/packages/meilisearch/src/factories/product-search/product-search.factory.ts +27 -0
  262. package/packages/meilisearch/src/index.ts +9 -0
  263. package/packages/meilisearch/src/schema/capabilities.schema.ts +98 -0
  264. package/packages/meilisearch/tsconfig.json +24 -0
  265. package/packages/meilisearch/tsconfig.lib.json +23 -0
  266. package/packages/meilisearch/tsconfig.spec.json +28 -0
  267. package/packages/meilisearch/vite.config.ts +26 -0
  268. package/packages/meilisearch/vitest.config.mts +21 -0
  269. package/tsconfig.base.json +13 -21
  270. package/core/project.json +0 -34
  271. package/core/src/client/client-builder.ts +0 -84
  272. package/core/src/client/client.ts +0 -35
  273. package/core/src/index.ts +0 -6
  274. package/core/src/providers/index.ts +0 -18
  275. package/core/src/providers/product-search.provider.ts +0 -61
  276. package/core/src/test/client-builder.spec.ts +0 -60
  277. package/core/tsconfig.json +0 -24
  278. package/core/tsconfig.spec.json +0 -4
  279. package/core/vitest.config.ts +0 -14
  280. package/providers/algolia/README.md +0 -56
  281. package/providers/algolia/project.json +0 -34
  282. package/providers/algolia/src/core/initialize.ts +0 -27
  283. package/providers/algolia/src/providers/index.ts +0 -3
  284. package/providers/algolia/src/providers/product-search.provider.ts +0 -236
  285. package/providers/algolia/src/schema/capabilities.schema.ts +0 -10
  286. package/providers/algolia/tsconfig.lib.json +0 -10
  287. package/providers/algolia/tsconfig.spec.json +0 -4
  288. package/providers/algolia/vitest.config.ts +0 -14
  289. package/providers/commercetools/README.md +0 -65
  290. package/providers/commercetools/eslint.config.mjs +0 -22
  291. package/providers/commercetools/package.json +0 -15
  292. package/providers/commercetools/src/core/initialize.ts +0 -174
  293. package/providers/commercetools/src/index.ts +0 -15
  294. package/providers/commercetools/src/providers/index.ts +0 -15
  295. package/providers/commercetools/src/providers/order-search.provider.ts +0 -229
  296. package/providers/commercetools/src/providers/order.provider.ts +0 -198
  297. package/providers/commercetools/src/providers/product.provider.ts +0 -312
  298. package/providers/commercetools/src/schema/capabilities.schema.ts +0 -22
  299. package/providers/commercetools/tsconfig.lib.json +0 -10
  300. package/providers/commercetools/tsconfig.spec.json +0 -4
  301. package/providers/commercetools/vitest.config.ts +0 -15
  302. package/providers/fake/README.md +0 -23
  303. package/providers/fake/src/core/initialize.ts +0 -105
  304. package/providers/fake/src/providers/category.provider.ts +0 -184
  305. package/providers/fake/src/providers/index.ts +0 -15
  306. package/providers/fake/src/providers/inventory.provider.ts +0 -72
  307. package/providers/fake/src/providers/order-search.provider.ts +0 -78
  308. package/providers/fake/src/providers/profile.provider.ts +0 -147
  309. package/providers/fake/src/providers/store.provider.ts +0 -56
  310. package/providers/fake/src/schema/capabilities.schema.ts +0 -21
  311. package/providers/fake/tsconfig.json +0 -25
  312. package/providers/fake/tsconfig.lib.json +0 -11
  313. package/providers/fake/tsconfig.spec.json +0 -4
  314. package/providers/fake/vitest.config.ts +0 -14
  315. package/providers/google-analytics/src/core/initialize.ts +0 -16
  316. package/providers/google-analytics/src/schema/capabilities.schema.ts +0 -10
  317. package/providers/medusa/README.md +0 -30
  318. package/providers/medusa/TESTING.md +0 -98
  319. package/providers/medusa/eslint.config.mjs +0 -19
  320. package/providers/medusa/package.json +0 -15
  321. package/providers/medusa/src/core/initialize.ts +0 -87
  322. package/providers/medusa/src/index.ts +0 -15
  323. package/providers/medusa/src/schema/capabilities.schema.ts +0 -20
  324. package/providers/medusa/tsconfig.json +0 -24
  325. package/providers/medusa/tsconfig.spec.json +0 -4
  326. package/providers/medusa/vitest.config.ts +0 -15
  327. package/providers/meilisearch/README.md +0 -48
  328. package/providers/meilisearch/eslint.config.mjs +0 -22
  329. package/providers/meilisearch/package.json +0 -13
  330. package/providers/meilisearch/src/core/initialize.ts +0 -27
  331. package/providers/meilisearch/src/index.ts +0 -7
  332. package/providers/meilisearch/src/providers/index.ts +0 -2
  333. package/providers/meilisearch/src/schema/capabilities.schema.ts +0 -11
  334. package/providers/meilisearch/tsconfig.lib.json +0 -10
  335. package/providers/meilisearch/tsconfig.spec.json +0 -4
  336. package/providers/meilisearch/vitest.config.ts +0 -14
  337. package/providers/posthog/README.md +0 -7
  338. package/providers/posthog/eslint.config.mjs +0 -22
  339. package/providers/posthog/package.json +0 -12
  340. package/providers/posthog/src/core/initialize.ts +0 -11
  341. package/providers/posthog/src/index.ts +0 -4
  342. package/providers/posthog/src/schema/capabilities.schema.ts +0 -8
  343. package/providers/posthog/src/schema/configuration.schema.ts +0 -8
  344. package/providers/posthog/tsconfig.json +0 -21
  345. package/providers/posthog/tsconfig.lib.json +0 -9
  346. /package/{providers → packages}/algolia/src/schema/configuration.schema.ts +0 -0
  347. /package/{providers → packages}/algolia/src/schema/index.ts +0 -0
  348. /package/{providers → packages}/algolia/src/schema/product-recommendation.schema.ts +0 -0
  349. /package/{providers → packages}/algolia/src/schema/search.schema.ts +0 -0
  350. /package/{providers/google-analytics → packages/algolia}/tsconfig.json +0 -0
  351. /package/{providers/google-analytics → packages/algolia}/tsconfig.lib.json +0 -0
  352. /package/{providers/google-analytics → packages/algolia}/tsconfig.spec.json +0 -0
  353. /package/{providers → packages}/commercetools/src/core/token-cache.ts +0 -0
  354. /package/{providers → packages}/commercetools/src/schema/commercetools.schema.ts +0 -0
  355. /package/{providers → packages}/commercetools/src/schema/configuration.schema.ts +0 -0
  356. /package/{providers → packages}/commercetools/src/schema/session.schema.ts +0 -0
  357. /package/{providers → packages}/commercetools/src/test/identity.spec.ts +0 -0
  358. /package/{providers → packages}/commercetools/src/test/test-utils.ts +0 -0
  359. /package/{core → packages/core}/README.md +0 -0
  360. /package/{core → packages/core}/src/cache/cache.interface.ts +0 -0
  361. /package/{core → packages/core}/src/cache/index.ts +0 -0
  362. /package/{core → packages/core}/src/cache/memory-cache.ts +0 -0
  363. /package/{core → packages/core}/src/cache/noop-cache.ts +0 -0
  364. /package/{core → packages/core}/src/cache/redis-cache.ts +0 -0
  365. /package/{core → packages/core}/src/client/index.ts +0 -0
  366. /package/{core → packages/core}/src/decorators/index.ts +0 -0
  367. /package/{core → packages/core}/src/initialization.ts +0 -0
  368. /package/{core → packages/core}/src/metrics/metrics.ts +0 -0
  369. /package/{core → packages/core}/src/schemas/capabilities.schema.ts +0 -0
  370. /package/{core → packages/core}/src/schemas/errors/generic.error.ts +0 -0
  371. /package/{core → packages/core}/src/schemas/errors/index.ts +0 -0
  372. /package/{core → packages/core}/src/schemas/errors/invalid-input.error.ts +0 -0
  373. /package/{core → packages/core}/src/schemas/errors/invalid-output.error.ts +0 -0
  374. /package/{core → packages/core}/src/schemas/errors/not-found.error.ts +0 -0
  375. /package/{core → packages/core}/src/schemas/index.ts +0 -0
  376. /package/{core → packages/core}/src/schemas/models/analytics.model.ts +0 -0
  377. /package/{core → packages/core}/src/schemas/models/base.model.ts +0 -0
  378. /package/{core → packages/core}/src/schemas/models/cart.model.ts +0 -0
  379. /package/{core → packages/core}/src/schemas/models/category.model.ts +0 -0
  380. /package/{core → packages/core}/src/schemas/models/checkout.model.ts +0 -0
  381. /package/{core → packages/core}/src/schemas/models/cost.model.ts +0 -0
  382. /package/{core → packages/core}/src/schemas/models/currency.model.ts +0 -0
  383. /package/{core → packages/core}/src/schemas/models/identifiers.model.ts +0 -0
  384. /package/{core → packages/core}/src/schemas/models/identity.model.ts +0 -0
  385. /package/{core → packages/core}/src/schemas/models/index.ts +0 -0
  386. /package/{core → packages/core}/src/schemas/models/inventory.model.ts +0 -0
  387. /package/{core → packages/core}/src/schemas/models/order-search.model.ts +0 -0
  388. /package/{core → packages/core}/src/schemas/models/order.model.ts +0 -0
  389. /package/{core → packages/core}/src/schemas/models/payment.model.ts +0 -0
  390. /package/{core → packages/core}/src/schemas/models/price.model.ts +0 -0
  391. /package/{core → packages/core}/src/schemas/models/product-associations.model.ts +0 -0
  392. /package/{core → packages/core}/src/schemas/models/product-list.model.ts +0 -0
  393. /package/{core → packages/core}/src/schemas/models/product-recommendations.model.ts +0 -0
  394. /package/{core → packages/core}/src/schemas/models/product-reviews.model.ts +0 -0
  395. /package/{core → packages/core}/src/schemas/models/product-search.model.ts +0 -0
  396. /package/{core → packages/core}/src/schemas/models/product.model.ts +0 -0
  397. /package/{core → packages/core}/src/schemas/models/profile.model.ts +0 -0
  398. /package/{core → packages/core}/src/schemas/models/shipping-method.model.ts +0 -0
  399. /package/{core → packages/core}/src/schemas/models/store.model.ts +0 -0
  400. /package/{core → packages/core}/src/schemas/mutations/analytics/index.ts +0 -0
  401. /package/{core → packages/core}/src/schemas/mutations/analytics/product-add-to-cart.mutation.ts +0 -0
  402. /package/{core → packages/core}/src/schemas/mutations/analytics/product-details-view.mutation.ts +0 -0
  403. /package/{core → packages/core}/src/schemas/mutations/analytics/product-summary-click.mutation.ts +0 -0
  404. /package/{core → packages/core}/src/schemas/mutations/analytics/product-summary-view.mutation.ts +0 -0
  405. /package/{core → packages/core}/src/schemas/mutations/analytics/purchase.mutation.ts +0 -0
  406. /package/{core → packages/core}/src/schemas/mutations/base.mutation.ts +0 -0
  407. /package/{core → packages/core}/src/schemas/mutations/cart.mutation.ts +0 -0
  408. /package/{core → packages/core}/src/schemas/mutations/checkout.mutation.ts +0 -0
  409. /package/{core → packages/core}/src/schemas/mutations/identity.mutation.ts +0 -0
  410. /package/{core → packages/core}/src/schemas/mutations/index.ts +0 -0
  411. /package/{core → packages/core}/src/schemas/mutations/inventory.mutation.ts +0 -0
  412. /package/{core → packages/core}/src/schemas/mutations/price.mutation.ts +0 -0
  413. /package/{core → packages/core}/src/schemas/mutations/product-list.mutation.ts +0 -0
  414. /package/{core → packages/core}/src/schemas/mutations/product-reviews.mutation.ts +0 -0
  415. /package/{core → packages/core}/src/schemas/mutations/product.mutation.ts +0 -0
  416. /package/{core → packages/core}/src/schemas/mutations/profile.mutation.ts +0 -0
  417. /package/{core → packages/core}/src/schemas/mutations/search.mutation.ts +0 -0
  418. /package/{core → packages/core}/src/schemas/queries/analytics.query.ts +0 -0
  419. /package/{core → packages/core}/src/schemas/queries/base.query.ts +0 -0
  420. /package/{core → packages/core}/src/schemas/queries/cart.query.ts +0 -0
  421. /package/{core → packages/core}/src/schemas/queries/category.query.ts +0 -0
  422. /package/{core → packages/core}/src/schemas/queries/checkout.query.ts +0 -0
  423. /package/{core → packages/core}/src/schemas/queries/identity.query.ts +0 -0
  424. /package/{core → packages/core}/src/schemas/queries/index.ts +0 -0
  425. /package/{core → packages/core}/src/schemas/queries/inventory.query.ts +0 -0
  426. /package/{core → packages/core}/src/schemas/queries/order-search.query.ts +0 -0
  427. /package/{core → packages/core}/src/schemas/queries/order.query.ts +0 -0
  428. /package/{core → packages/core}/src/schemas/queries/price.query.ts +0 -0
  429. /package/{core → packages/core}/src/schemas/queries/product-associations.query.ts +0 -0
  430. /package/{core → packages/core}/src/schemas/queries/product-list.query.ts +0 -0
  431. /package/{core → packages/core}/src/schemas/queries/product-recommendations.query.ts +0 -0
  432. /package/{core → packages/core}/src/schemas/queries/product-reviews.query.ts +0 -0
  433. /package/{core → packages/core}/src/schemas/queries/product-search.query.ts +0 -0
  434. /package/{core → packages/core}/src/schemas/queries/product.query.ts +0 -0
  435. /package/{core → packages/core}/src/schemas/queries/profile.query.ts +0 -0
  436. /package/{core → packages/core}/src/schemas/queries/store.query.ts +0 -0
  437. /package/{core → packages/core}/src/schemas/result.ts +0 -0
  438. /package/{core → packages/core}/src/schemas/session.schema.ts +0 -0
  439. /package/{core → packages/core}/src/test/request-context.spec.ts +0 -0
  440. /package/{core → packages/core}/src/zod-utils.ts +0 -0
  441. /package/{providers → packages}/fake/src/schema/configuration.schema.ts +0 -0
  442. /package/{providers → packages}/fake/src/test/test-utils.ts +0 -0
  443. /package/{providers → packages}/fake/src/utilities/jitter.ts +0 -0
  444. /package/{providers → packages}/fake/src/utilities/seed.ts +0 -0
  445. /package/{providers → packages}/google-analytics/README.md +0 -0
  446. /package/{providers → packages}/google-analytics/src/schema/configuration.schema.ts +0 -0
  447. /package/{providers → packages}/medusa/src/core/client.ts +0 -0
  448. /package/{providers → packages}/medusa/src/schema/configuration.schema.ts +0 -0
  449. /package/{providers → packages}/medusa/src/schema/medusa.schema.ts +0 -0
  450. /package/{providers → packages}/medusa/src/test/test-utils.ts +0 -0
  451. /package/{providers → packages}/meilisearch/src/schema/configuration.schema.ts +0 -0
  452. /package/{providers → packages}/meilisearch/src/schema/index.ts +0 -0
  453. /package/{providers → packages}/meilisearch/src/schema/search.schema.ts +0 -0
@@ -0,0 +1,18 @@
1
+ export * from './analytics.capability.js';
2
+ export * from './base.capability.js';
3
+ export * from './cart.capability.js';
4
+ export * from './category.capability.js';
5
+ export * from './checkout.capability.js';
6
+ export * from './identity.capability.js';
7
+ export * from './inventory.capability.js';
8
+ export * from './price.capability.js';
9
+ export * from './product.capability.js';
10
+ export * from './profile.capability.js';
11
+ export * from './product-search.capability.js';
12
+ export * from './product-recommendations.capability.js';
13
+ export * from './product-associations.capability.js';
14
+ export * from './product-reviews.capability.js';
15
+ export * from './product-list.capability.js'
16
+ export * from './store.capability.js';
17
+ export * from './order.capability.js'
18
+ export * from './order-search.capability.js'
@@ -3,22 +3,22 @@ import type { InventoryIdentifier } from '../schemas/models/identifiers.model.js
3
3
  import type { Inventory } from '../schemas/models/inventory.model.js';
4
4
  import type { InventoryQueryBySKU } from '../schemas/queries/inventory.query.js';
5
5
  import type { Result } from '../schemas/result.js';
6
- import { BaseProvider } from './base.provider.js';
6
+ import { BaseCapability } from './base.capability.js';
7
7
 
8
- export abstract class InventoryProvider extends BaseProvider {
9
- public abstract getBySKU(payload: InventoryQueryBySKU): Promise<Result<Inventory, NotFoundError>>;
8
+ export abstract class InventoryCapability<TInventory extends Inventory = Inventory> extends BaseCapability {
9
+ public abstract getBySKU(payload: InventoryQueryBySKU): Promise<Result<TInventory, NotFoundError>>;
10
10
 
11
11
  protected override getResourceName(): string {
12
12
  return 'inventory';
13
13
  }
14
14
 
15
- protected createEmptyInventory(key: InventoryIdentifier): Inventory {
15
+ protected createEmptyInventory(key: InventoryIdentifier): TInventory {
16
16
  const inventory = {
17
17
  identifier: key,
18
18
  quantity: 0,
19
19
  status: 'outOfStock'
20
20
  } satisfies Inventory;
21
21
 
22
- return inventory;
22
+ return inventory as unknown as TInventory;
23
23
  }
24
24
  }
@@ -1,7 +1,7 @@
1
1
  import type { OrderSearchResult } from "../schemas/models/order-search.model.js";
2
2
  import type { OrderSearchQueryByTerm } from "../schemas/queries/order-search.query.js";
3
3
  import type { Result } from "../schemas/result.js";
4
- import { BaseProvider } from "./base.provider.js";
4
+ import { BaseCapability } from "./base.capability.js";
5
5
 
6
6
  /**
7
7
  * This provider handles order search operations. In some situations you may have different providers for order history listing and detail retrieval.
@@ -9,7 +9,9 @@ import { BaseProvider } from "./base.provider.js";
9
9
  *
10
10
  * Usecase: An e-commerce platform wants to provide customers with a way to search through their past orders using filters like date range, order status, or total amount spent.
11
11
  */
12
- export abstract class OrderSearchProvider extends BaseProvider {
12
+ export abstract class OrderSearchCapability<
13
+ TOrderSearchResult extends OrderSearchResult = OrderSearchResult,
14
+ > extends BaseCapability {
13
15
  protected override getResourceName(): string {
14
16
  return 'order-search';
15
17
  }
@@ -21,7 +23,7 @@ export abstract class OrderSearchProvider extends BaseProvider {
21
23
  * Usecase: A widget on the frontpage after login, shows the last 5 orders placed by the customer.
22
24
  * @param payload The search criteria for querying orders.
23
25
  */
24
- public abstract queryByTerm(payload: OrderSearchQueryByTerm): Promise<Result<OrderSearchResult>>;
26
+ public abstract queryByTerm(payload: OrderSearchQueryByTerm): Promise<Result<TOrderSearchResult>>;
25
27
 
26
28
 
27
29
 
@@ -1,10 +1,10 @@
1
- import { BaseProvider } from './base.provider.js';
1
+ import { BaseCapability } from './base.capability.js';
2
2
  import type { Order } from '../schemas/models/index.js';
3
3
  import type { OrderQueryById } from '../schemas/queries/index.js';
4
4
  import type { Result } from '../schemas/result.js';
5
5
  import type { NotFoundError } from '../schemas/index.js';
6
6
 
7
- export abstract class OrderProvider extends BaseProvider {
7
+ export abstract class OrderCapability<TOrder extends Order = Order> extends BaseCapability {
8
8
  /**
9
9
  * Get order by ID.
10
10
  *
@@ -12,9 +12,9 @@ export abstract class OrderProvider extends BaseProvider {
12
12
  * @param payload
13
13
  * @param session
14
14
  */
15
- public abstract getById(payload: OrderQueryById): Promise<Result<Order, NotFoundError>>;
15
+ public abstract getById(payload: OrderQueryById): Promise<Result<TOrder, NotFoundError>>;
16
16
 
17
- protected createEmptyOrder(): Order {
17
+ protected createEmptyOrder(): TOrder {
18
18
  const order = {
19
19
  identifier: {
20
20
  key: '',
@@ -54,7 +54,7 @@ export abstract class OrderProvider extends BaseProvider {
54
54
  },
55
55
  } satisfies Order;
56
56
 
57
- return order;
57
+ return order as unknown as TOrder;
58
58
  }
59
59
 
60
60
  protected override getResourceName(): string {
@@ -3,9 +3,9 @@ import type {
3
3
  CustomerPriceQuery,
4
4
  ListPriceQuery,
5
5
  } from '../schemas/queries/price.query.js';
6
- import { BaseProvider } from './base.provider.js';
6
+ import { BaseCapability } from './base.capability.js';
7
7
 
8
- export abstract class PriceProvider extends BaseProvider {
8
+ export abstract class PriceCapability<TPrice extends Price = Price> extends BaseCapability {
9
9
  /**
10
10
  * Get a list price price by SKU. This is the most general, undiscounted price and is typically
11
11
  * used as the "before" price in most ecommerce setups.
@@ -14,7 +14,7 @@ export abstract class PriceProvider extends BaseProvider {
14
14
  * @param payload The SKU to query
15
15
  * @param session The session information
16
16
  */
17
- public abstract getListPrice(payload: ListPriceQuery): Promise<Result<Price>>;
17
+ public abstract getListPrice(payload: ListPriceQuery): Promise<Result<TPrice>>;
18
18
 
19
19
  /**
20
20
  * Get a customer-specific price by SKU.
@@ -25,7 +25,7 @@ export abstract class PriceProvider extends BaseProvider {
25
25
  * @param payload The SKU to query
26
26
  * @param session The session information
27
27
  */
28
- public abstract getCustomerPrice(payload: CustomerPriceQuery): Promise<Result<Price>>;
28
+ public abstract getCustomerPrice(payload: CustomerPriceQuery): Promise<Result<TPrice>>;
29
29
 
30
30
  /**
31
31
  * Utility function to create an empty price result, with a value of -1.
@@ -35,7 +35,7 @@ export abstract class PriceProvider extends BaseProvider {
35
35
  * @param currency
36
36
  * @returns
37
37
  */
38
- protected createEmptyPriceResult(sku: string): Price {
38
+ protected createEmptyPriceResult(sku: string): TPrice {
39
39
  const price = {
40
40
  identifier: {
41
41
  variant: {
@@ -50,7 +50,7 @@ export abstract class PriceProvider extends BaseProvider {
50
50
  onSale: false,
51
51
  } satisfies Price;
52
52
 
53
- return price;
53
+ return price as unknown as TPrice;
54
54
  }
55
55
 
56
56
  protected override getResourceName(): string {
@@ -1,6 +1,6 @@
1
1
  import type { ProductIdentifier, ProductVariantIdentifier } from "../schemas/index.js";
2
2
  import type { ProductAssociationsGetAccessoriesQuery, ProductAssociationsGetSparepartsQuery, ProductAssociationsGetReplacementsQuery } from "../schemas/queries/product-associations.query.js";
3
- import { BaseProvider } from "./base.provider.js";
3
+ import { BaseCapability } from "./base.capability.js";
4
4
  import type { Result } from '../schemas/result.js';
5
5
  import type { ProductAssociation } from '../schemas/models/product-associations.model.js';
6
6
 
@@ -9,7 +9,9 @@ import type { ProductAssociation } from '../schemas/models/product-associations.
9
9
  * accessories, spareparts, and replacements. These associations are typically used to provide recommendations to customers on the product detail page, but can also be used in other contexts such as the cart or post-purchase, but
10
10
  * do not carry any personalization concept to them.
11
11
  */
12
- export abstract class ProductAssociationsProvider extends BaseProvider {
12
+ export abstract class ProductAssociationsCapability<
13
+ TProductAssociation extends ProductAssociation = ProductAssociation,
14
+ > extends BaseCapability {
13
15
 
14
16
  /**
15
17
  * Returns a list of product identifiers which are accessories to the given product.
@@ -23,7 +25,7 @@ export abstract class ProductAssociationsProvider extends BaseProvider {
23
25
  *
24
26
  * TODO: This should be a PaginatedResult
25
27
  */
26
- public abstract getAccessories(query: ProductAssociationsGetAccessoriesQuery): Promise<Result<ProductAssociation[]>>;
28
+ public abstract getAccessories(query: ProductAssociationsGetAccessoriesQuery): Promise<Result<TProductAssociation[]>>;
27
29
 
28
30
  /**
29
31
  * Returns a list of product identifiers which are spareparts to the given product.
@@ -34,7 +36,7 @@ export abstract class ProductAssociationsProvider extends BaseProvider {
34
36
  *
35
37
  * TODO: This should be a PaginatedResult
36
38
  */
37
- public abstract getSpareparts(query: ProductAssociationsGetSparepartsQuery): Promise<Result<ProductAssociation[]>>;
39
+ public abstract getSpareparts(query: ProductAssociationsGetSparepartsQuery): Promise<Result<TProductAssociation[]>>;
38
40
 
39
41
 
40
42
  /**
@@ -43,7 +45,7 @@ export abstract class ProductAssociationsProvider extends BaseProvider {
43
45
  * TODO: This should be a PaginatedResult
44
46
  * @param query
45
47
  */
46
- public abstract getReplacements(query: ProductAssociationsGetReplacementsQuery): Promise<Result<ProductAssociation[]>>;
48
+ public abstract getReplacements(query: ProductAssociationsGetReplacementsQuery): Promise<Result<TProductAssociation[]>>;
47
49
 
48
50
 
49
51
  getResourceName(): string {
@@ -3,7 +3,7 @@ import type { ProductListItemMutationCreate, ProductListItemMutationDelete, Prod
3
3
  import type { ProductListQuery, ProductListQueryById } from "../schemas/queries/product-list.query.js";
4
4
  import { type ProductListItemsQuery } from "../schemas/queries/product-list.query.js";
5
5
  import type { Result } from "../schemas/result.js";
6
- import { BaseProvider } from "./base.provider.js";
6
+ import { BaseCapability } from "./base.capability.js";
7
7
 
8
8
  /**
9
9
  * The product list provider is a general purpose provider for creating various types of product lists, such as favorite lists, projects, wishlists, requisitionlists, etc
@@ -13,7 +13,12 @@ import { BaseProvider } from "./base.provider.js";
13
13
  *
14
14
  * Some systems might only support single entries of each type, but the general case is to support multiples.
15
15
  */
16
- export abstract class ProductListProvider extends BaseProvider {
16
+ export abstract class ProductListCapability<
17
+ TProductList extends ProductList = ProductList,
18
+ TProductListItem extends ProductListItem = ProductListItem,
19
+ TProductListPaginatedResult extends ProductListPaginatedResult = ProductListPaginatedResult,
20
+ TProductListItemPaginatedResult extends ProductListItemPaginatedResult = ProductListItemPaginatedResult,
21
+ > extends BaseCapability {
17
22
 
18
23
  protected getResourceName(): string {
19
24
  return 'product-lists';
@@ -24,7 +29,7 @@ export abstract class ProductListProvider extends BaseProvider {
24
29
  * you might have stored the identifier from an earlier session or looked it up previously.
25
30
  * @param payload
26
31
  */
27
- public abstract getById(payload: ProductListQueryById): Promise<Result<ProductList>>;
32
+ public abstract getById(payload: ProductListQueryById): Promise<Result<TProductList>>;
28
33
 
29
34
 
30
35
  /**
@@ -33,7 +38,7 @@ export abstract class ProductListProvider extends BaseProvider {
33
38
  *
34
39
  * @param query
35
40
  */
36
- public abstract queryLists(query: ProductListQuery): Promise<Result<ProductListPaginatedResult>>;
41
+ public abstract queryLists(query: ProductListQuery): Promise<Result<TProductListPaginatedResult>>;
37
42
 
38
43
 
39
44
  /**
@@ -44,14 +49,14 @@ export abstract class ProductListProvider extends BaseProvider {
44
49
  * which the customer can then add the product to.
45
50
  * @param mutation
46
51
  */
47
- public abstract addList(mutation: ProductListMutationCreate): Promise<Result<ProductList>>;
52
+ public abstract addList(mutation: ProductListMutationCreate): Promise<Result<TProductList>>;
48
53
 
49
54
  /**
50
55
  *
51
56
  * Usecase: update name of list, or other metadata related to the list, such as "this is my summer wishlist", or "this is my favorite list for cameras".
52
57
  * @param mutation
53
58
  */
54
- public abstract updateList(mutation: ProductListMutationUpdate): Promise<Result<ProductList>>;
59
+ public abstract updateList(mutation: ProductListMutationUpdate): Promise<Result<TProductList>>;
55
60
 
56
61
  /**
57
62
  * Usecase: customer wants to delete a list, such as "delete my summer wishlist", including all the product list items
@@ -63,13 +68,13 @@ export abstract class ProductListProvider extends BaseProvider {
63
68
  * Usecase: in the frontend you want to show a list of the products in the customers wishlist.
64
69
  * @param query
65
70
  */
66
- public abstract queryListItems(query: ProductListItemsQuery): Promise<Result<ProductListItemPaginatedResult>>;
71
+ public abstract queryListItems(query: ProductListItemsQuery): Promise<Result<TProductListItemPaginatedResult>>;
67
72
 
68
73
  /**
69
74
  * Usecase: Add a new product-variant to a list
70
75
  * @param mutation
71
76
  */
72
- public abstract addItem(mutation: ProductListItemMutationCreate): Promise<Result<ProductListItem>>;
77
+ public abstract addItem(mutation: ProductListItemMutationCreate): Promise<Result<TProductListItem>>;
73
78
 
74
79
  /**
75
80
  * Usecase: Remove a product-variant from a list.
@@ -81,6 +86,6 @@ export abstract class ProductListProvider extends BaseProvider {
81
86
  * Usecase: Update the quantity of a product-variant in a list.
82
87
  * @param mutation
83
88
  */
84
- public abstract updateItem(mutation: ProductListItemMutationUpdate): Promise<Result<ProductListItem>>;
89
+ public abstract updateItem(mutation: ProductListItemMutationUpdate): Promise<Result<TProductListItem>>;
85
90
 
86
91
  }
@@ -2,12 +2,12 @@ import type { Cache } from '../cache/cache.interface.js';
2
2
  import { Reactionary } from "../decorators/reactionary.decorator.js";
3
3
  import { success, type ProductRecommendation, type ProductRecommendationsByCollectionQuery, type RequestContext, type Result } from "../schemas/index.js";
4
4
  import { ProductRecommendationsQuerySchema, type ProductRecommendationAlgorithmAlsoViewedProductsQuery, type ProductRecommendationAlgorithmFrequentlyBoughtTogetherQuery, type ProductRecommendationAlgorithmPopuplarProductsQuery, type ProductRecommendationAlgorithmRelatedProductsQuery, type ProductRecommendationAlgorithmSimilarProductsQuery, type ProductRecommendationAlgorithmTopPicksProductsQuery, type ProductRecommendationAlgorithmTrendingInCategoryQuery, type ProductRecommendationsQuery } from "../schemas/queries/product-recommendations.query.js";
5
- import { BaseProvider } from "./base.provider.js";
5
+ import { BaseCapability } from "./base.capability.js";
6
6
 
7
- export abstract class ProductRecommendationsProvider extends BaseProvider {
7
+ export abstract class ProductRecommendationsCapability extends BaseCapability {
8
8
 
9
9
  /**
10
- * returns a list of recommended products, based on the selected algorithm and the provided query parameters. The recommendations should be relevant to the product specified in the query, and can be personalized based on the customer segments or contexts provided. The provider should return a list of product variant identifiers that are recommended for the given product, which can then be used to fetch the full product details from the product provider if needed.
10
+ * returns a list of recommended products, based on the selected algorithm and the provided query parameters. The recommendations should be relevant to the product specified in the query, and can be personalized based on the customer segments or contexts provided. The capability should return a list of product variant identifiers that are recommended for the given product, which can then be used to fetch the full product details from the product capability if needed.
11
11
  * *
12
12
  * Usecase:
13
13
  * - PDP - "Customers who viewed this product also viewed"
@@ -89,17 +89,17 @@ export abstract class ProductRecommendationsProvider extends BaseProvider {
89
89
 
90
90
 
91
91
 
92
- export class MulticastProductRecommendationsProvider extends ProductRecommendationsProvider {
93
- protected providers: Array<ProductRecommendationsProvider>;
92
+ export class MulticastProductRecommendationsCapability extends ProductRecommendationsCapability {
93
+ protected capabilities: Array<ProductRecommendationsCapability>;
94
94
 
95
95
  constructor(
96
96
  cache: Cache,
97
97
  requestContext: RequestContext,
98
- providers: Array<ProductRecommendationsProvider>
98
+ capabilities: Array<ProductRecommendationsCapability>
99
99
  ) {
100
100
  super(cache, requestContext);
101
101
 
102
- this.providers = providers;
102
+ this.capabilities = capabilities;
103
103
  }
104
104
 
105
105
  @Reactionary({
@@ -107,15 +107,15 @@ export class MulticastProductRecommendationsProvider extends ProductRecommendati
107
107
  })
108
108
  public override async getRecommendations(query: ProductRecommendationsQuery): Promise<Result<ProductRecommendation[]>> {
109
109
  const output = [];
110
- for (const provider of this.providers) {
111
- const providerOutput = await provider.getRecommendations(query);
112
- if (providerOutput.success) {
110
+ for (const capability of this.capabilities) {
111
+ const capabilityOutput = await capability.getRecommendations(query);
112
+ if (capabilityOutput.success) {
113
113
 
114
- output.push(...providerOutput.value);
114
+ output.push(...capabilityOutput.value);
115
115
  } else {
116
116
  // For other types of errors, we might want to log them or handle them differently
117
- console.error(`Error from provider ${provider.constructor.name}:`, providerOutput.error);
118
- return providerOutput
117
+ console.error(`Error from capability ${capability.constructor.name}:`, capabilityOutput.error);
118
+ return capabilityOutput
119
119
  }
120
120
  if (output.length >= query.numberOfRecommendations) {
121
121
  break;
@@ -126,18 +126,18 @@ export class MulticastProductRecommendationsProvider extends ProductRecommendati
126
126
 
127
127
  public override async getCollection(query: ProductRecommendationsByCollectionQuery): Promise<Result<ProductRecommendation[]>> {
128
128
  const output = [];
129
- for (const provider of this.providers) {
130
- const providerOutput = await provider.getCollection(query);
131
- if (providerOutput.success) {
132
- output.push(...providerOutput.value);
129
+ for (const capability of this.capabilities) {
130
+ const capabilityOutput = await capability.getCollection(query);
131
+ if (capabilityOutput.success) {
132
+ output.push(...capabilityOutput.value);
133
133
  } else {
134
- if (providerOutput.error.type === 'NotFound') {
135
- // If the error is a NotFound error, we can ignore it and continue to the next provider
134
+ if (capabilityOutput.error.type === 'NotFound') {
135
+ // If the error is a NotFound error, we can ignore it and continue to the next capability
136
136
  continue;
137
137
  } else {
138
138
  // For other types of errors, we might want to log them or handle them differently
139
- console.error(`Error from provider ${provider.constructor.name}:`, providerOutput.error);
140
- return providerOutput;
139
+ console.error(`Error from capability ${capability.constructor.name}:`, capabilityOutput.error);
140
+ return capabilityOutput;
141
141
  }
142
142
  }
143
143
  if (output.length >= query.numberOfRecommendations) {
@@ -1,14 +1,18 @@
1
1
  import type { Result, ProductReview, ProductRatingSummary, ProductReviewPaginatedResult } from '../schemas/index.js';
2
2
  import type { ProductReviewsListQuery, ProductReviewsGetRatingSummaryQuery } from '../schemas/queries/product-reviews.query.js';
3
3
  import type { ProductReviewMutationSubmit } from '../schemas/mutations/product-reviews.mutation.js';
4
- import { BaseProvider } from './base.provider.js';
4
+ import { BaseCapability } from './base.capability.js';
5
5
  import { type ProductRatingIdentifier } from '../schemas/models/identifiers.model.js';
6
6
  /**
7
7
  * The product reviews provider is responsible for providing detailed product reviews from customers.
8
8
  * Reviews contain ratings along with textual feedback, author information, and verification status.
9
9
  * This provider also handles aggregated rating summaries for products.
10
10
  */
11
- export abstract class ProductReviewsProvider extends BaseProvider {
11
+ export abstract class ProductReviewsCapability<
12
+ TProductRatingSummary extends ProductRatingSummary = ProductRatingSummary,
13
+ TProductReviewPaginatedResult extends ProductReviewPaginatedResult = ProductReviewPaginatedResult,
14
+ TProductReview extends ProductReview = ProductReview,
15
+ > extends BaseCapability {
12
16
  /**
13
17
  * Get the rating summary for a product, including average rating and distribution.
14
18
  *
@@ -17,7 +21,7 @@ export abstract class ProductReviewsProvider extends BaseProvider {
17
21
  */
18
22
  public abstract getRatingSummary(
19
23
  query: ProductReviewsGetRatingSummaryQuery
20
- ): Promise<Result<ProductRatingSummary>>;
24
+ ): Promise<Result<TProductRatingSummary>>;
21
25
 
22
26
  /**
23
27
  * Get a paginated list of reviews for a product.
@@ -27,7 +31,7 @@ export abstract class ProductReviewsProvider extends BaseProvider {
27
31
  */
28
32
  public abstract findReviews(
29
33
  query: ProductReviewsListQuery
30
- ): Promise<Result<ProductReviewPaginatedResult>>;
34
+ ): Promise<Result<TProductReviewPaginatedResult>>;
31
35
  /**
32
36
  * Submit a review for a product.
33
37
  *
@@ -36,7 +40,7 @@ export abstract class ProductReviewsProvider extends BaseProvider {
36
40
  */
37
41
  public abstract submitReview(
38
42
  mutation: ProductReviewMutationSubmit
39
- ): Promise<Result<ProductReview>>;
43
+ ): Promise<Result<TProductReview>>;
40
44
 
41
45
 
42
46
  protected createEmptyProductRatingSummary(key: ProductRatingIdentifier): ProductRatingSummary {
@@ -0,0 +1,48 @@
1
+ import type { Category, FacetValueIdentifier, Result } from '../index.js';
2
+ import type { ProductSearchResult } from '../schemas/models/product-search.model.js';
3
+ import type {
4
+ ProductSearchQueryByTerm,
5
+ ProductSearchQueryCreateNavigationFilter,
6
+ } from '../schemas/queries/product-search.query.js';
7
+ import { BaseCapability } from './base.capability.js';
8
+
9
+ export abstract class ProductSearchCapability<
10
+ TProductSearchResult extends ProductSearchResult = ProductSearchResult,
11
+ > extends BaseCapability {
12
+ protected override getResourceName(): string {
13
+ return 'product-search';
14
+ }
15
+
16
+ public abstract queryByTerm(
17
+ payload: ProductSearchQueryByTerm,
18
+ ): Promise<Result<TProductSearchResult>>;
19
+
20
+ /**
21
+ * Since each platform has it own way of representing categories and their hierarchy, we leave it to the platform to tell us how to get from a
22
+ * category breadcrumb path to a global category navigation filter that can be applied to product searches.
23
+ *
24
+ * So, the CLP pattern would be
25
+ *
26
+ * const c: Category = await categoryProvider.getBySlug({ slug: 'some-category' });
27
+ * const breadcrumbPath: Category[] = await categoryProvider.getBreadcrumbPathToCategory({ id: c.identifier });
28
+ * const categoryFilter: FacetValueIdentifier = categoryNavigationProvider.createCategoryNavigationFilterBreadcrumbs(breadcrumbPath);
29
+ * const searchResult: ProductSearchResult = await productSearchProvider.queryByTerm({ term: 'some search', facets: [], categoryFilter: [categoryFilter], ... });
30
+ *
31
+ * from here, you would maybe get facets back with subcategories, but those are relative to the current category filter you have applied, so you
32
+ * do not need any special handling for that.
33
+ *
34
+ * Usecase: You are rendering a category page and you want to run a product search to find everything in that category (or below).
35
+ *
36
+ * @param categoryPath
37
+ */
38
+ public abstract createCategoryNavigationFilter(
39
+ payload: ProductSearchQueryCreateNavigationFilter,
40
+ ): Promise<Result<FacetValueIdentifier>>;
41
+
42
+ /**
43
+ * Parses a facet value from the search response.
44
+ * @param facetValueIdentifier The identifier for the facet value.
45
+ * @param label The label for the facet value.
46
+ * @param count The count for the facet value.
47
+ */
48
+ }
@@ -1,10 +1,10 @@
1
1
  import type { Product } from '../schemas/models/product.model.js';
2
- import { BaseProvider } from './base.provider.js';
2
+ import { BaseCapability } from './base.capability.js';
3
3
  import type { ProductQueryById, ProductQueryBySKU, ProductQueryBySlug } from '../schemas/queries/product.query.js';
4
4
  import type { Result } from '../schemas/result.js';
5
5
  import type { NotFoundError } from '../schemas/index.js';
6
6
 
7
- export abstract class ProductProvider extends BaseProvider {
7
+ export abstract class ProductCapability<TProduct extends Product = Product> extends BaseCapability {
8
8
 
9
9
 
10
10
  /**
@@ -17,7 +17,7 @@ export abstract class ProductProvider extends BaseProvider {
17
17
  * Marketing will TYPICALLY recommend products, and in some cases maybe HeroVariants of a product.
18
18
  * In that case, you would need to resolve the product to its hero variant first, and then get the SKU from there.
19
19
  */
20
- public abstract getById(payload: ProductQueryById): Promise<Result<Product>>;
20
+ public abstract getById(payload: ProductQueryById): Promise<Result<TProduct>>;
21
21
 
22
22
 
23
23
  /**
@@ -27,7 +27,7 @@ export abstract class ProductProvider extends BaseProvider {
27
27
  *
28
28
  * Usecase: You are rendering a product detail page, and you need to fetch the product by its slug.
29
29
  */
30
- public abstract getBySlug(payload: ProductQueryBySlug): Promise<Result<Product, NotFoundError>>;
30
+ public abstract getBySlug(payload: ProductQueryBySlug): Promise<Result<TProduct, NotFoundError>>;
31
31
 
32
32
 
33
33
  /**
@@ -39,9 +39,9 @@ export abstract class ProductProvider extends BaseProvider {
39
39
  * and you need to fetch the product details for that SKU. You will get the a Product back, with the variant matching the SKU set as heroSku.
40
40
  * It might also be used on a quick-order page, or product recommendations from external system.
41
41
  */
42
- public abstract getBySKU(payload: ProductQueryBySKU): Promise<Result<Product>>;
42
+ public abstract getBySKU(payload: ProductQueryBySKU): Promise<Result<TProduct>>;
43
43
 
44
- protected createEmptyProduct(id: string): Product {
44
+ protected createEmptyProduct(id: string): TProduct {
45
45
  // FIXME: We can probably get rid of this once we switch to errors as values, as we shouldn't even
46
46
  // be materializing an empty product...
47
47
  const product = {
@@ -73,7 +73,7 @@ export abstract class ProductProvider extends BaseProvider {
73
73
  variants: [],
74
74
  } satisfies Product;
75
75
 
76
- return product;
76
+ return product as unknown as TProduct;
77
77
  }
78
78
 
79
79
  /**
@@ -3,9 +3,9 @@ import type { Profile } from '../schemas/models/index.js';
3
3
  import type { ProfileMutationAddShippingAddress, ProfileMutationMakeShippingAddressDefault, ProfileMutationRemoveShippingAddress, ProfileMutationSetBillingAddress, ProfileMutationUpdate, ProfileMutationUpdateShippingAddress } from '../schemas/mutations/index.js';
4
4
  import type { ProfileQuerySelf as ProfileQueryById } from '../schemas/queries/index.js';
5
5
  import type { Result } from '../schemas/result.js';
6
- import { BaseProvider } from './base.provider.js';
6
+ import { BaseCapability } from './base.capability.js';
7
7
 
8
- export abstract class ProfileProvider extends BaseProvider {
8
+ export abstract class ProfileCapability<TProfile extends Profile = Profile> extends BaseCapability {
9
9
 
10
10
  /**
11
11
  * Returns the profile of the currently authenticated (registered) user.
@@ -13,7 +13,7 @@ export abstract class ProfileProvider extends BaseProvider {
13
13
  * Usecase: Fetch the profile of the logged-in user for display in header, or account settings.
14
14
  * @param payload
15
15
  */
16
- public abstract getById(payload: ProfileQueryById): Promise<Result<Profile, NotFoundError>>;
16
+ public abstract getById(payload: ProfileQueryById): Promise<Result<TProfile, NotFoundError>>;
17
17
 
18
18
  /**
19
19
  * Updates the base profile information of the currently authenticated (registered) user.
@@ -26,7 +26,7 @@ export abstract class ProfileProvider extends BaseProvider {
26
26
  * Usecase: Update the user's name, email, or phone number.
27
27
  * @param payload
28
28
  */
29
- public abstract update(payload: ProfileMutationUpdate): Promise<Result<Profile, NotFoundError>>;
29
+ public abstract update(payload: ProfileMutationUpdate): Promise<Result<TProfile, NotFoundError>>;
30
30
 
31
31
  /**
32
32
  * Creates a new shipping address for the currently authenticated (registered) user.
@@ -36,7 +36,7 @@ export abstract class ProfileProvider extends BaseProvider {
36
36
  * done at checkout should be considered local to that session, unless the addressbook is empty.
37
37
  * @param payload
38
38
  */
39
- public abstract addShippingAddress(payload: ProfileMutationAddShippingAddress): Promise<Result<Profile, NotFoundError>>;
39
+ public abstract addShippingAddress(payload: ProfileMutationAddShippingAddress): Promise<Result<TProfile, NotFoundError>>;
40
40
 
41
41
  /**
42
42
  * Updates an existing shipping address for the currently authenticated (registered) user.
@@ -45,7 +45,7 @@ export abstract class ProfileProvider extends BaseProvider {
45
45
  * done at checkout should be considered local to that session/order, unless the addressbook is empty.
46
46
  * @param payload
47
47
  */
48
- public abstract updateShippingAddress(payload: ProfileMutationUpdateShippingAddress): Promise<Result<Profile, NotFoundError>>;
48
+ public abstract updateShippingAddress(payload: ProfileMutationUpdateShippingAddress): Promise<Result<TProfile, NotFoundError>>;
49
49
 
50
50
  /**
51
51
  * Removes an existing shipping address for the currently authenticated (registered) user.
@@ -55,7 +55,7 @@ export abstract class ProfileProvider extends BaseProvider {
55
55
  * Usecase: User deletes a shipping address from their profile.
56
56
  * @param payload
57
57
  */
58
- public abstract removeShippingAddress(payload: ProfileMutationRemoveShippingAddress): Promise<Result<Profile, NotFoundError>>;
58
+ public abstract removeShippingAddress(payload: ProfileMutationRemoveShippingAddress): Promise<Result<TProfile, NotFoundError>>;
59
59
 
60
60
  /**
61
61
  * Configures an existing shipping address as the default shipping address for the currently authenticated (registered) user.
@@ -63,7 +63,7 @@ export abstract class ProfileProvider extends BaseProvider {
63
63
  * Usecase: User selects a default shipping address in their profile.
64
64
  * @param payload
65
65
  */
66
- public abstract makeShippingAddressDefault(payload: ProfileMutationMakeShippingAddressDefault): Promise<Result<Profile, NotFoundError>>;
66
+ public abstract makeShippingAddressDefault(payload: ProfileMutationMakeShippingAddressDefault): Promise<Result<TProfile, NotFoundError>>;
67
67
 
68
68
  /**
69
69
  * Sets the current/active billing address for the currently authenticated (registered) user.
@@ -74,7 +74,7 @@ export abstract class ProfileProvider extends BaseProvider {
74
74
  * entity being billed, and as such it makes sense to have a single authoritative billing address.
75
75
  * @param payload
76
76
  */
77
- public abstract setBillingAddress(payload: ProfileMutationSetBillingAddress): Promise<Result<Profile, NotFoundError>>;
77
+ public abstract setBillingAddress(payload: ProfileMutationSetBillingAddress): Promise<Result<TProfile, NotFoundError>>;
78
78
 
79
79
  protected override getResourceName(): string {
80
80
  return 'profile';
@@ -1,10 +1,10 @@
1
1
  import type { Store } from '../schemas/models/store.model.js';
2
2
  import type { StoreQueryByProximity } from '../schemas/queries/index.js';
3
3
  import type { Result } from '../schemas/result.js';
4
- import { BaseProvider } from './base.provider.js';
4
+ import { BaseCapability } from './base.capability.js';
5
5
 
6
- export abstract class StoreProvider extends BaseProvider {
7
- public abstract queryByProximity(payload: StoreQueryByProximity): Promise<Result<Array<Store>>>;
6
+ export abstract class StoreCapability<TStore extends Store = Store> extends BaseCapability {
7
+ public abstract queryByProximity(payload: StoreQueryByProximity): Promise<Result<Array<TStore>>>;
8
8
 
9
9
  protected override getResourceName(): string {
10
10
  return 'store';