@pradip1995/framework-runtime 0.2.5 → 0.2.7

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pradip1995/framework-runtime",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
4
4
  "license": "MIT",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -14,9 +14,9 @@
14
14
  "./render-page": "./src/render-page.tsx"
15
15
  },
16
16
  "dependencies": {
17
- "@pradip1995/framework-core": "0.2.1",
18
- "@pradip1995/plugin-sdk": "0.2.1",
19
- "@pradip1995/medusa-connector": "0.2.2"
17
+ "@pradip1995/framework-core": "^0.2.1",
18
+ "@pradip1995/plugin-sdk": "^0.2.2",
19
+ "@pradip1995/medusa-connector": "^0.2.3"
20
20
  },
21
21
  "peerDependencies": {
22
22
  "next": ">=15",
package/src/index.ts CHANGED
@@ -8,4 +8,5 @@ export {
8
8
  export { mergeBuilderSegmentData } from "./builder-data"
9
9
  export type { RenderPageInput } from "./render-page"
10
10
  export type { ConfiguredPage, RenderConfiguredPageInput, SegmentEntry } from "./render-configured-page"
11
+ export type { SiteConfig } from "./segment-props"
11
12
  export type { BuilderSegmentDataFile } from "./builder-data"
@@ -3,8 +3,10 @@ import { resolveServices } from "./register-services"
3
3
  import {
4
4
  applyChromeSegmentData,
5
5
  applyBuilderDataToWorkflow,
6
+ applySiteConfig,
6
7
  resolveSegmentProps,
7
8
  type ChromeSegmentRef,
9
+ type SiteConfig,
8
10
  } from "./segment-props"
9
11
  import type { BuilderSegmentDataFile } from "./builder-data"
10
12
  import type { ComponentType, ReactNode } from "react"
@@ -34,6 +36,8 @@ export type RenderConfiguredPageInput = {
34
36
  searchParams: Record<string, string | string[] | undefined>
35
37
  /** Global layout chrome from pages.config.json chrome[] */
36
38
  chrome?: ChromeSegmentRef[] | null
39
+ /** Store branding defaults from pages.config.json site */
40
+ site?: SiteConfig | null
37
41
  /** @deprecated legacy global overlay */
38
42
  pageSegmentData?: BuilderSegmentDataFile | null
39
43
  /** @deprecated use chrome + inline segment data */
@@ -63,6 +67,7 @@ export async function renderConfiguredPage(input: RenderConfiguredPageInput): Pr
63
67
  ? applyBuilderDataToWorkflow(workflowData, legacyOverlay)
64
68
  : workflowData
65
69
  data = applyChromeSegmentData(data, input.chrome)
70
+ data = applySiteConfig(data, input.site)
66
71
 
67
72
  const Layout = input.page.layout
68
73
 
@@ -17,7 +17,8 @@ export const SEGMENT_DATA_KEYS: Record<string, string> = {
17
17
  "@pradip1995/segment-nav": "nav",
18
18
  "@pradip1995/segment-footer": "footer",
19
19
  "@pradip1995/segment-promo-bar": "promoBar",
20
- "@pradip1995/segment-product-grid": "store",
20
+ "@pradip1995/segment-product-grid": "store",
21
+ "@pradip1995/segment-beauty-shop-grid": "store",
21
22
  "@pradip1995/segment-refinement-list": "store",
22
23
  "@pradip1995/segment-mobile-filters": "store",
23
24
  "@pradip1995/segment-product-gallery": "product",
@@ -36,6 +37,14 @@ export const SEGMENT_DATA_KEYS: Record<string, string> = {
36
37
  "@pradip1995/segment-order-details": "orderPage",
37
38
  "@pradip1995/segment-wishlist": "wishlistPage",
38
39
  "@pradip1995/segment-help": "helpPage",
40
+ "@pradip1995/segment-shop-by-nav": "shopByNav",
41
+ "@pradip1995/segment-shop-banner": "shopBanner",
42
+ "@pradip1995/segment-newsletter": "newsletter",
43
+ "@pradip1995/segment-store-faqs": "storeFaqs",
44
+ "@pradip1995/segment-beauty-category-tiles": "beautyCategories",
45
+ "@pradip1995/segment-beauty-promise": "beautyPromise",
46
+ "@pradip1995/segment-beauty-reviews": "beautyReviews",
47
+ "@pradip1995/segment-beauty-values": "beautyValues",
39
48
  }
40
49
 
41
50
  export function getSegmentDataKey(segmentPkg: string): string | undefined {
@@ -47,7 +56,7 @@ export function getSegmentProps(
47
56
  data: Record<string, unknown>
48
57
  ): Record<string, unknown> {
49
58
  const key = SEGMENT_DATA_KEYS[segmentPkg]
50
- if (!key) return data
59
+ if (!key) return {}
51
60
  const value = data[key]
52
61
  if (value && typeof value === "object" && !Array.isArray(value)) {
53
62
  return value as Record<string, unknown>
@@ -99,12 +108,85 @@ export function resolveSegmentProps(
99
108
  base.cart = layoutCart
100
109
  }
101
110
 
102
- if (!inlineData || Object.keys(inlineData).length === 0) return base
103
- return mergeSegmentRecords(base, inlineData)
111
+ if (!inlineData || Object.keys(inlineData).length === 0) {
112
+ return applyStorefrontDefaults(base, workflowData)
113
+ }
114
+ return applyStorefrontDefaults(mergeSegmentRecords(base, inlineData), workflowData)
115
+ }
116
+
117
+ function applyStorefrontDefaults(
118
+ props: Record<string, unknown>,
119
+ workflowData: Record<string, unknown>
120
+ ): Record<string, unknown> {
121
+ const next = { ...props }
122
+ const variant = workflowData.productCardVariant
123
+ if (
124
+ (variant === "beauty" || variant === "default") &&
125
+ next.variant === undefined
126
+ ) {
127
+ next.variant = variant
128
+ }
129
+
130
+ if (next.shopName === undefined) {
131
+ const nav = workflowData.nav
132
+ const footer = workflowData.footer
133
+ const checkout = workflowData.checkout
134
+ const siteName =
135
+ (nav && typeof nav === "object" && (nav as Record<string, unknown>).shopName) ||
136
+ (footer && typeof footer === "object" && (footer as Record<string, unknown>).shopName) ||
137
+ (checkout && typeof checkout === "object" && (checkout as Record<string, unknown>).shopName)
138
+ if (typeof siteName === "string" && siteName.trim()) {
139
+ next.shopName = siteName
140
+ }
141
+ }
142
+
143
+ return next
144
+ }
145
+
146
+ /** Apply pages.config site defaults when chrome/workflow did not set layout fields. */
147
+ export function applySiteConfig(
148
+ workflowData: Record<string, unknown>,
149
+ site: SiteConfig | null | undefined
150
+ ): Record<string, unknown> {
151
+ if (!site) return workflowData
152
+ const merged = { ...workflowData }
153
+
154
+ if (site.productCardVariant) {
155
+ merged.productCardVariant = site.productCardVariant
156
+ }
157
+
158
+ if (site.name) {
159
+ if (merged.nav && typeof merged.nav === "object" && !Array.isArray(merged.nav)) {
160
+ const nav = merged.nav as Record<string, unknown>
161
+ if (!nav.shopName) merged.nav = { ...nav, shopName: site.name }
162
+ }
163
+ if (merged.footer && typeof merged.footer === "object" && !Array.isArray(merged.footer)) {
164
+ const footer = merged.footer as Record<string, unknown>
165
+ if (!footer.shopName) merged.footer = { ...footer, shopName: site.name }
166
+ }
167
+ if (site.name && merged.checkout && typeof merged.checkout === "object" && !Array.isArray(merged.checkout)) {
168
+ const checkout = merged.checkout as Record<string, unknown>
169
+ if (!checkout.shopName) merged.checkout = { ...checkout, shopName: site.name }
170
+ }
171
+ }
172
+
173
+ if (site.description && merged.footer && typeof merged.footer === "object" && !Array.isArray(merged.footer)) {
174
+ const footer = merged.footer as Record<string, unknown>
175
+ if (!footer.description) merged.footer = { ...footer, description: site.description }
176
+ }
177
+
178
+ return merged
104
179
  }
105
180
 
106
181
  export type ChromeSegmentRef = string | { package: string; data?: Record<string, unknown> }
107
182
 
183
+ export type SiteConfig = {
184
+ name?: string
185
+ description?: string
186
+ locale?: string
187
+ productCardVariant?: "default" | "beauty"
188
+ }
189
+
108
190
  function chromePackageName(ref: ChromeSegmentRef): string {
109
191
  return typeof ref === "string" ? ref : ref.package
110
192
  }