@reactionary/source 0.0.52 → 0.2.16

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 (293) 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 -3
  8. package/core/src/cache/cache.interface.ts +1 -0
  9. package/core/src/cache/index.ts +4 -0
  10. package/core/src/cache/memory-cache.ts +30 -2
  11. package/core/src/cache/noop-cache.ts +15 -1
  12. package/core/src/cache/redis-cache.ts +20 -0
  13. package/core/src/client/client-builder.ts +71 -54
  14. package/core/src/client/client.ts +9 -47
  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 +203 -34
  18. package/core/src/index.ts +6 -19
  19. package/core/src/initialization.ts +1 -18
  20. package/core/src/metrics/metrics.ts +67 -0
  21. package/core/src/providers/analytics.provider.ts +1 -6
  22. package/core/src/providers/base.provider.ts +5 -69
  23. package/core/src/providers/cart.provider.ts +15 -55
  24. package/core/src/providers/category.provider.ts +7 -11
  25. package/core/src/providers/checkout.provider.ts +17 -15
  26. package/core/src/providers/identity.provider.ts +6 -8
  27. package/core/src/providers/index.ts +2 -1
  28. package/core/src/providers/inventory.provider.ts +15 -5
  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 +30 -36
  32. package/core/src/providers/product-search.provider.ts +61 -0
  33. package/core/src/providers/product.provider.ts +71 -12
  34. package/core/src/providers/profile.provider.ts +74 -14
  35. package/core/src/providers/store.provider.ts +3 -5
  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 +2 -1
  44. package/core/src/schemas/models/base.model.ts +6 -24
  45. package/core/src/schemas/models/cart.model.ts +5 -8
  46. package/core/src/schemas/models/category.model.ts +4 -9
  47. package/core/src/schemas/models/checkout.model.ts +6 -7
  48. package/core/src/schemas/models/cost.model.ts +4 -3
  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 +10 -19
  52. package/core/src/schemas/models/index.ts +2 -1
  53. package/core/src/schemas/models/inventory.model.ts +8 -5
  54. package/core/src/schemas/models/order-search.model.ts +28 -0
  55. package/core/src/schemas/models/order.model.ts +20 -26
  56. package/core/src/schemas/models/payment.model.ts +14 -17
  57. package/core/src/schemas/models/price.model.ts +11 -11
  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 +19 -22
  61. package/core/src/schemas/models/shipping-method.model.ts +24 -29
  62. package/core/src/schemas/models/store.model.ts +9 -5
  63. package/core/src/schemas/mutations/analytics.mutation.ts +8 -7
  64. package/core/src/schemas/mutations/base.mutation.ts +2 -1
  65. package/core/src/schemas/mutations/cart.mutation.ts +33 -33
  66. package/core/src/schemas/mutations/checkout.mutation.ts +23 -30
  67. package/core/src/schemas/mutations/identity.mutation.ts +4 -3
  68. package/core/src/schemas/mutations/profile.mutation.ts +38 -3
  69. package/core/src/schemas/queries/base.query.ts +2 -1
  70. package/core/src/schemas/queries/cart.query.ts +3 -3
  71. package/core/src/schemas/queries/category.query.ts +18 -18
  72. package/core/src/schemas/queries/checkout.query.ts +7 -9
  73. package/core/src/schemas/queries/identity.query.ts +2 -1
  74. package/core/src/schemas/queries/index.ts +2 -1
  75. package/core/src/schemas/queries/inventory.query.ts +5 -5
  76. package/core/src/schemas/queries/order-search.query.ts +10 -0
  77. package/core/src/schemas/queries/order.query.ts +3 -2
  78. package/core/src/schemas/queries/price.query.ts +10 -4
  79. package/core/src/schemas/queries/product-search.query.ts +16 -0
  80. package/core/src/schemas/queries/product.query.ts +13 -6
  81. package/core/src/schemas/queries/profile.query.ts +5 -2
  82. package/core/src/schemas/queries/store.query.ts +6 -5
  83. package/core/src/schemas/result.ts +107 -0
  84. package/core/src/schemas/session.schema.ts +4 -4
  85. package/core/src/test/reactionary.decorator.spec.ts +249 -0
  86. package/core/src/zod-utils.ts +19 -0
  87. package/core/tsconfig.json +1 -1
  88. package/core/tsconfig.spec.json +2 -26
  89. package/core/vitest.config.ts +14 -0
  90. package/documentation/1-purpose.md +114 -0
  91. package/documentation/2-getting-started.md +229 -0
  92. package/documentation/3-querying-and-changing-data.md +74 -0
  93. package/documentation/4-product-data.md +107 -0
  94. package/documentation/5-cart-and-checkout.md +211 -0
  95. package/documentation/6-product-search.md +143 -0
  96. package/documentation/7-marketing.md +3 -0
  97. package/eslint.config.mjs +1 -0
  98. package/examples/node/eslint.config.mjs +1 -4
  99. package/examples/node/package.json +10 -3
  100. package/examples/node/project.json +4 -1
  101. package/examples/node/src/basic/basic-node-provider-model-extension.spec.ts +22 -23
  102. package/examples/node/src/basic/basic-node-provider-query-extension.spec.ts +15 -11
  103. package/examples/node/src/basic/basic-node-setup.spec.ts +44 -28
  104. package/examples/node/src/basic/client-creation.spec.ts +53 -0
  105. package/examples/node/src/capabilities/cart.spec.ts +255 -0
  106. package/examples/node/src/capabilities/category.spec.ts +193 -0
  107. package/examples/node/src/capabilities/checkout.spec.ts +341 -0
  108. package/examples/node/src/capabilities/identity.spec.ts +93 -0
  109. package/examples/node/src/capabilities/inventory.spec.ts +66 -0
  110. package/examples/node/src/capabilities/order-search.spec.ts +265 -0
  111. package/examples/node/src/capabilities/order.spec.ts +91 -0
  112. package/examples/node/src/capabilities/price.spec.ts +51 -0
  113. package/examples/node/src/capabilities/product-search.spec.ts +293 -0
  114. package/examples/node/src/capabilities/product.spec.ts +122 -0
  115. package/examples/node/src/capabilities/profile.spec.ts +316 -0
  116. package/examples/node/src/capabilities/store.spec.ts +26 -0
  117. package/examples/node/src/utils.ts +147 -0
  118. package/examples/node/tsconfig.json +9 -12
  119. package/examples/node/tsconfig.lib.json +1 -2
  120. package/examples/node/tsconfig.spec.json +2 -14
  121. package/examples/node/vitest.config.ts +14 -0
  122. package/migrations.json +22 -5
  123. package/nx.json +8 -47
  124. package/package.json +24 -96
  125. package/providers/algolia/README.md +39 -2
  126. package/providers/algolia/package.json +2 -1
  127. package/providers/algolia/src/core/initialize.ts +7 -14
  128. package/providers/algolia/src/index.ts +2 -4
  129. package/providers/algolia/src/providers/index.ts +1 -0
  130. package/providers/algolia/src/providers/product-search.provider.ts +241 -0
  131. package/providers/algolia/src/schema/capabilities.schema.ts +2 -3
  132. package/providers/algolia/src/schema/index.ts +3 -0
  133. package/providers/algolia/src/schema/search.schema.ts +8 -8
  134. package/providers/algolia/tsconfig.json +1 -1
  135. package/providers/algolia/tsconfig.lib.json +1 -1
  136. package/providers/algolia/tsconfig.spec.json +2 -14
  137. package/providers/algolia/vitest.config.ts +14 -0
  138. package/providers/commercetools/README.md +30 -3
  139. package/providers/commercetools/package.json +2 -1
  140. package/providers/commercetools/src/core/client.ts +178 -99
  141. package/providers/commercetools/src/core/initialize.ts +130 -74
  142. package/providers/commercetools/src/core/token-cache.ts +45 -0
  143. package/providers/commercetools/src/index.ts +3 -2
  144. package/providers/commercetools/src/providers/cart.provider.ts +281 -341
  145. package/providers/commercetools/src/providers/category.provider.ts +223 -138
  146. package/providers/commercetools/src/providers/checkout.provider.ts +631 -449
  147. package/providers/commercetools/src/providers/identity.provider.ts +50 -29
  148. package/providers/commercetools/src/providers/index.ts +2 -2
  149. package/providers/commercetools/src/providers/inventory.provider.ts +76 -74
  150. package/providers/commercetools/src/providers/order-search.provider.ts +220 -0
  151. package/providers/commercetools/src/providers/order.provider.ts +96 -61
  152. package/providers/commercetools/src/providers/price.provider.ts +147 -117
  153. package/providers/commercetools/src/providers/product-search.provider.ts +528 -0
  154. package/providers/commercetools/src/providers/product.provider.ts +249 -74
  155. package/providers/commercetools/src/providers/profile.provider.ts +445 -28
  156. package/providers/commercetools/src/providers/store.provider.ts +54 -40
  157. package/providers/commercetools/src/schema/capabilities.schema.ts +3 -1
  158. package/providers/commercetools/src/schema/commercetools.schema.ts +17 -3
  159. package/providers/commercetools/src/schema/configuration.schema.ts +1 -0
  160. package/providers/commercetools/src/schema/session.schema.ts +7 -0
  161. package/providers/commercetools/src/test/caching.spec.ts +82 -0
  162. package/providers/commercetools/src/test/identity.spec.ts +109 -0
  163. package/providers/commercetools/src/test/test-utils.ts +21 -19
  164. package/providers/commercetools/tsconfig.json +1 -1
  165. package/providers/commercetools/tsconfig.lib.json +1 -1
  166. package/providers/commercetools/tsconfig.spec.json +2 -14
  167. package/providers/commercetools/vitest.config.ts +15 -0
  168. package/providers/fake/README.md +20 -4
  169. package/providers/fake/package.json +2 -1
  170. package/providers/fake/src/core/initialize.ts +47 -49
  171. package/providers/fake/src/providers/analytics.provider.ts +5 -7
  172. package/providers/fake/src/providers/cart.provider.ts +163 -92
  173. package/providers/fake/src/providers/category.provider.ts +78 -50
  174. package/providers/fake/src/providers/checkout.provider.ts +254 -0
  175. package/providers/fake/src/providers/identity.provider.ts +57 -65
  176. package/providers/fake/src/providers/index.ts +6 -2
  177. package/providers/fake/src/providers/inventory.provider.ts +40 -36
  178. package/providers/fake/src/providers/order-search.provider.ts +78 -0
  179. package/providers/fake/src/providers/order.provider.ts +106 -0
  180. package/providers/fake/src/providers/price.provider.ts +93 -41
  181. package/providers/fake/src/providers/product-search.provider.ts +206 -0
  182. package/providers/fake/src/providers/product.provider.ts +56 -41
  183. package/providers/fake/src/providers/profile.provider.ts +147 -0
  184. package/providers/fake/src/providers/store.provider.ts +30 -20
  185. package/providers/fake/src/schema/capabilities.schema.ts +5 -1
  186. package/providers/fake/src/test/cart.provider.spec.ts +59 -80
  187. package/providers/fake/src/test/category.provider.spec.ts +145 -87
  188. package/providers/fake/src/test/checkout.provider.spec.ts +222 -0
  189. package/providers/fake/src/test/order-search.provider.spec.ts +50 -0
  190. package/providers/fake/src/test/order.provider.spec.ts +44 -0
  191. package/providers/fake/src/test/price.provider.spec.ts +50 -45
  192. package/providers/fake/src/test/product.provider.spec.ts +15 -7
  193. package/providers/fake/src/test/profile.provider.spec.ts +167 -0
  194. package/providers/fake/tsconfig.json +1 -1
  195. package/providers/fake/tsconfig.lib.json +1 -1
  196. package/providers/fake/tsconfig.spec.json +2 -12
  197. package/providers/fake/vitest.config.ts +14 -0
  198. package/providers/medusa/README.md +30 -0
  199. package/providers/medusa/TESTING.md +98 -0
  200. package/providers/medusa/eslint.config.mjs +19 -0
  201. package/providers/medusa/package.json +22 -0
  202. package/providers/medusa/project.json +34 -0
  203. package/providers/medusa/src/core/client.ts +370 -0
  204. package/providers/medusa/src/core/initialize.ts +78 -0
  205. package/providers/medusa/src/index.ts +13 -0
  206. package/providers/medusa/src/providers/cart.provider.ts +575 -0
  207. package/providers/medusa/src/providers/category.provider.ts +247 -0
  208. package/providers/medusa/src/providers/checkout.provider.ts +636 -0
  209. package/providers/medusa/src/providers/identity.provider.ts +137 -0
  210. package/providers/medusa/src/providers/inventory.provider.ts +173 -0
  211. package/providers/medusa/src/providers/order-search.provider.ts +202 -0
  212. package/providers/medusa/src/providers/order.provider.ts +226 -0
  213. package/providers/medusa/src/providers/price.provider.ts +140 -0
  214. package/providers/medusa/src/providers/product-search.provider.ts +243 -0
  215. package/providers/medusa/src/providers/product.provider.ts +261 -0
  216. package/providers/medusa/src/providers/profile.provider.ts +392 -0
  217. package/providers/medusa/src/schema/capabilities.schema.ts +18 -0
  218. package/providers/medusa/src/schema/configuration.schema.ts +11 -0
  219. package/providers/medusa/src/schema/medusa.schema.ts +31 -0
  220. package/providers/medusa/src/test/cart.provider.spec.ts +240 -0
  221. package/providers/medusa/src/test/category.provider.spec.ts +231 -0
  222. package/providers/medusa/src/test/checkout.spec.ts +349 -0
  223. package/providers/medusa/src/test/identity.provider.spec.ts +122 -0
  224. package/providers/medusa/src/test/inventory.provider.spec.ts +88 -0
  225. package/providers/medusa/src/test/large-cart.provider.spec.ts +103 -0
  226. package/providers/medusa/src/test/price.provider.spec.ts +104 -0
  227. package/providers/medusa/src/test/product.provider.spec.ts +146 -0
  228. package/providers/medusa/src/test/search.provider.spec.ts +203 -0
  229. package/providers/medusa/src/test/test-utils.ts +13 -0
  230. package/providers/medusa/src/utils/medusa-helpers.ts +89 -0
  231. package/providers/medusa/tsconfig.json +21 -0
  232. package/providers/medusa/tsconfig.lib.json +9 -0
  233. package/providers/medusa/tsconfig.spec.json +4 -0
  234. package/providers/medusa/vitest.config.ts +15 -0
  235. package/providers/meilisearch/README.md +48 -0
  236. package/providers/meilisearch/eslint.config.mjs +22 -0
  237. package/providers/meilisearch/package.json +13 -0
  238. package/providers/meilisearch/project.json +34 -0
  239. package/providers/meilisearch/src/core/initialize.ts +21 -0
  240. package/providers/meilisearch/src/index.ts +6 -0
  241. package/providers/meilisearch/src/providers/index.ts +1 -0
  242. package/providers/meilisearch/src/providers/order-search.provider.ts +222 -0
  243. package/providers/meilisearch/src/providers/product-search.provider.ts +251 -0
  244. package/providers/meilisearch/src/schema/capabilities.schema.ts +10 -0
  245. package/providers/meilisearch/src/schema/configuration.schema.ts +11 -0
  246. package/providers/meilisearch/src/schema/index.ts +3 -0
  247. package/providers/meilisearch/src/schema/search.schema.ts +14 -0
  248. package/providers/meilisearch/tsconfig.json +24 -0
  249. package/providers/meilisearch/tsconfig.lib.json +10 -0
  250. package/providers/meilisearch/tsconfig.spec.json +4 -0
  251. package/providers/meilisearch/vitest.config.ts +14 -0
  252. package/providers/posthog/package.json +2 -1
  253. package/providers/posthog/tsconfig.json +1 -1
  254. package/tsconfig.base.json +5 -0
  255. package/vitest.config.ts +10 -0
  256. package/core/src/providers/search.provider.ts +0 -18
  257. package/core/src/schemas/models/search.model.ts +0 -36
  258. package/core/src/schemas/queries/search.query.ts +0 -9
  259. package/examples/next/.swcrc +0 -30
  260. package/examples/next/eslint.config.mjs +0 -21
  261. package/examples/next/index.d.ts +0 -6
  262. package/examples/next/next-env.d.ts +0 -5
  263. package/examples/next/next.config.js +0 -31
  264. package/examples/next/project.json +0 -9
  265. package/examples/next/public/.gitkeep +0 -0
  266. package/examples/next/public/favicon.ico +0 -0
  267. package/examples/next/src/app/global.css +0 -0
  268. package/examples/next/src/app/layout.tsx +0 -18
  269. package/examples/next/src/app/page.module.scss +0 -2
  270. package/examples/next/src/app/page.tsx +0 -47
  271. package/examples/next/src/instrumentation.ts +0 -9
  272. package/examples/next/tsconfig.json +0 -44
  273. package/examples/node/jest.config.ts +0 -10
  274. package/jest.config.ts +0 -6
  275. package/jest.preset.js +0 -3
  276. package/providers/algolia/jest.config.ts +0 -10
  277. package/providers/algolia/src/providers/product.provider.ts +0 -66
  278. package/providers/algolia/src/providers/search.provider.ts +0 -106
  279. package/providers/algolia/src/test/search.provider.spec.ts +0 -91
  280. package/providers/commercetools/jest.config.cjs +0 -10
  281. package/providers/commercetools/src/providers/search.provider.ts +0 -96
  282. package/providers/commercetools/src/test/cart.provider.spec.ts +0 -199
  283. package/providers/commercetools/src/test/category.provider.spec.ts +0 -168
  284. package/providers/commercetools/src/test/checkout.provider.spec.ts +0 -312
  285. package/providers/commercetools/src/test/identity.provider.spec.ts +0 -88
  286. package/providers/commercetools/src/test/inventory.provider.spec.ts +0 -41
  287. package/providers/commercetools/src/test/price.provider.spec.ts +0 -81
  288. package/providers/commercetools/src/test/product.provider.spec.ts +0 -80
  289. package/providers/commercetools/src/test/profile.provider.spec.ts +0 -49
  290. package/providers/commercetools/src/test/search.provider.spec.ts +0 -61
  291. package/providers/commercetools/src/test/store.provider.spec.ts +0 -37
  292. package/providers/fake/jest.config.cjs +0 -10
  293. package/providers/fake/src/providers/search.provider.ts +0 -132
