@weaverse/hydrogen 5.9.3 → 5.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1141,7 +1141,8 @@ var WeaverseClient = class {
1141
1141
  headers: {
1142
1142
  "Content-Type": "application/json",
1143
1143
  Accept: "application/json",
1144
- "Accept-Encoding": "gzip, deflate, br"
1144
+ "Accept-Encoding": "gzip, deflate, br",
1145
+ "X-Visitor-UA": request.headers.get("user-agent") || ""
1145
1146
  }
1146
1147
  };
1147
1148
  const url = this.getApiUrl("project");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/main.tsx","../src/components/index.ts","../src/hooks/use-weaverse-data-context.ts","../src/types.ts","../src/utils/index.ts","../src/utils/use-theme-settings-store.ts","../src/utils/use-studio.ts","../src/WeaverseHydrogenRoot.tsx","../src/weaverse-client.ts","../src/index.ts"],"names":["jsx","createSchema","useMatches","schema","isValidSchema","window","type","children","data","isBrowser","useRouteLoaderData","useRevalidator","useNavigation","useLocation","useNavigate","useEffect","loadScript","WeaverseItemStore","Weaverse","memo","jsxs","Fragment","WeaverseRoot","useMemo","ErrorBoundary","Suspense","Await","createContext","useSafeExternalStore","createWithCache","CacheCustom","hydrogen_getSelectedProductOptions"],"mappings":"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","file":"index.js","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 { useMatches, type UIMatch } 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 & 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(matches: UIMatch<unknown, unknown>[]): 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(matches: UIMatch<unknown, unknown>[]): 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(data: unknown): data is WeaverseDataContext {\n return data !== null && typeof data === 'object'\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 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 { ThemeSettingsStore } from './utils/use-theme-settings-store'\nimport type { WeaverseHydrogen } from './WeaverseHydrogenRoot'\nimport type { WeaverseClient } from './weaverse-client'\n\n// Re-export types from schema for backward compatibility and convenience\nexport type {\n PositionInputValue,\n WeaverseImage,\n WeaverseVideo,\n PageType,\n InspectorGroup,\n // Enhanced type exports\n BasicInput,\n HeadingInput,\n InputType,\n SchemaValidationResult,\n SchemaValidationIssue,\n}\n\n// Re-export CachingStrategy from Hydrogen for convenience\nexport type { CachingStrategy } from '@shopify/hydrogen'\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}\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 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 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 [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 }\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 _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\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_BASE?: string\n WEAVERSE_API_KEY: string\n WEAVERSE_HOST?: string\n WEAVERSE_PROJECT_ID: 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","import type { HydrogenEnv } from '@shopify/hydrogen'\nimport type {\n HydrogenComponent,\n HydrogenComponentSchema,\n HydrogenThemeSchema,\n WeaverseLoaderData,\n WeaverseProjectConfigs,\n WeaverseStudioQueries,\n} from '../types'\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_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\n return {\n projectId:\n weaverseProjectId ||\n WEAVERSE_PROJECT_ID ||\n envFromProcess.WEAVERSE_PROJECT_ID ||\n '',\n weaverseHost:\n weaverseHost ||\n WEAVERSE_HOST ||\n envFromProcess.WEAVERSE_HOST ||\n 'https://studio.weaverse.io',\n weaverseApiBase:\n WEAVERSE_API_BASE ||\n envFromProcess.WEAVERSE_API_BASE ||\n WEAVERSE_HOST ||\n envFromProcess.WEAVERSE_HOST ||\n 'https://api.weaverse.io',\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","import { isBrowser } from '@weaverse/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 // Notify all listeners\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 // Create a copy of listeners to avoid issues if listeners are modified during iteration\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 // Method to properly clean up the store\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 function useThemeSettingsStore() {\n const data = useRouteLoaderData('root') as {\n weaverseTheme: WeaverseThemeData\n }\n if (isBrowser && window.__weaverseThemeSettingsStore) {\n return window.__weaverseThemeSettingsStore\n }\n return new ThemeSettingsStore(data?.weaverseTheme)\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 { useThemeSettingsStore } from './use-theme-settings-store'\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 {\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 if (isRevisionPreview || isPreviewMode) {\n let previewSrc = `${weaverseHost}/static/studio/hydrogen/preview.js?v=${weaverseVersion}`\n loadScript(previewSrc).catch(console.error)\n } else if (isDesignMode) {\n weaverse.internal = {\n ...weaverse.internal,\n navigate,\n revalidate,\n themeSettingsStore,\n }\n let studioSrc = `${weaverseHost}/static/studio/hydrogen/index.js?v=${weaverseVersion}`\n loadScript(studioSrc)\n .then(() => {\n if (hasWeaverseStudio(window)) {\n window.weaverseStudio.init(weaverse)\n }\n })\n .catch(console.error)\n }\n }\n }, [pathname, search, navigation.state])\n usePixel(weaverse)\n}\n\nexport function usePixel(context: WeaverseHydrogen) {\n let { projectId, pageId, isDesignMode, weaverseHost } = context\n // biome-ignore lint/correctness/useExhaustiveDependencies: only track once on mount\n useEffect(() => {\n if (!(projectId && pageId) || isDesignMode) {\n return\n }\n let img = new Image()\n img.onload = () => img.remove()\n img.src = `${weaverseHost}/api/public/px?projectId=${projectId}&pageId=${pageId}`\n }, [])\n}\n","import {\n isBrowser,\n useSafeExternalStore,\n Weaverse,\n WeaverseItemStore,\n WeaverseRoot,\n} from '@weaverse/react'\nimport {\n type ComponentType,\n createContext,\n type JSX,\n memo,\n Suspense,\n useMemo,\n} from 'react'\nimport { ErrorBoundary } from 'react-error-boundary'\nimport { Await, useMatches } from 'react-router'\nimport { defaultComponents } from '~/components'\nimport { createWeaverseDataContext } from './hooks/use-weaverse-data-context'\nimport type {\n HydrogenComponentData,\n HydrogenElement,\n HydrogenPageData,\n HydrogenThemeSettings,\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 { useStudio } from './utils/use-studio'\nimport { useThemeSettingsStore } 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 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\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 static itemInstances: Map<string, WeaverseHydrogenItem>\n static elementRegistry: Map<string, HydrogenElement>\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}\n\nfunction createWeaverseInstance(\n params: WeaverseHydrogenParams\n): WeaverseHydrogen {\n if (isBrowser) {\n // Check if the weaverse instance already exists in the window object\n window.__weaverses = window.__weaverses || {}\n let weaverse = window.__weaverses[params.pageId]\n // If the weaverse instance does not exist, or the pathname or search has changed, create a new instance\n if (\n !weaverse ||\n weaverse?.requestInfo?.pathname !== params.requestInfo.pathname ||\n weaverse?.requestInfo?.search !== params.requestInfo.search\n ) {\n weaverse = new WeaverseHydrogen(params)\n window.__weaverses[params.pageId] = weaverse\n }\n if (weaverse?.isDesignMode) {\n weaverse.requestInfo = params.requestInfo\n if (hasWeaverseStudio(window)) {\n window.weaverseStudio.refreshStudio(params)\n }\n }\n return weaverse\n }\n return new WeaverseHydrogen(params)\n}\n\nconst StudioBridge = memo(({ context }: { context: WeaverseHydrogen }) => {\n useStudio(context)\n return null\n})\n\nfunction RenderRoot(props: {\n data: WeaverseLoaderData\n components: HydrogenComponent[]\n dataContext?: Record<string, any>\n}) {\n const { data, components, dataContext } = props\n for (const comp of [...components, ...defaultComponents]) {\n 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 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 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 errorComponent?: React.FC<{ error: Error | unknown }>\n }) => {\n const matches = useMatches()\n\n // Create flat route-keyed data context from matches only\n // No more useLoaderData dependency - everything comes from matches\n const enhancedDataContext = createWeaverseDataContext(matches)\n\n // Find weaverseData from matches - optimized with useMemo and reverse iteration\n // Most recent route match (deepest in hierarchy) is most likely to have weaverseData\n const weaverseData = useMemo(() => {\n // Iterate backwards for better performance (most recent match first)\n for (let i = matches.length - 1; i >= 0; i--) {\n const match = matches[i]\n const loaderData = match.loaderData as\n | Record<string, unknown>\n | undefined\n if (loaderData && 'weaverseData' in loaderData) {\n return loaderData.weaverseData as\n | WeaverseLoaderData\n | Promise<WeaverseLoaderData>\n }\n }\n return null\n }, [matches])\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\nconst ThemeSettingsProvider = createContext<HydrogenThemeSettings | null>(null)\nThemeSettingsProvider.displayName = 'WeaverseThemeSettingsProvider'\n\n/**\n * Higher-order component that wraps your app with Weaverse theme settings context.\n * Provides theme settings to all child components via React context.\n *\n * @param Component - The root component to wrap\n * @returns Wrapped component with theme settings provider\n *\n * @example\n * ```typescript\n * import { withWeaverse } from '@weaverse/hydrogen'\n *\n * function App() {\n * return <div>My App</div>\n * }\n *\n * export default withWeaverse(App)\n * ```\n */\nexport function withWeaverse(Component: ComponentType<any>) {\n return (props: JSX.IntrinsicAttributes) => {\n const { settings } = useThemeSettingsStore()\n return (\n <ThemeSettingsProvider.Provider value={settings}>\n <Component {...props} />\n </ThemeSettingsProvider.Provider>\n )\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","import {\n CacheCustom,\n createWithCache,\n type HydrogenEnv,\n type I18nBase,\n} from '@shopify/hydrogen'\nimport type {\n CachingStrategy,\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'\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 cache for frequently changing content (10 seconds) */\n SHORT: 10,\n /** Long cache duration - 23 hours to maximize CDN hits before daily refresh */\n LONG: 82_800,\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 * 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.SHORT,\n staleWhileRevalidate: CACHE_DURATIONS.LONG,\n staleIfError: CACHE_DURATIONS.LONG,\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 directFetch = async <T>(\n url: string,\n options: RequestInit = {},\n timeoutMs = this.fetchTimeoutMs\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 // Helper method for building API URLs consistently\n private getApiUrl(\n endpoint: string,\n useProxy = !this.configs.isDesignMode\n ): string {\n const { weaverseHost, weaverseApiBase, projectId } = this.configs\n\n if (useProxy) {\n return `${weaverseApiBase}/v1/${endpoint}?projectId=${projectId}`\n }\n\n return `${weaverseHost}/api/public/${endpoint}`\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 & { strategy?: CachingStrategy } = {}\n ): Promise<T> => {\n const strategy = options.strategy || CacheCustom(DEFAULT_CACHE_STRATEGY)\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 options.body,\n this.configs.projectId,\n ]\n\n let result: WithCacheFetchResponse<T>\n\n if (this.configs.isDesignMode) {\n result = await this.directFetch<T>(url, options)\n } else {\n // Use withCache.fetch for better integration with Hydrogen's caching system\n result = (await this.withCache.fetch(url, options, {\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 let data: ThemeSettingsResponse =\n await this.fetchWithCache<ThemeSettingsResponse>(url, {\n method: 'POST',\n strategy,\n body,\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'Accept-Encoding': 'gzip, deflate, br',\n },\n })\n\n // Validate that data is a proper object, not corrupted/compressed content\n if (typeof data !== 'object' || data === null) {\n console.warn(\n 'Invalid theme settings response format, using defaults:',\n {\n type: typeof data,\n isString: typeof data === 'string',\n length: typeof data === 'string' ? (data as string).length : 'N/A',\n preview:\n typeof data === 'string'\n ? `${(data as string).substring(0, 50)}...`\n : String(data),\n }\n )\n data = { theme: defaultThemeSettings }\n }\n\n if (this.themeSchema?.settings || this.themeSchema?.inspector) {\n // Ensure data.theme exists and is an object before merging\n if (!data.theme || typeof data.theme !== 'object') {\n data.theme = defaultThemeSettings\n } else {\n data.theme = {\n ...defaultThemeSettings,\n ...data.theme,\n }\n }\n }\n if (this.configs.isDesignMode) {\n data = {\n ...data,\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 data\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 _error: errorDetails,\n _loadFailed: true,\n }\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 * 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 url: 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 },\n }\n const url = this.getApiUrl('project')\n\n const projectData: FetchProjectPayload =\n await this.fetchWithCache<FetchProjectPayload>(url, {\n ...reqInit,\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('Please add new section to start.')\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 utilities from @weaverse/react\nexport {\n isBrowser,\n isIframe,\n useChildInstances,\n useItemInstance,\n useParentInstance,\n useWeaverse,\n}\n\n// Re-export all types and utilities from schema package\nexport * from '@weaverse/schema'\nexport * from './components'\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 './types'\nexport * from './utils'\nexport * from './WeaverseHydrogenRoot'\nexport * from './weaverse-client'\n"]}
1
+ {"version":3,"sources":["../src/components/main.tsx","../src/components/index.ts","../src/hooks/use-weaverse-data-context.ts","../src/types.ts","../src/utils/index.ts","../src/utils/use-theme-settings-store.ts","../src/utils/use-studio.ts","../src/WeaverseHydrogenRoot.tsx","../src/weaverse-client.ts","../src/index.ts"],"names":["jsx","createSchema","useMatches","schema","isValidSchema","window","type","children","data","isBrowser","useRouteLoaderData","useRevalidator","useNavigation","useLocation","useNavigate","useEffect","loadScript","WeaverseItemStore","Weaverse","memo","jsxs","Fragment","WeaverseRoot","useMemo","ErrorBoundary","Suspense","Await","createContext","useSafeExternalStore","createWithCache","CacheCustom","hydrogen_getSelectedProductOptions"],"mappings":"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","file":"index.js","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 { useMatches, type UIMatch } 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 & 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(matches: UIMatch<unknown, unknown>[]): 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(matches: UIMatch<unknown, unknown>[]): 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(data: unknown): data is WeaverseDataContext {\n return data !== null && typeof data === 'object'\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 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 { ThemeSettingsStore } from './utils/use-theme-settings-store'\nimport type { WeaverseHydrogen } from './WeaverseHydrogenRoot'\nimport type { WeaverseClient } from './weaverse-client'\n\n// Re-export types from schema for backward compatibility and convenience\nexport type {\n PositionInputValue,\n WeaverseImage,\n WeaverseVideo,\n PageType,\n InspectorGroup,\n // Enhanced type exports\n BasicInput,\n HeadingInput,\n InputType,\n SchemaValidationResult,\n SchemaValidationIssue,\n}\n\n// Re-export CachingStrategy from Hydrogen for convenience\nexport type { CachingStrategy } from '@shopify/hydrogen'\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}\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 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 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 [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 }\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 _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\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_BASE?: string\n WEAVERSE_API_KEY: string\n WEAVERSE_HOST?: string\n WEAVERSE_PROJECT_ID: 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","import type { HydrogenEnv } from '@shopify/hydrogen'\nimport type {\n HydrogenComponent,\n HydrogenComponentSchema,\n HydrogenThemeSchema,\n WeaverseLoaderData,\n WeaverseProjectConfigs,\n WeaverseStudioQueries,\n} from '../types'\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_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\n return {\n projectId:\n weaverseProjectId ||\n WEAVERSE_PROJECT_ID ||\n envFromProcess.WEAVERSE_PROJECT_ID ||\n '',\n weaverseHost:\n weaverseHost ||\n WEAVERSE_HOST ||\n envFromProcess.WEAVERSE_HOST ||\n 'https://studio.weaverse.io',\n weaverseApiBase:\n WEAVERSE_API_BASE ||\n envFromProcess.WEAVERSE_API_BASE ||\n WEAVERSE_HOST ||\n envFromProcess.WEAVERSE_HOST ||\n 'https://api.weaverse.io',\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","import { isBrowser } from '@weaverse/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 // Notify all listeners\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 // Create a copy of listeners to avoid issues if listeners are modified during iteration\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 // Method to properly clean up the store\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 function useThemeSettingsStore() {\n const data = useRouteLoaderData('root') as {\n weaverseTheme: WeaverseThemeData\n }\n if (isBrowser && window.__weaverseThemeSettingsStore) {\n return window.__weaverseThemeSettingsStore\n }\n return new ThemeSettingsStore(data?.weaverseTheme)\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 { useThemeSettingsStore } from './use-theme-settings-store'\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 {\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 if (isRevisionPreview || isPreviewMode) {\n let previewSrc = `${weaverseHost}/static/studio/hydrogen/preview.js?v=${weaverseVersion}`\n loadScript(previewSrc).catch(console.error)\n } else if (isDesignMode) {\n weaverse.internal = {\n ...weaverse.internal,\n navigate,\n revalidate,\n themeSettingsStore,\n }\n let studioSrc = `${weaverseHost}/static/studio/hydrogen/index.js?v=${weaverseVersion}`\n loadScript(studioSrc)\n .then(() => {\n if (hasWeaverseStudio(window)) {\n window.weaverseStudio.init(weaverse)\n }\n })\n .catch(console.error)\n }\n }\n }, [pathname, search, navigation.state])\n usePixel(weaverse)\n}\n\nexport function usePixel(context: WeaverseHydrogen) {\n let { projectId, pageId, isDesignMode, weaverseHost } = context\n // biome-ignore lint/correctness/useExhaustiveDependencies: only track once on mount\n useEffect(() => {\n if (!(projectId && pageId) || isDesignMode) {\n return\n }\n let img = new Image()\n img.onload = () => img.remove()\n img.src = `${weaverseHost}/api/public/px?projectId=${projectId}&pageId=${pageId}`\n }, [])\n}\n","import {\n isBrowser,\n useSafeExternalStore,\n Weaverse,\n WeaverseItemStore,\n WeaverseRoot,\n} from '@weaverse/react'\nimport {\n type ComponentType,\n createContext,\n type JSX,\n memo,\n Suspense,\n useMemo,\n} from 'react'\nimport { ErrorBoundary } from 'react-error-boundary'\nimport { Await, useMatches } from 'react-router'\nimport { defaultComponents } from '~/components'\nimport { createWeaverseDataContext } from './hooks/use-weaverse-data-context'\nimport type {\n HydrogenComponentData,\n HydrogenElement,\n HydrogenPageData,\n HydrogenThemeSettings,\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 { useStudio } from './utils/use-studio'\nimport { useThemeSettingsStore } 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 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\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 static itemInstances: Map<string, WeaverseHydrogenItem>\n static elementRegistry: Map<string, HydrogenElement>\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}\n\nfunction createWeaverseInstance(\n params: WeaverseHydrogenParams\n): WeaverseHydrogen {\n if (isBrowser) {\n // Check if the weaverse instance already exists in the window object\n window.__weaverses = window.__weaverses || {}\n let weaverse = window.__weaverses[params.pageId]\n // If the weaverse instance does not exist, or the pathname or search has changed, create a new instance\n if (\n !weaverse ||\n weaverse?.requestInfo?.pathname !== params.requestInfo.pathname ||\n weaverse?.requestInfo?.search !== params.requestInfo.search\n ) {\n weaverse = new WeaverseHydrogen(params)\n window.__weaverses[params.pageId] = weaverse\n }\n if (weaverse?.isDesignMode) {\n weaverse.requestInfo = params.requestInfo\n if (hasWeaverseStudio(window)) {\n window.weaverseStudio.refreshStudio(params)\n }\n }\n return weaverse\n }\n return new WeaverseHydrogen(params)\n}\n\nconst StudioBridge = memo(({ context }: { context: WeaverseHydrogen }) => {\n useStudio(context)\n return null\n})\n\nfunction RenderRoot(props: {\n data: WeaverseLoaderData\n components: HydrogenComponent[]\n dataContext?: Record<string, any>\n}) {\n const { data, components, dataContext } = props\n for (const comp of [...components, ...defaultComponents]) {\n 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 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 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 errorComponent?: React.FC<{ error: Error | unknown }>\n }) => {\n const matches = useMatches()\n\n // Create flat route-keyed data context from matches only\n // No more useLoaderData dependency - everything comes from matches\n const enhancedDataContext = createWeaverseDataContext(matches)\n\n // Find weaverseData from matches - optimized with useMemo and reverse iteration\n // Most recent route match (deepest in hierarchy) is most likely to have weaverseData\n const weaverseData = useMemo(() => {\n // Iterate backwards for better performance (most recent match first)\n for (let i = matches.length - 1; i >= 0; i--) {\n const match = matches[i]\n const loaderData = match.loaderData as\n | Record<string, unknown>\n | undefined\n if (loaderData && 'weaverseData' in loaderData) {\n return loaderData.weaverseData as\n | WeaverseLoaderData\n | Promise<WeaverseLoaderData>\n }\n }\n return null\n }, [matches])\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\nconst ThemeSettingsProvider = createContext<HydrogenThemeSettings | null>(null)\nThemeSettingsProvider.displayName = 'WeaverseThemeSettingsProvider'\n\n/**\n * Higher-order component that wraps your app with Weaverse theme settings context.\n * Provides theme settings to all child components via React context.\n *\n * @param Component - The root component to wrap\n * @returns Wrapped component with theme settings provider\n *\n * @example\n * ```typescript\n * import { withWeaverse } from '@weaverse/hydrogen'\n *\n * function App() {\n * return <div>My App</div>\n * }\n *\n * export default withWeaverse(App)\n * ```\n */\nexport function withWeaverse(Component: ComponentType<any>) {\n return (props: JSX.IntrinsicAttributes) => {\n const { settings } = useThemeSettingsStore()\n return (\n <ThemeSettingsProvider.Provider value={settings}>\n <Component {...props} />\n </ThemeSettingsProvider.Provider>\n )\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","import {\n CacheCustom,\n createWithCache,\n type HydrogenEnv,\n type I18nBase,\n} from '@shopify/hydrogen'\nimport type {\n CachingStrategy,\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'\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 cache for frequently changing content (10 seconds) */\n SHORT: 10,\n /** Long cache duration - 23 hours to maximize CDN hits before daily refresh */\n LONG: 82_800,\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 * 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.SHORT,\n staleWhileRevalidate: CACHE_DURATIONS.LONG,\n staleIfError: CACHE_DURATIONS.LONG,\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 directFetch = async <T>(\n url: string,\n options: RequestInit = {},\n timeoutMs = this.fetchTimeoutMs\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 // Helper method for building API URLs consistently\n private getApiUrl(\n endpoint: string,\n useProxy = !this.configs.isDesignMode\n ): string {\n const { weaverseHost, weaverseApiBase, projectId } = this.configs\n\n if (useProxy) {\n return `${weaverseApiBase}/v1/${endpoint}?projectId=${projectId}`\n }\n\n return `${weaverseHost}/api/public/${endpoint}`\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 & { strategy?: CachingStrategy } = {}\n ): Promise<T> => {\n const strategy = options.strategy || CacheCustom(DEFAULT_CACHE_STRATEGY)\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 options.body,\n this.configs.projectId,\n ]\n\n let result: WithCacheFetchResponse<T>\n\n if (this.configs.isDesignMode) {\n result = await this.directFetch<T>(url, options)\n } else {\n // Use withCache.fetch for better integration with Hydrogen's caching system\n result = (await this.withCache.fetch(url, options, {\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 let data: ThemeSettingsResponse =\n await this.fetchWithCache<ThemeSettingsResponse>(url, {\n method: 'POST',\n strategy,\n body,\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'Accept-Encoding': 'gzip, deflate, br',\n },\n })\n\n // Validate that data is a proper object, not corrupted/compressed content\n if (typeof data !== 'object' || data === null) {\n console.warn(\n 'Invalid theme settings response format, using defaults:',\n {\n type: typeof data,\n isString: typeof data === 'string',\n length: typeof data === 'string' ? (data as string).length : 'N/A',\n preview:\n typeof data === 'string'\n ? `${(data as string).substring(0, 50)}...`\n : String(data),\n }\n )\n data = { theme: defaultThemeSettings }\n }\n\n if (this.themeSchema?.settings || this.themeSchema?.inspector) {\n // Ensure data.theme exists and is an object before merging\n if (!data.theme || typeof data.theme !== 'object') {\n data.theme = defaultThemeSettings\n } else {\n data.theme = {\n ...defaultThemeSettings,\n ...data.theme,\n }\n }\n }\n if (this.configs.isDesignMode) {\n data = {\n ...data,\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 data\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 _error: errorDetails,\n _loadFailed: true,\n }\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 * 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 url: 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 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('Please add new section to start.')\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 utilities from @weaverse/react\nexport {\n isBrowser,\n isIframe,\n useChildInstances,\n useItemInstance,\n useParentInstance,\n useWeaverse,\n}\n\n// Re-export all types and utilities from schema package\nexport * from '@weaverse/schema'\nexport * from './components'\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 './types'\nexport * from './utils'\nexport * from './WeaverseHydrogenRoot'\nexport * from './weaverse-client'\n"]}
package/dist/index.mjs CHANGED
@@ -1141,7 +1141,8 @@ var WeaverseClient = class {
1141
1141
  headers: {
1142
1142
  "Content-Type": "application/json",
1143
1143
  Accept: "application/json",
1144
- "Accept-Encoding": "gzip, deflate, br"
1144
+ "Accept-Encoding": "gzip, deflate, br",
1145
+ "X-Visitor-UA": request.headers.get("user-agent") || ""
1145
1146
  }
1146
1147
  };
