@reactionary/source 0.6.1 → 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 +14 -11
  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
@@ -0,0 +1,23 @@
1
+ import type * as z from 'zod';
2
+ import type { ProfileSchema } from '../schemas/models/profile.model.js';
3
+ import type { RequestContext } from '../schemas/session.schema.js';
4
+
5
+ export type AnyProfileSchema = z.ZodType<z.output<typeof ProfileSchema>>;
6
+
7
+ export interface ProfileFactory<
8
+ TProfileSchema extends AnyProfileSchema = AnyProfileSchema,
9
+ > {
10
+ profileSchema: TProfileSchema;
11
+ parseProfile(context: RequestContext, data: unknown): z.output<TProfileSchema>;
12
+ }
13
+
14
+ export type ProfileFactoryOutput<TFactory extends ProfileFactory> = ReturnType<
15
+ TFactory['parseProfile']
16
+ >;
17
+
18
+ export type ProfileFactoryWithOutput<TFactory extends ProfileFactory> = Omit<
19
+ TFactory,
20
+ 'parseProfile'
21
+ > & {
22
+ parseProfile(context: RequestContext, data: unknown): ProfileFactoryOutput<TFactory>;
23
+ };
@@ -0,0 +1,21 @@
1
+ import type * as z from 'zod';
2
+ import type { StoreSchema } from '../schemas/models/store.model.js';
3
+ import type { RequestContext } from '../schemas/session.schema.js';
4
+
5
+ export type AnyStoreSchema = z.ZodType<z.output<typeof StoreSchema>>;
6
+
7
+ export interface StoreFactory<TStoreSchema extends AnyStoreSchema = AnyStoreSchema> {
8
+ storeSchema: TStoreSchema;
9
+ parseStore(context: RequestContext, data: unknown): z.output<TStoreSchema>;
10
+ }
11
+
12
+ export type StoreFactoryOutput<TFactory extends StoreFactory> = ReturnType<
13
+ TFactory['parseStore']
14
+ >;
15
+
16
+ export type StoreFactoryWithOutput<TFactory extends StoreFactory> = Omit<
17
+ TFactory,
18
+ 'parseStore'
19
+ > & {
20
+ parseStore(context: RequestContext, data: unknown): StoreFactoryOutput<TFactory>;
21
+ };
package/core/src/index.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  export * from './cache/index.js';
2
2
  export * from './client/index.js';
3
3
  export * from './decorators/index.js';
4
+ export * from './factories/index.js';
4
5
  export * from './providers/index.js';
5
6
  export * from './schemas/index.js';
6
- export * from './initialization.js';
7
+ export * from './initialization.js';
8
+ export type { InferType } from './zod-utils.js';
@@ -9,7 +9,10 @@ import { BaseProvider } from "./base.provider.js";
9
9
  /**
10
10
  * @group Providers
11
11
  */