@@ -0,0 +1,147 @@
1
+ import {
2
+ ProfileMutationAddShippingAddressSchema,
3
+ ProfileMutationMakeShippingAddressDefaultSchema,
4
+ ProfileMutationRemoveShippingAddressSchema,
5
+ ProfileMutationSetBillingAddressSchema,
6
+ ProfileMutationUpdateSchema,
7
+ ProfileMutationUpdateShippingAddressSchema,
8
+ ProfileProvider,
9
+ ProfileQueryByIdSchema,
10
+ ProfileSchema,
11
+ Reactionary,
12
+ type Cache,
13
+ type IdentityIdentifier,
14
+ type NotFoundError,
15
+ type Profile,
16
+ type ProfileMutationAddShippingAddress,
17
+ type ProfileMutationMakeShippingAddressDefault,
18
+ type ProfileMutationRemoveShippingAddress,
19
+ type ProfileMutationSetBillingAddress,
20
+ type ProfileMutationUpdate,
21
+ type ProfileMutationUpdateShippingAddress,
22
+ type ProfileQuerySelf,
23
+ type RequestContext,
24
+ type Result,
25
+ success,
26
+ } from '@reactionary/core';
27
+ import type { FakeConfiguration } from '../schema/configuration.schema.js';
28
+ import { base, en, Faker } from '@faker-js/faker';
29
+
30
+ export class FakeProfileProvider extends ProfileProvider {
31
+ protected config: FakeConfiguration;
32
+ private generator: Faker;
33
+
34
+ constructor(
35
+ config: FakeConfiguration,
36
+ cache: Cache,
37
+ context: RequestContext
38
+ ) {
39
+ super(cache, context);
40
+ this.generator = new Faker({
41
+ locale: [en, base],
42
+ seed: config.seeds.product,
43
+ });
44
+ this.config = config;
45
+ }
46
+
47
+ @Reactionary({
48
+ inputSchema: ProfileQueryByIdSchema,
49
+ outputSchema: ProfileSchema,
50
+ })
51
+ public override async getById(
52
+ payload: ProfileQuerySelf
53
+ ): Promise<Result<Profile, NotFoundError>> {
54
+ const profile = this.composeBaseProfile(payload.identifier);
55
+
56
+ return success(profile);
57
+ }
58
+
59
+ @Reactionary({
60
+ inputSchema: ProfileMutationUpdateSchema,
61
+ outputSchema: ProfileSchema,
62
+ })
63
+ public override async update(
64
+ payload: ProfileMutationUpdate
65
+ ): Promise<Result<Profile, NotFoundError>> {
66
+ const profile = this.composeBaseProfile(payload.identifier);
67
+
68
+ return success(profile);
69
+ }
70
+
71
+ @Reactionary({
72
+ inputSchema: ProfileMutationAddShippingAddressSchema,
73
+ outputSchema: ProfileSchema,
74
+ })
75
+ public override async addShippingAddress(
76
+ payload: ProfileMutationAddShippingAddress
77
+ ): Promise<Result<Profile, NotFoundError>> {
78
+ const profile = this.composeBaseProfile(payload.identifier);
79
+
80
+ return success(profile);
81
+ }
82
+
83
+ @Reactionary({
84
+ inputSchema: ProfileMutationUpdateShippingAddressSchema,
85
+ outputSchema: ProfileSchema,
86
+ })
87
+ public override async updateShippingAddress(
88
+ payload: ProfileMutationUpdateShippingAddress
89
+ ): Promise<Result<Profile, NotFoundError>> {
90
+ const profile = this.composeBaseProfile(payload.identifier);
91
+
92
+ return success(profile);
93
+ }
94
+
95
+ @Reactionary({
96
+ inputSchema: ProfileMutationRemoveShippingAddressSchema,
97
+ outputSchema: ProfileSchema,
98
+ })
99
+ public override async removeShippingAddress(
100
+ payload: ProfileMutationRemoveShippingAddress
101
+ ): Promise<Result<Profile, NotFoundError>> {
102
+ const profile = this.composeBaseProfile(payload.identifier);
103
+
104
+ return success(profile);
105
+ }
106
+
107
+ @Reactionary({
108
+ inputSchema: ProfileMutationMakeShippingAddressDefaultSchema,
109
+ outputSchema: ProfileSchema,
110
+ })
111
+ public override async makeShippingAddressDefault(
112
+ payload: ProfileMutationMakeShippingAddressDefault
113
+ ): Promise<Result<Profile, NotFoundError>> {
114
+ const profile = this.composeBaseProfile(payload.identifier);
115
+
116
+ return success(profile);
117
+ }
118
+
119
+ @Reactionary({
120
+ inputSchema: ProfileMutationSetBillingAddressSchema,
121
+ outputSchema: ProfileSchema,
122
+ })
123
+ public override async setBillingAddress(
124
+ payload: ProfileMutationSetBillingAddress
125
+ ): Promise<Result<Profile, NotFoundError>> {
126
+ const profile = this.composeBaseProfile(payload.identifier);
127
+
128
+ return success(profile);
129
+ }
130
+
131
+ protected composeBaseProfile(identifier?: IdentityIdentifier) {
132
+ const profile = {
133
+ alternateShippingAddresses: [],
134
+ createdAt: this.generator.date.past().toISOString(),
135
+ email: this.generator.internet.email(),
136
+ emailVerified: true,
137
+ identifier: identifier || {
138
+ userId: this.generator.string.uuid(),
139
+ },
140
+ phone: this.generator.phone.number(),
141
+ phoneVerified: true,
142
+ updatedAt: this.generator.date.past().toISOString(),
143
+ } satisfies Profile;
144
+
145
+ return profile;
146
+ }
147
+ }
@@ -1,46 +1,56 @@
1
1
  import type {
2
2
  Cache,
3
+ FulfillmentCenterIdentifier,
3
4
  RequestContext,
4
- StoreQueryByProximity,
5
5
  Store,
6
+ StoreIdentifier,
7
+ StoreQueryByProximity,
8
+ Result
6
9
  } from '@reactionary/core';