1147
1148
  const url = this.getApiUrl("project");
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/main.tsx","../src/components/index.ts","../src/hooks/use-weaverse-data-context.ts","../src/types.ts","../src/utils/index.ts","../src/utils/use-theme-settings-store.ts","../src/utils/use-studio.ts","../src/WeaverseHydrogenRoot.tsx","../src/weaverse-client.ts","../src/index.ts"],"names":["schema","window","type","children","data","isBrowser","jsx","useMatches","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 { useMatches, type UIMatch } 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 & 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(matches: UIMatch<unknown, unknown>[]): 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(matches: UIMatch<unknown, unknown>[]): 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(data: unknown): data is WeaverseDataContext {\n return data !== null && typeof data === 'object'\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 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 { ThemeSettingsStore } from './utils/use-theme-settings-store'\nimport type { WeaverseHydrogen } from './WeaverseHydrogenRoot'\nimport type { WeaverseClient } from './weaverse-client'\n\n// Re-export types from schema for backward compatibility and convenience\nexport type {\n PositionInputValue,\n WeaverseImage,\n WeaverseVideo,\n PageType,\n InspectorGroup,\n // Enhanced type exports\n BasicInput,\n HeadingInput,\n InputType,\n SchemaValidationResult,\n SchemaValidationIssue,\n}\n\n// Re-export CachingStrategy from Hydrogen for convenience\nexport type { CachingStrategy } from '@shopify/hydrogen'\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}\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 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 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 [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 }\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 _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\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_BASE?: string\n WEAVERSE_API_KEY: string\n WEAVERSE_HOST?: string\n WEAVERSE_PROJECT_ID: 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","import type { HydrogenEnv } from '@shopify/hydrogen'\nimport type {\n HydrogenComponent,\n HydrogenComponentSchema,\n HydrogenThemeSchema,\n WeaverseLoaderData,\n WeaverseProjectConfigs,\n WeaverseStudioQueries,\n} from '../types'\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_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\n return {\n projectId:\n weaverseProjectId ||\n WEAVERSE_PROJECT_ID ||\n envFromProcess.WEAVERSE_PROJECT_ID ||\n '',\n weaverseHost:\n weaverseHost ||\n WEAVERSE_HOST ||\n envFromProcess.WEAVERSE_HOST ||\n 'https://studio.weaverse.io',\n weaverseApiBase:\n WEAVERSE_API_BASE ||\n envFromProcess.WEAVERSE_API_BASE ||\n WEAVERSE_HOST ||\n envFromProcess.WEAVERSE_HOST ||\n 'https://api.weaverse.io',\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","import { isBrowser } from '@weaverse/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 // Notify all listeners\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 // Create a copy of listeners to avoid issues if listeners are modified during iteration\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 // Method to properly clean up the store\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 function useThemeSettingsStore() {\n const data = useRouteLoaderData('root') as {\n weaverseTheme: WeaverseThemeData\n }\n if (isBrowser && window.__weaverseThemeSettingsStore) {\n return window.__weaverseThemeSettingsStore\n }\n return new ThemeSettingsStore(data?.weaverseTheme)\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 { useThemeSettingsStore } from './use-theme-settings-store'\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 {\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 if (isRevisionPreview || isPreviewMode) {\n let previewSrc = `${weaverseHost}/static/studio/hydrogen/preview.js?v=${weaverseVersion}`\n loadScript(previewSrc).catch(console.error)\n } else if (isDesignMode) {\n weaverse.internal = {\n ...weaverse.internal,\n navigate,\n revalidate,\n themeSettingsStore,\n }\n let studioSrc = `${weaverseHost}/static/studio/hydrogen/index.js?v=${weaverseVersion}`\n loadScript(studioSrc)\n .then(() => {\n if (hasWeaverseStudio(window)) {\n window.weaverseStudio.init(weaverse)\n }\n })\n .catch(console.error)\n }\n }\n }, [pathname, search, navigation.state])\n usePixel(weaverse)\n}\n\nexport function usePixel(context: WeaverseHydrogen) {\n let { projectId, pageId, isDesignMode, weaverseHost } = context\n // biome-ignore lint/correctness/useExhaustiveDependencies: only track once on mount\n useEffect(() => {\n if (!(projectId && pageId) || isDesignMode) {\n return\n }\n let img = new Image()\n img.onload = () => img.remove()\n img.src = `${weaverseHost}/api/public/px?projectId=${projectId}&pageId=${pageId}`\n }, [])\n}\n","import {\n isBrowser,\n useSafeExternalStore,\n Weaverse,\n WeaverseItemStore,\n WeaverseRoot,\n} from '@weaverse/react'\nimport {\n type ComponentType,\n createContext,\n type JSX,\n memo,\n Suspense,\n useMemo,\n} from 'react'\nimport { ErrorBoundary } from 'react-error-boundary'\nimport { Await, useMatches } from 'react-router'\nimport { defaultComponents } from '~/components'\nimport { createWeaverseDataContext } from './hooks/use-weaverse-data-context'\nimport type {\n HydrogenComponentData,\n HydrogenElement,\n HydrogenPageData,\n HydrogenThemeSettings,\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 { useStudio } from './utils/use-studio'\nimport { useThemeSettingsStore } 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 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\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 static itemInstances: Map<string, WeaverseHydrogenItem>\n static elementRegistry: Map<string, HydrogenElement>\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}\n\nfunction createWeaverseInstance(\n params: WeaverseHydrogenParams\n): WeaverseHydrogen {\n if (isBrowser) {\n // Check if the weaverse instance already exists in the window object\n window.__weaverses = window.__weaverses || {}\n let weaverse = window.__weaverses[params.pageId]\n // If the weaverse instance does not exist, or the pathname or search has changed, create a new instance\n if (\n !weaverse ||\n weaverse?.requestInfo?.pathname !== params.requestInfo.pathname ||\n weaverse?.requestInfo?.search !== params.requestInfo.search\n ) {\n weaverse = new WeaverseHydrogen(params)\n window.__weaverses[params.pageId] = weaverse\n }\n if (weaverse?.isDesignMode) {\n weaverse.requestInfo = params.requestInfo\n if (hasWeaverseStudio(window)) {\n window.weaverseStudio.refreshStudio(params)\n }\n }\n return weaverse\n }\n return new WeaverseHydrogen(params)\n}\n\nconst StudioBridge = memo(({ context }: { context: WeaverseHydrogen }) => {\n useStudio(context)\n return null\n})\n\nfunction RenderRoot(props: {\n data: WeaverseLoaderData\n components: HydrogenComponent[]\n dataContext?: Record<string, any>\n}) {\n const { data, components, dataContext } = props\n for (const comp of [...components, ...defaultComponents]) {\n 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 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 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 errorComponent?: React.FC<{ error: Error | unknown }>\n }) => {\n const matches = useMatches()\n\n // Create flat route-keyed data context from matches only\n // No more useLoaderData dependency - everything comes from matches\n const enhancedDataContext = createWeaverseDataContext(matches)\n\n // Find weaverseData from matches - optimized with useMemo and reverse iteration\n // Most recent route match (deepest in hierarchy) is most likely to have weaverseData\n const weaverseData = useMemo(() => {\n // Iterate backwards for better performance (most recent match first)\n for (let i = matches.length - 1; i >= 0; i--) {\n const match = matches[i]\n const loaderData = match.loaderData as\n | Record<string, unknown>\n | undefined\n if (loaderData && 'weaverseData' in loaderData) {\n return loaderData.weaverseData as\n | WeaverseLoaderData\n | Promise<WeaverseLoaderData>\n }\n }\n return null\n }, [matches])\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\nconst ThemeSettingsProvider = createContext<HydrogenThemeSettings | null>(null)\nThemeSettingsProvider.displayName = 'WeaverseThemeSettingsProvider'\n\n/**\n * Higher-order component that wraps your app with Weaverse theme settings context.\n * Provides theme settings to all child components via React context.\n *\n * @param Component - The root component to wrap\n * @returns Wrapped component with theme settings provider\n *\n * @example\n * ```typescript\n * import { withWeaverse } from '@weaverse/hydrogen'\n *\n * function App() {\n * return <div>My App</div>\n * }\n *\n * export default withWeaverse(App)\n * ```\n */\nexport function withWeaverse(Component: ComponentType<any>) {\n return (props: JSX.IntrinsicAttributes) => {\n const { settings } = useThemeSettingsStore()\n return (\n <ThemeSettingsProvider.Provider value={settings}>\n <Component {...props} />\n </ThemeSettingsProvider.Provider>\n )\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","import {\n CacheCustom,\n createWithCache,\n type HydrogenEnv,\n type I18nBase,\n} from '@shopify/hydrogen'\nimport type {\n CachingStrategy,\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'\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 cache for frequently changing content (10 seconds) */\n SHORT: 10,\n /** Long cache duration - 23 hours to maximize CDN hits before daily refresh */\n LONG: 82_800,\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 * 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.SHORT,\n staleWhileRevalidate: CACHE_DURATIONS.LONG,\n staleIfError: CACHE_DURATIONS.LONG,\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 directFetch = async <T>(\n url: string,\n options: RequestInit = {},\n timeoutMs = this.fetchTimeoutMs\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 // Helper method for building API URLs consistently\n private getApiUrl(\n endpoint: string,\n useProxy = !this.configs.isDesignMode\n ): string {\n const { weaverseHost, weaverseApiBase, projectId } = this.configs\n\n if (useProxy) {\n return `${weaverseApiBase}/v1/${endpoint}?projectId=${projectId}`\n }\n\n return `${weaverseHost}/api/public/${endpoint}`\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 & { strategy?: CachingStrategy } = {}\n ): Promise<T> => {\n const strategy = options.strategy || CacheCustom(DEFAULT_CACHE_STRATEGY)\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 options.body,\n this.configs.projectId,\n ]\n\n let result: WithCacheFetchResponse<T>\n\n if (this.configs.isDesignMode) {\n result = await this.directFetch<T>(url, options)\n } else {\n // Use withCache.fetch for better integration with Hydrogen's caching system\n result = (await this.withCache.fetch(url, options, {\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 let data: ThemeSettingsResponse =\n await this.fetchWithCache<ThemeSettingsResponse>(url, {\n method: 'POST',\n strategy,\n body,\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'Accept-Encoding': 'gzip, deflate, br',\n },\n })\n\n // Validate that data is a proper object, not corrupted/compressed content\n if (typeof data !== 'object' || data === null) {\n console.warn(\n 'Invalid theme settings response format, using defaults:',\n {\n type: typeof data,\n isString: typeof data === 'string',\n length: typeof data === 'string' ? (data as string).length : 'N/A',\n preview:\n typeof data === 'string'\n ? `${(data as string).substring(0, 50)}...`\n : String(data),\n }\n )\n data = { theme: defaultThemeSettings }\n }\n\n if (this.themeSchema?.settings || this.themeSchema?.inspector) {\n // Ensure data.theme exists and is an object before merging\n if (!data.theme || typeof data.theme !== 'object') {\n data.theme = defaultThemeSettings\n } else {\n data.theme = {\n ...defaultThemeSettings,\n ...data.theme,\n }\n }\n }\n if (this.configs.isDesignMode) {\n data = {\n ...data,\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 data\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 _error: errorDetails,\n _loadFailed: true,\n }\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 * 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 url: 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 },\n }\n const url = this.getApiUrl('project')\n\n const projectData: FetchProjectPayload =\n await this.fetchWithCache<FetchProjectPayload>(url, {\n ...reqInit,\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('Please add new section to start.')\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 utilities from @weaverse/react\nexport {\n isBrowser,\n isIframe,\n useChildInstances,\n useItemInstance,\n useParentInstance,\n useWeaverse,\n}\n\n// Re-export all types and utilities from schema package\nexport * from '@weaverse/schema'\nexport * from './components'\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 './types'\nexport * from './utils'\nexport * from './WeaverseHydrogenRoot'\nexport * from './weaverse-client'\n"]}
1
+ {"version":3,"sources":["../src/components/main.tsx","../src/components/index.ts","../src/hooks/use-weaverse-data-context.ts","../src/types.ts","../src/utils/index.ts","../src/utils/use-theme-settings-store.ts","../src/utils/use-studio.ts","../src/WeaverseHydrogenRoot.tsx","../src/weaverse-client.ts","../src/index.ts"],"names":["schema","window","type","children","data","isBrowser","jsx","useMatches","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 { useMatches, type UIMatch } 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 & 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(matches: UIMatch<unknown, unknown>[]): 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(matches: UIMatch<unknown, unknown>[]): 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(data: unknown): data is WeaverseDataContext {\n return data !== null && typeof data === 'object'\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 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 { ThemeSettingsStore } from './utils/use-theme-settings-store'\nimport type { WeaverseHydrogen } from './WeaverseHydrogenRoot'\nimport type { WeaverseClient } from './weaverse-client'\n\n// Re-export types from schema for backward compatibility and convenience\nexport type {\n PositionInputValue,\n WeaverseImage,\n WeaverseVideo,\n PageType,\n InspectorGroup,\n // Enhanced type exports\n BasicInput,\n HeadingInput,\n InputType,\n SchemaValidationResult,\n SchemaValidationIssue,\n}\n\n// Re-export CachingStrategy from Hydrogen for convenience\nexport type { CachingStrategy } from '@shopify/hydrogen'\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}\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 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 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 [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 }\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 _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\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_BASE?: string\n WEAVERSE_API_KEY: string\n WEAVERSE_HOST?: string\n WEAVERSE_PROJECT_ID: 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","import type { HydrogenEnv } from '@shopify/hydrogen'\nimport type {\n HydrogenComponent,\n HydrogenComponentSchema,\n HydrogenThemeSchema,\n WeaverseLoaderData,\n WeaverseProjectConfigs,\n WeaverseStudioQueries,\n} from '../types'\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_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\n return {\n projectId:\n weaverseProjectId ||\n WEAVERSE_PROJECT_ID ||\n envFromProcess.WEAVERSE_PROJECT_ID ||\n '',\n weaverseHost:\n weaverseHost ||\n WEAVERSE_HOST ||\n envFromProcess.WEAVERSE_HOST ||\n 'https://studio.weaverse.io',\n weaverseApiBase:\n WEAVERSE_API_BASE ||\n envFromProcess.WEAVERSE_API_BASE ||\n WEAVERSE_HOST ||\n envFromProcess.WEAVERSE_HOST ||\n 'https://api.weaverse.io',\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","import { isBrowser } from '@weaverse/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 // Notify all listeners\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 // Create a copy of listeners to avoid issues if listeners are modified during iteration\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 // Method to properly clean up the store\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 function useThemeSettingsStore() {\n const data = useRouteLoaderData('root') as {\n weaverseTheme: WeaverseThemeData\n }\n if (isBrowser && window.__weaverseThemeSettingsStore) {\n return window.__weaverseThemeSettingsStore\n }\n return new ThemeSettingsStore(data?.weaverseTheme)\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 { useThemeSettingsStore } from './use-theme-settings-store'\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 {\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 if (isRevisionPreview || isPreviewMode) {\n let previewSrc = `${weaverseHost}/static/studio/hydrogen/preview.js?v=${weaverseVersion}`\n loadScript(previewSrc).catch(console.error)\n } else if (isDesignMode) {\n weaverse.internal = {\n ...weaverse.internal,\n navigate,\n revalidate,\n themeSettingsStore,\n }\n let studioSrc = `${weaverseHost}/static/studio/hydrogen/index.js?v=${weaverseVersion}`\n loadScript(studioSrc)\n .then(() => {\n if (hasWeaverseStudio(window)) {\n window.weaverseStudio.init(weaverse)\n }\n })\n .catch(console.error)\n }\n }\n }, [pathname, search, navigation.state])\n usePixel(weaverse)\n}\n\nexport function usePixel(context: WeaverseHydrogen) {\n let { projectId, pageId, isDesignMode, weaverseHost } = context\n // biome-ignore lint/correctness/useExhaustiveDependencies: only track once on mount\n useEffect(() => {\n if (!(projectId && pageId) || isDesignMode) {\n return\n }\n let img = new Image()\n img.onload = () => img.remove()\n img.src = `${weaverseHost}/api/public/px?projectId=${projectId}&pageId=${pageId}`\n }, [])\n}\n","import {\n isBrowser,\n useSafeExternalStore,\n Weaverse,\n WeaverseItemStore,\n WeaverseRoot,\n} from '@weaverse/react'\nimport {\n type ComponentType,\n createContext,\n type JSX,\n memo,\n Suspense,\n useMemo,\n} from 'react'\nimport { ErrorBoundary } from 'react-error-boundary'\nimport { Await, useMatches } from 'react-router'\nimport { defaultComponents } from '~/components'\nimport { createWeaverseDataContext } from './hooks/use-weaverse-data-context'\nimport type {\n HydrogenComponentData,\n HydrogenElement,\n HydrogenPageData,\n HydrogenThemeSettings,\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 { useStudio } from './utils/use-studio'\nimport { useThemeSettingsStore } 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 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\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 static itemInstances: Map<string, WeaverseHydrogenItem>\n static elementRegistry: Map<string, HydrogenElement>\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}\n\nfunction createWeaverseInstance(\n params: WeaverseHydrogenParams\n): WeaverseHydrogen {\n if (isBrowser) {\n // Check if the weaverse instance already exists in the window object\n window.__weaverses = window.__weaverses || {}\n let weaverse = window.__weaverses[params.pageId]\n // If the weaverse instance does not exist, or the pathname or search has changed, create a new instance\n if (\n !weaverse ||\n weaverse?.requestInfo?.pathname !== params.requestInfo.pathname ||\n weaverse?.requestInfo?.search !== params.requestInfo.search\n ) {\n weaverse = new WeaverseHydrogen(params)\n window.__weaverses[params.pageId] = weaverse\n }\n if (weaverse?.isDesignMode) {\n weaverse.requestInfo = params.requestInfo\n if (hasWeaverseStudio(window)) {\n window.weaverseStudio.refreshStudio(params)\n }\n }\n return weaverse\n }\n return new WeaverseHydrogen(params)\n}\n\nconst StudioBridge = memo(({ context }: { context: WeaverseHydrogen }) => {\n useStudio(context)\n return null\n})\n\nfunction RenderRoot(props: {\n data: WeaverseLoaderData\n components: HydrogenComponent[]\n dataContext?: Record<string, any>\n}) {\n const { data, components, dataContext } = props\n for (const comp of [...components, ...defaultComponents]) {\n 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 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 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 errorComponent?: React.FC<{ error: Error | unknown }>\n }) => {\n const matches = useMatches()\n\n // Create flat route-keyed data context from matches only\n // No more useLoaderData dependency - everything comes from matches\n const enhancedDataContext = createWeaverseDataContext(matches)\n\n // Find weaverseData from matches - optimized with useMemo and reverse iteration\n // Most recent route match (deepest in hierarchy) is most likely to have weaverseData\n const weaverseData = useMemo(() => {\n // Iterate backwards for better performance (most recent match first)\n for (let i = matches.length - 1; i >= 0; i--) {\n const match = matches[i]\n const loaderData = match.loaderData as\n | Record<string, unknown>\n | undefined\n if (loaderData && 'weaverseData' in loaderData) {\n return loaderData.weaverseData as\n | WeaverseLoaderData\n | Promise<WeaverseLoaderData>\n }\n }\n return null\n }, [matches])\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\nconst ThemeSettingsProvider = createContext<HydrogenThemeSettings | null>(null)\nThemeSettingsProvider.displayName = 'WeaverseThemeSettingsProvider'\n\n/**\n * Higher-order component that wraps your app with Weaverse theme settings context.\n * Provides theme settings to all child components via React context.\n *\n * @param Component - The root component to wrap\n * @returns Wrapped component with theme settings provider\n *\n * @example\n * ```typescript\n * import { withWeaverse } from '@weaverse/hydrogen'\n *\n * function App() {\n * return <div>My App</div>\n * }\n *\n * export default withWeaverse(App)\n * ```\n */\nexport function withWeaverse(Component: ComponentType<any>) {\n return (props: JSX.IntrinsicAttributes) => {\n const { settings } = useThemeSettingsStore()\n return (\n <ThemeSettingsProvider.Provider value={settings}>\n <Component {...props} />\n </ThemeSettingsProvider.Provider>\n )\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","import {\n CacheCustom,\n createWithCache,\n type HydrogenEnv,\n type I18nBase,\n} from '@shopify/hydrogen'\nimport type {\n CachingStrategy,\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'\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 cache for frequently changing content (10 seconds) */\n SHORT: 10,\n /** Long cache duration - 23 hours to maximize CDN hits before daily refresh */\n LONG: 82_800,\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 * 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.SHORT,\n staleWhileRevalidate: CACHE_DURATIONS.LONG,\n staleIfError: CACHE_DURATIONS.LONG,\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 directFetch = async <T>(\n url: string,\n options: RequestInit = {},\n timeoutMs = this.fetchTimeoutMs\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 // Helper method for building API URLs consistently\n private getApiUrl(\n endpoint: string,\n useProxy = !this.configs.isDesignMode\n ): string {\n const { weaverseHost, weaverseApiBase, projectId } = this.configs\n\n if (useProxy) {\n return `${weaverseApiBase}/v1/${endpoint}?projectId=${projectId}`\n }\n\n return `${weaverseHost}/api/public/${endpoint}`\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 & { strategy?: CachingStrategy } = {}\n ): Promise<T> => {\n const strategy = options.strategy || CacheCustom(DEFAULT_CACHE_STRATEGY)\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 options.body,\n this.configs.projectId,\n ]\n\n let result: WithCacheFetchResponse<T>\n\n if (this.configs.isDesignMode) {\n result = await this.directFetch<T>(url, options)\n } else {\n // Use withCache.fetch for better integration with Hydrogen's caching system\n result = (await this.withCache.fetch(url, options, {\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 let data: ThemeSettingsResponse =\n await this.fetchWithCache<ThemeSettingsResponse>(url, {\n method: 'POST',\n strategy,\n body,\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'Accept-Encoding': 'gzip, deflate, br',\n },\n })\n\n // Validate that data is a proper object, not corrupted/compressed content\n if (typeof data !== 'object' || data === null) {\n console.warn(\n 'Invalid theme settings response format, using defaults:',\n {\n type: typeof data,\n isString: typeof data === 'string',\n length: typeof data === 'string' ? (data as string).length : 'N/A',\n preview:\n typeof data === 'string'\n ? `${(data as string).substring(0, 50)}...`\n : String(data),\n }\n )\n data = { theme: defaultThemeSettings }\n }\n\n if (this.themeSchema?.settings || this.themeSchema?.inspector) {\n // Ensure data.theme exists and is an object before merging\n if (!data.theme || typeof data.theme !== 'object') {\n data.theme = defaultThemeSettings\n } else {\n data.theme = {\n ...defaultThemeSettings,\n ...data.theme,\n }\n }\n }\n if (this.configs.isDesignMode) {\n data = {\n ...data,\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 data\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 _error: errorDetails,\n _loadFailed: true,\n }\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 * 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 url: 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 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('Please add new section to start.')\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 utilities from @weaverse/react\nexport {\n isBrowser,\n isIframe,\n useChildInstances,\n useItemInstance,\n useParentInstance,\n useWeaverse,\n}\n\n// Re-export all types and utilities from schema package\nexport * from '@weaverse/schema'\nexport * from './components'\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 './types'\nexport * from './utils'\nexport * from './WeaverseHydrogenRoot'\nexport * from './weaverse-client'\n"]}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@weaverse/hydrogen",
3
3
  "author": "Weaverse Team",
4
4
  "description": "Components, hooks, and utilities for building Shopify Hydrogen websites with Weaverse",
5
- "version": "5.9.3",
5
+ "version": "5.9.5",
6
6
  "license": "MIT",
7
7
  "main": "dist/index.js",
8
8
  "typings": "dist/index.d.ts",
@@ -45,7 +45,7 @@
45
45
  "dependencies": {
46
46
  "@shopify/hydrogen": ">=2025.5",
47
47
  "@shopify/remix-oxygen": "3",
48
- "@weaverse/react": "5.9.3",
48
+ "@weaverse/react": "5.9.4",
49
49
  "@weaverse/schema": "0.8.2",
50
50
  "react": ">=19",
51
51
  "react-dom": ">=19",