@reactionary/source 0.3.18 → 0.6.2

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 (191) hide show
  1. package/README.md +28 -14
  2. package/core/src/client/client-builder.ts +54 -6
  3. package/core/src/factories/cart.factory.ts +40 -0
  4. package/core/src/factories/category.factory.ts +40 -0
  5. package/core/src/factories/checkout.factory.ts +59 -0
  6. package/core/src/factories/identity.factory.ts +26 -0
  7. package/core/src/factories/index.ts +15 -0
  8. package/core/src/factories/inventory.factory.ts +26 -0
  9. package/core/src/factories/order-search.factory.ts +33 -0
  10. package/core/src/factories/order.factory.ts +21 -0
  11. package/core/src/factories/price.factory.ts +29 -0
  12. package/core/src/factories/product-associations.factory.ts +30 -0
  13. package/core/src/factories/product-list.factory.ts +82 -0
  14. package/core/src/factories/product-reviews.factory.ts +58 -0
  15. package/core/src/factories/product-search.factory.ts +31 -0
  16. package/core/src/factories/product.factory.ts +21 -0
  17. package/core/src/factories/profile.factory.ts +23 -0
  18. package/core/src/factories/store.factory.ts +21 -0
  19. package/core/src/index.ts +3 -1
  20. package/core/src/providers/cart.provider.ts +12 -10
  21. package/core/src/providers/category.provider.ts +9 -7
  22. package/core/src/providers/checkout.provider.ts +14 -10
  23. package/core/src/providers/identity.provider.ts +7 -7
  24. package/core/src/providers/inventory.provider.ts +4 -4
  25. package/core/src/providers/order-search.provider.ts +4 -2
  26. package/core/src/providers/order.provider.ts +4 -4
  27. package/core/src/providers/price.provider.ts +5 -5
  28. package/core/src/providers/product-associations.provider.ts +6 -4
  29. package/core/src/providers/product-list.provider.ts +13 -8
  30. package/core/src/providers/product-reviews.provider.ts +8 -4
  31. package/core/src/providers/product-search.provider.ts +15 -28
  32. package/core/src/providers/product.provider.ts +6 -6
  33. package/core/src/providers/profile.provider.ts +8 -8
  34. package/core/src/providers/store.provider.ts +2 -2
  35. package/core/src/test/client-builder.spec.ts +81 -0
  36. package/examples/node/package.json +7 -7
  37. package/examples/node/src/basic/basic-node-provider-model-extension.spec.ts +10 -4
  38. package/examples/node/src/basic/basic-node-provider-query-extension.spec.ts +8 -2
  39. package/examples/node/src/basic/basic-node-setup.spec.ts +5 -1
  40. package/examples/node/src/basic/client-creation.spec.ts +3 -3
  41. package/examples/node/src/utils.ts +41 -41
  42. package/examples/node/tsconfig.lib.json +2 -1
  43. package/package.json +1 -1
  44. package/providers/algolia/src/core/initialize.ts +76 -21
  45. package/providers/algolia/src/core/initialize.types.ts +107 -0
  46. package/providers/algolia/src/factories/index.ts +1 -0
  47. package/providers/algolia/src/factories/product-search/product-search.factory.ts +182 -0
  48. package/providers/algolia/src/index.ts +2 -2
  49. package/providers/algolia/src/providers/analytics.provider.ts +4 -4
  50. package/providers/algolia/src/providers/product-search.provider.ts +67 -184
  51. package/providers/algolia/src/schema/capabilities.schema.ts +81 -7
  52. package/providers/algolia/src/test/analytics.spec.ts +9 -1
  53. package/providers/algolia/src/test/client-builder-product-search-extension.example.ts +85 -0
  54. package/providers/commercetools/src/core/capability-descriptors.ts +324 -0
  55. package/providers/commercetools/src/core/initialize.ts +35 -151
  56. package/providers/commercetools/src/core/initialize.types.ts +174 -0
  57. package/providers/commercetools/src/factories/cart/cart.factory.ts +142 -0
  58. package/providers/commercetools/src/factories/category/category.factory.ts +77 -0
  59. package/providers/commercetools/src/factories/checkout/checkout-initializer-overrides.example.ts +94 -0
  60. package/providers/commercetools/src/factories/checkout/checkout.factory.ts +338 -0
  61. package/providers/commercetools/src/factories/identity/identity.factory.ts +26 -0
  62. package/providers/commercetools/src/factories/inventory/inventory.factory.ts +49 -0
  63. package/providers/commercetools/src/factories/order/order.factory.ts +149 -0
  64. package/providers/commercetools/src/factories/order-search/order-search.factory.ts +108 -0
  65. package/providers/commercetools/src/factories/price/price.factory.ts +76 -0
  66. package/providers/commercetools/src/factories/product/product-factory-baseline.example.ts +14 -0
  67. package/providers/commercetools/src/factories/product/product-factory-schema-and-parse-extension.example.ts +35 -0
  68. package/providers/commercetools/src/factories/product/product-factory-schema-extension.example.ts +23 -0
  69. package/providers/commercetools/src/factories/product/product-initializer-factory-extension.example.ts +41 -0
  70. package/providers/commercetools/src/factories/product/product-provider-custom-method-only.example.ts +47 -0
  71. package/providers/commercetools/src/factories/product/product-provider-schema-signature-extension.example.ts +61 -0
  72. package/providers/commercetools/src/factories/product/product.factory.ts +220 -0
  73. package/providers/commercetools/src/factories/product/utils.example.ts +9 -0
  74. package/providers/commercetools/src/factories/product-associations/product-associations.factory.ts +103 -0
  75. package/providers/commercetools/src/factories/product-list/product-list.factory.ts +122 -0
  76. package/providers/commercetools/src/factories/product-reviews/product-reviews.factory.ts +81 -0
  77. package/providers/commercetools/src/factories/product-search/product-search.factory.ts +182 -0
  78. package/providers/commercetools/src/factories/profile/profile.factory.ts +94 -0
  79. package/providers/commercetools/src/factories/store/store.factory.ts +49 -0
  80. package/providers/commercetools/src/index.ts +15 -0
  81. package/providers/commercetools/src/providers/cart.provider.ts +67 -193
  82. package/providers/commercetools/src/providers/category.provider.ts +24 -64
  83. package/providers/commercetools/src/providers/checkout.provider.ts +50 -322
  84. package/providers/commercetools/src/providers/identity.provider.ts +35 -15
  85. package/providers/commercetools/src/providers/inventory.provider.ts +13 -31
  86. package/providers/commercetools/src/providers/order-search.provider.ts +16 -110
  87. package/providers/commercetools/src/providers/order.provider.ts +13 -144
  88. package/providers/commercetools/src/providers/price.provider.ts +37 -51
  89. package/providers/commercetools/src/providers/product-associations.provider.ts +39 -104
  90. package/providers/commercetools/src/providers/product-list.provider.ts +38 -23
  91. package/providers/commercetools/src/providers/product-reviews.provider.ts +34 -14
  92. package/providers/commercetools/src/providers/product-search.provider.ts +17 -170
  93. package/providers/commercetools/src/providers/product.provider.ts +20 -199
  94. package/providers/commercetools/src/providers/profile.provider.ts +27 -73
  95. package/providers/commercetools/src/providers/store.provider.ts +13 -31
  96. package/providers/commercetools/src/schema/capabilities.schema.ts +258 -20
  97. package/providers/commercetools/src/test/caching.spec.ts +18 -2
  98. package/providers/commercetools/src/test/client-builder-merge-extensions.example.ts +125 -0
  99. package/providers/fake/src/core/initialize.ts +213 -44
  100. package/providers/fake/src/core/initialize.types.ts +164 -0
  101. package/providers/fake/src/factories/cart/cart.factory.ts +34 -0
  102. package/providers/fake/src/factories/category/category.factory.ts +40 -0
  103. package/providers/fake/src/factories/checkout/checkout.factory.ts +53 -0
  104. package/providers/fake/src/factories/identity/identity.factory.ts +25 -0
  105. package/providers/fake/src/factories/index.ts +14 -0
  106. package/providers/fake/src/factories/inventory/inventory.factory.ts +25 -0
  107. package/providers/fake/src/factories/order/order.factory.ts +22 -0
  108. package/providers/fake/src/factories/order-search/order-search.factory.ts +27 -0
  109. package/providers/fake/src/factories/price/price.factory.ts +26 -0
  110. package/providers/fake/src/factories/product/product.factory.ts +22 -0
  111. package/providers/fake/src/factories/product-associations/product-associations.factory.ts +25 -0
  112. package/providers/fake/src/factories/product-reviews/product-reviews.factory.ts +53 -0
  113. package/providers/fake/src/factories/product-search/product-search.factory.ts +27 -0
  114. package/providers/fake/src/factories/profile/profile.factory.ts +22 -0
  115. package/providers/fake/src/factories/store/store.factory.ts +22 -0
  116. package/providers/fake/src/index.ts +2 -0
  117. package/providers/fake/src/providers/cart.provider.ts +23 -14
  118. package/providers/fake/src/providers/category.provider.ts +120 -105
  119. package/providers/fake/src/providers/checkout.provider.ts +39 -20
  120. package/providers/fake/src/providers/identity.provider.ts +40 -34
  121. package/providers/fake/src/providers/inventory.provider.ts +26 -24
  122. package/providers/fake/src/providers/order-search.provider.ts +38 -30
  123. package/providers/fake/src/providers/order.provider.ts +21 -37
  124. package/providers/fake/src/providers/price.provider.ts +42 -34
  125. package/providers/fake/src/providers/product-associations.provider.ts +23 -10
  126. package/providers/fake/src/providers/product-reviews.provider.ts +71 -69
  127. package/providers/fake/src/providers/product-search.provider.ts +43 -70
  128. package/providers/fake/src/providers/product.provider.ts +34 -32
  129. package/providers/fake/src/providers/profile.provider.ts +62 -55
  130. package/providers/fake/src/providers/store.provider.ts +38 -22
  131. package/providers/fake/src/schema/capabilities.schema.ts +175 -18
  132. package/providers/fake/src/test/cart.provider.spec.ts +20 -3
  133. package/providers/fake/src/test/category.provider.spec.ts +4 -1
  134. package/providers/fake/src/test/checkout.provider.spec.ts +12 -2
  135. package/providers/fake/src/test/client-builder-product-extension.example.ts +75 -0
  136. package/providers/fake/src/test/order-search.provider.spec.ts +4 -7
  137. package/providers/fake/src/test/order.provider.spec.ts +4 -6
  138. package/providers/fake/src/test/price.provider.spec.ts +3 -1
  139. package/providers/fake/src/test/product.provider.spec.ts +8 -2
  140. package/providers/fake/src/test/profile.provider.spec.ts +4 -2
  141. package/providers/google-analytics/src/core/initialize.ts +37 -12
  142. package/providers/google-analytics/src/core/initialize.types.ts +47 -0
  143. package/providers/google-analytics/src/index.ts +1 -0
  144. package/providers/google-analytics/src/schema/capabilities.schema.ts +31 -5
  145. package/providers/medusa/src/core/initialize.ts +324 -81
  146. package/providers/medusa/src/core/initialize.types.ts +184 -0
  147. package/providers/medusa/src/factories/cart/cart.factory.ts +34 -0
  148. package/providers/medusa/src/factories/category/category.factory.ts +37 -0
  149. package/providers/medusa/src/factories/checkout/checkout.factory.ts +50 -0
  150. package/providers/medusa/src/factories/identity/identity.factory.ts +22 -0
  151. package/providers/medusa/src/factories/index.ts +12 -0
  152. package/providers/medusa/src/factories/inventory/inventory.factory.ts +25 -0
  153. package/providers/medusa/src/factories/order/order.factory.ts +22 -0
  154. package/providers/medusa/src/factories/order-search/order-search.factory.ts +27 -0
  155. package/providers/medusa/src/factories/price/price.factory.ts +26 -0
  156. package/providers/medusa/src/factories/product/product.factory.ts +22 -0
  157. package/providers/medusa/src/factories/product-associations/product-associations.factory.ts +25 -0
  158. package/providers/medusa/src/factories/product-search/product-search.factory.ts +27 -0
  159. package/providers/medusa/src/factories/profile/profile.factory.ts +22 -0
  160. package/providers/medusa/src/index.ts +2 -0
  161. package/providers/medusa/src/providers/cart.provider.ts +33 -20
  162. package/providers/medusa/src/providers/category.provider.ts +30 -12
  163. package/providers/medusa/src/providers/checkout.provider.ts +42 -17
  164. package/providers/medusa/src/providers/identity.provider.ts +1 -1
  165. package/providers/medusa/src/providers/inventory.provider.ts +21 -7
  166. package/providers/medusa/src/providers/order-search.provider.ts +16 -5
  167. package/providers/medusa/src/providers/order.provider.ts +17 -5
  168. package/providers/medusa/src/providers/price.provider.ts +26 -7
  169. package/providers/medusa/src/providers/product-associations.provider.ts +19 -8
  170. package/providers/medusa/src/providers/product-search.provider.ts +19 -31
  171. package/providers/medusa/src/providers/product.provider.ts +47 -11
  172. package/providers/medusa/src/providers/profile.provider.ts +35 -11
  173. package/providers/medusa/src/schema/capabilities.schema.ts +229 -18
  174. package/providers/medusa/src/test/cart.provider.spec.ts +18 -2
  175. package/providers/medusa/src/test/category.provider.spec.ts +4 -1
  176. package/providers/medusa/src/test/checkout.spec.ts +9 -9
  177. package/providers/medusa/src/test/inventory.provider.spec.ts +3 -1
  178. package/providers/medusa/src/test/large-cart.provider.spec.ts +8 -2
  179. package/providers/medusa/src/test/price.provider.spec.ts +8 -1
  180. package/providers/medusa/src/test/product.provider.spec.ts +3 -1
  181. package/providers/medusa/src/test/search.provider.spec.ts +16 -3
  182. package/providers/meilisearch/src/core/initialize.ts +88 -21
  183. package/providers/meilisearch/src/core/initialize.types.ts +119 -0
  184. package/providers/meilisearch/src/factories/index.ts +2 -0
  185. package/providers/meilisearch/src/factories/order-search/order-search.factory.ts +27 -0
  186. package/providers/meilisearch/src/factories/product-search/product-search.factory.ts +27 -0
  187. package/providers/meilisearch/src/index.ts +2 -0
  188. package/providers/meilisearch/src/providers/index.ts +1 -0
  189. package/providers/meilisearch/src/providers/order-search.provider.ts +21 -6
  190. package/providers/meilisearch/src/providers/product-search.provider.ts +24 -8
  191. package/providers/meilisearch/src/schema/capabilities.schema.ts +95 -8
