@reactionary/source 0.0.51 → 0.2.15

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 (325) hide show
  1. package/.env-template +19 -0
  2. package/.github/workflows/pull-request.yml +3 -1
  3. package/.github/workflows/release.yml +9 -0
  4. package/.vscode/extensions.json +0 -2
  5. package/LICENSE +21 -0
  6. package/README.md +175 -23
  7. package/core/package.json +6 -2
  8. package/core/src/cache/cache.interface.ts +2 -1
  9. package/core/src/cache/index.ts +4 -0
  10. package/core/src/cache/memory-cache.ts +32 -4
  11. package/core/src/cache/noop-cache.ts +16 -2
  12. package/core/src/cache/redis-cache.ts +21 -1
  13. package/core/src/client/client-builder.ts +71 -54
  14. package/core/src/client/client.ts +17 -55
  15. package/core/src/client/index.ts +2 -0
  16. package/core/src/decorators/index.ts +1 -0
  17. package/core/src/decorators/reactionary.decorator.ts +210 -21
  18. package/core/src/index.ts +6 -19
  19. package/core/src/initialization.ts +2 -19
  20. package/core/src/metrics/metrics.ts +67 -0
  21. package/core/src/providers/analytics.provider.ts +2 -7
  22. package/core/src/providers/base.provider.ts +6 -70
  23. package/core/src/providers/cart.provider.ts +17 -57
  24. package/core/src/providers/category.provider.ts +9 -18
  25. package/core/src/providers/checkout.provider.ts +21 -19
  26. package/core/src/providers/identity.provider.ts +10 -12
  27. package/core/src/providers/index.ts +14 -13
  28. package/core/src/providers/inventory.provider.ts +18 -8
  29. package/core/src/providers/order-search.provider.ts +29 -0
  30. package/core/src/providers/order.provider.ts +47 -15
  31. package/core/src/providers/price.provider.ts +32 -38
  32. package/core/src/providers/product-search.provider.ts +61 -0
  33. package/core/src/providers/product.provider.ts +75 -16
  34. package/core/src/providers/profile.provider.ts +77 -17
  35. package/core/src/providers/store.provider.ts +6 -8
  36. package/core/src/schemas/capabilities.schema.ts +10 -3
  37. package/core/src/schemas/errors/generic.error.ts +9 -0
  38. package/core/src/schemas/errors/index.ts +4 -0
  39. package/core/src/schemas/errors/invalid-input.error.ts +9 -0
  40. package/core/src/schemas/errors/invalid-output.error.ts +9 -0
  41. package/core/src/schemas/errors/not-found.error.ts +9 -0
  42. package/core/src/schemas/index.ts +7 -0
  43. package/core/src/schemas/models/analytics.model.ts +3 -2
  44. package/core/src/schemas/models/base.model.ts +6 -24
  45. package/core/src/schemas/models/cart.model.ts +7 -16
  46. package/core/src/schemas/models/category.model.ts +6 -11
  47. package/core/src/schemas/models/checkout.model.ts +11 -14
  48. package/core/src/schemas/models/cost.model.ts +5 -4
  49. package/core/src/schemas/models/currency.model.ts +2 -1
  50. package/core/src/schemas/models/identifiers.model.ts +106 -62
  51. package/core/src/schemas/models/identity.model.ts +12 -21
  52. package/core/src/schemas/models/index.ts +20 -19
  53. package/core/src/schemas/models/inventory.model.ts +10 -7
  54. package/core/src/schemas/models/order-search.model.ts +28 -0
  55. package/core/src/schemas/models/order.model.ts +25 -32
  56. package/core/src/schemas/models/payment.model.ts +17 -20
  57. package/core/src/schemas/models/price.model.ts +14 -14
  58. package/core/src/schemas/models/product-search.model.ts +42 -0
  59. package/core/src/schemas/models/product.model.ts +64 -22
  60. package/core/src/schemas/models/profile.model.ts +21 -24
  61. package/core/src/schemas/models/shipping-method.model.ts +28 -33
  62. package/core/src/schemas/models/store.model.ts +10 -6
  63. package/core/src/schemas/mutations/analytics.mutation.ts +9 -8
  64. package/core/src/schemas/mutations/base.mutation.ts +2 -1
  65. package/core/src/schemas/mutations/cart.mutation.ts +37 -37
  66. package/core/src/schemas/mutations/checkout.mutation.ts +24 -31
  67. package/core/src/schemas/mutations/identity.mutation.ts +5 -4
  68. package/core/src/schemas/mutations/index.ts +10 -10
  69. package/core/src/schemas/mutations/profile.mutation.ts +39 -4
  70. package/core/src/schemas/queries/base.query.ts +2 -1
  71. package/core/src/schemas/queries/cart.query.ts +5 -5
  72. package/core/src/schemas/queries/category.query.ts +21 -21
  73. package/core/src/schemas/queries/checkout.query.ts +9 -11
  74. package/core/src/schemas/queries/identity.query.ts +3 -2
  75. package/core/src/schemas/queries/index.ts +14 -13
  76. package/core/src/schemas/queries/inventory.query.ts +6 -6
  77. package/core/src/schemas/queries/order-search.query.ts +10 -0
  78. package/core/src/schemas/queries/order.query.ts +5 -4
  79. package/core/src/schemas/queries/price.query.ts +11 -5
  80. package/core/src/schemas/queries/product-search.query.ts +16 -0
  81. package/core/src/schemas/queries/product.query.ts +14 -7
  82. package/core/src/schemas/queries/profile.query.ts +6 -3
  83. package/core/src/schemas/queries/store.query.ts +7 -6
  84. package/core/src/schemas/result.ts +107 -0
  85. package/core/src/schemas/session.schema.ts +6 -6
  86. package/core/src/test/reactionary.decorator.spec.ts +249 -0
  87. package/core/src/zod-utils.ts +19 -0
  88. package/core/tsconfig.json +3 -2
  89. package/core/tsconfig.spec.json +2 -26
  90. package/core/vitest.config.ts +14 -0
  91. package/documentation/1-purpose.md +114 -0
  92. package/documentation/2-getting-started.md +229 -0
  93. package/documentation/3-querying-and-changing-data.md +74 -0
  94. package/documentation/4-product-data.md +107 -0
  95. package/documentation/5-cart-and-checkout.md +211 -0
  96. package/documentation/6-product-search.md +143 -0
  97. package/documentation/7-marketing.md +3 -0
  98. package/eslint.config.mjs +1 -0
  99. package/examples/node/eslint.config.mjs +1 -4
  100. package/examples/node/package.json +11 -3
  101. package/examples/node/project.json +4 -1
  102. package/examples/node/src/basic/basic-node-provider-model-extension.spec.ts +22 -23
  103. package/examples/node/src/basic/basic-node-provider-query-extension.spec.ts +15 -11
  104. package/examples/node/src/basic/basic-node-setup.spec.ts +44 -28
  105. package/examples/node/src/basic/client-creation.spec.ts +53 -0
  106. package/examples/node/src/capabilities/cart.spec.ts +255 -0
  107. package/examples/node/src/capabilities/category.spec.ts +193 -0
  108. package/examples/node/src/capabilities/checkout.spec.ts +341 -0
  109. package/examples/node/src/capabilities/identity.spec.ts +93 -0
  110. package/examples/node/src/capabilities/inventory.spec.ts +66 -0
  111. package/examples/node/src/capabilities/order-search.spec.ts +159 -0
  112. package/examples/node/src/capabilities/order.spec.ts +91 -0
  113. package/examples/node/src/capabilities/price.spec.ts +51 -0
  114. package/examples/node/src/capabilities/product-search.spec.ts +293 -0
  115. package/examples/node/src/capabilities/product.spec.ts +122 -0
  116. package/examples/node/src/capabilities/profile.spec.ts +316 -0
  117. package/examples/node/src/capabilities/store.spec.ts +26 -0
  118. package/examples/node/src/utils.ts +137 -0
  119. package/examples/node/tsconfig.json +9 -11
  120. package/examples/node/tsconfig.lib.json +1 -2
  121. package/examples/node/tsconfig.spec.json +2 -13
  122. package/examples/node/vitest.config.ts +14 -0
  123. package/migrations.json +22 -5
  124. package/nx.json +8 -47
  125. package/package.json +24 -96
  126. package/providers/algolia/README.md +39 -2
  127. package/providers/algolia/package.json +3 -1
  128. package/providers/algolia/src/core/initialize.ts +9 -16
  129. package/providers/algolia/src/index.ts +4 -6
  130. package/providers/algolia/src/providers/index.ts +1 -0
  131. package/providers/algolia/src/providers/product-search.provider.ts +241 -0
  132. package/providers/algolia/src/schema/capabilities.schema.ts +2 -3
  133. package/providers/algolia/src/schema/index.ts +3 -0
  134. package/providers/algolia/src/schema/search.schema.ts +8 -8
  135. package/providers/algolia/tsconfig.json +2 -1
  136. package/providers/algolia/tsconfig.lib.json +1 -1
  137. package/providers/algolia/tsconfig.spec.json +2 -13
  138. package/providers/algolia/vitest.config.ts +14 -0
  139. package/providers/commercetools/README.md +30 -3
  140. package/providers/commercetools/package.json +3 -2
  141. package/providers/commercetools/src/core/client.ts +179 -100
  142. package/providers/commercetools/src/core/initialize.ts +131 -75
  143. package/providers/commercetools/src/core/token-cache.ts +45 -0
  144. package/providers/commercetools/src/index.ts +11 -10
  145. package/providers/commercetools/src/providers/cart.provider.ts +282 -356
  146. package/providers/commercetools/src/providers/category.provider.ts +223 -147
  147. package/providers/commercetools/src/providers/checkout.provider.ts +631 -449
  148. package/providers/commercetools/src/providers/identity.provider.ts +51 -30
  149. package/providers/commercetools/src/providers/index.ts +12 -12
  150. package/providers/commercetools/src/providers/inventory.provider.ts +77 -77
  151. package/providers/commercetools/src/providers/order-search.provider.ts +220 -0
  152. package/providers/commercetools/src/providers/order.provider.ts +97 -64
  153. package/providers/commercetools/src/providers/price.provider.ts +148 -118
  154. package/providers/commercetools/src/providers/product-search.provider.ts +528 -0
  155. package/providers/commercetools/src/providers/product.provider.ts +251 -81
  156. package/providers/commercetools/src/providers/profile.provider.ts +446 -29
  157. package/providers/commercetools/src/providers/store.provider.ts +56 -42
  158. package/providers/commercetools/src/schema/capabilities.schema.ts +3 -1
  159. package/providers/commercetools/src/schema/commercetools.schema.ts +17 -3
  160. package/providers/commercetools/src/schema/configuration.schema.ts +1 -0
  161. package/providers/commercetools/src/schema/session.schema.ts +7 -0
  162. package/providers/commercetools/src/test/caching.spec.ts +82 -0
  163. package/providers/commercetools/src/test/identity.spec.ts +109 -0
  164. package/providers/commercetools/src/test/test-utils.ts +21 -19
  165. package/providers/commercetools/tsconfig.json +2 -1
  166. package/providers/commercetools/tsconfig.lib.json +1 -1
  167. package/providers/commercetools/tsconfig.spec.json +2 -13
  168. package/providers/commercetools/vitest.config.ts +15 -0
  169. package/providers/fake/README.md +20 -4
  170. package/providers/fake/package.json +3 -2
  171. package/providers/fake/src/core/initialize.ts +52 -54
  172. package/providers/fake/src/index.ts +4 -4
  173. package/providers/fake/src/providers/analytics.provider.ts +6 -8
  174. package/providers/fake/src/providers/cart.provider.ts +165 -94
  175. package/providers/fake/src/providers/category.provider.ts +79 -51
  176. package/providers/fake/src/providers/checkout.provider.ts +254 -0
  177. package/providers/fake/src/providers/identity.provider.ts +58 -66
  178. package/providers/fake/src/providers/index.ts +13 -9
  179. package/providers/fake/src/providers/inventory.provider.ts +41 -37
  180. package/providers/fake/src/providers/order-search.provider.ts +78 -0
  181. package/providers/fake/src/providers/order.provider.ts +106 -0
  182. package/providers/fake/src/providers/price.provider.ts +94 -42
  183. package/providers/fake/src/providers/product-search.provider.ts +206 -0
  184. package/providers/fake/src/providers/product.provider.ts +57 -42
  185. package/providers/fake/src/providers/profile.provider.ts +147 -0
  186. package/providers/fake/src/providers/store.provider.ts +31 -22
  187. package/providers/fake/src/schema/capabilities.schema.ts +5 -1
  188. package/providers/fake/src/test/cart.provider.spec.ts +62 -83
  189. package/providers/fake/src/test/category.provider.spec.ts +147 -89
  190. package/providers/fake/src/test/checkout.provider.spec.ts +222 -0
  191. package/providers/fake/src/test/order-search.provider.spec.ts +50 -0
  192. package/providers/fake/src/test/order.provider.spec.ts +44 -0
  193. package/providers/fake/src/test/price.provider.spec.ts +52 -47
  194. package/providers/fake/src/test/product.provider.spec.ts +18 -10
  195. package/providers/fake/src/test/profile.provider.spec.ts +167 -0
  196. package/providers/fake/src/test/test-utils.ts +1 -1
  197. package/providers/fake/tsconfig.json +2 -1
  198. package/providers/fake/tsconfig.lib.json +1 -1
  199. package/providers/fake/tsconfig.spec.json +2 -14
  200. package/providers/fake/vitest.config.ts +14 -0
  201. package/providers/medusa/README.md +30 -0
  202. package/providers/medusa/TESTING.md +98 -0
  203. package/{trpc → providers/medusa}/eslint.config.mjs +1 -1
  204. package/providers/medusa/package.json +22 -0
  205. package/providers/medusa/project.json +34 -0
  206. package/providers/medusa/src/core/client.ts +370 -0
  207. package/providers/medusa/src/core/initialize.ts +78 -0
  208. package/providers/medusa/src/index.ts +13 -0
  209. package/providers/medusa/src/providers/cart.provider.ts +575 -0
  210. package/providers/medusa/src/providers/category.provider.ts +247 -0
  211. package/providers/medusa/src/providers/checkout.provider.ts +636 -0
  212. package/providers/medusa/src/providers/identity.provider.ts +137 -0
  213. package/providers/medusa/src/providers/inventory.provider.ts +173 -0
  214. package/providers/medusa/src/providers/order-search.provider.ts +201 -0
  215. package/providers/medusa/src/providers/order.provider.ts +226 -0
  216. package/providers/medusa/src/providers/price.provider.ts +140 -0
  217. package/providers/medusa/src/providers/product-search.provider.ts +243 -0
  218. package/providers/medusa/src/providers/product.provider.ts +261 -0
  219. package/providers/medusa/src/providers/profile.provider.ts +392 -0
  220. package/providers/medusa/src/schema/capabilities.schema.ts +18 -0
  221. package/providers/medusa/src/schema/configuration.schema.ts +11 -0
  222. package/providers/medusa/src/schema/medusa.schema.ts +31 -0
  223. package/providers/medusa/src/test/cart.provider.spec.ts +240 -0
  224. package/providers/medusa/src/test/category.provider.spec.ts +231 -0
  225. package/providers/medusa/src/test/checkout.spec.ts +349 -0
  226. package/providers/medusa/src/test/identity.provider.spec.ts +122 -0
  227. package/providers/medusa/src/test/inventory.provider.spec.ts +88 -0
  228. package/providers/medusa/src/test/large-cart.provider.spec.ts +103 -0
  229. package/providers/medusa/src/test/price.provider.spec.ts +104 -0
  230. package/providers/medusa/src/test/product.provider.spec.ts +146 -0
  231. package/providers/medusa/src/test/search.provider.spec.ts +203 -0
  232. package/providers/medusa/src/test/test-utils.ts +13 -0
  233. package/providers/medusa/src/utils/medusa-helpers.ts +89 -0
  234. package/providers/medusa/tsconfig.json +21 -0
  235. package/providers/medusa/tsconfig.lib.json +9 -0
  236. package/providers/medusa/tsconfig.spec.json +4 -0
  237. package/providers/medusa/vitest.config.ts +15 -0
  238. package/providers/meilisearch/README.md +48 -0
  239. package/{otel → providers/meilisearch}/eslint.config.mjs +1 -2
  240. package/providers/meilisearch/package.json +13 -0
  241. package/providers/meilisearch/project.json +34 -0
  242. package/providers/meilisearch/src/core/initialize.ts +16 -0
  243. package/providers/meilisearch/src/index.ts +5 -0
  244. package/providers/meilisearch/src/providers/index.ts +1 -0
  245. package/providers/meilisearch/src/providers/product-search.provider.ts +251 -0
  246. package/providers/meilisearch/src/schema/capabilities.schema.ts +9 -0
  247. package/providers/meilisearch/src/schema/configuration.schema.ts +10 -0
  248. package/providers/meilisearch/src/schema/index.ts +3 -0
  249. package/providers/meilisearch/src/schema/search.schema.ts +14 -0
  250. package/{otel → providers/meilisearch}/tsconfig.json +3 -2
  251. package/{trpc → providers/meilisearch}/tsconfig.lib.json +2 -2
  252. package/providers/meilisearch/tsconfig.spec.json +4 -0
  253. package/providers/meilisearch/vitest.config.ts +14 -0
  254. package/providers/posthog/package.json +5 -4
  255. package/providers/posthog/project.json +2 -2
  256. package/providers/posthog/src/core/initialize.ts +2 -2
  257. package/providers/posthog/src/index.ts +3 -3
  258. package/providers/posthog/tsconfig.json +2 -1
  259. package/tsconfig.base.json +7 -3
  260. package/vitest.config.ts +10 -0
  261. package/core/src/providers/search.provider.ts +0 -18
  262. package/core/src/schemas/models/search.model.ts +0 -37
  263. package/core/src/schemas/queries/search.query.ts +0 -9
  264. package/examples/next/.swcrc +0 -30
  265. package/examples/next/eslint.config.mjs +0 -21
  266. package/examples/next/index.d.ts +0 -6
  267. package/examples/next/next-env.d.ts +0 -5
  268. package/examples/next/next.config.js +0 -20
  269. package/examples/next/project.json +0 -9
  270. package/examples/next/public/.gitkeep +0 -0
  271. package/examples/next/public/favicon.ico +0 -0
  272. package/examples/next/src/app/global.css +0 -0
  273. package/examples/next/src/app/layout.tsx +0 -18
  274. package/examples/next/src/app/page.module.scss +0 -2
  275. package/examples/next/src/app/page.tsx +0 -48
  276. package/examples/next/src/instrumentation.ts +0 -9
  277. package/examples/next/tsconfig.json +0 -44
  278. package/examples/node/jest.config.ts +0 -10
  279. package/jest.config.ts +0 -6
  280. package/jest.preset.js +0 -3
  281. package/otel/README.md +0 -227
  282. package/otel/package.json +0 -11
  283. package/otel/pnpm-lock.yaml +0 -805
  284. package/otel/project.json +0 -33
  285. package/otel/src/index.ts +0 -22
  286. package/otel/src/metrics.ts +0 -76
  287. package/otel/src/provider-instrumentation.ts +0 -108
  288. package/otel/src/test/otel.spec.ts +0 -8
  289. package/otel/src/trace-decorator.ts +0 -226
  290. package/otel/src/tracer.ts +0 -83
  291. package/otel/src/trpc-middleware.ts +0 -128
  292. package/otel/tsconfig.lib.json +0 -23
  293. package/otel/tsconfig.spec.json +0 -28
  294. package/otel/vite.config.ts +0 -24
  295. package/providers/algolia/jest.config.ts +0 -10
  296. package/providers/algolia/src/providers/product.provider.ts +0 -66
  297. package/providers/algolia/src/providers/search.provider.ts +0 -106
  298. package/providers/algolia/src/test/search.provider.spec.ts +0 -91
  299. package/providers/commercetools/jest.config.ts +0 -10
  300. package/providers/commercetools/src/providers/search.provider.ts +0 -98
  301. package/providers/commercetools/src/test/cart.provider.spec.ts +0 -199
  302. package/providers/commercetools/src/test/category.provider.spec.ts +0 -168
  303. package/providers/commercetools/src/test/checkout.provider.spec.ts +0 -312
  304. package/providers/commercetools/src/test/identity.provider.spec.ts +0 -88
  305. package/providers/commercetools/src/test/inventory.provider.spec.ts +0 -41
  306. package/providers/commercetools/src/test/price.provider.spec.ts +0 -81
  307. package/providers/commercetools/src/test/product.provider.spec.ts +0 -80
  308. package/providers/commercetools/src/test/profile.provider.spec.ts +0 -49
  309. package/providers/commercetools/src/test/search.provider.spec.ts +0 -61
  310. package/providers/commercetools/src/test/store.provider.spec.ts +0 -37
  311. package/providers/fake/jest.config.ts +0 -10
  312. package/providers/fake/src/providers/search.provider.ts +0 -135
  313. package/trpc/README.md +0 -7
  314. package/trpc/__mocks__/superjson.js +0 -25
  315. package/trpc/jest.config.ts +0 -14
  316. package/trpc/package.json +0 -14
  317. package/trpc/project.json +0 -31
  318. package/trpc/src/client.ts +0 -175
  319. package/trpc/src/index.ts +0 -44
  320. package/trpc/src/integration.spec.ts +0 -223
  321. package/trpc/src/server.ts +0 -125
  322. package/trpc/src/transparent-client.spec.ts +0 -161
  323. package/trpc/src/types.ts +0 -144
  324. package/trpc/tsconfig.json +0 -16
  325. package/trpc/tsconfig.spec.json +0 -15
