medusa-storefront-data 2.5.1 → 2.5.4

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 (28) hide show
  1. package/HOMEPAGE_CONFIG.md +83 -10
  2. package/dist/src/server/dynamic-config.d.ts +25 -6
  3. package/dist/src/server/dynamic-config.d.ts.map +1 -1
  4. package/dist/src/server/dynamic-config.js +85 -10
  5. package/dist/src/server/help-faq-section-defaults.json +92 -0
  6. package/dist/src/server/help-sections/help-faq.d.ts +11 -0
  7. package/dist/src/server/help-sections/help-faq.d.ts.map +1 -0
  8. package/dist/src/server/help-sections/help-faq.js +6 -0
  9. package/dist/src/server/help-sections/index.d.ts +2 -0
  10. package/dist/src/server/help-sections/index.d.ts.map +1 -0
  11. package/dist/src/server/help-sections/index.js +1 -0
  12. package/dist/src/server/homepage-config.types.d.ts +21 -1
  13. package/dist/src/server/homepage-config.types.d.ts.map +1 -1
  14. package/dist/src/server/homepage-config.types.js +1 -0
  15. package/dist/src/server/homepage-section-defaults.d.ts +1 -0
  16. package/dist/src/server/homepage-section-defaults.d.ts.map +1 -1
  17. package/dist/src/server/homepage-section-defaults.js +2 -0
  18. package/dist/src/server/normalize-homepage-config.d.ts.map +1 -1
  19. package/dist/src/server/normalize-homepage-config.js +40 -0
  20. package/package.json +6 -1
  21. package/src/server/cart.ts +1 -1
  22. package/src/server/dynamic-config.ts +132 -12
  23. package/src/server/help-faq-section-defaults.json +92 -0
  24. package/src/server/help-sections/help-faq.ts +25 -0
  25. package/src/server/help-sections/index.ts +8 -0
  26. package/src/server/homepage-config.types.ts +24 -0
  27. package/src/server/homepage-section-defaults.ts +3 -0
  28. package/src/server/normalize-homepage-config.ts +39 -0
@@ -1,6 +1,44 @@
1
1
  # Homepage config and page input
2
2
 
3
- Storefront **packages do not call** `GET /store/dynamic-config`. Segment copy uses **hardcoded JSON defaults** (`segment-data/default-page-input.json`). The **main project** fetches dynamic config once and passes optional `pageInput` overrides.
3
+ Storefront **packages do not call** `GET /store/dynamic-config`. Each homepage section in `medusa-ui-home` keeps its **default copy in `data.json`** beside the UI. The **main project** fetches dynamic config once and passes optional `pageInput` overrides.
4
+
5
+ ## `medusa-ui-home` section layout
6
+
7
+ Each section id is a folder under `src/home/sections/<id>/`:
8
+
9
+ | File | Role |
10
+ |------|------|
11
+ | `data.json` | Default segment fields for dynamic-config schema |
12
+ | `theme.ts` | Default class names for slots this section uses + `ThemeOverrides` + `mergeSectionTheme()` |
13
+ | `dynamic-config.ts` | `*HomepageSectionField`, `*DynamicConfigStructure`, section id exports |
14
+ | `component/` | Presentational UI (or `component/index.tsx` re-export for shared widgets) |
15
+ | `section.tsx` | Section React wrapper only; optional `theme` prop |
16
+ | `index.ts` | Package export (`medusa-ui-home/sections/<id>`) |
17
+
18
+ Shared widgets used by multiple sections live in `src/home/components/` (`dynamic-banner`, `shoppable-gallery`, `shared/product-grid-section`, etc.).
19
+
20
+ Cross-section slots (e.g. `section`, `sectionPad`, `cardSurface`) live in `src/home/theme/shared.ts` and are composed into `medusa-ui-home/theme` via `defaultHomeThemeClassNames`.
21
+
22
+ ### Per-section theme overrides
23
+
24
+ ```tsx
25
+ import AboutBrandSection, {
26
+ mergeSectionTheme,
27
+ type ThemeOverrides,
28
+ } from "medusa-ui-home/sections/aboutBrand"
29
+
30
+ const aboutBrandTheme: ThemeOverrides = {
31
+ bannerTitle: "text-3xl font-black text-[var(--sf-color-secondary)]",
32
+ }
33
+
34
+ // Page / section instance
35
+ <AboutBrandSection {...data} theme={aboutBrandTheme} />
36
+
37
+ // Or merge into site home theme (Medusa theme-base)
38
+ const homeTheme = mergeThemeSlots(defaultHomeThemeClassNames, {
39
+ ...mergeSectionTheme({ bannerTitle: "..." }),
40
+ })
41
+ ```
4
42
 
5
43
  ## Tree-shakeable imports (one section)
6
44
 