@@ -1,7 +1,9 @@
1
1
  import { base, en, Faker } from '@faker-js/faker';
2
2
  import type {
3
3
  Cache,
4
- Inventory,
4
+ InventoryFactory,
5
+ InventoryFactoryOutput,
6
+ InventoryFactoryWithOutput,
5
7
  InventoryIdentifier,
6
8
  InventoryQueryBySKU,
7
9
  InventoryStatus,
@@ -17,31 +19,37 @@ import {
17
19
  success,
18
20
  } from '@reactionary/core';
19
21
  import type { FakeConfiguration } from '../schema/configuration.schema.js';
22
+ import type { FakeInventoryFactory } from '../factories/inventory/inventory.factory.js';
20
23
 
21
- export class FakeInventoryProvider extends InventoryProvider {
24
+ export class FakeInventoryProvider<
25
+ TFactory extends InventoryFactory = FakeInventoryFactory,
26
+ > extends InventoryProvider<InventoryFactoryOutput<TFactory>> {
22
27
  protected config: FakeConfiguration;
28
+ protected factory: InventoryFactoryWithOutput<TFactory>;
23
29
 
24
30
  constructor(
25
31
  config: FakeConfiguration,
26
32
  cache: Cache,
27
- context: RequestContext
33
+ context: RequestContext,
34
+ factory: InventoryFactoryWithOutput<TFactory>,
28
35
  ) {
29
36
  super(cache, context);
30
37
 
31
38
  this.config = config;
39
+ this.factory = factory;
32
40
  }
33
41
 
34
42
  @Reactionary({
35
43
  inputSchema: InventoryQueryBySKUSchema,
36
- outputSchema: InventorySchema
44
+ outputSchema: InventorySchema,
37
45
  })
38
- public override async getBySKU(payload: InventoryQueryBySKU): Promise<Result<Inventory, NotFoundError>> {
39
- // Generate a simple hash from the SKU string for seeding
46
+ public override async getBySKU(
47
+ payload: InventoryQueryBySKU,
48
+ ): Promise<Result<InventoryFactoryOutput<TFactory>, NotFoundError>> {
40
49
  let hash = 0;
41
- const skuString = payload.variant.sku;
42
- for (let i = 0; i < skuString.length; i++) {
43
- hash = (hash << 5) - hash + skuString.charCodeAt(i);
44
- hash = hash & hash; // Convert to 32bit integer
50
+ for (let i = 0; i < payload.variant.sku.length; i++) {
51
+ hash = (hash << 5) - hash + payload.variant.sku.charCodeAt(i);
52
+ hash &= hash;
45
53
  }
46
54
 
47
55
  const generator = new Faker({
@@ -49,24 +57,18 @@ export class FakeInventoryProvider extends InventoryProvider {
49
57
  locale: [en, base],
50
58
  });
51
59
 
52
- const identifier = {
53
- variant: payload.variant,
54
- fulfillmentCenter: payload.fulfilmentCenter,
55
- } satisfies InventoryIdentifier;
56
-
57
60
  const quantity = generator.number.int({ min: 0, max: 100 });
58
-
59
- let status: InventoryStatus = 'outOfStock';
60
- if (quantity > 0) {
61
- status = 'inStock';
62
- }
61
+ const status: InventoryStatus = quantity > 0 ? 'inStock' : 'outOfStock';
63
62
 
64
63
  const result = {
65
- identifier,
64
+ identifier: {
65
+ variant: payload.variant,
66
+ fulfillmentCenter: payload.fulfilmentCenter,
67
+ } satisfies InventoryIdentifier,
66
68
  quantity,
67
- status
68
- } satisfies Inventory;
69
+ status,
70
+ };
69
71
 
70
- return success(result);
72
+ return success(this.factory.parseInventory(this.context, result));
71
73
  }
72
74
  }
@@ -4,33 +4,41 @@ import {
4
4
  OrderSearchResultSchema,
5
5
  Reactionary,
6
6
  type Cache,
7
+ type OrderSearchFactory,
8
+ type OrderSearchFactoryOutput,
9
+ type OrderSearchFactoryWithOutput,
7
10
  type OrderSearchQueryByTerm,
8
11
  type OrderSearchResult,
12
+ type OrderSearchResultItem,
9
13
  type RequestContext,
10
14
  type Result,
11
15
  success,
12
- type OrderSearchResultItem,
13
16
  } from '@reactionary/core';
14
17
  import type { FakeConfiguration } from '../schema/configuration.schema.js';
15
18
  import { Faker, en, base } from '@faker-js/faker';
19
+ import type { FakeOrderSearchFactory } from '../factories/order-search/order-search.factory.js';
16
20
 
17
- export class FakeOrderSearchProvider extends OrderSearchProvider {
21
+ export class FakeOrderSearchProvider<
22
+ TFactory extends OrderSearchFactory = FakeOrderSearchFactory,
23
+ > extends OrderSearchProvider<OrderSearchFactoryOutput<TFactory>> {
18
24
  protected config: FakeConfiguration;
19
25
  protected generator: Faker;
26
+ protected factory: OrderSearchFactoryWithOutput<TFactory>;
20
27
 
21
28
  constructor(
22
29
  config: FakeConfiguration,
23
30
  cache: Cache,
24
- context: RequestContext
31
+ context: RequestContext,
32
+ factory: OrderSearchFactoryWithOutput<TFactory>,
25
33
  ) {
26
34
  super(cache, context);
27
35
 
28
36
  this.config = config;
29
-
30
37
  this.generator = new Faker({
31
38
  locale: [en, base],
32
39
  seed: config.seeds.product,
33
40
  });
41
+ this.factory = factory;
34
42
  }
35
43
 
36
44
  @Reactionary({
@@ -38,41 +46,41 @@ export class FakeOrderSearchProvider extends OrderSearchProvider {
38
46
  outputSchema: OrderSearchResultSchema,
39
47
  })
40
48
  public override async queryByTerm(
41
- payload: OrderSearchQueryByTerm
42
- ): Promise<Result<OrderSearchResult>> {
43
- const items = new Array<OrderSearchResultItem>();
49
+ payload: OrderSearchQueryByTerm,
50
+ ): Promise<Result<OrderSearchFactoryOutput<TFactory>>> {
51
+ const items: OrderSearchResultItem[] = [];
44
52
 
45
53
  for (let i = 0; i < payload.search.paginationOptions.pageSize; i++) {
46
- items.push({
47
- customerName: this.generator.company.name(),
48
- identifier: {
49
- key: this.generator.string.uuid()
50
- },
51
- inventoryStatus: 'Allocated',
52
- orderDate: this.generator.date.past().toString(),
53
- orderStatus: 'Shipped',
54
- totalAmount: {
55
- currency: 'USD',
56
- value: this.generator.number.int({ multipleOf: 100 })
57
- },
58
- userId: {
59
- userId: '1234'
60
- }
61
- });
54
+ items.push({
55
+ customerName: this.generator.company.name(),
56
+ identifier: {
57
+ key: this.generator.string.uuid(),
58
+ },
59
+ inventoryStatus: 'Allocated',
60
+ orderDate: this.generator.date.past().toString(),
61
+ orderStatus: 'Shipped',
62
+ totalAmount: {
63
+ currency: 'USD',
64
+ value: this.generator.number.int({ multipleOf: 100 }),
65
+ },
66
+ userId: {
67
+ userId: '1234',
68
+ },
69
+ });
62
70
  }
63
71
 
64
72
  const totalCount = this.generator.number.int({ min: items.length, max: 200 });
65
73
  const totalPages = Math.ceil(totalCount / payload.search.paginationOptions.pageSize);
66
74
 
67
75
  const result = {
68
- identifier: payload.search,
69
- items,
70
- pageNumber: payload.search.paginationOptions.pageNumber,
71
- pageSize: payload.search.paginationOptions.pageSize,
72
- totalCount,
73
- totalPages
76
+ identifier: payload.search,
77
+ items,
78
+ pageNumber: payload.search.paginationOptions.pageNumber,
79
+ pageSize: payload.search.paginationOptions.pageSize,
80
+ totalCount,
81
+ totalPages,
74
82
  } satisfies OrderSearchResult;
75
83
 
76
- return success(result);
84
+ return success(this.factory.parseOrderSearchResult(this.context, result, payload));
77
85
  }
78
86
  }
@@ -7,30 +7,38 @@ import {
7
7
  type Cache,
8
8
  type NotFoundError,
9
9
  type Order,
10
+ type OrderFactory,
11
+ type OrderFactoryOutput,
12
+ type OrderFactoryWithOutput,
10
13
  type OrderQueryById,
11
14
  type RequestContext,
12
15
  type Result,
13
16
  } from '@reactionary/core';
14
17
  import type { FakeConfiguration } from '../schema/configuration.schema.js';
15
18
  import { Faker, en, base } from '@faker-js/faker';
19
+ import type { FakeOrderFactory } from '../factories/order/order.factory.js';
16
20
 
17
- export class FakeOrderProvider extends OrderProvider {
21
+ export class FakeOrderProvider<
22
+ TFactory extends OrderFactory = FakeOrderFactory,
23
+ > extends OrderProvider<OrderFactoryOutput<TFactory>> {
18
24
  protected config: FakeConfiguration;
19
25
  protected generator: Faker;
26
+ protected factory: OrderFactoryWithOutput<TFactory>;
20
27
 
21
28
  constructor(
22
29
  config: FakeConfiguration,
23
30
  cache: Cache,
24
- context: RequestContext
31
+ context: RequestContext,
32
+ factory: OrderFactoryWithOutput<TFactory>,
25
33
  ) {
26
34
  super(cache, context);
27
35
 
28
36
  this.config = config;
29
-
30
37
  this.generator = new Faker({
31
38
  locale: [en, base],
32
39
  seed: config.seeds.product,
33
40
  });
41
+ this.factory = factory;
34
42
  }
35
43
 
36
44
  @Reactionary({
@@ -38,8 +46,8 @@ export class FakeOrderProvider extends OrderProvider {
38
46
  outputSchema: OrderSchema,
39
47
  })
40
48
  public override async getById(
41
- payload: OrderQueryById
42
- ): Promise<Result<Order, NotFoundError>> {
49
+ payload: OrderQueryById,
50
+ ): Promise<Result<OrderFactoryOutput<TFactory>, NotFoundError>> {
43
51
  const order = {
44
52
  identifier: payload.order,
45
53
  inventoryStatus: 'Allocated',
@@ -47,60 +55,36 @@ export class FakeOrderProvider extends OrderProvider {
47
55
  orderStatus: 'Shipped',
48
56
  paymentInstructions: [],
49
57
  userId: {
50
- userId: '1234'
58
+ userId: '1234',
51
59
  },
52
60
  price: {
53
61
  grandTotal: {
54
62
  currency: 'USD',
55
- value: this.generator.number.float({
56
- min: 100,
57
- max: 10000,
58
- multipleOf: 25,
59
- }),
63
+ value: this.generator.number.float({ min: 100, max: 10000, multipleOf: 25 }),
60
64
  },
61
65
  totalDiscount: {
62
66
  currency: 'USD',
63
- value: this.generator.number.float({
64
- min: 100,
65
- max: 10000,
66
- multipleOf: 25,
67
- }),
67
+ value: this.generator.number.float({ min: 100, max: 10000, multipleOf: 25 }),
68
68
  },
69
69
  totalProductPrice: {
70
70
  currency: 'USD',
71
- value: this.generator.number.float({
72
- min: 100,
73
- max: 10000,
74
- multipleOf: 25,
75
- }),
71
+ value: this.generator.number.float({ min: 100, max: 10000, multipleOf: 25 }),
76
72
  },
77
73
  totalShipping: {
78
74
  currency: 'USD',
79
- value: this.generator.number.float({
80
- min: 100,
81
- max: 10000,
82
- multipleOf: 25,
83
- }),
75
+ value: this.generator.number.float({ min: 100, max: 10000, multipleOf: 25 }),
84
76
  },
85
77
  totalSurcharge: {
86
78
  currency: 'USD',
87
- value: this.generator.number.float({
88
- min: 100,
89
- max: 10000,
90
- multipleOf: 25,
91
- }),
79
+ value: this.generator.number.float({ min: 100, max: 10000, multipleOf: 25 }),
92
80
  },
93
81
  totalTax: {
94
82
  currency: 'USD',
95
- value: this.generator.number.float({
96
- min: 100,
97
- max: 10000,
98
- multipleOf: 25,
99
- }),
83
+ value: this.generator.number.float({ min: 100, max: 10000, multipleOf: 25 }),
100
84
  },
101
85
  },
102
86
  } satisfies Order;
103
87
 
104
- return success(order);
88
+ return success(this.factory.parseOrder(this.context, order));
105
89
  }
106
90
  }
@@ -1,30 +1,37 @@
1
1
  import {
2
- type RequestContext,
3
- type Cache,
2
+ CustomerPriceQuerySchema,
3
+ ListPriceQuerySchema,
4
4
  PriceProvider,
5
+ PriceSchema,
6
+ Reactionary,
7
+ success,
8
+ type Cache,
5
9
  type CustomerPriceQuery,
6
10
  type ListPriceQuery,
7
11
  type Price,
8
- Reactionary,
9
- CustomerPriceQuerySchema,
10
- PriceSchema,
11
- ListPriceQuerySchema,
12
- error,
13
- success,
12
+ type PriceFactory,
13
+ type PriceFactoryOutput,
14
+ type PriceFactoryWithOutput,
15
+ type RequestContext,
14
16
  type Result,
15
17
  } from '@reactionary/core';
16
- import type * as z from 'zod';
17
18
  import type { FakeConfiguration } from '../schema/configuration.schema.js';
18
19
  import { base, en, Faker } from '@faker-js/faker';
19
20
  import { calcSeed } from '../utilities/seed.js';
21
+ import type { FakePriceFactory } from '../factories/price/price.factory.js';
20
22
 
21
- export class FakePriceProvider extends PriceProvider {
23
+ export class FakePriceProvider<
24
+ TFactory extends PriceFactory = FakePriceFactory,
25
+ > extends PriceProvider<PriceFactoryOutput<TFactory>> {
22
26
  protected config: FakeConfiguration;
23
27
  protected faker: Faker;
28
+ protected factory: PriceFactoryWithOutput<TFactory>;
29
+
24
30
  constructor(
25
31
  config: FakeConfiguration,
26
32
  cache: Cache,
27
- context: RequestContext
33
+ context: RequestContext,
34
+ factory: PriceFactoryWithOutput<TFactory>,
28
35
  ) {
29
36
  super(cache, context);
30
37
 
@@ -32,6 +39,7 @@ export class FakePriceProvider extends PriceProvider {
32
39
  this.faker = new Faker({
33
40
  locale: [en, base],
34
41
  });
42
+ this.factory = factory;
35
43
  }
36
44
 
37
45
  protected createPrice(variantSku: string, mode: 'list' | 'customer'): Price {
@@ -40,34 +48,30 @@ export class FakePriceProvider extends PriceProvider {
40
48
  let price = this.faker.number.int({ min: 300, max: 100000 }) / 100;
41
49
  let onSale = false;
42
50
  if (mode === 'customer') {
43
- // For customer price, randomly decide if the product is on sale
44
- onSale = this.faker.datatype.boolean({ probability: 0.1 }); // 10% chance of being on sale
45
-
51
+ onSale = this.faker.datatype.boolean({ probability: 0.1 });
46
52
  if (onSale) {
47
- price = price * this.faker.number.float({ min: 0.5, max: 0.9 }); // Apply a random discount between 10% and 50%
53
+ price = price * this.faker.number.float({ min: 0.5, max: 0.9 });
48
54
  }
49
55
  }
50
56
 
51
57
  const tiers = [];
52
58
  if (variantSku.includes('with-tiers')) {
53
- // Add tiered pricing for SKUs that include "with-tiers"
54
59
  tiers.push({
55
60
  minimumQuantity: this.faker.number.int({ min: 2, max: 5 }),
56
61
  price: {
57
- value: price * 0.8, // 20% discount for tier 1
62
+ value: price * 0.8,
58
63
  currency: this.context.languageContext.currencyCode,
59
64
  },
60
65
  });
61
66
  tiers.push({
62
67
  minimumQuantity: this.faker.number.int({ min: 6, max: 10 }),
63
68
  price: {
64
- value: price * 0.6, // 40% discount for tier 2
69
+ value: price * 0.6,
65
70
  currency: this.context.languageContext.currencyCode,
66
71
  },
67
72
  });
68
73
  }
69
74
 
70
-
71
75
  return {
72
76
  identifier: {
73
77
  variant: {
@@ -80,32 +84,36 @@ export class FakePriceProvider extends PriceProvider {
80
84
  },
81
85
  onSale,
82
86
  tieredPrices: tiers,
83
- }
87
+ };
84
88
  }
85
89
 
86
-
87
-
88
90
  @Reactionary({
89
91
  inputSchema: ListPriceQuerySchema,
90
- outputSchema: PriceSchema
92
+ outputSchema: PriceSchema,
91
93
  })
92
- public override async getListPrice(payload: ListPriceQuery): Promise<Result<Price>> {
93
- if (payload.variant.sku === 'unknown-sku') {
94
- return success(this.createEmptyPriceResult(payload.variant.sku));
95
- }
94
+ public override async getListPrice(
95
+ payload: ListPriceQuery,
96
+ ): Promise<Result<PriceFactoryOutput<TFactory>>> {
97
+ const base =
98
+ payload.variant.sku === 'unknown-sku'
99
+ ? this.createEmptyPriceResult(payload.variant.sku)
100
+ : this.createPrice(payload.variant.sku, 'list');
96
101
 
97
- return success(this.createPrice(payload.variant.sku, 'list'));
102
+ return success(this.factory.parsePrice(this.context, base));
98
103
  }
99
104
 
100
105
  @Reactionary({
101
106
  inputSchema: CustomerPriceQuerySchema,
102
- outputSchema: PriceSchema
107
+ outputSchema: PriceSchema,
103
108
  })
104
- public override async getCustomerPrice(payload: CustomerPriceQuery): Promise<Result<Price>> {
105
- if (payload.variant.sku === 'unknown-sku') {
106
- return success(this.createEmptyPriceResult(payload.variant.sku));
107
- }
109
+ public override async getCustomerPrice(
110
+ payload: CustomerPriceQuery,
111
+ ): Promise<Result<PriceFactoryOutput<TFactory>>> {
112
+ const base =
113
+ payload.variant.sku === 'unknown-sku'
114
+ ? this.createEmptyPriceResult(payload.variant.sku)
115
+ : this.createPrice(payload.variant.sku, 'customer');
108
116
 
109
- return success(this.createPrice(payload.variant.sku, 'customer'));
117
+ return success(this.factory.parsePrice(this.context, base));
110
118
  }
111
119
  }
@@ -7,23 +7,36 @@ import {
7
7
  type Result,
8
8
  success,
9
9
  type ProductAssociation,
10
+ type Cache,
10
11
  type ProductSearchResultItem,
12
+ type RequestContext,
13
+ } from '@reactionary/core';
14
+ import type {
15
+ ProductAssociationsFactory,
16
+ ProductAssociationsFactoryOutput,
17
+ ProductAssociationsFactoryWithOutput,
11
18
  } from '@reactionary/core';
12
19
  import type { FakeConfiguration } from '../schema/configuration.schema.js';
13
- import { base, en, Faker } from '@faker-js/faker';
20
+ import { en, Faker } from '@faker-js/faker';
14
21
  import { calcSeed } from '../utilities/seed.js';
22
+ import type { FakeProductAssociationsFactory } from '../factories/product-associations/product-associations.factory.js';
15
23
 
16
- export class FakeProductAssociationsProvider extends ProductAssociationsProvider {
24
+ export class FakeProductAssociationsProvider<
25
+ TFactory extends ProductAssociationsFactory = FakeProductAssociationsFactory,
26
+ > extends ProductAssociationsProvider<ProductAssociationsFactoryOutput<TFactory>> {
17
27
  protected config: FakeConfiguration;
28
+ protected factory: ProductAssociationsFactoryWithOutput<TFactory>;
18
29
  protected faker: Faker;
19
30
 
20
31
  constructor(
21
32
  config: FakeConfiguration,
22
- cache: any,
23
- context: any
33
+ cache: Cache,
34
+ context: RequestContext,
35
+ factory: ProductAssociationsFactoryWithOutput<TFactory>,
24
36
  ) {
25
37
  super(cache, context);
26
38
  this.config = config;
39
+ this.factory = factory;
27
40
  this.faker = new Faker({ locale: [en] });
28
41
  }
29
42
 
@@ -35,7 +48,7 @@ export class FakeProductAssociationsProvider extends ProductAssociationsProvider
35
48
  })
36
49
  public override async getAccessories(
37
50
  query: ProductAssociationsGetAccessoriesQuery
38
- ): Promise<Result<ProductAssociation[]>> {
51
+ ): Promise<Result<ProductAssociationsFactoryOutput<TFactory>[]>> {
39
52
  const associatedProducts = this.generateFakeAssociatedProducts(query.forProduct.key, query.numberOfAccessories || 4, 'accessory');
40
53
 
41
54
  const result: ProductAssociation[] = associatedProducts.map(product => ({
@@ -46,7 +59,7 @@ export class FakeProductAssociationsProvider extends ProductAssociationsProvider
46
59
  product,
47
60
  } satisfies ProductAssociation));
48
61
 
49
- return success(result);
62
+ return success(result.map((x) => this.factory.parseAssociation(this.context, x)));
50
63
  }
51
64
 
52
65
  @Reactionary({
@@ -57,7 +70,7 @@ export class FakeProductAssociationsProvider extends ProductAssociationsProvider
57
70
  })
58
71
  public override async getSpareparts(
59
72
  query: ProductAssociationsGetSparepartsQuery
60
- ): Promise<Result<ProductAssociation[]>> {
73
+ ): Promise<Result<ProductAssociationsFactoryOutput<TFactory>[]>> {
61
74
  const associatedProducts = this.generateFakeAssociatedProducts(query.forProduct.key, query.numberOfSpareparts || 4, 'sparepart');
62
75
 
63
76
  const result: ProductAssociation[] = associatedProducts.map(product => ({
@@ -68,7 +81,7 @@ export class FakeProductAssociationsProvider extends ProductAssociationsProvider
68
81
  product,
69
82
  } satisfies ProductAssociation));
70
83
 
71
- return success(result);
84
+ return success(result.map((x) => this.factory.parseAssociation(this.context, x)));
72
85
  }
73
86
 
74
87
  @Reactionary({
@@ -79,7 +92,7 @@ export class FakeProductAssociationsProvider extends ProductAssociationsProvider
79
92
  })
80
93
  public override async getReplacements(
81
94
  query: ProductAssociationsGetReplacementsQuery
82
- ): Promise<Result<ProductAssociation[]>> {
95
+ ): Promise<Result<ProductAssociationsFactoryOutput<TFactory>[]>> {
83
96
  const associatedProducts = this.generateFakeAssociatedProducts(query.forProduct.key, query.numberOfReplacements || 4, 'replacement');
84
97
 
85
98
  const result: ProductAssociation[] = associatedProducts.map(product => ({
@@ -90,7 +103,7 @@ export class FakeProductAssociationsProvider extends ProductAssociationsProvider
90
103
  product,
91
104
  } satisfies ProductAssociation));
92
105
 
93
- return success(result);
106
+ return success(result.map((x) => this.factory.parseAssociation(this.context, x)));
94
107
  }
95
108
 
96
109
  private generateFakeAssociatedProducts(baseProductKey: string, count: number, type: string): ProductSearchResultItem[] {