@faststore/core 2.1.33 → 2.1.36

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 (48) hide show
  1. package/.turbo/turbo-build.log +7 -7
  2. package/package.json +3 -3
  3. package/src/components/common/Alert/Alert.tsx +5 -8
  4. package/src/components/navigation/Navbar/Navbar.tsx +22 -22
  5. package/src/components/navigation/NavbarLinks/NavbarLinks.tsx +8 -7
  6. package/src/components/navigation/NavbarSlider/NavbarSlider.tsx +15 -14
  7. package/src/components/product/ProductGrid/ProductGrid.tsx +5 -10
  8. package/src/components/region/RegionBar/RegionBar.tsx +27 -13
  9. package/src/components/search/Filter/Filter.tsx +6 -11
  10. package/src/components/sections/Alert/Alert.tsx +17 -13
  11. package/src/components/sections/Alert/Overrides.tsx +13 -25
  12. package/src/components/sections/BannerText/BannerText.tsx +24 -20
  13. package/src/components/sections/BannerText/Overrides.tsx +11 -23
  14. package/src/components/sections/Breadcrumb/Overrides.tsx +13 -25
  15. package/src/components/sections/EmptyState/EmptyState.tsx +6 -8
  16. package/src/components/sections/EmptyState/Overrides.tsx +12 -24
  17. package/src/components/sections/Hero/Hero.tsx +15 -12
  18. package/src/components/sections/Hero/Overrides.tsx +12 -24
  19. package/src/components/sections/Navbar/Overrides.tsx +43 -31
  20. package/src/components/sections/Newsletter/Overrides.tsx +28 -26
  21. package/src/components/sections/ProductDetails/Overrides.tsx +51 -38
  22. package/src/components/sections/ProductDetails/ProductDetails.tsx +22 -30
  23. package/src/components/sections/ProductGallery/Overrides.tsx +44 -35
  24. package/src/components/sections/ProductShelf/Overrides.tsx +14 -28
  25. package/src/components/sections/RegionBar/Overrides.tsx +12 -24
  26. package/src/components/ui/Breadcrumb/Breadcrumb.tsx +9 -7
  27. package/src/components/ui/ImageGallery/ImageGallery.tsx +13 -19
  28. package/src/components/ui/Newsletter/Newsletter.tsx +23 -24
  29. package/src/components/ui/ProductDetails/ProductDetailsSettings.tsx +21 -17
  30. package/src/components/ui/ProductGallery/ProductGallery.tsx +31 -38
  31. package/src/components/ui/ProductShelf/ProductShelf.tsx +11 -16
  32. package/src/components/ui/ShippingSimulation/ShippingSimulation.tsx +2 -3
  33. package/src/components/ui/SkuSelector/Selectors.tsx +8 -7
  34. package/src/customizations/components/overrides/Alert.tsx +3 -7
  35. package/src/customizations/components/overrides/BannerText.tsx +3 -7
  36. package/src/customizations/components/overrides/Breadcrumb.tsx +3 -7
  37. package/src/customizations/components/overrides/EmptyState.tsx +3 -6
  38. package/src/customizations/components/overrides/Hero.tsx +3 -8
  39. package/src/customizations/components/overrides/Navbar.tsx +3 -16
  40. package/src/customizations/components/overrides/Newsletter.tsx +3 -11
  41. package/src/customizations/components/overrides/ProductDetails.tsx +3 -18
  42. package/src/customizations/components/overrides/ProductGallery.tsx +3 -16
  43. package/src/customizations/components/overrides/ProductShelf.tsx +3 -8
  44. package/src/customizations/components/overrides/RegionBar.tsx +3 -8
  45. package/src/typings/overrideDefinitionUtils.ts +40 -0
  46. package/src/typings/overrides.ts +267 -0
  47. package/src/utils/overrides.ts +53 -0
  48. package/src/typings/overrides.d.ts +0 -97
@@ -6,7 +6,7 @@ import { useSession } from 'src/sdk/session'
6
6
  import { IShippingItem } from '@faststore/api'
7
7
  import { useShippingSimulation } from './useShippingSimulation'
8
8
 
9
- import { Components } from 'src/components/sections/ProductDetails/Overrides'
9
+ import { ShippingSimulation as ShippingSimulationWrapper } from 'src/components/sections/ProductDetails/Overrides'
10
10
 
