medusa-storefront-data 2.3.0 → 2.4.0

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 (269) hide show
  1. package/HOMEPAGE_CONFIG.md +99 -0
  2. package/dist/segment-data/default-page-input.json +191 -0
  3. package/dist/src/config.d.ts.map +1 -0
  4. package/dist/src/cookies.d.ts.map +1 -0
  5. package/dist/src/edge.d.ts.map +1 -0
  6. package/dist/src/middleware.d.ts.map +1 -0
  7. package/dist/src/server/cart.d.ts.map +1 -0
  8. package/dist/src/server/categories.d.ts.map +1 -0
  9. package/dist/src/server/collections.d.ts.map +1 -0
  10. package/dist/src/server/config-merge.d.ts +3 -0
  11. package/dist/src/server/config-merge.d.ts.map +1 -0
  12. package/dist/src/server/config-merge.js +31 -0
  13. package/dist/src/server/contact.d.ts.map +1 -0
  14. package/dist/src/server/customer-registration.d.ts.map +1 -0
  15. package/dist/src/server/customer.d.ts.map +1 -0
  16. package/dist/src/server/dynamic-config.d.ts +240 -0
  17. package/dist/src/server/dynamic-config.d.ts.map +1 -0
  18. package/dist/src/server/dynamic-config.js +703 -0
  19. package/dist/src/server/fulfillment.d.ts.map +1 -0
  20. package/dist/src/server/guest.d.ts.map +1 -0
  21. package/dist/src/server/home-sections/about-brand.d.ts +9 -0
  22. package/dist/src/server/home-sections/about-brand.d.ts.map +1 -0
  23. package/dist/src/server/home-sections/about-brand.js +9 -0
  24. package/dist/src/server/home-sections/baptism-picks.d.ts +10 -0
  25. package/dist/src/server/home-sections/baptism-picks.d.ts.map +1 -0
  26. package/dist/src/server/home-sections/baptism-picks.js +27 -0
  27. package/dist/src/server/home-sections/baptism.d.ts +13 -0
  28. package/dist/src/server/home-sections/baptism.d.ts.map +1 -0
  29. package/dist/src/server/home-sections/baptism.js +43 -0
  30. package/dist/src/server/home-sections/blog-posts.d.ts +9 -0
  31. package/dist/src/server/home-sections/blog-posts.d.ts.map +1 -0
  32. package/dist/src/server/home-sections/blog-posts.js +9 -0
  33. package/dist/src/server/home-sections/brand-marquee.d.ts +8 -0
  34. package/dist/src/server/home-sections/brand-marquee.d.ts.map +1 -0
  35. package/dist/src/server/home-sections/brand-marquee.js +7 -0
  36. package/dist/src/server/home-sections/brand-pillars.d.ts +9 -0
  37. package/dist/src/server/home-sections/brand-pillars.d.ts.map +1 -0
  38. package/dist/src/server/home-sections/brand-pillars.js +9 -0
  39. package/dist/src/server/home-sections/category-pills.d.ts +9 -0
  40. package/dist/src/server/home-sections/category-pills.d.ts.map +1 -0
  41. package/dist/src/server/home-sections/category-pills.js +19 -0
  42. package/dist/src/server/home-sections/celebrity-trust.d.ts +12 -0
  43. package/dist/src/server/home-sections/celebrity-trust.d.ts.map +1 -0
  44. package/dist/src/server/home-sections/celebrity-trust.js +27 -0
  45. package/dist/src/server/home-sections/features.d.ts +9 -0
  46. package/dist/src/server/home-sections/features.d.ts.map +1 -0
  47. package/dist/src/server/home-sections/features.js +9 -0
  48. package/dist/src/server/home-sections/hero.d.ts +9 -0
  49. package/dist/src/server/home-sections/hero.d.ts.map +1 -0
  50. package/dist/src/server/home-sections/hero.js +9 -0
  51. package/dist/src/server/home-sections/instagram-posts.d.ts +9 -0
  52. package/dist/src/server/home-sections/instagram-posts.d.ts.map +1 -0
  53. package/dist/src/server/home-sections/instagram-posts.js +9 -0
  54. package/dist/src/server/home-sections/loved-by-moms.d.ts +12 -0
  55. package/dist/src/server/home-sections/loved-by-moms.d.ts.map +1 -0
  56. package/dist/src/server/home-sections/loved-by-moms.js +20 -0
  57. package/dist/src/server/home-sections/luxe-favourites.d.ts +11 -0
  58. package/dist/src/server/home-sections/luxe-favourites.d.ts.map +1 -0
  59. package/dist/src/server/home-sections/luxe-favourites.js +19 -0
  60. package/dist/src/server/home-sections/new-arrivals-classic.d.ts +8 -0
  61. package/dist/src/server/home-sections/new-arrivals-classic.d.ts.map +1 -0
  62. package/dist/src/server/home-sections/new-arrivals-classic.js +10 -0
  63. package/dist/src/server/home-sections/new-arrivals.d.ts +12 -0
  64. package/dist/src/server/home-sections/new-arrivals.d.ts.map +1 -0
  65. package/dist/src/server/home-sections/new-arrivals.js +28 -0
  66. package/dist/src/server/home-sections/promo-announcements.d.ts +7 -0
  67. package/dist/src/server/home-sections/promo-announcements.d.ts.map +1 -0
  68. package/dist/src/server/home-sections/promo-announcements.js +7 -0
  69. package/dist/src/server/home-sections/promo-countdown.d.ts +6 -0
  70. package/dist/src/server/home-sections/promo-countdown.d.ts.map +1 -0
  71. package/dist/src/server/home-sections/promo-countdown.js +5 -0
  72. package/dist/src/server/home-sections/shared.d.ts +10 -0
  73. package/dist/src/server/home-sections/shared.d.ts.map +1 -0
  74. package/dist/src/server/home-sections/shared.js +29 -0
  75. package/dist/src/server/home-sections/shop-by-age.d.ts +9 -0
  76. package/dist/src/server/home-sections/shop-by-age.d.ts.map +1 -0
  77. package/dist/src/server/home-sections/shop-by-age.js +17 -0
  78. package/dist/src/server/home-sections/shop-by-category.d.ts +10 -0
  79. package/dist/src/server/home-sections/shop-by-category.d.ts.map +1 -0
  80. package/dist/src/server/home-sections/shop-by-category.js +17 -0
  81. package/dist/src/server/home-sections/testimonials.d.ts +9 -0
  82. package/dist/src/server/home-sections/testimonials.d.ts.map +1 -0
  83. package/dist/src/server/home-sections/testimonials.js +9 -0
  84. package/dist/src/server/home-sections/theme-dresses.d.ts +12 -0
  85. package/dist/src/server/home-sections/theme-dresses.d.ts.map +1 -0
  86. package/dist/src/server/home-sections/theme-dresses.js +27 -0
  87. package/dist/src/server/home-sections/video-stories.d.ts +9 -0
  88. package/dist/src/server/home-sections/video-stories.d.ts.map +1 -0
  89. package/dist/src/server/home-sections/video-stories.js +9 -0
  90. package/dist/src/server/home-sections/why-choose-us.d.ts +9 -0
  91. package/dist/src/server/home-sections/why-choose-us.d.ts.map +1 -0
  92. package/dist/src/server/home-sections/why-choose-us.js +9 -0
  93. package/dist/src/server/home.d.ts +62 -0
  94. package/dist/src/server/home.d.ts.map +1 -0
  95. package/dist/{server → src/server}/home.js +29 -31
  96. package/dist/src/server/homepage-config.types.d.ts +274 -0
  97. package/dist/src/server/homepage-config.types.d.ts.map +1 -0
  98. package/dist/src/server/homepage-config.types.js +33 -0
  99. package/dist/{server → src/server}/homepage-section-defaults.d.ts +35 -2
  100. package/dist/src/server/homepage-section-defaults.d.ts.map +1 -0
  101. package/dist/{server → src/server}/homepage-section-defaults.js +41 -2
  102. package/dist/{server → src/server}/index.d.ts +2 -0
  103. package/dist/src/server/index.d.ts.map +1 -0
  104. package/dist/{server → src/server}/index.js +2 -0
  105. package/dist/src/server/locale-actions.d.ts.map +1 -0
  106. package/dist/src/server/locales.d.ts.map +1 -0
  107. package/dist/src/server/notifications.d.ts.map +1 -0
  108. package/dist/src/server/onboarding.d.ts.map +1 -0
  109. package/dist/src/server/orders.d.ts.map +1 -0
  110. package/dist/src/server/page-input.d.ts +19 -0
  111. package/dist/src/server/page-input.d.ts.map +1 -0
  112. package/dist/src/server/page-input.js +40 -0
  113. package/dist/src/server/payment-details.d.ts.map +1 -0
  114. package/dist/src/server/payment.d.ts.map +1 -0
  115. package/dist/src/server/pincode.d.ts.map +1 -0
  116. package/dist/src/server/products.d.ts.map +1 -0
  117. package/dist/src/server/regions.d.ts.map +1 -0
  118. package/dist/src/server/resolve-home-segment-data.d.ts +25 -0
  119. package/dist/src/server/resolve-home-segment-data.d.ts.map +1 -0
  120. package/dist/src/server/resolve-home-segment-data.js +20 -0
  121. package/dist/src/server/returns.d.ts.map +1 -0
  122. package/dist/src/server/shoppable-looks.d.ts +17 -0
  123. package/dist/src/server/shoppable-looks.d.ts.map +1 -0
  124. package/dist/src/server/shoppable-looks.js +136 -0
  125. package/dist/src/server/swaps.d.ts.map +1 -0
  126. package/dist/src/server/variants.d.ts.map +1 -0
  127. package/dist/src/server/wishlist.d.ts.map +1 -0
  128. package/dist/src/util/get-locale-header.d.ts.map +1 -0
  129. package/dist/src/util/medusa-error.d.ts.map +1 -0
  130. package/dist/src/util/revalidate-cart.d.ts.map +1 -0
  131. package/dist/src/util/sort-products.d.ts.map +1 -0
  132. package/dist/src/util/store-client.d.ts.map +1 -0
  133. package/homepage-config.example.json +209 -0
  134. package/homepage-sections.example.json +55 -0
  135. package/package.json +121 -2
  136. package/segment-data/default-page-input.json +191 -0
  137. package/src/server/config-merge.ts +31 -0
  138. package/src/server/dynamic-config.ts +620 -508
  139. package/src/server/home-sections/about-brand.ts +24 -0
  140. package/src/server/home-sections/baptism-picks.ts +46 -0
  141. package/src/server/home-sections/baptism.ts +64 -0
  142. package/src/server/home-sections/blog-posts.ts +23 -0
  143. package/src/server/home-sections/brand-marquee.ts +17 -0
  144. package/src/server/home-sections/brand-pillars.ts +23 -0
  145. package/src/server/home-sections/category-pills.ts +32 -0
  146. package/src/server/home-sections/celebrity-trust.ts +42 -0
  147. package/src/server/home-sections/features.ts +23 -0
  148. package/src/server/home-sections/hero.ts +24 -0
  149. package/src/server/home-sections/instagram-posts.ts +23 -0
  150. package/src/server/home-sections/loved-by-moms.ts +34 -0
  151. package/src/server/home-sections/luxe-favourites.ts +30 -0
  152. package/src/server/home-sections/new-arrivals-classic.ts +21 -0
  153. package/src/server/home-sections/new-arrivals.ts +47 -0
  154. package/src/server/home-sections/promo-announcements.ts +17 -0
  155. package/src/server/home-sections/promo-countdown.ts +15 -0
  156. package/src/server/home-sections/shared.ts +44 -0
  157. package/src/server/home-sections/shop-by-age.ts +26 -0
  158. package/src/server/home-sections/shop-by-category.ts +28 -0
  159. package/src/server/home-sections/testimonials.ts +23 -0
  160. package/src/server/home-sections/theme-dresses.ts +49 -0
  161. package/src/server/home-sections/video-stories.ts +23 -0
  162. package/src/server/home-sections/why-choose-us.ts +23 -0
  163. package/src/server/home.ts +68 -54
  164. package/src/server/homepage-config.types.ts +335 -0
  165. package/src/server/homepage-section-defaults.ts +41 -2
  166. package/src/server/index.ts +2 -0
  167. package/src/server/page-input.ts +64 -0
  168. package/src/server/resolve-home-segment-data.ts +63 -0
  169. package/src/server/shoppable-looks.ts +178 -0
  170. package/dist/config.d.ts.map +0 -1
  171. package/dist/cookies.d.ts.map +0 -1
  172. package/dist/edge.d.ts.map +0 -1
  173. package/dist/middleware.d.ts.map +0 -1
  174. package/dist/server/cart.d.ts.map +0 -1
  175. package/dist/server/categories.d.ts.map +0 -1
  176. package/dist/server/collections.d.ts.map +0 -1
  177. package/dist/server/contact.d.ts.map +0 -1
  178. package/dist/server/customer-registration.d.ts.map +0 -1
  179. package/dist/server/customer.d.ts.map +0 -1
  180. package/dist/server/dynamic-config.d.ts +0 -202
  181. package/dist/server/dynamic-config.d.ts.map +0 -1
  182. package/dist/server/dynamic-config.js +0 -675
  183. package/dist/server/fulfillment.d.ts.map +0 -1
  184. package/dist/server/guest.d.ts.map +0 -1
  185. package/dist/server/home.d.ts +0 -42
  186. package/dist/server/home.d.ts.map +0 -1
  187. package/dist/server/homepage-section-defaults.d.ts.map +0 -1
  188. package/dist/server/index.d.ts.map +0 -1
  189. package/dist/server/locale-actions.d.ts.map +0 -1
  190. package/dist/server/locales.d.ts.map +0 -1
  191. package/dist/server/notifications.d.ts.map +0 -1
  192. package/dist/server/onboarding.d.ts.map +0 -1
  193. package/dist/server/orders.d.ts.map +0 -1
  194. package/dist/server/payment-details.d.ts.map +0 -1
  195. package/dist/server/payment.d.ts.map +0 -1
  196. package/dist/server/pincode.d.ts.map +0 -1
  197. package/dist/server/products.d.ts.map +0 -1
  198. package/dist/server/regions.d.ts.map +0 -1
  199. package/dist/server/returns.d.ts.map +0 -1
  200. package/dist/server/swaps.d.ts.map +0 -1
  201. package/dist/server/variants.d.ts.map +0 -1
  202. package/dist/server/wishlist.d.ts.map +0 -1
  203. package/dist/util/get-locale-header.d.ts.map +0 -1
  204. package/dist/util/medusa-error.d.ts.map +0 -1
  205. package/dist/util/revalidate-cart.d.ts.map +0 -1
  206. package/dist/util/sort-products.d.ts.map +0 -1
  207. package/dist/util/store-client.d.ts.map +0 -1
  208. /package/dist/{config.d.ts → src/config.d.ts} +0 -0
  209. /package/dist/{config.js → src/config.js} +0 -0
  210. /package/dist/{cookies.d.ts → src/cookies.d.ts} +0 -0
  211. /package/dist/{cookies.js → src/cookies.js} +0 -0
  212. /package/dist/{edge.d.ts → src/edge.d.ts} +0 -0
  213. /package/dist/{edge.js → src/edge.js} +0 -0
  214. /package/dist/{middleware.d.ts → src/middleware.d.ts} +0 -0
  215. /package/dist/{middleware.js → src/middleware.js} +0 -0
  216. /package/dist/{server → src/server}/cart.d.ts +0 -0
  217. /package/dist/{server → src/server}/cart.js +0 -0
  218. /package/dist/{server → src/server}/categories.d.ts +0 -0
  219. /package/dist/{server → src/server}/categories.js +0 -0
  220. /package/dist/{server → src/server}/collections.d.ts +0 -0
  221. /package/dist/{server → src/server}/collections.js +0 -0
  222. /package/dist/{server → src/server}/contact.d.ts +0 -0
  223. /package/dist/{server → src/server}/contact.js +0 -0
  224. /package/dist/{server → src/server}/customer-registration.d.ts +0 -0
  225. /package/dist/{server → src/server}/customer-registration.js +0 -0
  226. /package/dist/{server → src/server}/customer.d.ts +0 -0
  227. /package/dist/{server → src/server}/customer.js +0 -0
  228. /package/dist/{server → src/server}/fulfillment.d.ts +0 -0
  229. /package/dist/{server → src/server}/fulfillment.js +0 -0
  230. /package/dist/{server → src/server}/guest.d.ts +0 -0
  231. /package/dist/{server → src/server}/guest.js +0 -0
  232. /package/dist/{server → src/server}/locale-actions.d.ts +0 -0
  233. /package/dist/{server → src/server}/locale-actions.js +0 -0
  234. /package/dist/{server → src/server}/locales.d.ts +0 -0
  235. /package/dist/{server → src/server}/locales.js +0 -0
  236. /package/dist/{server → src/server}/notifications.d.ts +0 -0
  237. /package/dist/{server → src/server}/notifications.js +0 -0
  238. /package/dist/{server → src/server}/onboarding.d.ts +0 -0
  239. /package/dist/{server → src/server}/onboarding.js +0 -0
  240. /package/dist/{server → src/server}/orders.d.ts +0 -0
  241. /package/dist/{server → src/server}/orders.js +0 -0
  242. /package/dist/{server → src/server}/payment-details.d.ts +0 -0
  243. /package/dist/{server → src/server}/payment-details.js +0 -0
  244. /package/dist/{server → src/server}/payment.d.ts +0 -0
  245. /package/dist/{server → src/server}/payment.js +0 -0
  246. /package/dist/{server → src/server}/pincode.d.ts +0 -0
  247. /package/dist/{server → src/server}/pincode.js +0 -0
  248. /package/dist/{server → src/server}/products.d.ts +0 -0
  249. /package/dist/{server → src/server}/products.js +0 -0
  250. /package/dist/{server → src/server}/regions.d.ts +0 -0
  251. /package/dist/{server → src/server}/regions.js +0 -0
  252. /package/dist/{server → src/server}/returns.d.ts +0 -0
  253. /package/dist/{server → src/server}/returns.js +0 -0
  254. /package/dist/{server → src/server}/swaps.d.ts +0 -0
  255. /package/dist/{server → src/server}/swaps.js +0 -0
  256. /package/dist/{server → src/server}/variants.d.ts +0 -0
  257. /package/dist/{server → src/server}/variants.js +0 -0
  258. /package/dist/{server → src/server}/wishlist.d.ts +0 -0
  259. /package/dist/{server → src/server}/wishlist.js +0 -0
  260. /package/dist/{util → src/util}/get-locale-header.d.ts +0 -0
  261. /package/dist/{util → src/util}/get-locale-header.js +0 -0
  262. /package/dist/{util → src/util}/medusa-error.d.ts +0 -0
  263. /package/dist/{util → src/util}/medusa-error.js +0 -0
  264. /package/dist/{util → src/util}/revalidate-cart.d.ts +0 -0
  265. /package/dist/{util → src/util}/revalidate-cart.js +0 -0
  266. /package/dist/{util → src/util}/sort-products.d.ts +0 -0
  267. /package/dist/{util → src/util}/sort-products.js +0 -0
  268. /package/dist/{util → src/util}/store-client.d.ts +0 -0
  269. /package/dist/{util → src/util}/store-client.js +0 -0
