@weaverse/hydrogen 5.16.3 → 5.17.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 +1 @@
1
- {"version":3,"sources":["../src/components/main.tsx","../src/components/index.ts","../src/hooks/theme-text-context.tsx","../src/hooks/use-weaverse-data-context.ts","../src/seo.ts","../src/types.ts","../src/utils/studio-script-src.ts","../src/utils/index.ts","../src/utils/theme-text-store.ts","../src/utils/pick-weaverse-data.ts","../src/utils/studio-request-info.ts","../src/utils/sync-reused-instance.ts","../src/utils/pixel.ts","../src/utils/use-theme-settings-store.ts","../src/utils/use-studio.ts","../src/WeaverseHydrogenRoot.tsx","../src/utils/normalize-page-url.ts","../src/weaverse-client.ts","../src/index.ts"],"names":["jsx","schema","window","type","children","data","createContext","useContext","useEffect","isBrowser","useMatches","useMemo","useRef","useRouteLoaderData","useSafeExternalStore","hydrogen_getSelectedProductOptions"],"mappings":"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","file":"index.mjs","sourcesContent":["import { createSchema, type SchemaType } from '@weaverse/schema'\nimport type { HTMLAttributes } from 'react'\nimport type { HydrogenComponentProps } from '~/types'\n\n/*\n Main is the default Weaverse component that is used to render the main content.\n This component wraps all the sections/components inside a Weaverse page.\n*/\nfunction Main(props: HydrogenComponentProps & HTMLAttributes<HTMLDivElement>) {\n let { children, dangerouslySetInnerHTML, ...rest } = props\n\n return (\n <div\n {...rest}\n // biome-ignore lint/correctness/noChildrenProp: <explanation>\n children={children}\n // biome-ignore lint/security/noDangerouslySetInnerHtmlWithChildren: <explanation>\n dangerouslySetInnerHTML={children ? undefined : dangerouslySetInnerHTML}\n />\n )\n}\n\nexport default Main\n\nexport let schema: SchemaType = createSchema({\n type: 'main',\n title: 'Main',\n})\n","import type { HydrogenComponent } from '~/types'\nimport MainComponent, { schema as mainSchema } from './main'\n\nexport let defaultComponents: HydrogenComponent[] = [\n {\n default: MainComponent,\n schema: mainSchema,\n },\n]\n","import { useSafeExternalStore } from '@weaverse/react'\nimport { createContext, type ReactNode, useContext, useMemo } from 'react'\nimport type { ThemeTextStore } from '../utils/theme-text-store'\n\n/**\n * Traverse a nested object by dot-path.\n *\n * @example\n * getNestedKey({ cart: { title: 'Cart' } }, 'cart.title') // => 'Cart'\n * getNestedKey({}, 'cart.title', 'fallback') // => 'fallback'\n */\nexport function getNestedKey(\n obj: Record<string, unknown>,\n path: string,\n fallback?: string\n): string | undefined {\n const keys = path.split('.')\n let current: unknown = obj\n\n for (const key of keys) {\n if (current == null || typeof current !== 'object') {\n return fallback\n }\n current = (current as Record<string, unknown>)[key]\n }\n\n if (typeof current === 'string') {\n return current\n }\n\n return fallback\n}\n\n/**\n * Replace `{{variable}}` patterns in a string with provided values.\n *\n * @example\n * interpolate('Hello {{name}}!', { name: 'World' }) // => 'Hello World!'\n * interpolate('-{{percentage}}% Off', { percentage: 15 }) // => '-15% Off'\n */\nexport function interpolate(\n template: string,\n variables?: Record<string, string | number>\n): string {\n if (!variables) {\n return template\n }\n\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key: string) => {\n const value = variables[key]\n return value === undefined ? match : String(value)\n })\n}\n\n// ---------------------------------------------------------------------------\n// Context & Provider\n// ---------------------------------------------------------------------------\n\n/**\n * Signature for a translation function.\n */\nexport type TranslateFunction = (\n key: string,\n variables?: Record<string, string | number>\n) => string\n\nexport type ThemeTextValue = {\n /**\n * Translate a key with optional variable interpolation.\n *\n * Priority chain (highest wins):\n * 1. External `t` (passed into `withWeaverse` / `ThemeTextProvider`)\n * 2. `merchantOverrides` (DB overrides for the current locale + design overrides)\n * 3. `staticContent` (theme default JSON)\n * 4. The key itself (fallback)\n *\n * @example\n * t('cart.title') // => \"Cart\"\n * t('badge.sale', { percentage: 15 }) // => \"-15% Off\"\n */\n t: TranslateFunction\n /** Exposed for useStudio to attach to weaverse.internal. Null in production. */\n themeTextStore: ThemeTextStore | null\n /** Active-locale translated keys loaded from the storefront API. */\n merchantOverrides: Record<string, unknown> | null\n}\n\nconst ThemeTextContext = createContext<ThemeTextValue | null>(null)\nThemeTextContext.displayName = 'WeaverseThemeTextContext'\n\nexport type ThemeTextProviderProps = {\n staticContent: Record<string, unknown>\n merchantOverrides?: Record<string, unknown>\n /**\n * Optional external translation function.\n * When provided it becomes the **highest-priority** source:\n * if it returns a non-empty string that differs from the raw key,\n * that value is used; otherwise the internal resolution chain continues.\n */\n t?: TranslateFunction\n /** Optional store for live design-mode text overrides from the builder. */\n themeTextStore?: ThemeTextStore | null\n children: ReactNode\n}\n\n/**\n * Convert flat dot-notation keys to a nested object structure.\n *\n * @example\n * unflattenKeys({ \"cart.title\": \"Cart\", \"cart.empty\": \"Empty\" })\n * // => { cart: { title: \"Cart\", empty: \"Empty\" } }\n */\nfunction unflattenKeys(flat: Record<string, string>): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const [dotPath, value] of Object.entries(flat)) {\n const keys = dotPath.split('.')\n let current: Record<string, unknown> = result\n for (let i = 0; i < keys.length - 1; i++) {\n const k = keys[i]\n if (!(k in current) || typeof current[k] !== 'object') {\n current[k] = {}\n }\n current = current[k] as Record<string, unknown>\n }\n current[keys[keys.length - 1]] = value\n }\n return result\n}\n\n// No-op fallback for useSafeExternalStore when store is null (production).\n// Module-level constants — stable references, zero allocation per render.\nconst EMPTY: Record<string, string> = {}\nconst NOOP_SUBSCRIBE = () => () => {}\nconst NOOP_SNAPSHOT = () => EMPTY\n\n/**\n * Provider that wraps the app to expose the `t()` function.\n *\n * - `staticContent` – the theme's default locale JSON (from themeSchema.i18n)\n * - `merchantOverrides` – locale-specific overrides fetched from the API\n * - `themeTextStore` – optional store for live design-mode text overrides\n */\nexport function ThemeTextProvider({\n staticContent,\n merchantOverrides,\n t: externalT,\n themeTextStore,\n children,\n}: ThemeTextProviderProps) {\n // Subscribe to design-mode overrides. No-op when store is null (production).\n const designOverrides = useSafeExternalStore(\n themeTextStore?.subscribe ?? NOOP_SUBSCRIBE,\n themeTextStore?.getSnapshot ?? NOOP_SNAPSHOT,\n themeTextStore?.getServerSnapshot ?? NOOP_SNAPSHOT\n )\n\n // Merge design overrides into merchantOverrides when present.\n // Design overrides are flat (\"cart.title\": \"value\") but merchantOverrides\n // are nested ({cart: {title: \"value\"}}), so unflatten before merging.\n // Guard preserves original ref when empty → useMemo deps unchanged.\n const mergedOverrides =\n designOverrides !== EMPTY && Object.keys(designOverrides).length > 0\n ? { ...merchantOverrides, ...unflattenKeys(designOverrides) }\n : merchantOverrides\n\n const value = useMemo<ThemeTextValue>(() => {\n const t: TranslateFunction = (key, variables) => {\n // Priority 1: external t (e.g. Shopify i18n, third-party library)\n if (externalT) {\n const external = externalT(key, variables)\n // Accept the external value unless it echoed the key unchanged\n if (external && external !== key) {\n return external\n }\n }\n\n // Priority 2: merchant overrides (+ design overrides merged in)\n const override = mergedOverrides\n ? getNestedKey(mergedOverrides, key)\n : undefined\n\n // Priority 3: static content (theme default JSON)\n const staticValue = getNestedKey(staticContent, key)\n\n // Priority 4: key itself as fallback\n const raw = override ?? staticValue ?? key\n\n return interpolate(raw, variables)\n }\n\n return {\n t,\n themeTextStore: themeTextStore ?? null,\n merchantOverrides: merchantOverrides ?? null,\n }\n }, [\n staticContent,\n merchantOverrides,\n mergedOverrides,\n externalT,\n themeTextStore,\n ])\n\n return (\n <ThemeTextContext.Provider value={value}>\n {children}\n </ThemeTextContext.Provider>\n )\n}\n\n/**\n * Hook to access the theme text `t()` function.\n *\n * Must be used inside a component wrapped by `withWeaverse` or `ThemeTextProvider`.\n *\n * @example\n * ```tsx\n * function CartTitle() {\n * const { t } = useThemeText()\n * return <h2>{t('cart.title')}</h2>\n * }\n * ```\n */\nexport function useThemeText(): ThemeTextValue {\n const ctx = useContext(ThemeTextContext)\n if (!ctx) {\n throw new Error(\n 'useThemeText must be used within <ThemeTextProvider>. Wrap your app with withWeaverse().'\n )\n }\n return ctx\n}\n","import { type UIMatch, useMatches } from 'react-router'\n\n// Route-keyed data structure interfaces\nexport interface RouteKeyedDataContext {\n root?: Record<string, unknown>\n [routeKey: `routes/${string}`]: Record<string, unknown>\n}\n\n// Flat route-keyed data context: {root: {...}, \"routes/xxx\": {...}}\nexport type WeaverseDataContext = RouteKeyedDataContext &\n Record<string, unknown>\n\n/**\n * Creates flat route-keyed structure from matches\n * Target: {root: {...rootData}, \"routes/product\": {...productData}}\n * Eliminates all duplication by using route IDs as keys\n */\nfunction createFlatDataContext(\n matches: UIMatch<unknown, unknown>[]\n): WeaverseDataContext {\n const context: WeaverseDataContext = {}\n\n // Process matches from root to leaf, creating route-keyed structure\n for (const match of matches) {\n if (match.data && typeof match.data === 'object') {\n // Use route ID as key (e.g., \"root\", \"routes/product\")\n context[match.id] = match.data\n }\n }\n\n return context\n}\n\n/**\n * Hook to get flat route-keyed data context from matches\n * Returns: {root: {...}, \"routes/xxx\": {...}}\n * No more useLoaderData dependency - everything comes from matches\n */\nexport function useWeaverseDataContext(): WeaverseDataContext {\n const matches = useMatches()\n\n // Create flat route-keyed structure - eliminates duplication\n return createFlatDataContext(matches)\n}\n\n/**\n * Helper function to create flat route-keyed data context from useMatches() result\n * Returns: {root: {...}, \"routes/xxx\": {...}}\n */\nexport function createWeaverseDataContext(\n matches: UIMatch<unknown, unknown>[]\n): WeaverseDataContext {\n // Create flat route-keyed structure - clean and efficient\n return createFlatDataContext(matches)\n}\n\n/**\n * Type guard to check if data is WeaverseDataContext (simplified)\n */\nexport function isWeaverseDataContext(\n data: unknown\n): data is WeaverseDataContext {\n return data !== null && typeof data === 'object'\n}\n","import type { PageSEOData } from '@weaverse/schema'\nimport type { MetaDescriptor } from 'react-router'\nimport type { HydrogenPageData, WeaverseLoaderData } from './types'\n\n/**\n * Convert a Weaverse page-level SEO payload into React Router\n * `MetaDescriptor[]`. Pure, synchronous, tree-shakeable — does not fetch.\n *\n * Behavior:\n * - `title` → top-level `{ title }` descriptor.\n * - `description` / `keywords` → `<meta name=\"...\">`.\n * - `canonicalUrl` → `<link rel=\"canonical\">`.\n * - `openGraph.*` → `<meta property=\"og:*\">`. `og:type` defaults to\n * `'website'` when any other OG field is present.\n * - `twitter.*` → `<meta name=\"twitter:*\">`. `twitter:card` defaults to\n * `'summary'` when any other Twitter field is present.\n * - `robots` is always emitted (defaults to `'index,follow'`) so themes\n * stacking multiple SEO sources have a deterministic last word on\n * indexing for Weaverse-managed pages.\n * - Empty strings / missing fields are filtered before return so empty\n * descriptors don't override earlier sources (e.g. Hydrogen\n * `getSeoMeta`).\n */\nexport function formatMetaDescriptors(\n seo: PageSEOData | null | undefined\n): MetaDescriptor[] {\n if (!seo) {\n return [{ name: 'robots', content: 'index,follow' }]\n }\n\n let descriptors: MetaDescriptor[] = []\n\n if (seo.title) {\n descriptors.push({ title: seo.title })\n }\n if (seo.description) {\n descriptors.push({ name: 'description', content: seo.description })\n }\n if (seo.keywords) {\n descriptors.push({ name: 'keywords', content: seo.keywords })\n }\n if (seo.canonicalUrl) {\n descriptors.push({\n tagName: 'link',\n rel: 'canonical',\n href: seo.canonicalUrl,\n })\n }\n\n let og = seo.openGraph\n if (og && (og.title || og.description || og.image || og.type)) {\n if (og.title) {\n descriptors.push({ property: 'og:title', content: og.title })\n }\n if (og.description) {\n descriptors.push({ property: 'og:description', content: og.description })\n }\n if (og.image) {\n descriptors.push({ property: 'og:image', content: og.image })\n }\n descriptors.push({ property: 'og:type', content: og.type || 'website' })\n }\n\n let tw = seo.twitter\n if (tw && (tw.title || tw.description || tw.image || tw.cardType)) {\n descriptors.push({\n name: 'twitter:card',\n content: tw.cardType || 'summary',\n })\n if (tw.title) {\n descriptors.push({ name: 'twitter:title', content: tw.title })\n }\n if (tw.description) {\n descriptors.push({ name: 'twitter:description', content: tw.description })\n }\n if (tw.image) {\n descriptors.push({ name: 'twitter:image', content: tw.image })\n }\n }\n\n let index = seo.robots?.index !== false\n let follow = seo.robots?.follow !== false\n descriptors.push({\n name: 'robots',\n content: `${index ? 'index' : 'noindex'},${follow ? 'follow' : 'nofollow'}`,\n })\n\n return descriptors\n}\n\n/**\n * Convenience accessor: pull `page.seo` out of a `WeaverseLoaderData`\n * (or `HydrogenPageData`) and emit `MetaDescriptor[]`. Null-safe.\n *\n * @example\n * ```ts\n * export const meta: MetaFunction<typeof loader> = ({ data }) => {\n * return getWeaverseSeoMeta(data?.weaverseData)\n * }\n * ```\n */\nexport function getWeaverseSeoMeta(\n data:\n | WeaverseLoaderData\n | HydrogenPageData\n | { page?: HydrogenPageData | null }\n | null\n | undefined\n): MetaDescriptor[] {\n if (!data) {\n return formatMetaDescriptors(null)\n }\n let page =\n 'items' in data && 'id' in data\n ? (data as HydrogenPageData)\n : ((data as { page?: HydrogenPageData | null }).page ?? null)\n return formatMetaDescriptors(page?.seo ?? null)\n}\n","import type {\n CachingStrategy,\n HydrogenContext,\n I18nBase,\n} from '@shopify/hydrogen'\nimport type {\n AppLoadContext,\n LoaderFunctionArgs as RemixOxygenLoaderArgs,\n} from '@shopify/remix-oxygen'\nimport type {\n ElementData,\n PositionInputValue,\n WeaverseCoreParams,\n WeaverseElement,\n WeaverseImage,\n WeaverseProjectDataType,\n WeaverseResourcePickerData,\n WeaverseVideo,\n} from '@weaverse/react'\nimport type {\n // Enhanced type exports from schema package\n BasicInput,\n HeadingInput,\n InputType,\n InspectorGroup,\n PageSEOData,\n PageType,\n ComponentPresets as SchemaComponentPresets,\n SchemaType,\n SchemaValidationIssue,\n SchemaValidationResult,\n} from '@weaverse/schema'\nimport { isValidSchema } from '@weaverse/schema'\nimport type * as React from 'react'\nimport type { ForwardRefExoticComponent } from 'react'\nimport type { NavigateFunction } from 'react-router'\nimport type { ThemeTextStore } from './utils/theme-text-store'\nimport type { ThemeSettingsStore } from './utils/use-theme-settings-store'\nimport type { WeaverseHydrogen } from './WeaverseHydrogenRoot'\nimport type { WeaverseClient } from './weaverse-client'\n\n// Re-export CachingStrategy from Hydrogen for convenience\nexport type { CachingStrategy } from '@shopify/hydrogen'\n// Re-export types from schema for backward compatibility and convenience\nexport type {\n // Enhanced type exports\n BasicInput,\n HeadingInput,\n InputType,\n InspectorGroup,\n PageType,\n PositionInputValue,\n SchemaValidationIssue,\n SchemaValidationResult,\n WeaverseImage,\n WeaverseVideo,\n}\n\nexport type ComponentLoaderArgs<T = any, _E = any> = {\n data: T\n weaverse: WeaverseClient\n}\n\nexport interface RouteLoaderArgs extends RemixOxygenLoaderArgs {\n context: AppLoadContext & {\n weaverse: WeaverseClient\n }\n}\n\n// Define a more specific type for component data\nexport type ComponentDataValue = string | number | boolean | undefined | null\n\nexport interface HydrogenComponentData extends ElementData {\n children?: { id: string }[]\n createdAt?: string\n data?: Record<string, ComponentDataValue | Record<string, unknown>>\n deletedAt?: string\n id: string\n type: string\n updatedAt?: string\n}\n\n/**\n * Optimized: Use Zod-inferred SchemaType directly instead of extending\n * This ensures perfect type consistency with the schema validation\n */\nexport type HydrogenComponentSchema = SchemaType\n\nexport interface HydrogenComponentProps<L = any> extends WeaverseElement {\n children?: React.JSX.Element[]\n className?: string\n loaderData?: L\n}\n\nexport type WeaverseLoaderRequestInfo = {\n search: string\n pathname: string\n queries: { [key: string]: string | boolean }\n i18n: WeaverseI18n\n}\n\nexport type HydrogenThemeSettings = {\n [key: string]: any\n}\n\nexport type HydrogenProjectType = {\n id: string\n weaverseShopId: string\n name: string\n [key: string]: any\n}\n\nexport type WeaverseInternal = {\n pageAssignment: HydrogenPageAssignment\n project: HydrogenProjectType\n navigate: NavigateFunction\n revalidate: () => void\n themeSettingsStore: ThemeSettingsStore\n themeTextStore?: ThemeTextStore | null\n merchantOverrides?: Record<string, unknown> | null\n}\n\n/**\n * Optimized: Use direct type alias to maintain consistency\n */\nexport type HydrogenComponentPresets = SchemaComponentPresets\n\nexport type HydrogenElement = {\n Component:\n | ForwardRefExoticComponent<HydrogenComponentProps>\n | ((props: HydrogenComponentProps) => React.JSX.Element)\n type: string\n schema?: HydrogenComponentSchema\n /** Optional data loader function for server-side data fetching */\n loader?: (args: ComponentLoaderArgs) => Promise<unknown>\n}\n\nexport interface WeaverseHydrogenParams\n extends Omit<WeaverseCoreParams, 'ItemConstructor'> {\n data: HydrogenPageData\n dataContext?: Record<string, unknown> | null\n internal: Partial<WeaverseInternal>\n isDesignMode?: boolean\n isPreviewMode?: boolean\n isRevisionPreview?: boolean\n pageId: string\n projectId: string\n requestInfo: WeaverseLoaderRequestInfo\n sectionType?: string\n weaverseApiBase: string\n weaverseApiKey: string\n weaverseHost: string\n /**\n * Public data API origin. Keep `weaverseHost` for Studio scripts/editor\n * assets; point this at the Cloudflare proxy (`https://api.weaverse.io`)\n * when edge caching is enabled.\n */\n weaversePublicApiBase?: string\n weaverseVersion?: string\n}\n\nexport type HydrogenComponent<T extends HydrogenComponentProps = any> = {\n default: ForwardRefExoticComponent<T> | ((props: T) => React.JSX.Element)\n schema: HydrogenComponentSchema\n /** Optional data loader function for server-side data fetching */\n loader?: (args: ComponentLoaderArgs) => Promise<unknown>\n}\n\nexport type WeaverseStudioQueries = {\n weaverseProjectId: string\n weaverseApiKey: string\n weaverseHost: string\n weaverseVersion: string\n isDesignMode: boolean\n isPreviewMode?: boolean\n sectionType?: string\n}\n\nexport type PublicEnv = {\n PUBLIC_STORE_DOMAIN: string\n PUBLIC_STOREFRONT_API_TOKEN: string\n}\n\nexport type WeaverseProjectConfigs = {\n projectId: string\n weaverseHost: string\n weaverseApiBase: string\n weaversePublicApiBase?: string\n weaverseApiKey: string\n weaverseVersion?: string\n isDesignMode?: boolean\n isPreviewMode?: boolean\n isRevisionPreview?: boolean\n sectionType?: string\n publicEnv?: PublicEnv\n}\n\nexport type HydrogenPageAssignment = {\n projectId: string\n type: PageType\n handle: string\n locale: string\n meta?: {\n inherited: boolean\n sourceProjectId: string\n depth: number\n }\n}\n\nexport type WeaverseLoaderData = {\n configs: Omit<WeaverseProjectConfigs, 'publicEnv'> & {\n requestInfo: WeaverseLoaderRequestInfo\n }\n page: HydrogenPageData\n project: HydrogenProjectType\n pageAssignment?: HydrogenPageAssignment\n}\n\nexport interface HydrogenPageData extends WeaverseProjectDataType {\n __cacheId?: string\n id: string\n items: HydrogenComponentData[]\n name: string\n /**\n * Page-level SEO metadata published by Weaverse Builder. `null` when\n * the page has no `PageSeo` row; absent on revision snapshots that\n * predate the SEO feature. Themes should treat both as \"no Weaverse\n * override\".\n */\n seo?: PageSEOData | null\n [key: string]: any\n}\n\nexport type WeaverseI18n = I18nBase & {\n label?: string\n pathPrefix?: string\n [key: string]: any\n}\n\nexport type HydrogenThemeSchema = {\n info: {\n name: string\n version: string\n author: string\n authorProfilePhoto: string\n documentationUrl: string\n supportUrl: string\n }\n /** @deprecated Use settings instead */\n inspector?: InspectorGroup[]\n settings?: InspectorGroup[]\n i18n?: {\n urlStructure: 'url-path' | 'subdomain' | 'top-level-domain'\n defaultLocale: WeaverseI18n\n shopLocales: WeaverseI18n[]\n staticContent?: Record<string, unknown>\n /** Enable the translation UI in the builder. */\n translation?: boolean\n }\n}\n\nexport type FetchProjectRequestBody = {\n projectId: string\n url: string\n i18n?: WeaverseI18n\n params?: {\n type?: PageType\n locale?: string\n handle?: string\n }\n isDesignMode?: boolean\n}\n\nexport type FetchProjectPayload = {\n page?: HydrogenPageData // Page might be missing for some routes\n project?: HydrogenProjectType // Project might be missing in error cases\n pageAssignment?: HydrogenPageAssignment // PageAssignment might be missing\n error?: string\n [key: string]: any // Allow additional properties from API response\n}\n\n/**\n * Project identifier value - can be static string or dynamic function.\n *\n * **Static String**: Direct project ID reference\n * ```ts\n * 'project-abc-123'\n * ```\n *\n * **Synchronous Function**: Returns project ID based on request context\n * ```ts\n * () => {\n * const host = new URL(request.url).hostname\n * return PROJECT_MAP[host] || 'default-project'\n * }\n * ```\n *\n * **Asynchronous Function**: Async project resolution (must be awaited before passing)\n * ```ts\n * async () => {\n * return await database.getProjectId(userId)\n * }\n * ```\n */\nexport type ProjectIdValue = string | (() => string) | (() => Promise<string>)\n\n/**\n * Type guard for detecting function-based projectId.\n *\n * Used internally by WeaverseClient constructor to determine\n * if projectId needs evaluation or can be used directly.\n */\nexport function isProjectIdFunction(\n projectId: ProjectIdValue | undefined\n): projectId is (() => string) | (() => Promise<string>) {\n return typeof projectId === 'function'\n}\n\n/**\n * Extended WeaverseClient constructor arguments supporting multi-project architecture.\n *\n * @example Static project (existing pattern - backward compatible)\n * ```ts\n * const weaverse = new WeaverseClient({\n * ...hydrogenContext,\n * projectId: 'project-default-123'\n * })\n * ```\n *\n * @example Dynamic project selection (new capability)\n * ```ts\n * const weaverse = new WeaverseClient({\n * ...hydrogenContext,\n * projectId: () => {\n * const origin = new URL(request.url).origin\n * if (origin === 'https://mystore.se') return process.env.WEAVERSE_PROJECT_SWEDEN!\n * if (origin === 'https://mystore.fr') return process.env.WEAVERSE_PROJECT_FRANCE!\n * return process.env.WEAVERSE_PROJECT_ID!\n * }\n * })\n * ```\n *\n * **Priority Chain** (highest to lowest):\n * 1. URL query parameter: `?weaverseProjectId=...` (design mode, preview mode)\n * 2. Function result (if function provided)\n * 3. Explicit string value (if string provided)\n * 4. Environment variable: `WEAVERSE_PROJECT_ID` (Hydrogen env or process.env)\n * 5. Empty string (triggers validation error in methods)\n *\n * **Function Requirements**:\n * - Must return non-empty string\n * - Can access request via closure for routing decisions\n * - Evaluated once per WeaverseClient instance (request-scoped)\n * - Async functions must be awaited before passing to constructor\n * - Should handle edge cases (missing headers, invalid domains, etc.)\n *\n * **Request Context Access**:\n * Functions access request via closure from constructor arguments.\n */\nexport type WeaverseClientArgs = HydrogenContext & {\n /**\n * React components registered with Weaverse CMS.\n * Each component must have a schema defining its properties and settings.\n */\n components: HydrogenComponent[]\n\n /**\n * Theme schema defining global theme settings (colors, fonts, layouts).\n * Used to generate default theme configuration and validate theme data.\n */\n themeSchema: HydrogenThemeSchema\n\n /**\n * Incoming HTTP request object from React Router loader.\n * Provides access to URL, headers, cookies for dynamic routing decisions.\n */\n request: Request\n\n /**\n * Hydrogen cache instance for content caching.\n *Supports multi-tenant caching with project-specific cache keys.\n */\n cache: Cache\n\n /**\n * Project identifier for loading content from Weaverse CMS.\n *\n * **Value Types**:\n * - Static string: 'project-123' (existing usage)\n * - Synchronous function: () => determineProject(request)\n * - Asynchronous function: async () => await getProject(request) (must be awaited)\n *\n * **Backward Compatibility**:\n * - Optional parameter (defaults to environment variable)\n * - Existing code without projectId continues to work unchanged\n *\n * **Cache Isolation**:\n * ProjectId is included in cache keys to prevent cross-project content pollution.\n * Each project's content is cached separately, ensuring multi-tenant isolation.\n */\n projectId?: ProjectIdValue\n\n /**\n * Fetch timeout in milliseconds for API requests.\n * Defaults to 10000ms (10 seconds) if not specified.\n * Useful for adjusting based on network conditions or deployment environment.\n *\n * @default 10000\n * @example\n * ```typescript\n * new WeaverseClient({\n * // ... other args\n * fetchTimeoutMs: 5000 // 5 second timeout\n * })\n * ```\n */\n fetchTimeoutMs?: number\n}\n\nexport type WeaverseProduct = WeaverseResourcePickerData\nexport type WeaverseCollection = WeaverseResourcePickerData\nexport type WeaverseBlog = WeaverseResourcePickerData\nexport type WeaverseArticle = WeaverseResourcePickerData\nexport type WeaverseMetaObject = WeaverseResourcePickerData\n\n/**\n * Response types for improved type safety\n */\n\n// Response wrapper from withCache.fetch\nexport type WithCacheFetchResponse<T> = {\n data: T\n response: Response\n}\n\n// Theme settings response structure\nexport type ThemeSettingsResponse = {\n theme?: HydrogenThemeSettings\n schema?: HydrogenThemeSchema\n publicEnv?: PublicEnv\n /** Theme's default locale JSON from themeSchema.i18n.staticContent */\n staticContent?: Record<string, unknown>\n /** Locale-specific merchant overrides from the API */\n merchantOverrides?: Record<string, unknown>\n _error?: string\n _loadFailed?: boolean\n}\n\n// Direct fetch response structure\nexport type DirectFetchResponse<T = unknown> = {\n data?: T\n error?: string\n}\n\n// Cache response validation function type\nexport type CacheResponseValidator<T = unknown> = (\n response: WithCacheFetchResponse<T> | T\n) => boolean\n\n// Weaverse Error class for better error handling\nexport class WeaverseError extends Error {\n public readonly code: string\n public readonly statusCode?: number\n public readonly context?: Record<string, unknown>\n\n constructor(\n message: string,\n code = 'WEAVERSE_ERROR',\n statusCode?: number,\n context?: Record<string, unknown>\n ) {\n super(message)\n this.name = 'WeaverseError'\n this.code = code\n this.statusCode = statusCode\n this.context = context\n\n // Maintains proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, WeaverseError)\n }\n }\n}\n\n/**\n * Validation result type for project ID validation.\n * Returns validation status with optional error message.\n */\nexport type ProjectIdValidationResult = {\n valid: boolean\n error?: string\n}\n\nexport interface CustomPageEntry {\n changeFrequency?: 'daily' | 'weekly' | 'monthly'\n handle: string\n lastModified: string\n locale: string | null\n path: string\n priority?: number\n}\n\n/**\n * Type guards for response validation\n */\n\nexport function isWithCacheFetchResponse<T>(\n response: unknown\n): response is WithCacheFetchResponse<T> {\n return (\n typeof response === 'object' &&\n response !== null &&\n 'data' in response &&\n 'response' in response\n )\n}\n\nexport function isFetchProjectPayload(\n payload: unknown\n): payload is FetchProjectPayload {\n return (\n typeof payload === 'object' &&\n payload !== null &&\n 'page' in payload &&\n 'project' in payload &&\n 'pageAssignment' in payload\n )\n}\n\nexport function hasError(response: unknown): response is { error: string } {\n return (\n typeof response === 'object' &&\n response !== null &&\n 'error' in response &&\n typeof (response as Record<string, unknown>).error === 'string'\n )\n}\n\nexport function isThemeSettingsResponse(\n data: unknown\n): data is ThemeSettingsResponse {\n if (typeof data !== 'object' || data === null) {\n return false\n }\n\n const record = data as Record<string, unknown>\n return (\n 'theme' in record &&\n typeof record.theme === 'object' &&\n record.theme !== null\n )\n}\n\n/**\n * Enhanced type utilities for better development experience\n */\nexport type HydrogenSchemaValidationResult =\n SchemaValidationResult<HydrogenComponentSchema>\n\n/**\n * Type guard to check if a schema is valid.\n * Leverages validation from @weaverse/schema package which provides\n * comprehensive Zod-based validation with the ElementSchema.\n *\n * @param schema - Unknown value to validate\n * @returns True if schema is a valid HydrogenComponentSchema\n *\n * @example\n * ```typescript\n * if (isValidHydrogenSchema(userInput)) {\n * // userInput is now typed as HydrogenComponentSchema\n * console.log(userInput.type)\n * }\n * ```\n */\nexport function isValidHydrogenSchema(\n schema: unknown\n): schema is HydrogenComponentSchema {\n // Use the comprehensive validation from @weaverse/schema package\n return isValidSchema(schema)\n}\n\n/**\n * Type-safe helper to create component schemas with validation\n */\nexport type CreateHydrogenSchemaOptions = {\n title: string\n type: string\n limit?: number\n settings?: InspectorGroup[]\n childTypes?: string[]\n enabledOn?: {\n pages?: PageType[]\n groups?: ('*' | 'header' | 'footer' | 'body')[]\n }\n presets?: {\n children?: SchemaComponentPresets[]\n [key: string]: any\n }\n}\n\n// Extended window interface for hydrogen-specific globals\ndeclare global {\n interface Window {\n __weaverse?: WeaverseHydrogen\n __weaverses?: Record<string, WeaverseHydrogen>\n __weaverseThemeSettingsStore?: ThemeSettingsStore\n }\n}\n\n// Separate interface for weaverseStudio to avoid conflicts with core package\ninterface WeaverseStudio {\n init: (weaverse: WeaverseHydrogen) => void\n refreshStudio: (params: WeaverseHydrogenParams) => void\n}\n\n// Type guard to safely access weaverseStudio\nexport function hasWeaverseStudio(\n window: Window\n): window is Window & { weaverseStudio: WeaverseStudio } {\n return 'weaverseStudio' in window && typeof window.weaverseStudio === 'object'\n}\n\ndeclare module '@shopify/remix-oxygen' {\n interface AppLoadContext {\n weaverse: WeaverseClient\n }\n}\n\ndeclare module '@shopify/hydrogen' {\n interface HydrogenEnv {\n CUSTOM_COLLECTION_BANNER_METAFIELD: string\n JUDGEME_PRIVATE_API_TOKEN: string\n KLAVIYO_PRIVATE_API_TOKEN: string\n METAOBJECT_COLOR_NAME_KEY: string\n METAOBJECT_COLOR_VALUE_KEY: string\n METAOBJECT_COLORS_TYPE: string\n PUBLIC_GOOGLE_GTM_ID: string\n PUBLIC_SHOPIFY_INBOX_SHOP_ID: string\n PUBLIC_STORE_DOMAIN: string\n PUBLIC_STOREFRONT_API_TOKEN: string\n WEAVERSE_API_KEY: string\n WEAVERSE_HOST?: string\n WEAVERSE_PROJECT_ID: string\n WEAVERSE_PUBLIC_API_BASE?: string\n }\n}\n\n/**\n * Parameters for loadPage method supporting route-level project override.\n *\n * @example Basic usage (uses client-level project)\n * ```ts\n * const weaverseData = await weaverse.loadPage({\n * type: 'PRODUCT',\n * handle: params.productHandle\n * })\n * ```\n *\n * @example Route-level project override\n * ```ts\n * export async function loader({ params, context }: LoaderFunctionArgs) {\n * const { weaverse } = context\n *\n * // Use special campaign project for this route only\n * const weaverseData = await weaverse.loadPage({\n * type: 'PRODUCT',\n * handle: params.productHandle,\n * projectId: process.env.WEAVERSE_PROJECT_CAMPAIGN // Override\n * })\n *\n * return { weaverseData }\n * }\n * ```\n */\nexport type LoadPageParams = {\n /**\n * Page type to load from Weaverse CMS.\n *\n * Determines which template to use for rendering the page.\n * Falls back to 'INDEX' if not specified or if page type doesn't exist.\n *\n * @default 'INDEX'\n */\n type?: PageType\n\n /**\n * Locale for internationalization.\n *\n * Format: IETF BCP 47 language tag (e.g., 'en-US', 'fr-FR', 'de-DE')\n * Used to load locale-specific content and translations.\n */\n locale?: string\n\n /**\n * Page handle for dynamic pages.\n *\n * Identifies specific resource within page type:\n * - Product handle: 'red-sneakers'\n * - Collection handle: 'summer-sale'\n * - Page handle: 'about-us'\n * - Article handle: 'how-to-style-sneakers'\n */\n handle?: string\n\n /**\n * Cache strategy override for this specific page load.\n *\n * Overrides default cache strategy for special use cases:\n * - Fresh content for checkout pages (no cache)\n * - Long-lived cache for static pages (1 hour+)\n * - Short-lived cache for frequently updated content (5 minutes)\n */\n strategy?: CachingStrategy\n\n /**\n * Optional project override for this specific page load.\n *\n * **Precedence**: Route-level projectId takes precedence over client-level projectId.\n *\n * **Use Cases**:\n * - Campaign landing pages with custom content\n * - VIP customer experiences with dedicated projects\n * - A/B testing specific pages without changing global config\n * - Seasonal promotions with limited-time content\n *\n * **Validation**:\n * - Must be non-empty string\n * - Validated before API call\n * - Falls back to client-level projectId if undefined\n * - Does NOT support function (string only)\n *\n * **Cache Isolation**:\n * Override projectId is included in cache key, ensuring separate caches\n * for different projects even on the same route.\n *\n * @example Campaign page override\n * ```ts\n * const campaignData = await weaverse.loadPage({\n * type: 'PAGE',\n * handle: 'summer-sale',\n * projectId: process.env.WEAVERSE_PROJECT_CAMPAIGN\n * })\n * ```\n */\n projectId?: string\n}\n\n// ─── Translation sidecar types (design mode) ─────────────────────────\n\n/** A single translated field for one item */\nexport interface TranslationMapEntry {\n originalValue: string\n translatedValue: string\n}\n\n/** Per-item translation fields, keyed by field name */\nexport type TranslationItemEntry = {\n [key: string]: TranslationMapEntry\n}\n\n/**\n * Translation map sent from the builder alongside page data in design mode.\n * Keyed by item ID, each value maps field names to translation entries.\n */\nexport type TranslationMap = {\n [itemId: string]: TranslationItemEntry\n}\n\n/** A single translation entry for save payloads */\nexport interface TranslationEntry {\n deleted?: boolean\n itemId: string\n key: string\n originalValue: string\n translatedValue: string\n}\n\n/** Result of collecting translation changes for the save flow */\nexport type TranslationChanges = {\n languageId: string\n entries: TranslationEntry[]\n}\n","export interface StudioMode {\n isDesignMode?: boolean\n isPreviewMode?: boolean\n isRevisionPreview?: boolean\n weaverseHost: string\n weaverseVersion: string\n}\n\nconst DEFAULT_WEAVERSE_HOST = 'https://studio.weaverse.io'\n\n/**\n * Weaverse-controlled apex domains the Studio bridge may be served from\n * (matched on the host itself and any subdomain).\n */\nconst TRUSTED_STUDIO_DOMAINS = ['weaverse.io', 'weaverse.dev']\n\nfunction isLoopbackHostname(hostname: string): boolean {\n return (\n hostname === 'localhost' ||\n hostname === '127.0.0.1' ||\n hostname.endsWith('.localhost')\n )\n}\n\nexport interface TrustedStudioHostOptions {\n /**\n * Also trust loopback hosts (`localhost` / `127.0.0.1` / `*.localhost`) over\n * http or https.\n *\n * Only safe when the **storefront itself** is loopback (genuine local-builder\n * dev). A production https page can still load a loopback script — loopback is\n * a \"potentially trustworthy\" origin and is not blocked as mixed content — so\n * honoring a query-supplied loopback host on a public storefront would let a\n * crafted link run whatever a visitor's local service serves inside the\n * storefront origin. MUST stay off on the server, where it is an SSRF vector\n * for page/theme fetches.\n */\n allowLoopback?: boolean\n}\n\n/**\n * Whether `host` is an origin we trust to serve the Studio bridge script (or,\n * server-side, to resolve page/theme data).\n *\n * The bridge executes inside the storefront document and the host can drive\n * server-side fetches, so a host taken from an attacker-controllable source —\n * e.g. a crafted `?weaverseHost=` query — is both an XSS and an SSRF vector.\n * Callers MUST reject untrusted hosts before acting on them. Trusts\n * `weaverse.io`/`weaverse.dev` and their subdomains over https; loopback is\n * opt-in (see {@link TrustedStudioHostOptions.allowLoopback}).\n */\nexport function isTrustedStudioHost(\n host: string,\n options?: TrustedStudioHostOptions\n): boolean {\n let parsed: URL\n try {\n parsed = new URL(host)\n } catch {\n return false\n }\n let { hostname, protocol } = parsed\n // Loopback (opt-in) is the only place http is allowed — a local builder\n // serves the bridge over http and there is no cleartext-downgrade risk to a\n // private address. Every other trusted host must be https so server-side\n // page/theme fetches are never downgraded to cleartext.\n if (options?.allowLoopback && isLoopbackHostname(hostname)) {\n return protocol === 'http:' || protocol === 'https:'\n }\n if (protocol !== 'https:') {\n return false\n }\n return TRUSTED_STUDIO_DOMAINS.some(\n (domain) => hostname === domain || hostname.endsWith(`.${domain}`)\n )\n}\n\n/**\n * Build the Studio bridge script URL for the current mode, or `null` when the\n * storefront is not being previewed inside Weaverse Studio.\n *\n * This is the single gate that keeps the bridge off production storefronts:\n * a normal visitor's URL carries none of the design/preview markers, so the\n * result is `null` and no script is ever requested.\n *\n * Shared by the page-scoped `useStudio` (which also binds the page for\n * editing) and the root-level `useStudioConnect` (which only needs the script\n * to load so Studio's `checkWeaversePage()` handshake can answer on routes\n * with no Weaverse content).\n */\nexport function getStudioScriptSrc(mode: StudioMode): string | null {\n let {\n isDesignMode,\n isPreviewMode,\n isRevisionPreview,\n weaverseHost,\n weaverseVersion,\n } = mode\n let base = `${weaverseHost}/static/studio/hydrogen`\n let version = `?v=${weaverseVersion}`\n if (isRevisionPreview || isPreviewMode) {\n return `${base}/preview.js${version}`\n }\n if (isDesignMode) {\n return `${base}/index.js${version}`\n }\n return null\n}\n\n/**\n * Resolve the Studio bridge script URL from a URL query string — the markers\n * Studio attaches when it drives the preview iframe (`isDesignMode`,\n * `isPreviewMode`, `__revisionId`, `weaverseHost`, `weaverseVersion`) — or\n * `null` outside Studio.\n *\n * `storefrontHostname` is the document's own hostname: a loopback Studio host\n * is only honored when the storefront itself is loopback (genuine local-builder\n * dev), so a crafted public link can't load a script from a visitor's loopback\n * service into the storefront origin.\n *\n * The `weaverseHost` query is attacker-controllable, so a host that is not a\n * {@link isTrustedStudioHost trusted origin} resolves to `null` (no bridge) —\n * it is never silently replaced with production Studio, which would otherwise\n * inject the wrong bridge for self-hosted/staging deployments. Such deployments\n * (a non-`weaverse.io` `WEAVERSE_HOST`) therefore don't load the root bridge on\n * content-less routes; the page-scoped {@link getStudioScriptSrc} via\n * `useStudio` still uses the configured host on content routes.\n *\n * Pure (no DOM) so the root-level connect's production gate stays unit-testable\n * and needs no loader data.\n */\nexport function resolveStudioScriptSrc(\n search: string,\n storefrontHostname = ''\n): string | null {\n let params = new URLSearchParams(search)\n // Match the server's getRequestQueries(), which keeps the LAST value of a\n // duplicated key. Studio appends its own control params, so a pre-existing\n // (stale/untrusted) `weaverseHost` earlier in the URL must not win here, or\n // the root bridge would be skipped while the loader uses the later host.\n let last = (key: string) => params.getAll(key).at(-1)\n let host = last('weaverseHost')\n if (host) {\n let allowLoopback = isLoopbackHostname(storefrontHostname)\n if (!isTrustedStudioHost(host, { allowLoopback })) {\n return null\n }\n }\n return getStudioScriptSrc({\n isDesignMode: last('isDesignMode') === 'true',\n isPreviewMode: last('isPreviewMode') === 'true',\n isRevisionPreview: params.has('__revisionId'),\n weaverseHost: host || DEFAULT_WEAVERSE_HOST,\n weaverseVersion: last('weaverseVersion') || '',\n })\n}\n","import type { HydrogenEnv } from '@shopify/hydrogen'\nimport type {\n HydrogenComponent,\n HydrogenComponentSchema,\n HydrogenThemeSchema,\n WeaverseLoaderData,\n WeaverseProjectConfigs,\n WeaverseStudioQueries,\n} from '../types'\nimport { isTrustedStudioHost } from './studio-script-src'\n\n// Track warned types to avoid spam\nlet warnedTypes = new Set<string>()\n\nfunction logOnce(type: string, message: string) {\n if (!warnedTypes.has(type)) {\n console.warn(message)\n warnedTypes.add(type)\n }\n}\n\nfunction deepMergeArrays<T>(target: T[], source: T[]): T[] {\n return [...target, ...source]\n}\n\nfunction mergeInspectorSettings(\n settings: any[],\n inspector: any[],\n type: string\n): any[] {\n if (!inspector?.length) {\n return settings\n }\n if (!settings?.length) {\n return inspector\n }\n\n // Log collision notice\n console.info(\n `Schema \"${type}\": Both 'settings' and 'inspector' found. Using 'settings' with 'inspector' as fallback.`\n )\n\n return deepMergeArrays(settings, inspector)\n}\n\n/**\n * Extract and parse query parameters from a request URL.\n * Supports optional allowlist for security-sensitive applications.\n *\n * @param request - The incoming request\n * @param options - Optional configuration\n * @param options.allowedKeys - If provided, only these keys will be extracted\n * @returns Parsed query parameters with type coercion for booleans\n *\n * @example\n * ```typescript\n * // Extract all params\n * const queries = getRequestQueries(request)\n *\n * // Extract only allowed params (security-sensitive)\n * const queries = getRequestQueries(request, {\n * allowedKeys: ['weaverseProjectId', 'weaverseHost']\n * })\n * ```\n */\nexport function getRequestQueries<T = Record<string, string | boolean>>(\n request: Request,\n options?: { allowedKeys?: string[] }\n): T {\n let url = new URL(request.url)\n let queries: Record<string, unknown> = {}\n\n for (let [key, value] of url.searchParams.entries()) {\n // If allowlist provided, skip non-allowed keys\n if (options?.allowedKeys && !options.allowedKeys.includes(key)) {\n continue\n }\n\n // Type-safe conversion for known boolean patterns\n if (value === 'true') {\n queries[key] = true\n } else if (value === 'false') {\n queries[key] = false\n } else {\n queries[key] = value\n }\n }\n\n return queries as T\n}\n\nexport function getWeaverseConfigs(\n request: Request,\n env: HydrogenEnv\n): WeaverseProjectConfigs {\n let queries = getRequestQueries<WeaverseStudioQueries>(request)\n let {\n WEAVERSE_PROJECT_ID,\n WEAVERSE_API_KEY,\n WEAVERSE_HOST,\n WEAVERSE_PUBLIC_API_BASE,\n PUBLIC_STORE_DOMAIN,\n PUBLIC_STOREFRONT_API_TOKEN,\n } = env || {}\n let envFromProcess = (typeof process !== 'undefined' && process.env) || {}\n let {\n weaverseProjectId,\n weaverseHost,\n isDesignMode,\n isPreviewMode,\n sectionType,\n weaverseVersion,\n weaverseApiKey,\n } = queries\n\n let url = new URL(request.url)\n let isRevisionPreview = url.searchParams.has('__revisionId')\n let configuredWeaverseHost = WEAVERSE_HOST || envFromProcess.WEAVERSE_HOST\n // `weaverseHost` arrives from the request URL (Studio drives the preview\n // iframe with it), so it is attacker-controllable; only honor it when it is a\n // trusted Weaverse origin, otherwise fall back to the env/default host. This\n // stops a crafted `?weaverseHost=` from pointing Studio scripts or data reads\n // at an arbitrary origin.\n let trustedUrlHost =\n typeof weaverseHost === 'string' && isTrustedStudioHost(weaverseHost)\n ? weaverseHost\n : ''\n let resolvedWeaverseHost =\n trustedUrlHost || configuredWeaverseHost || 'https://studio.weaverse.io'\n // Public data reads default to the edge proxy, but an explicit custom\n // WEAVERSE_HOST (staging/self-hosted Weaverse) must stay the API base so\n // those deployments don't fetch page/config data from the production proxy.\n let resolvedWeaverseApiBase = trustedUrlHost\n ? trustedUrlHost\n : WEAVERSE_PUBLIC_API_BASE ||\n envFromProcess.WEAVERSE_PUBLIC_API_BASE ||\n (configuredWeaverseHost &&\n configuredWeaverseHost !== 'https://studio.weaverse.io'\n ? configuredWeaverseHost\n : 'https://api.weaverse.io')\n\n return {\n projectId:\n weaverseProjectId ||\n WEAVERSE_PROJECT_ID ||\n envFromProcess.WEAVERSE_PROJECT_ID ||\n '',\n weaverseHost: resolvedWeaverseHost,\n weaverseApiBase: resolvedWeaverseApiBase,\n weaversePublicApiBase: resolvedWeaverseApiBase,\n weaverseApiKey:\n weaverseApiKey ||\n WEAVERSE_API_KEY ||\n envFromProcess.WEAVERSE_API_KEY ||\n '',\n weaverseVersion: weaverseVersion || '',\n isDesignMode,\n isPreviewMode,\n isRevisionPreview,\n sectionType: sectionType || '',\n publicEnv: {\n PUBLIC_STORE_DOMAIN: PUBLIC_STORE_DOMAIN || '',\n PUBLIC_STOREFRONT_API_TOKEN: PUBLIC_STOREFRONT_API_TOKEN || '',\n },\n }\n}\n\n/**\n * Cache for generateDataFromSchema results using WeakMap.\n * WeakMap allows garbage collection when schema objects are no longer referenced.\n */\nconst schemaDefaultsCache = new WeakMap<\n HydrogenComponentSchema | HydrogenThemeSchema,\n Record<string, any>\n>()\n\n/**\n * Generate default data from component or theme schema.\n * Results are memoized using WeakMap for performance.\n *\n * @param schema - Component or theme schema\n * @returns Default data object extracted from schema inputs\n */\nexport function generateDataFromSchema(\n schema: HydrogenComponentSchema | HydrogenThemeSchema\n) {\n // Check cache first for performance\n const cached = schemaDefaultsCache.get(schema)\n if (cached) {\n return cached\n }\n\n let data: Record<string, any> = {}\n\n // Handle migration from inspector to settings\n let inspectorGroups: any[] = []\n\n // Type guard to check if it's a component schema\n const isComponentSchema = (\n s: HydrogenComponentSchema | HydrogenThemeSchema\n ): s is HydrogenComponentSchema => 'type' in s && typeof s.type === 'string'\n\n if (isComponentSchema(schema)) {\n // Handle HydrogenComponentSchema\n if (schema.settings) {\n inspectorGroups = schema.settings\n }\n\n if (schema.inspector) {\n if (schema.settings?.length) {\n // Both exist - merge with settings taking priority\n inspectorGroups = mergeInspectorSettings(\n schema.settings,\n schema.inspector,\n schema.type || 'unknown'\n )\n } else {\n // Only inspector exists - use it but warn about deprecation\n inspectorGroups = schema.inspector\n if (schema.type) {\n logOnce(\n schema.type,\n `⚠️ Schema \"${schema.type}\": The 'inspector' property is deprecated. Please use 'settings' instead.`\n )\n }\n }\n }\n } else {\n // Handle HydrogenThemeSchema\n if (schema.settings) {\n inspectorGroups = schema.settings\n }\n\n if (schema.inspector) {\n if (schema.settings?.length) {\n // Both exist - merge with settings taking priority\n inspectorGroups = mergeInspectorSettings(\n schema.settings,\n schema.inspector,\n 'Theme Schema'\n )\n } else {\n // Only inspector exists - use it but warn about deprecation\n inspectorGroups = schema.inspector\n logOnce(\n 'ThemeSchema',\n `⚠️ Theme Schema: The 'inspector' property is deprecated. Please use 'settings' instead.`\n )\n }\n }\n }\n\n if (inspectorGroups?.length) {\n for (let group of inspectorGroups) {\n for (let input of group.inputs) {\n let { name, defaultValue } = input\n if (name && defaultValue !== null && defaultValue !== undefined) {\n data[name] = defaultValue\n }\n }\n }\n }\n\n // Cache the result before returning\n schemaDefaultsCache.set(schema, data)\n\n return data\n}\n\nfunction recursivelyAddDataItem(\n type: string,\n components: HydrogenComponent<any>[],\n items: any[],\n initData?: object\n) {\n let component = components.find((c) => c.schema.type === type)\n if (!component) {\n return\n }\n let childIds = []\n let id = crypto.randomUUID()\n let { children, ...data } = component.schema?.presets || {}\n if (children) {\n for (let c of children) {\n let { type, children, ...data } = c\n let childId = recursivelyAddDataItem(type, components, items, data)\n childIds.push({ id: childId } as never)\n }\n }\n items.push({\n data: { ...data, ...initData },\n id,\n type,\n children: childIds,\n })\n return id\n}\n\nexport function getPreviewData(\n type: string,\n components: HydrogenComponent[],\n weaverseHost: string\n) {\n let items = []\n return {\n project: { id: 'x', weaverseShopId: 'shop-id', name: 'Section Preview' },\n configs: {\n projectId: 'x',\n weaverseHost,\n isDesignMode: false,\n isPreviewMode: true,\n requestInfo: {\n i18n: {\n label: 'United States (USD $)',\n language: 'EN',\n country: 'US',\n currency: 'USD',\n pathPrefix: '',\n },\n queries: {},\n pathname: '/',\n search: '',\n },\n },\n page: {\n id: 'weaverse-preview-page',\n name: 'Preview section',\n rootId: '1',\n items: [\n {\n data: {},\n id: '1',\n type: 'main',\n children: [{ id: recursivelyAddDataItem(type, components, items) }],\n },\n ...items,\n ],\n },\n } as unknown as WeaverseLoaderData\n}\n","/**\n * Minimal mutable store for design-mode static text overrides.\n *\n * useSyncExternalStore-compatible. Passed into ThemeTextProvider which\n * subscribes internally and merges overrides into merchantOverrides.\n * The studio bridge calls updateOverrides() via weaverse.internal.themeTextStore.\n *\n * Shape: flat Record<string, string> — dot-notation keys map to values\n * (e.g. \"cart.title\" → \"Shopping Cart\").\n */\nexport class ThemeTextStore {\n overrides: Record<string, string> = {}\n private listeners: Set<() => void> = new Set()\n\n setOverrides = (overrides: Record<string, string>) => {\n this.overrides = { ...overrides }\n this.emit()\n }\n\n updateOverrides = (newOverrides: Record<string, string>) => {\n this.overrides = { ...this.overrides, ...newOverrides }\n this.emit()\n }\n\n getSnapshot = () => this.overrides\n\n getServerSnapshot = () => this.overrides\n\n subscribe = (callback: () => void) => {\n this.listeners.add(callback)\n return () => {\n this.listeners.delete(callback)\n }\n }\n\n private emit = () => {\n for (const listener of Array.from(this.listeners)) {\n try {\n listener()\n } catch (error) {\n console.error('ThemeTextStore: Listener error', error)\n }\n }\n }\n}\n","import type { UIMatch } from 'react-router'\nimport type { WeaverseLoaderData } from '../types'\n\nexport type WeaverseDataValue =\n | WeaverseLoaderData\n | Promise<WeaverseLoaderData>\n | null\n\n/**\n * Resolve the `weaverseData` payload for a `<WeaverseHydrogenRoot>` instance.\n *\n * Resolution order (first match wins):\n *\n * 1. **Explicit prop** — the caller passed `data` directly. Used as-is,\n * including when it is a `Promise` (handled upstream via `<Await>`) or\n * an explicit `null` (suppresses rendering).\n * 2. **Own route's loader data** — the loader data for the route that\n * rendered this component, obtained via `useLoaderData()`. This is\n * React Router's route-scoped primitive and is what makes nested\n * layout + child Weaverse pages work: each `<WeaverseContent />`\n * resolves to *its own* route's `weaverseData` regardless of siblings.\n * 3. **Ancestor match fallback** — walk `useMatches()` from leaf to root\n * and return the first ancestor whose `loaderData` exposes a\n * `weaverseData` key. This preserves the long-standing behaviour where\n * a child route with no loader (e.g. an `index.tsx` that omits\n * `weaverseData`) still renders its layout's Weaverse page.\n *\n * The helper is intentionally pure (no hook calls) so it can be unit-tested\n * without a React Router context. Hook calls happen in the component.\n *\n * ## Back-compat contract\n *\n * Themes that pre-date the `data` prop addition pass `dataProp === undefined`,\n * so resolution starts at Tier 2. For the canonical single-instance pattern\n * (one `<WeaverseContent />` inside a route whose loader returns\n * `{ weaverseData }`), Tier 2 returns the same value the old `useMatches()`\n * walk did. For the index-without-loader pattern (leaf route exposes no\n * `weaverseData`, layout does), Tier 3's leaf→root walk produces an\n * identical result to the pre-fix code. The only intentional behaviour\n * change is the issue #451 case: two `<WeaverseContent />` instances on the\n * same URL (layout + child, both with their own `weaverseData`) now each\n * render their own page instead of both rendering the deepest one.\n */\nexport function pickWeaverseData(\n dataProp: WeaverseDataValue | undefined,\n ownLoaderData: unknown,\n matches: ReadonlyArray<Pick<UIMatch, 'loaderData'>>\n): WeaverseDataValue {\n // Tier 1: explicit prop wins (including explicit `null`).\n if (dataProp !== undefined) {\n return dataProp\n }\n\n // Tier 2: own route's loader data — the route-scoped primitive.\n if (hasWeaverseData(ownLoaderData)) {\n return ownLoaderData.weaverseData as WeaverseDataValue\n }\n\n // Tier 3: ancestor walk (leaf → root) for legacy / index-without-loader cases.\n for (let i = matches.length - 1; i >= 0; i--) {\n const loaderData = matches[i].loaderData\n if (hasWeaverseData(loaderData)) {\n return loaderData.weaverseData as WeaverseDataValue\n }\n }\n\n return null\n}\n\nfunction hasWeaverseData(\n value: unknown\n): value is Record<string, unknown> & { weaverseData: unknown } {\n // The `in` check alone returns true for `{ weaverseData: undefined }`,\n // which would let Tier 2 short-circuit and return `undefined` — bypassing\n // the Tier 3 ancestor walk that would otherwise resolve the missing data.\n // Require the value to be present (not `undefined`).\n if (\n typeof value !== 'object' ||\n value === null ||\n !('weaverseData' in (value as Record<string, unknown>))\n ) {\n return false\n }\n return (value as Record<string, unknown>).weaverseData !== undefined\n}\n","import type { WeaverseHydrogenParams } from '../types'\n\ninterface BrowserLocationLike {\n pathname: string\n search: string\n}\n\nfunction getBrowserLocation(): BrowserLocationLike | undefined {\n if (typeof window === 'undefined') {\n return\n }\n return window.location\n}\n\nfunction getQueriesFromSearch(\n search: string\n): Record<string, string | boolean> {\n let queries: Record<string, string | boolean> = {}\n let params = new URLSearchParams(search)\n for (let [key, value] of params.entries()) {\n if (value === 'true') {\n queries[key] = true\n } else if (value === 'false') {\n queries[key] = false\n } else {\n queries[key] = value\n }\n }\n return queries\n}\n\n/**\n * React Router v7 single-fetch revalidation can render client data returned\n * from a `*.data` request while the browser is still on the canonical URL.\n * Instance identity must follow the browser URL, not the transient data\n * endpoint, otherwise the SDK creates a fresh Weaverse instance mid-session:\n * in design mode that drops the existing Studio bridge/interactions, and in\n * the live theme it resets every section's runtime state after any\n * revalidation (cart mutations, locale switches, `revalidate()`). See #451.\n */\nexport function normalizeRequestInfo(\n params: WeaverseHydrogenParams,\n browserLocation: BrowserLocationLike | undefined = getBrowserLocation()\n): WeaverseHydrogenParams {\n if (!browserLocation) {\n return params\n }\n\n let { pathname, search } = browserLocation\n if (\n params.requestInfo.pathname === pathname &&\n params.requestInfo.search === search\n ) {\n return params\n }\n\n return {\n ...params,\n requestInfo: {\n ...params.requestInfo,\n pathname,\n queries: getQueriesFromSearch(search),\n search,\n },\n }\n}\n","import type { WeaverseHydrogenParams } from '../types'\nimport type { WeaverseHydrogen } from '../WeaverseHydrogenRoot'\n\n/**\n * Apply a fresh loader payload to a reused Weaverse instance.\n *\n * With requestInfo normalized to the browser URL, same-URL revalidations\n * (cart mutations, `useRevalidator()`, locale-neutral re-fetches) reuse the\n * cached `window.__weaverses[pageId]` instance instead of constructing a new\n * one — which preserves section state, but would silently drop the fresh\n * `data`/`dataContext` the loaders just returned. Sync them here.\n *\n * Design mode is excluded by the caller: Studio owns the instance data there\n * (unsaved drafts must not be clobbered) and applies updates via\n * `refreshStudio` instead.\n *\n * Change detection uses JSON comparison — loader payloads are\n * wire-serialized, so key order is stable between runs; a false mismatch\n * only costs one extra re-render.\n */\nexport function syncReusedInstance(\n weaverse: WeaverseHydrogen,\n params: WeaverseHydrogenParams\n) {\n weaverse.requestInfo = params.requestInfo\n weaverse.internal = params.internal\n\n let dataChanged =\n JSON.stringify(weaverse.data) !== JSON.stringify(params.data)\n let contextChanged =\n JSON.stringify(weaverse.dataContext ?? null) !==\n JSON.stringify(params.dataContext ?? null)\n\n if (contextChanged) {\n // Assign before notifying any item store: components resolve data\n // connectors against `weaverse.dataContext` at render time, so the\n // fresh context must be in place when re-renders flush.\n weaverse.dataContext = params.dataContext ?? null\n }\n if (dataChanged) {\n // State-preserving: existing item stores receive `setData` (and emit),\n // missing ones are created — no full instance teardown.\n weaverse.setProjectData(params.data)\n } else if (contextChanged) {\n // Context-only change: memoized item components subscribe to their item\n // store snapshot, and snapshot identity follows the `_store` reference —\n // a bare `triggerUpdate()` would notify with an identical snapshot and\n // `useSyncExternalStore` would skip the re-render. `setData({})` swaps\n // the store reference so connectors re-resolve against the new context.\n for (const { id } of params.data?.items || []) {\n weaverse.itemInstances.get(id)?.setData({})\n }\n }\n if (dataChanged || contextChanged) {\n weaverse.triggerUpdate()\n }\n}\n","// One pixel per page per navigation. Nested compositions mount multiple\n// Weaverse instances on one URL; both would otherwise double-count the\n// same impression.\n//\n// Two mechanisms cooperate:\n//\n// 1. Key TRANSITIONS (not novelty): `location.key` is stable per history\n// entry, so a back/forward POP restores the entry's ORIGINAL key. We\n// remember only the current key and reset on change — any navigation\n// between Weaverse pages counts again.\n// 2. Instance lifetime: navigating to a route WITHOUT a Weaverse instance\n// (cart, search, account) never calls into this module, so the stored\n// key would still match on Back and wrongly suppress the revisit. When\n// the last registered instance unmounts, forget the navigation state.\n//\n// Known tradeoff: React StrictMode's dev-only mount→cleanup→mount cycle\n// resets the state and double-fires in development — parity with the\n// pre-dedupe behavior; production semantics are unaffected.\nlet currentNavigationKey: string | null = null\nlet firedPageIds = new Set<string>()\nlet mountedInstances = 0\n\nexport function shouldFirePixel(\n navigationKey: string,\n pageId: string\n): boolean {\n if (navigationKey !== currentNavigationKey) {\n currentNavigationKey = navigationKey\n firedPageIds.clear()\n }\n if (firedPageIds.has(pageId)) {\n return false\n }\n firedPageIds.add(pageId)\n return true\n}\n\n/**\n * Track the mounted Weaverse instance; returns the unmount cleanup.\n * Call before `shouldFirePixel` so the navigation state's lifetime is\n * bounded by \"at least one Weaverse instance is on screen\".\n */\nexport function registerPixelInstance(): () => void {\n mountedInstances += 1\n return () => {\n mountedInstances -= 1\n if (mountedInstances === 0) {\n currentNavigationKey = null\n firedPageIds.clear()\n }\n }\n}\n","import { isBrowser } from '@weaverse/react'\nimport { createContext, useContext, useEffect, useRef } from 'react'\nimport { useRouteLoaderData } from 'react-router'\nimport type {\n HydrogenThemeSchema,\n HydrogenThemeSettings,\n PublicEnv,\n} from '~/types'\n\ntype WeaverseThemeData = {\n theme: HydrogenThemeSettings\n schema?: HydrogenThemeSchema\n publicEnv?: PublicEnv\n}\n\nexport class ThemeSettingsStore {\n settings: HydrogenThemeSettings = {}\n schema?: HydrogenThemeSchema\n publicEnv?: PublicEnv\n private listeners: Set<() => void> = new Set()\n private hasWarnedListenerCount = false\n private isDestroyed = false\n\n constructor(data: WeaverseThemeData) {\n const { theme, schema, publicEnv } = data || {}\n this.settings = { ...theme }\n this.schema = schema\n this.publicEnv = publicEnv\n if (isBrowser) {\n window.__weaverseThemeSettingsStore = this\n }\n }\n\n updateThemeSettings = (newSettings: HydrogenThemeSettings) => {\n if (this.isDestroyed) {\n console.warn('ThemeSettingsStore: Cannot update destroyed store')\n return\n }\n\n this.settings = {\n ...this.settings,\n ...newSettings,\n }\n this.emit()\n }\n\n getSnapshot = () => this.settings\n\n getServerSnapshot = () => this.settings\n\n subscribe = (callback: () => void) => {\n if (this.isDestroyed) {\n console.warn('ThemeSettingsStore: Cannot subscribe to destroyed store')\n return () => {}\n }\n\n this.listeners.add(callback)\n\n if (!this.hasWarnedListenerCount && this.listeners.size > 500) {\n this.hasWarnedListenerCount = true\n console.warn(\n `ThemeSettingsStore: ${this.listeners.size} listeners detected. ` +\n 'This may indicate a performance issue. Consider using fewer useThemeSettings() calls.'\n )\n }\n\n return () => {\n this.listeners.delete(callback)\n }\n }\n\n private emit = () => {\n if (this.isDestroyed) {\n return\n }\n\n const currentListeners = Array.from(this.listeners)\n\n for (const listener of currentListeners) {\n try {\n listener()\n } catch (error) {\n console.error('ThemeSettingsStore: Listener error', error)\n }\n }\n }\n\n destroy = () => {\n if (this.isDestroyed) {\n return\n }\n\n this.listeners.clear()\n this.isDestroyed = true\n\n if (isBrowser && window.__weaverseThemeSettingsStore === this) {\n window.__weaverseThemeSettingsStore = undefined\n }\n }\n}\n\nexport const ThemeSettingsStoreContext =\n createContext<ThemeSettingsStore | null>(null)\nThemeSettingsStoreContext.displayName = 'ThemeSettingsStoreContext'\n\nexport function useCreateThemeSettingsStore(): ThemeSettingsStore {\n const data = useRouteLoaderData('root') as {\n weaverseTheme: WeaverseThemeData\n }\n const storeRef = useRef<ThemeSettingsStore | null>(null)\n\n if (!storeRef.current) {\n storeRef.current = new ThemeSettingsStore(data?.weaverseTheme)\n }\n\n const theme = data?.weaverseTheme?.theme\n useEffect(() => {\n if (storeRef.current && theme) {\n storeRef.current.updateThemeSettings(theme)\n }\n }, [theme])\n\n return storeRef.current\n}\n\nexport function useThemeSettingsStore(): ThemeSettingsStore {\n const fromContext = useContext(ThemeSettingsStoreContext)\n const data = useRouteLoaderData('root') as {\n weaverseTheme: WeaverseThemeData\n }\n const fallbackRef = useRef<ThemeSettingsStore | null>(null)\n\n if (!(fallbackRef.current || fromContext)) {\n fallbackRef.current = new ThemeSettingsStore(data?.weaverseTheme)\n }\n\n const store = fromContext ?? fallbackRef.current!\n const theme = data?.weaverseTheme?.theme\n useEffect(() => {\n if (!fromContext && theme) {\n store.updateThemeSettings(theme)\n }\n }, [fromContext, store, theme])\n\n return store\n}\n","import { loadScript } from '@weaverse/react'\nimport { useEffect } from 'react'\nimport {\n useLocation,\n useNavigate,\n useNavigation,\n useRevalidator,\n} from 'react-router'\nimport type { WeaverseHydrogen } from '~/index'\nimport { hasWeaverseStudio } from '~/types'\nimport { useThemeText } from '../hooks/theme-text-context'\nimport { registerPixelInstance, shouldFirePixel } from './pixel'\nimport { getStudioScriptSrc, resolveStudioScriptSrc } from './studio-script-src'\nimport { useThemeSettingsStore } from './use-theme-settings-store'\n\nconst STUDIO_READY_POLL_MS = 50\nconst STUDIO_READY_TIMEOUT_MS = 5000\n\n/**\n * Resolve once `window.weaverseStudio` is available, or `null` on timeout.\n * The studio script sets the global when it *executes*; `loadScript` can\n * resolve earlier for tags it did not create (e.g. SSR-injected markup),\n * so never assume readiness right after the script promise settles.\n */\nfunction waitForStudio(): Promise<Window['weaverseStudio'] | null> {\n return new Promise((resolve) => {\n let startedAt = Date.now()\n function check() {\n if (hasWeaverseStudio(window)) {\n return resolve(window.weaverseStudio)\n }\n if (Date.now() - startedAt >= STUDIO_READY_TIMEOUT_MS) {\n console.warn('[Weaverse] Studio script did not initialize in time')\n return resolve(null)\n }\n setTimeout(check, STUDIO_READY_POLL_MS)\n }\n check()\n })\n}\n\n/**\n * Load the Studio bridge script on every design/preview render so Studio's\n * `checkWeaversePage()` handshake is answered instead of timing out — crucially\n * on routes where the page-scoped {@link useStudio} never mounts: 404s, error\n * boundaries, and non-Weaverse routes. The bridge registers its RPC endpoint\n * and `window.weaverseStudio` the moment the script executes, independent of any\n * page binding. Without this, a content-less route never loads the script and\n * Studio reports a false \"Connection lost\" instead of \"this page has no Weaverse\n * content set up\".\n *\n * `loadScript` is idempotent, so on content routes this coexists with the\n * page-scoped {@link useStudio} (same src) — that hook still binds the page via\n * `init`. Gating this on whether a route \"has Weaverse data\" is deliberately\n * avoided: route matches can't tell whether the page-scoped bridge actually\n * mounts (an `ErrorBoundary` replacing a data route, or data passed via the\n * `data` prop), and suppressing the script there would reintroduce the timeout\n * this fixes. Loading the script is harmless; it only registers the responder.\n *\n * Known limitation: on a route whose `weaverseData` is a deferred Promise, the\n * script can load before the page streams in, so `checkWeaversePage()` may\n * briefly observe `NOT_WEAVERSE_PAGE`. The complete fix is a \"loading\" state in\n * `checkWeaversePage` so the handshake retries rather than latching — that lives\n * in the Studio script, not here. Tracked in Weaverse/builder#2515.\n *\n * Mounted via {@link withWeaverse}, which must be the root route's `Layout`\n * export so the bridge renders even when a route's `ErrorBoundary` replaces the\n * page. Outside Studio (no design/preview params) it is a no-op.\n */\nexport function useStudioConnect() {\n let { search } = useLocation()\n useEffect(() => {\n // Loopback Studio hosts are only honored when the storefront itself is\n // loopback (see resolveStudioScriptSrc), so pass the document's hostname.\n let hostname = typeof window === 'undefined' ? '' : window.location.hostname\n let src = resolveStudioScriptSrc(search, hostname)\n if (src) {\n loadScript(src).catch(console.error)\n }\n }, [search])\n}\n\nexport function useStudio(weaverse: WeaverseHydrogen) {\n let { revalidate } = useRevalidator()\n let navigation = useNavigation()\n let { pathname, search } = useLocation()\n let navigate = useNavigate()\n let themeSettingsStore = useThemeSettingsStore()\n let { themeTextStore, merchantOverrides } = useThemeText()\n let {\n isDesignMode,\n weaverseHost,\n weaverseVersion,\n isPreviewMode,\n isRevisionPreview,\n } = weaverse\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: only revalidate on pathname/search changes\n useEffect(() => {\n if (navigation.state !== 'idle') {\n return\n }\n let src = getStudioScriptSrc({\n isDesignMode,\n isPreviewMode,\n isRevisionPreview,\n weaverseHost,\n weaverseVersion,\n })\n if (!src) {\n return\n }\n if (isRevisionPreview || isPreviewMode) {\n loadScript(src).catch(console.error)\n } else {\n weaverse.internal = {\n ...weaverse.internal,\n navigate,\n revalidate,\n merchantOverrides,\n themeSettingsStore,\n themeTextStore,\n }\n loadScript(src)\n .then(waitForStudio)\n .then((studio) => studio?.init(weaverse))\n .catch(console.error)\n }\n }, [pathname, search, navigation.state])\n usePixel(weaverse)\n}\n\nexport function usePixel(context: WeaverseHydrogen) {\n let { projectId, pageId, isDesignMode, weaverseHost } = context\n let { key: navigationKey } = useLocation()\n // biome-ignore lint/correctness/useExhaustiveDependencies: only track once on mount\n useEffect(() => {\n if (!(projectId && pageId) || isDesignMode) {\n return\n }\n // Register BEFORE deciding to fire: the navigation state must live\n // exactly as long as some Weaverse instance is mounted (see pixel.ts).\n let unregister = registerPixelInstance()\n if (shouldFirePixel(navigationKey, pageId)) {\n let img = new Image()\n img.onload = () => img.remove()\n img.src = `${weaverseHost}/api/public/px?projectId=${projectId}&pageId=${pageId}`\n }\n return unregister\n }, [])\n}\n","import type { ElementData } from '@weaverse/react'\nimport {\n isBrowser,\n useSafeExternalStore,\n Weaverse,\n WeaverseItemStore,\n WeaverseRoot,\n} from '@weaverse/react'\nimport {\n type ComponentType,\n type JSX,\n memo,\n Suspense,\n useMemo,\n useRef,\n} from 'react'\nimport { ErrorBoundary } from 'react-error-boundary'\nimport {\n Await,\n useLoaderData,\n useMatches,\n useRouteLoaderData,\n} from 'react-router'\nimport { defaultComponents } from '~/components'\nimport {\n ThemeTextProvider,\n type TranslateFunction,\n} from './hooks/theme-text-context'\nimport { createWeaverseDataContext } from './hooks/use-weaverse-data-context'\nimport type {\n HydrogenComponentData,\n HydrogenElement,\n HydrogenPageData,\n HydrogenThemeSettings,\n TranslationChanges,\n TranslationEntry,\n TranslationItemEntry,\n TranslationMap,\n WeaverseInternal,\n WeaverseLoaderRequestInfo,\n} from './index'\nimport type {\n HydrogenComponent,\n WeaverseHydrogenParams,\n WeaverseLoaderData,\n} from './types'\nimport { hasWeaverseStudio } from './types'\nimport { generateDataFromSchema } from './utils'\nimport {\n pickWeaverseData,\n type WeaverseDataValue,\n} from './utils/pick-weaverse-data'\nimport { normalizeRequestInfo } from './utils/studio-request-info'\nimport { syncReusedInstance } from './utils/sync-reused-instance'\nimport { ThemeTextStore } from './utils/theme-text-store'\nimport { useStudio, useStudioConnect } from './utils/use-studio'\nimport {\n ThemeSettingsStoreContext,\n useCreateThemeSettingsStore,\n useThemeSettingsStore,\n} from './utils/use-theme-settings-store'\n\n/*\n=== IMPORTANT DESIGN PRINCIPLE ===\nCONSTRUCTOR TIMING AND DEFERRED PROCESSING\n\nWhen working with React component systems and registries:\n- Keep constructors SIMPLE - don't do heavy work in them\n- Defer processing until RENDER TIME, not initialization\n- Avoid registry lookups during object construction (components may not be registered yet)\n- Simple code is more reliable than complex upfront optimization\n- Respect the initialization sequence: registration → instance creation → rendering\n\nHistory: Attempting to do schema processing in the constructor (commit 495e1220) broke\nthe pilot template because it tried to access the component registry before components were registered.\nThe fix was to defer that work until the component is actually rendered.\n====================================\n*/\n\nexport class WeaverseHydrogenItem extends WeaverseItemStore {\n declare weaverse: WeaverseHydrogen\n\n /**\n * Cached merged snapshot (base + translations).\n * Reset to `null` whenever `_store` or the item's translation entry changes.\n */\n private _cachedSnapshot: ElementData | null = null\n private _snapshotStoreRef: ElementData | null = null\n private _snapshotTranslationRef: TranslationItemEntry | null = null\n\n constructor(initialData: HydrogenComponentData, weaverse: WeaverseHydrogen) {\n super(initialData, weaverse)\n const { data, ...rest } = initialData\n if (!this.Element?.schema) {\n console.error('Element is missing schema or not found!')\n return\n }\n const schemaData = generateDataFromSchema(this.Element.schema)\n Object.assign(this._store, schemaData, data, rest)\n }\n\n get Element(): HydrogenElement {\n return super.Element\n }\n\n /**\n * Override getSnapShot to merge translation data when in translation mode.\n * Memoizes the result: returns the same object reference as long as\n * both `_store` and the translation entry haven't changed.\n * This is critical for `useSyncExternalStore` stability.\n */\n getSnapShot = (): ElementData => {\n const base = this._store\n const translations = this.weaverse.translationMap?.[this._id]\n\n // No translations → return base directly (fast path)\n if (!translations) {\n return base\n }\n\n // Check if cache is still valid (same _store ref + same translation entry ref)\n if (\n this._cachedSnapshot &&\n this._snapshotStoreRef === base &&\n this._snapshotTranslationRef === translations\n ) {\n return this._cachedSnapshot\n }\n\n // Build merged snapshot\n const merged = { ...base }\n for (const [key, entry] of Object.entries(translations)) {\n if (entry.translatedValue !== undefined) {\n merged[key] = entry.translatedValue\n }\n }\n\n this._cachedSnapshot = merged\n this._snapshotStoreRef = base\n this._snapshotTranslationRef = translations\n return merged\n }\n}\n\nWeaverse.ItemConstructor = WeaverseHydrogenItem\n\nexport class WeaverseHydrogen extends Weaverse {\n pageId: string\n internal: Partial<WeaverseInternal>\n requestInfo: WeaverseLoaderRequestInfo\n projectId: string\n weaverseHost: string\n weaverseApiBase: string\n weaverseApiKey: string\n weaverseVersion: string\n isDesignMode: boolean\n isPreviewMode: boolean\n isRevisionPreview: boolean\n sectionType: string\n declare ItemConstructor: typeof WeaverseHydrogenItem\n declare data: HydrogenPageData\n declare static itemInstances: Map<string, WeaverseHydrogenItem>\n declare static elementRegistry: Map<string, HydrogenElement>\n\n // ─── Translation sidecar (design mode only) ────────────────────────\n /**\n * Translation map received from the builder in design mode.\n * Keyed by item ID, each entry maps field names to translated values.\n * `WeaverseHydrogenItem.getSnapShot()` merges these into the data\n * returned to components, so translations render without monkey-patching.\n */\n translationMap: TranslationMap = {}\n translationLocale = ''\n translationLanguageId = ''\n\n constructor(params: WeaverseHydrogenParams) {\n const { internal, pageId, requestInfo, ...coreParams } = params\n super({ ...coreParams })\n this.internal = internal\n this.pageId = pageId\n this.requestInfo = requestInfo\n // Assign configuration properties\n this.projectId = params.projectId\n this.weaverseHost = params.weaverseHost\n this.weaverseApiBase = params.weaverseApiBase\n this.weaverseApiKey = params.weaverseApiKey\n this.weaverseVersion = params.weaverseVersion || ''\n this.isDesignMode = params.isDesignMode ?? false\n this.isPreviewMode = params.isPreviewMode ?? false\n this.isRevisionPreview = params.isRevisionPreview ?? false\n this.sectionType = params.sectionType || ''\n\n // Extract translation sidecar from page data if present (design mode)\n this.extractTranslationSidecar()\n }\n\n /**\n * Extract translation sidecar data from `this.data` (the page data).\n * The builder attaches `translationMap`, `translationLocale`, and\n * `translationLanguageId` to the page data in design mode.\n */\n extractTranslationSidecar = () => {\n const pageData = this.data as Record<string, any>\n if (pageData?.translationMap) {\n this.translationMap = pageData.translationMap\n this.translationLocale = pageData.translationLocale || ''\n this.translationLanguageId = pageData.translationLanguageId || ''\n }\n }\n\n /**\n * Set the translation sidecar data.\n * Called by the studio bridge when translation data arrives or changes.\n * Triggers a re-render of all items so translated snapshots are recalculated.\n */\n setTranslationSidecar = (\n translationMap: TranslationMap,\n locale: string,\n languageId: string\n ) => {\n this.translationMap = translationMap\n this.translationLocale = locale\n this.translationLanguageId = languageId\n // Invalidate all item snapshot caches and trigger re-render\n this.refreshAllItems()\n }\n\n /**\n * Update a single translation entry for a specific item field.\n * Used by the studio bridge when the user edits a translatable field.\n */\n updateTranslation = (\n itemId: string,\n key: string,\n originalValue: string,\n translatedValue: string\n ) => {\n if (!this.translationMap[itemId]) {\n this.translationMap[itemId] = {}\n }\n // Create a new entry reference so getSnapShot detects the change\n this.translationMap[itemId] = {\n ...this.translationMap[itemId],\n [key]: { originalValue, translatedValue },\n }\n // Trigger re-render for this specific item\n const instance = this.itemInstances.get(itemId)\n if (instance) {\n instance.triggerUpdate()\n }\n }\n\n /**\n * Collect all translation changes across all weaverse instances.\n * Used by the save flow to persist translation edits.\n */\n getTranslationChanges = (): TranslationChanges | undefined => {\n const entries: TranslationEntry[] = []\n const languageId = this.translationLanguageId\n if (!(this.translationLocale && languageId)) {\n return\n }\n\n for (const [itemId, fields] of Object.entries(this.translationMap)) {\n for (const [key, entry] of Object.entries(fields)) {\n entries.push({\n itemId,\n key: `data.${key}`,\n originalValue: entry.originalValue,\n translatedValue: entry.translatedValue,\n })\n }\n }\n\n if (entries.length === 0) {\n return\n }\n return { languageId, entries }\n }\n\n /**\n * Override setProjectData to re-extract translation sidecar from new page data.\n */\n setProjectData = (data: HydrogenPageData) => {\n this.data = data\n this.extractTranslationSidecar()\n this.initProject()\n }\n}\n\nfunction createWeaverseInstance(\n params: WeaverseHydrogenParams\n): WeaverseHydrogen {\n const normalizedParams = normalizeRequestInfo(params)\n if (isBrowser) {\n window.__weaverses = window.__weaverses || {}\n const existing = window.__weaverses[normalizedParams.pageId]\n // Reuse the instance only while the browser stays on the same URL —\n // navigation to a different pathname/search builds a fresh instance.\n const isReused =\n existing?.requestInfo?.pathname ===\n normalizedParams.requestInfo.pathname &&\n existing?.requestInfo?.search === normalizedParams.requestInfo.search\n const weaverse = isReused\n ? existing\n : new WeaverseHydrogen(normalizedParams)\n window.__weaverses[normalizedParams.pageId] = weaverse\n if (weaverse.isDesignMode) {\n weaverse.requestInfo = normalizedParams.requestInfo\n if (hasWeaverseStudio(window)) {\n window.weaverseStudio.refreshStudio(normalizedParams)\n }\n } else if (isReused) {\n // Same-URL revalidation in live/preview mode: the reused instance\n // must adopt the fresh loader payload (see syncReusedInstance).\n syncReusedInstance(weaverse, normalizedParams)\n }\n return weaverse\n }\n return new WeaverseHydrogen(normalizedParams)\n}\n\nconst StudioBridge = memo(({ context }: { context: WeaverseHydrogen }) => {\n useStudio(context)\n return null\n})\n\nconst StudioConnect = memo(() => {\n useStudioConnect()\n return null\n})\n\n/**\n * Component lists already pushed into the element registry. Registration is\n * idempotent (the registry checks `has(type)`), but walking the full list\n * allocates and loops on every render — theme component arrays are\n * module-level constants, so register each list identity once.\n */\nconst registeredComponentLists = new WeakSet<HydrogenComponent[]>()\n\nfunction RenderRoot(props: {\n data: WeaverseLoaderData\n components: HydrogenComponent[]\n dataContext?: Record<string, any>\n}) {\n const { data, components, dataContext } = props\n if (!registeredComponentLists.has(components)) {\n for (const comp of [...components, ...defaultComponents]) {\n if (comp?.schema?.type) {\n registerComponent({\n type: comp.schema.type,\n Component: comp.default,\n schema: comp.schema,\n loader: comp.loader,\n })\n }\n }\n registeredComponentLists.add(components)\n }\n const { page, configs, project, pageAssignment } = data || {}\n\n // Keep original page data - processing will happen at component level in renderer\n\n const weaverse = createWeaverseInstance({\n ...configs,\n dataContext,\n data: page,\n pageId: page?.id,\n internal: { project, pageAssignment },\n })\n return (\n <>\n <WeaverseRoot context={weaverse} />\n <StudioBridge context={weaverse} />\n </>\n )\n}\n\n/**\n * Register a Weaverse component with the global element registry.\n * Must be called before rendering components in WeaverseHydrogenRoot.\n *\n * @param element - Component configuration with schema, Component, and optional loader\n *\n * @example\n * ```typescript\n * import Hero from './sections/Hero'\n * import { schema } from './sections/Hero'\n *\n * registerComponent({\n * type: 'hero',\n * Component: Hero,\n * schema,\n * loader: async ({ data, weaverse }) => {\n * return { someData: 'value' }\n * }\n * })\n * ```\n */\nexport function registerComponent(element: HydrogenElement) {\n WeaverseHydrogen.registerElement(element)\n}\n\nexport const WeaverseHydrogenRoot = memo(\n ({\n components,\n data: dataProp,\n errorComponent: ErrorComponent = ({ error }) => (\n <div>\n {error instanceof Error\n ? error.message\n : 'An unexpected error occurred'}\n </div>\n ),\n }: {\n components: HydrogenComponent[]\n /**\n * Optional explicit `weaverseData` payload. When provided, bypasses the\n * automatic route-scoped resolution. Accepts a resolved value, a\n * `Promise` (handled via `<Await>`), or `null` to suppress rendering.\n *\n * Recommended for nested layout + child route compositions where two\n * `<WeaverseHydrogenRoot>` instances need to render different Weaverse\n * pages on the same URL. See issue #451.\n */\n data?: WeaverseDataValue\n errorComponent?: React.FC<{ error: Error | unknown }>\n }) => {\n const matches = useMatches()\n\n // Flat route-keyed data context for data-connector template resolution\n // (e.g. {{root.layout.shop.name}}). Legitimately needs all matches;\n // memoized so same-matches re-renders don't allocate a fresh context.\n const enhancedDataContext = useMemo(\n () => createWeaverseDataContext(matches),\n [matches]\n )\n\n // Route-scoped weaverseData lookup. `useLoaderData()` returns the\n // closest route's loader data, which is what makes nested layout +\n // child routes work — each <WeaverseHydrogenRoot> instance resolves\n // to its own route's weaverseData. See pickWeaverseData() for the\n // three-tier fallback policy.\n const ownLoaderData = useLoaderData() as unknown\n const weaverseData = useMemo(\n () => pickWeaverseData(dataProp, ownLoaderData, matches),\n [dataProp, ownLoaderData, matches]\n )\n\n // Explicit `data={null}` is the documented signal for \"suppress rendering\"\n // (e.g. a route conditionally disables Weaverse without unmounting the\n // component). This is distinct from auto-resolution returning `null`,\n // which means \"data was expected but not found\" — the error path below.\n if (dataProp === null) {\n return null\n }\n\n if (weaverseData) {\n if (weaverseData instanceof Promise) {\n return (\n <ErrorBoundary fallbackRender={ErrorComponent as any}>\n <Suspense>\n <Await resolve={weaverseData}>\n {(resolvedData) => (\n <RenderRoot\n components={components}\n data={resolvedData}\n dataContext={enhancedDataContext}\n />\n )}\n </Await>\n </Suspense>\n </ErrorBoundary>\n )\n }\n return (\n <RenderRoot\n components={components}\n data={weaverseData}\n dataContext={enhancedDataContext}\n />\n )\n }\n return (\n <ErrorComponent\n error={{ message: 'No Weaverse data found in route matches!' }}\n />\n )\n }\n)\n\n/**\n * Options for the `withWeaverse` HOC.\n */\nexport type WithWeaverseOptions = {\n /**\n * Optional external translation function (e.g. from Shopify i18n).\n * When provided it becomes the **highest-priority** source\n * in the `t()` resolution chain exposed by `useThemeText()`.\n */\n t?: TranslateFunction\n}\n\n/**\n * Higher-order component that wraps your app with Weaverse theme settings and\n * translation context, and mounts the Studio connect bridge.\n *\n * Export the result as your root route's **`Layout`** (not the default route\n * `Component`). In React Router the root `Layout` wraps both the matched route\n * and its `ErrorBoundary`, so the Studio bridge keeps rendering on 404s and\n * loader/render errors — exactly the pages where Studio must still answer its\n * handshake instead of reporting a false \"Connection lost\". A default-component\n * wrapper (`export default withWeaverse(App)`) is replaced by the error\n * boundary on those routes and would drop the bridge.\n *\n * @param Component - The root layout component to wrap\n * @param options - Optional configuration (e.g. an external `t` function)\n * @returns Wrapped component with theme settings + translation providers\n *\n * @example\n * ```typescript\n * import { withWeaverse } from '@weaverse/hydrogen'\n *\n * // Basic usage — export as the root route Layout\n * export const Layout = withWeaverse(RootLayout)\n *\n * // With an external translation function\n * export const Layout = withWeaverse(RootLayout, { t: myI18nFunction })\n * ```\n */\nexport function withWeaverse(\n Component: ComponentType<any>,\n options?: WithWeaverseOptions\n) {\n return (props: JSX.IntrinsicAttributes) => {\n const themeSettingsStore = useCreateThemeSettingsStore()\n const themeTextData = useThemeTextData()\n const themeTextStoreRef = useRef<ThemeTextStore | null>(null)\n if (!themeTextStoreRef.current) {\n themeTextStoreRef.current = new ThemeTextStore()\n }\n return (\n <ThemeSettingsStoreContext.Provider value={themeSettingsStore}>\n <ThemeTextProvider\n merchantOverrides={themeTextData.merchantOverrides}\n staticContent={themeTextData.staticContent}\n t={options?.t}\n themeTextStore={themeTextStoreRef.current}\n >\n <StudioConnect />\n <Component {...props} />\n </ThemeTextProvider>\n </ThemeSettingsStoreContext.Provider>\n )\n }\n}\n\n/**\n * Internal hook to read staticContent and merchantOverrides from root loader data.\n * Similar pattern to useThemeSettingsStore – reads from the 'root' route loader.\n */\nfunction useThemeTextData(): {\n staticContent: Record<string, unknown>\n merchantOverrides?: Record<string, unknown>\n} {\n const data = useRouteLoaderData('root') as {\n weaverseTheme?: {\n staticContent?: Record<string, unknown>\n merchantOverrides?: Record<string, unknown>\n }\n }\n return {\n staticContent: data?.weaverseTheme?.staticContent ?? {},\n merchantOverrides: data?.weaverseTheme?.merchantOverrides,\n }\n}\n\n/**\n * React hook to access Weaverse theme settings from anywhere in your component tree.\n * Must be used within a component wrapped by `withWeaverse` or inside `WeaverseHydrogenRoot`.\n *\n * @returns Current theme settings object\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const theme = useThemeSettings()\n * const primaryColor = theme.colors?.primary\n *\n * return <div style={{ color: primaryColor }}>Styled content</div>\n * }\n * ```\n */\nexport function useThemeSettings<T = HydrogenThemeSettings>() {\n const themeSettingsStore = useThemeSettingsStore()\n const settings = useSafeExternalStore(\n themeSettingsStore.subscribe,\n themeSettingsStore.getSnapshot,\n themeSettingsStore.getServerSnapshot\n )\n return settings as T\n}\n","// Query params that influence Weaverse page resolution on the Builder:\n// revision previews, design-mode flags, and `weaverse*` control params\n// (host, version, project id). Everything else — utm_*, fbclid, gclid,\n// storefront filters — is irrelevant to which page the Builder returns.\nconst KEPT_PARAM_RE = /^(?:__revisionId|isDesignMode|weaverse)/\n\n/**\n * Normalize the storefront URL sent in the Builder page API request body.\n *\n * The POST body participates in the `withCache` cache key, so a raw\n * `request.url` fragments the cache by every marketing/tracking param:\n * each distinct `?utm_…`/`fbclid` URL is a guaranteed Builder round-trip\n * even when the resolved page is identical — precisely the paid/social\n * traffic that needs the cache most (builder#2450).\n *\n * The Builder reads only the pathname (locale/type/handle fallback) and\n * the params matched above from this URL, so keep exactly those. Params\n * are sorted for a stable cache key regardless of their order in the\n * incoming URL.\n */\nexport function normalizePageUrl(url: string): string {\n let parsed: URL\n try {\n parsed = new URL(url)\n } catch {\n // Not an absolute URL (shouldn't happen for request.url) — send as-is.\n return url\n }\n const kept = [...parsed.searchParams].filter(([key]) =>\n KEPT_PARAM_RE.test(key)\n )\n kept.sort(([a], [b]) => a.localeCompare(b))\n const search = new URLSearchParams(kept).toString()\n // React Router single-fetch requests loader data from `/<path>.data`, which\n // resolves to the same Builder page as `/<path>`. Strip the suffix so a\n // client navigation and a document load hash to one edge-cache key (the\n // api.weaverse.io worker keys on this url) instead of two — keeping a page's\n // first client navigation off the cold-MISS path.\n let { pathname } = parsed\n if (pathname.endsWith('.data')) {\n pathname = pathname.slice(0, -'.data'.length)\n }\n return `${parsed.origin}${pathname}${search ? `?${search}` : ''}`\n}\n","import {\n CacheCustom,\n createWithCache,\n type HydrogenEnv,\n type I18nBase,\n} from '@shopify/hydrogen'\nimport type {\n CachingStrategy,\n CustomPageEntry,\n FetchProjectPayload,\n FetchProjectRequestBody,\n HydrogenComponent,\n HydrogenComponentData,\n HydrogenPageData,\n LoadPageParams,\n PageType,\n ProjectIdValidationResult,\n ThemeSettingsResponse,\n WeaverseClientArgs,\n WeaverseLoaderData,\n WeaverseProjectConfigs,\n WeaverseStudioQueries,\n WithCacheFetchResponse,\n} from './types'\nimport {\n hasError,\n isFetchProjectPayload,\n isProjectIdFunction,\n WeaverseError,\n} from './types'\nimport {\n generateDataFromSchema,\n getPreviewData,\n getRequestQueries,\n getWeaverseConfigs,\n} from './utils'\nimport { normalizePageUrl } from './utils/normalize-page-url'\n\n/**\n * Cache duration constants (in seconds).\n * These values optimize CDN hit rates while maintaining fresh content.\n */\nconst CACHE_DURATIONS = {\n /** Short browser freshness for content that can change in Builder */\n SHORT: 60,\n /** Shared cache freshness for anonymous storefront traffic */\n SHARED_SHORT: 300,\n /** Long stale window so slow Builder responses do not block storefront rendering */\n LONG: 86_400,\n /** Extra freshness for sitemap-like index data */\n STATIC: 3600,\n} as const\n\n/**\n * Network timeout for fetch requests (in milliseconds).\n * Default is 10 seconds to balance reliability and user experience.\n */\nconst DEFAULT_FETCH_TIMEOUT_MS = 10_000\n\n/**\n * Bounded retry for the public API fetch. A single slow/cold origin response,\n * a transient 5xx, or a network blip would otherwise make loadPage return null\n * — rendering the \"Please add new section\" placeholder or throwing a 404 in\n * the route. Two attempts (one retry) is enough: by the time the first attempt\n * times out, the edge proxy's single-flight leader has usually populated its\n * versioned cache, so the retry lands on a warm HIT.\n */\nconst MAX_FETCH_ATTEMPTS = 2\nconst FETCH_RETRY_BACKOFF_MS = 300\n\n/**\n * Retry only transient failures: request timeouts, network errors, and origin\n * 5xx. A 4xx is deterministic (e.g. a genuine 404) — retrying just wastes time.\n */\nfunction isRetryableFetchError(error: unknown): boolean {\n if (!(error instanceof WeaverseError)) {\n return false\n }\n if (error.code === 'TIMEOUT_ERROR' || error.code === 'NETWORK_ERROR') {\n return true\n }\n return error.code === 'FETCH_ERROR' && (error.statusCode ?? 0) >= 500\n}\n\n/**\n * Weaverse API version path\n */\nconst API_PATH = 'v1' as const\n\n/**\n * Default cache strategy for Weaverse API requests.\n * Optimized for CDN performance with 23-hour stale content tolerance.\n */\nconst DEFAULT_CACHE_STRATEGY: CachingStrategy = {\n maxAge: CACHE_DURATIONS.SHORT,\n sMaxAge: CACHE_DURATIONS.SHARED_SHORT,\n staleWhileRevalidate: CACHE_DURATIONS.LONG,\n staleIfError: CACHE_DURATIONS.LONG,\n} as const\n\ntype BuilderApiCacheTarget =\n | 'custom-pages'\n | 'merchant-overrides'\n | 'project'\n | 'theme-settings'\n\nconst SMART_CACHE_STRATEGIES: Record<BuilderApiCacheTarget, CachingStrategy> = {\n project: DEFAULT_CACHE_STRATEGY,\n 'theme-settings': DEFAULT_CACHE_STRATEGY,\n 'merchant-overrides': DEFAULT_CACHE_STRATEGY,\n 'custom-pages': {\n maxAge: CACHE_DURATIONS.SHORT,\n sMaxAge: CACHE_DURATIONS.STATIC,\n staleWhileRevalidate: CACHE_DURATIONS.LONG,\n staleIfError: CACHE_DURATIONS.LONG,\n },\n} as const\n\nexport class WeaverseClient {\n API = API_PATH\n basePageConfigs: Omit<WeaverseProjectConfigs, 'requestInfo'>\n basePageRequestBody: Omit<FetchProjectRequestBody, 'url'>\n configs: WeaverseProjectConfigs\n withCache: ReturnType<typeof createWithCache>\n\n // Required dependencies\n request: WeaverseClientArgs['request']\n customerAccount: WeaverseClientArgs['customerAccount']\n storefront: WeaverseClientArgs['storefront']\n components: WeaverseClientArgs['components']\n themeSchema: WeaverseClientArgs['themeSchema']\n env: WeaverseClientArgs['env']\n cache: WeaverseClientArgs['cache']\n waitUntil: WeaverseClientArgs['waitUntil']\n\n // Performance optimizations\n private readonly parsedUrl: URL\n private readonly componentsByType: Map<string, HydrogenComponent>\n\n // Configuration\n private readonly fetchTimeoutMs: number\n\n constructor(args: WeaverseClientArgs) {\n // Assign required dependencies\n this.request = args.request\n this.storefront = args.storefront\n this.customerAccount = args.customerAccount\n this.components = args.components\n this.themeSchema = args.themeSchema\n this.env = args.env\n this.cache = args.cache\n this.waitUntil = args.waitUntil\n\n // Performance optimizations\n this.parsedUrl = new URL(args.request.url)\n this.componentsByType = this.buildComponentLookupMap(args.components)\n\n // Configuration\n this.fetchTimeoutMs = args.fetchTimeoutMs || DEFAULT_FETCH_TIMEOUT_MS\n\n // Initialize cache and configs\n this.initializeCache(args)\n this.initializeConfigs(args)\n }\n\n /**\n * Initialize Hydrogen cache with proper configuration.\n * Logs warning if waitUntil is missing.\n */\n private initializeCache(args: WeaverseClientArgs): void {\n if (!args.waitUntil) {\n console.warn(\n '⚠️ WeaverseClient: waitUntil not provided, background operations may not complete'\n )\n }\n\n this.withCache = createWithCache({\n cache: args.cache,\n waitUntil: args.waitUntil || (() => Promise.resolve()),\n request: args.request,\n })\n }\n\n /**\n * Initialize configs with projectId resolution and fail-fast validation.\n * Throws WeaverseError if projectId cannot be resolved.\n */\n private initializeConfigs(args: WeaverseClientArgs): void {\n // Get base configs once to avoid duplicate calls\n const baseConfigs = getWeaverseConfigs(\n args.request,\n args.env as HydrogenEnv\n )\n\n // Resolve projectId with multi-project support\n const resolvedProjectId = this.resolveProjectIdSync(\n args.projectId,\n args.request,\n args.env as HydrogenEnv,\n baseConfigs\n )\n\n // Fail-fast validation: throw if projectId is empty\n if (!resolvedProjectId || resolvedProjectId.trim() === '') {\n throw new WeaverseError(\n 'Failed to initialize WeaverseClient: No valid projectId found. ' +\n 'Set WEAVERSE_PROJECT_ID environment variable or provide projectId parameter.',\n 'MISSING_PROJECT_ID'\n )\n }\n\n // Initialize configs with resolved projectId\n this.configs = {\n ...baseConfigs,\n projectId: resolvedProjectId,\n }\n\n // Initialize base configurations\n this.basePageConfigs = {\n projectId: this.configs.projectId,\n weaverseHost: this.configs.weaverseHost,\n weaverseApiBase: this.configs.weaverseApiBase,\n weaverseApiKey: this.configs.weaverseApiKey,\n weaverseVersion: this.configs.weaverseVersion,\n isDesignMode: this.configs.isDesignMode,\n isPreviewMode: this.configs.isPreviewMode,\n isRevisionPreview: this.configs.isRevisionPreview,\n }\n\n this.basePageRequestBody = {\n isDesignMode: this.configs.isDesignMode,\n i18n: args.storefront.i18n,\n projectId: this.configs.projectId,\n }\n\n // Freeze configs to prevent accidental mutations\n Object.freeze(this.configs)\n Object.freeze(this.basePageConfigs)\n Object.freeze(this.basePageRequestBody)\n }\n\n /**\n * Build component lookup map for O(1) access by type.\n * Significantly improves performance for large component lists.\n */\n private buildComponentLookupMap(\n components: HydrogenComponent[]\n ): Map<string, HydrogenComponent> {\n return new Map(components.map((comp) => [comp.schema?.type, comp]))\n }\n\n /**\n * Extract comprehensive error information from unknown error type.\n * Preserves error context, codes, and stack traces for debugging.\n *\n * @param error - Unknown error to extract information from\n * @returns Structured error information with message, code, stack, and context\n *\n * @example\n * ```typescript\n * try {\n * // ... operation\n * } catch (error) {\n * const errorInfo = this.extractErrorInfo(error)\n * console.error('Operation failed:', errorInfo.message, errorInfo.context)\n * }\n * ```\n */\n private extractErrorInfo(error: unknown): {\n message: string\n code?: string\n stack?: string\n context?: Record<string, unknown>\n } {\n if (error instanceof WeaverseError) {\n return {\n message: error.message,\n code: error.code,\n context: error.context,\n stack: error.stack,\n }\n }\n\n if (error instanceof Error) {\n return {\n message: error.message,\n stack: error.stack,\n }\n }\n\n return {\n message: String(error),\n }\n }\n\n /**\n * Extract error message only (for backward compatibility).\n * Use extractErrorInfo() for more detailed error information.\n *\n * @deprecated Use extractErrorInfo() instead to preserve error context\n */\n private extractErrorMessage(error: unknown): string {\n return this.extractErrorInfo(error).message\n }\n\n /**\n * Validates projectId format (alphanumeric, hyphens, underscores only).\n * Returns detailed validation result with error message.\n *\n * @param projectId - Project identifier to validate\n * @returns Validation result with error message if invalid\n */\n private validateProjectId(projectId: string): ProjectIdValidationResult {\n if (!projectId || projectId.trim() === '') {\n return {\n valid: false,\n error: 'Project ID cannot be empty',\n }\n }\n\n // Only allow alphanumeric characters, hyphens, and underscores\n const validPattern = /^[a-zA-Z0-9_-]+$/\n if (!validPattern.test(projectId)) {\n return {\n valid: false,\n error: `Invalid format: \"${projectId}\". Only alphanumeric characters, hyphens, and underscores are allowed.`,\n }\n }\n\n return { valid: true }\n }\n\n /**\n * Resolves projectId with multi-project architecture support.\n * Uses priority chain to determine the correct project ID.\n *\n * @param projectId - Project identifier (string, function, or undefined)\n * @param request - HTTP request for context access\n * @param env - Hydrogen environment with variables\n * @param baseConfigs - Pre-fetched base configs to avoid duplicate calls\n * @returns Resolved project ID string (empty string if none found)\n */\n private resolveProjectIdSync(\n projectId: string | (() => string) | (() => Promise<string>) | undefined,\n request: Request,\n env: HydrogenEnv,\n baseConfigs?: WeaverseProjectConfigs\n ): string {\n return (\n this.resolveFromQueryParams(request) ||\n this.resolveFromFunction(projectId) ||\n this.resolveFromString(projectId) ||\n this.resolveFromEnvironment(baseConfigs, request, env) ||\n ''\n )\n }\n\n /**\n * Priority 1: Resolve projectId from URL query parameters.\n * Used for design mode and preview mode overrides.\n */\n private resolveFromQueryParams(request: Request): string | null {\n const queries = getRequestQueries<WeaverseStudioQueries>(request)\n return queries.weaverseProjectId || null\n }\n\n /**\n * Priority 2: Resolve projectId from function parameter.\n * Detects and rejects async functions with helpful error.\n */\n private resolveFromFunction(\n projectId: string | (() => string) | (() => Promise<string>) | undefined\n ): string | null {\n if (!isProjectIdFunction(projectId)) {\n return null\n }\n\n // Check if it's an async function BEFORE calling\n if (projectId.constructor.name === 'AsyncFunction') {\n throw new WeaverseError(\n 'Async projectId functions must be awaited before passing to WeaverseClient. ' +\n 'Use: projectId: await getProjectAsync() instead of: projectId: getProjectAsync',\n 'ASYNC_PROJECT_ID'\n )\n }\n\n try {\n const result = projectId()\n\n // Safety net: check if result is a Promise\n if (result instanceof Promise) {\n throw new WeaverseError(\n 'Async projectId functions must be awaited before passing to WeaverseClient. ' +\n 'Use: projectId: await getProjectAsync() instead of: projectId: getProjectAsync',\n 'ASYNC_PROJECT_ID'\n )\n }\n\n if (result && result.trim() !== '') {\n const trimmed = result.trim()\n const validation = this.validateProjectId(trimmed)\n\n if (validation.valid) {\n return trimmed\n }\n\n // Throw on validation failure - fail-fast for explicit projectId\n throw new WeaverseError(\n validation.error || 'Invalid projectId format',\n 'INVALID_PROJECT_ID'\n )\n }\n } catch (err) {\n // Re-throw WeaverseError (async function errors, validation errors)\n if (err instanceof WeaverseError) {\n throw err\n }\n\n // Wrap unexpected errors\n throw new WeaverseError(\n `Failed to evaluate projectId function: ${err instanceof Error ? err.message : String(err)}`,\n 'PROJECT_ID_FUNCTION_ERROR',\n undefined,\n { cause: err instanceof Error ? err.stack : String(err) }\n )\n }\n\n return null\n }\n\n /**\n * Priority 3: Resolve projectId from explicit string parameter.\n */\n private resolveFromString(\n projectId: string | (() => string) | (() => Promise<string>) | undefined\n ): string | null {\n if (typeof projectId !== 'string') {\n return null\n }\n\n const trimmed = projectId.trim()\n if (trimmed === '') {\n return null\n }\n\n const validation = this.validateProjectId(trimmed)\n if (validation.valid) {\n return trimmed\n }\n\n // Throw on validation failure - fail-fast for explicit projectId\n throw new WeaverseError(\n validation.error || 'Invalid projectId format',\n 'INVALID_PROJECT_ID'\n )\n }\n\n /**\n * Priority 4: Resolve projectId from environment variables.\n */\n private resolveFromEnvironment(\n baseConfigs: WeaverseProjectConfigs | undefined,\n request: Request,\n env: HydrogenEnv\n ): string | null {\n const configs = baseConfigs || getWeaverseConfigs(request, env)\n\n if (configs.projectId && configs.projectId.trim() !== '') {\n return configs.projectId.trim()\n }\n\n return null\n }\n\n /**\n * Helper method for direct fetching in design mode.\n * Returns same format as withCache.fetch for consistency.\n * Includes 10-second timeout to prevent hanging requests.\n */\n private readonly fetchOnce = async <T>(\n url: string,\n options: RequestInit,\n timeoutMs: number\n ): Promise<WithCacheFetchResponse<T>> => {\n const controller = new AbortController()\n const timeoutId: ReturnType<typeof setTimeout> | undefined = setTimeout(\n () => controller.abort(),\n timeoutMs\n )\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new WeaverseError(\n `HTTP ${response.status}: ${response.statusText}`,\n 'FETCH_ERROR',\n response.status,\n { url, errorText }\n )\n }\n\n const data = (await response.json()) as T\n return { data, response }\n } catch (err) {\n if (err instanceof WeaverseError) {\n throw err\n }\n\n if (err.name === 'AbortError') {\n throw new WeaverseError(\n `Request timeout after ${timeoutMs}ms`,\n 'TIMEOUT_ERROR',\n undefined,\n { url, timeoutMs }\n )\n }\n\n throw new WeaverseError(\n 'Network error during fetch',\n 'NETWORK_ERROR',\n undefined,\n { url, cause: err instanceof Error ? err.message : String(err) }\n )\n } finally {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId)\n }\n }\n }\n\n private readonly directFetch = async <T>(\n url: string,\n options: RequestInit = {},\n timeoutMs = this.fetchTimeoutMs\n ): Promise<WithCacheFetchResponse<T>> => {\n let lastError: unknown\n for (let attempt = 1; attempt <= MAX_FETCH_ATTEMPTS; attempt++) {\n try {\n return await this.fetchOnce<T>(url, options, timeoutMs)\n } catch (err) {\n lastError = err\n if (attempt >= MAX_FETCH_ATTEMPTS || !isRetryableFetchError(err)) {\n throw err\n }\n await new Promise((resolve) =>\n setTimeout(resolve, FETCH_RETRY_BACKOFF_MS * attempt)\n )\n }\n }\n throw lastError\n }\n\n // Helper method for building API URLs consistently\n private getApiUrl(endpoint: string): string {\n const { weaverseApiBase } = this.configs\n return `${weaverseApiBase}/api/public/${endpoint}`\n }\n\n private isExternalPublicApiUrl(url: string): boolean {\n const { weaverseApiBase, weaverseHost } = this.configs\n return (\n weaverseApiBase !== weaverseHost &&\n url.startsWith(`${weaverseApiBase}/api/public/`)\n )\n }\n\n /**\n * Fetch data with caching support for both design mode and production.\n * Uses direct fetch in design mode, Hydrogen's withCache in production.\n * Automatically includes projectId in cache key for multi-project isolation.\n *\n * @param url - The URL to fetch from\n * @param options - Fetch options including optional cache strategy\n * @returns Promise resolving to the fetched data\n *\n * @example\n * ```typescript\n * const data = await weaverse.fetchWithCache<MyData>(\n * 'https://api.example.com/data',\n * { method: 'POST', body: JSON.stringify({ key: 'value' }) }\n * )\n * ```\n */\n public fetchWithCache = async <T = unknown>(\n url: string,\n options: RequestInit & {\n cacheTarget?: BuilderApiCacheTarget\n strategy?: CachingStrategy\n } = {}\n ): Promise<T> => {\n const { cacheTarget, strategy: strategyOverride, ...fetchOptions } = options\n const strategy =\n strategyOverride ||\n CacheCustom(\n cacheTarget\n ? SMART_CACHE_STRATEGIES[cacheTarget]\n : DEFAULT_CACHE_STRATEGY\n )\n\n // Update cache key to include method, body content, and projectId for multi-project isolation\n // Prefix for easier debugging in cache systems\n const cacheKey = [\n 'weaverse-fetch',\n url,\n options.method || 'GET',\n fetchOptions.body,\n this.configs.projectId,\n cacheTarget || 'default',\n ]\n\n let result: WithCacheFetchResponse<T>\n\n // Bypass the shared Hydrogen subrequest cache for design/revision modes\n // and for the Cloudflare public API proxy. The proxy owns freshness with\n // versioned cache keys; keeping Hydrogen's URL/body cache in front would\n // keep serving a stale response even after Builder bumps api.weaverse.io's\n // project version.\n if (\n this.configs.isDesignMode ||\n this.configs.isRevisionPreview ||\n this.isExternalPublicApiUrl(url)\n ) {\n result = await this.directFetch<T>(url, fetchOptions)\n } else {\n // Use withCache.fetch for better integration with Hydrogen's caching system\n result = (await this.withCache.fetch(url, fetchOptions, {\n cacheKey,\n cacheStrategy: strategy,\n shouldCacheResponse: (response: any): boolean => {\n // Cache any non-error response (for both Weaverse API and third-party APIs)\n return (\n !hasError(response) && response !== null && response !== undefined\n )\n },\n displayName: 'Weaverse API',\n })) as WithCacheFetchResponse<T>\n }\n\n return result.data\n }\n\n /**\n * Load theme settings from Weaverse API with fallback to schema defaults.\n * Merges remote settings with local theme schema and handles design mode serialization.\n *\n * @param strategy - Optional cache strategy override\n * @returns Promise resolving to theme settings response\n *\n * @example\n * ```typescript\n * const settings = await weaverse.loadThemeSettings()\n * const primaryColor = settings.theme.colors?.primary\n * ```\n */\n loadThemeSettings = async (\n strategy?: CachingStrategy\n ): Promise<ThemeSettingsResponse> => {\n const defaultThemeSettings = generateDataFromSchema(this.themeSchema)\n try {\n const { configs } = this\n const { projectId, isDesignMode } = configs\n if (!projectId) {\n throw new Error('Missing Weaverse projectId!')\n }\n\n const url = this.getApiUrl('project_configs')\n\n const body = JSON.stringify({ isDesignMode, projectId })\n\n // Fetch theme settings and merchant overrides in parallel\n const [data, merchantOverrides] = await Promise.all([\n this.fetchWithCache<ThemeSettingsResponse>(url, {\n method: 'POST',\n cacheTarget: 'theme-settings',\n strategy,\n body,\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'Accept-Encoding': 'gzip, deflate, br',\n },\n }),\n this.fetchMerchantOverrides(strategy),\n ])\n\n let result = data\n\n // Validate that data is a proper object, not corrupted/compressed content\n if (typeof result !== 'object' || result === null) {\n console.warn(\n 'Invalid theme settings response format, using defaults:',\n {\n type: typeof result,\n isString: typeof result === 'string',\n length:\n typeof result === 'string' ? (result as string).length : 'N/A',\n preview:\n typeof result === 'string'\n ? `${(result as string).slice(0, 50)}...`\n : String(result),\n }\n )\n result = { theme: defaultThemeSettings }\n }\n\n if (this.themeSchema?.settings || this.themeSchema?.inspector) {\n // Ensure result.theme exists and is an object before merging\n if (!result.theme || typeof result.theme !== 'object') {\n result.theme = defaultThemeSettings\n } else {\n result.theme = {\n ...defaultThemeSettings,\n ...result.theme,\n }\n }\n }\n\n // Always include staticContent from themeSchema.i18n\n const staticContent = this.themeSchema?.i18n?.staticContent\n if (staticContent) {\n result.staticContent = staticContent\n }\n\n // Include merchant overrides (locale-specific translations from DB)\n if (merchantOverrides) {\n result.merchantOverrides = merchantOverrides\n }\n\n if (this.configs.isDesignMode) {\n result = {\n ...result,\n schema:\n this.themeSchema && typeof this.themeSchema === 'object'\n ? {\n ...this.themeSchema,\n settings: this.themeSchema?.settings?.map((group) => ({\n ...group,\n inputs: group?.inputs?.map((input) => {\n if (typeof input?.condition === 'function') {\n return {\n ...input,\n condition: input.condition.toString(),\n }\n }\n return input\n }),\n })),\n }\n : undefined,\n publicEnv: this.configs.publicEnv,\n }\n }\n return result\n } catch (error) {\n const errorMessage = 'Unable to load theme settings'\n const errorDetails = this.extractErrorMessage(error)\n\n console.error(errorMessage, errorDetails)\n\n return {\n theme: defaultThemeSettings,\n staticContent: this.themeSchema?.i18n?.staticContent,\n _error: errorDetails,\n _loadFailed: true,\n }\n }\n }\n\n /**\n * Fetch locale-specific merchant overrides from the translation API.\n * Returns a nested JSON object with translated values.\n * Falls back to empty object on error to avoid blocking theme rendering.\n */\n private fetchMerchantOverrides = async (\n strategy?: CachingStrategy\n ): Promise<Record<string, unknown> | undefined> => {\n try {\n const { projectId, weaverseHost } = this.configs\n const i18n = this.storefront.i18n\n\n if (!(projectId && weaverseHost)) {\n return\n }\n\n // Build locale code from storefront i18n (e.g. \"en-us\")\n const language = (i18n?.language || 'en').toLowerCase()\n const country = (i18n?.country || 'us').toLowerCase()\n const locale = `${language}-${country}`\n\n const url = `${weaverseHost}/api/translation/static?projectId=${projectId}&locale=${locale}`\n\n const overrides = await this.fetchWithCache<Record<string, unknown>>(\n url,\n {\n method: 'GET',\n cacheTarget: 'merchant-overrides',\n strategy,\n headers: {\n Accept: 'application/json',\n },\n }\n )\n\n // Validate it's a proper object\n if (typeof overrides === 'object' && overrides !== null) {\n return overrides\n }\n\n return\n } catch (error) {\n // Don't let merchant overrides failure block theme rendering\n console.warn(\n 'Unable to load merchant overrides, using theme defaults:',\n this.extractErrorMessage(error)\n )\n return\n }\n }\n\n /**\n * Generate fallback page with default structure when page data is unavailable.\n * Used internally when API returns no page or when page needs default content.\n *\n * @param message - Custom message to display in the fallback page\n * @returns HydrogenPageData with single main component containing the message\n */\n generateFallbackPage = (message: string): HydrogenPageData => {\n const rootId = crypto.randomUUID()\n return {\n id: `fallback_page_${Date.now()}`,\n rootId,\n name: 'Default Page',\n items: [\n {\n type: 'main',\n id: rootId,\n data: { dangerouslySetInnerHTML: { __html: message } },\n },\n ],\n }\n }\n\n /**\n * Fetch all published custom pages for sitemap generation.\n * Paginates automatically, never throws, returns accumulated results on partial failure.\n */\n async fetchCustomPages(opts?: {\n locale?: string\n limit?: number\n }): Promise<CustomPageEntry[]> {\n const { weaverseApiBase, projectId } = this.configs\n const entries: CustomPageEntry[] = []\n const MAX_PAGES = 100\n\n let cursor: string | null = null\n\n for (let i = 0; i < MAX_PAGES; i++) {\n const params = new URLSearchParams()\n if (opts?.locale) {\n params.set('locale', opts.locale)\n }\n if (opts?.limit) {\n params.set('limit', String(opts.limit))\n }\n if (cursor) {\n params.set('cursor', cursor)\n }\n\n const qs = params.toString()\n const url = `${weaverseApiBase}/api/public/v1/projects/${projectId}/custom-pages${qs ? `?${qs}` : ''}`\n\n try {\n const result = await this.fetchWithCache<{\n data: CustomPageEntry[]\n nextCursor: string | null\n }>(url, { cacheTarget: 'custom-pages' })\n entries.push(...(result.data || []))\n\n if (!result.nextCursor) {\n return entries\n }\n cursor = result.nextCursor\n } catch (err: any) {\n const status = err?.status\n const msg = err?.message || String(err)\n console.warn(\n entries.length === 0\n ? `[Weaverse] Failed to fetch custom pages: ${msg}${status ? ` (HTTP ${status})` : ''}`\n : `[Weaverse] Custom pages pagination interrupted: ${msg}`\n )\n return entries\n }\n }\n\n console.warn(\n '[Weaverse] Custom pages pagination cap reached (100 iterations)'\n )\n return entries\n }\n\n /**\n * Load page data from Weaverse API with optional route-level project override.\n * Fetches page content, executes component loaders, and handles empty items fallback.\n *\n * @param params - Optional page loading parameters\n * @param params.type - Page type (HOME, PAGE, PRODUCT, COLLECTION, etc.)\n * @param params.handle - Page handle for dynamic routes\n * @param params.locale - Locale override\n * @param params.projectId - Route-level project ID override (for multi-project)\n * @param params.strategy - Custom cache strategy override\n * @returns Promise resolving to page data or null on error\n *\n * @example\n * ```typescript\n * // Basic usage\n * const data = await weaverse.loadPage()\n *\n * // With page type\n * const data = await weaverse.loadPage({ type: 'HOME' })\n *\n * // Route-level project override\n * const data = await weaverse.loadPage({\n * type: 'PAGE',\n * handle: 'about',\n * projectId: 'campaign-project-123'\n * })\n * ```\n */\n loadPage = async (\n params: LoadPageParams = {}\n ): Promise<WeaverseLoaderData | null> => {\n try {\n const { request, storefront, basePageRequestBody, basePageConfigs } = this\n const {\n projectId: clientProjectId,\n weaverseHost,\n isPreviewMode,\n sectionType,\n } = this.configs\n\n // Validate route-level projectId if provided\n if (params.projectId !== undefined) {\n if (typeof params.projectId !== 'string') {\n console.error(\n 'Route-level projectId validation failed: must be a string. ' +\n `Received: ${typeof params.projectId}`\n )\n return null\n }\n\n const validation = this.validateProjectId(params.projectId)\n if (!validation.valid) {\n console.error(\n `Route-level projectId validation failed: ${validation.error}`\n )\n return null\n }\n }\n\n // Override client-level projectId with route-level projectId if provided\n const effectiveProjectId = params.projectId || clientProjectId\n\n if (isPreviewMode) {\n return getPreviewData(sectionType || '', this.components, weaverseHost)\n }\n\n if (!effectiveProjectId) {\n throw new Error('Missing Weaverse projectId!')\n }\n\n const { strategy, ...pageLoadParams } = params\n const body: {\n projectId: string\n url: string\n i18n?: I18nBase\n params?: {\n type?: PageType\n locale?: string\n handle?: string\n }\n isDesignMode?: boolean\n } = {\n ...basePageRequestBody,\n projectId: effectiveProjectId, // Use effective (potentially overridden) projectId\n params: pageLoadParams,\n // Stripped to pathname + Weaverse params — tracking params would\n // fragment the subrequest cache key (see normalizePageUrl).\n url: normalizePageUrl(request.url),\n }\n\n const reqInit: RequestInit = {\n method: 'POST',\n body: JSON.stringify(body),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'Accept-Encoding': 'gzip, deflate, br',\n 'X-Visitor-UA': request.headers.get('user-agent') || '',\n },\n }\n const url = this.getApiUrl('project')\n\n const projectData: FetchProjectPayload =\n await this.fetchWithCache<FetchProjectPayload>(url, {\n ...reqInit,\n cacheTarget: 'project',\n strategy,\n })\n\n if (hasError(projectData)) {\n throw new Error(projectData.error)\n }\n\n // Extract what we can from the response using type guard\n // If validation fails, use fallback data instead of throwing\n let page: HydrogenPageData | undefined\n let project: WeaverseLoaderData['project'] | undefined\n let pageAssignment: WeaverseLoaderData['pageAssignment'] | undefined\n\n if (isFetchProjectPayload(projectData)) {\n // Valid response - extract normally\n page = projectData.page\n project = projectData.project\n pageAssignment = projectData.pageAssignment\n } else {\n console.warn(\n 'Invalid project data structure received from API, using fallback data',\n { projectId: effectiveProjectId }\n )\n // Try to extract what we can from the malformed response\n const responseData = projectData as any\n page = responseData?.page\n project = responseData?.project\n pageAssignment = responseData?.pageAssignment\n }\n\n if (!project) {\n console.warn('Weaverse project not found. Id:', effectiveProjectId)\n project = {\n id: effectiveProjectId,\n name: 'Weaverse project not found.',\n weaverseShopId: '',\n }\n }\n\n if (!page) {\n page = this.generateFallbackPage(\n '<div style=\"text-align: center;\">Please add new section to start.</div>'\n )\n }\n\n if (page?.items?.length === 0) {\n page.items.push({\n type: 'main',\n id: page.rootId || crypto.randomUUID(),\n data: {},\n })\n }\n\n if (page?.items) {\n const items = page.items\n page.items = await Promise.all(items.map(this.execComponentLoader))\n }\n return {\n page,\n project,\n pageAssignment,\n configs: {\n ...basePageConfigs,\n requestInfo: {\n i18n: storefront.i18n,\n queries: getRequestQueries<WeaverseStudioQueries>(request),\n pathname: this.parsedUrl.pathname,\n search: this.parsedUrl.search,\n },\n },\n }\n } catch (error) {\n const errorMessage = '❌ Page load failed'\n const errorContext: Record<string, unknown> = {\n url: this.request.url,\n projectId: params.projectId || this.configs.projectId,\n }\n\n if (error instanceof WeaverseError) {\n console.error(errorMessage, {\n code: error.code,\n message: error.message,\n ...errorContext,\n ...error.context,\n })\n } else if (error instanceof Error) {\n console.error(errorMessage, {\n message: error.message,\n stack: error.stack,\n ...errorContext,\n })\n } else {\n console.error(errorMessage, {\n error: String(error),\n ...errorContext,\n })\n }\n\n return null\n }\n }\n\n execComponentLoader = async (item: HydrogenComponentData) => {\n const { data = {}, type, id } = item\n const component = this.componentsByType.get(type)\n const loader = component?.loader\n if (typeof loader === 'function' && component) {\n try {\n return {\n ...item,\n loaderData: await Promise.resolve(\n loader({\n data: { ...generateDataFromSchema(component.schema), ...data },\n weaverse: this,\n })\n ),\n }\n } catch (error) {\n console.warn('❌ Item loader run failed.', type, id, error)\n return item\n }\n }\n return item\n }\n}\n","import { getSelectedProductOptions as hydrogen_getSelectedProductOptions } from '@shopify/hydrogen'\nimport type { SelectedOptionInput } from '@shopify/hydrogen/storefront-api-types'\nimport {\n isBrowser,\n isIframe,\n useChildInstances,\n useItemInstance,\n useParentInstance,\n useWeaverse,\n} from '@weaverse/react'\n\n/**\n * Filter out Weaverse-specific query parameters from product options.\n * Removes `isDesignMode` and any parameters starting with `weaverse` prefix.\n *\n * @param request - The incoming HTTP request\n * @returns Filtered product options for Shopify Hydrogen\n *\n * @example\n * ```typescript\n * export async function loader({ request }: LoaderFunctionArgs) {\n * const selectedOptions = getSelectedProductOptions(request)\n * // Use selectedOptions for product queries without Weaverse params\n * }\n * ```\n */\nexport function getSelectedProductOptions(\n request: Request\n): SelectedOptionInput[] {\n let options = hydrogen_getSelectedProductOptions(request)\n return options.filter(\n ({ name }) => name !== 'isDesignMode' && !name.startsWith('weaverse')\n )\n}\n\nexport const IMAGES_PLACEHOLDERS = {\n logo_white:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-logo-w-600x200.svg',\n logo_black:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-logo-k-600x200.svg',\n image:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-image-1024x1024.svg',\n banner_1:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-lifestyle-1-1800x900.svg',\n banner_2:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-lifestyle-2-1800x900.svg',\n collection_1:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-collection-hats-1024x1024.svg',\n collection_2:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-collection-shoes-1024x1024.svg',\n collection_3:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-collection-glasses-1024x1024.svg',\n collection_4:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-collection-lamps-1024x1024.svg',\n collection_5:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-collection-bags-1024x1024.svg',\n collection_6:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-collection-watches-1024x1024.svg',\n product_1:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-watch-3-1024x1024.svg',\n product_2:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-bag-2-1024x1024.svg',\n product_3:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-shoe-1-1024x1024.svg',\n product_4:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-lamp-2-1024x1024.svg',\n product_5:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-glasses-1-1024x1024.svg',\n product_6:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-lamp-1-1024x1024.svg',\n product_7:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-glasses-2-1024x1024.svg',\n product_8:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-hat-3-1024x1024.svg',\n product_9:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-bag-1-1024x1024.svg',\n product_10:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-shoe-2-1024x1024.svg',\n product_11:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-hat-2-1024x1024.svg',\n product_12:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-glasses-3-1024x1024.svg',\n product_13:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-shoe-3-1024x1024.svg',\n product_14:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-bag-3-1024x1024.svg',\n product_15:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-hat-1-1024x1024.svg',\n product_16:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-lamp-3-1024x1024.svg',\n product_17:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-watch-1-1024x1024.svg',\n product_18:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-watch-2-1024x1024.svg',\n}\n\n// Re-export all types and utilities from schema package\nexport * from '@weaverse/schema'\nexport * from './components'\nexport {\n getNestedKey,\n interpolate,\n ThemeTextProvider,\n type ThemeTextProviderProps,\n type ThemeTextValue,\n type TranslateFunction,\n useThemeText,\n} from './hooks/theme-text-context'\n// Export Hydrogen-specific hooks\nexport {\n createWeaverseDataContext,\n useWeaverseDataContext,\n type WeaverseDataContext,\n} from './hooks/use-weaverse-data-context'\n// Export hydrogen-specific modules\nexport * from './seo'\nexport * from './types'\nexport * from './utils'\nexport { ThemeTextStore } from './utils/theme-text-store'\nexport * from './WeaverseHydrogenRoot'\nexport * from './weaverse-client'\n// Re-export utilities from @weaverse/react\nexport {\n isBrowser,\n isIframe,\n useChildInstances,\n useItemInstance,\n useParentInstance,\n useWeaverse,\n}\n"]}
1
+ {"version":3,"sources":["../src/components/main.tsx","../src/components/index.ts","../src/hooks/translation-context.tsx","../src/hooks/use-weaverse-data-context.ts","../src/seo.ts","../src/types.ts","../src/utils/studio-script-src.ts","../src/utils/index.ts","../src/utils/translation-store.ts","../src/utils/pick-weaverse-data.ts","../src/utils/studio-request-info.ts","../src/utils/sync-reused-instance.ts","../src/utils/pixel.ts","../src/utils/use-theme-settings-store.ts","../src/utils/use-studio.ts","../src/WeaverseHydrogenRoot.tsx","../src/utils/normalize-page-url.ts","../src/weaverse-client.ts","../src/index.ts"],"names":["jsx","schema","window","type","children","data","createContext","useContext","useEffect","isBrowser","useMatches","useMemo","useRef","useRouteLoaderData","useSafeExternalStore","hydrogen_getSelectedProductOptions"],"mappings":"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","file":"index.mjs","sourcesContent":["import { createSchema, type SchemaType } from '@weaverse/schema'\nimport type { HTMLAttributes } from 'react'\nimport type { HydrogenComponentProps } from '~/types'\n\n/*\n Main is the default Weaverse component that is used to render the main content.\n This component wraps all the sections/components inside a Weaverse page.\n*/\nfunction Main(props: HydrogenComponentProps & HTMLAttributes<HTMLDivElement>) {\n let { children, dangerouslySetInnerHTML, ...rest } = props\n\n return (\n <div\n {...rest}\n // biome-ignore lint/correctness/noChildrenProp: <explanation>\n children={children}\n // biome-ignore lint/security/noDangerouslySetInnerHtmlWithChildren: <explanation>\n dangerouslySetInnerHTML={children ? undefined : dangerouslySetInnerHTML}\n />\n )\n}\n\nexport default Main\n\nexport let schema: SchemaType = createSchema({\n type: 'main',\n title: 'Main',\n})\n","import type { HydrogenComponent } from '~/types'\nimport MainComponent, { schema as mainSchema } from './main'\n\nexport let defaultComponents: HydrogenComponent[] = [\n {\n default: MainComponent,\n schema: mainSchema,\n },\n]\n","import { useSafeExternalStore } from '@weaverse/react'\nimport { createContext, type ReactNode, useContext, useMemo } from 'react'\nimport type { TranslationStore } from '../utils/translation-store'\n\n/**\n * Traverse a nested object by dot-path.\n *\n * @example\n * getNestedKey({ cart: { title: 'Cart' } }, 'cart.title') // => 'Cart'\n * getNestedKey({}, 'cart.title', 'fallback') // => 'fallback'\n */\nexport function getNestedKey(\n obj: Record<string, unknown>,\n path: string,\n fallback?: string\n): string | undefined {\n const keys = path.split('.')\n let current: unknown = obj\n\n for (const key of keys) {\n if (current == null || typeof current !== 'object') {\n return fallback\n }\n current = (current as Record<string, unknown>)[key]\n }\n\n if (typeof current === 'string') {\n return current\n }\n\n return fallback\n}\n\n/**\n * Replace `{{variable}}` patterns in a string with provided values.\n *\n * @example\n * interpolate('Hello {{name}}!', { name: 'World' }) // => 'Hello World!'\n * interpolate('-{{percentage}}% Off', { percentage: 15 }) // => '-15% Off'\n */\nexport function interpolate(\n template: string,\n variables?: Record<string, string | number>\n): string {\n if (!variables) {\n return template\n }\n\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key: string) => {\n const value = variables[key]\n return value === undefined ? match : String(value)\n })\n}\n\n// ---------------------------------------------------------------------------\n// Context & Provider\n// ---------------------------------------------------------------------------\n\n/**\n * Signature for a translation function.\n */\nexport type TranslateFunction = (\n key: string,\n variables?: Record<string, string | number>\n) => string\n\nexport type TranslationValue = {\n /**\n * Translate a key with optional variable interpolation.\n *\n * Priority chain (highest wins):\n * 1. External `t` (passed into `withWeaverse` / `TranslationProvider`)\n * 2. `merchantOverrides` (DB overrides for the current locale + design overrides)\n * 3. `staticContent` (theme default JSON)\n * 4. The key itself (fallback)\n *\n * @example\n * t('cart.title') // => \"Cart\"\n * t('badge.sale', { percentage: 15 }) // => \"-15% Off\"\n */\n t: TranslateFunction\n /** Exposed for useStudio to attach to weaverse.internal. Null in production. */\n translationStore: TranslationStore | null\n /**\n * @deprecated Use {@link TranslationValue.translationStore} instead. Kept as a\n * backward-compatible alias pointing at the same store instance.\n */\n themeTextStore: TranslationStore | null\n /** Active-locale translated keys loaded from the storefront API. */\n merchantOverrides: Record<string, unknown> | null\n}\n\nconst TranslationContext = createContext<TranslationValue | null>(null)\nTranslationContext.displayName = 'WeaverseTranslationContext'\n\nexport type TranslationProviderProps = {\n staticContent: Record<string, unknown>\n merchantOverrides?: Record<string, unknown>\n /**\n * Optional external translation function.\n * When provided it becomes the **highest-priority** source:\n * if it returns a non-empty string that differs from the raw key,\n * that value is used; otherwise the internal resolution chain continues.\n */\n t?: TranslateFunction\n /** Optional store for live design-mode text overrides from the builder. */\n translationStore?: TranslationStore | null\n /**\n * @deprecated Use {@link TranslationProviderProps.translationStore} instead.\n * Still accepted for backward compatibility; ignored when `translationStore`\n * is also provided.\n */\n themeTextStore?: TranslationStore | null\n children: ReactNode\n}\n\n/**\n * Build the `t()` translation function over a fixed set of sources.\n *\n * Resolution order, highest priority first:\n * 1. `externalT` – host i18n (e.g. Shopify), unless it echoes the key\n * 2. `designOverrides` – live design-mode edits, flat dot-path keys\n * 3. `merchantOverrides` – locale overrides from the API, nested\n * 4. `staticContent` – the theme's default locale JSON\n * 5. the key itself\n *\n * Design overrides are looked up per-key (own properties only) rather than\n * merged into `merchantOverrides`: a flat key like `cart.title` must override\n * exactly that leaf without wiping sibling keys (`cart.subtitle`), and a\n * per-key own-property lookup never builds nested objects from\n * merchant-controlled keys, so it cannot pollute `Object.prototype`.\n */\nexport function createTranslate(sources: {\n staticContent: Record<string, unknown>\n merchantOverrides?: Record<string, unknown>\n designOverrides?: Record<string, string>\n externalT?: TranslateFunction\n}): TranslateFunction {\n const { staticContent, merchantOverrides, designOverrides, externalT } =\n sources\n return (key, variables) => {\n // Priority 1: external t (e.g. Shopify i18n, third-party library).\n if (externalT) {\n const external = externalT(key, variables)\n // Accept the external value unless it echoed the key unchanged.\n if (external && external !== key) {\n return external\n }\n }\n\n // Priority 2: live design-mode override (flat, keyed by exact dot-path,\n // own properties only so inherited keys never resolve to functions).\n const design =\n designOverrides && Object.hasOwn(designOverrides, key)\n ? designOverrides[key]\n : undefined\n // Priority 3: merchant overrides (nested). Priority 4: static content.\n const override = merchantOverrides\n ? getNestedKey(merchantOverrides, key)\n : undefined\n const staticValue = getNestedKey(staticContent, key)\n\n // Priority 5: the key itself as the final fallback.\n const raw = design ?? override ?? staticValue ?? key\n return interpolate(raw, variables)\n }\n}\n\n// No-op fallback for useSafeExternalStore when store is null (production).\n// Module-level constants — stable references, zero allocation per render.\nconst EMPTY: Record<string, string> = {}\nconst NOOP_SUBSCRIBE = () => () => {}\nconst NOOP_SNAPSHOT = () => EMPTY\n\n/**\n * Provider that wraps the app to expose the `t()` function.\n *\n * - `staticContent` – the theme's default locale JSON (from themeSchema.i18n)\n * - `merchantOverrides` – locale-specific overrides fetched from the API\n * - `translationStore` – optional store for live design-mode text overrides\n * (the deprecated `themeTextStore` prop is accepted as a fallback)\n */\nexport function TranslationProvider({\n staticContent,\n merchantOverrides,\n t: externalT,\n translationStore,\n themeTextStore,\n children,\n}: TranslationProviderProps) {\n // Canonical store, falling back to the deprecated `themeTextStore` prop.\n const store = translationStore ?? themeTextStore ?? null\n\n // Subscribe to design-mode overrides. No-op when store is null (production).\n const designOverrides = useSafeExternalStore(\n store?.subscribe ?? NOOP_SUBSCRIBE,\n store?.getSnapshot ?? NOOP_SNAPSHOT,\n store?.getServerSnapshot ?? NOOP_SNAPSHOT\n )\n\n const value = useMemo<TranslationValue>(\n () => ({\n t: createTranslate({\n staticContent,\n merchantOverrides,\n designOverrides,\n externalT,\n }),\n translationStore: store,\n // Deprecated alias — same instance, kept for backward compatibility.\n themeTextStore: store,\n merchantOverrides: merchantOverrides ?? null,\n }),\n [staticContent, merchantOverrides, designOverrides, externalT, store]\n )\n\n return (\n <TranslationContext.Provider value={value}>\n {children}\n </TranslationContext.Provider>\n )\n}\n\n/**\n * Hook to access the translation `t()` function.\n *\n * Must be used inside a component wrapped by `withWeaverse` or `TranslationProvider`.\n *\n * @example\n * ```tsx\n * function CartTitle() {\n * const { t } = useTranslation()\n * return <h2>{t('cart.title')}</h2>\n * }\n * ```\n */\nexport function useTranslation(): TranslationValue {\n const ctx = useContext(TranslationContext)\n if (!ctx) {\n throw new Error(\n 'useTranslation must be used within <TranslationProvider>. Wrap your app with withWeaverse().'\n )\n }\n return ctx\n}\n\n// ---------------------------------------------------------------------------\n// Deprecated aliases (backward compatibility — kept exported indefinitely)\n// ---------------------------------------------------------------------------\n\n/**\n * @deprecated Use {@link TranslationProvider} instead.\n */\nexport const ThemeTextProvider = TranslationProvider\n/**\n * @deprecated Use {@link useTranslation} instead.\n */\nexport const useThemeText = useTranslation\n/**\n * @deprecated Use {@link TranslationValue} instead.\n */\nexport type ThemeTextValue = TranslationValue\n/**\n * @deprecated Use {@link TranslationProviderProps} instead.\n */\nexport type ThemeTextProviderProps = TranslationProviderProps\n","import { type UIMatch, useMatches } from 'react-router'\n\n// Route-keyed data structure interfaces\nexport interface RouteKeyedDataContext {\n root?: Record<string, unknown>\n [routeKey: `routes/${string}`]: Record<string, unknown>\n}\n\n// Flat route-keyed data context: {root: {...}, \"routes/xxx\": {...}}\nexport type WeaverseDataContext = RouteKeyedDataContext &\n Record<string, unknown>\n\n/**\n * Creates flat route-keyed structure from matches\n * Target: {root: {...rootData}, \"routes/product\": {...productData}}\n * Eliminates all duplication by using route IDs as keys\n */\nfunction createFlatDataContext(\n matches: UIMatch<unknown, unknown>[]\n): WeaverseDataContext {\n const context: WeaverseDataContext = {}\n\n // Process matches from root to leaf, creating route-keyed structure\n for (const match of matches) {\n if (match.data && typeof match.data === 'object') {\n // Use route ID as key (e.g., \"root\", \"routes/product\")\n context[match.id] = match.data\n }\n }\n\n return context\n}\n\n/**\n * Hook to get flat route-keyed data context from matches\n * Returns: {root: {...}, \"routes/xxx\": {...}}\n * No more useLoaderData dependency - everything comes from matches\n */\nexport function useWeaverseDataContext(): WeaverseDataContext {\n const matches = useMatches()\n\n // Create flat route-keyed structure - eliminates duplication\n return createFlatDataContext(matches)\n}\n\n/**\n * Helper function to create flat route-keyed data context from useMatches() result\n * Returns: {root: {...}, \"routes/xxx\": {...}}\n */\nexport function createWeaverseDataContext(\n matches: UIMatch<unknown, unknown>[]\n): WeaverseDataContext {\n // Create flat route-keyed structure - clean and efficient\n return createFlatDataContext(matches)\n}\n\n/**\n * Type guard to check if data is WeaverseDataContext (simplified)\n */\nexport function isWeaverseDataContext(\n data: unknown\n): data is WeaverseDataContext {\n return data !== null && typeof data === 'object'\n}\n","import type { PageSEOData } from '@weaverse/schema'\nimport type { MetaDescriptor } from 'react-router'\nimport type { HydrogenPageData, WeaverseLoaderData } from './types'\n\n/**\n * Convert a Weaverse page-level SEO payload into React Router\n * `MetaDescriptor[]`. Pure, synchronous, tree-shakeable — does not fetch.\n *\n * Behavior:\n * - `title` → top-level `{ title }` descriptor.\n * - `description` / `keywords` → `<meta name=\"...\">`.\n * - `canonicalUrl` → `<link rel=\"canonical\">`.\n * - `openGraph.*` → `<meta property=\"og:*\">`. `og:type` defaults to\n * `'website'` when any other OG field is present.\n * - `twitter.*` → `<meta name=\"twitter:*\">`. `twitter:card` defaults to\n * `'summary'` when any other Twitter field is present.\n * - `robots` is always emitted (defaults to `'index,follow'`) so themes\n * stacking multiple SEO sources have a deterministic last word on\n * indexing for Weaverse-managed pages.\n * - Empty strings / missing fields are filtered before return so empty\n * descriptors don't override earlier sources (e.g. Hydrogen\n * `getSeoMeta`).\n */\nexport function formatMetaDescriptors(\n seo: PageSEOData | null | undefined\n): MetaDescriptor[] {\n if (!seo) {\n return [{ name: 'robots', content: 'index,follow' }]\n }\n\n let descriptors: MetaDescriptor[] = []\n\n if (seo.title) {\n descriptors.push({ title: seo.title })\n }\n if (seo.description) {\n descriptors.push({ name: 'description', content: seo.description })\n }\n if (seo.keywords) {\n descriptors.push({ name: 'keywords', content: seo.keywords })\n }\n if (seo.canonicalUrl) {\n descriptors.push({\n tagName: 'link',\n rel: 'canonical',\n href: seo.canonicalUrl,\n })\n }\n\n let og = seo.openGraph\n if (og && (og.title || og.description || og.image || og.type)) {\n if (og.title) {\n descriptors.push({ property: 'og:title', content: og.title })\n }\n if (og.description) {\n descriptors.push({ property: 'og:description', content: og.description })\n }\n if (og.image) {\n descriptors.push({ property: 'og:image', content: og.image })\n }\n descriptors.push({ property: 'og:type', content: og.type || 'website' })\n }\n\n let tw = seo.twitter\n if (tw && (tw.title || tw.description || tw.image || tw.cardType)) {\n descriptors.push({\n name: 'twitter:card',\n content: tw.cardType || 'summary',\n })\n if (tw.title) {\n descriptors.push({ name: 'twitter:title', content: tw.title })\n }\n if (tw.description) {\n descriptors.push({ name: 'twitter:description', content: tw.description })\n }\n if (tw.image) {\n descriptors.push({ name: 'twitter:image', content: tw.image })\n }\n }\n\n let index = seo.robots?.index !== false\n let follow = seo.robots?.follow !== false\n descriptors.push({\n name: 'robots',\n content: `${index ? 'index' : 'noindex'},${follow ? 'follow' : 'nofollow'}`,\n })\n\n return descriptors\n}\n\n/**\n * Convenience accessor: pull `page.seo` out of a `WeaverseLoaderData`\n * (or `HydrogenPageData`) and emit `MetaDescriptor[]`. Null-safe.\n *\n * @example\n * ```ts\n * export const meta: MetaFunction<typeof loader> = ({ data }) => {\n * return getWeaverseSeoMeta(data?.weaverseData)\n * }\n * ```\n */\nexport function getWeaverseSeoMeta(\n data:\n | WeaverseLoaderData\n | HydrogenPageData\n | { page?: HydrogenPageData | null }\n | null\n | undefined\n): MetaDescriptor[] {\n if (!data) {\n return formatMetaDescriptors(null)\n }\n let page =\n 'items' in data && 'id' in data\n ? (data as HydrogenPageData)\n : ((data as { page?: HydrogenPageData | null }).page ?? null)\n return formatMetaDescriptors(page?.seo ?? null)\n}\n","import type {\n CachingStrategy,\n HydrogenContext,\n I18nBase,\n} from '@shopify/hydrogen'\nimport type {\n AppLoadContext,\n LoaderFunctionArgs as RemixOxygenLoaderArgs,\n} from '@shopify/remix-oxygen'\nimport type {\n ElementData,\n PositionInputValue,\n WeaverseCoreParams,\n WeaverseElement,\n WeaverseImage,\n WeaverseProjectDataType,\n WeaverseResourcePickerData,\n WeaverseVideo,\n} from '@weaverse/react'\nimport type {\n // Enhanced type exports from schema package\n BasicInput,\n HeadingInput,\n InputType,\n InspectorGroup,\n PageSEOData,\n PageType,\n ComponentPresets as SchemaComponentPresets,\n SchemaType,\n SchemaValidationIssue,\n SchemaValidationResult,\n} from '@weaverse/schema'\nimport { isValidSchema } from '@weaverse/schema'\nimport type * as React from 'react'\nimport type { ForwardRefExoticComponent } from 'react'\nimport type { NavigateFunction } from 'react-router'\nimport type { TranslationStore } from './utils/translation-store'\nimport type { ThemeSettingsStore } from './utils/use-theme-settings-store'\nimport type { WeaverseHydrogen } from './WeaverseHydrogenRoot'\nimport type { WeaverseClient } from './weaverse-client'\n\n// Re-export CachingStrategy from Hydrogen for convenience\nexport type { CachingStrategy } from '@shopify/hydrogen'\n// Re-export types from schema for backward compatibility and convenience\nexport type {\n // Enhanced type exports\n BasicInput,\n HeadingInput,\n InputType,\n InspectorGroup,\n PageType,\n PositionInputValue,\n SchemaValidationIssue,\n SchemaValidationResult,\n WeaverseImage,\n WeaverseVideo,\n}\n\nexport type ComponentLoaderArgs<T = any, _E = any> = {\n data: T\n weaverse: WeaverseClient\n}\n\nexport interface RouteLoaderArgs extends RemixOxygenLoaderArgs {\n context: AppLoadContext & {\n weaverse: WeaverseClient\n }\n}\n\n// Define a more specific type for component data\nexport type ComponentDataValue = string | number | boolean | undefined | null\n\nexport interface HydrogenComponentData extends ElementData {\n children?: { id: string }[]\n createdAt?: string\n data?: Record<string, ComponentDataValue | Record<string, unknown>>\n deletedAt?: string\n id: string\n type: string\n updatedAt?: string\n}\n\n/**\n * Optimized: Use Zod-inferred SchemaType directly instead of extending\n * This ensures perfect type consistency with the schema validation\n */\nexport type HydrogenComponentSchema = SchemaType\n\nexport interface HydrogenComponentProps<L = any> extends WeaverseElement {\n children?: React.JSX.Element[]\n className?: string\n loaderData?: L\n}\n\nexport type WeaverseLoaderRequestInfo = {\n search: string\n pathname: string\n queries: { [key: string]: string | boolean }\n i18n: WeaverseI18n\n}\n\nexport type HydrogenThemeSettings = {\n [key: string]: any\n}\n\nexport type HydrogenProjectType = {\n id: string\n weaverseShopId: string\n name: string\n [key: string]: any\n}\n\nexport type WeaverseInternal = {\n pageAssignment: HydrogenPageAssignment\n project: HydrogenProjectType\n navigate: NavigateFunction\n revalidate: () => void\n themeSettingsStore: ThemeSettingsStore\n translationStore?: TranslationStore | null\n /** @deprecated Use translationStore instead. */\n themeTextStore?: TranslationStore | null\n merchantOverrides?: Record<string, unknown> | null\n}\n\n/**\n * Optimized: Use direct type alias to maintain consistency\n */\nexport type HydrogenComponentPresets = SchemaComponentPresets\n\nexport type HydrogenElement = {\n Component:\n | ForwardRefExoticComponent<HydrogenComponentProps>\n | ((props: HydrogenComponentProps) => React.JSX.Element)\n type: string\n schema?: HydrogenComponentSchema\n /** Optional data loader function for server-side data fetching */\n loader?: (args: ComponentLoaderArgs) => Promise<unknown>\n}\n\nexport interface WeaverseHydrogenParams\n extends Omit<WeaverseCoreParams, 'ItemConstructor'> {\n data: HydrogenPageData\n dataContext?: Record<string, unknown> | null\n internal: Partial<WeaverseInternal>\n isDesignMode?: boolean\n isPreviewMode?: boolean\n isRevisionPreview?: boolean\n pageId: string\n projectId: string\n requestInfo: WeaverseLoaderRequestInfo\n sectionType?: string\n weaverseApiBase: string\n weaverseApiKey: string\n weaverseHost: string\n /**\n * Public data API origin. Keep `weaverseHost` for Studio scripts/editor\n * assets; point this at the Cloudflare proxy (`https://api.weaverse.io`)\n * when edge caching is enabled.\n */\n weaversePublicApiBase?: string\n weaverseVersion?: string\n}\n\nexport type HydrogenComponent<T extends HydrogenComponentProps = any> = {\n default: ForwardRefExoticComponent<T> | ((props: T) => React.JSX.Element)\n schema: HydrogenComponentSchema\n /** Optional data loader function for server-side data fetching */\n loader?: (args: ComponentLoaderArgs) => Promise<unknown>\n}\n\nexport type WeaverseStudioQueries = {\n weaverseProjectId: string\n weaverseApiKey: string\n weaverseHost: string\n weaverseVersion: string\n isDesignMode: boolean\n isPreviewMode?: boolean\n sectionType?: string\n}\n\nexport type PublicEnv = {\n PUBLIC_STORE_DOMAIN: string\n PUBLIC_STOREFRONT_API_TOKEN: string\n}\n\nexport type WeaverseProjectConfigs = {\n projectId: string\n weaverseHost: string\n weaverseApiBase: string\n weaversePublicApiBase?: string\n weaverseApiKey: string\n weaverseVersion?: string\n isDesignMode?: boolean\n isPreviewMode?: boolean\n isRevisionPreview?: boolean\n sectionType?: string\n publicEnv?: PublicEnv\n}\n\nexport type HydrogenPageAssignment = {\n projectId: string\n type: PageType\n handle: string\n locale: string\n meta?: {\n inherited: boolean\n sourceProjectId: string\n depth: number\n }\n}\n\nexport type WeaverseLoaderData = {\n configs: Omit<WeaverseProjectConfigs, 'publicEnv'> & {\n requestInfo: WeaverseLoaderRequestInfo\n }\n page: HydrogenPageData\n project: HydrogenProjectType\n pageAssignment?: HydrogenPageAssignment\n}\n\nexport interface HydrogenPageData extends WeaverseProjectDataType {\n __cacheId?: string\n id: string\n items: HydrogenComponentData[]\n name: string\n /**\n * Page-level SEO metadata published by Weaverse Builder. `null` when\n * the page has no `PageSeo` row; absent on revision snapshots that\n * predate the SEO feature. Themes should treat both as \"no Weaverse\n * override\".\n */\n seo?: PageSEOData | null\n [key: string]: any\n}\n\nexport type WeaverseI18n = I18nBase & {\n label?: string\n pathPrefix?: string\n [key: string]: any\n}\n\nexport type HydrogenThemeSchema = {\n info: {\n name: string\n version: string\n author: string\n authorProfilePhoto: string\n documentationUrl: string\n supportUrl: string\n }\n /** @deprecated Use settings instead */\n inspector?: InspectorGroup[]\n settings?: InspectorGroup[]\n i18n?: {\n urlStructure: 'url-path' | 'subdomain' | 'top-level-domain'\n defaultLocale: WeaverseI18n\n shopLocales: WeaverseI18n[]\n staticContent?: Record<string, unknown>\n /** Enable the translation UI in the builder. */\n translation?: boolean\n }\n}\n\nexport type FetchProjectRequestBody = {\n projectId: string\n url: string\n i18n?: WeaverseI18n\n params?: {\n type?: PageType\n locale?: string\n handle?: string\n }\n isDesignMode?: boolean\n}\n\nexport type FetchProjectPayload = {\n page?: HydrogenPageData // Page might be missing for some routes\n project?: HydrogenProjectType // Project might be missing in error cases\n pageAssignment?: HydrogenPageAssignment // PageAssignment might be missing\n error?: string\n [key: string]: any // Allow additional properties from API response\n}\n\n/**\n * Project identifier value - can be static string or dynamic function.\n *\n * **Static String**: Direct project ID reference\n * ```ts\n * 'project-abc-123'\n * ```\n *\n * **Synchronous Function**: Returns project ID based on request context\n * ```ts\n * () => {\n * const host = new URL(request.url).hostname\n * return PROJECT_MAP[host] || 'default-project'\n * }\n * ```\n *\n * **Asynchronous Function**: Async project resolution (must be awaited before passing)\n * ```ts\n * async () => {\n * return await database.getProjectId(userId)\n * }\n * ```\n */\nexport type ProjectIdValue = string | (() => string) | (() => Promise<string>)\n\n/**\n * Type guard for detecting function-based projectId.\n *\n * Used internally by WeaverseClient constructor to determine\n * if projectId needs evaluation or can be used directly.\n */\nexport function isProjectIdFunction(\n projectId: ProjectIdValue | undefined\n): projectId is (() => string) | (() => Promise<string>) {\n return typeof projectId === 'function'\n}\n\n/**\n * Extended WeaverseClient constructor arguments supporting multi-project architecture.\n *\n * @example Static project (existing pattern - backward compatible)\n * ```ts\n * const weaverse = new WeaverseClient({\n * ...hydrogenContext,\n * projectId: 'project-default-123'\n * })\n * ```\n *\n * @example Dynamic project selection (new capability)\n * ```ts\n * const weaverse = new WeaverseClient({\n * ...hydrogenContext,\n * projectId: () => {\n * const origin = new URL(request.url).origin\n * if (origin === 'https://mystore.se') return process.env.WEAVERSE_PROJECT_SWEDEN!\n * if (origin === 'https://mystore.fr') return process.env.WEAVERSE_PROJECT_FRANCE!\n * return process.env.WEAVERSE_PROJECT_ID!\n * }\n * })\n * ```\n *\n * **Priority Chain** (highest to lowest):\n * 1. URL query parameter: `?weaverseProjectId=...` (design mode, preview mode)\n * 2. Function result (if function provided)\n * 3. Explicit string value (if string provided)\n * 4. Environment variable: `WEAVERSE_PROJECT_ID` (Hydrogen env or process.env)\n * 5. Empty string (triggers validation error in methods)\n *\n * **Function Requirements**:\n * - Must return non-empty string\n * - Can access request via closure for routing decisions\n * - Evaluated once per WeaverseClient instance (request-scoped)\n * - Async functions must be awaited before passing to constructor\n * - Should handle edge cases (missing headers, invalid domains, etc.)\n *\n * **Request Context Access**:\n * Functions access request via closure from constructor arguments.\n */\nexport type WeaverseClientArgs = HydrogenContext & {\n /**\n * React components registered with Weaverse CMS.\n * Each component must have a schema defining its properties and settings.\n */\n components: HydrogenComponent[]\n\n /**\n * Theme schema defining global theme settings (colors, fonts, layouts).\n * Used to generate default theme configuration and validate theme data.\n */\n themeSchema: HydrogenThemeSchema\n\n /**\n * Incoming HTTP request object from React Router loader.\n * Provides access to URL, headers, cookies for dynamic routing decisions.\n */\n request: Request\n\n /**\n * Hydrogen cache instance for content caching.\n *Supports multi-tenant caching with project-specific cache keys.\n */\n cache: Cache\n\n /**\n * Project identifier for loading content from Weaverse CMS.\n *\n * **Value Types**:\n * - Static string: 'project-123' (existing usage)\n * - Synchronous function: () => determineProject(request)\n * - Asynchronous function: async () => await getProject(request) (must be awaited)\n *\n * **Backward Compatibility**:\n * - Optional parameter (defaults to environment variable)\n * - Existing code without projectId continues to work unchanged\n *\n * **Cache Isolation**:\n * ProjectId is included in cache keys to prevent cross-project content pollution.\n * Each project's content is cached separately, ensuring multi-tenant isolation.\n */\n projectId?: ProjectIdValue\n\n /**\n * Fetch timeout in milliseconds for API requests.\n * Defaults to 10000ms (10 seconds) if not specified.\n * Useful for adjusting based on network conditions or deployment environment.\n *\n * @default 10000\n * @example\n * ```typescript\n * new WeaverseClient({\n * // ... other args\n * fetchTimeoutMs: 5000 // 5 second timeout\n * })\n * ```\n */\n fetchTimeoutMs?: number\n}\n\nexport type WeaverseProduct = WeaverseResourcePickerData\nexport type WeaverseCollection = WeaverseResourcePickerData\nexport type WeaverseBlog = WeaverseResourcePickerData\nexport type WeaverseArticle = WeaverseResourcePickerData\nexport type WeaverseMetaObject = WeaverseResourcePickerData\n\n/**\n * Response types for improved type safety\n */\n\n// Response wrapper from withCache.fetch\nexport type WithCacheFetchResponse<T> = {\n data: T\n response: Response\n}\n\n// Theme settings response structure\nexport type ThemeSettingsResponse = {\n theme?: HydrogenThemeSettings\n schema?: HydrogenThemeSchema\n publicEnv?: PublicEnv\n /** Theme's default locale JSON from themeSchema.i18n.staticContent */\n staticContent?: Record<string, unknown>\n /** Locale-specific merchant overrides from the API */\n merchantOverrides?: Record<string, unknown>\n _error?: string\n _loadFailed?: boolean\n}\n\n// Direct fetch response structure\nexport type DirectFetchResponse<T = unknown> = {\n data?: T\n error?: string\n}\n\n// Cache response validation function type\nexport type CacheResponseValidator<T = unknown> = (\n response: WithCacheFetchResponse<T> | T\n) => boolean\n\n// Weaverse Error class for better error handling\nexport class WeaverseError extends Error {\n public readonly code: string\n public readonly statusCode?: number\n public readonly context?: Record<string, unknown>\n\n constructor(\n message: string,\n code = 'WEAVERSE_ERROR',\n statusCode?: number,\n context?: Record<string, unknown>\n ) {\n super(message)\n this.name = 'WeaverseError'\n this.code = code\n this.statusCode = statusCode\n this.context = context\n\n // Maintains proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, WeaverseError)\n }\n }\n}\n\n/**\n * Validation result type for project ID validation.\n * Returns validation status with optional error message.\n */\nexport type ProjectIdValidationResult = {\n valid: boolean\n error?: string\n}\n\nexport interface CustomPageEntry {\n changeFrequency?: 'daily' | 'weekly' | 'monthly'\n handle: string\n lastModified: string\n locale: string | null\n path: string\n priority?: number\n}\n\n/**\n * Type guards for response validation\n */\n\nexport function isWithCacheFetchResponse<T>(\n response: unknown\n): response is WithCacheFetchResponse<T> {\n return (\n typeof response === 'object' &&\n response !== null &&\n 'data' in response &&\n 'response' in response\n )\n}\n\nexport function isFetchProjectPayload(\n payload: unknown\n): payload is FetchProjectPayload {\n return (\n typeof payload === 'object' &&\n payload !== null &&\n 'page' in payload &&\n 'project' in payload &&\n 'pageAssignment' in payload\n )\n}\n\nexport function hasError(response: unknown): response is { error: string } {\n return (\n typeof response === 'object' &&\n response !== null &&\n 'error' in response &&\n typeof (response as Record<string, unknown>).error === 'string'\n )\n}\n\nexport function isThemeSettingsResponse(\n data: unknown\n): data is ThemeSettingsResponse {\n if (typeof data !== 'object' || data === null) {\n return false\n }\n\n const record = data as Record<string, unknown>\n return (\n 'theme' in record &&\n typeof record.theme === 'object' &&\n record.theme !== null\n )\n}\n\n/**\n * Enhanced type utilities for better development experience\n */\nexport type HydrogenSchemaValidationResult =\n SchemaValidationResult<HydrogenComponentSchema>\n\n/**\n * Type guard to check if a schema is valid.\n * Leverages validation from @weaverse/schema package which provides\n * comprehensive Zod-based validation with the ElementSchema.\n *\n * @param schema - Unknown value to validate\n * @returns True if schema is a valid HydrogenComponentSchema\n *\n * @example\n * ```typescript\n * if (isValidHydrogenSchema(userInput)) {\n * // userInput is now typed as HydrogenComponentSchema\n * console.log(userInput.type)\n * }\n * ```\n */\nexport function isValidHydrogenSchema(\n schema: unknown\n): schema is HydrogenComponentSchema {\n // Use the comprehensive validation from @weaverse/schema package\n return isValidSchema(schema)\n}\n\n/**\n * Type-safe helper to create component schemas with validation\n */\nexport type CreateHydrogenSchemaOptions = {\n title: string\n type: string\n limit?: number\n settings?: InspectorGroup[]\n childTypes?: string[]\n enabledOn?: {\n pages?: PageType[]\n groups?: ('*' | 'header' | 'footer' | 'body')[]\n }\n enabled?:\n | boolean\n | ((context: {\n page: {\n id: string\n type: PageType\n handle: string\n locale: string\n }\n group: 'body' | 'header' | 'footer'\n }) => boolean)\n presets?: {\n children?: SchemaComponentPresets[]\n [key: string]: any\n }\n}\n\n// Extended window interface for hydrogen-specific globals\ndeclare global {\n interface Window {\n __weaverse?: WeaverseHydrogen\n __weaverses?: Record<string, WeaverseHydrogen>\n __weaverseThemeSettingsStore?: ThemeSettingsStore\n }\n}\n\n// Separate interface for weaverseStudio to avoid conflicts with core package\ninterface WeaverseStudio {\n init: (weaverse: WeaverseHydrogen) => void\n refreshStudio: (params: WeaverseHydrogenParams) => void\n}\n\n// Type guard to safely access weaverseStudio\nexport function hasWeaverseStudio(\n window: Window\n): window is Window & { weaverseStudio: WeaverseStudio } {\n return 'weaverseStudio' in window && typeof window.weaverseStudio === 'object'\n}\n\ndeclare module '@shopify/remix-oxygen' {\n interface AppLoadContext {\n weaverse: WeaverseClient\n }\n}\n\ndeclare module '@shopify/hydrogen' {\n interface HydrogenEnv {\n CUSTOM_COLLECTION_BANNER_METAFIELD: string\n JUDGEME_PRIVATE_API_TOKEN: string\n KLAVIYO_PRIVATE_API_TOKEN: string\n METAOBJECT_COLOR_NAME_KEY: string\n METAOBJECT_COLOR_VALUE_KEY: string\n METAOBJECT_COLORS_TYPE: string\n PUBLIC_GOOGLE_GTM_ID: string\n PUBLIC_SHOPIFY_INBOX_SHOP_ID: string\n PUBLIC_STORE_DOMAIN: string\n PUBLIC_STOREFRONT_API_TOKEN: string\n WEAVERSE_API_KEY: string\n WEAVERSE_HOST?: string\n WEAVERSE_PROJECT_ID: string\n WEAVERSE_PUBLIC_API_BASE?: string\n }\n}\n\n/**\n * Parameters for loadPage method supporting route-level project override.\n *\n * @example Basic usage (uses client-level project)\n * ```ts\n * const weaverseData = await weaverse.loadPage({\n * type: 'PRODUCT',\n * handle: params.productHandle\n * })\n * ```\n *\n * @example Route-level project override\n * ```ts\n * export async function loader({ params, context }: LoaderFunctionArgs) {\n * const { weaverse } = context\n *\n * // Use special campaign project for this route only\n * const weaverseData = await weaverse.loadPage({\n * type: 'PRODUCT',\n * handle: params.productHandle,\n * projectId: process.env.WEAVERSE_PROJECT_CAMPAIGN // Override\n * })\n *\n * return { weaverseData }\n * }\n * ```\n */\nexport type LoadPageParams = {\n /**\n * Page type to load from Weaverse CMS.\n *\n * Determines which template to use for rendering the page.\n * Falls back to 'INDEX' if not specified or if page type doesn't exist.\n *\n * @default 'INDEX'\n */\n type?: PageType\n\n /**\n * Locale for internationalization.\n *\n * Format: IETF BCP 47 language tag (e.g., 'en-US', 'fr-FR', 'de-DE')\n * Used to load locale-specific content and translations.\n */\n locale?: string\n\n /**\n * Page handle for dynamic pages.\n *\n * Identifies specific resource within page type:\n * - Product handle: 'red-sneakers'\n * - Collection handle: 'summer-sale'\n * - Page handle: 'about-us'\n * - Article handle: 'how-to-style-sneakers'\n */\n handle?: string\n\n /**\n * Cache strategy override for this specific page load.\n *\n * Overrides default cache strategy for special use cases:\n * - Fresh content for checkout pages (no cache)\n * - Long-lived cache for static pages (1 hour+)\n * - Short-lived cache for frequently updated content (5 minutes)\n */\n strategy?: CachingStrategy\n\n /**\n * Optional project override for this specific page load.\n *\n * **Precedence**: Route-level projectId takes precedence over client-level projectId.\n *\n * **Use Cases**:\n * - Campaign landing pages with custom content\n * - VIP customer experiences with dedicated projects\n * - A/B testing specific pages without changing global config\n * - Seasonal promotions with limited-time content\n *\n * **Validation**:\n * - Must be non-empty string\n * - Validated before API call\n * - Falls back to client-level projectId if undefined\n * - Does NOT support function (string only)\n *\n * **Cache Isolation**:\n * Override projectId is included in cache key, ensuring separate caches\n * for different projects even on the same route.\n *\n * @example Campaign page override\n * ```ts\n * const campaignData = await weaverse.loadPage({\n * type: 'PAGE',\n * handle: 'summer-sale',\n * projectId: process.env.WEAVERSE_PROJECT_CAMPAIGN\n * })\n * ```\n */\n projectId?: string\n}\n\n// ─── Translation sidecar types (design mode) ─────────────────────────\n\n/** A single translated field for one item */\nexport interface TranslationMapEntry {\n originalValue: string\n translatedValue: string\n}\n\n/** Per-item translation fields, keyed by field name */\nexport type TranslationItemEntry = {\n [key: string]: TranslationMapEntry\n}\n\n/**\n * Translation map sent from the builder alongside page data in design mode.\n * Keyed by item ID, each value maps field names to translation entries.\n */\nexport type TranslationMap = {\n [itemId: string]: TranslationItemEntry\n}\n\n/** A single translation entry for save payloads */\nexport interface TranslationEntry {\n deleted?: boolean\n itemId: string\n key: string\n originalValue: string\n translatedValue: string\n}\n\n/** Result of collecting translation changes for the save flow */\nexport type TranslationChanges = {\n languageId: string\n entries: TranslationEntry[]\n}\n","export interface StudioMode {\n isDesignMode?: boolean\n isPreviewMode?: boolean\n isRevisionPreview?: boolean\n weaverseHost: string\n weaverseVersion: string\n}\n\nconst DEFAULT_WEAVERSE_HOST = 'https://studio.weaverse.io'\n\n/**\n * Weaverse-controlled apex domains the Studio bridge may be served from\n * (matched on the host itself and any subdomain).\n */\nconst TRUSTED_STUDIO_DOMAINS = ['weaverse.io', 'weaverse.dev']\n\nfunction isLoopbackHostname(hostname: string): boolean {\n return (\n hostname === 'localhost' ||\n hostname === '127.0.0.1' ||\n hostname.endsWith('.localhost')\n )\n}\n\nexport interface TrustedStudioHostOptions {\n /**\n * Also trust loopback hosts (`localhost` / `127.0.0.1` / `*.localhost`) over\n * http or https.\n *\n * Only safe when the **storefront itself** is loopback (genuine local-builder\n * dev). A production https page can still load a loopback script — loopback is\n * a \"potentially trustworthy\" origin and is not blocked as mixed content — so\n * honoring a query-supplied loopback host on a public storefront would let a\n * crafted link run whatever a visitor's local service serves inside the\n * storefront origin. MUST stay off on the server, where it is an SSRF vector\n * for page/theme fetches.\n */\n allowLoopback?: boolean\n}\n\n/**\n * Whether `host` is an origin we trust to serve the Studio bridge script (or,\n * server-side, to resolve page/theme data).\n *\n * The bridge executes inside the storefront document and the host can drive\n * server-side fetches, so a host taken from an attacker-controllable source —\n * e.g. a crafted `?weaverseHost=` query — is both an XSS and an SSRF vector.\n * Callers MUST reject untrusted hosts before acting on them. Trusts\n * `weaverse.io`/`weaverse.dev` and their subdomains over https; loopback is\n * opt-in (see {@link TrustedStudioHostOptions.allowLoopback}).\n */\nexport function isTrustedStudioHost(\n host: string,\n options?: TrustedStudioHostOptions\n): boolean {\n let parsed: URL\n try {\n parsed = new URL(host)\n } catch {\n return false\n }\n let { hostname, protocol } = parsed\n // Loopback (opt-in) is the only place http is allowed — a local builder\n // serves the bridge over http and there is no cleartext-downgrade risk to a\n // private address. Every other trusted host must be https so server-side\n // page/theme fetches are never downgraded to cleartext.\n if (options?.allowLoopback && isLoopbackHostname(hostname)) {\n return protocol === 'http:' || protocol === 'https:'\n }\n if (protocol !== 'https:') {\n return false\n }\n return TRUSTED_STUDIO_DOMAINS.some(\n (domain) => hostname === domain || hostname.endsWith(`.${domain}`)\n )\n}\n\n/**\n * Build the Studio bridge script URL for the current mode, or `null` when the\n * storefront is not being previewed inside Weaverse Studio.\n *\n * This is the single gate that keeps the bridge off production storefronts:\n * a normal visitor's URL carries none of the design/preview markers, so the\n * result is `null` and no script is ever requested.\n *\n * Shared by the page-scoped `useStudio` (which also binds the page for\n * editing) and the root-level `useStudioConnect` (which only needs the script\n * to load so Studio's `checkWeaversePage()` handshake can answer on routes\n * with no Weaverse content).\n */\nexport function getStudioScriptSrc(mode: StudioMode): string | null {\n let {\n isDesignMode,\n isPreviewMode,\n isRevisionPreview,\n weaverseHost,\n weaverseVersion,\n } = mode\n let base = `${weaverseHost}/static/studio/hydrogen`\n let version = `?v=${weaverseVersion}`\n if (isRevisionPreview || isPreviewMode) {\n return `${base}/preview.js${version}`\n }\n if (isDesignMode) {\n return `${base}/index.js${version}`\n }\n return null\n}\n\n/**\n * Resolve the Studio bridge script URL from a URL query string — the markers\n * Studio attaches when it drives the preview iframe (`isDesignMode`,\n * `isPreviewMode`, `__revisionId`, `weaverseHost`, `weaverseVersion`) — or\n * `null` outside Studio.\n *\n * `storefrontHostname` is the document's own hostname: a loopback Studio host\n * is only honored when the storefront itself is loopback (genuine local-builder\n * dev), so a crafted public link can't load a script from a visitor's loopback\n * service into the storefront origin.\n *\n * The `weaverseHost` query is attacker-controllable, so a host that is not a\n * {@link isTrustedStudioHost trusted origin} resolves to `null` (no bridge) —\n * it is never silently replaced with production Studio, which would otherwise\n * inject the wrong bridge for self-hosted/staging deployments. Such deployments\n * (a non-`weaverse.io` `WEAVERSE_HOST`) therefore don't load the root bridge on\n * content-less routes; the page-scoped {@link getStudioScriptSrc} via\n * `useStudio` still uses the configured host on content routes.\n *\n * Pure (no DOM) so the root-level connect's production gate stays unit-testable\n * and needs no loader data.\n */\nexport function resolveStudioScriptSrc(\n search: string,\n storefrontHostname = ''\n): string | null {\n let params = new URLSearchParams(search)\n // Match the server's getRequestQueries(), which keeps the LAST value of a\n // duplicated key. Studio appends its own control params, so a pre-existing\n // (stale/untrusted) `weaverseHost` earlier in the URL must not win here, or\n // the root bridge would be skipped while the loader uses the later host.\n let last = (key: string) => params.getAll(key).at(-1)\n let host = last('weaverseHost')\n if (host) {\n let allowLoopback = isLoopbackHostname(storefrontHostname)\n if (!isTrustedStudioHost(host, { allowLoopback })) {\n return null\n }\n }\n return getStudioScriptSrc({\n isDesignMode: last('isDesignMode') === 'true',\n isPreviewMode: last('isPreviewMode') === 'true',\n isRevisionPreview: params.has('__revisionId'),\n weaverseHost: host || DEFAULT_WEAVERSE_HOST,\n weaverseVersion: last('weaverseVersion') || '',\n })\n}\n","import type { HydrogenEnv } from '@shopify/hydrogen'\nimport type {\n HydrogenComponent,\n HydrogenComponentSchema,\n HydrogenThemeSchema,\n WeaverseLoaderData,\n WeaverseProjectConfigs,\n WeaverseStudioQueries,\n} from '../types'\nimport { isTrustedStudioHost } from './studio-script-src'\n\n// Track warned types to avoid spam\nlet warnedTypes = new Set<string>()\n\nfunction logOnce(type: string, message: string) {\n if (!warnedTypes.has(type)) {\n console.warn(message)\n warnedTypes.add(type)\n }\n}\n\nfunction deepMergeArrays<T>(target: T[], source: T[]): T[] {\n return [...target, ...source]\n}\n\nfunction mergeInspectorSettings(\n settings: any[],\n inspector: any[],\n type: string\n): any[] {\n if (!inspector?.length) {\n return settings\n }\n if (!settings?.length) {\n return inspector\n }\n\n // Log collision notice\n console.info(\n `Schema \"${type}\": Both 'settings' and 'inspector' found. Using 'settings' with 'inspector' as fallback.`\n )\n\n return deepMergeArrays(settings, inspector)\n}\n\n/**\n * Extract and parse query parameters from a request URL.\n * Supports optional allowlist for security-sensitive applications.\n *\n * @param request - The incoming request\n * @param options - Optional configuration\n * @param options.allowedKeys - If provided, only these keys will be extracted\n * @returns Parsed query parameters with type coercion for booleans\n *\n * @example\n * ```typescript\n * // Extract all params\n * const queries = getRequestQueries(request)\n *\n * // Extract only allowed params (security-sensitive)\n * const queries = getRequestQueries(request, {\n * allowedKeys: ['weaverseProjectId', 'weaverseHost']\n * })\n * ```\n */\nexport function getRequestQueries<T = Record<string, string | boolean>>(\n request: Request,\n options?: { allowedKeys?: string[] }\n): T {\n let url = new URL(request.url)\n let queries: Record<string, unknown> = {}\n\n for (let [key, value] of url.searchParams.entries()) {\n // If allowlist provided, skip non-allowed keys\n if (options?.allowedKeys && !options.allowedKeys.includes(key)) {\n continue\n }\n\n // Type-safe conversion for known boolean patterns\n if (value === 'true') {\n queries[key] = true\n } else if (value === 'false') {\n queries[key] = false\n } else {\n queries[key] = value\n }\n }\n\n return queries as T\n}\n\nexport function getWeaverseConfigs(\n request: Request,\n env: HydrogenEnv\n): WeaverseProjectConfigs {\n let queries = getRequestQueries<WeaverseStudioQueries>(request)\n let {\n WEAVERSE_PROJECT_ID,\n WEAVERSE_API_KEY,\n WEAVERSE_HOST,\n WEAVERSE_PUBLIC_API_BASE,\n PUBLIC_STORE_DOMAIN,\n PUBLIC_STOREFRONT_API_TOKEN,\n } = env || {}\n let envFromProcess = (typeof process !== 'undefined' && process.env) || {}\n let {\n weaverseProjectId,\n weaverseHost,\n isDesignMode,\n isPreviewMode,\n sectionType,\n weaverseVersion,\n weaverseApiKey,\n } = queries\n\n let url = new URL(request.url)\n let isRevisionPreview = url.searchParams.has('__revisionId')\n let configuredWeaverseHost = WEAVERSE_HOST || envFromProcess.WEAVERSE_HOST\n // `weaverseHost` arrives from the request URL (Studio drives the preview\n // iframe with it), so it is attacker-controllable; only honor it when it is a\n // trusted Weaverse origin, otherwise fall back to the env/default host. This\n // stops a crafted `?weaverseHost=` from pointing Studio scripts or data reads\n // at an arbitrary origin.\n let trustedUrlHost =\n typeof weaverseHost === 'string' && isTrustedStudioHost(weaverseHost)\n ? weaverseHost\n : ''\n let resolvedWeaverseHost =\n trustedUrlHost || configuredWeaverseHost || 'https://studio.weaverse.io'\n // Public data reads default to the edge proxy, but an explicit custom\n // WEAVERSE_HOST (staging/self-hosted Weaverse) must stay the API base so\n // those deployments don't fetch page/config data from the production proxy.\n let resolvedWeaverseApiBase = trustedUrlHost\n ? trustedUrlHost\n : WEAVERSE_PUBLIC_API_BASE ||\n envFromProcess.WEAVERSE_PUBLIC_API_BASE ||\n (configuredWeaverseHost &&\n configuredWeaverseHost !== 'https://studio.weaverse.io'\n ? configuredWeaverseHost\n : 'https://api.weaverse.io')\n\n return {\n projectId:\n weaverseProjectId ||\n WEAVERSE_PROJECT_ID ||\n envFromProcess.WEAVERSE_PROJECT_ID ||\n '',\n weaverseHost: resolvedWeaverseHost,\n weaverseApiBase: resolvedWeaverseApiBase,\n weaversePublicApiBase: resolvedWeaverseApiBase,\n weaverseApiKey:\n weaverseApiKey ||\n WEAVERSE_API_KEY ||\n envFromProcess.WEAVERSE_API_KEY ||\n '',\n weaverseVersion: weaverseVersion || '',\n isDesignMode,\n isPreviewMode,\n isRevisionPreview,\n sectionType: sectionType || '',\n publicEnv: {\n PUBLIC_STORE_DOMAIN: PUBLIC_STORE_DOMAIN || '',\n PUBLIC_STOREFRONT_API_TOKEN: PUBLIC_STOREFRONT_API_TOKEN || '',\n },\n }\n}\n\n/**\n * Cache for generateDataFromSchema results using WeakMap.\n * WeakMap allows garbage collection when schema objects are no longer referenced.\n */\nconst schemaDefaultsCache = new WeakMap<\n HydrogenComponentSchema | HydrogenThemeSchema,\n Record<string, any>\n>()\n\n/**\n * Generate default data from component or theme schema.\n * Results are memoized using WeakMap for performance.\n *\n * @param schema - Component or theme schema\n * @returns Default data object extracted from schema inputs\n */\nexport function generateDataFromSchema(\n schema: HydrogenComponentSchema | HydrogenThemeSchema\n) {\n // Check cache first for performance\n const cached = schemaDefaultsCache.get(schema)\n if (cached) {\n return cached\n }\n\n let data: Record<string, any> = {}\n\n // Handle migration from inspector to settings\n let inspectorGroups: any[] = []\n\n // Type guard to check if it's a component schema\n const isComponentSchema = (\n s: HydrogenComponentSchema | HydrogenThemeSchema\n ): s is HydrogenComponentSchema => 'type' in s && typeof s.type === 'string'\n\n if (isComponentSchema(schema)) {\n // Handle HydrogenComponentSchema\n if (schema.settings) {\n inspectorGroups = schema.settings\n }\n\n if (schema.inspector) {\n if (schema.settings?.length) {\n // Both exist - merge with settings taking priority\n inspectorGroups = mergeInspectorSettings(\n schema.settings,\n schema.inspector,\n schema.type || 'unknown'\n )\n } else {\n // Only inspector exists - use it but warn about deprecation\n inspectorGroups = schema.inspector\n if (schema.type) {\n logOnce(\n schema.type,\n `⚠️ Schema \"${schema.type}\": The 'inspector' property is deprecated. Please use 'settings' instead.`\n )\n }\n }\n }\n } else {\n // Handle HydrogenThemeSchema\n if (schema.settings) {\n inspectorGroups = schema.settings\n }\n\n if (schema.inspector) {\n if (schema.settings?.length) {\n // Both exist - merge with settings taking priority\n inspectorGroups = mergeInspectorSettings(\n schema.settings,\n schema.inspector,\n 'Theme Schema'\n )\n } else {\n // Only inspector exists - use it but warn about deprecation\n inspectorGroups = schema.inspector\n logOnce(\n 'ThemeSchema',\n `⚠️ Theme Schema: The 'inspector' property is deprecated. Please use 'settings' instead.`\n )\n }\n }\n }\n\n if (inspectorGroups?.length) {\n for (let group of inspectorGroups) {\n for (let input of group.inputs) {\n let { name, defaultValue } = input\n if (name && defaultValue !== null && defaultValue !== undefined) {\n data[name] = defaultValue\n }\n }\n }\n }\n\n // Cache the result before returning\n schemaDefaultsCache.set(schema, data)\n\n return data\n}\n\nfunction recursivelyAddDataItem(\n type: string,\n components: HydrogenComponent<any>[],\n items: any[],\n initData?: object\n) {\n let component = components.find((c) => c.schema.type === type)\n if (!component) {\n return\n }\n let childIds = []\n let id = crypto.randomUUID()\n let { children, ...data } = component.schema?.presets || {}\n if (children) {\n for (let c of children) {\n let { type, children, ...data } = c\n let childId = recursivelyAddDataItem(type, components, items, data)\n childIds.push({ id: childId } as never)\n }\n }\n items.push({\n data: { ...data, ...initData },\n id,\n type,\n children: childIds,\n })\n return id\n}\n\nexport function getPreviewData(\n type: string,\n components: HydrogenComponent[],\n weaverseHost: string\n) {\n let items = []\n return {\n project: { id: 'x', weaverseShopId: 'shop-id', name: 'Section Preview' },\n configs: {\n projectId: 'x',\n weaverseHost,\n isDesignMode: false,\n isPreviewMode: true,\n requestInfo: {\n i18n: {\n label: 'United States (USD $)',\n language: 'EN',\n country: 'US',\n currency: 'USD',\n pathPrefix: '',\n },\n queries: {},\n pathname: '/',\n search: '',\n },\n },\n page: {\n id: 'weaverse-preview-page',\n name: 'Preview section',\n rootId: '1',\n items: [\n {\n data: {},\n id: '1',\n type: 'main',\n children: [{ id: recursivelyAddDataItem(type, components, items) }],\n },\n ...items,\n ],\n },\n } as unknown as WeaverseLoaderData\n}\n","/**\n * Minimal mutable store for design-mode static text overrides.\n *\n * useSyncExternalStore-compatible. Passed into TranslationProvider which\n * subscribes internally and merges overrides into merchantOverrides.\n * The studio bridge calls updateOverrides() via weaverse.internal.translationStore\n * (also exposed as the deprecated weaverse.internal.themeTextStore alias).\n *\n * Shape: flat Record<string, string> — dot-notation keys map to values\n * (e.g. \"cart.title\" → \"Shopping Cart\").\n */\nexport class TranslationStore {\n overrides: Record<string, string> = {}\n private listeners: Set<() => void> = new Set()\n\n setOverrides = (overrides: Record<string, string>) => {\n this.overrides = { ...overrides }\n this.emit()\n }\n\n updateOverrides = (newOverrides: Record<string, string>) => {\n this.overrides = { ...this.overrides, ...newOverrides }\n this.emit()\n }\n\n getSnapshot = () => this.overrides\n\n getServerSnapshot = () => this.overrides\n\n subscribe = (callback: () => void) => {\n this.listeners.add(callback)\n return () => {\n this.listeners.delete(callback)\n }\n }\n\n private emit = () => {\n for (const listener of Array.from(this.listeners)) {\n try {\n listener()\n } catch (error) {\n console.error('TranslationStore: Listener error', error)\n }\n }\n }\n}\n\n/**\n * @deprecated Use {@link TranslationStore} instead. Kept as a backward-compatible\n * alias and will remain exported for existing integrations.\n */\nexport const ThemeTextStore = TranslationStore\n/**\n * @deprecated Use {@link TranslationStore} instead. Kept as a backward-compatible\n * alias and will remain exported for existing integrations.\n */\nexport type ThemeTextStore = TranslationStore\n","import type { UIMatch } from 'react-router'\nimport type { WeaverseLoaderData } from '../types'\n\nexport type WeaverseDataValue =\n | WeaverseLoaderData\n | Promise<WeaverseLoaderData>\n | null\n\n/**\n * Resolve the `weaverseData` payload for a `<WeaverseHydrogenRoot>` instance.\n *\n * Resolution order (first match wins):\n *\n * 1. **Explicit prop** — the caller passed `data` directly. Used as-is,\n * including when it is a `Promise` (handled upstream via `<Await>`) or\n * an explicit `null` (suppresses rendering).\n * 2. **Own route's loader data** — the loader data for the route that\n * rendered this component, obtained via `useLoaderData()`. This is\n * React Router's route-scoped primitive and is what makes nested\n * layout + child Weaverse pages work: each `<WeaverseContent />`\n * resolves to *its own* route's `weaverseData` regardless of siblings.\n * 3. **Ancestor match fallback** — walk `useMatches()` from leaf to root\n * and return the first ancestor whose `loaderData` exposes a\n * `weaverseData` key. This preserves the long-standing behaviour where\n * a child route with no loader (e.g. an `index.tsx` that omits\n * `weaverseData`) still renders its layout's Weaverse page.\n *\n * The helper is intentionally pure (no hook calls) so it can be unit-tested\n * without a React Router context. Hook calls happen in the component.\n *\n * ## Back-compat contract\n *\n * Themes that pre-date the `data` prop addition pass `dataProp === undefined`,\n * so resolution starts at Tier 2. For the canonical single-instance pattern\n * (one `<WeaverseContent />` inside a route whose loader returns\n * `{ weaverseData }`), Tier 2 returns the same value the old `useMatches()`\n * walk did. For the index-without-loader pattern (leaf route exposes no\n * `weaverseData`, layout does), Tier 3's leaf→root walk produces an\n * identical result to the pre-fix code. The only intentional behaviour\n * change is the issue #451 case: two `<WeaverseContent />` instances on the\n * same URL (layout + child, both with their own `weaverseData`) now each\n * render their own page instead of both rendering the deepest one.\n */\nexport function pickWeaverseData(\n dataProp: WeaverseDataValue | undefined,\n ownLoaderData: unknown,\n matches: ReadonlyArray<Pick<UIMatch, 'loaderData'>>\n): WeaverseDataValue {\n // Tier 1: explicit prop wins (including explicit `null`).\n if (dataProp !== undefined) {\n return dataProp\n }\n\n // Tier 2: own route's loader data — the route-scoped primitive.\n if (hasWeaverseData(ownLoaderData)) {\n return ownLoaderData.weaverseData as WeaverseDataValue\n }\n\n // Tier 3: ancestor walk (leaf → root) for legacy / index-without-loader cases.\n for (let i = matches.length - 1; i >= 0; i--) {\n const loaderData = matches[i].loaderData\n if (hasWeaverseData(loaderData)) {\n return loaderData.weaverseData as WeaverseDataValue\n }\n }\n\n return null\n}\n\nfunction hasWeaverseData(\n value: unknown\n): value is Record<string, unknown> & { weaverseData: unknown } {\n // The `in` check alone returns true for `{ weaverseData: undefined }`,\n // which would let Tier 2 short-circuit and return `undefined` — bypassing\n // the Tier 3 ancestor walk that would otherwise resolve the missing data.\n // Require the value to be present (not `undefined`).\n if (\n typeof value !== 'object' ||\n value === null ||\n !('weaverseData' in (value as Record<string, unknown>))\n ) {\n return false\n }\n return (value as Record<string, unknown>).weaverseData !== undefined\n}\n","import type { WeaverseHydrogenParams } from '../types'\n\ninterface BrowserLocationLike {\n pathname: string\n search: string\n}\n\nfunction getBrowserLocation(): BrowserLocationLike | undefined {\n if (typeof window === 'undefined') {\n return\n }\n return window.location\n}\n\nfunction getQueriesFromSearch(\n search: string\n): Record<string, string | boolean> {\n let queries: Record<string, string | boolean> = {}\n let params = new URLSearchParams(search)\n for (let [key, value] of params.entries()) {\n if (value === 'true') {\n queries[key] = true\n } else if (value === 'false') {\n queries[key] = false\n } else {\n queries[key] = value\n }\n }\n return queries\n}\n\n/**\n * React Router v7 single-fetch revalidation can render client data returned\n * from a `*.data` request while the browser is still on the canonical URL.\n * Instance identity must follow the browser URL, not the transient data\n * endpoint, otherwise the SDK creates a fresh Weaverse instance mid-session:\n * in design mode that drops the existing Studio bridge/interactions, and in\n * the live theme it resets every section's runtime state after any\n * revalidation (cart mutations, locale switches, `revalidate()`). See #451.\n */\nexport function normalizeRequestInfo(\n params: WeaverseHydrogenParams,\n browserLocation: BrowserLocationLike | undefined = getBrowserLocation()\n): WeaverseHydrogenParams {\n if (!browserLocation) {\n return params\n }\n\n let { pathname, search } = browserLocation\n if (\n params.requestInfo.pathname === pathname &&\n params.requestInfo.search === search\n ) {\n return params\n }\n\n return {\n ...params,\n requestInfo: {\n ...params.requestInfo,\n pathname,\n queries: getQueriesFromSearch(search),\n search,\n },\n }\n}\n","import type { WeaverseHydrogenParams } from '../types'\nimport type { WeaverseHydrogen } from '../WeaverseHydrogenRoot'\n\n/**\n * Apply a fresh loader payload to a reused Weaverse instance.\n *\n * With requestInfo normalized to the browser URL, same-URL revalidations\n * (cart mutations, `useRevalidator()`, locale-neutral re-fetches) reuse the\n * cached `window.__weaverses[pageId]` instance instead of constructing a new\n * one — which preserves section state, but would silently drop the fresh\n * `data`/`dataContext` the loaders just returned. Sync them here.\n *\n * Design mode is excluded by the caller: Studio owns the instance data there\n * (unsaved drafts must not be clobbered) and applies updates via\n * `refreshStudio` instead.\n *\n * Change detection uses JSON comparison — loader payloads are\n * wire-serialized, so key order is stable between runs; a false mismatch\n * only costs one extra re-render.\n */\nexport function syncReusedInstance(\n weaverse: WeaverseHydrogen,\n params: WeaverseHydrogenParams\n) {\n weaverse.requestInfo = params.requestInfo\n weaverse.internal = params.internal\n\n let dataChanged =\n JSON.stringify(weaverse.data) !== JSON.stringify(params.data)\n let contextChanged =\n JSON.stringify(weaverse.dataContext ?? null) !==\n JSON.stringify(params.dataContext ?? null)\n\n if (contextChanged) {\n // Assign before notifying any item store: components resolve data\n // connectors against `weaverse.dataContext` at render time, so the\n // fresh context must be in place when re-renders flush.\n weaverse.dataContext = params.dataContext ?? null\n }\n if (dataChanged) {\n // State-preserving: existing item stores receive `setData` (and emit),\n // missing ones are created — no full instance teardown.\n weaverse.setProjectData(params.data)\n } else if (contextChanged) {\n // Context-only change: memoized item components subscribe to their item\n // store snapshot, and snapshot identity follows the `_store` reference —\n // a bare `triggerUpdate()` would notify with an identical snapshot and\n // `useSyncExternalStore` would skip the re-render. `setData({})` swaps\n // the store reference so connectors re-resolve against the new context.\n for (const { id } of params.data?.items || []) {\n weaverse.itemInstances.get(id)?.setData({})\n }\n }\n if (dataChanged || contextChanged) {\n weaverse.triggerUpdate()\n }\n}\n","// One pixel per page per navigation. A few facts shape the dedup:\n//\n// 1. Co-located instances: nested compositions mount multiple Weaverse\n// instances on one URL; each page is counted at most once.\n// 2. The pixel FIRE effect runs once per instance mount (see `usePixel`), so\n// an instance never re-fires on its own — a navigation is a fresh mount.\n// 3. `location.key` is stable per history entry. A back/forward POP restores\n// the entry's ORIGINAL key, and an in-place remount on the same entry\n// (e.g. the `data={null}` suppress/restore path in WeaverseHydrogenRoot)\n// keeps that same key. A REAL navigation is therefore a key CHANGE.\n//\n// `firedPageIds` is the set of pages already counted for the current\n// navigation. It is forgotten in two ways:\n// - On a key TRANSITION reported by ANY mounted instance via\n// `observeNavigation` (driven by a per-navigation effect). A persistent\n// layout-level instance keeps observing across a detour through a\n// non-Weaverse route (cart, search, account), so a Back to the original\n// entry is recognised as a new navigation and the page re-counts — while\n// an in-place suppress/restore (no key change) does NOT re-count.\n// - When the LAST instance unmounts (`registerPixelInstance`), covering the\n// detour case where no instance survives to observe the key round-trip\n// (a page with no persistent layout going to /cart and back).\n//\n// Known tradeoff: React StrictMode's dev-only mount→cleanup→mount cycle\n// resets state and double-fires in development — parity with the pre-dedupe\n// behavior; production semantics are unaffected.\nlet currentNavigationKey: string | null = null\nlet firedPageIds = new Set<string>()\nlet mountedInstances = 0\n\n/**\n * Record the navigation key seen by a mounted instance. A change of key is a\n * real navigation and forgets the previous navigation's fired pages; an\n * unchanged key (an in-place remount / suppress-restore on the same history\n * entry) leaves them intact, so the page is not double-counted.\n */\nexport function observeNavigation(navigationKey: string): void {\n if (navigationKey !== currentNavigationKey) {\n currentNavigationKey = navigationKey\n firedPageIds.clear()\n }\n}\n\nexport function shouldFirePixel(\n navigationKey: string,\n pageId: string\n): boolean {\n observeNavigation(navigationKey)\n if (firedPageIds.has(pageId)) {\n return false\n }\n firedPageIds.add(pageId)\n return true\n}\n\n/**\n * Track a mounted Weaverse instance; returns the unmount cleanup. When the\n * last instance unmounts, the navigation state is forgotten so a Back that\n * restores the same history entry counts again even if no instance survived\n * to observe the detour.\n */\nexport function registerPixelInstance(): () => void {\n mountedInstances += 1\n return () => {\n mountedInstances -= 1\n if (mountedInstances === 0) {\n currentNavigationKey = null\n firedPageIds.clear()\n }\n }\n}\n","import { isBrowser } from '@weaverse/react'\nimport { createContext, useContext, useEffect, useRef } from 'react'\nimport { useRouteLoaderData } from 'react-router'\nimport type {\n HydrogenThemeSchema,\n HydrogenThemeSettings,\n PublicEnv,\n} from '~/types'\n\ntype WeaverseThemeData = {\n theme: HydrogenThemeSettings\n schema?: HydrogenThemeSchema\n publicEnv?: PublicEnv\n}\n\nexport class ThemeSettingsStore {\n settings: HydrogenThemeSettings = {}\n schema?: HydrogenThemeSchema\n publicEnv?: PublicEnv\n private listeners: Set<() => void> = new Set()\n private hasWarnedListenerCount = false\n private isDestroyed = false\n\n constructor(data: WeaverseThemeData) {\n const { theme, schema, publicEnv } = data || {}\n this.settings = { ...theme }\n this.schema = schema\n this.publicEnv = publicEnv\n if (isBrowser) {\n window.__weaverseThemeSettingsStore = this\n }\n }\n\n updateThemeSettings = (newSettings: HydrogenThemeSettings) => {\n if (this.isDestroyed) {\n console.warn('ThemeSettingsStore: Cannot update destroyed store')\n return\n }\n\n this.settings = {\n ...this.settings,\n ...newSettings,\n }\n this.emit()\n }\n\n getSnapshot = () => this.settings\n\n getServerSnapshot = () => this.settings\n\n subscribe = (callback: () => void) => {\n if (this.isDestroyed) {\n console.warn('ThemeSettingsStore: Cannot subscribe to destroyed store')\n return () => {}\n }\n\n this.listeners.add(callback)\n\n if (!this.hasWarnedListenerCount && this.listeners.size > 500) {\n this.hasWarnedListenerCount = true\n console.warn(\n `ThemeSettingsStore: ${this.listeners.size} listeners detected. ` +\n 'This may indicate a performance issue. Consider using fewer useThemeSettings() calls.'\n )\n }\n\n return () => {\n this.listeners.delete(callback)\n }\n }\n\n private emit = () => {\n if (this.isDestroyed) {\n return\n }\n\n const currentListeners = Array.from(this.listeners)\n\n for (const listener of currentListeners) {\n try {\n listener()\n } catch (error) {\n console.error('ThemeSettingsStore: Listener error', error)\n }\n }\n }\n\n destroy = () => {\n if (this.isDestroyed) {\n return\n }\n\n this.listeners.clear()\n this.isDestroyed = true\n\n if (isBrowser && window.__weaverseThemeSettingsStore === this) {\n window.__weaverseThemeSettingsStore = undefined\n }\n }\n}\n\nexport const ThemeSettingsStoreContext =\n createContext<ThemeSettingsStore | null>(null)\nThemeSettingsStoreContext.displayName = 'ThemeSettingsStoreContext'\n\nexport function useCreateThemeSettingsStore(): ThemeSettingsStore {\n const data = useRouteLoaderData('root') as {\n weaverseTheme: WeaverseThemeData\n }\n const storeRef = useRef<ThemeSettingsStore | null>(null)\n\n if (!storeRef.current) {\n storeRef.current = new ThemeSettingsStore(data?.weaverseTheme)\n }\n\n const theme = data?.weaverseTheme?.theme\n useEffect(() => {\n if (storeRef.current && theme) {\n storeRef.current.updateThemeSettings(theme)\n }\n }, [theme])\n\n return storeRef.current\n}\n\nexport function useThemeSettingsStore(): ThemeSettingsStore {\n const fromContext = useContext(ThemeSettingsStoreContext)\n const data = useRouteLoaderData('root') as {\n weaverseTheme: WeaverseThemeData\n }\n const fallbackRef = useRef<ThemeSettingsStore | null>(null)\n\n if (!(fallbackRef.current || fromContext)) {\n fallbackRef.current = new ThemeSettingsStore(data?.weaverseTheme)\n }\n\n const store = fromContext ?? fallbackRef.current!\n const theme = data?.weaverseTheme?.theme\n useEffect(() => {\n if (!fromContext && theme) {\n store.updateThemeSettings(theme)\n }\n }, [fromContext, store, theme])\n\n return store\n}\n","import { loadScript } from '@weaverse/react'\nimport { useEffect } from 'react'\nimport {\n useLocation,\n useNavigate,\n useNavigation,\n useRevalidator,\n} from 'react-router'\nimport type { WeaverseHydrogen } from '~/index'\nimport { hasWeaverseStudio } from '~/types'\nimport { useTranslation } from '../hooks/translation-context'\nimport {\n observeNavigation,\n registerPixelInstance,\n shouldFirePixel,\n} from './pixel'\nimport { getStudioScriptSrc, resolveStudioScriptSrc } from './studio-script-src'\nimport { useThemeSettingsStore } from './use-theme-settings-store'\n\nconst STUDIO_READY_POLL_MS = 50\nconst STUDIO_READY_TIMEOUT_MS = 5000\n\n/**\n * Resolve once `window.weaverseStudio` is available, or `null` on timeout.\n * The studio script sets the global when it *executes*; `loadScript` can\n * resolve earlier for tags it did not create (e.g. SSR-injected markup),\n * so never assume readiness right after the script promise settles.\n */\nfunction waitForStudio(): Promise<Window['weaverseStudio'] | null> {\n return new Promise((resolve) => {\n let startedAt = Date.now()\n function check() {\n if (hasWeaverseStudio(window)) {\n return resolve(window.weaverseStudio)\n }\n if (Date.now() - startedAt >= STUDIO_READY_TIMEOUT_MS) {\n console.warn('[Weaverse] Studio script did not initialize in time')\n return resolve(null)\n }\n setTimeout(check, STUDIO_READY_POLL_MS)\n }\n check()\n })\n}\n\n/**\n * Load the Studio bridge script on every design/preview render so Studio's\n * `checkWeaversePage()` handshake is answered instead of timing out — crucially\n * on routes where the page-scoped {@link useStudio} never mounts: 404s, error\n * boundaries, and non-Weaverse routes. The bridge registers its RPC endpoint\n * and `window.weaverseStudio` the moment the script executes, independent of any\n * page binding. Without this, a content-less route never loads the script and\n * Studio reports a false \"Connection lost\" instead of \"this page has no Weaverse\n * content set up\".\n *\n * `loadScript` is idempotent, so on content routes this coexists with the\n * page-scoped {@link useStudio} (same src) — that hook still binds the page via\n * `init`. Gating this on whether a route \"has Weaverse data\" is deliberately\n * avoided: route matches can't tell whether the page-scoped bridge actually\n * mounts (an `ErrorBoundary` replacing a data route, or data passed via the\n * `data` prop), and suppressing the script there would reintroduce the timeout\n * this fixes. Loading the script is harmless; it only registers the responder.\n *\n * Known limitation: on a route whose `weaverseData` is a deferred Promise, the\n * script can load before the page streams in, so `checkWeaversePage()` may\n * briefly observe `NOT_WEAVERSE_PAGE`. The complete fix is a \"loading\" state in\n * `checkWeaversePage` so the handshake retries rather than latching — that lives\n * in the Studio script, not here. Tracked in Weaverse/builder#2515.\n *\n * Mounted via {@link withWeaverse}, which must be the root route's `Layout`\n * export so the bridge renders even when a route's `ErrorBoundary` replaces the\n * page. Outside Studio (no design/preview params) it is a no-op.\n */\nexport function useStudioConnect() {\n let { search } = useLocation()\n useEffect(() => {\n // Loopback Studio hosts are only honored when the storefront itself is\n // loopback (see resolveStudioScriptSrc), so pass the document's hostname.\n let hostname = typeof window === 'undefined' ? '' : window.location.hostname\n let src = resolveStudioScriptSrc(search, hostname)\n if (src) {\n loadScript(src).catch(console.error)\n }\n }, [search])\n}\n\nexport function useStudio(weaverse: WeaverseHydrogen) {\n let { revalidate } = useRevalidator()\n let navigation = useNavigation()\n let { pathname, search } = useLocation()\n let navigate = useNavigate()\n let themeSettingsStore = useThemeSettingsStore()\n let { translationStore, themeTextStore, merchantOverrides } = useTranslation()\n let {\n isDesignMode,\n weaverseHost,\n weaverseVersion,\n isPreviewMode,\n isRevisionPreview,\n } = weaverse\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: only revalidate on pathname/search changes\n useEffect(() => {\n if (navigation.state !== 'idle') {\n return\n }\n let src = getStudioScriptSrc({\n isDesignMode,\n isPreviewMode,\n isRevisionPreview,\n weaverseHost,\n weaverseVersion,\n })\n if (!src) {\n return\n }\n if (isRevisionPreview || isPreviewMode) {\n loadScript(src).catch(console.error)\n } else {\n weaverse.internal = {\n ...weaverse.internal,\n navigate,\n revalidate,\n merchantOverrides,\n themeSettingsStore,\n translationStore,\n // Deprecated alias for existing Studio bridge integrations.\n themeTextStore,\n }\n loadScript(src)\n .then(waitForStudio)\n .then((studio) => studio?.init(weaverse))\n .catch(console.error)\n }\n }, [pathname, search, navigation.state])\n usePixel(weaverse)\n}\n\nexport function usePixel(context: WeaverseHydrogen) {\n let { projectId, pageId, isDesignMode, weaverseHost } = context\n let { key: navigationKey } = useLocation()\n // Observe every navigation so a persistent layout-level instance forgets\n // the previous navigation's fired pages on a real key change — but NOT on\n // an in-place remount that keeps the same history entry (e.g. the\n // `data={null}` suppress/restore path), which must not double-count.\n useEffect(() => {\n if (!(projectId && pageId) || isDesignMode) {\n return\n }\n observeNavigation(navigationKey)\n }, [navigationKey, projectId, pageId, isDesignMode])\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: fire once on mount\n useEffect(() => {\n if (!(projectId && pageId) || isDesignMode) {\n return\n }\n // Register BEFORE deciding to fire: the navigation state must live at\n // least as long as some Weaverse instance is mounted (see pixel.ts).\n let unregister = registerPixelInstance()\n if (shouldFirePixel(navigationKey, pageId)) {\n let img = new Image()\n img.onload = () => img.remove()\n img.src = `${weaverseHost}/api/public/px?projectId=${projectId}&pageId=${pageId}`\n }\n return unregister\n }, [])\n}\n","import type { ElementData } from '@weaverse/react'\nimport {\n isBrowser,\n useSafeExternalStore,\n Weaverse,\n WeaverseItemStore,\n WeaverseRoot,\n} from '@weaverse/react'\nimport {\n type ComponentType,\n type JSX,\n memo,\n Suspense,\n useMemo,\n useRef,\n} from 'react'\nimport { ErrorBoundary } from 'react-error-boundary'\nimport {\n Await,\n useLoaderData,\n useMatches,\n useRouteLoaderData,\n} from 'react-router'\nimport { defaultComponents } from '~/components'\nimport {\n type TranslateFunction,\n TranslationProvider,\n} from './hooks/translation-context'\nimport { createWeaverseDataContext } from './hooks/use-weaverse-data-context'\nimport type {\n HydrogenComponentData,\n HydrogenElement,\n HydrogenPageData,\n HydrogenThemeSettings,\n TranslationChanges,\n TranslationEntry,\n TranslationItemEntry,\n TranslationMap,\n WeaverseInternal,\n WeaverseLoaderRequestInfo,\n} from './index'\nimport type {\n HydrogenComponent,\n WeaverseHydrogenParams,\n WeaverseLoaderData,\n} from './types'\nimport { hasWeaverseStudio } from './types'\nimport { generateDataFromSchema } from './utils'\nimport {\n pickWeaverseData,\n type WeaverseDataValue,\n} from './utils/pick-weaverse-data'\nimport { normalizeRequestInfo } from './utils/studio-request-info'\nimport { syncReusedInstance } from './utils/sync-reused-instance'\nimport { TranslationStore } from './utils/translation-store'\nimport { useStudio, useStudioConnect } from './utils/use-studio'\nimport {\n ThemeSettingsStoreContext,\n useCreateThemeSettingsStore,\n useThemeSettingsStore,\n} from './utils/use-theme-settings-store'\n\n/*\n=== IMPORTANT DESIGN PRINCIPLE ===\nCONSTRUCTOR TIMING AND DEFERRED PROCESSING\n\nWhen working with React component systems and registries:\n- Keep constructors SIMPLE - don't do heavy work in them\n- Defer processing until RENDER TIME, not initialization\n- Avoid registry lookups during object construction (components may not be registered yet)\n- Simple code is more reliable than complex upfront optimization\n- Respect the initialization sequence: registration → instance creation → rendering\n\nHistory: Attempting to do schema processing in the constructor (commit 495e1220) broke\nthe pilot template because it tried to access the component registry before components were registered.\nThe fix was to defer that work until the component is actually rendered.\n====================================\n*/\n\nexport class WeaverseHydrogenItem extends WeaverseItemStore {\n declare weaverse: WeaverseHydrogen\n\n /**\n * Cached merged snapshot (base + translations).\n * Reset to `null` whenever `_store` or the item's translation entry changes.\n */\n private _cachedSnapshot: ElementData | null = null\n private _snapshotStoreRef: ElementData | null = null\n private _snapshotTranslationRef: TranslationItemEntry | null = null\n\n constructor(initialData: HydrogenComponentData, weaverse: WeaverseHydrogen) {\n super(initialData, weaverse)\n const { data, ...rest } = initialData\n if (!this.Element?.schema) {\n console.error('Element is missing schema or not found!')\n return\n }\n const schemaData = generateDataFromSchema(this.Element.schema)\n Object.assign(this._store, schemaData, data, rest)\n }\n\n get Element(): HydrogenElement {\n return super.Element\n }\n\n /**\n * Override getSnapShot to merge translation data when in translation mode.\n * Memoizes the result: returns the same object reference as long as\n * both `_store` and the translation entry haven't changed.\n * This is critical for `useSyncExternalStore` stability.\n */\n getSnapShot = (): ElementData => {\n const base = this._store\n const translations = this.weaverse.translationMap?.[this._id]\n\n // No translations → return base directly (fast path)\n if (!translations) {\n return base\n }\n\n // Check if cache is still valid (same _store ref + same translation entry ref)\n if (\n this._cachedSnapshot &&\n this._snapshotStoreRef === base &&\n this._snapshotTranslationRef === translations\n ) {\n return this._cachedSnapshot\n }\n\n // Build merged snapshot\n const merged = { ...base }\n for (const [key, entry] of Object.entries(translations)) {\n if (entry.translatedValue !== undefined) {\n merged[key] = entry.translatedValue\n }\n }\n\n this._cachedSnapshot = merged\n this._snapshotStoreRef = base\n this._snapshotTranslationRef = translations\n return merged\n }\n}\n\nWeaverse.ItemConstructor = WeaverseHydrogenItem\n\nexport class WeaverseHydrogen extends Weaverse {\n pageId: string\n internal: Partial<WeaverseInternal>\n requestInfo: WeaverseLoaderRequestInfo\n projectId: string\n weaverseHost: string\n weaverseApiBase: string\n weaverseApiKey: string\n weaverseVersion: string\n isDesignMode: boolean\n isPreviewMode: boolean\n isRevisionPreview: boolean\n sectionType: string\n declare ItemConstructor: typeof WeaverseHydrogenItem\n declare data: HydrogenPageData\n declare static itemInstances: Map<string, WeaverseHydrogenItem>\n declare static elementRegistry: Map<string, HydrogenElement>\n\n // ─── Translation sidecar (design mode only) ────────────────────────\n /**\n * Translation map received from the builder in design mode.\n * Keyed by item ID, each entry maps field names to translated values.\n * `WeaverseHydrogenItem.getSnapShot()` merges these into the data\n * returned to components, so translations render without monkey-patching.\n */\n translationMap: TranslationMap = {}\n translationLocale = ''\n translationLanguageId = ''\n\n constructor(params: WeaverseHydrogenParams) {\n const { internal, pageId, requestInfo, ...coreParams } = params\n super({ ...coreParams })\n this.internal = internal\n this.pageId = pageId\n this.requestInfo = requestInfo\n // Assign configuration properties\n this.projectId = params.projectId\n this.weaverseHost = params.weaverseHost\n this.weaverseApiBase = params.weaverseApiBase\n this.weaverseApiKey = params.weaverseApiKey\n this.weaverseVersion = params.weaverseVersion || ''\n this.isDesignMode = params.isDesignMode ?? false\n this.isPreviewMode = params.isPreviewMode ?? false\n this.isRevisionPreview = params.isRevisionPreview ?? false\n this.sectionType = params.sectionType || ''\n\n // Extract translation sidecar from page data if present (design mode)\n this.extractTranslationSidecar()\n }\n\n /**\n * Extract translation sidecar data from `this.data` (the page data).\n * The builder attaches `translationMap`, `translationLocale`, and\n * `translationLanguageId` to the page data in design mode.\n */\n extractTranslationSidecar = () => {\n const pageData = this.data as Record<string, any>\n if (pageData?.translationMap) {\n this.translationMap = pageData.translationMap\n this.translationLocale = pageData.translationLocale || ''\n this.translationLanguageId = pageData.translationLanguageId || ''\n }\n }\n\n /**\n * Set the translation sidecar data.\n * Called by the studio bridge when translation data arrives or changes.\n * Triggers a re-render of all items so translated snapshots are recalculated.\n */\n setTranslationSidecar = (\n translationMap: TranslationMap,\n locale: string,\n languageId: string\n ) => {\n this.translationMap = translationMap\n this.translationLocale = locale\n this.translationLanguageId = languageId\n // Invalidate all item snapshot caches and trigger re-render\n this.refreshAllItems()\n }\n\n /**\n * Update a single translation entry for a specific item field.\n * Used by the studio bridge when the user edits a translatable field.\n */\n updateTranslation = (\n itemId: string,\n key: string,\n originalValue: string,\n translatedValue: string\n ) => {\n if (!this.translationMap[itemId]) {\n this.translationMap[itemId] = {}\n }\n // Create a new entry reference so getSnapShot detects the change\n this.translationMap[itemId] = {\n ...this.translationMap[itemId],\n [key]: { originalValue, translatedValue },\n }\n // Trigger re-render for this specific item\n const instance = this.itemInstances.get(itemId)\n if (instance) {\n instance.triggerUpdate()\n }\n }\n\n /**\n * Collect all translation changes across all weaverse instances.\n * Used by the save flow to persist translation edits.\n */\n getTranslationChanges = (): TranslationChanges | undefined => {\n const entries: TranslationEntry[] = []\n const languageId = this.translationLanguageId\n if (!(this.translationLocale && languageId)) {\n return\n }\n\n for (const [itemId, fields] of Object.entries(this.translationMap)) {\n for (const [key, entry] of Object.entries(fields)) {\n entries.push({\n itemId,\n key: `data.${key}`,\n originalValue: entry.originalValue,\n translatedValue: entry.translatedValue,\n })\n }\n }\n\n if (entries.length === 0) {\n return\n }\n return { languageId, entries }\n }\n\n /**\n * Override setProjectData to re-extract translation sidecar from new page data.\n */\n setProjectData = (data: HydrogenPageData) => {\n this.data = data\n this.extractTranslationSidecar()\n this.initProject()\n }\n}\n\nfunction createWeaverseInstance(\n params: WeaverseHydrogenParams\n): WeaverseHydrogen {\n const normalizedParams = normalizeRequestInfo(params)\n if (isBrowser) {\n window.__weaverses = window.__weaverses || {}\n const existing = window.__weaverses[normalizedParams.pageId]\n // Reuse the instance only while the browser stays on the same URL —\n // navigation to a different pathname/search builds a fresh instance.\n const isReused =\n existing?.requestInfo?.pathname ===\n normalizedParams.requestInfo.pathname &&\n existing?.requestInfo?.search === normalizedParams.requestInfo.search\n const weaverse = isReused\n ? existing\n : new WeaverseHydrogen(normalizedParams)\n window.__weaverses[normalizedParams.pageId] = weaverse\n if (weaverse.isDesignMode) {\n weaverse.requestInfo = normalizedParams.requestInfo\n if (hasWeaverseStudio(window)) {\n window.weaverseStudio.refreshStudio(normalizedParams)\n }\n } else if (isReused) {\n // Same-URL revalidation in live/preview mode: the reused instance\n // must adopt the fresh loader payload (see syncReusedInstance).\n syncReusedInstance(weaverse, normalizedParams)\n }\n return weaverse\n }\n return new WeaverseHydrogen(normalizedParams)\n}\n\nconst StudioBridge = memo(({ context }: { context: WeaverseHydrogen }) => {\n useStudio(context)\n return null\n})\n\nconst StudioConnect = memo(() => {\n useStudioConnect()\n return null\n})\n\n/**\n * Component lists already pushed into the element registry. Registration is\n * idempotent (the registry checks `has(type)`), but walking the full list\n * allocates and loops on every render — theme component arrays are\n * module-level constants, so register each list identity once.\n */\nconst registeredComponentLists = new WeakSet<HydrogenComponent[]>()\n\nfunction RenderRoot(props: {\n data: WeaverseLoaderData\n components: HydrogenComponent[]\n dataContext?: Record<string, any>\n}) {\n const { data, components, dataContext } = props\n if (!registeredComponentLists.has(components)) {\n for (const comp of [...components, ...defaultComponents]) {\n if (comp?.schema?.type) {\n registerComponent({\n type: comp.schema.type,\n Component: comp.default,\n schema: comp.schema,\n loader: comp.loader,\n })\n }\n }\n registeredComponentLists.add(components)\n }\n const { page, configs, project, pageAssignment } = data || {}\n\n // Keep original page data - processing will happen at component level in renderer\n\n const weaverse = createWeaverseInstance({\n ...configs,\n dataContext,\n data: page,\n pageId: page?.id,\n internal: { project, pageAssignment },\n })\n return (\n <>\n <WeaverseRoot context={weaverse} />\n <StudioBridge context={weaverse} />\n </>\n )\n}\n\n/**\n * Register a Weaverse component with the global element registry.\n * Must be called before rendering components in WeaverseHydrogenRoot.\n *\n * @param element - Component configuration with schema, Component, and optional loader\n *\n * @example\n * ```typescript\n * import Hero from './sections/Hero'\n * import { schema } from './sections/Hero'\n *\n * registerComponent({\n * type: 'hero',\n * Component: Hero,\n * schema,\n * loader: async ({ data, weaverse }) => {\n * return { someData: 'value' }\n * }\n * })\n * ```\n */\nexport function registerComponent(element: HydrogenElement) {\n WeaverseHydrogen.registerElement(element)\n}\n\nexport const WeaverseHydrogenRoot = memo(\n ({\n components,\n data: dataProp,\n errorComponent: ErrorComponent = ({ error }) => (\n <div>\n {error instanceof Error\n ? error.message\n : 'An unexpected error occurred'}\n </div>\n ),\n }: {\n components: HydrogenComponent[]\n /**\n * Optional explicit `weaverseData` payload. When provided, bypasses the\n * automatic route-scoped resolution. Accepts a resolved value, a\n * `Promise` (handled via `<Await>`), or `null` to suppress rendering.\n *\n * Recommended for nested layout + child route compositions where two\n * `<WeaverseHydrogenRoot>` instances need to render different Weaverse\n * pages on the same URL. See issue #451.\n */\n data?: WeaverseDataValue\n errorComponent?: React.FC<{ error: Error | unknown }>\n }) => {\n const matches = useMatches()\n\n // Flat route-keyed data context for data-connector template resolution\n // (e.g. {{root.layout.shop.name}}). Legitimately needs all matches;\n // memoized so same-matches re-renders don't allocate a fresh context.\n const enhancedDataContext = useMemo(\n () => createWeaverseDataContext(matches),\n [matches]\n )\n\n // Route-scoped weaverseData lookup. `useLoaderData()` returns the\n // closest route's loader data, which is what makes nested layout +\n // child routes work — each <WeaverseHydrogenRoot> instance resolves\n // to its own route's weaverseData. See pickWeaverseData() for the\n // three-tier fallback policy.\n const ownLoaderData = useLoaderData() as unknown\n const weaverseData = useMemo(\n () => pickWeaverseData(dataProp, ownLoaderData, matches),\n [dataProp, ownLoaderData, matches]\n )\n\n // Explicit `data={null}` is the documented signal for \"suppress rendering\"\n // (e.g. a route conditionally disables Weaverse without unmounting the\n // component). This is distinct from auto-resolution returning `null`,\n // which means \"data was expected but not found\" — the error path below.\n if (dataProp === null) {\n return null\n }\n\n if (weaverseData) {\n if (weaverseData instanceof Promise) {\n return (\n <ErrorBoundary fallbackRender={ErrorComponent as any}>\n <Suspense>\n <Await resolve={weaverseData}>\n {(resolvedData) => (\n <RenderRoot\n components={components}\n data={resolvedData}\n dataContext={enhancedDataContext}\n />\n )}\n </Await>\n </Suspense>\n </ErrorBoundary>\n )\n }\n return (\n <RenderRoot\n components={components}\n data={weaverseData}\n dataContext={enhancedDataContext}\n />\n )\n }\n return (\n <ErrorComponent\n error={{ message: 'No Weaverse data found in route matches!' }}\n />\n )\n }\n)\n\n/**\n * Options for the `withWeaverse` HOC.\n */\nexport type WithWeaverseOptions = {\n /**\n * Optional external translation function (e.g. from Shopify i18n).\n * When provided it becomes the **highest-priority** source\n * in the `t()` resolution chain exposed by `useTranslation()`.\n */\n t?: TranslateFunction\n}\n\n/**\n * Higher-order component that wraps your app with Weaverse theme settings and\n * translation context, and mounts the Studio connect bridge.\n *\n * Export the result as your root route's **`Layout`** (not the default route\n * `Component`). In React Router the root `Layout` wraps both the matched route\n * and its `ErrorBoundary`, so the Studio bridge keeps rendering on 404s and\n * loader/render errors — exactly the pages where Studio must still answer its\n * handshake instead of reporting a false \"Connection lost\". A default-component\n * wrapper (`export default withWeaverse(App)`) is replaced by the error\n * boundary on those routes and would drop the bridge.\n *\n * @param Component - The root layout component to wrap\n * @param options - Optional configuration (e.g. an external `t` function)\n * @returns Wrapped component with theme settings + translation providers\n *\n * @example\n * ```typescript\n * import { withWeaverse } from '@weaverse/hydrogen'\n *\n * // Basic usage — export as the root route Layout\n * export const Layout = withWeaverse(RootLayout)\n *\n * // With an external translation function\n * export const Layout = withWeaverse(RootLayout, { t: myI18nFunction })\n * ```\n */\nexport function withWeaverse(\n Component: ComponentType<any>,\n options?: WithWeaverseOptions\n) {\n return (props: JSX.IntrinsicAttributes) => {\n const themeSettingsStore = useCreateThemeSettingsStore()\n const translationData = useTranslationData()\n const translationStoreRef = useRef<TranslationStore | null>(null)\n if (!translationStoreRef.current) {\n translationStoreRef.current = new TranslationStore()\n }\n return (\n <ThemeSettingsStoreContext.Provider value={themeSettingsStore}>\n <TranslationProvider\n merchantOverrides={translationData.merchantOverrides}\n staticContent={translationData.staticContent}\n t={options?.t}\n translationStore={translationStoreRef.current}\n >\n <StudioConnect />\n <Component {...props} />\n </TranslationProvider>\n </ThemeSettingsStoreContext.Provider>\n )\n }\n}\n\n/**\n * Internal hook to read staticContent and merchantOverrides from root loader data.\n * Similar pattern to useThemeSettingsStore – reads from the 'root' route loader.\n */\nfunction useTranslationData(): {\n staticContent: Record<string, unknown>\n merchantOverrides?: Record<string, unknown>\n} {\n const data = useRouteLoaderData('root') as {\n weaverseTheme?: {\n staticContent?: Record<string, unknown>\n merchantOverrides?: Record<string, unknown>\n }\n }\n return {\n staticContent: data?.weaverseTheme?.staticContent ?? {},\n merchantOverrides: data?.weaverseTheme?.merchantOverrides,\n }\n}\n\n/**\n * React hook to access Weaverse theme settings from anywhere in your component tree.\n * Must be used within a component wrapped by `withWeaverse` or inside `WeaverseHydrogenRoot`.\n *\n * @returns Current theme settings object\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const theme = useThemeSettings()\n * const primaryColor = theme.colors?.primary\n *\n * return <div style={{ color: primaryColor }}>Styled content</div>\n * }\n * ```\n */\nexport function useThemeSettings<T = HydrogenThemeSettings>() {\n const themeSettingsStore = useThemeSettingsStore()\n const settings = useSafeExternalStore(\n themeSettingsStore.subscribe,\n themeSettingsStore.getSnapshot,\n themeSettingsStore.getServerSnapshot\n )\n return settings as T\n}\n","// Query params that influence Weaverse page resolution on the Builder:\n// revision previews, design-mode flags, and `weaverse*` control params\n// (host, version, project id). Everything else — utm_*, fbclid, gclid,\n// storefront filters — is irrelevant to which page the Builder returns.\nconst KEPT_PARAM_RE = /^(?:__revisionId|isDesignMode|weaverse)/\n\n/**\n * Normalize the storefront URL sent in the Builder page API request body.\n *\n * The POST body participates in the `withCache` cache key, so a raw\n * `request.url` fragments the cache by every marketing/tracking param:\n * each distinct `?utm_…`/`fbclid` URL is a guaranteed Builder round-trip\n * even when the resolved page is identical — precisely the paid/social\n * traffic that needs the cache most (builder#2450).\n *\n * The Builder reads only the pathname (locale/type/handle fallback) and\n * the params matched above from this URL, so keep exactly those. Params\n * are sorted for a stable cache key regardless of their order in the\n * incoming URL.\n */\nexport function normalizePageUrl(url: string): string {\n let parsed: URL\n try {\n parsed = new URL(url)\n } catch {\n // Not an absolute URL (shouldn't happen for request.url) — send as-is.\n return url\n }\n const kept = [...parsed.searchParams].filter(([key]) =>\n KEPT_PARAM_RE.test(key)\n )\n kept.sort(([a], [b]) => a.localeCompare(b))\n const search = new URLSearchParams(kept).toString()\n // React Router single-fetch requests loader data from `/<path>.data`, which\n // resolves to the same Builder page as `/<path>`. Strip the suffix so a\n // client navigation and a document load hash to one edge-cache key (the\n // api.weaverse.io worker keys on this url) instead of two — keeping a page's\n // first client navigation off the cold-MISS path.\n let { pathname } = parsed\n if (pathname.endsWith('.data')) {\n pathname = pathname.slice(0, -'.data'.length)\n }\n return `${parsed.origin}${pathname}${search ? `?${search}` : ''}`\n}\n","import {\n CacheCustom,\n createWithCache,\n type HydrogenEnv,\n type I18nBase,\n} from '@shopify/hydrogen'\nimport type {\n CachingStrategy,\n CustomPageEntry,\n FetchProjectPayload,\n FetchProjectRequestBody,\n HydrogenComponent,\n HydrogenComponentData,\n HydrogenPageData,\n LoadPageParams,\n PageType,\n ProjectIdValidationResult,\n ThemeSettingsResponse,\n WeaverseClientArgs,\n WeaverseLoaderData,\n WeaverseProjectConfigs,\n WeaverseStudioQueries,\n WithCacheFetchResponse,\n} from './types'\nimport {\n hasError,\n isFetchProjectPayload,\n isProjectIdFunction,\n WeaverseError,\n} from './types'\nimport {\n generateDataFromSchema,\n getPreviewData,\n getRequestQueries,\n getWeaverseConfigs,\n} from './utils'\nimport { normalizePageUrl } from './utils/normalize-page-url'\n\n/**\n * Cache duration constants (in seconds).\n * These values optimize CDN hit rates while maintaining fresh content.\n */\nconst CACHE_DURATIONS = {\n /** Short browser freshness for content that can change in Builder */\n SHORT: 60,\n /** Shared cache freshness for anonymous storefront traffic */\n SHARED_SHORT: 300,\n /** Long stale window so slow Builder responses do not block storefront rendering */\n LONG: 86_400,\n /** Extra freshness for sitemap-like index data */\n STATIC: 3600,\n} as const\n\n/**\n * Network timeout for fetch requests (in milliseconds).\n * Default is 10 seconds to balance reliability and user experience.\n */\nconst DEFAULT_FETCH_TIMEOUT_MS = 10_000\n\n/**\n * Bounded retry for the public API fetch. A single slow/cold origin response,\n * a transient 5xx, or a network blip would otherwise make loadPage return null\n * — rendering the \"Please add new section\" placeholder or throwing a 404 in\n * the route. Two attempts (one retry) is enough: by the time the first attempt\n * times out, the edge proxy's single-flight leader has usually populated its\n * versioned cache, so the retry lands on a warm HIT.\n */\nconst MAX_FETCH_ATTEMPTS = 2\nconst FETCH_RETRY_BACKOFF_MS = 300\n\n/**\n * Retry only transient failures: request timeouts, network errors, and origin\n * 5xx. A 4xx is deterministic (e.g. a genuine 404) — retrying just wastes time.\n */\nfunction isRetryableFetchError(error: unknown): boolean {\n if (!(error instanceof WeaverseError)) {\n return false\n }\n if (error.code === 'TIMEOUT_ERROR' || error.code === 'NETWORK_ERROR') {\n return true\n }\n return error.code === 'FETCH_ERROR' && (error.statusCode ?? 0) >= 500\n}\n\n/**\n * Weaverse API version path\n */\nconst API_PATH = 'v1' as const\n\n/**\n * Default cache strategy for Weaverse API requests.\n * Optimized for CDN performance with 23-hour stale content tolerance.\n */\nconst DEFAULT_CACHE_STRATEGY: CachingStrategy = {\n maxAge: CACHE_DURATIONS.SHORT,\n sMaxAge: CACHE_DURATIONS.SHARED_SHORT,\n staleWhileRevalidate: CACHE_DURATIONS.LONG,\n staleIfError: CACHE_DURATIONS.LONG,\n} as const\n\ntype BuilderApiCacheTarget =\n | 'custom-pages'\n | 'merchant-overrides'\n | 'project'\n | 'theme-settings'\n\nconst SMART_CACHE_STRATEGIES: Record<BuilderApiCacheTarget, CachingStrategy> = {\n project: DEFAULT_CACHE_STRATEGY,\n 'theme-settings': DEFAULT_CACHE_STRATEGY,\n 'merchant-overrides': DEFAULT_CACHE_STRATEGY,\n 'custom-pages': {\n maxAge: CACHE_DURATIONS.SHORT,\n sMaxAge: CACHE_DURATIONS.STATIC,\n staleWhileRevalidate: CACHE_DURATIONS.LONG,\n staleIfError: CACHE_DURATIONS.LONG,\n },\n} as const\n\nexport class WeaverseClient {\n API = API_PATH\n basePageConfigs: Omit<WeaverseProjectConfigs, 'requestInfo'>\n basePageRequestBody: Omit<FetchProjectRequestBody, 'url'>\n configs: WeaverseProjectConfigs\n withCache: ReturnType<typeof createWithCache>\n\n // Required dependencies\n request: WeaverseClientArgs['request']\n customerAccount: WeaverseClientArgs['customerAccount']\n storefront: WeaverseClientArgs['storefront']\n components: WeaverseClientArgs['components']\n themeSchema: WeaverseClientArgs['themeSchema']\n env: WeaverseClientArgs['env']\n cache: WeaverseClientArgs['cache']\n waitUntil: WeaverseClientArgs['waitUntil']\n\n // Performance optimizations\n private readonly parsedUrl: URL\n private readonly componentsByType: Map<string, HydrogenComponent>\n\n // Configuration\n private readonly fetchTimeoutMs: number\n\n constructor(args: WeaverseClientArgs) {\n // Assign required dependencies\n this.request = args.request\n this.storefront = args.storefront\n this.customerAccount = args.customerAccount\n this.components = args.components\n this.themeSchema = args.themeSchema\n this.env = args.env\n this.cache = args.cache\n this.waitUntil = args.waitUntil\n\n // Performance optimizations\n this.parsedUrl = new URL(args.request.url)\n this.componentsByType = this.buildComponentLookupMap(args.components)\n\n // Configuration\n this.fetchTimeoutMs = args.fetchTimeoutMs || DEFAULT_FETCH_TIMEOUT_MS\n\n // Initialize cache and configs\n this.initializeCache(args)\n this.initializeConfigs(args)\n }\n\n /**\n * Initialize Hydrogen cache with proper configuration.\n * Logs warning if waitUntil is missing.\n */\n private initializeCache(args: WeaverseClientArgs): void {\n if (!args.waitUntil) {\n console.warn(\n '⚠️ WeaverseClient: waitUntil not provided, background operations may not complete'\n )\n }\n\n this.withCache = createWithCache({\n cache: args.cache,\n waitUntil: args.waitUntil || (() => Promise.resolve()),\n request: args.request,\n })\n }\n\n /**\n * Initialize configs with projectId resolution and fail-fast validation.\n * Throws WeaverseError if projectId cannot be resolved.\n */\n private initializeConfigs(args: WeaverseClientArgs): void {\n // Get base configs once to avoid duplicate calls\n const baseConfigs = getWeaverseConfigs(\n args.request,\n args.env as HydrogenEnv\n )\n\n // Resolve projectId with multi-project support\n const resolvedProjectId = this.resolveProjectIdSync(\n args.projectId,\n args.request,\n args.env as HydrogenEnv,\n baseConfigs\n )\n\n // Fail-fast validation: throw if projectId is empty\n if (!resolvedProjectId || resolvedProjectId.trim() === '') {\n throw new WeaverseError(\n 'Failed to initialize WeaverseClient: No valid projectId found. ' +\n 'Set WEAVERSE_PROJECT_ID environment variable or provide projectId parameter.',\n 'MISSING_PROJECT_ID'\n )\n }\n\n // Initialize configs with resolved projectId\n this.configs = {\n ...baseConfigs,\n projectId: resolvedProjectId,\n }\n\n // Initialize base configurations\n this.basePageConfigs = {\n projectId: this.configs.projectId,\n weaverseHost: this.configs.weaverseHost,\n weaverseApiBase: this.configs.weaverseApiBase,\n weaverseApiKey: this.configs.weaverseApiKey,\n weaverseVersion: this.configs.weaverseVersion,\n isDesignMode: this.configs.isDesignMode,\n isPreviewMode: this.configs.isPreviewMode,\n isRevisionPreview: this.configs.isRevisionPreview,\n }\n\n this.basePageRequestBody = {\n isDesignMode: this.configs.isDesignMode,\n i18n: args.storefront.i18n,\n projectId: this.configs.projectId,\n }\n\n // Freeze configs to prevent accidental mutations\n Object.freeze(this.configs)\n Object.freeze(this.basePageConfigs)\n Object.freeze(this.basePageRequestBody)\n }\n\n /**\n * Build component lookup map for O(1) access by type.\n * Significantly improves performance for large component lists.\n */\n private buildComponentLookupMap(\n components: HydrogenComponent[]\n ): Map<string, HydrogenComponent> {\n return new Map(components.map((comp) => [comp.schema?.type, comp]))\n }\n\n /**\n * Extract comprehensive error information from unknown error type.\n * Preserves error context, codes, and stack traces for debugging.\n *\n * @param error - Unknown error to extract information from\n * @returns Structured error information with message, code, stack, and context\n *\n * @example\n * ```typescript\n * try {\n * // ... operation\n * } catch (error) {\n * const errorInfo = this.extractErrorInfo(error)\n * console.error('Operation failed:', errorInfo.message, errorInfo.context)\n * }\n * ```\n */\n private extractErrorInfo(error: unknown): {\n message: string\n code?: string\n stack?: string\n context?: Record<string, unknown>\n } {\n if (error instanceof WeaverseError) {\n return {\n message: error.message,\n code: error.code,\n context: error.context,\n stack: error.stack,\n }\n }\n\n if (error instanceof Error) {\n return {\n message: error.message,\n stack: error.stack,\n }\n }\n\n return {\n message: String(error),\n }\n }\n\n /**\n * Extract error message only (for backward compatibility).\n * Use extractErrorInfo() for more detailed error information.\n *\n * @deprecated Use extractErrorInfo() instead to preserve error context\n */\n private extractErrorMessage(error: unknown): string {\n return this.extractErrorInfo(error).message\n }\n\n /**\n * Validates projectId format (alphanumeric, hyphens, underscores only).\n * Returns detailed validation result with error message.\n *\n * @param projectId - Project identifier to validate\n * @returns Validation result with error message if invalid\n */\n private validateProjectId(projectId: string): ProjectIdValidationResult {\n if (!projectId || projectId.trim() === '') {\n return {\n valid: false,\n error: 'Project ID cannot be empty',\n }\n }\n\n // Only allow alphanumeric characters, hyphens, and underscores\n const validPattern = /^[a-zA-Z0-9_-]+$/\n if (!validPattern.test(projectId)) {\n return {\n valid: false,\n error: `Invalid format: \"${projectId}\". Only alphanumeric characters, hyphens, and underscores are allowed.`,\n }\n }\n\n return { valid: true }\n }\n\n /**\n * Resolves projectId with multi-project architecture support.\n * Uses priority chain to determine the correct project ID.\n *\n * @param projectId - Project identifier (string, function, or undefined)\n * @param request - HTTP request for context access\n * @param env - Hydrogen environment with variables\n * @param baseConfigs - Pre-fetched base configs to avoid duplicate calls\n * @returns Resolved project ID string (empty string if none found)\n */\n private resolveProjectIdSync(\n projectId: string | (() => string) | (() => Promise<string>) | undefined,\n request: Request,\n env: HydrogenEnv,\n baseConfigs?: WeaverseProjectConfigs\n ): string {\n return (\n this.resolveFromQueryParams(request) ||\n this.resolveFromFunction(projectId) ||\n this.resolveFromString(projectId) ||\n this.resolveFromEnvironment(baseConfigs, request, env) ||\n ''\n )\n }\n\n /**\n * Priority 1: Resolve projectId from URL query parameters.\n * Used for design mode and preview mode overrides.\n */\n private resolveFromQueryParams(request: Request): string | null {\n const queries = getRequestQueries<WeaverseStudioQueries>(request)\n return queries.weaverseProjectId || null\n }\n\n /**\n * Priority 2: Resolve projectId from function parameter.\n * Detects and rejects async functions with helpful error.\n */\n private resolveFromFunction(\n projectId: string | (() => string) | (() => Promise<string>) | undefined\n ): string | null {\n if (!isProjectIdFunction(projectId)) {\n return null\n }\n\n // Check if it's an async function BEFORE calling\n if (projectId.constructor.name === 'AsyncFunction') {\n throw new WeaverseError(\n 'Async projectId functions must be awaited before passing to WeaverseClient. ' +\n 'Use: projectId: await getProjectAsync() instead of: projectId: getProjectAsync',\n 'ASYNC_PROJECT_ID'\n )\n }\n\n try {\n const result = projectId()\n\n // Safety net: check if result is a Promise\n if (result instanceof Promise) {\n throw new WeaverseError(\n 'Async projectId functions must be awaited before passing to WeaverseClient. ' +\n 'Use: projectId: await getProjectAsync() instead of: projectId: getProjectAsync',\n 'ASYNC_PROJECT_ID'\n )\n }\n\n if (result && result.trim() !== '') {\n const trimmed = result.trim()\n const validation = this.validateProjectId(trimmed)\n\n if (validation.valid) {\n return trimmed\n }\n\n // Throw on validation failure - fail-fast for explicit projectId\n throw new WeaverseError(\n validation.error || 'Invalid projectId format',\n 'INVALID_PROJECT_ID'\n )\n }\n } catch (err) {\n // Re-throw WeaverseError (async function errors, validation errors)\n if (err instanceof WeaverseError) {\n throw err\n }\n\n // Wrap unexpected errors\n throw new WeaverseError(\n `Failed to evaluate projectId function: ${err instanceof Error ? err.message : String(err)}`,\n 'PROJECT_ID_FUNCTION_ERROR',\n undefined,\n { cause: err instanceof Error ? err.stack : String(err) }\n )\n }\n\n return null\n }\n\n /**\n * Priority 3: Resolve projectId from explicit string parameter.\n */\n private resolveFromString(\n projectId: string | (() => string) | (() => Promise<string>) | undefined\n ): string | null {\n if (typeof projectId !== 'string') {\n return null\n }\n\n const trimmed = projectId.trim()\n if (trimmed === '') {\n return null\n }\n\n const validation = this.validateProjectId(trimmed)\n if (validation.valid) {\n return trimmed\n }\n\n // Throw on validation failure - fail-fast for explicit projectId\n throw new WeaverseError(\n validation.error || 'Invalid projectId format',\n 'INVALID_PROJECT_ID'\n )\n }\n\n /**\n * Priority 4: Resolve projectId from environment variables.\n */\n private resolveFromEnvironment(\n baseConfigs: WeaverseProjectConfigs | undefined,\n request: Request,\n env: HydrogenEnv\n ): string | null {\n const configs = baseConfigs || getWeaverseConfigs(request, env)\n\n if (configs.projectId && configs.projectId.trim() !== '') {\n return configs.projectId.trim()\n }\n\n return null\n }\n\n /**\n * Helper method for direct fetching in design mode.\n * Returns same format as withCache.fetch for consistency.\n * Includes 10-second timeout to prevent hanging requests.\n */\n private readonly fetchOnce = async <T>(\n url: string,\n options: RequestInit,\n timeoutMs: number\n ): Promise<WithCacheFetchResponse<T>> => {\n const controller = new AbortController()\n const timeoutId: ReturnType<typeof setTimeout> | undefined = setTimeout(\n () => controller.abort(),\n timeoutMs\n )\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new WeaverseError(\n `HTTP ${response.status}: ${response.statusText}`,\n 'FETCH_ERROR',\n response.status,\n { url, errorText }\n )\n }\n\n const data = (await response.json()) as T\n return { data, response }\n } catch (err) {\n if (err instanceof WeaverseError) {\n throw err\n }\n\n if (err.name === 'AbortError') {\n throw new WeaverseError(\n `Request timeout after ${timeoutMs}ms`,\n 'TIMEOUT_ERROR',\n undefined,\n { url, timeoutMs }\n )\n }\n\n throw new WeaverseError(\n 'Network error during fetch',\n 'NETWORK_ERROR',\n undefined,\n { url, cause: err instanceof Error ? err.message : String(err) }\n )\n } finally {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId)\n }\n }\n }\n\n private readonly directFetch = async <T>(\n url: string,\n options: RequestInit = {},\n timeoutMs = this.fetchTimeoutMs\n ): Promise<WithCacheFetchResponse<T>> => {\n let lastError: unknown\n for (let attempt = 1; attempt <= MAX_FETCH_ATTEMPTS; attempt++) {\n try {\n return await this.fetchOnce<T>(url, options, timeoutMs)\n } catch (err) {\n lastError = err\n if (attempt >= MAX_FETCH_ATTEMPTS || !isRetryableFetchError(err)) {\n throw err\n }\n await new Promise((resolve) =>\n setTimeout(resolve, FETCH_RETRY_BACKOFF_MS * attempt)\n )\n }\n }\n throw lastError\n }\n\n // Helper method for building API URLs consistently\n private getApiUrl(endpoint: string): string {\n const { weaverseApiBase } = this.configs\n return `${weaverseApiBase}/api/public/${endpoint}`\n }\n\n private isExternalPublicApiUrl(url: string): boolean {\n const { weaverseApiBase, weaverseHost } = this.configs\n return (\n weaverseApiBase !== weaverseHost &&\n url.startsWith(`${weaverseApiBase}/api/public/`)\n )\n }\n\n /**\n * Fetch data with caching support for both design mode and production.\n * Uses direct fetch in design mode, Hydrogen's withCache in production.\n * Automatically includes projectId in cache key for multi-project isolation.\n *\n * @param url - The URL to fetch from\n * @param options - Fetch options including optional cache strategy\n * @returns Promise resolving to the fetched data\n *\n * @example\n * ```typescript\n * const data = await weaverse.fetchWithCache<MyData>(\n * 'https://api.example.com/data',\n * { method: 'POST', body: JSON.stringify({ key: 'value' }) }\n * )\n * ```\n */\n public fetchWithCache = async <T = unknown>(\n url: string,\n options: RequestInit & {\n cacheTarget?: BuilderApiCacheTarget\n strategy?: CachingStrategy\n } = {}\n ): Promise<T> => {\n const { cacheTarget, strategy: strategyOverride, ...fetchOptions } = options\n const strategy =\n strategyOverride ||\n CacheCustom(\n cacheTarget\n ? SMART_CACHE_STRATEGIES[cacheTarget]\n : DEFAULT_CACHE_STRATEGY\n )\n\n // Update cache key to include method, body content, and projectId for multi-project isolation\n // Prefix for easier debugging in cache systems\n const cacheKey = [\n 'weaverse-fetch',\n url,\n options.method || 'GET',\n fetchOptions.body,\n this.configs.projectId,\n cacheTarget || 'default',\n ]\n\n let result: WithCacheFetchResponse<T>\n\n // Bypass the shared Hydrogen subrequest cache for design/revision modes\n // and for the Cloudflare public API proxy. The proxy owns freshness with\n // versioned cache keys; keeping Hydrogen's URL/body cache in front would\n // keep serving a stale response even after Builder bumps api.weaverse.io's\n // project version.\n if (\n this.configs.isDesignMode ||\n this.configs.isRevisionPreview ||\n this.isExternalPublicApiUrl(url)\n ) {\n result = await this.directFetch<T>(url, fetchOptions)\n } else {\n // Use withCache.fetch for better integration with Hydrogen's caching system\n result = (await this.withCache.fetch(url, fetchOptions, {\n cacheKey,\n cacheStrategy: strategy,\n shouldCacheResponse: (response: any): boolean => {\n // Cache any non-error response (for both Weaverse API and third-party APIs)\n return (\n !hasError(response) && response !== null && response !== undefined\n )\n },\n displayName: 'Weaverse API',\n })) as WithCacheFetchResponse<T>\n }\n\n return result.data\n }\n\n /**\n * Load theme settings from Weaverse API with fallback to schema defaults.\n * Merges remote settings with local theme schema and handles design mode serialization.\n *\n * @param strategy - Optional cache strategy override\n * @returns Promise resolving to theme settings response\n *\n * @example\n * ```typescript\n * const settings = await weaverse.loadThemeSettings()\n * const primaryColor = settings.theme.colors?.primary\n * ```\n */\n loadThemeSettings = async (\n strategy?: CachingStrategy\n ): Promise<ThemeSettingsResponse> => {\n const defaultThemeSettings = generateDataFromSchema(this.themeSchema)\n try {\n const { configs } = this\n const { projectId, isDesignMode } = configs\n if (!projectId) {\n throw new Error('Missing Weaverse projectId!')\n }\n\n const url = this.getApiUrl('project_configs')\n\n const body = JSON.stringify({ isDesignMode, projectId })\n\n // Fetch theme settings and merchant overrides in parallel\n const [data, merchantOverrides] = await Promise.all([\n this.fetchWithCache<ThemeSettingsResponse>(url, {\n method: 'POST',\n cacheTarget: 'theme-settings',\n strategy,\n body,\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'Accept-Encoding': 'gzip, deflate, br',\n },\n }),\n this.fetchMerchantOverrides(strategy),\n ])\n\n let result = data\n\n // Validate that data is a proper object, not corrupted/compressed content\n if (typeof result !== 'object' || result === null) {\n console.warn(\n 'Invalid theme settings response format, using defaults:',\n {\n type: typeof result,\n isString: typeof result === 'string',\n length:\n typeof result === 'string' ? (result as string).length : 'N/A',\n preview:\n typeof result === 'string'\n ? `${(result as string).slice(0, 50)}...`\n : String(result),\n }\n )\n result = { theme: defaultThemeSettings }\n }\n\n if (this.themeSchema?.settings || this.themeSchema?.inspector) {\n // Ensure result.theme exists and is an object before merging\n if (!result.theme || typeof result.theme !== 'object') {\n result.theme = defaultThemeSettings\n } else {\n result.theme = {\n ...defaultThemeSettings,\n ...result.theme,\n }\n }\n }\n\n // Always include staticContent from themeSchema.i18n\n const staticContent = this.themeSchema?.i18n?.staticContent\n if (staticContent) {\n result.staticContent = staticContent\n }\n\n // Include merchant overrides (locale-specific translations from DB)\n if (merchantOverrides) {\n result.merchantOverrides = merchantOverrides\n }\n\n if (this.configs.isDesignMode) {\n result = {\n ...result,\n schema:\n this.themeSchema && typeof this.themeSchema === 'object'\n ? {\n ...this.themeSchema,\n settings: this.themeSchema?.settings?.map((group) => ({\n ...group,\n inputs: group?.inputs?.map((input) => {\n if (typeof input?.condition === 'function') {\n return {\n ...input,\n condition: input.condition.toString(),\n }\n }\n return input\n }),\n })),\n }\n : undefined,\n publicEnv: this.configs.publicEnv,\n }\n }\n return result\n } catch (error) {\n const errorMessage = 'Unable to load theme settings'\n const errorDetails = this.extractErrorMessage(error)\n\n console.error(errorMessage, errorDetails)\n\n return {\n theme: defaultThemeSettings,\n staticContent: this.themeSchema?.i18n?.staticContent,\n _error: errorDetails,\n _loadFailed: true,\n }\n }\n }\n\n /**\n * Fetch locale-specific merchant overrides from the translation API.\n * Returns a nested JSON object with translated values.\n * Falls back to empty object on error to avoid blocking theme rendering.\n */\n private fetchMerchantOverrides = async (\n strategy?: CachingStrategy\n ): Promise<Record<string, unknown> | undefined> => {\n try {\n const { projectId, weaverseHost } = this.configs\n const i18n = this.storefront.i18n\n\n // Skip entirely when the theme hasn't opted into i18n. Merchant overrides\n // are locale-specific translations; a theme with no `i18n` schema has no\n // translatable surface, so the fetch would always come back empty. Gating\n // here keeps non-i18n storefronts from making a translation API call on\n // every SSR — same `themeSchema.i18n` condition that guards `staticContent`.\n if (!this.themeSchema?.i18n) {\n return\n }\n\n if (!(projectId && weaverseHost)) {\n return\n }\n\n // Build locale code from storefront i18n (e.g. \"en-us\")\n const language = (i18n?.language || 'en').toLowerCase()\n const country = (i18n?.country || 'us').toLowerCase()\n const locale = `${language}-${country}`\n\n const url = `${weaverseHost}/api/translation/static?projectId=${projectId}&locale=${locale}`\n\n const overrides = await this.fetchWithCache<Record<string, unknown>>(\n url,\n {\n method: 'GET',\n cacheTarget: 'merchant-overrides',\n strategy,\n headers: {\n Accept: 'application/json',\n },\n }\n )\n\n // Validate it's a proper object\n if (typeof overrides === 'object' && overrides !== null) {\n return overrides\n }\n\n return\n } catch (error) {\n // Don't let merchant overrides failure block theme rendering\n console.warn(\n 'Unable to load merchant overrides, using theme defaults:',\n this.extractErrorMessage(error)\n )\n return\n }\n }\n\n /**\n * Generate fallback page with default structure when page data is unavailable.\n * Used internally when API returns no page or when page needs default content.\n *\n * @param message - Custom message to display in the fallback page\n * @returns HydrogenPageData with single main component containing the message\n */\n generateFallbackPage = (message: string): HydrogenPageData => {\n const rootId = crypto.randomUUID()\n return {\n id: `fallback_page_${Date.now()}`,\n rootId,\n name: 'Default Page',\n items: [\n {\n type: 'main',\n id: rootId,\n data: { dangerouslySetInnerHTML: { __html: message } },\n },\n ],\n }\n }\n\n /**\n * Fetch all published custom pages for sitemap generation.\n * Paginates automatically, never throws, returns accumulated results on partial failure.\n */\n async fetchCustomPages(opts?: {\n locale?: string\n limit?: number\n }): Promise<CustomPageEntry[]> {\n const { weaverseApiBase, projectId } = this.configs\n const entries: CustomPageEntry[] = []\n const MAX_PAGES = 100\n\n let cursor: string | null = null\n\n for (let i = 0; i < MAX_PAGES; i++) {\n const params = new URLSearchParams()\n if (opts?.locale) {\n params.set('locale', opts.locale)\n }\n if (opts?.limit) {\n params.set('limit', String(opts.limit))\n }\n if (cursor) {\n params.set('cursor', cursor)\n }\n\n const qs = params.toString()\n const url = `${weaverseApiBase}/api/public/v1/projects/${projectId}/custom-pages${qs ? `?${qs}` : ''}`\n\n try {\n const result = await this.fetchWithCache<{\n data: CustomPageEntry[]\n nextCursor: string | null\n }>(url, { cacheTarget: 'custom-pages' })\n entries.push(...(result.data || []))\n\n if (!result.nextCursor) {\n return entries\n }\n cursor = result.nextCursor\n } catch (err: any) {\n const status = err?.status\n const msg = err?.message || String(err)\n console.warn(\n entries.length === 0\n ? `[Weaverse] Failed to fetch custom pages: ${msg}${status ? ` (HTTP ${status})` : ''}`\n : `[Weaverse] Custom pages pagination interrupted: ${msg}`\n )\n return entries\n }\n }\n\n console.warn(\n '[Weaverse] Custom pages pagination cap reached (100 iterations)'\n )\n return entries\n }\n\n /**\n * Load page data from Weaverse API with optional route-level project override.\n * Fetches page content, executes component loaders, and handles empty items fallback.\n *\n * @param params - Optional page loading parameters\n * @param params.type - Page type (INDEX, PAGE, PRODUCT, COLLECTION, etc.)\n * @param params.handle - Page handle for dynamic routes\n * @param params.locale - Locale override\n * @param params.projectId - Route-level project ID override (for multi-project)\n * @param params.strategy - Custom cache strategy override\n * @returns Promise resolving to page data or null on error\n *\n * @example\n * ```typescript\n * // Basic usage\n * const data = await weaverse.loadPage()\n *\n * // With page type\n * const data = await weaverse.loadPage({ type: 'INDEX' })\n *\n * // Route-level project override\n * const data = await weaverse.loadPage({\n * type: 'PAGE',\n * handle: 'about',\n * projectId: 'campaign-project-123'\n * })\n * ```\n */\n loadPage = async (\n params: LoadPageParams = {}\n ): Promise<WeaverseLoaderData | null> => {\n try {\n const { request, storefront, basePageRequestBody, basePageConfigs } = this\n const {\n projectId: clientProjectId,\n weaverseHost,\n isPreviewMode,\n sectionType,\n } = this.configs\n\n // Validate route-level projectId if provided\n if (params.projectId !== undefined) {\n if (typeof params.projectId !== 'string') {\n console.error(\n 'Route-level projectId validation failed: must be a string. ' +\n `Received: ${typeof params.projectId}`\n )\n return null\n }\n\n const validation = this.validateProjectId(params.projectId)\n if (!validation.valid) {\n console.error(\n `Route-level projectId validation failed: ${validation.error}`\n )\n return null\n }\n }\n\n // Override client-level projectId with route-level projectId if provided\n const effectiveProjectId = params.projectId || clientProjectId\n\n if (isPreviewMode) {\n return getPreviewData(sectionType || '', this.components, weaverseHost)\n }\n\n if (!effectiveProjectId) {\n throw new Error('Missing Weaverse projectId!')\n }\n\n const { strategy, ...pageLoadParams } = params\n const body: {\n projectId: string\n url: string\n i18n?: I18nBase\n params?: {\n type?: PageType\n locale?: string\n handle?: string\n }\n isDesignMode?: boolean\n } = {\n ...basePageRequestBody,\n projectId: effectiveProjectId, // Use effective (potentially overridden) projectId\n params: pageLoadParams,\n // Stripped to pathname + Weaverse params — tracking params would\n // fragment the subrequest cache key (see normalizePageUrl).\n url: normalizePageUrl(request.url),\n }\n\n const reqInit: RequestInit = {\n method: 'POST',\n body: JSON.stringify(body),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'Accept-Encoding': 'gzip, deflate, br',\n 'X-Visitor-UA': request.headers.get('user-agent') || '',\n },\n }\n const url = this.getApiUrl('project')\n\n const projectData: FetchProjectPayload =\n await this.fetchWithCache<FetchProjectPayload>(url, {\n ...reqInit,\n cacheTarget: 'project',\n strategy,\n })\n\n if (hasError(projectData)) {\n throw new Error(projectData.error)\n }\n\n // Extract what we can from the response using type guard\n // If validation fails, use fallback data instead of throwing\n let page: HydrogenPageData | undefined\n let project: WeaverseLoaderData['project'] | undefined\n let pageAssignment: WeaverseLoaderData['pageAssignment'] | undefined\n\n if (isFetchProjectPayload(projectData)) {\n // Valid response - extract normally\n page = projectData.page\n project = projectData.project\n pageAssignment = projectData.pageAssignment\n } else {\n console.warn(\n 'Invalid project data structure received from API, using fallback data',\n { projectId: effectiveProjectId }\n )\n // Try to extract what we can from the malformed response\n const responseData = projectData as any\n page = responseData?.page\n project = responseData?.project\n pageAssignment = responseData?.pageAssignment\n }\n\n if (!project) {\n console.warn('Weaverse project not found. Id:', effectiveProjectId)\n project = {\n id: effectiveProjectId,\n name: 'Weaverse project not found.',\n weaverseShopId: '',\n }\n }\n\n if (!page) {\n page = this.generateFallbackPage(\n '<div style=\"text-align: center;\">Please add new section to start.</div>'\n )\n }\n\n if (page?.items?.length === 0) {\n page.items.push({\n type: 'main',\n id: page.rootId || crypto.randomUUID(),\n data: {},\n })\n }\n\n if (page?.items) {\n const items = page.items\n page.items = await Promise.all(items.map(this.execComponentLoader))\n }\n return {\n page,\n project,\n pageAssignment,\n configs: {\n ...basePageConfigs,\n requestInfo: {\n i18n: storefront.i18n,\n queries: getRequestQueries<WeaverseStudioQueries>(request),\n pathname: this.parsedUrl.pathname,\n search: this.parsedUrl.search,\n },\n },\n }\n } catch (error) {\n const errorMessage = '❌ Page load failed'\n const errorContext: Record<string, unknown> = {\n url: this.request.url,\n projectId: params.projectId || this.configs.projectId,\n }\n\n if (error instanceof WeaverseError) {\n console.error(errorMessage, {\n code: error.code,\n message: error.message,\n ...errorContext,\n ...error.context,\n })\n } else if (error instanceof Error) {\n console.error(errorMessage, {\n message: error.message,\n stack: error.stack,\n ...errorContext,\n })\n } else {\n console.error(errorMessage, {\n error: String(error),\n ...errorContext,\n })\n }\n\n return null\n }\n }\n\n execComponentLoader = async (item: HydrogenComponentData) => {\n const { data = {}, type, id } = item\n const component = this.componentsByType.get(type)\n const loader = component?.loader\n if (typeof loader === 'function' && component) {\n try {\n return {\n ...item,\n loaderData: await Promise.resolve(\n loader({\n data: { ...generateDataFromSchema(component.schema), ...data },\n weaverse: this,\n })\n ),\n }\n } catch (error) {\n console.warn('❌ Item loader run failed.', type, id, error)\n return item\n }\n }\n return item\n }\n}\n","import { getSelectedProductOptions as hydrogen_getSelectedProductOptions } from '@shopify/hydrogen'\nimport type { SelectedOptionInput } from '@shopify/hydrogen/storefront-api-types'\nimport {\n isBrowser,\n isIframe,\n useChildInstances,\n useItemInstance,\n useParentInstance,\n useWeaverse,\n} from '@weaverse/react'\n\n/**\n * Filter out Weaverse-specific query parameters from product options.\n * Removes `isDesignMode` and any parameters starting with `weaverse` prefix.\n *\n * @param request - The incoming HTTP request\n * @returns Filtered product options for Shopify Hydrogen\n *\n * @example\n * ```typescript\n * export async function loader({ request }: LoaderFunctionArgs) {\n * const selectedOptions = getSelectedProductOptions(request)\n * // Use selectedOptions for product queries without Weaverse params\n * }\n * ```\n */\nexport function getSelectedProductOptions(\n request: Request\n): SelectedOptionInput[] {\n let options = hydrogen_getSelectedProductOptions(request)\n return options.filter(\n ({ name }) => name !== 'isDesignMode' && !name.startsWith('weaverse')\n )\n}\n\nexport const IMAGES_PLACEHOLDERS = {\n logo_white:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-logo-w-600x200.svg',\n logo_black:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-logo-k-600x200.svg',\n image:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-image-1024x1024.svg',\n banner_1:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-lifestyle-1-1800x900.svg',\n banner_2:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-lifestyle-2-1800x900.svg',\n collection_1:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-collection-hats-1024x1024.svg',\n collection_2:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-collection-shoes-1024x1024.svg',\n collection_3:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-collection-glasses-1024x1024.svg',\n collection_4:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-collection-lamps-1024x1024.svg',\n collection_5:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-collection-bags-1024x1024.svg',\n collection_6:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-collection-watches-1024x1024.svg',\n product_1:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-watch-3-1024x1024.svg',\n product_2:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-bag-2-1024x1024.svg',\n product_3:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-shoe-1-1024x1024.svg',\n product_4:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-lamp-2-1024x1024.svg',\n product_5:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-glasses-1-1024x1024.svg',\n product_6:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-lamp-1-1024x1024.svg',\n product_7:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-glasses-2-1024x1024.svg',\n product_8:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-hat-3-1024x1024.svg',\n product_9:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-bag-1-1024x1024.svg',\n product_10:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-shoe-2-1024x1024.svg',\n product_11:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-hat-2-1024x1024.svg',\n product_12:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-glasses-3-1024x1024.svg',\n product_13:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-shoe-3-1024x1024.svg',\n product_14:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-bag-3-1024x1024.svg',\n product_15:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-hat-1-1024x1024.svg',\n product_16:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-lamp-3-1024x1024.svg',\n product_17:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-watch-1-1024x1024.svg',\n product_18:\n 'https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-watch-2-1024x1024.svg',\n}\n\n// Re-export all types and utilities from schema package\nexport * from '@weaverse/schema'\nexport * from './components'\nexport {\n getNestedKey,\n interpolate,\n // Deprecated aliases — kept for backward compatibility.\n ThemeTextProvider,\n type ThemeTextProviderProps,\n type ThemeTextValue,\n type TranslateFunction,\n // Canonical translation API.\n TranslationProvider,\n type TranslationProviderProps,\n type TranslationValue,\n useThemeText,\n useTranslation,\n} from './hooks/translation-context'\n// Export Hydrogen-specific hooks\nexport {\n createWeaverseDataContext,\n useWeaverseDataContext,\n type WeaverseDataContext,\n} from './hooks/use-weaverse-data-context'\n// Export hydrogen-specific modules\nexport * from './seo'\nexport * from './types'\nexport * from './utils'\nexport { ThemeTextStore, TranslationStore } from './utils/translation-store'\nexport * from './WeaverseHydrogenRoot'\nexport * from './weaverse-client'\n// Re-export utilities from @weaverse/react\nexport {\n isBrowser,\n isIframe,\n useChildInstances,\n useItemInstance,\n useParentInstance,\n useWeaverse,\n}\n"]}