7
- import { StoreProvider } from '@reactionary/core';
8
- import type z from 'zod';
10
+ import { Reactionary, StoreProvider, StoreQueryByProximitySchema, StoreSchema, success } from '@reactionary/core';
11
+ import z from 'zod';
9
12
  import type { FakeConfiguration } from '../schema/configuration.schema.js';
10
13
  import { base, en, Faker } from '@faker-js/faker';
11
14
 
12
- export class FakeStoreProvider<
13
- T extends Store = Store
14
- > extends StoreProvider<T> {
15
+ export class FakeStoreProvider extends StoreProvider {
15
16
  protected config: FakeConfiguration;
16
17
 
17
- constructor(config: FakeConfiguration, schema: z.ZodType<T>, cache: Cache) {
18
- super(schema, cache);
18
+ constructor(config: FakeConfiguration, cache: Cache, context: RequestContext) {
19
+ super(cache, context);
19
20
 
20
21
  this.config = config;
21
22
  }
22
23
 
24
+ @Reactionary({
25
+ inputSchema: StoreQueryByProximitySchema,
26
+ outputSchema: z.array(StoreSchema)
27
+ })
23
28
  public override async queryByProximity(
24
- payload: StoreQueryByProximity,
25
- reqCtx: RequestContext
26
- ): Promise<T[]> {
29
+ payload: StoreQueryByProximity
30
+ ): Promise<Result<Store[]>> {
27
31
  const generator = new Faker({
28
32
  seed: 42,
29
33
  locale: [en, base],
30
34
  });
31
35
 
32
- const results = [];
36
+ const results = new Array<Store>();
33
37
 
34
38
  for (let i = 0; i < payload.limit; i++) {
35
- const model = this.newModel();
36
-
37
- model.name = generator.company.name();
38
- model.identifier.key = '' + i;
39
- model.fulfillmentCenter.key = '' + i;
40
-
41
- results.push(model);
39
+ const name = generator.company.name();
40
+ const identifier = {
41
+ key: '' + i
42
+ } satisfies StoreIdentifier;
43
+ const fulfillmentCenter = {
44
+ key: '' + i
45
+ } satisfies FulfillmentCenterIdentifier;
46
+
47
+ results.push({
48
+ fulfillmentCenter,
49
+ identifier,
50
+ name
51
+ });
42
52
  }
43
53
 
44
- return results;
54
+ return success(results);
45
55
  }
46
56
  }
@@ -3,13 +3,17 @@ import type { z } from 'zod';
3
3
 
4
4
  export const FakeCapabilitiesSchema = CapabilitiesSchema.pick({
5
5
  product: true,
6
- search: true,
6
+ productSearch: true,
7
7
  identity: true,
8
8
  category: true,
9
9
  cart: true,
10
10
  inventory: true,
11
11
  store: true,
12
12
  price: true,
13
+ checkout: true,
14
+ order: true,
15
+ orderSearch: true,
16
+ profile: true,
13
17
  }).partial();
14
18
 
15
19
  export type FakeCapabilities = z.infer<typeof FakeCapabilitiesSchema>;
@@ -4,7 +4,7 @@ import { CartSchema, IdentitySchema, NoOpCache, createInitialRequestContext } fr
4
4
  import { getFakerTestConfiguration } from './test-utils.js';
5
5
  import { FakeCartProvider } from '../providers/cart.provider.js';
6
6
  import { FakeIdentityProvider } from '../providers/index.js';
7
-
7
+ import { describe, expect, it, beforeAll, beforeEach, assert } from 'vitest';
8
8
 
9
9
  const testData = {
10
10
  skuWithoutTiers: 'SGB-01',
@@ -16,111 +16,90 @@ describe('Fake Cart Provider', () => {
16
16
  let identityProvider: FakeIdentityProvider;
17
17
  let reqCtx: RequestContext;
18
18
 
19
- beforeAll( () => {
20
- provider = new FakeCartProvider(getFakerTestConfiguration(), CartSchema, new NoOpCache());
21
- identityProvider = new FakeIdentityProvider(getFakerTestConfiguration(), IdentitySchema, new NoOpCache());
22
- });
23
-
24
19
  beforeEach( () => {
25
- reqCtx = createInitialRequestContext()
20
+ reqCtx = createInitialRequestContext();
21
+ provider = new FakeCartProvider(getFakerTestConfiguration(), new NoOpCache(), reqCtx);
22
+ identityProvider = new FakeIdentityProvider(getFakerTestConfiguration(), new NoOpCache(), reqCtx);
26
23
  });
27
24
 
28
25
  describe('anonymous sessions', () => {
29
- it('should be able to get an empty cart', async () => {
30
- const cart = await provider.getById({
31
- cart: { key: '' },
32
- }, reqCtx);
33
-
34
- expect(cart.identifier.key).toBeFalsy();
35
- expect(cart.items.length).toBe(0);
36
- expect(cart.meta?.placeholder).toBe(true);
37
-
38
- });
39
-
40
26
  it('should be able to add an item to a cart', async () => {
41
27
  const cart = await provider.add({
42
- cart: { key: '' },
43
- sku: {
44
- key: testData.skuWithoutTiers,
28
+ variant: {
29
+ sku: testData.skuWithoutTiers,
45
30
  },
46
31
  quantity: 1
47
- }, reqCtx);
48
-
49
- expect(cart.identifier.key).toBeDefined();
50
- expect(cart.items.length).toBe(1);
51
- expect(cart.items[0].sku.key).toBe(testData.skuWithoutTiers);
52
- expect(cart.items[0].quantity).toBe(1);
53
-
54
- expect(cart.items[0].price.totalPrice.value).toBeGreaterThan(0);
55
- expect(cart.items[0].price.totalPrice.currency).toBe(reqCtx.languageContext.currencyCode);
56
-
57
- expect(cart.price.grandTotal.value).toBeGreaterThan(0);
58
- expect(cart.price.grandTotal.currency).toBe(reqCtx.languageContext.currencyCode);
59
-
60
- expect(cart.price.grandTotal.value).toBe(cart.items[0].price.totalPrice.value);
61
-
62
-
63
- expect(cart.meta?.placeholder).toBeFalsy();
64
-
32
+ });
33
+
34
+ if (!cart.success) {
35
+ assert.fail();
36
+ }
37
+
38
+ expect(cart.value.identifier.key).toBeDefined();
39
+ expect(cart.value.items.length).toBe(1);
40
+ expect(cart.value.items[0].variant.sku).toBe(testData.skuWithoutTiers);
41
+ expect(cart.value.items[0].quantity).toBe(1);
42
+ expect(cart.value.items[0].price.totalPrice.value).toBeGreaterThan(0);
43
+ expect(cart.value.items[0].price.totalPrice.currency).toBe(reqCtx.languageContext.currencyCode);
44
+ expect(cart.value.price.grandTotal.value).toBeGreaterThan(0);
45
+ expect(cart.value.price.grandTotal.currency).toBe(reqCtx.languageContext.currencyCode);
46
+ expect(cart.value.price.grandTotal.value).toBe(cart.value.items[0].price.totalPrice.value);
65
47
  });
66
48
 
67
-
68
49
  it('should be able to change quantity of an item in a cart', async () => {
69
-
70
50
  const cart = await provider.add({
71
- cart: { key: '' },
72
- sku: {
73
- key: testData.skuWithoutTiers,
51
+ variant: {
52
+ sku: testData.skuWithoutTiers,
74
53
  },
75
54
  quantity: 1
76
- }, reqCtx);
55
+ });
56
+
57
+ if (!cart.success) {
58
+ assert.fail();
59
+ }
77
60
 
78
61
  const updatedCart = await provider.changeQuantity({
79
- cart: cart.identifier,
80
- item: cart.items[0].identifier,
62
+ cart: cart.value.identifier,
63
+ item: cart.value.items[0].identifier,
81
64
  quantity: 3
82
- }, reqCtx);
83
-
84
- expect(updatedCart.identifier.key).toBe(cart.identifier.key);
85
- expect(updatedCart.items.length).toBe(1);
86
- expect(updatedCart.items[0].sku.key).toBe(testData.skuWithoutTiers);
87
- expect(updatedCart.items[0].quantity).toBe(3);
88
- expect(updatedCart.items[0].price.totalPrice.value).toBe(cart.items[0].price.totalPrice.value * 3);
89
- expect(updatedCart.items[0].price.unitPrice.value).toBe(cart.items[0].price.unitPrice.value);
90
-
91
-
65
+ });
66
+
67
+ if (!updatedCart.success) {
68
+ assert.fail();
69
+ }
70
+
71
+ expect(updatedCart.value.identifier.key).toBe(cart.value.identifier.key);
72
+ expect(updatedCart.value.items.length).toBe(1);
73
+ expect(updatedCart.value.items[0].variant.sku).toBe(testData.skuWithoutTiers);
74
+ expect(updatedCart.value.items[0].quantity).toBe(3);
75
+ expect(updatedCart.value.items[0].price.totalPrice.value).toBe(cart.value.items[0].price.totalPrice.value * 3);
76
+ expect(updatedCart.value.items[0].price.unitPrice.value).toBe(cart.value.items[0].price.unitPrice.value);
92
77
  });
93
78
 
94
79
  it('should be able to remove an item from a cart', async () => {
95
-
96
80
  const cart = await provider.add({
97
- cart: { key: '' },
98
- sku: {
99
- key: testData.skuWithoutTiers,
81
+ variant: {
82
+ sku: testData.skuWithoutTiers,
100
83
  },
101
84
  quantity: 1
102
- }, reqCtx);
103
-
104
- const updatedCart = await provider.remove({
105
- cart: cart.identifier,
106
- item: cart.items[0].identifier,
107
- }, reqCtx);
108
- expect(updatedCart.identifier.key).toBe(cart.identifier.key);
109
- expect(updatedCart.items.length).toBe(0);
110
- });
85
+ });
111
86
 
112
- /**
113
- it('should be able to create a cart for an anonymous user, then login and merge the cart', async () => {
114
- });
87
+ if (!cart.success) {
88
+ assert.fail();
89
+ }
115
90
 
116
- it('should be able to create a cart for an anonymous user, then register and merge the cart', async () => {
91
+ const updatedCart = await provider.remove({
92
+ cart: cart.value.identifier,
93
+ item: cart.value.items[0].identifier,
94
+ });
95
+
96
+ if (!updatedCart.success) {
97
+ assert.fail();
98
+ }
99
+
100
+ expect(updatedCart.value.identifier.key).toBe(cart.value.identifier.key);
101
+ expect(updatedCart.value.items.length).toBe(0);
117
102
  });
118
-
119
- it('should be able to clear the cart', async () => { });
120
-
121
- it('should be able to check out the cart', async () => { });
122
- */
123
-
124
103
  });
125
104
 
126
105
  });