@@ -0,0 +1,17 @@
1
+ import "server-only";
2
+ import { HttpTypes } from "@medusajs/types";
3
+ import type { HomepageConfig } from "./homepage-config.types";
4
+ export type ShoppableLookConfig = {
5
+ image: string;
6
+ productIds: string[];
7
+ productHandles: string[];
8
+ };
9
+ export type ShoppableLook = {
10
+ id: string;
11
+ image: string;
12
+ products: HttpTypes.StoreProduct[];
13
+ };
14
+ export declare function readShoppableLooksBlock(block: unknown): ShoppableLookConfig[];
15
+ export declare function looksFromProducts(products: HttpTypes.StoreProduct[]): ShoppableLook[];
16
+ export declare function getBaptismPicksLooks(countryCode: string, fallbackProducts: HttpTypes.StoreProduct[], pageInput?: HomepageConfig | null): Promise<ShoppableLook[]>;
17
+ //# sourceMappingURL=shoppable-looks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shoppable-looks.d.ts","sourceRoot":"","sources":["../../../src/server/shoppable-looks.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAA;AAEpB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAG3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAI7D,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,SAAS,CAAC,YAAY,EAAE,CAAA;CACnC,CAAA;AAoCD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,EAAE,CAkB7E;AAoDD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,SAAS,CAAC,YAAY,EAAE,GACjC,aAAa,EAAE,CAgBjB;AAED,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,SAAS,CAAC,YAAY,EAAE,EAC1C,SAAS,CAAC,EAAE,cAAc,GAAG,IAAI,GAChC,OAAO,CAAC,aAAa,EAAE,CAAC,CA4B1B"}
@@ -0,0 +1,136 @@
1
+ import "server-only";
2
+ import { sdk } from "../config";
3
+ import { getRegion } from "./regions";
4
+ import { DEFAULT_HOMEPAGE_SECTIONS } from "./homepage-section-defaults";
5
+ import { getMergedSectionBlock } from "./dynamic-config";
6
+ function parseLookRow(row) {
7
+ const nested = (row.look ?? row["shop-look"] ?? row);
8
+ const image = String(nested.image ?? nested["look-image"] ?? nested.thumbnail ?? "").trim();
9
+ if (!image)
10
+ return null;
11
+ const idsRaw = nested["product-ids"] ?? nested.productIds ?? nested.products;
12
+ const handlesRaw = nested["product-handles"] ?? nested.productHandles ?? nested.handles;
13
+ const productIds = [];
14
+ const productHandles = [];
15
+ if (Array.isArray(idsRaw)) {
16
+ idsRaw.forEach((entry) => {
17
+ if (typeof entry === "string" && entry.trim())
18
+ productIds.push(entry.trim());
19
+ if (entry && typeof entry === "object") {
20
+ const id = entry.id ?? entry["product-id"];
21
+ if (typeof id === "string" && id.trim())
22
+ productIds.push(id.trim());
23
+ }
24
+ });
25
+ }
26
+ if (Array.isArray(handlesRaw)) {
27
+ handlesRaw.forEach((entry) => {
28
+ if (typeof entry === "string" && entry.trim())
29
+ productHandles.push(entry.trim());
30
+ if (entry && typeof entry === "object") {
31
+ const handle = entry.handle;
32
+ if (typeof handle === "string" && handle.trim())
33
+ productHandles.push(handle.trim());
34
+ }
35
+ });
36
+ }
37
+ return { image, productIds, productHandles };
38
+ }
39
+ export function readShoppableLooksBlock(block) {
40
+ if (!block || typeof block !== "object")
41
+ return [];
42
+ const row = block;
43
+ const raw = row.looks ??
44
+ row["shop-looks"] ??
45
+ row["looks-array"] ??
46
+ row["baptism-picks"] ??
47
+ [];
48
+ if (!Array.isArray(raw))
49
+ return [];
50
+ return raw
51
+ .map((item) => {
52
+ if (!item || typeof item !== "object")
53
+ return null;
54
+ return parseLookRow(item);
55
+ })
56
+ .filter((x) => x !== null);
57
+ }
58
+ async function fetchProductsForLook(countryCode, productIds, productHandles) {
59
+ const region = await getRegion(countryCode);
60
+ if (!region?.id)
61
+ return [];
62
+ const fields = "*thumbnail,*images,*variants,*variants.calculated_price,*options,*options.values";
63
+ const byId = new Map();
64
+ if (productIds.length > 0) {
65
+ const { products } = await sdk.store.product.list({ id: productIds, region_id: region.id, fields, limit: productIds.length }, {});
66
+ products.forEach((p) => {
67
+ if (p.id)
68
+ byId.set(p.id, p);
69
+ });
70
+ }
71
+ for (const handle of productHandles) {
72
+ if (byId.has(handle))
73
+ continue;
74
+ try {
75
+ const { products } = await sdk.store.product.list({ handle, region_id: region.id, fields, limit: 1 }, {});
76
+ const product = products?.[0];
77
+ if (product?.id)
78
+ byId.set(product.id, product);
79
+ }
80
+ catch {
81
+ /* skip */
82
+ }
83
+ }
84
+ const ordered = [];
85
+ for (const id of productIds) {
86
+ const p = byId.get(id);
87
+ if (p)
88
+ ordered.push(p);
89
+ }
90
+ for (const handle of productHandles) {
91
+ const p = [...byId.values()].find((x) => x.handle === handle);
92
+ if (p && !ordered.some((o) => o.id === p.id))
93
+ ordered.push(p);
94
+ }
95
+ return ordered;
96
+ }
97
+ export function looksFromProducts(products) {
98
+ return products
99
+ .map((product, index) => {
100
+ const image = product.metadata?.look_image ??
101
+ product.thumbnail ??
102
+ product.images?.[0]?.url ??
103
+ "";
104
+ if (!image)
105
+ return null;
106
+ return {
107
+ id: product.id ?? `look-${index}`,
108
+ image,
109
+ products: [product],
110
+ };
111
+ })
112
+ .filter((x) => x !== null);
113
+ }
114
+ export async function getBaptismPicksLooks(countryCode, fallbackProducts, pageInput) {
115
+ const block = getMergedSectionBlock("baptismPicks", pageInput);
116
+ let configs = readShoppableLooksBlock(block);
117
+ if (configs.length === 0) {
118
+ configs = readShoppableLooksBlock(DEFAULT_HOMEPAGE_SECTIONS.baptismPicks);
119
+ }
120
+ if (configs.length === 0) {
121
+ return looksFromProducts(fallbackProducts);
122
+ }
123
+ const looks = [];
124
+ for (let i = 0; i < configs.length; i++) {
125
+ const config = configs[i];
126
+ const products = await fetchProductsForLook(countryCode, config.productIds, config.productHandles);
127
+ if (products.length === 0)
128
+ continue;
129
+ looks.push({
130
+ id: `look-${i}`,
131
+ image: config.image,
132
+ products,
133
+ });
134
+ }
135
+ return looks.length > 0 ? looks : looksFromProducts(fallbackProducts);
136
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swaps.d.ts","sourceRoot":"","sources":["../../../src/server/swaps.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CACrC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,YAAY,eAAe,EAC3B,UAAU,QAAQ,KACjB,OAAO,CAAC,eAAe,CAsEzB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,GAAU,UAAU,MAAM,mEAoB/C,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variants.d.ts","sourceRoot":"","sources":["../../../src/server/variants.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAI3C,eAAO,MAAM,eAAe,GAC1B,YAAY,MAAM,KACjB,OAAO,CAAC,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAU9C,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wishlist.d.ts","sourceRoot":"","sources":["../../../src/server/wishlist.ts"],"names":[],"mappings":"AAOA,mEAAmE;AACnE,wBAAsB,WAAW,CAAC,cAAc,UAAO,EAAE,WAAW,CAAC,EAAE,MAAM;;;UAGF,OAAO,EAAE;;;;;GAoDnF"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-locale-header.d.ts","sourceRoot":"","sources":["../../../src/util/get-locale-header.ts"],"names":[],"mappings":"AAEA,wBAAsB,eAAe;;GAKpC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"medusa-error.d.ts","sourceRoot":"","sources":["../../../src/util/medusa-error.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,CAkBrD"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revalidate-cart.d.ts","sourceRoot":"","sources":["../../../src/util/revalidate-cart.ts"],"names":[],"mappings":"AAGA,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAMxD"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sort-products.d.ts","sourceRoot":"","sources":["../../../src/util/sort-products.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-client.d.ts","sourceRoot":"","sources":["../../../src/util/store-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAA;AACzE,OAAO,EAAuB,KAAK,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAqBxF;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAY/E;AAED,4CAA4C;AAC5C,eAAO,MAAM,yBAAyB,8BAAwB,CAAA;AAE9D,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAuB3F;AAED,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,wBAAwB,CAAC,CAMnC;AAED,wBAAsB,oBAAoB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAWnG"}
@@ -0,0 +1,209 @@
1
+ {
2
+ "_comment": "Paste under dynamic-config value as homepage-config. Omitted fields use medusa-storefront-data package defaults.",
3
+ "homepage-config": {
4
+ "logo": "/Logo.png",
5
+ "website-description": "Premium kids fashion for everyday wear and special occasions.",
6
+
7
+ "homepage-banner-array": [
8
+ {
9
+ "homepage-banner": {
10
+ "homepage-banner-image": "/banners/hero-1.jpg",
11
+ "homepage-banner-title": "New Collection",
12
+ "homepage-banner-subtitle": "Shop the latest styles",
13
+ "homepage-banner-description": "Discover outfits for every celebration.",
14
+ "homepage-banner-button-name": "Shop Now",
15
+ "homepage-banner-button-link": "/store"
16
+ }
17
+ }
18
+ ],
19
+
20
+ "promo-bar": {
21
+ "promo-text": "Free shipping on orders over $99",
22
+ "promo-code": "FREESHIP",
23
+ "promo-active": false
24
+ },
25
+
26
+ "contact-us": {
27
+ "contact-phone": "+1 000 000 0000",
28
+ "contact-email": "hello@yourstore.com",
29
+ "contact-address": "Your store address"
30
+ },
31
+
32
+ "social-links": [
33
+ {
34
+ "social-link": {
35
+ "social-platform-name": "Instagram",
36
+ "social-platform-icon": "/icons/instagram.svg",
37
+ "social-platform-url": "https://www.instagram.com/yourbrand/"
38
+ }
39
+ }
40
+ ],
41
+
42
+ "ratings": [
43
+ {
44
+ "text": "Beautiful quality and fast delivery.",
45
+ "name": "Happy Customer",
46
+ "rating": 5
47
+ }
48
+ ],
49
+
50
+ "sections": {
51
+ "promoAnnouncements": {
52
+ "messages": [
53
+ "Free shipping on orders over a threshold",
54
+ "Worldwide shipping available"
55
+ ]
56
+ },
57
+
58
+ "newArrivals": {
59
+ "title": "New Arrivals",
60
+ "subtitle": "Fresh styles just landed",
61
+ "variant": "grid"
62
+ },
63
+
64
+ "newArrivalsClassic": {
65
+ "title": "New Arrivals",
66
+ "subtitle": "Classic product preview layout",
67
+ "variant": "classic"
68
+ },
69
+
70
+ "promoCountdown": {
71
+ "code": "SAVE50",
72
+ "text": "Up to 50% off — shop your favourites before they're gone!",
73
+ "end-at": "2026-12-31T23:59:59.000Z",
74
+ "active": true,
75
+ "cta-label": "Shop Offers",
76
+ "cta-href": "/store"
77
+ },
78
+
79
+ "celebrityTrust": {
80
+ "title": "Trusted by Celebrities",
81
+ "text": "When the stars dress their little ones in our collections."
82
+ },
83
+
84
+ "luxeFavourites": {
85
+ "title": "Luxe Favourites"
86
+ },
87
+
88
+ "shopByCategory": {
89
+ "title": "Shop By Categories",
90
+ "description": "Browse by style and occasion"
91
+ },
92
+
93
+ "baptism": {
94
+ "title": "Baptism"
95
+ },
96
+
97
+ "baptismPicks": {
98
+ "title": "Baptism Picks",
99
+ "looks": [
100
+ {
101
+ "image": "https://your-cdn.com/looks/baptism-1.jpg",
102
+ "product-ids": ["prod_REPLACE_ME_1", "prod_REPLACE_ME_2"]
103
+ },
104
+ {
105
+ "image": "https://your-cdn.com/looks/baptism-2.jpg",
106
+ "product-handles": ["off-white-baptism-gown"]
107
+ }
108
+ ]
109
+ },
110
+
111
+ "themeDresses": {
112
+ "title": "Theme",
113
+ "description": "Dress her in a dreamy theme outfit for her birthday celebration"
114
+ },
115
+
116
+ "brandMarquee": {
117
+ "text": "est. 2012"
118
+ },
119
+
120
+ "aboutBrand": {
121
+ "eyebrow": "Who We Are",
122
+ "title": "Discover what makes us different",
123
+ "description": "We offer stylish, comfortable, and high-quality clothing for children.",
124
+ "readMoreHref": "/about",
125
+ "stats": [
126
+ { "label": "Visit us in store", "value": "Find a location" },
127
+ { "label": "Happy customers", "value": "150k+" },
128
+ { "label": "Products", "value": "3000+" }
129
+ ]
130
+ },
131
+
132
+ "testimonials": {
133
+ "title": "What Clients Talk About Us",
134
+ "description": "The Trust We've Earned",
135
+ "items": [
136
+ {
137
+ "text": "Your review text here.",
138
+ "name": "Customer Name",
139
+ "rating": 5
140
+ }
141
+ ]
142
+ },
143
+
144
+ "brandPillars": {
145
+ "title": "Why families choose us",
146
+ "pillars": [
147
+ {
148
+ "title": "Your favorite kids destination",
149
+ "description": "Trendy, high-quality outfits for little ones.",
150
+ "image": "/features/store.jpg"
151
+ }
152
+ ]
153
+ },
154
+
155
+ "instagramPosts": {
156
+ "title": "Follow Us on Instagram",
157
+ "handle": "yourbrand",
158
+ "profile-url": "https://www.instagram.com/yourbrand/",
159
+ "profile-image": "/Logo.png",
160
+ "posts": [
161
+ {
162
+ "image": "https://your-cdn.com/instagram/post-1.jpg",
163
+ "url": "https://www.instagram.com/p/EXAMPLE/"
164
+ }
165
+ ]
166
+ },
167
+
168
+ "features": {
169
+ "title": "Why shop with us",
170
+ "description": "Secure checkout, fast delivery, and easy exchanges",
171
+ "features": [
172
+ { "name": "100% Secure", "icon": "/secure.svg" },
173
+ { "name": "Easy Exchanges", "icon": "/exchnage.svg" }
174
+ ]
175
+ },
176
+
177
+ "whyChooseUs": {
178
+ "title": "Why Choose Us?",
179
+ "features": [
180
+ { "feature-name": "Premium Quality", "feature-icon": "/icons/quality.svg" }
181
+ ]
182
+ },
183
+
184
+ "videoStories": {
185
+ "title": "Watch Stories & Reviews",
186
+ "video-urls": [
187
+ "https://your-cdn.com/videos/story-1.mp4",
188
+ {
189
+ "video-story": {
190
+ "video-url": "https://your-cdn.com/videos/story-2.mp4"
191
+ }
192
+ }
193
+ ]
194
+ },
195
+
196
+ "blogPosts": {
197
+ "title": "Blog posts",
198
+ "posts": [
199
+ {
200
+ "title": "Which Theme Dress Matches Her Vibe?",
201
+ "href": "/blog/theme-dress-vibe",
202
+ "category": "Theme Dress",
203
+ "date": "May 24, 2026"
204
+ }
205
+ ]
206
+ }
207
+ }
208
+ }
209
+ }
@@ -0,0 +1,55 @@
1
+ {
2
+ "_comment": "Minimal sections override. Full backend template: homepage-config.example.json. Docs: HOMEPAGE_CONFIG.md",
3
+ "homepage-config": {
4
+ "sections": {
5
+ "newArrivals": {
6
+ "title": "New Arrivals",
7
+ "subtitle": "Your custom subtitle from CMS",
8
+ "variant": "grid"
9
+ },
10
+ "newArrivalsClassic": {
11
+ "title": "New Arrivals",
12
+ "subtitle": "Classic ProductPreview layout",
13
+ "variant": "classic"
14
+ },
15
+ "promoCountdown": {
16
+ "code": "SAVE50",
17
+ "text": "Up to 50% off — shop your favourites before they're gone!",
18
+ "end-at": "2026-12-31T23:59:59.000Z",
19
+ "active": true,
20
+ "cta-label": "Shop Offers",
21
+ "cta-href": "/store"
22
+ },
23
+ "promoAnnouncements": {
24
+ "messages": [
25
+ "Custom announcement line 1",
26
+ "Custom announcement line 2"
27
+ ]
28
+ },
29
+ "testimonials": {
30
+ "title": "What Clients Talk About Us",
31
+ "description": "The Trust We've Earned",
32
+ "items": [
33
+ {
34
+ "text": "Your review text here.",
35
+ "name": "Customer Name"
36
+ }
37
+ ]
38
+ },
39
+ "baptismPicks": {
40
+ "title": "Baptism Picks",
41
+ "looks": [
42
+ {
43
+ "image": "https://your-cdn.com/looks/baptism-1.jpg",
44
+ "product-ids": ["prod_REPLACE_ME_1", "prod_REPLACE_ME_2"]
45
+ },
46
+ {
47
+ "image": "https://your-cdn.com/looks/baptism-2.jpg",
48
+ "product-handles": ["off-white-baptism-gown"]
49
+ }
50
+ ]
51
+ }
52
+ },
53
+ "ratings": []
54
+ }
55
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "medusa-storefront-data",
3
- "version": "2.3.0",
3
+ "version": "2.4.0",
4
4
  "type": "module",
5
5
  "description": "Medusa storefront server data layer extracted from Next.js storefront",
6
6
  "license": "MIT",
@@ -9,7 +9,11 @@
9
9
  },
10
10
  "files": [
11
11
  "src",
12
- "dist"
12
+ "dist",
13
+ "homepage-config.example.json",
14
+ "homepage-sections.example.json",
15
+ "segment-data",
16
+ "HOMEPAGE_CONFIG.md"
13
17
  ],
14
18
  "scripts": {
15
19
  "build": "tsc",
@@ -203,6 +207,121 @@
203
207
  "types": "./dist/server/wishlist.d.ts",
204
208
  "import": "./src/server/wishlist.ts",
205
209
  "default": "./src/server/wishlist.ts"
210
+ },
211
+ "./home/sections/promoAnnouncements": {
212
+ "types": "./dist/server/home-sections/promo-announcements.d.ts",
213
+ "import": "./src/server/home-sections/promo-announcements.ts",
214
+ "default": "./src/server/home-sections/promo-announcements.ts"
215
+ },
216
+ "./home/sections/hero": {
217
+ "types": "./dist/server/home-sections/hero.d.ts",
218
+ "import": "./src/server/home-sections/hero.ts",
219
+ "default": "./src/server/home-sections/hero.ts"
220
+ },
221
+ "./home/sections/categoryPills": {
222
+ "types": "./dist/server/home-sections/category-pills.d.ts",
223
+ "import": "./src/server/home-sections/category-pills.ts",
224
+ "default": "./src/server/home-sections/category-pills.ts"
225
+ },
226
+ "./home/sections/newArrivals": {
227
+ "types": "./dist/server/home-sections/new-arrivals.d.ts",
228
+ "import": "./src/server/home-sections/new-arrivals.ts",
229
+ "default": "./src/server/home-sections/new-arrivals.ts"
230
+ },
231
+ "./home/sections/newArrivalsClassic": {
232
+ "types": "./dist/server/home-sections/new-arrivals-classic.d.ts",
233
+ "import": "./src/server/home-sections/new-arrivals-classic.ts",
234
+ "default": "./src/server/home-sections/new-arrivals-classic.ts"
235
+ },
236
+ "./home/sections/promoCountdown": {
237
+ "types": "./dist/server/home-sections/promo-countdown.d.ts",
238
+ "import": "./src/server/home-sections/promo-countdown.ts",
239
+ "default": "./src/server/home-sections/promo-countdown.ts"
240
+ },
241
+ "./home/sections/celebrityTrust": {
242
+ "types": "./dist/server/home-sections/celebrity-trust.d.ts",
243
+ "import": "./src/server/home-sections/celebrity-trust.ts",
244
+ "default": "./src/server/home-sections/celebrity-trust.ts"
245
+ },
246
+ "./home/sections/luxeFavourites": {
247
+ "types": "./dist/server/home-sections/luxe-favourites.d.ts",
248
+ "import": "./src/server/home-sections/luxe-favourites.ts",
249
+ "default": "./src/server/home-sections/luxe-favourites.ts"
250
+ },
251
+ "./home/sections/shopByCategory": {
252
+ "types": "./dist/server/home-sections/shop-by-category.d.ts",
253
+ "import": "./src/server/home-sections/shop-by-category.ts",
254
+ "default": "./src/server/home-sections/shop-by-category.ts"
255
+ },
256
+ "./home/sections/baptism": {
257
+ "types": "./dist/server/home-sections/baptism.d.ts",
258
+ "import": "./src/server/home-sections/baptism.ts",
259
+ "default": "./src/server/home-sections/baptism.ts"
260
+ },
261
+ "./home/sections/baptismPicks": {
262
+ "types": "./dist/server/home-sections/baptism-picks.d.ts",
263
+ "import": "./src/server/home-sections/baptism-picks.ts",
264
+ "default": "./src/server/home-sections/baptism-picks.ts"
265
+ },
266
+ "./home/sections/themeDresses": {
267
+ "types": "./dist/server/home-sections/theme-dresses.d.ts",
268
+ "import": "./src/server/home-sections/theme-dresses.ts",
269
+ "default": "./src/server/home-sections/theme-dresses.ts"
270
+ },
271
+ "./home/sections/brandMarquee": {
272
+ "types": "./dist/server/home-sections/brand-marquee.d.ts",
273
+ "import": "./src/server/home-sections/brand-marquee.ts",
274
+ "default": "./src/server/home-sections/brand-marquee.ts"
275
+ },
276
+ "./home/sections/aboutBrand": {
277
+ "types": "./dist/server/home-sections/about-brand.d.ts",
278
+ "import": "./src/server/home-sections/about-brand.ts",
279
+ "default": "./src/server/home-sections/about-brand.ts"
280
+ },
281
+ "./home/sections/testimonials": {
282
+ "types": "./dist/server/home-sections/testimonials.d.ts",
283
+ "import": "./src/server/home-sections/testimonials.ts",
284
+ "default": "./src/server/home-sections/testimonials.ts"
285
+ },
286
+ "./home/sections/brandPillars": {
287
+ "types": "./dist/server/home-sections/brand-pillars.d.ts",
288
+ "import": "./src/server/home-sections/brand-pillars.ts",
289
+ "default": "./src/server/home-sections/brand-pillars.ts"
290
+ },
291
+ "./home/sections/instagramPosts": {
292
+ "types": "./dist/server/home-sections/instagram-posts.d.ts",
293
+ "import": "./src/server/home-sections/instagram-posts.ts",
294
+ "default": "./src/server/home-sections/instagram-posts.ts"
295
+ },
296
+ "./home/sections/features": {
297
+ "types": "./dist/server/home-sections/features.d.ts",
298
+ "import": "./src/server/home-sections/features.ts",
299
+ "default": "./src/server/home-sections/features.ts"
300
+ },
301
+ "./home/sections/shopByAge": {
302
+ "types": "./dist/server/home-sections/shop-by-age.d.ts",
303
+ "import": "./src/server/home-sections/shop-by-age.ts",
304
+ "default": "./src/server/home-sections/shop-by-age.ts"
305
+ },
306
+ "./home/sections/whyChooseUs": {
307
+ "types": "./dist/server/home-sections/why-choose-us.d.ts",
308
+ "import": "./src/server/home-sections/why-choose-us.ts",
309
+ "default": "./src/server/home-sections/why-choose-us.ts"
310
+ },
311
+ "./home/sections/lovedByMoms": {
312
+ "types": "./dist/server/home-sections/loved-by-moms.d.ts",
313
+ "import": "./src/server/home-sections/loved-by-moms.ts",
314
+ "default": "./src/server/home-sections/loved-by-moms.ts"
315
+ },
316
+ "./home/sections/videoStories": {
317
+ "types": "./dist/server/home-sections/video-stories.d.ts",
318
+ "import": "./src/server/home-sections/video-stories.ts",
319
+ "default": "./src/server/home-sections/video-stories.ts"
320
+ },
321
+ "./home/sections/blogPosts": {
322
+ "types": "./dist/server/home-sections/blog-posts.d.ts",
323
+ "import": "./src/server/home-sections/blog-posts.ts",
324
+ "default": "./src/server/home-sections/blog-posts.ts"
206
325
  }
207
326
  },
208
327
  "main": "./dist/server/index.js",