medusa-storefront-data 2.1.0 → 2.3.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.
@@ -1,3 +1,4 @@
1
+ import { type DefaultHomeSectionId } from "./homepage-section-defaults";
1
2
  export interface DynamicConfig {
2
3
  "homepage-config"?: {
3
4
  logo?: string;
@@ -54,6 +55,8 @@ export interface DynamicConfig {
54
55
  "promo-value"?: string;
55
56
  "promo-active"?: boolean;
56
57
  };
58
+ /** Central homepage section copy (Option 1). Keys: camelCase or kebab-case section ids. */
59
+ sections?: Record<string, unknown>;
57
60
  [key: string]: any;
58
61
  };
59
62
  }
@@ -82,18 +85,54 @@ export declare const getAppBannersFromConfig: () => Promise<Array<{
82
85
  }> | null>;
83
86
  export declare const getMobileBannerImageFromConfig: () => Promise<string | null>;
84
87
  export declare const getWebsiteDescriptionFromConfig: () => Promise<string | null>;
88
+ /** Why choose us — defaults + `sections.whyChooseUs` override. */
85
89
  export declare const getFeaturesFromConfig: () => Promise<{
86
90
  title: string;
87
91
  features: Array<{
88
92
  name: string;
89
93
  icon: string;
90
94
  }>;
91
- } | null>;
95
+ }>;
96
+ /** CMS copy for a homepage section (title, name, text, description, etc.). */
97
+ export type SectionCopy = {
98
+ title: string | null;
99
+ name: string | null;
100
+ text: string | null;
101
+ description: string | null;
102
+ subtitle: string | null;
103
+ eyebrow: string | null;
104
+ };
105
+ export declare function parseSectionCopy(block: unknown): SectionCopy;
106
+ export type HomeSectionCopyId = DefaultHomeSectionId;
107
+ export type HomeSectionsCopy = Record<HomeSectionCopyId, SectionCopy>;
108
+ /** Merge CMS section block onto package defaults (override wins when set). */
109
+ export declare function mergeSectionBlock(defaults: Record<string, unknown>, override: Record<string, unknown> | null): Record<string, unknown>;
110
+ /**
111
+ * Merged section copy: package defaults + `homepage-config.sections` overrides.
112
+ */
113
+ export declare const getHomeSectionsCopyFromConfig: () => Promise<HomeSectionsCopy>;
114
+ export type TrustFeaturesConfig = {
115
+ title: string | null;
116
+ description: string | null;
117
+ features: Array<{
118
+ name: string;
119
+ icon: string;
120
+ }>;
121
+ };
122
+ /** Trust badge row — defaults + `sections.features` override. */
123
+ export declare const getTrustFeaturesFromConfig: () => Promise<TrustFeaturesConfig>;
92
124
  export declare const getContactInfoFromConfig: () => Promise<{
93
125
  phone?: string;
94
126
  email?: string;
95
127
  address?: string;
96
128
  } | null>;