11
11
  type ShippingSimulationOptionalProps =
12
12
  | 'title'
@@ -56,7 +56,6 @@ export default function ShippingSimulation({
56
56
  ...otherProps
57
57
  }: ShippingSimulationProps) {
58
58
  const { country, postalCode: sessionPostalCode } = useSession()
59
- const { ShippingSimulation: ShippingSimulationWrapper } = Components
60
59
 
61
60
  const {
62
61
  input,
@@ -76,7 +75,7 @@ export default function ShippingSimulation({
76
75
  const { location, options } = shippingSimulation
77
76
 
78
77
  return (
79
- <ShippingSimulationWrapper
78
+ <ShippingSimulationWrapper.Component
80
79
  formatter={formatter}
81
80
  onInput={handleOnInput}
82
81
  onSubmit={handleSubmit}
@@ -4,9 +4,7 @@ import { SkuSelectorProps } from '@faststore/ui'
4
4
  import NextLink from 'next/link'
5
5
  import { Image } from '../Image'
6
6
 
7
- import { Components } from 'src/components/sections/ProductDetails/Overrides'
8
-
9
- const { SkuSelector } = Components
7
+ import { SkuSelector } from 'src/components/sections/ProductDetails/Overrides'
10
8
 
11
9
  export type SkuVariantsByName = Record<
12
10
  string,
@@ -44,16 +42,19 @@ function Selectors({
44
42
  <section {...otherProps}>
45
43
  {availableVariations &&
46
44
  Object.keys(availableVariations).map((skuVariant) => (
47
- <SkuSelector
45
+ <SkuSelector.Component
46
+ ImageComponent={ImageComponent}
47
+ {...SkuSelector.props}
48
48
  key={skuVariant}
49
49
  skuPropertyName={skuVariant}
50
50
  availableVariations={availableVariations}
51
- ImageComponent={ImageComponent}
52
51
  activeVariations={activeVariations}
53
52
  slugsMap={slugsMap}
54
53
  linkProps={{
55
- as: NextLink,
56
- legacyBehavior: false,
54
+ ...(SkuSelector.props.linkProps ?? {}),
55
+ as: SkuSelector.props.linkProps?.as ?? NextLink,
56
+ legacyBehavior:
57
+ SkuSelector.props.linkProps?.legacyBehavior ?? false,
57
58
  }}
58
59
  />
59
60
  ))}
@@ -4,12 +4,8 @@ import { SectionOverride } from 'src/typings/overrides'
4
4
 
5
5
  const SECTION = 'Alert' as const
6
6
 
7
- const overrides: SectionOverride[typeof SECTION] = {
8
- name: SECTION,
9
- components: {
10
- Alert: { props: {} },
11
- Icon: { props: {} },
12
- },
7
+ const override: SectionOverride = {
8
+ section: SECTION,
13
9
  }
14
10
 
15
- export default overrides
11
+ export { override }
@@ -4,12 +4,8 @@ import { SectionOverride } from 'src/typings/overrides'
4
4
 
5
5
  const SECTION = 'BannerText' as const
6
6
 
7
- const overrides: SectionOverride[typeof SECTION] = {
8
- name: SECTION,
9
- components: {
10
- BannerText: { props: {} },
11
- BannerTextContent: { props: {} },
12
- },
7
+ const override: SectionOverride = {
8
+ section: SECTION,
13
9
  }
14
10
 
15
- export default overrides
11
+ export { override }
@@ -4,12 +4,8 @@ import { SectionOverride } from 'src/typings/overrides'
4
4
 
5
5
  const SECTION = 'Breadcrumb' as const
6
6
 
7
- const overrides: SectionOverride[typeof SECTION] = {
8
- name: SECTION,
9
- components: {
10
- Breadcrumb: { props: {} },
11
- Icon: { props: {} },
12
- },
7
+ const override: SectionOverride = {
8
+ section: SECTION,
13
9
  }
14
10
 
15
- export default overrides
11
+ export { override }
@@ -3,11 +3,8 @@ import { SectionOverride } from 'src/typings/overrides'
3
3
 
4
4
  const SECTION = 'EmptyState' as const
5
5
 
6
- const overrides: SectionOverride[typeof SECTION] = {
7
- name: SECTION,
8
- components: {
9
- EmptyState: { props: {} },
10
- },
6
+ const override: SectionOverride = {
7
+ section: SECTION,
11
8
  }
12
9
 
13
- export default overrides
10
+ export { override }
@@ -4,13 +4,8 @@ import { SectionOverride } from 'src/typings/overrides'
4
4
 
5
5
  const SECTION = 'Hero' as const
6
6
 
7
- const overrides: SectionOverride[typeof SECTION] = {
8
- name: SECTION,
9
- components: {
10
- Hero: { props: {} },
11
- HeroImage: { props: {} },
12
- HeroHeader: { props: {} },
13
- },
7
+ const override: SectionOverride = {
8
+ section: SECTION,
14
9
  }
15
10
 
16
- export default overrides
11
+ export { override }
@@ -4,21 +4,8 @@ import { SectionOverride } from 'src/typings/overrides'
4
4
 
5
5
  const SECTION = 'Navbar' as const
6
6
 
7
- const overrides: SectionOverride[typeof SECTION] = {
8
- name: SECTION,
9
- components: {
10
- Navbar: { props: {} },
11
- NavbarLinks: { props: {} },
12
- NavbarLinksList: { props: {} },
13
- NavbarSlider: { props: {} },
14
- NavbarSliderHeader: { props: {} },
15
- NavbarSliderContent: { props: {} },
16
- NavbarSliderFooter: { props: {} },
17
- NavbarHeader: { props: {} },
18
- NavbarRow: { props: {} },
19
- NavbarButtons: { props: {} },
20
- IconButton: { props: {} },
21
- },
7
+ const override: SectionOverride = {
8
+ section: SECTION,
22
9
  }
23
10
 
24
- export default overrides
11
+ export { override }
@@ -4,16 +4,8 @@ import { SectionOverride } from 'src/typings/overrides'
4
4
 
5
5
  const SECTION = 'Newsletter' as const
6
6
 
7
- const overrides: SectionOverride[typeof SECTION] = {
8
- name: SECTION,
9
- components: {
10
- ToastIconSuccess: { props: {} },
11
- ToastIconError: { props: {} },
12
- HeaderIcon: { props: {} },
13
- InputFieldName: { props: {} },
14
- InputFieldEmail: { props: {} },
15
- Button: { props: {} },
16
- },
7
+ const override: SectionOverride = {
8
+ section: SECTION,
17
9
  }
18
10
 
19
- export default overrides
11
+ export { override }
@@ -4,23 +4,8 @@ import { SectionOverride } from 'src/typings/overrides'
4
4
 
5
5
  const SECTION = 'ProductDetails' as const
6
6
 
7
- const overrides: SectionOverride[typeof SECTION] = {
8
- name: SECTION,
9
- components: {
10
- ProductTitle: { props: {} },
11
- DiscountBadge: { props: {} },
12
- BuyButton: { props: {} },
13
- Icon: { props: {} },
14
- Price: { props: {} },
15
- QuantitySelector: { props: {} },
16
- SkuSelector: { props: {} },
17
- ShippingSimulation: { props: {} },
18
- ImageGallery: { props: {} },
19
- ImageZoom: { props: {} },
20
- __experimentalImageGalleryImage: { props: {} },
21
- __experimentalImageGallery: { props: {} },
22
- __experimentalShippingSimulation: { props: {} },
23
- },
7
+ const override: SectionOverride = {
8
+ section: SECTION,
24
9
  }
25
10
 
26
- export default overrides
11
+ export { override }
@@ -4,21 +4,8 @@ import { SectionOverride } from 'src/typings/overrides'
4
4
 
5
5
  const SECTION = 'ProductGallery' as const
6
6
 
7
- const overrides: SectionOverride[typeof SECTION] = {
8
- name: SECTION,
9
- components: {
10
- Button: { props: {} },
11
- FilterIcon: { props: {} },
12
- PrevIcon: { props: {} },
13
- ResultsCountSkeleton: { props: {} },
14
- SortSkeleton: { props: {} },
15
- FilterButtonSkeleton: { props: {} },
16
- LinkButtonPrev: { props: {} },
17
- LinkButtonNext: { props: {} },
18
- __experimentalFilterDesktop: { props: {} },
19
- __experimentalFilterSlider: { props: {} },
20
- __experimentalProductCard: { props: {} },
21
- },
7
+ const override: SectionOverride = {
8
+ section: SECTION,
22
9
  }
23
10
 
24
- export default overrides
11
+ export { override }
@@ -4,13 +4,8 @@ import { SectionOverride } from 'src/typings/overrides'
4
4
 
5
5
  const SECTION = 'ProductShelf' as const
6
6
 
7
- const overrides: SectionOverride[typeof SECTION] = {
8
- name: SECTION,
9
- components: {
10
- ProductShelf: { props: {} },
11
- __experimentalCarousel: { props: {} },
12
- __experimentalProductCard: { props: {} },
13
- },
7
+ const override: SectionOverride = {
8
+ section: SECTION,
14
9
  }
15
10
 
16
- export default overrides
11
+ export { override }
@@ -4,13 +4,8 @@ import { SectionOverride } from 'src/typings/overrides'
4
4
 
5
5
  const SECTION = 'RegionBar' as const
6
6
 
7
- const overrides: SectionOverride[typeof SECTION] = {
8
- name: SECTION,
9
- components: {
10
- RegionBar: { props: {} },
11
- LocationIcon: { props: {} },
12
- ButtonIcon: { props: {} },
13
- },
7
+ const override: SectionOverride = {
8
+ section: SECTION,
14
9
  }
15
10
 
16
- export default overrides
11
+ export { override }
@@ -0,0 +1,40 @@
1
+ export type DefaultSectionComponentsDefinitions<
2
+ T extends SectionOverrideDefinition
3
+ > = Record<keyof T['components'], React.ComponentType>
4
+
5
+ export type SectionOverrideDefinition<
6
+ SectionName extends string = string,
7
+ OC extends Record<string, ComponentOverrideDefinition<any, any>> = Record<
8
+ string,
9
+ ComponentOverrideDefinition<any, any>
10
+ >
11
+ > = {
12
+ section: SectionName
13
+ components?: Partial<Prettify<OC>>
14
+ }
15
+
16
+ export type ComponentOverrideDefinition<ComponentProps, Props> =
17
+ | {
18
+ Component?: never
19
+ props: Partial<Props>
20
+ }
21
+ | {
22
+ Component: React.ComponentType<ComponentProps>
23
+ props?: never
24
+ }
25
+
26
+ /** This type makes complex types (usually generics) easier to read */
27
+ export type Prettify<T> = {
28
+ [K in keyof T]: T[K]
29
+ } & {}
30
+
31
+ // Taken from https://dev.to/lucianbc/union-type-merging-in-typescript-9al
32
+ type AllKeys<T> = T extends any ? keyof T : never
33
+
34
+ type PickType<T, K extends AllKeys<T>> = T extends { [k in K]?: any }
35
+ ? T[K]
36
+ : undefined
37
+
38
+ export type Merge<T> = {
39
+ [k in AllKeys<T>]: PickType<T, k>
40
+ }
@@ -0,0 +1,267 @@
1
+ import type { PropsWithChildren } from 'react'
2
+ import type {
3
+ AlertProps,
4
+ BannerTextContentProps,
5
+ BannerTextProps,
6
+ BreadcrumbProps,
7
+ ButtonProps,
8
+ DiscountBadgeProps,
9
+ EmptyStateProps,
10
+ HeroHeaderProps,
11
+ HeroImageProps,
12
+ HeroProps,
13
+ IconButtonProps,
14
+ IconProps,
15
+ ImageGalleryProps,
16
+ ImageZoomProps,
17
+ InputFieldProps,
18
+ LinkButtonProps,
19
+ NavbarButtonsProps,
20
+ NavbarHeaderProps,
21
+ NavbarLinksListProps,
22
+ NavbarLinksProps,
23
+ NavbarProps,
24
+ NavbarRowProps,
25
+ NavbarSliderContentProps,
26
+ NavbarSliderFooterProps,
27
+ NavbarSliderHeaderProps,
28
+ NavbarSliderProps,
29
+ PriceProps,
30
+ ProductShelfProps,
31
+ ProductTitleProps,
32
+ QuantitySelectorProps,
33
+ RegionBarProps,
34
+ ShippingSimulationProps,
35
+ SkeletonProps,
36
+ SkuSelectorProps,
37
+ } from '@faststore/ui'
38
+
39
+ import type {
40
+ ComponentOverrideDefinition,
41
+ SectionOverrideDefinition,
42
+ } from './overrideDefinitionUtils'
43
+
44
+ export type SectionOverride =
45
+ | AlertOverrideDefinition
46
+ | BannerTextOverrideDefinition
47
+ | BreadcrumbOverrideDefinition
48
+ | EmptyStateOverrideDefinition
49
+ | HeroOverrideDefinition
50
+ | NavbarOverrideDefinition
51
+ | NewsletterOverrideDefinition
52
+ | ProductDetailsOverrideDefinition
53
+ | ProductGalleryOverrideDefinition
54
+ | ProductShelfOverrideDefinition
55
+ | RegionBarOverrideDefinition
56
+
57
+ /**
58
+ * Originally, these types were defined in their respective Overrides file
59
+ * For some reason, typescript wouldn't interpret SectionOverride correctly when
60
+ * defining it by importing each of the SectionOverrideDefinitions and would set it as 'any'
61
+ *
62
+ * For some reason, defining them in the same file as SectionOverride seems to fix the issue.
63
+ * Consider that before moving them elsewhere and test it on the starter as well.
64
+ */
65
+ export type AlertOverrideDefinition = SectionOverrideDefinition<
66
+ 'Alert',
67
+ {
68
+ Alert: ComponentOverrideDefinition<AlertProps, Omit<AlertProps, 'onClose'>>
69
+ Icon: ComponentOverrideDefinition<IconProps, IconProps>
70
+ }
71
+ >
72
+
73
+ export type BannerTextOverrideDefinition = SectionOverrideDefinition<
74
+ 'BannerText',
75
+ {
76
+ BannerText: ComponentOverrideDefinition<BannerTextProps, BannerTextProps>
77
+ BannerTextContent: ComponentOverrideDefinition<
78
+ BannerTextContentProps,
79
+ BannerTextContentProps
80
+ >
81
+ }
82
+ >
83
+
84
+ export type BreadcrumbOverrideDefinition = SectionOverrideDefinition<
85
+ 'Breadcrumb',
86
+ {
87
+ Breadcrumb: ComponentOverrideDefinition<BreadcrumbProps, BreadcrumbProps>
88
+ Icon: ComponentOverrideDefinition<IconProps, IconProps>
89
+ }
90
+ >
91
+
92
+ export type EmptyStateOverrideDefinition = SectionOverrideDefinition<
93
+ 'EmptyState',
94
+ {
95
+ EmptyState: ComponentOverrideDefinition<
96
+ PropsWithChildren<EmptyStateProps>,
97
+ EmptyStateProps
98
+ >
99
+ }
100
+ >
101
+
102
+ export type HeroOverrideDefinition = SectionOverrideDefinition<
103
+ 'Hero',
104
+ {
105
+ Hero: ComponentOverrideDefinition<HeroProps, HeroProps>
106
+ HeroImage: ComponentOverrideDefinition<HeroImageProps, HeroImageProps>
107
+ HeroHeader: ComponentOverrideDefinition<HeroHeaderProps, HeroHeaderProps>
108
+ }
109
+ >
110
+
111
+ export type NavbarOverrideDefinition = SectionOverrideDefinition<
112
+ 'Navbar',
113
+ {
114
+ Navbar: ComponentOverrideDefinition<NavbarProps, NavbarProps>
115
+ NavbarLinks: ComponentOverrideDefinition<NavbarLinksProps, NavbarLinksProps>
116
+ NavbarLinksList: ComponentOverrideDefinition<
117
+ NavbarLinksListProps,
118
+ NavbarLinksListProps
119
+ >
120
+ NavbarSlider: ComponentOverrideDefinition<
121
+ NavbarSliderProps,
122
+ NavbarSliderProps
123
+ >
124
+ NavbarSliderHeader: ComponentOverrideDefinition<
125
+ NavbarSliderHeaderProps,
126
+ NavbarSliderHeaderProps
127
+ >
128
+ NavbarSliderContent: ComponentOverrideDefinition<
129
+ NavbarSliderContentProps,
130
+ NavbarSliderContentProps
131
+ >
132
+ NavbarSliderFooter: ComponentOverrideDefinition<
133
+ NavbarSliderFooterProps,
134
+ NavbarSliderFooterProps
135
+ >
136
+ NavbarHeader: ComponentOverrideDefinition<
137
+ NavbarHeaderProps,
138
+ NavbarHeaderProps
139
+ >
140
+ NavbarRow: ComponentOverrideDefinition<NavbarRowProps, NavbarRowProps>
141
+ NavbarButtons: ComponentOverrideDefinition<
142
+ NavbarButtonsProps,
143
+ NavbarButtonsProps
144
+ >
145
+ IconButton: ComponentOverrideDefinition<
146
+ IconButtonProps,
147
+ Omit<IconButtonProps, 'onClick'>
148
+ >
149
+ }
150
+ >
151
+
152
+ export type NewsletterOverrideDefinition = SectionOverrideDefinition<
153
+ 'Newsletter',
154
+ {
155
+ ToastIconSuccess: ComponentOverrideDefinition<IconProps, IconProps>
156
+ ToastIconError: ComponentOverrideDefinition<IconProps, IconProps>
157
+ HeaderIcon: ComponentOverrideDefinition<IconProps, IconProps>
158
+ InputFieldName: ComponentOverrideDefinition<
159
+ InputFieldProps,
160
+ Omit<InputFieldProps, 'inputRef'>
161
+ >
162
+ InputFieldEmail: ComponentOverrideDefinition<
163
+ InputFieldProps,
164
+ Omit<InputFieldProps, 'inputRef'>
165
+ >
166
+ Button: ComponentOverrideDefinition<ButtonProps, ButtonProps>
167
+ }
168
+ >
169
+
170
+ export type ProductDetailsOverrideDefinition = SectionOverrideDefinition<
171
+ 'ProductDetails',
172
+ {
173
+ ProductTitle: ComponentOverrideDefinition<
174
+ ProductTitleProps,
175
+ ProductTitleProps
176
+ >
177
+ DiscountBadge: ComponentOverrideDefinition<
178
+ DiscountBadgeProps,
179
+ Omit<DiscountBadgeProps, 'listPrice' | 'spotPrice'>
180
+ >
181
+ BuyButton: ComponentOverrideDefinition<ButtonProps, ButtonProps>
182
+ Icon: ComponentOverrideDefinition<IconProps, IconProps>
183
+ Price: ComponentOverrideDefinition<
184
+ PriceProps,
185
+ Omit<PriceProps, 'value' | 'data-value'>
186
+ >
187
+ QuantitySelector: ComponentOverrideDefinition<
188
+ QuantitySelectorProps,
189
+ Omit<QuantitySelectorProps, 'onChange'>
190
+ >
191
+ SkuSelector: ComponentOverrideDefinition<SkuSelectorProps, SkuSelectorProps>
192
+ ShippingSimulation: ComponentOverrideDefinition<
193
+ ShippingSimulationProps,
194
+ ShippingSimulationProps
195
+ >
196
+ ImageGallery: ComponentOverrideDefinition<
197
+ ImageGalleryProps,
198
+ ImageGalleryProps
199
+ >
200
+ ImageZoom: ComponentOverrideDefinition<ImageZoomProps, ImageZoomProps>
201
+ __experimentalImageGalleryImage: ComponentOverrideDefinition<any, any>
202
+ __experimentalImageGallery: ComponentOverrideDefinition<any, any>
203
+ __experimentalShippingSimulation: ComponentOverrideDefinition<any, any>
204
+ }
205
+ >
206
+
207
+ export type ProductGalleryOverrideDefinition = SectionOverrideDefinition<
208
+ 'ProductGallery',
209
+ {
210
+ MobileFilterButton: ComponentOverrideDefinition<
211
+ ButtonProps,
212
+ Omit<ButtonProps, 'onClick'>
213
+ >
214
+ FilterIcon: ComponentOverrideDefinition<IconProps, IconProps>
215
+ PrevIcon: ComponentOverrideDefinition<IconProps, IconProps>
216
+ ResultsCountSkeleton: ComponentOverrideDefinition<
217
+ SkeletonProps,
218
+ Omit<SkeletonProps, 'loading'>
219
+ >
220
+ SortSkeleton: ComponentOverrideDefinition<
221
+ SkeletonProps,
222
+ Omit<SkeletonProps, 'loading'>
223
+ >
224
+ FilterButtonSkeleton: ComponentOverrideDefinition<
225
+ SkeletonProps,
226
+ Omit<SkeletonProps, 'loading'>
227
+ >
228
+ LinkButtonPrev: ComponentOverrideDefinition<
229
+ LinkButtonProps,
230
+ Omit<LinkButtonProps, 'onClick' | 'href'>
231
+ >
232
+ LinkButtonNext: ComponentOverrideDefinition<
233
+ LinkButtonProps,
234
+ Omit<LinkButtonProps, 'onClick' | 'href'>
235
+ >
236
+ __experimentalFilterDesktop: ComponentOverrideDefinition<any, any>
237
+ __experimentalFilterSlider: ComponentOverrideDefinition<any, any>
238
+ __experimentalProductCard: ComponentOverrideDefinition<any, any>
239
+ }
240
+ >
241
+
242
+ export type ProductShelfOverrideDefinition = SectionOverrideDefinition<
243
+ 'ProductShelf',
244
+ {
245
+ ProductShelf: ComponentOverrideDefinition<
246
+ ProductShelfProps,
247
+ ProductShelfProps
248
+ >
249
+ __experimentalCarousel: ComponentOverrideDefinition<any, any>
250
+ __experimentalProductCard: ComponentOverrideDefinition<
251
+ any,
252
+ Omit<any, 'key' | 'product' | 'index'>
253
+ >
254
+ }
255
+ >
256
+
257
+ export type RegionBarOverrideDefinition = SectionOverrideDefinition<
258
+ 'RegionBar',
259
+ {
260
+ RegionBar: ComponentOverrideDefinition<
261
+ RegionBarProps,
262
+ Omit<RegionBarProps, 'onButtonClick' | 'postalCode'>
263
+ >
264
+ LocationIcon: ComponentOverrideDefinition<IconProps, IconProps>
265
+ ButtonIcon: ComponentOverrideDefinition<IconProps, IconProps>
266
+ }
267
+ >
@@ -0,0 +1,53 @@
1
+ import type {
2
+ DefaultSectionComponentsDefinitions,
3
+ ComponentOverrideDefinition,
4
+ Merge,
5
+ } from 'src/typings/overrideDefinitionUtils'
6
+
7
+ import type { SectionOverride } from 'src/typings/overrides'
8
+
9
+ export type GetSectionOverridesReturn<SO extends SectionOverride> = {
10
+ [Key in keyof SO['components']]: Merge<SO['components'][Key]>
11
+ }
12
+
13
+ export function getSectionOverrides<SO extends SectionOverride>(
14
+ defaultComponents: DefaultSectionComponentsDefinitions<SO>,
15
+ override: SO
16
+ ): GetSectionOverridesReturn<SO> {
17
+ const overriddenComponents = {} as GetSectionOverridesReturn<SO>
18
+
19
+ Object.entries(defaultComponents).forEach(([key, value]) => {
20
+ const componentOverride:
21
+ | ComponentOverrideDefinition<unknown, unknown>
22
+ | undefined = override.components?.[key]
23
+
24
+ if (!componentOverride) {
25
+ overriddenComponents[key] = {
26
+ Component: value,
27
+ props: {},
28
+ }
29
+
30
+ return
31
+ }
32
+
33
+ if (componentOverride.Component && componentOverride.props) {
34
+ console.warn(
35
+ `Mixed use of Component and props overrides detected. Defaulting to Component override: component ${key} in the ${override.section} section.`
36
+ )
37
+ }
38
+
39
+ if (componentOverride.Component) {
40
+ overriddenComponents[key] = {
41
+ Component: componentOverride.Component,
42
+ props: {},
43
+ }
44
+ } else {
45
+ overriddenComponents[key] = {
46
+ Component: value,
47
+ props: componentOverride.props ?? {},
48
+ }
49
+ }
50
+ })
51
+
52
+ return overriddenComponents
53
+ }