@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,61 +0,0 @@
1
- import type { Category, FacetIdentifier, FacetValueIdentifier, Result } from '../index.js';
2
- import type { ProductSearchResult, ProductSearchResultFacet, ProductSearchResultFacetValue, ProductSearchResultItemVariant } from '../schemas/models/product-search.model.js';
3
- import type { ProductSearchQueryByTerm, ProductSearchQueryCreateNavigationFilter } from '../schemas/queries/product-search.query.js';
4
- import { BaseProvider } from './base.provider.js';
5
-
6
- export abstract class ProductSearchProvider extends BaseProvider {
7
- protected override getResourceName(): string {
8
- return 'product-search';
9
- }
10
-
11
- public abstract queryByTerm(payload: ProductSearchQueryByTerm): Promise<Result<ProductSearchResult>>;
12
-
13
-
14
- /**
15
- * 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
16
- * category breadcrumb path to a global category navigation filter that can be applied to product searches.
17
- *
18
- * So, the CLP pattern would be
19
- *
20
- * const c: Category = await categoryProvider.getBySlug({ slug: 'some-category' });
21
- * const breadcrumbPath: Category[] = await categoryProvider.getBreadcrumbPathToCategory({ id: c.identifier });
22
- * const categoryFilter: FacetValueIdentifier = categoryNavigationProvider.createCategoryNavigationFilterBreadcrumbs(breadcrumbPath);
23
- * const searchResult: ProductSearchResult = await productSearchProvider.queryByTerm({ term: 'some search', facets: [], categoryFilter: [categoryFilter], ... });
24
- *
25
- * from here, you would maybe get facets back with subcategories, but those are relative to the current category filter you have applied, so you
26
- * do not need any special handling for that.
27
- *
28
- * Usecase: You are rendering a category page and you want to run a product search to find everything in that category (or below).
29
- *
30
- * @param categoryPath
31
- */
32
- public abstract createCategoryNavigationFilter(payload: ProductSearchQueryCreateNavigationFilter): Promise<Result<FacetValueIdentifier>>;
33
-
34
- /**
35
- * Parses a facet value from the search response.
36
- * @param facetValueIdentifier The identifier for the facet value.
37
- * @param label The label for the facet value.
38
- * @param count The count for the facet value.
39
- */
40
- protected abstract parseFacetValue(facetValueIdentifier: FacetValueIdentifier, label: string, count: number) : ProductSearchResultFacetValue;
41
-
42
- /**
43
- * Parses a facet from the search response.
44
- * @param facetIdentifier The identifier for the facet.
45
- * @param facetValue The value for the facet.
46
- *
47
- * Usecase: Override this to customize the parsing of facets.
48
- */
49
- protected abstract parseFacet(facetIdentifier: FacetIdentifier, facetValue: unknown) : ProductSearchResultFacet;
50
-
51
- /**
52
- * Parses a product variant from the search response.
53
- * @param variant The variant data from the search response.
54
- * @param product The product data from the search response.
55
- *
56
- * Usecase: Override this to customize the parsing of product variants.
57
- */
58
- protected abstract parseVariant(variant: unknown, product: unknown): ProductSearchResultItemVariant;
59
- }
60
-
61
-
@@ -1,60 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import type { Capabilities, ClientFromCapabilities } from "../schemas/capabilities.schema.js";
3
- import type { Cache } from '../cache/cache.interface.js';
4
- import type { RequestContext } from "../schemas/session.schema.js";
5
- import { AnalyticsProvider } from "../providers/analytics.provider.js";
6
- import type { AnalyticsMutation } from "../schemas/index.js";
7
- import { NoOpCache } from "../cache/noop-cache.js";
8
- import { createInitialRequestContext } from "../initialization.js";
9
- import { ClientBuilder } from "../client/client-builder.js";
10
- import type { Client } from "../client/client.js";
11
-
12
- export class MockAnalyticsProvider extends AnalyticsProvider {
13
- public events: Array<AnalyticsMutation> = [];
14
-
15
- public override async track(event: AnalyticsMutation): Promise<void> {
16
- this.events.push(event);
17
- }
18
- }
19
-
20
- export interface MockConfiguration {
21
- mock?: string;
22
- }
23
-
24
- export function withMockCapabilities<T extends Partial<Capabilities>>(
25
- client: Partial<Client>
26
- ) {
27
- return (
28
- cache: Cache,
29
- context: RequestContext
30
- ): ClientFromCapabilities<T> => {
31
- return client as ClientFromCapabilities<T>
32
- }
33
- };
34
-
35
- describe('Client Builder', () => {
36
- it('should properly multicast analytics events to all analytics providers that register themselves', async () => {
37
- const cache = new NoOpCache();
38
- const context = createInitialRequestContext();
39
- const builder = new ClientBuilder(context);
40
- const analyticsProvider = new MockAnalyticsProvider(cache, context);
41
- const secondaryAnalyticsProvider = new MockAnalyticsProvider(cache, context);
42
- const client = builder
43
- .withCache(cache)
44
- .withCapability(withMockCapabilities({ analytics: analyticsProvider }))
45
- .withCapability(withMockCapabilities({ analytics: secondaryAnalyticsProvider }))
46
- .build();
47
-
48
- const track = await client.analytics.track({
49
- event: 'product-details-view',
50
- product: {
51
- key: 'P-1000'
52
- }
53
- });
54
-
55
- expect(analyticsProvider.events.length).toBe(1);
56
- expect(analyticsProvider.events[0].event).toBe('product-details-view');
57
- expect(secondaryAnalyticsProvider.events.length).toBe(1);
58
- expect(secondaryAnalyticsProvider.events[0].event).toBe('product-details-view');
59
- });
60
- });
@@ -1,24 +0,0 @@
1
- {
2
- "extends": "../tsconfig.base.json",
3
- "compilerOptions": {
4
- "module": "NodeNext",
5
- "moduleResolution": "nodenext",
6
- "forceConsistentCasingInFileNames": true,
7
- "strict": true,
8
- "importHelpers": true,
9
- "noImplicitOverride": true,
10
- "noImplicitReturns": true,
11
- "noFallthroughCasesInSwitch": true,
12
- "noPropertyAccessFromIndexSignature": true,
13
- },
14
- "files": [],
15
- "include": [],
16
- "references": [
17
- {
18
- "path": "./tsconfig.lib.json"
19
- },
20
- {
21
- "path": "./tsconfig.spec.json"
22
- }
23
- ]
24
- }
@@ -1,4 +0,0 @@
1
- {
2
- "extends": "./tsconfig.lib.json",
3
- "exclude": []
4
- }
@@ -1,14 +0,0 @@
1
- import { defineConfig, defineProject } from 'vitest/config';
2
- import tsconfigPaths from 'vite-tsconfig-paths';
3
- import { resolve } from 'path';
4
- import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin';
5
-
6
- export default defineProject({
7
- plugins: [nxViteTsPaths()],
8
- test: {
9
- root: resolve(__dirname),
10
- globals: true,
11
- environment: 'node',
12
- include: ['src/**/*.spec.ts', 'src/**/*.test.ts']
13
- },
14
- });
@@ -1,56 +0,0 @@
1
- # Algolia provider for Reactionary
2
-
3
- ## Supports
4
-
5
-
6
- | Feature | Support | Notes |
7
- | ----------- | ----------- | --------- |
8
- | product | Full | |
9
- | productSearch | Full | |
10
- | identity | N/A | |
11
- | cart | N/A | |
12
- | checkout | N/A | |
13
- | order | N/A | Possibly later |
14
- | inventory | N/A | |
15
- | price | N/A | |
16
- | category | N/A | Possibly later |
17
- | store | N/A | Possibly later |
18
-
19
-
20
- ## Notes
21
- The expected Algolia schema must contain at least these fields
22
-
23
- ```json
24
- {
25
- objectID: string;
26
- slug:string;
27
- name: string;
28
- variants: [
29
- {
30
- variantID: string;
31
- image: string;
32
- }
33
- ]
34
- }
35
- ```
36
-
37
- You can have more, for use with facets, and additional searchable fields, but these must be in the index, and constitutes what we are expecting to get back.
38
-
39
- The `objectID` corrosponds to your productIdentifier, and `variantID` should match your SKU
40
-
41
- ## Analytics
42
-
43
- The Algolia analytics provider maps the following tracked event types to data tracked in Algolia:
44
-
45
- - AnalyticsMutationProductSummaryViewEvent => ViewedObjectIDs
46
- - AnalyticsMutationProductSummaryClickEvent => ClickedObjectIDsAfterSearch / ClickedObjectIDs
47
- - AnalyticsMutationProductAddToCartEvent => AddedToCartObjectIDsAfterSearch / AddedToCartObjectIDs
48
- - AnalyticsMutationPurchaseEvent => PurchasedObjectIDs
49
-
50
- The `AfterSearch` variants are (with the exception of purchase) preferred by the provider in the cases where Algolia is the source of the events. For search or recommendation this would typically be the case, but not necesarily for users arriving on a PDP as a direct target from a search or a link.
51
-
52
- Note that we do not map `PurchasedObjectIDsAfterSearch` as it would require us to persist the search query ID that lead to the add-to-cart occuring on the cart items. This currently seems like an excess burden to impose on the cart interface.
53
-
54
- The `ConvertedObjectIDs` and `ConvertedObjectIDsAfterSearch` are not mapped as they seem superfluous by all accounts in a product-purchase based flow. They could likely be used for other types of conversions in a more general setup, such as a customer finishing reading an article.
55
-
56
- Finally the events that are related to filtering are not mapped, as they are by all accounts deprecated and no longer influence any of the recommendation or personalization features.
@@ -1,34 +0,0 @@
1
- {
2
- "name": "algolia",
3
- "$schema": "../../node_modules/nx/schemas/project-schema.json",
4
- "sourceRoot": "providers/algolia/src",
5
- "projectType": "library",
6
- "release": {
7
- "version": {
8
- "currentVersionResolver": "git-tag",
9
- "fallbackCurrentVersionResolver": "disk",
10
- "preserveLocalDependencyProtocols": false,
11
- "manifestRootsToUpdate": ["dist/{projectRoot}"]
12
- }
13
- },
14
- "tags": [],
15
- "targets": {
16
- "build": {
17
- "executor": "@nx/esbuild:esbuild",
18
- "outputs": ["{options.outputPath}"],
19
- "options": {
20
- "outputPath": "dist/providers/algolia",
21
- "main": "providers/algolia/src/index.ts",
22
- "tsConfig": "providers/algolia/tsconfig.lib.json",
23
- "assets": ["providers/algolia/*.md"],
24
- "format": ["esm"],
25
- "bundle": false
26
- }
27
- },
28
- "nx-release-publish": {
29
- "options": {
30
- "packageRoot": "dist/{projectRoot}"
31
- }
32
- }
33
- }
34
- }
@@ -1,27 +0,0 @@
1
- import type { Cache, ClientFromCapabilities, RequestContext } from "@reactionary/core";
2
- import { AlgoliaProductSearchProvider } from "../providers/product-search.provider.js";
3
- import type { AlgoliaCapabilities } from "../schema/capabilities.schema.js";
4
- import type { AlgoliaConfiguration } from "../schema/configuration.schema.js";
5
- import { AlgoliaAnalyticsProvider } from "../providers/analytics.provider.js";
6
- import { AlgoliaProductRecommendationsProvider } from "../providers/product-recommendations.provider.js";
7
-
8
- export function withAlgoliaCapabilities<T extends AlgoliaCapabilities>(configuration: AlgoliaConfiguration, capabilities: T) {
9
- return (cache: Cache, context: RequestContext): ClientFromCapabilities<T> => {
10
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
- const client: any = {};
12
-
13
- if (capabilities.productSearch) {
14
- client.productSearch = new AlgoliaProductSearchProvider(cache, context, configuration);
15
- }
16
-
17
- if (capabilities.analytics) {
18
- client.analytics = new AlgoliaAnalyticsProvider(cache, context, configuration);
19
- }
20
-
21
- if (capabilities.productRecommendations) {
22
- client.productRecommendations = new AlgoliaProductRecommendationsProvider(configuration, cache, context);
23
- }
24
-
25
- return client;
26
- };
27
- }
@@ -1,3 +0,0 @@
1
- export * from './analytics.provider.js';
2
- export * from './product-search.provider.js';
3
- export * from './product-recommendations.provider.js';
@@ -1,236 +0,0 @@
1
- import {
2
- type Cache,
3
- type FacetIdentifier,
4
- FacetIdentifierSchema,
5
- type FacetValueIdentifier,
6
- FacetValueIdentifierSchema,
7
- ImageSchema,
8
- ProductSearchProvider,
9
- type ProductSearchQueryByTerm,
10
- ProductSearchQueryByTermSchema,
11
- type ProductSearchQueryCreateNavigationFilter,
12
- type ProductSearchResult,
13
- type ProductSearchResultFacet,
14
- ProductSearchResultFacetSchema,
15
- type ProductSearchResultFacetValue,
16
- ProductSearchResultFacetValueSchema,
17
- type ProductSearchResultItem,
18
- type ProductSearchResultItemVariant,
19
- ProductSearchResultItemVariantSchema,
20
- ProductSearchResultSchema,
21
- Reactionary,
22
- type RequestContext,
23
- type Result,
24
- success
25
- } from '@reactionary/core';
26
- import { algoliasearch, type SearchResponse } from 'algoliasearch';
27
- import type { AlgoliaConfiguration } from '../schema/configuration.schema.js';
28
- import type { AlgoliaNativeRecord, AlgoliaNativeVariant, AlgoliaProductSearchResult } from '../schema/search.schema.js';
29
-
30
-
31
-
32
- export class AlgoliaProductSearchProvider extends ProductSearchProvider {
33
- protected config: AlgoliaConfiguration;
34
-
35
- constructor(cache: Cache, context: RequestContext, config: AlgoliaConfiguration) {
36
- super(cache, context);
37
- this.config = config;
38
- }
39
-
40
- protected queryByTermPayload(payload: ProductSearchQueryByTerm) {
41
-
42
- const facetsThatAreNotCategory = payload.search.facets.filter(x => x.facet.key !== 'categories');
43
- const categoryFacet = payload.search.facets.find(x => x.facet.key === 'categories') || payload.search.categoryFilter;
44
-
45
- const finalFilters = [...payload.search.filters || []];
46
-
47
-
48
- const finalFacetFilters = [
49
- ...facetsThatAreNotCategory.map(
50
- (x) => `${x.facet.key}:${x.key}`
51
- ),
52
- ]
53
- if (categoryFacet) {
54
- finalFilters.push(`categories:"${categoryFacet.key}"`);
55
- }
56
- return {
57
- indexName: this.config.indexName,
58
- query: payload.search.term,
59
- page: payload.search.paginationOptions.pageNumber - 1,
60
- hitsPerPage: payload.search.paginationOptions.pageSize,
61
- facets: ['*'],
62
- analytics: true,
63
- clickAnalytics: true,
64
- facetFilters: finalFacetFilters,
65
- filters: (finalFilters || [])
66
- .join(' AND '),
67
- };
68
- }
69
-
70
- @Reactionary({
71
- inputSchema: ProductSearchQueryByTermSchema,
72
- outputSchema: ProductSearchResultSchema
73
- })
74
- public override async queryByTerm(
75
- payload: ProductSearchQueryByTerm
76
- ): Promise<Result<ProductSearchResult>> {
77
- const client = algoliasearch(this.config.appId, this.config.apiKey);
78
-
79
-
80
-
81
- const remote = await client.search<AlgoliaNativeRecord>({
82
- requests: [
83
- this.queryByTermPayload(payload)
84
- ],
85
- });
86
-
87
- const input = remote.results[0] as SearchResponse<AlgoliaNativeRecord>;
88
- const result = this.parsePaginatedResult(input, payload) as AlgoliaProductSearchResult;
89
-
90
- // mark selected facets as active
91
- for(const selectedFacet of payload.search.facets) {
92
- const facet = result.facets.find((f) => f.identifier.key === selectedFacet.facet.key);
93
- if(facet) {
94
- const value = facet.values.find((v) => v.identifier.key === selectedFacet.key);
95
- if(value) {
96
- value.active = true;
97
- }
98
- }
99
- }
100
-
101
- return success(result);
102
- }
103
-
104
- public override async createCategoryNavigationFilter(payload: ProductSearchQueryCreateNavigationFilter): Promise<Result<FacetValueIdentifier>> {
105
-
106
- const facetIdentifier = FacetIdentifierSchema.parse({
107
- key: 'categories'
108
- });
109
- const facetValueIdentifier = FacetValueIdentifierSchema.parse({
110
- facet: facetIdentifier,
111
- key: payload.categoryPath.map(c => c.name).join(' > ')
112
- });
113
- return success(facetValueIdentifier);
114
- }
115
-
116
-
117
- protected parseSingle(body: AlgoliaNativeRecord) {
118
- const product = {
119
- identifier: { key: body.objectID },
120
- name: body.name || body.objectID,
121
- slug: body.slug || body.objectID,
122
- variants: [ ... (body.variants || []) ].map(variant => this.parseVariant(variant, body)),
123
- } satisfies ProductSearchResultItem;
124
-
125
- return product;
126
- }
127
-
128
- protected override parseVariant(variant: AlgoliaNativeVariant, product: AlgoliaNativeRecord): ProductSearchResultItemVariant {
129
- const result = ProductSearchResultItemVariantSchema.parse({
130
- variant: {
131
- sku: variant.sku
132
- },
133
- image: ImageSchema.parse({
134
- sourceUrl: variant.image,
135
- altText: product.name || '',
136
- })
137
- } satisfies Partial<ProductSearchResultItemVariant>);
138
-
139
- return result;
140
- }
141
-
142
- protected parsePaginatedResult(body: SearchResponse<AlgoliaNativeRecord>, query: ProductSearchQueryByTerm) {
143
- const items = body.hits.map((hit) => this.parseSingle(hit));
144
- let facets: ProductSearchResultFacet[] = [];
145
- for (const id in body.facets) {
146
- const f = body.facets[id];
147
- const facetId = FacetIdentifierSchema.parse({
148
- key: id
149
- })
150
- const facet = this.parseFacet(facetId, f);
151
- facets.push(facet);
152
- }
153
-
154
-
155
- // we do something to convert the hierachy.lvl.n facet values into something more usable
156
- const selectedCategoryFacet = query.search.facets.find(x => x.facet.key === 'categories') || query.search.categoryFilter;
157
- let subCategoryFacet;
158
- if(selectedCategoryFacet) {
159
- const valueDepth = selectedCategoryFacet.key.split(' > ').length;
160
- // ok, so input defined a facet value from level X, we return hierarchy.lvl.(X+1) as subcategories.
161
- // hierarchy counts from 0, so length is already pointing to 'lvl.(X+1)'
162
- subCategoryFacet = facets.find(f => f.identifier.key === `hierarchy.lvl${valueDepth}`);
163
- } else {
164
- // and remap lvl0 to 'categories'
165
- subCategoryFacet = facets.find(f => f.identifier.key === 'hierarchy.lvl0');
166
- }
167
-
168
- if(subCategoryFacet) {
169
- // remap to 'categories' facet
170
- subCategoryFacet.identifier = FacetIdentifierSchema.parse({
171
- key: 'categories'
172
- });
173
- subCategoryFacet.name = 'Categories';
174
- for(const v of subCategoryFacet.values) {
175
- const pathParts = v.identifier.key.split(' > ');
176
- v.identifier.facet = subCategoryFacet.identifier;
177
- v.name = pathParts[pathParts.length -1];
178
- }
179
- }
180
-
181
- // remove other hierarchy facets
182
- facets = facets.filter(f => !f.identifier.key.startsWith('hierarchy.lvl'));
183
-
184
-
185
-
186
- const result = {
187
- identifier: {
188
- term: query.search.term,
189
- facets: query.search.facets,
190
- filters: query.search.filters,
191
- paginationOptions: query.search.paginationOptions,
192
- index: body.index || '',
193
- key: body.queryID || '',
194
- },
195
- pageNumber: (body.page || 0) + 1,
196
- pageSize: body.hitsPerPage || 0,
197
- totalCount: body.nbHits || 0,
198
- totalPages: body.nbPages || 0,
199
- items: items,
200
- facets,
201
- } satisfies AlgoliaProductSearchResult;
202
-
203
- return result;
204
- }
205
-
206
- protected parseFacet(facetIdentifier: FacetIdentifier, facetValues: Record<string, number>) : ProductSearchResultFacet {
207
- const result: ProductSearchResultFacet = ProductSearchResultFacetSchema.parse({
208
- identifier: facetIdentifier,
209
- name: facetIdentifier.key,
210
- values: []
211
- });
212
-
213
- for (const vid in facetValues) {
214
- const fv = facetValues[vid];
215
-
216
- const facetValueIdentifier = FacetValueIdentifierSchema.parse({
217
- facet: facetIdentifier,
218
- key: vid
219
- } satisfies Partial<FacetValueIdentifier>);
220
-
221
- result.values.push(this.parseFacetValue(facetValueIdentifier, vid, fv));
222
- }
223
- return result;
224
- }
225
-
226
- protected parseFacetValue(facetValueIdentifier: FacetValueIdentifier, label: string, count: number) : ProductSearchResultFacetValue {
227
- return ProductSearchResultFacetValueSchema.parse({
228
- identifier: facetValueIdentifier,
229
- name: label,
230
- count: count,
231
- active: false,
232
- } satisfies Partial<ProductSearchResultFacetValue>);
233
- }
234
-
235
-
236
- }
@@ -1,10 +0,0 @@
1
- import { CapabilitiesSchema } from "@reactionary/core";
2
- import type * as z from 'zod';
3
-
4
- export const AlgoliaCapabilitiesSchema = CapabilitiesSchema.pick({
5
- productSearch: true,
6
- analytics: true,
7
- productRecommendations: true
8
- }).partial();
9
-
10
- export type AlgoliaCapabilities = z.infer<typeof AlgoliaCapabilitiesSchema>;
@@ -1,10 +0,0 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "compilerOptions": {
4
- "outDir": "../../dist/out-tsc",
5
- "declaration": true,
6
- "types": ["node"]
7
- },
8
- "include": ["src/**/*.ts"],
9
- "exclude": ["src/**/*.spec.ts", "vitest.config.ts"]
10
- }
@@ -1,4 +0,0 @@
1
- {
2
- "extends": "./tsconfig.lib.json",
3
- "exclude": []
4
- }
@@ -1,14 +0,0 @@
1
- import { defineConfig, defineProject } from 'vitest/config';
2
- import tsconfigPaths from 'vite-tsconfig-paths';
3
- import { resolve } from 'path';
4
- import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin';
5
-
6
- export default defineProject({
7
- plugins: [nxViteTsPaths()],
8
- test: {
9
- root: resolve(__dirname),
10
- globals: true,
11
- environment: 'node',
12
- include: ['src/**/*.spec.ts'],
13
- },
14
- });
@@ -1,65 +0,0 @@
1
- # Commmercetools provider for Reactionary
2
-
3
- ## Supports
4
-
5
-
6
- | Feature | Support | Notes |
7
- | ----------- | ----------- | --------- |
8
- | product | Full | |
9
- | productSearch | Full | |
10
- | identity | Full | |
11
- | cart | Full | |
12
- | checkout | Full | |
13
- | order | Full | |
14
- | inventory | Full | |
15
- | price | Full | |
16
- | category | Full | |
17
- | store | Full | |
18
-
19
-
20
- ## Notes
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
- ## Building
33
-
34
- Run `nx build provider-commercetools` to build the library.
35
-
36
- ## Running unit tests
37
-
38
- Run `nx test provider-commercetools` to execute the unit tests via [Jest](https://jestjs.io).
39
-
40
-
41
- ## Assumptions for backend config
42
-
43
- - You will have 2 different channels for prices, one called `Offer Price` and one called `List Price`
44
- - ProductVariants will all have unique SKU values.
45
- - Your Supply Channels double as Store Locations
46
-
47
-
48
-
49
- ## TODO List
50
-
51
- ### Core
52
- - [ ] Figure out if we are actually running as anonymous user towards CT. It feels weird right now.
53
-
54
- ### Price
55
- - [ ] PriceProvider should be able to use both embedded and standalone prices? Possible by querying through product-projection maybe?
56
- - [ ] If not, using product-projection, the logic in https://docs.commercetools.com/api/pricing-and-discounts-overview#price-selection should be replicated
57
- - [ ] add list price by convention. Like key: LP-<sku> or something.
58
-
59
-
60
- ### Inventory
61
- - [ ] Be traced and cached
62
-
63
-
64
-
65
-
@@ -1,22 +0,0 @@
1
- import baseConfig from '../../eslint.config.mjs';
2
-
3
- export default [
4
- ...baseConfig,
5
- {
6
- files: ['**/*.json'],
7
- rules: {
8
- '@nx/dependency-checks': [
9
- 'error',
10
- {
11
- ignoredFiles: [
12
- '{projectRoot}/eslint.config.{js,cjs,mjs}',
13
- '{projectRoot}/esbuild.config.{js,ts,mjs,mts}',
14
- ],
15
- },
16
- ],
17
- },
18
- languageOptions: {
19
- parser: await import('jsonc-eslint-parser'),
20
- },
21
- },
22
- ];
@@ -1,15 +0,0 @@
1
- {
2
- "name": "@reactionary/provider-commercetools",
3
- "version": "0.0.1",
4
- "main": "index.js",
5
- "types": "src/index.d.ts",
6
- "dependencies": {
7
- "@reactionary/core": "0.0.1",
8
- "debug": "^4.4.3",
9
- "zod": "4.1.9",
10
- "@commercetools/ts-client": "^4.2.1",
11
- "@commercetools/platform-sdk": "^8.8.0"
12
- },
13
- "type": "module",
14
- "sideEffects": false
15
- }