129
+ /**
130
+ * Homepage video stories/reviews carousel (`homepage-config.video-stories`).
131
+ */
132
+ export declare const getVideoStoriesFromConfig: () => Promise<{
133
+ title: string;
134
+ videoUrls: string[];
135
+ } | null>;
97
136
  export declare const getTestimonialsFromConfig: () => Promise<{
98
137
  title: string;
99
138
  testimonials: Array<{
@@ -116,6 +155,44 @@ export declare const getFaqsFromConfig: () => Promise<Array<{
116
155
  a: string;
117
156
  }>;
118
157
  }> | null>;
158
+ export declare const getAnnouncementMessagesFromConfig: () => Promise<string[]>;
159
+ export type AboutBrandConfig = {
160
+ eyebrow: string;
161
+ title: string;
162
+ description: string;
163
+ readMoreHref: string;
164
+ stats: Array<{
165
+ label: string;
166
+ value: string;
167
+ }>;
168
+ };
169
+ export declare const getAboutBrandFromConfig: () => Promise<AboutBrandConfig>;
170
+ export type BrandPillarConfig = {
171
+ title: string;
172
+ description: string;
173
+ image?: string;
174
+ };
175
+ export declare const getBrandPillarsFromConfig: () => Promise<{
176
+ sectionTitle: string;
177
+ pillars: BrandPillarConfig[];
178
+ }>;
179
+ export type BlogPostConfig = {
180
+ title: string;
181
+ excerpt?: string;
182
+ category?: string;
183
+ date?: string;
184
+ href: string;
185
+ image?: string;
186
+ };
187
+ export declare const getBlogPostsFromConfig: () => Promise<BlogPostConfig[]>;
188
+ /** Promo countdown — defaults + `sections.promoCountdown` override. */
189
+ export declare const getPromoCountdownFromConfig: () => Promise<{
190
+ code: string | null;
191
+ message: string | null;
192
+ endAt: string | null;
193
+ active: boolean;
194
+ }>;
195
+ export { DEFAULT_HOMEPAGE_SECTIONS } from "./homepage-section-defaults";
119
196
  export declare const getPromoBarConfig: () => Promise<{
120
197
  text: string | null;
121
198
  code: string | null;
@@ -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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"}
@@ -1,6 +1,7 @@
1
1
  "use server";
2
2
  import { cache } from "react";
3
3
  import { getAuthHeaders } from "../cookies";
4
+ import { DEFAULT_HOMEPAGE_SECTIONS, HOME_SECTION_COPY_ID_LIST, } from "./homepage-section-defaults";
4
5
  export const getDynamicConfig = cache(async () => {
5
6
  try {
6
7
  const publishableKey = process.env.NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY;
@@ -137,27 +138,40 @@ export const getWebsiteDescriptionFromConfig = async () => {
137
138
  return null;
138
139
  }
139
140
  };
141
+ /** Why choose us — defaults + `sections.whyChooseUs` override. */
140
142
  export const getFeaturesFromConfig = async () => {
141
143
  try {
142
- const config = await getDynamicConfig();
143
- const homepageConfig = config?.["homepage-config"];
144
- if (!homepageConfig)
145
- return null;
146
- const title = homepageConfig["why-choose-us-title"] || "Why Choose Us?";
147
- const featuresRaw = homepageConfig["why-choose-us-features"] || [];
148
- const features = featuresRaw.map((item) => {
149
- const feature = item?.feature || item;
150
- return {
151
- name: feature?.["feature-name"] || "",
152
- icon: feature?.["feature-icon"] || "",
153
- };
154
- }).filter((f) => f.name && f.icon);
144
+ const block = await getMergedSectionBlock("whyChooseUs");
145
+ const copy = parseSectionCopy(block);
146
+ const title = copy.title ?? copy.name ?? "";
147
+ const featuresRaw = block.features ?? block.items ?? [];
148
+ const features = parseFeatureIconList(featuresRaw);
155
149
  return { title, features };
156
150
  }
157
- catch (error) {
158
- return null;
151
+ catch {
152
+ const block = DEFAULT_HOMEPAGE_SECTIONS.whyChooseUs;
153
+ const copy = parseSectionCopy(block);
154
+ return {
155
+ title: copy.title ?? copy.name ?? "",
156
+ features: parseFeatureIconList(block.features ?? []),
157
+ };
159
158
  }
160
159
  };
160
+ function parseFeatureIconList(raw) {
161
+ if (!Array.isArray(raw))
162
+ return [];
163
+ return raw
164
+ .map((item) => {
165
+ if (!item || typeof item !== "object")
166
+ return null;
167
+ const feature = item.feature ?? item;
168
+ const row = feature;
169
+ const name = normalizeCmsText(row["feature-name"] ?? row.name) ?? "";
170
+ const icon = normalizeCmsText(row["feature-icon"] ?? row.icon) ?? "";
171
+ return name && icon ? { name, icon } : null;
172
+ })
173
+ .filter(Boolean);
174
+ }
161
175
  const EMAIL_PATTERN = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
162
176
  /** Fix common UTF-8 mojibake from CMS copy-paste (e.g. em dash, apostrophe). */
163
177
  function normalizeCmsText(value) {
@@ -170,6 +184,160 @@ function normalizeCmsText(value) {
170
184
  .replace(/ΓÇ£|ΓÇ¥/g, '"')
171
185
  .replace(/≡ƒÿÄ≡ƒæòΓ£¿/g, " 👕✨");
172
186
  }
187
+ const EMPTY_SECTION_COPY = {
188
+ title: null,
189
+ name: null,
190
+ text: null,
191
+ description: null,
192
+ subtitle: null,
193
+ eyebrow: null,
194
+ };
195
+ export function parseSectionCopy(block) {
196
+ if (!block || typeof block !== "object")
197
+ return { ...EMPTY_SECTION_COPY };
198
+ const row = block;
199
+ return {
200
+ title: normalizeCmsText(row.title) ?? null,
201
+ name: normalizeCmsText(row.name) ?? null,
202
+ text: normalizeCmsText(row.text) ?? null,
203
+ description: normalizeCmsText(row.description) ?? null,
204
+ subtitle: normalizeCmsText(row.subtitle) ?? null,
205
+ eyebrow: normalizeCmsText(row.eyebrow) ?? null,
206
+ };
207
+ }
208
+ const HOME_SECTION_COPY_IDS = new Set(HOME_SECTION_COPY_ID_LIST);
209
+ function sectionIdFromConfigKey(key) {
210
+ const id = key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
211
+ return HOME_SECTION_COPY_IDS.has(id) ? id : null;
212
+ }
213
+ async function getHomepageSectionsRoot() {
214
+ const config = await getDynamicConfig();
215
+ const root = config?.["homepage-config"]?.sections;
216
+ return root && typeof root === "object"
217
+ ? root
218
+ : {};
219
+ }
220
+ function findSectionBlock(root, id) {
221
+ for (const [key, value] of Object.entries(root)) {
222
+ if (sectionIdFromConfigKey(key) !== id)
223
+ continue;
224
+ if (value && typeof value === "object") {
225
+ return value;
226
+ }
227
+ if (typeof value === "string") {
228
+ return { text: value };
229
+ }
230
+ }
231
+ return null;
232
+ }
233
+ /** Merge CMS section block onto package defaults (override wins when set). */
234
+ export function mergeSectionBlock(defaults, override) {
235
+ if (!override)
236
+ return { ...defaults };
237
+ const merged = { ...defaults };
238
+ for (const [key, value] of Object.entries(override)) {
239
+ if (value === undefined || value === null)
240
+ continue;
241
+ if (Array.isArray(value)) {
242
+ if (value.length > 0)
243
+ merged[key] = value;
244
+ continue;
245
+ }
246
+ if (typeof value === "string") {
247
+ if (value.trim())
248
+ merged[key] = value.trim();
249
+ continue;
250
+ }
251
+ if (typeof value === "boolean" || typeof value === "number") {
252
+ merged[key] = value;
253
+ continue;
254
+ }
255
+ if (typeof value === "object") {
256
+ const base = merged[key] && typeof merged[key] === "object" && !Array.isArray(merged[key])
257
+ ? merged[key]
258
+ : {};
259
+ merged[key] = mergeSectionBlock(base, value);
260
+ }
261
+ }
262
+ return merged;
263
+ }
264
+ async function getMergedSectionBlock(id) {
265
+ const root = await getHomepageSectionsRoot();
266
+ const defaults = DEFAULT_HOMEPAGE_SECTIONS[id] ?? {};
267
+ const override = findSectionBlock(root, id);
268
+ return mergeSectionBlock({ ...defaults }, override);
269
+ }
270
+ function mergeSectionCopy(base, patch) {
271
+ const pick = (override, fallback) => override ?? fallback;
272
+ return {
273
+ title: pick(patch.title ?? patch.name, base.title ?? base.name),
274
+ name: pick(patch.name, base.name),
275
+ text: pick(patch.text, base.text),
276
+ description: pick(patch.description, base.description),
277
+ subtitle: pick(patch.subtitle, base.subtitle),
278
+ eyebrow: pick(patch.eyebrow, base.eyebrow),
279
+ };
280
+ }
281
+ function parseAnnouncementMessages(block) {
282
+ if (!block)
283
+ return [];
284
+ const raw = block.messages ?? block.items ?? block["announcement-messages"];
285
+ if (!Array.isArray(raw))
286
+ return [];
287
+ return raw
288
+ .map((item) => {
289
+ if (typeof item === "string")
290
+ return item.trim();
291
+ if (item && typeof item === "object") {
292
+ const row = item;
293
+ const nested = (row.message ?? row.text);
294
+ return typeof nested === "string" ? nested.trim() : "";
295
+ }
296
+ return "";
297
+ })
298
+ .filter(Boolean);
299
+ }
300
+ /**
301
+ * Merged section copy: package defaults + `homepage-config.sections` overrides.
302
+ */
303
+ export const getHomeSectionsCopyFromConfig = async () => {
304
+ try {
305
+ const copy = {};
306
+ for (const id of HOME_SECTION_COPY_ID_LIST) {
307
+ const block = await getMergedSectionBlock(id);
308
+ copy[id] = parseSectionCopy(block);
309
+ }
310
+ return copy;
311
+ }
312
+ catch {
313
+ const fallback = {};
314
+ for (const id of HOME_SECTION_COPY_ID_LIST) {
315
+ fallback[id] = parseSectionCopy(DEFAULT_HOMEPAGE_SECTIONS[id]);
316
+ }
317
+ return fallback;
318
+ }
319
+ };
320
+ /** Trust badge row — defaults + `sections.features` override. */
321
+ export const getTrustFeaturesFromConfig = async () => {
322
+ try {
323
+ const block = await getMergedSectionBlock("features");
324
+ const copy = parseSectionCopy(block);
325
+ const title = copy.title ?? copy.name;
326
+ const description = copy.description ?? copy.text;
327
+ const rawList = block.features ?? block.items ?? [];
328
+ const features = parseFeatureIconList(rawList);
329
+ return { title: title ?? null, description: description ?? null, features };
330
+ }
331
+ catch {
332
+ const block = DEFAULT_HOMEPAGE_SECTIONS.features;
333
+ const copy = parseSectionCopy(block);
334
+ return {
335
+ title: copy.title,
336
+ description: copy.description,
337
+ features: parseFeatureIconList(block.features ?? []),
338
+ };
339
+ }
340
+ };
173
341
  function normalizeBannerButtonName(value) {
174
342
  const text = normalizeCmsText(value);
175
343
  if (!text)
@@ -201,28 +369,84 @@ export const getContactInfoFromConfig = async () => {
201
369
  return null;
202
370
  }
203
371
  };
372
+ function normalizeVideoStoryUrl(entry) {
373
+ if (typeof entry === "string" && entry.trim())
374
+ return entry.trim();
375
+ if (!entry || typeof entry !== "object")
376
+ return null;
377
+ const row = entry;
378
+ const nested = row["video-story"] ??
379
+ row["video_stories"] ??
380
+ row;
381
+ const url = nested["video-url"] ??
382
+ nested["video_url"] ??
383
+ nested.url ??
384
+ nested.src ??
385
+ nested.video;
386
+ return typeof url === "string" && url.trim() ? url.trim() : null;
387
+ }
388
+ /**
389
+ * Homepage video stories/reviews carousel (`homepage-config.video-stories`).
390
+ */
391
+ export const getVideoStoriesFromConfig = async () => {
392
+ try {
393
+ const config = await getDynamicConfig();
394
+ const homepageConfig = config?.["homepage-config"];
395
+ if (!homepageConfig)
396
+ return null;
397
+ const block = await getMergedSectionBlock("videoStories");
398
+ const copy = parseSectionCopy(block);
399
+ const title = copy.title ?? copy.name ?? "";
400
+ const raw = block["video-urls"] ??
401
+ block.videoUrls ??
402
+ block.videos ??
403
+ block["video-stories"] ??
404
+ homepageConfig["video-stories"] ??
405
+ homepageConfig["video-stories-array"] ??
406
+ homepageConfig["video_stories"] ??
407
+ [];
408
+ const list = Array.isArray(raw) ? raw : [raw];
409
+ const videoUrls = list
410
+ .map(normalizeVideoStoryUrl)
411
+ .filter((url) => Boolean(url));
412
+ return { title, videoUrls };
413
+ }
414
+ catch {
415
+ const block = DEFAULT_HOMEPAGE_SECTIONS.videoStories;
416
+ const copy = parseSectionCopy(block);
417
+ return {
418
+ title: copy.title ?? copy.name ?? "",
419
+ videoUrls: [],
420
+ };
421
+ }
422
+ };
204
423
  export const getTestimonialsFromConfig = async () => {
205
424
  try {
206
425
  const config = await getDynamicConfig();
207
426
  const homepageConfig = config?.["homepage-config"];
208
427
  if (!homepageConfig)
209
428
  return null;
210
- const title = homepageConfig["rating-title"] || "Happy Parents Say About Us";
429
+ const block = await getMergedSectionBlock("testimonials");
430
+ const copy = parseSectionCopy(block);
431
+ const title = copy.title ?? copy.name ?? "";
211
432
  const ratings = homepageConfig["ratings"] || [];
212
- const testimonials = ratings.map((item, index) => {
213
- const review = item?.review || item;
433
+ let testimonials = (Array.isArray(ratings) ? ratings : []).map((item, index) => {
434
+ const row = item;
435
+ const review = (row?.review ?? row);
214
436
  return {
215
437
  id: `review-${index}`,
216
- text: review?.["review-description"] || "",
217
- name: review?.["review-user-name"] || "",
218
- rating: parseFloat(review?.["review-rating"] || "5"),
219
- avatar: review?.["review-profile-image"] || undefined,
438
+ text: String(review?.["review-description"] ?? "").trim(),
439
+ name: String(review?.["review-user-name"] ?? "").trim(),
440
+ rating: parseFloat(String(review?.["review-rating"] ?? "5")),
441
+ avatar: review?.["review-profile-image"],
220
442
  };
221
443
  }).filter((t) => t.text && t.name);
222
444
  return { title, testimonials };
223
445
  }
224
- catch (error) {
225
- return null;
446
+ catch {
447
+ const block = DEFAULT_HOMEPAGE_SECTIONS.testimonials;
448
+ const copy = parseSectionCopy(block);
449
+ return { title: copy.title ?? copy.name ?? "", testimonials: [] };
226
450
  }
227
451
  };
228
452
  export const getSocialLinksFromConfig = async () => {
@@ -272,6 +496,168 @@ export const getFaqsFromConfig = async () => {
272
496
  return null;
273
497
  }
274
498
  };
499
+ export const getAnnouncementMessagesFromConfig = async () => {
500
+ try {
501
+ const block = await getMergedSectionBlock("promoAnnouncements");
502
+ return parseAnnouncementMessages(block);
503
+ }
504
+ catch {
505
+ return parseAnnouncementMessages(DEFAULT_HOMEPAGE_SECTIONS.promoAnnouncements);
506
+ }
507
+ };
508
+ export const getAboutBrandFromConfig = async () => {
509
+ try {
510
+ const config = await getDynamicConfig();
511
+ const merged = await getMergedSectionBlock("aboutBrand");
512
+ const legacy = config?.["homepage-config"]?.["about-brand"] ??
513
+ config?.["homepage-config"]?.["who-we-are"];
514
+ const b = mergeSectionBlock(merged, legacy && typeof legacy === "object"
515
+ ? legacy
516
+ : null);
517
+ const statsRaw = (b.stats ?? b["about-stats"] ?? []);
518
+ const stats = Array.isArray(statsRaw)
519
+ ? statsRaw
520
+ .map((s) => {
521
+ if (!s || typeof s !== "object")
522
+ return null;
523
+ const row = s;
524
+ const label = String(row.label ?? row.name ?? "").trim();
525
+ const value = String(row.value ?? "").trim();
526
+ return label && value ? { label, value } : null;
527
+ })
528
+ .filter(Boolean)
529
+ : [];
530
+ const copy = parseSectionCopy(b);
531
+ return {
532
+ eyebrow: copy.eyebrow ?? "",
533
+ title: copy.title ?? copy.name ?? "",
534
+ description: copy.description ?? copy.text ?? "",
535
+ readMoreHref: String(b.readMoreHref ?? b["read-more-link"] ?? "/about"),
536
+ stats,
537
+ };
538
+ }
539
+ catch {
540
+ const b = DEFAULT_HOMEPAGE_SECTIONS.aboutBrand;
541
+ const copy = parseSectionCopy(b);
542
+ return {
543
+ eyebrow: copy.eyebrow ?? "",
544
+ title: copy.title ?? copy.name ?? "",
545
+ description: copy.description ?? copy.text ?? "",
546
+ readMoreHref: String(b.readMoreHref ?? "/about"),
547
+ stats: (b.stats ?? []),
548
+ };
549
+ }
550
+ };
551
+ export const getBrandPillarsFromConfig = async () => {
552
+ try {
553
+ const block = await getMergedSectionBlock("brandPillars");
554
+ const copy = parseSectionCopy(block);
555
+ const sectionTitle = copy.title ?? copy.name ?? "";
556
+ const raw = block.pillars ?? block["brand-pillars"] ?? [];
557
+ const pillars = (Array.isArray(raw) ? raw : [])
558
+ .map((item) => {
559
+ if (!item || typeof item !== "object")
560
+ return null;
561
+ const row = item["pillar"] ?? item;
562
+ const p = row;
563
+ const title = String(p.title ?? p.name ?? "").trim();
564
+ const description = String(p.description ?? p.text ?? "").trim();
565
+ const image = (p.image ?? p.icon);
566
+ return title && description ? { title, description, image } : null;
567
+ })
568
+ .filter(Boolean);
569
+ return { sectionTitle, pillars };
570
+ }
571
+ catch {
572
+ const block = DEFAULT_HOMEPAGE_SECTIONS.brandPillars;
573
+ const copy = parseSectionCopy(block);
574
+ const raw = block.pillars ?? [];
575
+ return {
576
+ sectionTitle: copy.title ?? copy.name ?? "",
577
+ pillars: [...(Array.isArray(raw) ? raw : [])],
578
+ };
579
+ }
580
+ };
581
+ export const getBlogPostsFromConfig = async () => {
582
+ try {
583
+ const block = await getMergedSectionBlock("blogPosts");
584
+ const raw = block.posts ?? block["blog-posts"] ?? block["blog-array"] ?? [];
585
+ const posts = (Array.isArray(raw) ? raw : [])
586
+ .map((item) => {
587
+ if (!item || typeof item !== "object")
588
+ return null;
589
+ const row = item["blog"] ?? item;
590
+ const b = row;
591
+ const title = String(b.title ?? "").trim();
592
+ const href = String(b.href ?? b.link ?? b.url ?? "").trim();
593
+ if (!title || !href)
594
+ return null;
595
+ return {
596
+ title,
597
+ href,
598
+ excerpt: String(b.excerpt ?? b.description ?? "").trim() || undefined,
599
+ category: String(b.category ?? b.tag ?? "").trim() || undefined,
600
+ date: String(b.date ?? "").trim() || undefined,
601
+ image: (b.image ?? b.thumbnail),
602
+ };
603
+ })
604
+ .filter(Boolean);
605
+ return posts;
606
+ }
607
+ catch {
608
+ const block = DEFAULT_HOMEPAGE_SECTIONS.blogPosts;
609
+ const raw = block.posts ?? [];
610
+ return (Array.isArray(raw) ? raw : [])
611
+ .map((item) => {
612
+ if (!item || typeof item !== "object")
613
+ return null;
614
+ const b = item;
615
+ const title = String(b.title ?? "").trim();
616
+ const href = String(b.href ?? b.link ?? "").trim();
617
+ if (!title || !href)
618
+ return null;
619
+ return { title, href };
620
+ })
621
+ .filter(Boolean);
622
+ }
623
+ };
624
+ function readPromoCountdownBlock(block) {
625
+ if (!block || typeof block !== "object") {
626
+ return { code: null, message: null, endAt: null, active: undefined };
627
+ }
628
+ const row = block;
629
+ const code = normalizeCmsText(row["promo-code"] ?? row.code ?? row["coupon-code"]) ?? null;
630
+ const message = normalizeCmsText(row["promo-text"] ?? row.message ?? row.text) ?? null;
631
+ const endAtRaw = row["end-at"] ?? row.endAt ?? row["ends-at"];
632
+ const endAt = typeof endAtRaw === "string" && endAtRaw.trim() ? endAtRaw.trim() : null;
633
+ const activeRaw = row["promo-active"] ?? row.active;
634
+ const active = typeof activeRaw === "boolean" ? activeRaw : undefined;
635
+ return { code, message, endAt, active };
636
+ }
637
+ /** Promo countdown — defaults + `sections.promoCountdown` override. */
638
+ export const getPromoCountdownFromConfig = async () => {
639
+ try {
640
+ const block = await getMergedSectionBlock("promoCountdown");
641
+ const fromBlock = readPromoCountdownBlock(block);
642
+ const defaults = readPromoCountdownBlock(DEFAULT_HOMEPAGE_SECTIONS.promoCountdown);
643
+ return {
644
+ code: fromBlock.code ?? defaults.code,
645
+ message: fromBlock.message ?? defaults.message,
646
+ endAt: fromBlock.endAt ?? defaults.endAt,
647
+ active: fromBlock.active ?? defaults.active ?? false,
648
+ };
649
+ }
650
+ catch {
651
+ const defaults = readPromoCountdownBlock(DEFAULT_HOMEPAGE_SECTIONS.promoCountdown);
652
+ return {
653
+ code: defaults.code,
654
+ message: defaults.message,
655
+ endAt: defaults.endAt,
656
+ active: defaults.active ?? false,
657
+ };
658
+ }
659
+ };
660
+ export { DEFAULT_HOMEPAGE_SECTIONS } from "./homepage-section-defaults";
275
661
  export const getPromoBarConfig = async () => {
276
662
  try {
277
663
  const config = await getDynamicConfig();
@@ -1,15 +1,42 @@
1
+ import { HttpTypes } from "@medusajs/types";
1
2
  import { getRegion } from "./regions";
3
+ import { type AboutBrandConfig, type BrandPillarConfig, type BlogPostConfig, type HomeSectionsCopy, type TrustFeaturesConfig } from "./dynamic-config";
2
4
  export type HomePageData = {
3
5
  region: Awaited<ReturnType<typeof getRegion>>;
4
6
  collections: Array<Record<string, unknown>>;
5
- categories: unknown[];
6
- newArrivals: unknown[];
7
- bestsellers: unknown[];
7
+ categories: HttpTypes.StoreProductCategory[];
8
+ newArrivals: HttpTypes.StoreProduct[];
9
+ bestsellers: HttpTypes.StoreProduct[];
8
10
  testimonials: unknown | null;
9
11
  ratings: unknown[];
12
+ videoStories: {
13
+ title: string;
14
+ videoUrls: string[];
15
+ } | null;
16
+ announcementMessages: string[];
17
+ promoCountdown: {
18
+ code: string | null;
19
+ message: string | null;
20
+ endAt: string | null;
21
+ active: boolean;
22
+ };
23
+ luxeFavourites: HttpTypes.StoreProduct[];
24
+ celebrityProduct: HttpTypes.StoreProduct | null;
25
+ baptismGirl: HttpTypes.StoreProduct[];
26
+ baptismBoy: HttpTypes.StoreProduct[];
27
+ baptismPicks: HttpTypes.StoreProduct[];
28
+ themeProducts: HttpTypes.StoreProduct[];
29
+ aboutBrand: AboutBrandConfig;
30
+ brandPillars: {
31
+ sectionTitle: string;
32
+ pillars: BrandPillarConfig[];
33
+ };
34
+ blogPosts: BlogPostConfig[];
35
+ sectionsCopy: HomeSectionsCopy;
36
+ trustFeatures: TrustFeaturesConfig;
10
37
  };
11
38
  /**
12
- * Parallel home page data loader (replaces per-page Promise.all boilerplate).
39
+ * Parallel home page data loader for full storefront homepage sections.
13
40
  */
14
41
  export declare function loadHomePageData(countryCode: string): Promise<HomePageData | null>;
15
42
  //# sourceMappingURL=home.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../src/server/home.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC;IAC9C,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5C,UAAU,EAAE,OAAO,EAAE,CAAC;IACtB,WAAW,EAAE,OAAO,EAAE,CAAC;IACvB,WAAW,EAAE,OAAO,EAAE,CAAC;IACvB,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,OAAO,EAAE,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA6CxF"}
1
+ {"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../src/server/home.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAUL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACzB,MAAM,kBAAkB,CAAC;AAiC1B,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC;IAC9C,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5C,UAAU,EAAE,SAAS,CAAC,oBAAoB,EAAE,CAAC;IAC7C,WAAW,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC;IACtC,WAAW,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC;IACtC,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5D,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,cAAc,EAAE;QACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;IACF,cAAc,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC;IACzC,gBAAgB,EAAE,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC;IAChD,WAAW,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC;IACtC,UAAU,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC;IACrC,YAAY,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC;IACvC,aAAa,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC;IACxC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,YAAY,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,iBAAiB,EAAE,CAAA;KAAE,CAAC;IACrE,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,YAAY,EAAE,gBAAgB,CAAC;IAC/B,aAAa,EAAE,mBAAmB,CAAC;CACpC,CAAC;AAEF;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA2HxF"}