@@ -1,23 +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": [
10
- "vite.config.ts",
11
- "vite.config.mts",
12
- "vitest.config.ts",
13
- "vitest.config.mts",
14
- "src/**/*.test.ts",
15
- "src/**/*.spec.ts",
16
- "src/**/*.test.tsx",
17
- "src/**/*.spec.tsx",
18
- "src/**/*.test.js",
19
- "src/**/*.spec.js",
20
- "src/**/*.test.jsx",
21
- "src/**/*.spec.jsx"
22
- ]
23
- }
@@ -1,28 +0,0 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "compilerOptions": {
4
- "outDir": "../dist/out-tsc",
5
- "types": [
6
- "vitest/globals",
7
- "vitest/importMeta",
8
- "vite/client",
9
- "node",
10
- "vitest"
11
- ]
12
- },
13
- "include": [
14
- "vite.config.ts",
15
- "vite.config.mts",
16
- "vitest.config.ts",
17
- "vitest.config.mts",
18
- "src/**/*.test.ts",
19
- "src/**/*.spec.ts",
20
- "src/**/*.test.tsx",
21
- "src/**/*.spec.tsx",
22
- "src/**/*.test.js",
23
- "src/**/*.spec.js",
24
- "src/**/*.test.jsx",
25
- "src/**/*.spec.jsx",
26
- "src/**/*.d.ts"
27
- ]
28
- }
@@ -1,24 +0,0 @@
1
- import { defineConfig } from 'vite';
2
- import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin';
3
- import { nxCopyAssetsPlugin } from '@nx/vite/plugins/nx-copy-assets.plugin';
4
-
5
- export default defineConfig(() => ({
6
- root: __dirname,
7
- cacheDir: '../node_modules/.vite/otel',
8
- plugins: [nxViteTsPaths(), nxCopyAssetsPlugin(['*.md'])],
9
- // Uncomment this if you are using workers.
10
- // worker: {
11
- // plugins: [ nxViteTsPaths() ],
12
- // },
13
- test: {
14
- watch: false,
15
- globals: true,
16
- environment: 'node',
17
- include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
18
- reporters: ['default'],
19
- coverage: {
20
- reportsDirectory: '../coverage/otel',
21
- provider: 'v8' as const,
22
- },
23
- },
24
- }));
@@ -1,10 +0,0 @@
1
- export default {
2
- displayName: 'provider-algolia',
3
- preset: '../../jest.preset.js',
4
- testEnvironment: 'node',
5
- transform: {
6
- '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.spec.json' }],
7
- },
8
- moduleFileExtensions: ['ts', 'js', 'html'],
9
- coverageDirectory: '../../coverage/providers/algolia',
10
- };
@@ -1,66 +0,0 @@
1
- import type {
2
- Product,
3
- ProductQueryById,
4
- ProductQueryBySlug,
5
- RequestContext,
6
- Cache,
7
- ProductQueryBySKU
8
- } from '@reactionary/core';
9
- import {
10
- ProductProvider
11
- } from '@reactionary/core';
12
- import type { z } from 'zod';
13
- import type { AlgoliaConfiguration } from '../schema/configuration.schema';
14
-
15
- export class AlgoliaProductProvider<
16
- T extends Product = Product
17
- > extends ProductProvider<T> {
18
- protected config: AlgoliaConfiguration;
19
-
20
- constructor(config: AlgoliaConfiguration, schema: z.ZodType<T>, cache: Cache) {
21
- super(schema, cache);
22
-
23
- this.config = config;
24
- }
25
-
26
- public override async getById(
27
- payload: ProductQueryById,
28
- _reqCtx: RequestContext
29
- ): Promise<T> {
30
- // TODO: Implement Algolia product fetch by ID
31
- const result = this.newModel();
32
- result.identifier = { key: payload.id };
33
- result.name = `Algolia Product ${payload.id}`;
34
- result.slug = payload.id;
35
- result.description = 'Product from Algolia';
36
- result.meta = {
37
- cache: { hit: false, key: payload.id },
38
- placeholder: true
39
- };
40
-
41
- return this.assert(result);
42
- }
43
-
44
- public override async getBySlug(
45
- payload: ProductQueryBySlug,
46
- _reqCtx: RequestContext
47
- ): Promise<T> {
48
- // TODO: Implement Algolia product fetch by slug
49
- const result = this.newModel();
50
- result.identifier = { key: payload.slug };
51
- result.name = `Algolia Product ${payload.slug}`;
52
- result.slug = payload.slug;
53
- result.description = 'Product from Algolia';
54
- result.meta = {
55
- cache: { hit: false, key: payload.slug },
56
- placeholder: true
57
- };
58
-
59
- return this.assert(result);
60
- }
61
-
62
- public override getBySKU(payload: ProductQueryBySKU, reqCtx: RequestContext): Promise<T> {
63
- throw new Error('Method not implemented.');
64
- }
65
-
66
- }
@@ -1,106 +0,0 @@
1
- import {
2
- type SearchQueryByTerm,
3
- type SearchResult,
4
- type SearchResultFacet,
5
- type SearchResultProduct,
6
- type RequestContext,
7
- type Cache,
8
- SearchProvider,
9
- } from '@reactionary/core';
10
- import { algoliasearch } from 'algoliasearch';
11
- import type { z } from 'zod';
12
- import type { AlgoliaConfiguration } from '../schema/configuration.schema';
13
-
14
- export class AlgoliaSearchProvider<
15
- T extends SearchResult = SearchResult
16
- > extends SearchProvider<T> {
17
- protected config: AlgoliaConfiguration;
18
-
19
- constructor(config: AlgoliaConfiguration, schema: z.ZodType<T>, cache: Cache) {
20
- super(schema, cache);
21
-
22
- this.config = config;
23
- }
24
-
25
- public override async queryByTerm(
26
- payload: SearchQueryByTerm,
27
- _reqCtx: RequestContext
28
- ): Promise<SearchResult> {
29
- const client = algoliasearch(this.config.appId, this.config.apiKey);
30
- const remote = await client.search<unknown>({
31
- requests: [
32
- {
33
- indexName: this.config.indexName,
34
- query: payload.search.term,
35
- page: payload.search.page,
36
- hitsPerPage: payload.search.pageSize,
37
- facets: ['*'],
38
- analytics: true,
39
- clickAnalytics: true,
40
- facetFilters: payload.search.facets.map(
41
- (x) => `${encodeURIComponent(x.facet.key)}:${x.key}`
42
- ),
43
- },
44
- ],
45
- });
46
-
47
- return this.parseSearchResult(remote, payload);
48
- }
49
-
50
- protected parseSearchResult(remote: unknown, payload: SearchQueryByTerm): T {
51
- const result = this.newModel();
52
- const remoteData = remote as { results: Array<{ facets: Record<string, Record<string, number>>; hits: Array<{ objectID: string; slug?: string; name?: string; image?: string }>; index: string; queryID: string; nbPages: number }> };
53
- const remoteProducts = remoteData.results[0];
54
-
55
- // Parse facets
56
- for (const id in remoteProducts.facets) {
57
- const f = remoteProducts.facets[id];
58
-
59
- const facet = {
60
- identifier: { key: id },
61
- name: id,
62
- values: []
63
- } as SearchResultFacet;
64
-
65
- for (const vid in f) {
66
- const fv = f[vid];
67
- const isActive = payload.search.facets.find(
68
- (x) => x.facet.key === id && x.key === vid
69
- );
70
-
71
- facet.values.push({
72
- identifier: { key: vid, facet: { key: id } },
73
- count: fv,
74
- name: vid,
75
- active: !!isActive
76
- });
77
- }
78
-
79
- result.facets.push(facet);
80
- }
81
-
82
- // Parse products
83
- for (const p of remoteProducts.hits) {
84
- result.products.push({
85
- identifier: { key: p.objectID },
86
- slug: p.slug,
87
- name: p.name,
88
- image: p.image
89
- } as SearchResultProduct);
90
- }
91
-
92
- // Set result metadata
93
- result.identifier = {
94
- ...payload.search,
95
- index: remoteProducts.index,
96
- key: remoteProducts.queryID
97
- };
98
- result.pages = remoteProducts.nbPages;
99
- result.meta = {
100
- cache: { hit: false, key: payload.search.term },
101
- placeholder: false
102
- };
103
-
104
- return this.assert(result);
105
- }
106
- }
@@ -1,91 +0,0 @@
1
- import 'dotenv/config';
2
- import { createInitialRequestContext, NoOpCache, SearchResultSchema } from '@reactionary/core';
3
- import { AlgoliaSearchProvider } from '../providers/search.provider';
4
-
5
- describe('Algolia Search Provider', () => {
6
- const provider = new AlgoliaSearchProvider(
7
- {
8
- apiKey: process.env['ALGOLIA_API_KEY'] || '',
9
- appId: process.env['ALGOLIA_APP_ID'] || '',
10
- indexName: process.env['ALGOLIA_INDEX'] || '',
11
- },
12
- SearchResultSchema,
13
- new NoOpCache()
14
- );
15
-
16
- const reqCtx = createInitialRequestContext();
17
-
18
- it('should be able to get a result by term', async () => {
19
- const result = await provider.queryByTerm({ search: {
20
- term: 'glass',
21
- page: 0,
22
- pageSize: 20,
23
- facets: [],
24
- }}, reqCtx);
25
-
26
- expect(result.products.length).toBeGreaterThan(0);
27
- expect(result.facets.length).toBe(2);
28
- expect(result.facets[0].values.length).toBeGreaterThan(0);
29
- expect(result.facets[1].values.length).toBeGreaterThan(0);
30
- });
31
-
32
- it('should be able to paginate', async () => {
33
- const firstPage = await provider.queryByTerm({ search: {
34
- term: 'glass',
35
- page: 0,
36
- pageSize: 20,
37
- facets: [],
38
- }}, reqCtx);
39
-
40
- const secondPage = await provider.queryByTerm({ search: {
41
- term: 'glass',
42
- page: 1,
43
- pageSize: 20,
44
- facets: [],
45
- }}, reqCtx);
46
-
47
- expect(firstPage.identifier.page).toBe(0);
48
- expect(secondPage.identifier.page).toBe(1);
49
- expect(firstPage.products[0].identifier.key).not.toEqual(
50
- secondPage.products[0].identifier.key
51
- );
52
- });
53
-
54
- it('should be able to change page size', async () => {
55
- const smallPage = await provider.queryByTerm({ search: {
56
- term: 'glass',
57
- page: 0,
58
- pageSize: 2,
59
- facets: [],
60
- }}, reqCtx);
61
- const largePage = await provider.queryByTerm({ search: {
62
- term: 'glass',
63
- page: 0,
64
- pageSize: 30,
65
- facets: [],
66
- }}, reqCtx);
67
-
68
- expect(smallPage.products.length).toBe(2);
69
- expect(smallPage.identifier.pageSize).toBe(2);
70
- expect(largePage.products.length).toBe(30);
71
- expect(largePage.identifier.pageSize).toBe(30);
72
- });
73
-
74
- it('should be able to apply facets', async () => {
75
- const initial = await provider.queryByTerm({ search: {
76
- term: 'glass',
77
- page: 0,
78
- pageSize: 2,
79
- facets: [],
80
- }}, reqCtx);
81
-
82
- const filtered = await provider.queryByTerm({ search: {
83
- term: 'glass',
84
- page: 0,
85
- pageSize: 2,
86
- facets: [initial.facets[0].values[0].identifier],
87
- }}, reqCtx);
88
-
89
- expect(initial.pages).toBeGreaterThan(filtered.pages);
90
- });
91
- });
@@ -1,10 +0,0 @@
1
- export default {
2
- displayName: 'provider-commercetools',
3
- preset: '../../jest.preset.js',
4
- testEnvironment: 'node',
5
- transform: {
6
- '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.spec.json' }],
7
- },
8
- moduleFileExtensions: ['ts', 'js', 'html'],
9
- coverageDirectory: '../../coverage/providers/commercetools',
10
- };
@@ -1,98 +0,0 @@
1
- import { SearchProvider } from '@reactionary/core';
2
- import type {
3
- SearchResult,
4
- SearchResultProduct,
5
- Cache,
6
- SearchQueryByTerm,
7
- Session, RequestContext,
8
- } from '@reactionary/core';
9
-
10
- import { CommercetoolsClient } from '../core/client';
11
- import type z from 'zod';
12
- import type { CommercetoolsConfiguration } from '../schema/configuration.schema';
13
- import { traced } from '@reactionary/otel';
14
-
15
- export class CommercetoolsSearchProvider<
16
- T extends SearchResult = SearchResult
17
- > extends SearchProvider<T> {
18
- protected config: CommercetoolsConfiguration;
19
-
20
- constructor(
21
- config: CommercetoolsConfiguration,
22
- schema: z.ZodType<T>,
23
- cache: Cache
24
- ) {
25
- super(schema, cache);
26
-
27
- this.config = config;
28
- }
29
-
30
- @traced()
31
- protected async getClient(reqCtx: RequestContext) {
32
- const client = await new CommercetoolsClient(this.config).getClient(reqCtx);
33
- return client.withProjectKey({ projectKey: this.config.projectKey }).productProjections();
34
- }
35
-
36
-
37
- public override async queryByTerm(
38
- payload: SearchQueryByTerm,
39
- reqCtx: RequestContext
40
- ): Promise<T> {
41
- const client = await this.getClient(reqCtx);
42
-
43
- const remote = await client
44
- .search()
45
- .get({
46
- queryArgs: {
47
- limit: payload.search.pageSize,
48
- offset: (payload.search.page - 1) * payload.search.pageSize,
49
- [`text.${reqCtx.languageContext.locale}`]: payload.search.term,
50
- },
51
- })
52
- .execute();
53
-
54
- return this.parseSearchResult(remote, payload, reqCtx);
55
- }
56
-
57
- protected parseSearchResult(
58
- remote: unknown,
59
- payload: SearchQueryByTerm,
60
- reqCtx: RequestContext
61
- ): T {
62
- const result = this.newModel();
63
- const remoteData = remote as {
64
- body: {
65
- results: Array<{
66
- id: string;
67
- name: Record<string, string>;
68
- slug?: Record<string, string>;
69
- masterVariant: { images?: Array<{ url?: string }> };
70
- }>;
71
- total?: number;
72
- };
73
- };
74
-
75
- result.identifier = payload.search;
76
-
77
- for (const p of remoteData.body.results) {
78
- const product: SearchResultProduct = {
79
- identifier: { key: p.id },
80
- name: p.name[reqCtx.languageContext.locale] || p.id,
81
- slug: p.slug?.[reqCtx.languageContext.locale] || p.id,
82
- image: p.masterVariant.images?.[0]?.url || 'https://placehold.co/400',
83
- };
84
-
85
- result.products.push(product);
86
- }
87
-
88
- result.pages = Math.ceil(
89
- (remoteData.body.total || 0) / payload.search.pageSize
90
- );
91
- result.meta = {
92
- cache: { hit: false, key: payload.search.term },
93
- placeholder: false,
94
- };
95
-
96
- return this.assert(result);
97
- }
98
- }
@@ -1,199 +0,0 @@
1
- import 'dotenv/config';
2
- import type { RequestContext} from '@reactionary/core';
3
- import { CartSchema, IdentitySchema, NoOpCache, ProductSchema, createInitialRequestContext } from '@reactionary/core';
4
- import { getCommercetoolsTestConfiguration } from './test-utils';
5
- import { CommercetoolsCartProvider } from '../providers/cart.provider';
6
- import { CommercetoolsIdentityProvider } from '../providers/identity.provider';
7
- import { CommercetoolsProductProvider } from '../providers/product.provider';
8
-
9
-
10
- const testData = {
11
- skuWithoutTiers: 'SGB-01',
12
- skuWithTiers: 'GMCT-01'
13
- }
14
-
15
- describe('Commercetools Cart Provider', () => {
16
- let provider: CommercetoolsCartProvider;
17
- let productProvider: CommercetoolsProductProvider;
18
- let identityProvider: CommercetoolsIdentityProvider;
19
- let reqCtx: RequestContext;
20
-
21
- beforeAll( () => {
22
- provider = new CommercetoolsCartProvider(getCommercetoolsTestConfiguration(), CartSchema, new NoOpCache());
23
- identityProvider = new CommercetoolsIdentityProvider(getCommercetoolsTestConfiguration(), IdentitySchema, new NoOpCache());
24
- productProvider = new CommercetoolsProductProvider(getCommercetoolsTestConfiguration(), ProductSchema, new NoOpCache());
25
- });
26
-
27
- beforeEach( () => {
28
- reqCtx = createInitialRequestContext()
29
- });
30
-
31
- describe('anonymous sessions', () => {
32
- it('should be able to get an empty cart', async () => {
33
- const cart = await provider.getById({
34
- cart: { key: '' },
35
- }, reqCtx);
36
-
37
- expect(cart.identifier.key).toBeFalsy();
38
- expect(cart.items.length).toBe(0);
39
- expect(cart.meta?.placeholder).toBe(true);
40
-
41
- });
42
-
43
- it('should be able to add an item to a cart', async () => {
44
- const cart = await provider.add({
45
- cart: { key: '' },
46
- sku: {
47
- key: testData.skuWithoutTiers,
48
- },
49
- quantity: 1
50
- }, reqCtx);
51
-
52
- expect(cart.identifier.key).toBeDefined();
53
- expect(cart.items.length).toBe(1);
54
- expect(cart.items[0].sku.key).toBe(testData.skuWithoutTiers);
55
- expect(cart.items[0].quantity).toBe(1);
56
-
57
- expect(cart.items[0].price.totalPrice.value).toBeGreaterThan(0);
58
- expect(cart.items[0].price.totalPrice.currency).toBe(reqCtx.languageContext.currencyCode);
59
-
60
- expect(cart.price.grandTotal.value).toBeGreaterThan(0);
61
- expect(cart.price.grandTotal.currency).toBe(reqCtx.languageContext.currencyCode);
62
-
63
- expect(cart.price.grandTotal.value).toBe(cart.items[0].price.totalPrice.value);
64
-
65
-
66
- expect(cart.meta?.placeholder).toBeFalsy();
67
-
68
- });
69
-
70
- it('can add multiple different items to a cart', async () => {
71
-
72
- const cart = await provider.add({
73
- cart: { key: '' },
74
- sku: {
75
- key: testData.skuWithoutTiers,
76
- },
77
- quantity: 1
78
- }, reqCtx);
79
-
80
-
81
- const updatedCart = await provider.add({
82
- cart: cart.identifier,
83
- sku: {
84
- key: testData.skuWithTiers,
85
- },
86
- quantity: 2
87
- }, reqCtx);
88
-
89
- expect(updatedCart.items.length).toBe(2);
90
- expect(updatedCart.items[0].sku.key).toBe(testData.skuWithoutTiers);
91
- expect(updatedCart.items[0].quantity).toBe(1);
92
- expect(updatedCart.items[1].sku.key).toBe(testData.skuWithTiers);
93
- expect(updatedCart.items[1].quantity).toBe(2);
94
- });
95
-
96
- it('should be able to change quantity of an item in a cart', async () => {
97
-
98
- const cart = await provider.add({
99
- cart: { key: '' },
100
- sku: {
101
- key: testData.skuWithoutTiers,
102
- },
103
- quantity: 1
104
- }, reqCtx);
105
-
106
- const updatedCart = await provider.changeQuantity({
107
- cart: cart.identifier,
108
- item: cart.items[0].identifier,
109
- quantity: 3
110
- }, reqCtx);
111
-
112
-
113
- expect(updatedCart.items.length).toBe(1);
114
- expect(updatedCart.items[0].sku.key).toBe(testData.skuWithoutTiers);
115
- expect(updatedCart.items[0].quantity).toBe(3);
116
-
117
- expect(updatedCart.items[0].price.totalPrice.value).toBe(cart.items[0].price.totalPrice.value * 3);
118
- expect(updatedCart.items[0].price.unitPrice.value).toBe(cart.items[0].price.unitPrice.value);
119
-
120
-
121
- });
122
-
123
- it('should be able to remove an item from a cart', async () => {
124
-
125
- const cart = await provider.add({
126
- cart: { key: '' },
127
- sku: {
128
- key: testData.skuWithoutTiers,
129
- },
130
- quantity: 1
131
- }, reqCtx);
132
-
133
- const updatedCart = await provider.remove({
134
- cart: cart.identifier,
135
- item: cart.items[0].identifier,
136
- }, reqCtx);
137
-
138
- expect(updatedCart.items.length).toBe(0);
139
- });
140
-
141
- it('should be able to delete a cart', async () => {
142
-
143
- const cart = await provider.add({
144
- cart: { key: '' },
145
- sku: {
146
- key: testData.skuWithoutTiers,
147
- },
148
- quantity: 1
149
- }, reqCtx);
150
-
151
- expect(cart.items.length).toBe(1);
152
- expect(cart.identifier.key).toBeTruthy();
153
-
154
- const deletedCart = await provider.deleteCart({
155
- cart: cart.identifier,
156
- }, reqCtx);
157
-
158
- expect(deletedCart.items.length).toBe(0);
159
- expect(deletedCart.identifier.key).toBe('');
160
-
161
- const originalCart = await provider.getById({
162
- cart: cart.identifier,
163
- }, reqCtx);
164
-
165
- expect(originalCart.items.length).toBe(0);
166
- });
167
-
168
- it('can load the product information for cart items', async () => {
169
-
170
- const cart = await provider.add({
171
- cart: { key: '' },
172
- sku: {
173
- key: testData.skuWithoutTiers,
174
- },
175
- quantity: 1
176
- }, reqCtx);
177
- expect(cart.items[0].sku).toBeDefined();
178
-
179
- const product = await productProvider.getBySKU( { sku: cart.items[0].sku }, reqCtx);
180
- expect(product).toBeTruthy();
181
- if (product) {
182
- expect(product.skus.some(s => s.identifier.key === cart.items[0].sku.key)).toBe(true);
183
- }
184
- });
185
- /**
186
- it('should be able to create a cart for an anonymous user, then login and merge the cart', async () => {
187
- });
188
-
189
- it('should be able to create a cart for an anonymous user, then register and merge the cart', async () => {
190
- });
191
-
192
- it('should be able to clear the cart', async () => { });
193
-
194
- it('should be able to check out the cart', async () => { });
195
- */
196
-
197
- });
198
-
199
- });