@@ -33,7 +71,7 @@ export default async function Page({
33
71
  | `medusa-ui-home/sections/promoAnnouncements` | `medusa-storefront-data/home/sections/promoAnnouncements` |
34
72
  | … | … (all `HomeSectionId` values) |
35
73
 
36
- Run `node scripts/generate-home-section-exports.mjs` after adding a section.
74
+ Run `node scripts/generate-home-section-exports.mjs` after adding a section (creates `sections/<id>/` export entries in `medusa-ui-home` and loader paths in `medusa-storefront-data`).
37
75
 
38
76
  ## Themed pages (tree-shakeable)
39
77
 
@@ -108,25 +146,60 @@ const pageInput = homepageConfigFromDynamicResponse(await getDynamicConfig())
108
146
 
109
147
  Pass `pageInput` only where you need CMS overrides; omit it to use package JSON defaults.
110
148
 
111
- ## Medusa backend admin schemas (`medusa-ui-home`)
149
+ ## Medusa backend admin schemas (`medusa-ui-home-config`)
112
150
 
113
- UI and dynamic-config schema live in the same section file import only what you register:
151
+ Use **`medusa-ui-home-config`** in the Medusa server (CommonJS `require` + ESM `import`). Do not import `medusa-ui-home` in `medusa-config` — that package is ESM-only (React UI).
152
+
153
+ ```js
154
+ const { homepageSectionFields } = require("medusa-ui-home-config")
155
+ const { aboutBrandHomepageSectionField } = require(
156
+ "medusa-ui-home-config/sections/aboutBrand",
157
+ )
158
+ ```
114
159
 
115
160
  ```ts
116
- import HeroSection, {
117
- heroHomepageSectionField,
118
- bannerSlide,
119
- } from "medusa-ui-home/sections/hero"
120
- import { whyChooseUsHomepageSectionField } from "medusa-ui-home/sections/whyChooseUs"
161
+ import { homepageSectionFields } from "medusa-ui-home-config"
162
+ import { heroHomepageSectionField, bannerSlide } from "medusa-ui-home-config/sections/hero"
121
163
  ```
122
164
 
123
- Compose `options.configs` in your Medusa project from each section’s `*HomepageSectionField` (and site-level structures you define locally). Merge API responses with `homepageConfigFromDynamicResponse` from `medusa-storefront-data/dynamic-config`.
165
+ Compose `options.configs` from `homepageSectionFields` or individual `*HomepageSectionField` exports. Merge API responses with `homepageConfigFromDynamicResponse` from `medusa-storefront-data/dynamic-config`.
166
+
167
+ Help page FAQs use **`helpFaqHomepageSectionField`** from `medusa-ui-home-config/sections/helpFaq` (also included in `homepageSectionFields`). Store in `homepage-config.sections.helpFaq`:
168
+
169
+ ```json
170
+ {
171
+ "sections": {
172
+ "helpFaq": {
173
+ "eyebrow": "Knowledge Base",
174
+ "title": "Frequently Asked",
175
+ "titleHighlight": "Questions",
176
+ "subtitle": "Browse FAQs by topic.",
177
+ "categories": [
178
+ {
179
+ "category": "Order & Delivery",
180
+ "icon": "🚚",
181
+ "color": "from-blue-500 to-cyan-400",
182
+ "items": [
183
+ { "question": "When will I receive my order?", "answer": "…" }
184
+ ]
185
+ }
186
+ ]
187
+ }
188
+ }
189
+ }
190
+ ```
191
+
192
+ Legacy flat `faq-array` entries are still supported and are grouped by `faq-category`.
193
+
194
+ Storefront UI still imports from `medusa-ui-home/sections/<id>`.
124
195
 
125
196
  ## API reference
126
197
 
127
198
  | Export | Use |
128
199
  |--------|-----|
129
200
  | `loadHeroSectionData`, `loadNewArrivalsSectionData`, … | **One section** catalog + copy |
201
+ | `loadHelpFaqSectionData` | Help page FAQ (`sections.helpFaq`) |
202
+ | `getHelpFaqFromPageInput(pageInput)` | FAQ categories + section header copy |
130
203
  | `getDynamicConfig()` | **Main project only** |
131
204
  | `get*FromPageInput(pageInput)` | Read CMS copy/banners without fetching |
132
205
  | `homepageConfigFromDynamicResponse(raw)` | Merge API → `pageInput` |
@@ -84,13 +84,32 @@ export declare function getSocialLinksFromPageInput(pageInput?: HomepageConfig |
84
84
  url: string;
85
85
  icon?: string;
86
86
  }> | null;
87
- export declare function getFaqsFromPageInput(pageInput?: HomepageConfig | null): Array<{
87
+ export type HelpFaqItem = {
88
+ q: string;
89
+ a: string;
90
+ };
91
+ export type HelpFaqCategory = {
88
92
  category: string;
89
- items: Array<{
90
- q: string;
91
- a: string;
92
- }>;
93
- }> | null;
93
+ icon?: string;
94
+ color?: string;
95
+ items: HelpFaqItem[];
96
+ };
97
+ export type HelpFaqSectionCopy = {
98
+ eyebrow?: string;
99
+ title?: string;
100
+ titleHighlight?: string;
101
+ subtitle?: string;
102
+ };
103
+ export type HelpFaqConfig = {
104
+ sectionCopy: HelpFaqSectionCopy;
105
+ categories: HelpFaqCategory[];
106
+ };
107
+ /**
108
+ * Help page FAQ — `sections.helpFaq` (preferred) with legacy `faq-array` fallback.
109
+ */
110
+ export declare function getHelpFaqFromPageInput(pageInput?: HomepageConfig | null): HelpFaqConfig;
111
+ /** FAQ categories for the help template (null when empty). */
112
+ export declare function getFaqsFromPageInput(pageInput?: HomepageConfig | null): HelpFaqCategory[] | null;
94
113
  export declare function getAnnouncementMessagesFromPageInput(pageInput?: HomepageConfig | null): string[];
95
114
  export type AboutBrandConfig = {
96
115
  eyebrow: string;
@@ -1 +1 @@
1
- {"version":3,"file":"dynamic-config.d.ts","sourceRoot":"","sources":["../../../src/server/dynamic-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dynamic-config.d.ts","sourceRoot":"","sources":["../../../src/server/dynamic-config.ts"],"names":[],"mappings":"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"}
@@ -365,18 +365,64 @@ export function getSocialLinksFromPageInput(pageInput) {
365
365
  .filter((l) => l.name && l.url);
366
366
  return socialLinks.length > 0 ? socialLinks : null;
367
367
  }
368
- export function getFaqsFromPageInput(pageInput) {
368
+ function asConfigObject(value) {
369
+ if (value && typeof value === "object" && !Array.isArray(value)) {
370
+ return value;
371
+ }
372
+ return null;
373
+ }
374
+ function asConfigArray(value) {
375
+ return Array.isArray(value) ? value : [];
376
+ }
377
+ function parseHelpFaqItems(itemsRaw) {
378
+ const items = [];
379
+ for (const item of asConfigArray(itemsRaw)) {
380
+ const faq = asConfigObject(item?.faq) ?? asConfigObject(item);
381
+ if (!faq)
382
+ continue;
383
+ const q = String(faq.question ?? faq["faq-question"] ?? faq.q ?? "").trim();
384
+ const a = String(faq.answer ?? faq["faq-answer"] ?? faq.a ?? "").trim();
385
+ if (q && a)
386
+ items.push({ q, a });
387
+ }
388
+ return items;
389
+ }
390
+ function parseHelpFaqCategoriesFromBlock(block) {
391
+ const raw = block.categories;
392
+ if (!Array.isArray(raw))
393
+ return [];
394
+ const categories = [];
395
+ for (const row of raw) {
396
+ const cat = asConfigObject(row?.category) ??
397
+ asConfigObject(row);
398
+ if (!cat)
399
+ continue;
400
+ const category = String(cat.category ?? cat.name ?? "").trim();
401
+ const items = parseHelpFaqItems(cat.items);
402
+ if (!category || items.length === 0)
403
+ continue;
404
+ categories.push({
405
+ category,
406
+ icon: String(cat.icon ?? "❓").trim() || "❓",
407
+ color: String(cat.color ?? "from-violet-500 to-purple-400").trim() ||
408
+ "from-violet-500 to-purple-400",
409
+ items,
410
+ });
411
+ }
412
+ return categories;
413
+ }
414
+ function parseHelpFaqCategoriesFromLegacyArray(pageInput) {
369
415
  const config = resolvePageInput(pageInput);
370
416
  const faqsRaw = config["faq-array"] || [];
371
417
  if (!Array.isArray(faqsRaw) || faqsRaw.length === 0)
372
- return null;
418
+ return [];
373
419
  const categoriesMap = {};
374
420
  faqsRaw.forEach((item) => {
375
- const faq = (item?.["faq"] || item);
376
- const displayCategory = String(faq?.["faq-category"] || "General Questions").trim();
421
+ const faq = (item?.faq || item);
422
+ const displayCategory = String(faq?.["faq-category"] || faq?.category || "General Questions").trim();
377
423
  const categoryKey = displayCategory.toLowerCase();
378
- const q = String(faq?.["faq-question"] || "").trim();
379
- const a = String(faq?.["faq-answer"] || "").trim();
424
+ const q = String(faq?.["faq-question"] || faq?.question || "").trim();
425
+ const a = String(faq?.["faq-answer"] || faq?.answer || "").trim();
380
426
  if (q && a) {
381
427
  if (!categoriesMap[categoryKey]) {
382
428
  categoriesMap[categoryKey] = { displayCategory, items: [] };
@@ -384,11 +430,40 @@ export function getFaqsFromPageInput(pageInput) {
384
430
  categoriesMap[categoryKey].items.push({ q, a });
385
431
  }
386
432
  });
387
- const faqs = Object.values(categoriesMap).map((catData) => ({
388
- category: catData.displayCategory,
389
- items: catData.items,
433
+ return Object.values(categoriesMap).map((cat) => ({
434
+ category: cat.displayCategory,
435
+ icon: "❓",
436
+ color: "from-violet-500 to-purple-400",
437
+ items: cat.items,
390
438
  }));
391
- return faqs.length > 0 ? faqs : null;
439
+ }
440
+ function helpFaqBlockToSectionCopy(block) {
441
+ const copy = parseSectionCopy(block);
442
+ return {
443
+ eyebrow: copy.eyebrow ?? undefined,
444
+ title: copy.title ?? copy.name ?? undefined,
445
+ titleHighlight: typeof block.titleHighlight === "string"
446
+ ? block.titleHighlight
447
+ : undefined,
448
+ subtitle: copy.subtitle ?? copy.description ?? copy.text ?? undefined,
449
+ };
450
+ }
451
+ /**
452
+ * Help page FAQ — `sections.helpFaq` (preferred) with legacy `faq-array` fallback.
453
+ */
454
+ export function getHelpFaqFromPageInput(pageInput) {
455
+ const block = getMergedSectionBlock("helpFaq", pageInput);
456
+ const sectionCopy = helpFaqBlockToSectionCopy(block);
457
+ let categories = parseHelpFaqCategoriesFromBlock(block);
458
+ if (categories.length === 0) {
459
+ categories = parseHelpFaqCategoriesFromLegacyArray(pageInput);
460
+ }
461
+ return { sectionCopy, categories };
462
+ }
463
+ /** FAQ categories for the help template (null when empty). */
464
+ export function getFaqsFromPageInput(pageInput) {
465
+ const { categories } = getHelpFaqFromPageInput(pageInput);
466
+ return categories.length > 0 ? categories : null;
392
467
  }
393
468
  export function getAnnouncementMessagesFromPageInput(pageInput) {
394
469
  const block = getMergedSectionBlock("promoAnnouncements", pageInput);
@@ -0,0 +1,92 @@
1
+ {
2
+ "eyebrow": "Knowledge Base",
3
+ "title": "Frequently Asked",
4
+ "titleHighlight": "Questions",
5
+ "subtitle": "Browse through our most common questions — organized by topic for easy navigation.",
6
+ "categories": [
7
+ {
8
+ "category": "Order & Delivery",
9
+ "icon": "🚚",
10
+ "color": "from-blue-500 to-cyan-400",
11
+ "items": [
12
+ {
13
+ "question": "When will I receive my order?",
14
+ "answer": "Orders are typically processed within 1-2 business days. Delivery takes 3-5 business days depending on your location. Express delivery options may be available at checkout."
15
+ },
16
+ {
17
+ "question": "How can I track my order?",
18
+ "answer": "Once your order ships, you will receive a tracking link via email and SMS. You can also track your order anytime from your account dashboard under 'My Orders'."
19
+ },
20
+ {
21
+ "question": "Can I cancel or change my order?",
22
+ "answer": "You can cancel or change your order within 24 hours of placing it. Please contact our support team immediately or use the cancel option in your account. After 24 hours, the order may already be in processing."
23
+ },
24
+ {
25
+ "question": "Do you offer free shipping?",
26
+ "answer": "Yes! We offer free shipping on all orders above ₹999. For orders below this amount, a nominal shipping fee applies based on your delivery location and the chosen shipping method."
27
+ }
28
+ ]
29
+ },
30
+ {
31
+ "category": "Returns & Exchanges",
32
+ "icon": "📦",
33
+ "color": "from-emerald-500 to-teal-400",
34
+ "items": [
35
+ {
36
+ "question": "What is your return policy?",
37
+ "answer": "We offer a 7-day return policy for unused, unwashed items in their original packaging with tags attached. Items must be in their original condition to qualify for a return."
38
+ },
39
+ {
40
+ "question": "How do I initiate a return?",
41
+ "answer": "Go to your account, click on the specific order, and select 'Return Items'. Follow the instructions to generate a pickup request. Our team will schedule a pickup within 2 business days."
42
+ },
43
+ {
44
+ "question": "Do you offer exchanges?",
45
+ "answer": "Yes, you can request an exchange for a different size or color within 7 days of delivery, subject to availability. Exchange items must be in original condition with all tags intact."
46
+ },
47
+ {
48
+ "question": "When will I receive my exchanged item?",
49
+ "answer": "Once we receive and verify your returned item, the exchange will be dispatched within 2 business days. You'll receive a tracking link as soon as it ships."
50
+ }
51
+ ]
52
+ },
53
+ {
54
+ "category": "Payment & Refunds",
55
+ "icon": "💳",
56
+ "color": "from-violet-500 to-purple-400",
57
+ "items": [
58
+ {
59
+ "question": "When will I receive my refund?",
60
+ "answer": "Refunds are processed within 5-7 business days after we receive and inspect your returned items. The amount will be credited to your original payment method."
61
+ },
62
+ {
63
+ "question": "What payment methods do you accept?",
64
+ "answer": "We accept all major credit/debit cards, UPI, Net Banking, Wallets (Paytm, PhonePe, etc.), and Cash on Delivery (COD) for most PIN codes across India."
65
+ },
66
+ {
67
+ "question": "Is my payment information secure?",
68
+ "answer": "Absolutely! We use industry-standard SSL encryption and our payment gateway (Razorpay) is PCI-DSS compliant. We never store your card details on our servers."
69
+ }
70
+ ]
71
+ },
72
+ {
73
+ "category": "Product Inquiry",
74
+ "icon": "👗",
75
+ "color": "from-pink-500 to-rose-400",
76
+ "items": [
77
+ {
78
+ "question": "How do I find the right size for my child?",
79
+ "answer": "Each product page includes a detailed size chart with measurements in both cm and inches. We recommend measuring your child and comparing with our chart for the best fit. When in doubt, size up!"
80
+ },
81
+ {
82
+ "question": "Are products safe for kids?",
83
+ "answer": "Yes! All our products are certified child-safe. We use non-toxic, hypoallergenic dyes and materials that meet Indian safety standards for children's clothing. Safety is our top priority."
84
+ },
85
+ {
86
+ "question": "How should I care for the clothing?",
87
+ "answer": "Machine wash cold with like colors. Do not bleach. Tumble dry low or hang dry. Iron on low heat if needed. Detailed care instructions are printed on the garment's inner label."
88
+ }
89
+ ]
90
+ }
91
+ ]
92
+ }
@@ -0,0 +1,11 @@
1
+ import "server-only";
2
+ import { type HelpFaqCategory, type HelpFaqConfig, type HelpFaqSectionCopy } from "../dynamic-config";
3
+ import type { HomepageConfig } from "../homepage-config.types";
4
+ export type { HelpFaqCategory, HelpFaqConfig, HelpFaqSectionCopy };
5
+ export type HelpFaqSectionData = HelpFaqConfig;
6
+ export type HelpFaqSectionLoaderOptions = {
7
+ pageInput?: HomepageConfig | null;
8
+ };
9
+ /** Help page FAQ block — `sections.helpFaq` + legacy `faq-array`. */
10
+ export declare function loadHelpFaqSectionData(_countryCode: string, options?: HelpFaqSectionLoaderOptions): Promise<HelpFaqSectionData>;
11
+ //# sourceMappingURL=help-faq.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help-faq.d.ts","sourceRoot":"","sources":["../../../../src/server/help-sections/help-faq.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAA;AAEpB,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAE9D,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,kBAAkB,EAAE,CAAA;AAElE,MAAM,MAAM,kBAAkB,GAAG,aAAa,CAAA;AAE9C,MAAM,MAAM,2BAA2B,GAAG;IACxC,SAAS,CAAC,EAAE,cAAc,GAAG,IAAI,CAAA;CAClC,CAAA;AAED,qEAAqE;AACrE,wBAAsB,sBAAsB,CAC1C,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,kBAAkB,CAAC,CAE7B"}
@@ -0,0 +1,6 @@
1
+ import "server-only";
2
+ import { getHelpFaqFromPageInput, } from "../dynamic-config";
3
+ /** Help page FAQ block — `sections.helpFaq` + legacy `faq-array`. */
4
+ export async function loadHelpFaqSectionData(_countryCode, options) {
5
+ return getHelpFaqFromPageInput(options?.pageInput ?? null);
6
+ }
@@ -0,0 +1,2 @@
1
+ export { loadHelpFaqSectionData, type HelpFaqCategory, type HelpFaqConfig, type HelpFaqSectionCopy, type HelpFaqSectionData, type HelpFaqSectionLoaderOptions, } from "./help-faq";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/server/help-sections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,GACjC,MAAM,YAAY,CAAA"}
@@ -0,0 +1 @@
1
+ export { loadHelpFaqSectionData, } from "./help-faq";
@@ -123,6 +123,25 @@ export type HomepageBlogPostsSection = HomepageSectionCopyFields & {
123
123
  posts?: HomepageBlogPost[];
124
124
  "blog-posts"?: HomepageBlogPost[];
125
125
  };
126
+ export type HomepageHelpFaqItem = {
127
+ question?: string;
128
+ answer?: string;
129
+ q?: string;
130
+ a?: string;
131
+ faq?: HomepageHelpFaqItem;
132
+ };
133
+ export type HomepageHelpFaqCategory = {
134
+ category?: string;
135
+ name?: string;
136
+ icon?: string;
137
+ color?: string;
138
+ items?: HomepageHelpFaqItem[];
139
+ faqs?: HomepageHelpFaqItem[];
140
+ };
141
+ export type HomepageHelpFaqSection = HomepageSectionCopyFields & {
142
+ titleHighlight?: string;
143
+ categories?: HomepageHelpFaqCategory[];
144
+ };
126
145
  export type HomepageInstagramPost = {
127
146
  id?: string;
128
147
  image?: string;
@@ -182,6 +201,7 @@ export type HomepageSectionsConfig = {
182
201
  lovedByMoms?: HomepageSectionCopyFields;
183
202
  videoStories?: HomepageVideoStoriesSection;
184
203
  blogPosts?: HomepageBlogPostsSection;
204
+ helpFaq?: HomepageHelpFaqSection;
185
205
  /** Allow kebab-case keys from legacy CMS */
186
206
  [sectionKey: string]: HomepageSectionCopyFields | undefined;
187
207
  };
@@ -269,6 +289,6 @@ export type DynamicConfigResponse = {
269
289
  [key: string]: unknown;
270
290
  };
271
291
  /** All section ids with package defaults. */
272
- export declare const HOMEPAGE_SECTION_IDS: readonly ["promoAnnouncements", "hero", "categoryPills", "newArrivals", "newArrivalsClassic", "promoCountdown", "celebrityTrust", "luxeFavourites", "shopByCategory", "baptism", "baptismPicks", "themeDresses", "brandMarquee", "aboutBrand", "testimonials", "brandPillars", "instagramPosts", "features", "shopByAge", "whyChooseUs", "lovedByMoms", "videoStories", "blogPosts"];
292
+ export declare const HOMEPAGE_SECTION_IDS: readonly ["promoAnnouncements", "hero", "categoryPills", "newArrivals", "newArrivalsClassic", "promoCountdown", "celebrityTrust", "luxeFavourites", "shopByCategory", "baptism", "baptismPicks", "themeDresses", "brandMarquee", "aboutBrand", "testimonials", "brandPillars", "instagramPosts", "features", "shopByAge", "whyChooseUs", "lovedByMoms", "videoStories", "blogPosts", "helpFaq"];
273
293
  export type HomepageSectionId = (typeof HOMEPAGE_SECTION_IDS)[number];
274
294
  //# sourceMappingURL=homepage-config.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"homepage-config.types.d.ts","sourceRoot":"","sources":["../../../src/server/homepage-config.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"homepage-config.types.d.ts","sourceRoot":"","sources":["../../../src/server/homepage-config.types.ts"],"names":[],"mappings":"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"}
@@ -30,4 +30,5 @@ export const HOMEPAGE_SECTION_IDS = [
30
30
  "lovedByMoms",
31
31
  "videoStories",
32
32
  "blogPosts",
33
+ "helpFaq",
33
34
  ];
@@ -158,6 +158,7 @@ export declare const DEFAULT_HOMEPAGE_SECTIONS: {
158
158
  readonly title: "Watch Stories & Reviews";
159
159
  readonly "video-urls": readonly [];
160
160
  };
161
+ readonly helpFaq: Record<string, unknown>;
161
162
  readonly blogPosts: {
162
163
  readonly title: "Blog posts";
163
164
  readonly posts: readonly [{
@@ -1 +1 @@
1
- {"version":3,"file":"homepage-section-defaults.d.ts","sourceRoot":"","sources":["../../../src/server/homepage-section-defaults.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4LsB,CAAA;AAE5D,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,yBAAyB,CAAA;AAEzE,eAAO,MAAM,yBAAyB,EAEjC,oBAAoB,EAAE,CAAA"}
1
+ {"version":3,"file":"homepage-section-defaults.d.ts","sourceRoot":"","sources":["../../../src/server/homepage-section-defaults.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBA+JR,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;CA8BO,CAAA;AAE5D,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,yBAAyB,CAAA;AAEzE,eAAO,MAAM,yBAAyB,EAEjC,oBAAoB,EAAE,CAAA"}
@@ -1,3 +1,4 @@
1
+ import helpFaqDefaults from "./help-faq-section-defaults.json";
1
2
  /**
2
3
  * Default `homepage-config.sections` blocks.
3
4
  * Dynamic config overrides any field; unset fields keep these defaults.
@@ -155,6 +156,7 @@ export const DEFAULT_HOMEPAGE_SECTIONS = {
155
156
  title: "Watch Stories & Reviews",
156
157
  "video-urls": [],
157
158
  },
159
+ helpFaq: helpFaqDefaults,
158
160
  blogPosts: {
159
161
  title: "Blog posts",
160
162
  posts: [
@@ -1 +1 @@
1
- {"version":3,"file":"normalize-homepage-config.d.ts","sourceRoot":"","sources":["../../../src/server/normalize-homepage-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAwM7D;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAmCtE"}
1
+ {"version":3,"file":"normalize-homepage-config.d.ts","sourceRoot":"","sources":["../../../src/server/normalize-homepage-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AA+O7D;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAmCtE"}
@@ -173,6 +173,46 @@ function normalizeSections(sections) {
173
173
  description: pillars.description,
174
174
  };
175
175
  }
176
+ const helpFaq = asObject(sections.helpFaq);
177
+ if (helpFaq) {
178
+ const categories = asArray(helpFaq.categories)
179
+ .map((row) => {
180
+ const cat = asObject(row?.category) ?? asObject(row);
181
+ if (!cat)
182
+ return null;
183
+ const items = asArray(cat.items)
184
+ .map((item) => {
185
+ const faq = asObject(item?.faq) ?? asObject(item);
186
+ if (!faq)
187
+ return null;
188
+ const question = String(faq.question ?? faq["faq-question"] ?? "").trim();
189
+ const answer = String(faq.answer ?? faq["faq-answer"] ?? "").trim();
190
+ if (!question || !answer)
191
+ return null;
192
+ return { question, answer };
193
+ })
194
+ .filter(Boolean);
195
+ const category = String(cat.category ?? cat.name ?? "").trim();
196
+ if (!category || items.length === 0)
197
+ return null;
198
+ return {
199
+ category,
200
+ icon: cat.icon,
201
+ color: cat.color,
202
+ items,
203
+ };
204
+ })
205
+ .filter(Boolean);
206
+ if (categories.length) {
207
+ out.helpFaq = {
208
+ eyebrow: helpFaq.eyebrow,
209
+ title: helpFaq.title,
210
+ titleHighlight: helpFaq.titleHighlight,
211
+ subtitle: helpFaq.subtitle ?? helpFaq.description,
212
+ categories,
213
+ };
214
+ }
215
+ }
176
216
  return out;
177
217
  }
178
218
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "medusa-storefront-data",
3
- "version": "2.5.1",
3
+ "version": "2.5.4",
4
4
  "type": "module",
5
5
  "description": "Medusa storefront server data layer extracted from Next.js storefront",
6
6
  "license": "MIT",
@@ -167,6 +167,11 @@
167
167
  "types": "./dist/server/home-sections/blog-posts.d.ts",
168
168
  "import": "./src/server/home-sections/blog-posts.ts",
169
169
  "default": "./src/server/home-sections/blog-posts.ts"
170
+ },
171
+ "./help/sections/helpFaq": {
172
+ "types": "./dist/server/help-sections/help-faq.d.ts",
173
+ "import": "./src/server/help-sections/help-faq.ts",
174
+ "default": "./src/server/help-sections/help-faq.ts"
170
175
  }
171
176
  },
172
177
  "main": "./dist/server/index.js",
@@ -740,7 +740,7 @@ export async function placeOrder(cartId?: string) {
740
740
  }
741
741
 
742
742
  if (cartRes?.type === "order") {
743
- const order = cartRes.order as HttpTypes.StoreOrder
743
+ const order = cartRes.order as unknown as HttpTypes.StoreOrder
744
744
  const countryCode = order.shipping_address?.country_code?.toLowerCase()
745
745
 
746
746
  const orderCacheTag = await getCacheTag("orders")
@@ -523,22 +523,100 @@ export function getSocialLinksFromPageInput(
523
523
  }
524
524
 
525
525
 
526
- export function getFaqsFromPageInput(
526
+ export type HelpFaqItem = { q: string; a: string }
527
+
528
+ export type HelpFaqCategory = {
529
+ category: string
530
+ icon?: string
531
+ color?: string
532
+ items: HelpFaqItem[]
533
+ }
534
+
535
+ export type HelpFaqSectionCopy = {
536
+ eyebrow?: string
537
+ title?: string
538
+ titleHighlight?: string
539
+ subtitle?: string
540
+ }
541
+
542
+ export type HelpFaqConfig = {
543
+ sectionCopy: HelpFaqSectionCopy
544
+ categories: HelpFaqCategory[]
545
+ }
546
+
547
+ function asConfigObject(value: unknown): Record<string, unknown> | null {
548
+ if (value && typeof value === "object" && !Array.isArray(value)) {
549
+ return value as Record<string, unknown>
550
+ }
551
+ return null
552
+ }
553
+
554
+ function asConfigArray(value: unknown): unknown[] {
555
+ return Array.isArray(value) ? value : []
556
+ }
557
+
558
+ function parseHelpFaqItems(itemsRaw: unknown): HelpFaqItem[] {
559
+ const items: HelpFaqItem[] = []
560
+ for (const item of asConfigArray(itemsRaw)) {
561
+ const faq =
562
+ asConfigObject((item as Record<string, unknown>)?.faq) ?? asConfigObject(item)
563
+ if (!faq) continue
564
+ const q = String(
565
+ faq.question ?? faq["faq-question"] ?? faq.q ?? ""
566
+ ).trim()
567
+ const a = String(faq.answer ?? faq["faq-answer"] ?? faq.a ?? "").trim()
568
+ if (q && a) items.push({ q, a })
569
+ }
570
+ return items
571
+ }
572
+
573
+ function parseHelpFaqCategoriesFromBlock(
574
+ block: Record<string, unknown>
575
+ ): HelpFaqCategory[] {
576
+ const raw = block.categories
577
+ if (!Array.isArray(raw)) return []
578
+
579
+ const categories: HelpFaqCategory[] = []
580
+ for (const row of raw) {
581
+ const cat =
582
+ asConfigObject((row as Record<string, unknown>)?.category) ??
583
+ asConfigObject(row)
584
+ if (!cat) continue
585
+ const category = String(cat.category ?? cat.name ?? "").trim()
586
+ const items = parseHelpFaqItems(cat.items)
587
+ if (!category || items.length === 0) continue
588
+ categories.push({
589
+ category,
590
+ icon: String(cat.icon ?? "❓").trim() || "❓",
591
+ color:
592
+ String(cat.color ?? "from-violet-500 to-purple-400").trim() ||
593
+ "from-violet-500 to-purple-400",
594
+ items,
595
+ })
596
+ }
597
+ return categories
598
+ }
599
+
600
+ function parseHelpFaqCategoriesFromLegacyArray(
527
601
  pageInput?: HomepageConfig | null
528
- ): Array<{ category: string; items: Array<{ q: string; a: string }> }> | null {
602
+ ): HelpFaqCategory[] {
529
603
  const config = resolvePageInput(pageInput)
530
604
  const faqsRaw = config["faq-array"] || []
531
- if (!Array.isArray(faqsRaw) || faqsRaw.length === 0) return null
605
+ if (!Array.isArray(faqsRaw) || faqsRaw.length === 0) return []
606
+
532
607
  const categoriesMap: Record<
533
608
  string,
534
- { displayCategory: string; items: Array<{ q: string; a: string }> }
609
+ { displayCategory: string; items: HelpFaqItem[] }
535
610
  > = {}
611
+
536
612
  faqsRaw.forEach((item: Record<string, unknown>) => {
537
- const faq = (item?.["faq"] || item) as Record<string, unknown>
538
- const displayCategory = String(faq?.["faq-category"] || "General Questions").trim()
613
+ const faq = (item?.faq || item) as Record<string, unknown>
614
+ const displayCategory = String(
615
+ faq?.["faq-category"] || faq?.category || "General Questions"
616
+ ).trim()
539
617
  const categoryKey = displayCategory.toLowerCase()
540
- const q = String(faq?.["faq-question"] || "").trim()
541
- const a = String(faq?.["faq-answer"] || "").trim()
618
+ const q = String(faq?.["faq-question"] || faq?.question || "").trim()
619
+ const a = String(faq?.["faq-answer"] || faq?.answer || "").trim()
542
620
  if (q && a) {
543
621
  if (!categoriesMap[categoryKey]) {
544
622
  categoriesMap[categoryKey] = { displayCategory, items: [] }
@@ -546,11 +624,53 @@ export function getFaqsFromPageInput(
546
624
  categoriesMap[categoryKey].items.push({ q, a })
547
625
  }
548
626
  })
549
- const faqs = Object.values(categoriesMap).map((catData) => ({
550
- category: catData.displayCategory,
551
- items: catData.items,
627
+
628
+ return Object.values(categoriesMap).map((cat) => ({
629
+ category: cat.displayCategory,
630
+ icon: "❓",
631
+ color: "from-violet-500 to-purple-400",
632
+ items: cat.items,
552
633
  }))
553
- return faqs.length > 0 ? faqs : null
634
+ }
635
+
636
+ function helpFaqBlockToSectionCopy(
637
+ block: Record<string, unknown>
638
+ ): HelpFaqSectionCopy {
639
+ const copy = parseSectionCopy(block)
640
+ return {
641
+ eyebrow: copy.eyebrow ?? undefined,
642
+ title: copy.title ?? copy.name ?? undefined,
643
+ titleHighlight:
644
+ typeof block.titleHighlight === "string"
645
+ ? block.titleHighlight
646
+ : undefined,
647
+ subtitle: copy.subtitle ?? copy.description ?? copy.text ?? undefined,
648
+ }
649
+ }
650
+
651
+ /**
652
+ * Help page FAQ — `sections.helpFaq` (preferred) with legacy `faq-array` fallback.
653
+ */
654
+ export function getHelpFaqFromPageInput(
655
+ pageInput?: HomepageConfig | null
656
+ ): HelpFaqConfig {
657
+ const block = getMergedSectionBlock("helpFaq", pageInput)
658
+ const sectionCopy = helpFaqBlockToSectionCopy(block)
659
+
660
+ let categories = parseHelpFaqCategoriesFromBlock(block)
661
+ if (categories.length === 0) {
662
+ categories = parseHelpFaqCategoriesFromLegacyArray(pageInput)
663
+ }
664
+
665
+ return { sectionCopy, categories }
666
+ }
667
+
668
+ /** FAQ categories for the help template (null when empty). */
669
+ export function getFaqsFromPageInput(
670
+ pageInput?: HomepageConfig | null
671
+ ): HelpFaqCategory[] | null {
672
+ const { categories } = getHelpFaqFromPageInput(pageInput)
673
+ return categories.length > 0 ? categories : null
554
674
  }
555
675
 
556
676
 
@@ -0,0 +1,92 @@
1
+ {
2
+ "eyebrow": "Knowledge Base",
3
+ "title": "Frequently Asked",
4
+ "titleHighlight": "Questions",
5
+ "subtitle": "Browse through our most common questions — organized by topic for easy navigation.",
6
+ "categories": [
7
+ {
8
+ "category": "Order & Delivery",
9
+ "icon": "🚚",
10
+ "color": "from-blue-500 to-cyan-400",
11
+ "items": [
12
+ {
13
+ "question": "When will I receive my order?",
14
+ "answer": "Orders are typically processed within 1-2 business days. Delivery takes 3-5 business days depending on your location. Express delivery options may be available at checkout."
15
+ },
16
+ {
17
+ "question": "How can I track my order?",
18
+ "answer": "Once your order ships, you will receive a tracking link via email and SMS. You can also track your order anytime from your account dashboard under 'My Orders'."
19
+ },
20
+ {
21
+ "question": "Can I cancel or change my order?",
22
+ "answer": "You can cancel or change your order within 24 hours of placing it. Please contact our support team immediately or use the cancel option in your account. After 24 hours, the order may already be in processing."
23
+ },
24
+ {
25
+ "question": "Do you offer free shipping?",
26
+ "answer": "Yes! We offer free shipping on all orders above ₹999. For orders below this amount, a nominal shipping fee applies based on your delivery location and the chosen shipping method."
27
+ }
28
+ ]
29
+ },
30
+ {
31
+ "category": "Returns & Exchanges",
32
+ "icon": "📦",
33
+ "color": "from-emerald-500 to-teal-400",
34
+ "items": [
35
+ {
36
+ "question": "What is your return policy?",
37
+ "answer": "We offer a 7-day return policy for unused, unwashed items in their original packaging with tags attached. Items must be in their original condition to qualify for a return."
38
+ },
39
+ {
40
+ "question": "How do I initiate a return?",
41
+ "answer": "Go to your account, click on the specific order, and select 'Return Items'. Follow the instructions to generate a pickup request. Our team will schedule a pickup within 2 business days."
42
+ },
43
+ {
44
+ "question": "Do you offer exchanges?",
45
+ "answer": "Yes, you can request an exchange for a different size or color within 7 days of delivery, subject to availability. Exchange items must be in original condition with all tags intact."
46
+ },
47
+ {
48
+ "question": "When will I receive my exchanged item?",
49
+ "answer": "Once we receive and verify your returned item, the exchange will be dispatched within 2 business days. You'll receive a tracking link as soon as it ships."
50
+ }
51
+ ]
52
+ },
53
+ {
54
+ "category": "Payment & Refunds",
55
+ "icon": "💳",
56
+ "color": "from-violet-500 to-purple-400",
57
+ "items": [
58
+ {
59
+ "question": "When will I receive my refund?",
60
+ "answer": "Refunds are processed within 5-7 business days after we receive and inspect your returned items. The amount will be credited to your original payment method."
61
+ },
62
+ {
63
+ "question": "What payment methods do you accept?",
64
+ "answer": "We accept all major credit/debit cards, UPI, Net Banking, Wallets (Paytm, PhonePe, etc.), and Cash on Delivery (COD) for most PIN codes across India."
65
+ },
66
+ {
67
+ "question": "Is my payment information secure?",
68
+ "answer": "Absolutely! We use industry-standard SSL encryption and our payment gateway (Razorpay) is PCI-DSS compliant. We never store your card details on our servers."
69
+ }
70
+ ]
71
+ },
72
+ {
73
+ "category": "Product Inquiry",
74
+ "icon": "👗",
75
+ "color": "from-pink-500 to-rose-400",
76
+ "items": [
77
+ {
78
+ "question": "How do I find the right size for my child?",
79
+ "answer": "Each product page includes a detailed size chart with measurements in both cm and inches. We recommend measuring your child and comparing with our chart for the best fit. When in doubt, size up!"
80
+ },
81
+ {
82
+ "question": "Are products safe for kids?",
83
+ "answer": "Yes! All our products are certified child-safe. We use non-toxic, hypoallergenic dyes and materials that meet Indian safety standards for children's clothing. Safety is our top priority."
84
+ },
85
+ {
86
+ "question": "How should I care for the clothing?",
87
+ "answer": "Machine wash cold with like colors. Do not bleach. Tumble dry low or hang dry. Iron on low heat if needed. Detailed care instructions are printed on the garment's inner label."
88
+ }
89
+ ]
90
+ }
91
+ ]
92
+ }
@@ -0,0 +1,25 @@
1
+ import "server-only"
2
+
3
+ import {
4
+ getHelpFaqFromPageInput,
5
+ type HelpFaqCategory,
6
+ type HelpFaqConfig,
7
+ type HelpFaqSectionCopy,
8
+ } from "../dynamic-config"
9
+ import type { HomepageConfig } from "../homepage-config.types"
10
+
11
+ export type { HelpFaqCategory, HelpFaqConfig, HelpFaqSectionCopy }
12
+
13
+ export type HelpFaqSectionData = HelpFaqConfig
14
+
15
+ export type HelpFaqSectionLoaderOptions = {
16
+ pageInput?: HomepageConfig | null
17
+ }
18
+
19
+ /** Help page FAQ block — `sections.helpFaq` + legacy `faq-array`. */
20
+ export async function loadHelpFaqSectionData(
21
+ _countryCode: string,
22
+ options?: HelpFaqSectionLoaderOptions
23
+ ): Promise<HelpFaqSectionData> {
24
+ return getHelpFaqFromPageInput(options?.pageInput ?? null)
25
+ }
@@ -0,0 +1,8 @@
1
+ export {
2
+ loadHelpFaqSectionData,
3
+ type HelpFaqCategory,
4
+ type HelpFaqConfig,
5
+ type HelpFaqSectionCopy,
6
+ type HelpFaqSectionData,
7
+ type HelpFaqSectionLoaderOptions,
8
+ } from "./help-faq"
@@ -138,6 +138,28 @@ export type HomepageBlogPostsSection = HomepageSectionCopyFields & {
138
138
  "blog-posts"?: HomepageBlogPost[]
139
139
  }
140
140
 
141
+ export type HomepageHelpFaqItem = {
142
+ question?: string
143
+ answer?: string
144
+ q?: string
145
+ a?: string
146
+ faq?: HomepageHelpFaqItem
147
+ }
148
+
149
+ export type HomepageHelpFaqCategory = {
150
+ category?: string
151
+ name?: string
152
+ icon?: string
153
+ color?: string
154
+ items?: HomepageHelpFaqItem[]
155
+ faqs?: HomepageHelpFaqItem[]
156
+ }
157
+
158
+ export type HomepageHelpFaqSection = HomepageSectionCopyFields & {
159
+ titleHighlight?: string
160
+ categories?: HomepageHelpFaqCategory[]
161
+ }
162
+
141
163
  export type HomepageInstagramPost = {
142
164
  id?: string
143
165
  image?: string
@@ -203,6 +225,7 @@ export type HomepageSectionsConfig = {
203
225
  lovedByMoms?: HomepageSectionCopyFields
204
226
  videoStories?: HomepageVideoStoriesSection
205
227
  blogPosts?: HomepageBlogPostsSection
228
+ helpFaq?: HomepageHelpFaqSection
206
229
  /** Allow kebab-case keys from legacy CMS */
207
230
  [sectionKey: string]: HomepageSectionCopyFields | undefined
208
231
  }
@@ -330,6 +353,7 @@ export const HOMEPAGE_SECTION_IDS = [
330
353
  "lovedByMoms",
331
354
  "videoStories",
332
355
  "blogPosts",
356
+ "helpFaq",
333
357
  ] as const
334
358
 
335
359
  export type HomepageSectionId = (typeof HOMEPAGE_SECTION_IDS)[number]
@@ -1,3 +1,5 @@
1
+ import helpFaqDefaults from "./help-faq-section-defaults.json"
2
+
1
3
  /**
2
4
  * Default `homepage-config.sections` blocks.
3
5
  * Dynamic config overrides any field; unset fields keep these defaults.
@@ -161,6 +163,7 @@ export const DEFAULT_HOMEPAGE_SECTIONS = {
161
163
  title: "Watch Stories & Reviews",
162
164
  "video-urls": [],
163
165
  },
166
+ helpFaq: helpFaqDefaults as Record<string, unknown>,
164
167
  blogPosts: {
165
168
  title: "Blog posts",
166
169
  posts: [
@@ -195,6 +195,45 @@ function normalizeSections(sections: Loose): Loose {
195
195
  }
196
196
  }
197
197
 
198
+ const helpFaq = asObject(sections.helpFaq)
199
+ if (helpFaq) {
200
+ const categories = asArray(helpFaq.categories)
201
+ .map((row) => {
202
+ const cat = asObject((row as Loose)?.category) ?? asObject(row)
203
+ if (!cat) return null
204
+ const items = asArray(cat.items)
205
+ .map((item) => {
206
+ const faq = asObject((item as Loose)?.faq) ?? asObject(item)
207
+ if (!faq) return null
208
+ const question = String(
209
+ faq.question ?? faq["faq-question"] ?? ""
210
+ ).trim()
211
+ const answer = String(faq.answer ?? faq["faq-answer"] ?? "").trim()
212
+ if (!question || !answer) return null
213
+ return { question, answer }
214
+ })
215
+ .filter(Boolean)
216
+ const category = String(cat.category ?? cat.name ?? "").trim()
217
+ if (!category || items.length === 0) return null
218
+ return {
219
+ category,
220
+ icon: cat.icon,
221
+ color: cat.color,
222
+ items,
223
+ }
224
+ })
225
+ .filter(Boolean)
226
+ if (categories.length) {
227
+ out.helpFaq = {
228
+ eyebrow: helpFaq.eyebrow,
229
+ title: helpFaq.title,
230
+ titleHighlight: helpFaq.titleHighlight,
231
+ subtitle: helpFaq.subtitle ?? helpFaq.description,
232
+ categories,
233
+ }
234
+ }
235
+ }
236
+
198
237
  return out
199
238
  }
200
239