12
- export abstract class CartProvider extends BaseProvider {
12
+ export abstract class CartProvider<
13
+ TCart extends Cart = Cart,
14
+ TCartIdentifier extends CartIdentifier = CartIdentifier,
15
+ > extends BaseProvider {
13
16
 
14
17
  /**
15
18
  * Get cart by ID.
@@ -18,7 +21,7 @@ export abstract class CartProvider extends BaseProvider {
18
21
  * @param payload
19
22
  * @param session
20
23
  */
21
- public abstract getById(payload: CartQueryById): Promise<Result<Cart, NotFoundError>>;
24
+ public abstract getById(payload: CartQueryById): Promise<Result<TCart, NotFoundError>>;
22
25
 
23
26
 
24
27
  /**
@@ -27,7 +30,7 @@ export abstract class CartProvider extends BaseProvider {
27
30
  * Usecase: Most common usecase during site load, or after login. You want to get the active cart for the user, so you can display it in the minicart.
28
31
  * @param session
29
32
  */
30
- public abstract getActiveCartId(): Promise<Result<CartIdentifier, NotFoundError>>;
33
+ public abstract getActiveCartId(): Promise<Result<TCartIdentifier, NotFoundError>>;
31
34
 
32
35
 
33
36
  /**
@@ -39,7 +42,7 @@ export abstract class CartProvider extends BaseProvider {
39
42
  * @param payload
40
43
  * @param session
41
44
  */
42
- public abstract add(payload: CartMutationItemAdd): Promise<Result<Cart>>;
45
+ public abstract add(payload: CartMutationItemAdd): Promise<Result<TCart>>;
43
46
 
44
47
  /**
45
48
  * Remove item from cart. If the cart is empty after removal, delete the cart. Returns the updated and recalculated cart.
@@ -48,7 +51,7 @@ export abstract class CartProvider extends BaseProvider {
48
51
  * @param payload
49
52
  * @param session
50
53
  */
51
- public abstract remove(payload: CartMutationItemRemove): Promise<Result<Cart>>;
54
+ public abstract remove(payload: CartMutationItemRemove): Promise<Result<TCart>>;
52
55
 
53
56
  /**
54
57
  * Change quantity of item in cart. If the cart is empty after change, delete the cart. Returns the updated and recalculated cart.
@@ -59,7 +62,7 @@ export abstract class CartProvider extends BaseProvider {
59
62
  * @param payload
60
63
  * @param session
61
64
  */
62
- public abstract changeQuantity(payload: CartMutationItemQuantityChange): Promise<Result<Cart>>;
65
+ public abstract changeQuantity(payload: CartMutationItemQuantityChange): Promise<Result<TCart>>;
63
66
 
64
67
 
65
68
  /**
@@ -78,7 +81,7 @@ export abstract class CartProvider extends BaseProvider {
78
81
  * @param payload
79
82
  * @param session
80
83
  */
81
- public abstract applyCouponCode(payload: CartMutationApplyCoupon): Promise<Result<Cart>>;
84
+ public abstract applyCouponCode(payload: CartMutationApplyCoupon): Promise<Result<TCart>>;
82
85
 
83
86
 
84
87
  /**
@@ -88,7 +91,7 @@ export abstract class CartProvider extends BaseProvider {
88
91
  * @param payload
89
92
  * @param session
90
93
  */
91
- public abstract removeCouponCode(payload: CartMutationRemoveCoupon): Promise<Result<Cart>>;
94
+ public abstract removeCouponCode(payload: CartMutationRemoveCoupon): Promise<Result<TCart>>;
92
95
 
93
96
  /**
94
97
  * Changes the currency of the cart.
@@ -97,10 +100,9 @@ export abstract class CartProvider extends BaseProvider {
97
100
  * @param newCurrency
98
101
  * @param session
99
102
  */
100
- public abstract changeCurrency(payload: CartMutationChangeCurrency): Promise<Result<Cart>>;
103
+ public abstract changeCurrency(payload: CartMutationChangeCurrency): Promise<Result<TCart>>;
101
104
 
102
105
  protected override getResourceName(): string {
103
106
  return 'cart';
104
107
  }
105
108
  }
106
-
@@ -13,7 +13,10 @@ import { BaseProvider } from "./base.provider.js";
13
13
  *
14
14
  * @group Foo
15
15
  */
16
- export abstract class CategoryProvider extends BaseProvider {
16
+ export abstract class CategoryProvider<
17
+ TCategory extends Category = Category,
18
+ TCategoryPaginatedResult extends CategoryPaginatedResult = CategoryPaginatedResult,
19
+ > extends BaseProvider {
17
20
  /**
18
21
  * Get a single category by its ID. Cannot return null, because HOW did you come across a categories ID that does not exist?
19
22
  *
@@ -29,7 +32,7 @@ export abstract class CategoryProvider extends BaseProvider {
29
32
  * @param id
30
33
  * @param session
31
34
  */
32
- public abstract getById(payload: CategoryQueryById): Promise<Result<Category, NotFoundError>>;
35
+ public abstract getById(payload: CategoryQueryById): Promise<Result<TCategory, NotFoundError>>;
33
36
 
34
37
  /**
35
38
  * Gets a single category by its seo slug
@@ -38,7 +41,7 @@ export abstract class CategoryProvider extends BaseProvider {
38
41
  * @param slug the slug
39
42
  * @param session
40
43
  */
41
- public abstract getBySlug(payload: CategoryQueryBySlug): Promise<Result<Category, NotFoundError>>;
44
+ public abstract getBySlug(payload: CategoryQueryBySlug): Promise<Result<TCategory, NotFoundError>>;
42
45
 
43
46
  /**
44
47
  * Gets the breadcrumb path to the category, i.e. all parents up to the root.
@@ -48,7 +51,7 @@ export abstract class CategoryProvider extends BaseProvider {
48
51
  * @param id
49
52
  * @param session
50
53
  */
51
- public abstract getBreadcrumbPathToCategory(payload: CategoryQueryForBreadcrumb): Promise<Result<Category[]>>;
54
+ public abstract getBreadcrumbPathToCategory(payload: CategoryQueryForBreadcrumb): Promise<Result<TCategory[]>>;
52
55
 
53
56
  // hmm, this is not really good enough.... We need a type we can pass in that will allow us to specify the precise return type, but otoh we also need
54
57
  // to be able to verify and assert the output type. FIXME
@@ -63,7 +66,7 @@ export abstract class CategoryProvider extends BaseProvider {
63
66
  * @param id The ID of the parent category.
64
67
  * @param session The session information.
65
68
  */
66
- public abstract findChildCategories(payload: CategoryQueryForChildCategories): Promise<Result<CategoryPaginatedResult>>;
69
+ public abstract findChildCategories(payload: CategoryQueryForChildCategories): Promise<Result<TCategoryPaginatedResult>>;
67
70
 
68
71
  /**
69
72
  * Returns all top categories, i.e. categories without a parent.
@@ -72,7 +75,7 @@ export abstract class CategoryProvider extends BaseProvider {
72
75
  * @param paginationOptions
73
76
  * @param session
74
77
  */
75
- public abstract findTopCategories( payload: CategoryQueryForTopCategories): Promise<Result<CategoryPaginatedResult>>;
78
+ public abstract findTopCategories( payload: CategoryQueryForTopCategories): Promise<Result<TCategoryPaginatedResult>>;
76
79
 
77
80
 
78
81
  protected override getResourceName(): string {
@@ -80,4 +83,3 @@ export abstract class CategoryProvider extends BaseProvider {
80
83
  }
81
84
 
82
85
  }
83
-
@@ -5,7 +5,11 @@ import type { CheckoutQueryById, CheckoutQueryForAvailablePaymentMethods, Checko
5
5
  import type { Result } from "../schemas/result.js";
6
6
  import type { NotFoundError } from "../schemas/index.js";
7
7
 
8
- export abstract class CheckoutProvider extends BaseProvider {
8
+ export abstract class CheckoutProvider<
9
+ TCheckout extends Checkout = Checkout,
10
+ TShippingMethod extends ShippingMethod = ShippingMethod,
11
+ TPaymentMethod extends PaymentMethod = PaymentMethod,
12
+ > extends BaseProvider {
9
13
 
10
14
  /**
11
15
  * This starts a new checkout session for the given cart. The checkout might duplicate the cart, or just reference it, depending on implementation, but changes to the cart,
@@ -17,7 +21,7 @@ export abstract class CheckoutProvider extends BaseProvider {
17
21
  * @param billingAddress the billing/shipping address to start with. This affects available shipping methods, and may be required by some payment providers.
18
22
  * @param reqCtx
19
23
  */
20
- public abstract initiateCheckoutForCart(payload: CheckoutMutationInitiateCheckout): Promise<Result<Checkout>>;
24
+ public abstract initiateCheckoutForCart(payload: CheckoutMutationInitiateCheckout): Promise<Result<TCheckout>>;
21
25
 
22
26
 
23
27
  /**
@@ -27,7 +31,7 @@ export abstract class CheckoutProvider extends BaseProvider {
27
31
  * @param payload
28
32
  * @param reqCtx
29
33
  */
30
- public abstract getById(payload: CheckoutQueryById): Promise<Result<Checkout, NotFoundError>>;
34
+ public abstract getById(payload: CheckoutQueryById): Promise<Result<TCheckout, NotFoundError>>;
31
35
 
32
36
  /**
33
37
  * Updates the shipping address for the checkout and recalculates the shipping methods and totals.
@@ -37,7 +41,7 @@ export abstract class CheckoutProvider extends BaseProvider {
37
41
  * NOTE: Unsure this is really needed.
38
42
  * @param shippingAddress The updated shipping address. Note: This may also be the billing address, if your store does not differentiate.
39
43
  */
40
- public abstract setShippingAddress(payload: CheckoutMutationSetShippingAddress): Promise<Result<Checkout>>;
44
+ public abstract setShippingAddress(payload: CheckoutMutationSetShippingAddress): Promise<Result<TCheckout>>;
41
45
 
42
46
  /**
43
47
  * Returns all available shipping methods for the given checkout. This will typically depend on the shipping address, and possibly also the items in the checkout.
@@ -47,7 +51,7 @@ export abstract class CheckoutProvider extends BaseProvider {
47
51
  * @param checkoutId The checkout you want to get shipping methods for.
48
52
  * @param reqCtx
49
53
  */
50
- public abstract getAvailableShippingMethods(payload: CheckoutQueryForAvailableShippingMethods): Promise<Result<ShippingMethod[]>>;
54
+ public abstract getAvailableShippingMethods(payload: CheckoutQueryForAvailableShippingMethods): Promise<Result<TShippingMethod[]>>;
51
55
 
52
56
  /**
53
57
  * Returns all available payment methods for the given checkout. This will typically depend mostly on the billing address and jurisdiction.
@@ -57,7 +61,7 @@ export abstract class CheckoutProvider extends BaseProvider {
57
61
  * @param checkoutId The checkout you want to get payment methods for.
58
62
  * @param reqCtx
59
63
  */
60
- public abstract getAvailablePaymentMethods(payload: CheckoutQueryForAvailablePaymentMethods): Promise<Result<PaymentMethod[]>>;
64
+ public abstract getAvailablePaymentMethods(payload: CheckoutQueryForAvailablePaymentMethods): Promise<Result<TPaymentMethod[]>>;
61
65
 
62
66
 
63
67
  /**
@@ -65,7 +69,7 @@ export abstract class CheckoutProvider extends BaseProvider {
65
69
  *
66
70
  * Usecase: User has chosen a payment method, and you need to start the payment process.
67
71
  */
68
- public abstract addPaymentInstruction(payload: CheckoutMutationAddPaymentInstruction): Promise<Result<Checkout>>;
72
+ public abstract addPaymentInstruction(payload: CheckoutMutationAddPaymentInstruction): Promise<Result<TCheckout>>;
69
73
 
70
74
  /**
71
75
  * Removes a payment instruction from the checkout. This will typically void the payment intent in the payment provider, and remove the payment instruction from the checkout.
@@ -73,7 +77,7 @@ export abstract class CheckoutProvider extends BaseProvider {
73
77
  * Usecase: User has decided to change payment method, or has cancelled the payment process.
74
78
  * @param paymentInstructionId
75
79
  */
76
- public abstract removePaymentInstruction(payload: CheckoutMutationRemovePaymentInstruction): Promise<Result<Checkout>>;
80
+ public abstract removePaymentInstruction(payload: CheckoutMutationRemovePaymentInstruction): Promise<Result<TCheckout>>;
77
81
 
78
82
 
79
83
 
@@ -87,7 +91,7 @@ export abstract class CheckoutProvider extends BaseProvider {
87
91
  * @param shippingMethodId
88
92
  * @param pickupPoint
89
93
  */
90
- public abstract setShippingInstruction(payload: CheckoutMutationSetShippingInstruction): Promise<Result<Checkout>>;
94
+ public abstract setShippingInstruction(payload: CheckoutMutationSetShippingInstruction): Promise<Result<TCheckout>>;
91
95
 
92
96
  /**
93
97
  * Finalizes the checkout process. This typically involves creating an order from the checkout and processing payment.
@@ -97,7 +101,7 @@ export abstract class CheckoutProvider extends BaseProvider {
97
101
  * @param payload
98
102
  * @param reqCtx
99
103
  */
100
- public abstract finalizeCheckout(payload: CheckoutMutationFinalizeCheckout): Promise<Result<Checkout>>;
104
+ public abstract finalizeCheckout(payload: CheckoutMutationFinalizeCheckout): Promise<Result<TCheckout>>;
101
105
 
102
106
 
103
107
  public override getResourceName(): string {
@@ -4,18 +4,18 @@ import type { IdentityQuerySelf } from "../schemas/queries/identity.query.js";
4
4
  import type { Result } from "../schemas/result.js";
5
5
  import { BaseProvider } from "./base.provider.js";
6
6
 
7
- export abstract class IdentityProvider extends BaseProvider {
8
- public abstract getSelf(payload: IdentityQuerySelf): Promise<Result<Identity>>;
9
- public abstract login(payload: IdentityMutationLogin): Promise<Result<Identity>>;
10
- public abstract logout(payload: IdentityMutationLogout): Promise<Result<Identity>>;
11
- public abstract register(payload: IdentityMutationRegister): Promise<Result<Identity>>;
7
+ export abstract class IdentityProvider<TIdentity extends Identity = Identity> extends BaseProvider {
8
+ public abstract getSelf(payload: IdentityQuerySelf): Promise<Result<TIdentity>>;
9
+ public abstract login(payload: IdentityMutationLogin): Promise<Result<TIdentity>>;
10
+ public abstract logout(payload: IdentityMutationLogout): Promise<Result<TIdentity>>;
11
+ public abstract register(payload: IdentityMutationRegister): Promise<Result<TIdentity>>;
12
12
 
13
13
  protected override getResourceName(): string {
14
14
  return 'identity';
15
15
  }
16
16
 
17
- protected updateIdentityContext(identity: Identity) {
17
+ protected updateIdentityContext(identity: TIdentity) {
18
18
  this.context.session.identityContext.lastUpdated = new Date();
19
- this.context.session.identityContext.identity = identity;
19
+ this.context.session.identityContext.identity = identity as Identity;
20
20
  }
21
21
  }
@@ -5,20 +5,20 @@ import type { InventoryQueryBySKU } from '../schemas/queries/inventory.query.js'
5
5
  import type { Result } from '../schemas/result.js';
6
6
  import { BaseProvider } from './base.provider.js';
7
7
 
8
- export abstract class InventoryProvider extends BaseProvider {
9
- public abstract getBySKU(payload: InventoryQueryBySKU): Promise<Result<Inventory, NotFoundError>>;
8
+ export abstract class InventoryProvider<TInventory extends Inventory = Inventory> extends BaseProvider {
9
+ public abstract getBySKU(payload: InventoryQueryBySKU): Promise<Result<TInventory, NotFoundError>>;
10
10
 
11
11
  protected override getResourceName(): string {
12
12
  return 'inventory';
13
13
  }
14
14
 
15
- protected createEmptyInventory(key: InventoryIdentifier): Inventory {
15
+ protected createEmptyInventory(key: InventoryIdentifier): TInventory {
16
16
  const inventory = {
17
17
  identifier: key,
18
18
  quantity: 0,
19
19
  status: 'outOfStock'
20
20
  } satisfies Inventory;
21
21
 
22
- return inventory;
22
+ return inventory as unknown as TInventory;
23
23
  }
24
24
  }
@@ -9,7 +9,9 @@ import { BaseProvider } from "./base.provider.js";
9
9
  *
10
10
  * Usecase: An e-commerce platform wants to provide customers with a way to search through their past orders using filters like date range, order status, or total amount spent.
11
11
  */
12
- export abstract class OrderSearchProvider extends BaseProvider {
12
+ export abstract class OrderSearchProvider<
13
+ TOrderSearchResult extends OrderSearchResult = OrderSearchResult,
14
+ > extends BaseProvider {
13
15
  protected override getResourceName(): string {
14
16
  return 'order-search';
15
17
  }
@@ -21,7 +23,7 @@ export abstract class OrderSearchProvider extends BaseProvider {
21
23
  * Usecase: A widget on the frontpage after login, shows the last 5 orders placed by the customer.
22
24
  * @param payload The search criteria for querying orders.
23
25
  */
24
- public abstract queryByTerm(payload: OrderSearchQueryByTerm): Promise<Result<OrderSearchResult>>;
26
+ public abstract queryByTerm(payload: OrderSearchQueryByTerm): Promise<Result<TOrderSearchResult>>;
25
27
 
26
28
 
27
29
 
@@ -4,7 +4,7 @@ import type { OrderQueryById } from '../schemas/queries/index.js';
4
4
  import type { Result } from '../schemas/result.js';
5
5
  import type { NotFoundError } from '../schemas/index.js';
6
6
 
7
- export abstract class OrderProvider extends BaseProvider {
7
+ export abstract class OrderProvider<TOrder extends Order = Order> extends BaseProvider {
8
8
  /**
9
9
  * Get order by ID.
10
10
  *
@@ -12,9 +12,9 @@ export abstract class OrderProvider extends BaseProvider {
12
12
  * @param payload
13
13
  * @param session
14
14
  */
15
- public abstract getById(payload: OrderQueryById): Promise<Result<Order, NotFoundError>>;
15
+ public abstract getById(payload: OrderQueryById): Promise<Result<TOrder, NotFoundError>>;
16
16
 
17
- protected createEmptyOrder(): Order {
17
+ protected createEmptyOrder(): TOrder {
18
18
  const order = {
19
19
  identifier: {
20
20
  key: '',
@@ -54,7 +54,7 @@ export abstract class OrderProvider extends BaseProvider {
54
54
  },
55
55
  } satisfies Order;
56
56
 
57
- return order;
57
+ return order as unknown as TOrder;
58
58
  }
59
59
 
60
60
  protected override getResourceName(): string {
@@ -5,7 +5,7 @@ import type {
5
5
  } from '../schemas/queries/price.query.js';
6
6
  import { BaseProvider } from './base.provider.js';
7
7
 
8
- export abstract class PriceProvider extends BaseProvider {
8
+ export abstract class PriceProvider<TPrice extends Price = Price> extends BaseProvider {
9
9
  /**
10
10
  * Get a list price price by SKU. This is the most general, undiscounted price and is typically
11
11
  * used as the "before" price in most ecommerce setups.
@@ -14,7 +14,7 @@ export abstract class PriceProvider extends BaseProvider {
14
14
  * @param payload The SKU to query
15
15
  * @param session The session information
16
16
  */
17
- public abstract getListPrice(payload: ListPriceQuery): Promise<Result<Price>>;
17
+ public abstract getListPrice(payload: ListPriceQuery): Promise<Result<TPrice>>;
18
18
 
19
19
  /**
20
20
  * Get a customer-specific price by SKU.
@@ -25,7 +25,7 @@ export abstract class PriceProvider extends BaseProvider {
25
25
  * @param payload The SKU to query
26
26
  * @param session The session information
27
27
  */
28
- public abstract getCustomerPrice(payload: CustomerPriceQuery): Promise<Result<Price>>;
28
+ public abstract getCustomerPrice(payload: CustomerPriceQuery): Promise<Result<TPrice>>;
29
29
 
30
30
  /**
31
31
  * Utility function to create an empty price result, with a value of -1.
@@ -35,7 +35,7 @@ export abstract class PriceProvider extends BaseProvider {
35
35
  * @param currency
36
36
  * @returns
37
37
  */
38
- protected createEmptyPriceResult(sku: string): Price {
38
+ protected createEmptyPriceResult(sku: string): TPrice {
39
39
  const price = {
40
40
  identifier: {
41
41
  variant: {
@@ -50,7 +50,7 @@ export abstract class PriceProvider extends BaseProvider {
50
50
  onSale: false,
51
51
  } satisfies Price;
52
52
 
53
- return price;
53
+ return price as unknown as TPrice;
54
54
  }
55
55
 
56
56
  protected override getResourceName(): string {
@@ -9,7 +9,9 @@ import type { ProductAssociation } from '../schemas/models/product-associations.
9
9
  * accessories, spareparts, and replacements. These associations are typically used to provide recommendations to customers on the product detail page, but can also be used in other contexts such as the cart or post-purchase, but
10
10
  * do not carry any personalization concept to them.
11
11
  */
12
- export abstract class ProductAssociationsProvider extends BaseProvider {
12
+ export abstract class ProductAssociationsProvider<
13
+ TProductAssociation extends ProductAssociation = ProductAssociation,
14
+ > extends BaseProvider {
13
15
 
14
16
  /**
15
17
  * Returns a list of product identifiers which are accessories to the given product.
@@ -23,7 +25,7 @@ export abstract class ProductAssociationsProvider extends BaseProvider {
23
25
  *
24
26
  * TODO: This should be a PaginatedResult
25
27
  */
26
- public abstract getAccessories(query: ProductAssociationsGetAccessoriesQuery): Promise<Result<ProductAssociation[]>>;
28
+ public abstract getAccessories(query: ProductAssociationsGetAccessoriesQuery): Promise<Result<TProductAssociation[]>>;
27
29
 
28
30
  /**
29
31
  * Returns a list of product identifiers which are spareparts to the given product.
@@ -34,7 +36,7 @@ export abstract class ProductAssociationsProvider extends BaseProvider {
34
36
  *
35
37
  * TODO: This should be a PaginatedResult
36
38
  */
37
- public abstract getSpareparts(query: ProductAssociationsGetSparepartsQuery): Promise<Result<ProductAssociation[]>>;
39
+ public abstract getSpareparts(query: ProductAssociationsGetSparepartsQuery): Promise<Result<TProductAssociation[]>>;
38
40
 
39
41
 
40
42
  /**
@@ -43,7 +45,7 @@ export abstract class ProductAssociationsProvider extends BaseProvider {
43
45
  * TODO: This should be a PaginatedResult
44
46
  * @param query
45
47
  */
46
- public abstract getReplacements(query: ProductAssociationsGetReplacementsQuery): Promise<Result<ProductAssociation[]>>;
48
+ public abstract getReplacements(query: ProductAssociationsGetReplacementsQuery): Promise<Result<TProductAssociation[]>>;
47
49
 
48
50
 
49
51
  getResourceName(): string {
@@ -13,7 +13,12 @@ import { BaseProvider } from "./base.provider.js";
13
13
  *
14
14
  * Some systems might only support single entries of each type, but the general case is to support multiples.
15
15
  */
16
- export abstract class ProductListProvider extends BaseProvider {
16
+ export abstract class ProductListProvider<
17
+ TProductList extends ProductList = ProductList,
18
+ TProductListItem extends ProductListItem = ProductListItem,
19
+ TProductListPaginatedResult extends ProductListPaginatedResult = ProductListPaginatedResult,
20
+ TProductListItemPaginatedResult extends ProductListItemPaginatedResult = ProductListItemPaginatedResult,
21
+ > extends BaseProvider {
17
22
 
18
23
  protected getResourceName(): string {
19
24
  return 'product-lists';
@@ -24,7 +29,7 @@ export abstract class ProductListProvider extends BaseProvider {
24
29
  * you might have stored the identifier from an earlier session or looked it up previously.
25
30
  * @param payload
26
31
  */
27
- public abstract getById(payload: ProductListQueryById): Promise<Result<ProductList>>;
32
+ public abstract getById(payload: ProductListQueryById): Promise<Result<TProductList>>;
28
33
 
29
34
 
30
35
  /**
@@ -33,7 +38,7 @@ export abstract class ProductListProvider extends BaseProvider {
33
38
  *
34
39
  * @param query
35
40
  */
36
- public abstract queryLists(query: ProductListQuery): Promise<Result<ProductListPaginatedResult>>;
41
+ public abstract queryLists(query: ProductListQuery): Promise<Result<TProductListPaginatedResult>>;
37
42
 
38
43
 
39
44
  /**
@@ -44,14 +49,14 @@ export abstract class ProductListProvider extends BaseProvider {
44
49
  * which the customer can then add the product to.
45
50
  * @param mutation
46
51
  */
47
- public abstract addList(mutation: ProductListMutationCreate): Promise<Result<ProductList>>;
52
+ public abstract addList(mutation: ProductListMutationCreate): Promise<Result<TProductList>>;
48
53
 
49
54
  /**
50
55
  *
51
56
  * Usecase: update name of list, or other metadata related to the list, such as "this is my summer wishlist", or "this is my favorite list for cameras".
52
57
  * @param mutation
53
58
  */
54
- public abstract updateList(mutation: ProductListMutationUpdate): Promise<Result<ProductList>>;
59
+ public abstract updateList(mutation: ProductListMutationUpdate): Promise<Result<TProductList>>;
55
60
 
56
61
  /**
57
62
  * Usecase: customer wants to delete a list, such as "delete my summer wishlist", including all the product list items
@@ -63,13 +68,13 @@ export abstract class ProductListProvider extends BaseProvider {
63
68
  * Usecase: in the frontend you want to show a list of the products in the customers wishlist.
64
69
  * @param query
65
70
  */
66
- public abstract queryListItems(query: ProductListItemsQuery): Promise<Result<ProductListItemPaginatedResult>>;
71
+ public abstract queryListItems(query: ProductListItemsQuery): Promise<Result<TProductListItemPaginatedResult>>;
67
72
 
68
73
  /**
69
74
  * Usecase: Add a new product-variant to a list
70
75
  * @param mutation
71
76
  */
72
- public abstract addItem(mutation: ProductListItemMutationCreate): Promise<Result<ProductListItem>>;
77
+ public abstract addItem(mutation: ProductListItemMutationCreate): Promise<Result<TProductListItem>>;
73
78
 
74
79
  /**
75
80
  * Usecase: Remove a product-variant from a list.
@@ -81,6 +86,6 @@ export abstract class ProductListProvider extends BaseProvider {
81
86
  * Usecase: Update the quantity of a product-variant in a list.
82
87
  * @param mutation
83
88
  */
84
- public abstract updateItem(mutation: ProductListItemMutationUpdate): Promise<Result<ProductListItem>>;
89
+ public abstract updateItem(mutation: ProductListItemMutationUpdate): Promise<Result<TProductListItem>>;
85
90
 
86
91
  }
@@ -8,7 +8,11 @@ import { type ProductRatingIdentifier } from '../schemas/models/identifiers.mode
8
8
  * Reviews contain ratings along with textual feedback, author information, and verification status.
9
9
  * This provider also handles aggregated rating summaries for products.
10
10
  */
11
- export abstract class ProductReviewsProvider extends BaseProvider {
11
+ export abstract class ProductReviewsProvider<
12
+ TProductRatingSummary extends ProductRatingSummary = ProductRatingSummary,
13
+ TProductReviewPaginatedResult extends ProductReviewPaginatedResult = ProductReviewPaginatedResult,
14
+ TProductReview extends ProductReview = ProductReview,
15
+ > extends BaseProvider {
12
16
  /**
13
17
  * Get the rating summary for a product, including average rating and distribution.
14
18
  *
@@ -17,7 +21,7 @@ export abstract class ProductReviewsProvider extends BaseProvider {
17
21
  */
18
22
  public abstract getRatingSummary(
19
23
  query: ProductReviewsGetRatingSummaryQuery
20
- ): Promise<Result<ProductRatingSummary>>;
24
+ ): Promise<Result<TProductRatingSummary>>;
21
25
 
22
26
  /**
23
27
  * Get a paginated list of reviews for a product.
@@ -27,7 +31,7 @@ export abstract class ProductReviewsProvider extends BaseProvider {
27
31
  */
28
32
  public abstract findReviews(
29
33
  query: ProductReviewsListQuery
30
- ): Promise<Result<ProductReviewPaginatedResult>>;
34
+ ): Promise<Result<TProductReviewPaginatedResult>>;
31
35
  /**
32
36
  * Submit a review for a product.
33
37
  *
@@ -36,7 +40,7 @@ export abstract class ProductReviewsProvider extends BaseProvider {
36
40
  */
37
41
  public abstract submitReview(
38
42
  mutation: ProductReviewMutationSubmit
39
- ): Promise<Result<ProductReview>>;
43
+ ): Promise<Result<TProductReview>>;
40
44
 
41
45
 
42
46
  protected createEmptyProductRatingSummary(key: ProductRatingIdentifier): ProductRatingSummary {
@@ -1,15 +1,21 @@
1
- import type { Category, FacetIdentifier, FacetValueIdentifier, Result } from '../index.js';
2
- import type { ProductSearchResult, ProductSearchResultFacet, ProductSearchResultFacetValue, ProductSearchResultItemVariant } from '../schemas/models/product-search.model.js';
3
- import type { ProductSearchQueryByTerm, ProductSearchQueryCreateNavigationFilter } from '../schemas/queries/product-search.query.js';
1
+ import type { Category, FacetValueIdentifier, Result } from '../index.js';
2
+ import type { ProductSearchResult } from '../schemas/models/product-search.model.js';
3
+ import type {
4
+ ProductSearchQueryByTerm,
5
+ ProductSearchQueryCreateNavigationFilter,
6
+ } from '../schemas/queries/product-search.query.js';
4
7
  import { BaseProvider } from './base.provider.js';
5
8
 
6
- export abstract class ProductSearchProvider extends BaseProvider {
9
+ export abstract class ProductSearchProvider<
10
+ TProductSearchResult extends ProductSearchResult = ProductSearchResult,
11
+ > extends BaseProvider {
7
12
  protected override getResourceName(): string {
8
13
  return 'product-search';
9
14
  }
10
15
 
11
- public abstract queryByTerm(payload: ProductSearchQueryByTerm): Promise<Result<ProductSearchResult>>;
12
-
16
+ public abstract queryByTerm(
17
+ payload: ProductSearchQueryByTerm,
18
+ ): Promise<Result<TProductSearchResult>>;
13
19
 
14
20
  /**
15
21
  * Since each platform has it own way of representing categories and their hierarchy, we leave it to the platform to tell us how to get from a
@@ -29,7 +35,9 @@ public abstract queryByTerm(payload: ProductSearchQueryByTerm): Promise<Result<P
29
35
  *
30
36
  * @param categoryPath
31
37
  */
32
- public abstract createCategoryNavigationFilter(payload: ProductSearchQueryCreateNavigationFilter): Promise<Result<FacetValueIdentifier>>;
38
+ public abstract createCategoryNavigationFilter(
39
+ payload: ProductSearchQueryCreateNavigationFilter,
40
+ ): Promise<Result<FacetValueIdentifier>>;
33
41
 
34
42
  /**
35
43
  * Parses a facet value from the search response.
@@ -37,25 +45,4 @@ public abstract queryByTerm(payload: ProductSearchQueryByTerm): Promise<Result<P
37
45
  * @param label The label for the facet value.
38
46
  * @param count The count for the facet value.
39
47
  */
40
- protected abstract parseFacetValue(facetValueIdentifier: FacetValueIdentifier, label: string, count: number) : ProductSearchResultFacetValue;
41
-
42
- /**
43
- * Parses a facet from the search response.
44
- * @param facetIdentifier The identifier for the facet.
45
- * @param facetValue The value for the facet.
46
- *
47
- * Usecase: Override this to customize the parsing of facets.
48
- */
49
- protected abstract parseFacet(facetIdentifier: FacetIdentifier, facetValue: unknown) : ProductSearchResultFacet;
50
-
51
- /**
52
- * Parses a product variant from the search response.
53
- * @param variant The variant data from the search response.
54
- * @param product The product data from the search response.
55
- *
56
- * Usecase: Override this to customize the parsing of product variants.
57
- */
58
- protected abstract parseVariant(variant: unknown, product: unknown): ProductSearchResultItemVariant;
59
48
  }
60
-
61
-