medusa-storefront-data 2.5.9 → 2.5.10
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.
- package/package.json +9 -6
- package/dist/src/dynamic-config-schema/index.d.ts +0 -103
- package/dist/src/dynamic-config-schema/index.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/index.js +0 -172
- package/dist/src/dynamic-config-schema/sections/about-brand.d.ts +0 -5
- package/dist/src/dynamic-config-schema/sections/about-brand.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/about-brand.js +0 -30
- package/dist/src/dynamic-config-schema/sections/baptism-picks.d.ts +0 -5
- package/dist/src/dynamic-config-schema/sections/baptism-picks.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/baptism-picks.js +0 -17
- package/dist/src/dynamic-config-schema/sections/baptism.d.ts +0 -5
- package/dist/src/dynamic-config-schema/sections/baptism.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/baptism.js +0 -4
- package/dist/src/dynamic-config-schema/sections/blog-posts.d.ts +0 -5
- package/dist/src/dynamic-config-schema/sections/blog-posts.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/blog-posts.js +0 -31
- package/dist/src/dynamic-config-schema/sections/brand-marquee.d.ts +0 -5
- package/dist/src/dynamic-config-schema/sections/brand-marquee.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/brand-marquee.js +0 -9
- package/dist/src/dynamic-config-schema/sections/brand-pillars.d.ts +0 -5
- package/dist/src/dynamic-config-schema/sections/brand-pillars.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/brand-pillars.js +0 -29
- package/dist/src/dynamic-config-schema/sections/category-pills.d.ts +0 -5
- package/dist/src/dynamic-config-schema/sections/category-pills.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/category-pills.js +0 -4
- package/dist/src/dynamic-config-schema/sections/celebrity-trust.d.ts +0 -5
- package/dist/src/dynamic-config-schema/sections/celebrity-trust.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/celebrity-trust.js +0 -4
- package/dist/src/dynamic-config-schema/sections/features.d.ts +0 -5
- package/dist/src/dynamic-config-schema/sections/features.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/features.js +0 -12
- package/dist/src/dynamic-config-schema/sections/hero.d.ts +0 -6
- package/dist/src/dynamic-config-schema/sections/hero.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/hero.js +0 -9
- package/dist/src/dynamic-config-schema/sections/index.d.ts +0 -24
- package/dist/src/dynamic-config-schema/sections/index.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/index.js +0 -23
- package/dist/src/dynamic-config-schema/sections/instagram-posts.d.ts +0 -5
- package/dist/src/dynamic-config-schema/sections/instagram-posts.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/instagram-posts.js +0 -30
- package/dist/src/dynamic-config-schema/sections/loved-by-moms.d.ts +0 -5
- package/dist/src/dynamic-config-schema/sections/loved-by-moms.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/loved-by-moms.js +0 -4
- package/dist/src/dynamic-config-schema/sections/luxe-favourites.d.ts +0 -5
- package/dist/src/dynamic-config-schema/sections/luxe-favourites.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/luxe-favourites.js +0 -4
- package/dist/src/dynamic-config-schema/sections/new-arrivals-classic.d.ts +0 -5
- package/dist/src/dynamic-config-schema/sections/new-arrivals-classic.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/new-arrivals-classic.js +0 -12
- package/dist/src/dynamic-config-schema/sections/new-arrivals.d.ts +0 -5
- package/dist/src/dynamic-config-schema/sections/new-arrivals.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/new-arrivals.js +0 -12
- package/dist/src/dynamic-config-schema/sections/promo-announcements.d.ts +0 -5
- package/dist/src/dynamic-config-schema/sections/promo-announcements.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/promo-announcements.js +0 -16
- package/dist/src/dynamic-config-schema/sections/promo-countdown.d.ts +0 -5
- package/dist/src/dynamic-config-schema/sections/promo-countdown.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/promo-countdown.js +0 -16
- package/dist/src/dynamic-config-schema/sections/shop-by-age.d.ts +0 -5
- package/dist/src/dynamic-config-schema/sections/shop-by-age.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/shop-by-age.js +0 -4
- package/dist/src/dynamic-config-schema/sections/shop-by-category.d.ts +0 -5
- package/dist/src/dynamic-config-schema/sections/shop-by-category.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/shop-by-category.js +0 -4
- package/dist/src/dynamic-config-schema/sections/testimonials.d.ts +0 -5
- package/dist/src/dynamic-config-schema/sections/testimonials.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/testimonials.js +0 -9
- package/dist/src/dynamic-config-schema/sections/theme-dresses.d.ts +0 -5
- package/dist/src/dynamic-config-schema/sections/theme-dresses.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/theme-dresses.js +0 -4
- package/dist/src/dynamic-config-schema/sections/video-stories.d.ts +0 -5
- package/dist/src/dynamic-config-schema/sections/video-stories.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/video-stories.js +0 -24
- package/dist/src/dynamic-config-schema/sections/why-choose-us.d.ts +0 -5
- package/dist/src/dynamic-config-schema/sections/why-choose-us.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/sections/why-choose-us.js +0 -9
- package/dist/src/dynamic-config-schema/shared.d.ts +0 -35
- package/dist/src/dynamic-config-schema/shared.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/shared.js +0 -99
- package/dist/src/dynamic-config-schema/site-configs.d.ts +0 -11
- package/dist/src/dynamic-config-schema/site-configs.d.ts.map +0 -1
- package/dist/src/dynamic-config-schema/site-configs.js +0 -70
- package/dist/src/server/dynamic-config-api.d.ts +0 -11
- package/dist/src/server/dynamic-config-api.d.ts.map +0 -1
- package/dist/src/server/dynamic-config-api.js +0 -46
- package/dist/src/server/hero-banner-resolve.test.d.ts +0 -2
- package/dist/src/server/hero-banner-resolve.test.d.ts.map +0 -1
- package/dist/src/server/hero-banner-resolve.test.js +0 -56
- package/dist/src/server/hero-banners-config.test.d.ts +0 -2
- package/dist/src/server/hero-banners-config.test.d.ts.map +0 -1
- package/dist/src/server/hero-banners-config.test.js +0 -44
- package/dist/src/server/resolve-home-segment-data.d.ts +0 -25
- package/dist/src/server/resolve-home-segment-data.d.ts.map +0 -1
- package/dist/src/server/resolve-home-segment-data.js +0 -20
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { normalizeHomepageConfig } from "./normalize-homepage-config";
|
|
2
|
-
function asObject(v) {
|
|
3
|
-
return v && typeof v === "object" && !Array.isArray(v) ? v : null;
|
|
4
|
-
}
|
|
5
|
-
function asArray(v) {
|
|
6
|
-
return Array.isArray(v) ? v : [];
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Medusa split keys (`site-branding`, `homepage-sections`, …) → simplified shape
|
|
10
|
-
* consumed by `normalizeHomepageConfig`.
|
|
11
|
-
*/
|
|
12
|
-
export function mergeStorefrontDynamicConfig(dynamicConfigResponse) {
|
|
13
|
-
const legacy = asObject(dynamicConfigResponse["homepage-config"]);
|
|
14
|
-
if (legacy)
|
|
15
|
-
return legacy;
|
|
16
|
-
const branding = asObject(dynamicConfigResponse["site-branding"]);
|
|
17
|
-
const contact = asObject(dynamicConfigResponse["contact"]);
|
|
18
|
-
const socialRoot = asObject(dynamicConfigResponse["social-links"]);
|
|
19
|
-
const faqsRoot = asObject(dynamicConfigResponse["faqs"]);
|
|
20
|
-
const promoBar = asObject(dynamicConfigResponse["promo-bar"]);
|
|
21
|
-
const social = asArray(socialRoot?.links) ||
|
|
22
|
-
asArray(dynamicConfigResponse["social-links"]) ||
|
|
23
|
-
[];
|
|
24
|
-
const faqs = asArray(faqsRoot?.items) || asArray(dynamicConfigResponse["faqs"]) || [];
|
|
25
|
-
return {
|
|
26
|
-
site: {
|
|
27
|
-
...branding,
|
|
28
|
-
contact,
|
|
29
|
-
social,
|
|
30
|
-
faqs,
|
|
31
|
-
},
|
|
32
|
-
banners: asObject(dynamicConfigResponse["hero-banners"]),
|
|
33
|
-
sections: asObject(dynamicConfigResponse["homepage-sections"]),
|
|
34
|
-
promoBar,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
/** Full `GET /store/dynamic-config` body → legacy `homepage-config`. */
|
|
38
|
-
export function homepageConfigFromApiResponse(response) {
|
|
39
|
-
if (!response || typeof response !== "object")
|
|
40
|
-
return {};
|
|
41
|
-
const row = response;
|
|
42
|
-
if (row["homepage-config"]) {
|
|
43
|
-
return normalizeHomepageConfig(row["homepage-config"]);
|
|
44
|
-
}
|
|
45
|
-
return normalizeHomepageConfig(mergeStorefrontDynamicConfig(row));
|
|
46
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hero-banner-resolve.test.d.ts","sourceRoot":"","sources":["../../../src/server/hero-banner-resolve.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { pickHeroBannerBySource } from "./hero-banner-priority";
|
|
3
|
-
import { parseHeroBannersFromDynamicConfig } from "./page-input";
|
|
4
|
-
const themeHome = {
|
|
5
|
-
image: "/theme.png",
|
|
6
|
-
title: "Theme title",
|
|
7
|
-
subtitle: "Theme subtitle",
|
|
8
|
-
};
|
|
9
|
-
const libraryHome = {
|
|
10
|
-
image: "/library.png",
|
|
11
|
-
title: "Library title",
|
|
12
|
-
subtitle: "Library subtitle",
|
|
13
|
-
};
|
|
14
|
-
const cases = [
|
|
15
|
-
{
|
|
16
|
-
name: "parseHeroBannersFromDynamicConfig reads hero-banners",
|
|
17
|
-
run: () => {
|
|
18
|
-
const parsed = parseHeroBannersFromDynamicConfig({
|
|
19
|
-
"hero-banners": {
|
|
20
|
-
homeBanners: [
|
|
21
|
-
{
|
|
22
|
-
slide: {
|
|
23
|
-
image: "https://cdn/cms.jpg",
|
|
24
|
-
title: "CMS title",
|
|
25
|
-
subtitle: "CMS subtitle",
|
|
26
|
-
},
|
|
27
|
-
},
|
|
28
|
-
],
|
|
29
|
-
},
|
|
30
|
-
});
|
|
31
|
-
expect(parsed.home[0]?.title).toBe("CMS title");
|
|
32
|
-
},
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
name: "pickHeroBannerBySource prefers dynamic-config",
|
|
36
|
-
run: () => {
|
|
37
|
-
const cms = { image: "https://cdn/cms.jpg", title: "CMS title" };
|
|
38
|
-
const picked = pickHeroBannerBySource(cms, themeHome, libraryHome);
|
|
39
|
-
expect(picked.source).toBe("dynamic-config");
|
|
40
|
-
expect(picked.banner.title).toBe("CMS title");
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
name: "pickHeroBannerBySource falls back to theme when CMS empty",
|
|
45
|
-
run: () => {
|
|
46
|
-
const picked = pickHeroBannerBySource(null, themeHome, libraryHome);
|
|
47
|
-
expect(picked.source).toBe("theme-copy");
|
|
48
|
-
expect(picked.banner.image).toBe("/theme.png");
|
|
49
|
-
},
|
|
50
|
-
},
|
|
51
|
-
];
|
|
52
|
-
describe("hero banner priority", () => {
|
|
53
|
-
for (const { name, run } of cases) {
|
|
54
|
-
it(name, run);
|
|
55
|
-
}
|
|
56
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hero-banners-config.test.d.ts","sourceRoot":"","sources":["../../../src/server/hero-banners-config.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { describe, it } from "node:test";
|
|
2
|
-
import assert from "node:assert/strict";
|
|
3
|
-
import { homepageConfigFromDynamicResponseNormalized } from "./page-input.js";
|
|
4
|
-
const cases = [
|
|
5
|
-
{
|
|
6
|
-
name: "maps hero-banners.homeBanners slide into homepage-banner-array",
|
|
7
|
-
response: {
|
|
8
|
-
"hero-banners": {
|
|
9
|
-
homeBanners: [
|
|
10
|
-
{
|
|
11
|
-
slide: {
|
|
12
|
-
image: "https://cdn.example/hero.jpg",
|
|
13
|
-
title: "Eyebrow",
|
|
14
|
-
subtitle: "Headline",
|
|
15
|
-
buttonText: "Shop",
|
|
16
|
-
buttonLink: "/store",
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
],
|
|
20
|
-
appBanners: [],
|
|
21
|
-
},
|
|
22
|
-
},
|
|
23
|
-
expectedImage: "https://cdn.example/hero.jpg",
|
|
24
|
-
expectedTitle: "Eyebrow",
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
name: "leaves homepage-banner-array empty when hero-banners is missing",
|
|
28
|
-
response: {},
|
|
29
|
-
},
|
|
30
|
-
];
|
|
31
|
-
describe("hero-banners dynamic-config", () => {
|
|
32
|
-
for (const { name, response, expectedImage, expectedTitle } of cases) {
|
|
33
|
-
it(name, () => {
|
|
34
|
-
const config = homepageConfigFromDynamicResponseNormalized(response);
|
|
35
|
-
const banner = config["homepage-banner-array"]?.[0]?.["homepage-banner"];
|
|
36
|
-
if (!expectedImage) {
|
|
37
|
-
assert.equal(config["homepage-banner-array"]?.length ?? 0, 0);
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
assert.equal(banner?.["homepage-banner-image"], expectedImage);
|
|
41
|
-
assert.equal(banner?.["homepage-banner-title"], expectedTitle);
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
});
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import "server-only";
|
|
2
|
-
import type { HomepageConfig } from "./homepage-config.types";
|
|
3
|
-
import { getFeaturesFromPageInput, getPromoCountdownFromPageInput, getTestimonialsFromPageInput, getVideoStoriesFromPageInput, type AboutBrandConfig, type BlogPostConfig, type BrandPillarConfig, type HomepageBanner, type HomeSectionsCopy, type InstagramPostsData, type TrustFeaturesConfig } from "./dynamic-config";
|
|
4
|
-
/** Config-driven homepage fields (no Medusa catalog APIs). */
|
|
5
|
-
export type HomeSegmentConfigData = {
|
|
6
|
-
homeBanners: HomepageBanner[] | null;
|
|
7
|
-
appBanners: HomepageBanner[] | null;
|
|
8
|
-
whyChooseUsFeatures: ReturnType<typeof getFeaturesFromPageInput>;
|
|
9
|
-
testimonials: ReturnType<typeof getTestimonialsFromPageInput>;
|
|
10
|
-
videoStories: ReturnType<typeof getVideoStoriesFromPageInput>;
|
|
11
|
-
announcementMessages: string[];
|
|
12
|
-
promoCountdown: ReturnType<typeof getPromoCountdownFromPageInput>;
|
|
13
|
-
aboutBrand: AboutBrandConfig;
|
|
14
|
-
brandPillars: {
|
|
15
|
-
sectionTitle: string;
|
|
16
|
-
pillars: BrandPillarConfig[];
|
|
17
|
-
};
|
|
18
|
-
blogPosts: BlogPostConfig[];
|
|
19
|
-
instagramPosts: InstagramPostsData;
|
|
20
|
-
sectionsCopy: HomeSectionsCopy;
|
|
21
|
-
trustFeatures: TrustFeaturesConfig;
|
|
22
|
-
};
|
|
23
|
-
/** Resolve all segment JSON from `pageInput` (package defaults when omitted). */
|
|
24
|
-
export declare function resolveHomeSegmentConfigData(pageInput?: HomepageConfig | null): HomeSegmentConfigData;
|
|
25
|
-
//# sourceMappingURL=resolve-home-segment-data.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-home-segment-data.d.ts","sourceRoot":"","sources":["../../../src/server/resolve-home-segment-data.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAA;AAEpB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,EAML,wBAAwB,EAIxB,8BAA8B,EAC9B,4BAA4B,EAE5B,4BAA4B,EAC5B,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACzB,MAAM,kBAAkB,CAAA;AAEzB,8DAA8D;AAC9D,MAAM,MAAM,qBAAqB,GAAG;IAClC,WAAW,EAAE,cAAc,EAAE,GAAG,IAAI,CAAA;IACpC,UAAU,EAAE,cAAc,EAAE,GAAG,IAAI,CAAA;IACnC,mBAAmB,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAA;IAChE,YAAY,EAAE,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAA;IAC7D,YAAY,EAAE,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAA;IAC7D,oBAAoB,EAAE,MAAM,EAAE,CAAA;IAC9B,cAAc,EAAE,UAAU,CAAC,OAAO,8BAA8B,CAAC,CAAA;IACjE,UAAU,EAAE,gBAAgB,CAAA;IAC5B,YAAY,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,iBAAiB,EAAE,CAAA;KAAE,CAAA;IACpE,SAAS,EAAE,cAAc,EAAE,CAAA;IAC3B,cAAc,EAAE,kBAAkB,CAAA;IAClC,YAAY,EAAE,gBAAgB,CAAA;IAC9B,aAAa,EAAE,mBAAmB,CAAA;CACnC,CAAA;AAED,iFAAiF;AACjF,wBAAgB,4BAA4B,CAC1C,SAAS,CAAC,EAAE,cAAc,GAAG,IAAI,GAChC,qBAAqB,CAgBvB"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import "server-only";
|
|
2
|
-
import { getAboutBrandFromPageInput, getAnnouncementMessagesFromPageInput, getAppBannersFromPageInput, getBlogPostsFromPageInput, getBrandPillarsFromPageInput, getFeaturesFromPageInput, getHomeBannersFromPageInput, getHomeSectionsCopyFromPageInput, getInstagramPostsFromPageInput, getPromoCountdownFromPageInput, getTestimonialsFromPageInput, getTrustFeaturesFromPageInput, getVideoStoriesFromPageInput, } from "./dynamic-config";
|
|
3
|
-
/** Resolve all segment JSON from `pageInput` (package defaults when omitted). */
|
|
4
|
-
export function resolveHomeSegmentConfigData(pageInput) {
|
|
5
|
-
return {
|
|
6
|
-
homeBanners: getHomeBannersFromPageInput(pageInput),
|
|
7
|
-
appBanners: getAppBannersFromPageInput(pageInput),
|
|
8
|
-
whyChooseUsFeatures: getFeaturesFromPageInput(pageInput),
|
|
9
|
-
testimonials: getTestimonialsFromPageInput(pageInput),
|
|
10
|
-
videoStories: getVideoStoriesFromPageInput(pageInput),
|
|
11
|
-
announcementMessages: getAnnouncementMessagesFromPageInput(pageInput),
|
|
12
|
-
promoCountdown: getPromoCountdownFromPageInput(pageInput),
|
|
13
|
-
aboutBrand: getAboutBrandFromPageInput(pageInput),
|
|
14
|
-
brandPillars: getBrandPillarsFromPageInput(pageInput),
|
|
15
|
-
blogPosts: getBlogPostsFromPageInput(pageInput),
|
|
16
|
-
instagramPosts: getInstagramPostsFromPageInput(pageInput),
|
|
17
|
-
sectionsCopy: getHomeSectionsCopyFromPageInput(pageInput),
|
|
18
|
-
trustFeatures: getTrustFeaturesFromPageInput(pageInput),
|
|
19
|
-
};
|
|
20
|
-
}
|