@weaverse/next 0.1.0-alpha.7 → 0.1.0-alpha.9

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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts","../src/item.ts","../src/main.tsx","../src/registry.ts","../src/client.ts","../src/theme-settings-store.ts","../src/root-provider.tsx","../src/provider.tsx","../src/hooks.ts","../src/loader.ts","../src/request-info.ts","../src/runtime.ts","../src/revalidate-item.ts","../src/studio-bridge.tsx","../src/studio-router.ts","../src/use-weaverse-next-studio.tsx","../src/renderer.tsx","../src/seo.ts","../src/studio-script-src.ts","../src/studio-connect.tsx"],"names":["WeaverseItemStore","Weaverse","jsx","createSchema","createContext","useRef","useEffect","useMemo","useContext","useSyncExternalStore","useRouter","getRenderablePage","memo","jsxs","Fragment","WeaverseRoot"],"mappings":"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","file":"index.js","sourcesContent":["import type { SchemaType } from '@weaverse/schema'\n\n/**\n * Generate default component data from a schema's `settings` inputs.\n *\n * Mirrors Hydrogen's `generateDataFromSchema` (settings → `{ [name]:\n * defaultValue }`) but is kept local so `@weaverse/next` doesn't depend on\n * `@weaverse/hydrogen`. Falls back to the deprecated `inspector` array when a\n * schema predates `settings`.\n */\nexport function generateDataFromSchema(\n schema: SchemaType | undefined\n): Record<string, unknown> {\n let data: Record<string, unknown> = {}\n if (!schema) {\n return data\n }\n\n let groups =\n (schema.settings as {\n inputs?: { name?: string; defaultValue?: unknown }[]\n }[]) ??\n (schema as { inspector?: typeof groups }).inspector ??\n []\n\n for (let group of groups) {\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 return data\n}\n","import type { ElementData } from '@weaverse/react'\nimport { Weaverse, WeaverseItemStore } from '@weaverse/react'\nimport type { WeaverseNextComponentData } from './types'\nimport { generateDataFromSchema } from './utils'\n\n/**\n * Item store that flattens the serialized item's nested `data` field onto the\n * store and seeds schema defaults — same shape Hydrogen produces, so the\n * shared `@weaverse/react` renderer can spread props at the top level.\n */\nexport class WeaverseNextItem extends WeaverseItemStore {\n constructor(initialData: WeaverseNextComponentData, weaverse: Weaverse) {\n super(initialData as ElementData, weaverse)\n let { data, ...rest } = initialData\n let schemaData = generateDataFromSchema(this.Element?.schema)\n Object.assign(this._store, schemaData, data, rest)\n }\n}\n\n/**\n * Register the Next item constructor globally. Idempotent: calling it more than\n * once is safe. Invoked by the renderer before it builds a Weaverse instance.\n */\nexport function ensureNextItemConstructor() {\n if (\n !Weaverse.ItemConstructor ||\n Weaverse.ItemConstructor === WeaverseItemStore ||\n Weaverse.ItemConstructor === WeaverseNextItem\n ) {\n Weaverse.ItemConstructor = WeaverseNextItem\n }\n}\n","import { createSchema, type SchemaType } from '@weaverse/schema'\nimport type { HTMLAttributes, RefObject } from 'react'\nimport type { WeaverseNextComponent, WeaverseNextComponentProps } from './types'\n\n/**\n * Default `main` root component.\n *\n * A Weaverse page tree is a flat `items` array with a single root item of type\n * `main` whose `children` are the page's top-level sections. Hydrogen ships its\n * own `main`; the Next adapter provides this minimal, framework-neutral\n * equivalent so consumers don't have to register one just to render a basic\n * page tree (omitting it would leave child sections unrendered).\n *\n * It renders `children` and forwards the Weaverse DOM attributes the shared\n * renderer injects (`data-wv-id`, `data-wv-type`, `ref`, `className`, ...rest)\n * onto the root element. `loaderData` is adapter-internal and stripped so it\n * never lands on the DOM node.\n */\nfunction Main(\n props: WeaverseNextComponentProps & {\n ref?: RefObject<HTMLDivElement | null>\n }\n) {\n let { children, loaderData, ...rest } = props\n // `rest` carries the Weaverse-injected DOM attributes (data-wv-*, ref,\n // className). They are all valid div attributes, so the cast is safe.\n return <div {...(rest as HTMLAttributes<HTMLDivElement>)}>{children}</div>\n}\nMain.displayName = 'main'\n\n/** Schema for the default {@link Main} root component. Type is exactly `main`. */\nexport const mainSchema: SchemaType = createSchema({\n type: 'main',\n title: 'Main',\n})\n\n/**\n * Default `main` component module, registered ahead of user components by\n * {@link registerWeaverseNextComponents}. Kept package-internal — consumers\n * override it simply by registering their own component with `type: 'main'`.\n */\nexport const defaultMainComponent: WeaverseNextComponent = {\n default: Main,\n schema: mainSchema,\n}\n","import { Weaverse } from '@weaverse/react'\nimport { ensureNextItemConstructor } from './item'\nimport { defaultMainComponent } from './main'\nimport type { WeaverseNextComponent } from './types'\n\nconst MAIN_TYPE = 'main'\n\n/**\n * Component types already pushed into the element registry. Registration is\n * idempotent by `schema.type`, so callers may pass fresh arrays per request\n * without causing repeated global registry writes.\n */\nconst registeredComponentTypes = new Set<string>()\n\n/**\n * Register Next adapter components with the shared Weaverse element registry.\n *\n * This mutates global Weaverse runtime state, so callers should run it while\n * creating their app/client wiring, not from a React render body.\n *\n * A default `main` root component is always registered first so consumers don't\n * have to register one for basic page-tree rendering. If the consumer registers\n * their own `main`, that one is preferred: we only prepend the default when the\n * provided components don't already include a `main`, so a user-provided `main`\n * never collides with (or is shadowed by) the default.\n */\nexport function registerWeaverseNextComponents(\n components: WeaverseNextComponent[]\n) {\n ensureNextItemConstructor()\n\n let hasUserMain = components.some(\n (component) => component.schema?.type === MAIN_TYPE\n )\n let effectiveComponents = hasUserMain\n ? components\n : [defaultMainComponent, ...components]\n\n for (let component of effectiveComponents) {\n let type = component.schema.type\n let element = {\n type,\n Component: component.default,\n schema: component.schema,\n loader: component.loader,\n }\n\n if (type === MAIN_TYPE && hasUserMain) {\n // `main` is the only built-in default. If a consumer registers their own\n // root component after the default was already installed by another\n // client/test/request, prefer the consumer version by replacing the global\n // registry entry explicitly.\n Weaverse.elementRegistry.set(type, element)\n registeredComponentTypes.add(type)\n continue\n }\n\n if (type && !registeredComponentTypes.has(type)) {\n Weaverse.registerElement(element)\n registeredComponentTypes.add(type)\n }\n }\n}\n","import type { SchemaType } from '@weaverse/schema'\nimport { registerWeaverseNextComponents } from './registry'\nimport type {\n WeaverseNextClient,\n WeaverseNextClientConfig,\n WeaverseNextCommerceContext,\n WeaverseNextComponent,\n WeaverseNextLoaderData,\n WeaverseNextLoadPageInput,\n WeaverseNextRequestContext,\n WeaverseNextStorefront,\n} from './types'\nimport { generateDataFromSchema } from './utils'\n\n/**\n * Request-safe Weaverse client for Next.js. Holds the component registry, theme\n * data, request/commerce context, and the currently loaded page payload.\n *\n * Unlike Hydrogen's `WeaverseClient`, it never receives a React Router\n * `Request`/`LoaderFunctionArgs`. Network I/O is delegated to `fetchPage` /\n * `fetchThemeSettings` injected through config, keeping v0 testable without\n * real Weaverse API calls.\n */\nclass NextClient implements WeaverseNextClient {\n projectId: string\n components: WeaverseNextComponent[]\n themeSchema?: unknown\n themeSettings: Record<string, unknown>\n requestContext?: WeaverseNextRequestContext\n commerce?: WeaverseNextCommerceContext\n data: WeaverseNextLoaderData | null = null\n dataContext: Record<string, unknown> = {}\n\n private readonly _fetchPage?: WeaverseNextClientConfig['fetchPage']\n private readonly _fetchThemeSettings?: WeaverseNextClientConfig['fetchThemeSettings']\n\n constructor(config: WeaverseNextClientConfig) {\n this.projectId = config.projectId\n this.components = config.components\n registerWeaverseNextComponents(this.components)\n this.themeSchema = config.themeSchema\n // Seed `themeSchema` defaults before merchant-provided overrides, mirroring\n // Hydrogen's `loadThemeSettings` (schema defaults under remote `theme`).\n // Without this, `useThemeSettings()` would miss any setting the merchant\n // never explicitly overrode.\n this.themeSettings = {\n ...generateDataFromSchema(config.themeSchema as SchemaType | undefined),\n ...config.themeSettings,\n }\n this.requestContext = config.requestContext\n this.commerce = config.commerce\n this._fetchPage = config.fetchPage\n this._fetchThemeSettings = config.fetchThemeSettings\n }\n\n /** Compatibility alias so loaders can call `weaverse.storefront.query(...)`. */\n get storefront(): WeaverseNextStorefront | undefined {\n return this.commerce?.storefront\n }\n\n loadPage = (\n input: WeaverseNextLoadPageInput = {}\n ): Promise<WeaverseNextLoaderData | null> => {\n if (!this._fetchPage) {\n throw new Error(\n '[WeaverseNextClient] loadPage requires a `fetchPage` function in client config.'\n )\n }\n return this._fetchPage(input)\n }\n\n loadThemeSettings = (\n context?: WeaverseNextRequestContext\n ): Promise<unknown> => {\n if (!this._fetchThemeSettings) {\n throw new Error(\n '[WeaverseNextClient] loadThemeSettings requires a `fetchThemeSettings` function in client config.'\n )\n }\n return this._fetchThemeSettings(context ?? this.requestContext)\n }\n}\n\n/**\n * Create a {@link WeaverseNextClient} from explicit config.\n *\n * @example\n * ```ts\n * let client = createWeaverseNextClient({\n * projectId: process.env.WEAVERSE_PROJECT_ID!,\n * components,\n * commerce: { storefront },\n * fetchPage: async ({ type, handle }) => fetchWeaversePage({ type, handle }),\n * })\n * ```\n */\nexport function createWeaverseNextClient(\n config: WeaverseNextClientConfig\n): WeaverseNextClient {\n return new NextClient(config)\n}\n","import type { WeaverseNextThemeSettingsStore } from './types'\n\nexport interface CreateWeaverseNextThemeSettingsStoreOptions {\n publicEnv?: Record<string, string | undefined>\n schema?: unknown\n settings?: Record<string, unknown>\n}\n\n/**\n * Small external store shape compatible with the Studio bridge and React's\n * `useSyncExternalStore` contract. The bridge calls `updateThemeSettings` during\n * live theme edits, so keep that method name stable.\n */\nexport function createWeaverseNextThemeSettingsStore(\n options: CreateWeaverseNextThemeSettingsStoreOptions = {}\n): WeaverseNextThemeSettingsStore {\n let listeners = new Set<() => void>()\n let store: WeaverseNextThemeSettingsStore = {\n publicEnv: options.publicEnv,\n schema: options.schema,\n settings: { ...(options.settings ?? {}) },\n getServerSnapshot: () => store.settings,\n getSnapshot: () => store.settings,\n subscribe: (listener: () => void) => {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n },\n updateThemeSettings: (next: Record<string, unknown>) => {\n store.settings = { ...store.settings, ...next }\n for (let listener of listeners) {\n listener()\n }\n },\n }\n\n return store\n}\n","'use client'\n\nimport {\n createContext,\n type ReactNode,\n useEffect,\n useMemo,\n useRef,\n} from 'react'\nimport { WeaverseNextContext, type WeaverseNextContextValue } from './provider'\nimport { createWeaverseNextThemeSettingsStore } from './theme-settings-store'\nimport type { WeaverseNextThemeSettingsStore } from './types'\n\nexport interface WeaverseNextRootContextValue {\n themeSettingsStore: WeaverseNextThemeSettingsStore\n}\n\n/**\n * Ambient root-scoped context. Route-level `WeaverseNextProvider` reads this to\n * adopt the shared theme settings store instead of creating its own.\n */\nexport const WeaverseNextRootContext =\n createContext<WeaverseNextRootContextValue | null>(null)\n\nexport interface WeaverseNextRootProviderProps {\n children: ReactNode\n /** Root-loaded theme settings (published-mode fetch, no design-mode context). */\n initialThemeSettings?: Record<string, unknown>\n publicEnv?: Record<string, string | undefined>\n themeSchema?: unknown\n}\n\n/**\n * Root-scoped client boundary that owns the single `WeaverseNextThemeSettingsStore`\n * for the whole app session, matching Hydrogen's `withWeaverse()` root store.\n * Mount once in `app/layout.tsx`, above `Header`/`Footer`/global modules and any\n * route-level `WeaverseNextProvider`.\n *\n * Also renders `WeaverseNextContext` with a minimal value so `useThemeSettings()`\n * works for components mounted directly under this provider, even without a\n * route-level `WeaverseNextProvider` above them.\n *\n * @example\n * ```tsx\n * <WeaverseNextRootProvider initialThemeSettings={theme.theme} themeSchema={theme.schema}>\n * <Header />\n * {children}\n * <Footer />\n * </WeaverseNextRootProvider>\n * ```\n */\nexport function WeaverseNextRootProvider(props: WeaverseNextRootProviderProps) {\n let { children, initialThemeSettings, themeSchema, publicEnv } = props\n\n // `useRef`, not `useMemo`: a parent re-render must never replace this store —\n // it is the single instance Studio's `updateThemeSettings()` mutates in place.\n let storeRef = useRef<WeaverseNextThemeSettingsStore | null>(null)\n if (!storeRef.current) {\n storeRef.current = createWeaverseNextThemeSettingsStore({\n publicEnv,\n schema: themeSchema,\n settings: initialThemeSettings,\n })\n }\n let themeSettingsStore = storeRef.current\n\n // If `initialThemeSettings` changes after mount (e.g. root revalidation),\n // update the existing store in place instead of replacing it. This is an\n // effect because external store updates are side effects; the initial render\n // is already seeded synchronously by store construction above.\n let appliedThemeSettingsRef = useRef(initialThemeSettings)\n useEffect(() => {\n if (\n initialThemeSettings &&\n appliedThemeSettingsRef.current !== initialThemeSettings\n ) {\n themeSettingsStore.updateThemeSettings(initialThemeSettings)\n appliedThemeSettingsRef.current = initialThemeSettings\n }\n }, [initialThemeSettings, themeSettingsStore])\n\n // `themeSettingsStore` is `useRef`-stable, so memoizing on it (rather than\n // recreating these plain objects every render) keeps `useThemeSettings()`\n // consumers (Header, Footer, ...) from re-rendering on every root re-render.\n let rootContextValue = useMemo<WeaverseNextRootContextValue>(\n () => ({ themeSettingsStore }),\n [themeSettingsStore]\n )\n let contextValue = useMemo<WeaverseNextContextValue>(\n () => ({\n themeSettings: themeSettingsStore.getSnapshot(),\n themeSettingsStore,\n }),\n [themeSettingsStore]\n )\n\n return (\n <WeaverseNextRootContext.Provider value={rootContextValue}>\n <WeaverseNextContext.Provider value={contextValue}>\n {children}\n </WeaverseNextContext.Provider>\n </WeaverseNextRootContext.Provider>\n )\n}\n","'use client'\n\nimport {\n createContext,\n type ReactNode,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from 'react'\nimport { WeaverseNextRootContext } from './root-provider'\nimport { createWeaverseNextThemeSettingsStore } from './theme-settings-store'\nimport type {\n WeaverseNextClient,\n WeaverseNextCommerceContext,\n WeaverseNextThemeSettingsStore,\n} from './types'\n\nconst EMPTY_THEME_SETTINGS: Record<string, unknown> = {}\n\n/**\n * Value carried by {@link WeaverseNextContext}. Holds the explicit data\n * boundaries that replace React Router's `useLoaderData` /\n * `useRouteLoaderData` inside sections.\n */\nexport interface WeaverseNextContextValue {\n client?: WeaverseNextClient\n commerce?: WeaverseNextCommerceContext\n pageData?: unknown\n rootData?: unknown\n themeSettings: Record<string, unknown>\n themeSettingsStore: WeaverseNextThemeSettingsStore\n}\n\n/**\n * Null sentinel default lets hooks detect usage outside the provider and throw\n * a clear error instead of silently returning empty data.\n */\nexport const WeaverseNextContext =\n createContext<WeaverseNextContextValue | null>(null)\n\nexport interface WeaverseNextProviderProps {\n children: ReactNode\n client?: WeaverseNextClient\n /** App-provided commerce context (storefront/cart/customer). */\n commerce?: WeaverseNextCommerceContext\n /** Explicit page/route commerce data (replaces section-level `useLoaderData`). */\n pageData?: unknown\n /** Explicit root/global data (replaces `useRouteLoaderData('root')`). */\n rootData?: unknown\n /** Theme settings override; falls back to `client.themeSettings`. */\n themeSettings?: Record<string, unknown>\n}\n\n/**\n * Client boundary that supplies explicit root/page/commerce data to Weaverse\n * sections. Next-native replacement for `withWeaverse` + route loader data —\n * no React Router route matches are emulated.\n *\n * In App Router, create/pass `client` only from a client component wrapper. A\n * `WeaverseNextClient` contains functions and component references, so it is\n * not serializable across a Server Component → Client Component boundary.\n *\n * @example\n * ```tsx\n * 'use client'\n *\n * <WeaverseNextProvider client={client} rootData={rootData} pageData={pageData} commerce={commerce}>\n * <WeaverseNextRenderer />\n * </WeaverseNextProvider>\n * ```\n */\nexport function WeaverseNextProvider(props: WeaverseNextProviderProps) {\n let { children, client, rootData, pageData, commerce, themeSettings } = props\n let rootContext = useContext(WeaverseNextRootContext)\n\n let themeSettingsValue =\n themeSettings ?? client?.themeSettings ?? EMPTY_THEME_SETTINGS\n\n // Fallback store for apps that don't mount `WeaverseNextRootProvider`. Not\n // created at all when a root store is present, so exactly one\n // `WeaverseNextThemeSettingsStore` exists per page load either way.\n let ownThemeSettingsStore = useMemo(() => {\n if (rootContext) {\n return null\n }\n return createWeaverseNextThemeSettingsStore({\n schema: client?.themeSchema,\n settings: themeSettingsValue,\n })\n }, [rootContext, client?.themeSchema, themeSettingsValue])\n\n let themeSettingsStore =\n rootContext?.themeSettingsStore ??\n (ownThemeSettingsStore as WeaverseNextThemeSettingsStore)\n\n // When adopting the root store, route-supplied theme data augments it in\n // place (merge), never replaces it — Studio and root `Header`/`Footer` must\n // keep observing the same instance. Guarded so a stable `themeSettingsValue`\n // across re-renders doesn't re-merge/re-notify every render.\n //\n // This runs in an effect, not render: mutating a store shared outside this\n // component's subtree is a side effect, and render functions must stay\n // pure under concurrent React (retried/discarded renders, StrictMode\n // double-invocation). The root's initial theme is authoritative for SSR;\n // a route's `themeSettings`/`client.themeSettings` override applies after\n // client mount instead of racing a render-phase store mutation. Apps that\n // don't mount `WeaverseNextRootProvider` are unaffected — `themeSettings`\n // still renders synchronously on SSR via `ownThemeSettingsStore` below.\n let mergedIntoRootRef = useRef<Record<string, unknown> | undefined>(undefined)\n useEffect(() => {\n if (\n rootContext &&\n themeSettingsValue !== EMPTY_THEME_SETTINGS &&\n mergedIntoRootRef.current !== themeSettingsValue\n ) {\n rootContext.themeSettingsStore.updateThemeSettings(themeSettingsValue)\n mergedIntoRootRef.current = themeSettingsValue\n }\n }, [rootContext, themeSettingsValue])\n\n // Do not depend on `themeSettingsValue` here. In fallback mode it is already\n // represented by a new `themeSettingsStore`; in root-adoption mode the\n // post-mount merge effect notifies `useThemeSettings()` subscribers. Including\n // it would recreate this context with a stale root snapshot before the effect\n // fires, causing an avoidable extra render.\n let value = useMemo<WeaverseNextContextValue>(\n () => ({\n client,\n rootData,\n pageData,\n commerce: commerce ?? client?.commerce,\n themeSettings: themeSettingsStore.getSnapshot(),\n themeSettingsStore,\n }),\n [client, rootData, pageData, commerce, themeSettingsStore]\n )\n\n return (\n <WeaverseNextContext.Provider value={value}>\n {children}\n </WeaverseNextContext.Provider>\n )\n}\n","'use client'\n\nimport { useContext, useSyncExternalStore } from 'react'\nimport { WeaverseNextContext } from './provider'\nimport type { WeaverseNextCommerceContext } from './types'\n\nconst OUTSIDE_PROVIDER_ERROR = 'must be used inside a <WeaverseNextProvider>.'\n\nfunction useWeaverseNextContext(hookName: string) {\n let context = useContext(WeaverseNextContext)\n if (!context) {\n throw new Error(`[@weaverse/next] ${hookName} ${OUTSIDE_PROVIDER_ERROR}`)\n }\n return context\n}\n\n/**\n * Read explicit root/global data passed to the provider. Next-native\n * replacement for `useRouteLoaderData('root')`.\n */\nexport function useWeaverseRootData<T = unknown>(): T {\n return useWeaverseNextContext('useWeaverseRootData').rootData as T\n}\n\n/**\n * Read explicit page/route commerce data passed to the provider. Next-native\n * replacement for section-level `useLoaderData()`.\n */\nexport function useWeaversePageData<T = unknown>(): T {\n return useWeaverseNextContext('useWeaversePageData').pageData as T\n}\n\n/** Read the app-provided commerce context (storefront/cart/customer). */\nexport function useWeaverseCommerce<T = WeaverseNextCommerceContext>(): T {\n return useWeaverseNextContext('useWeaverseCommerce').commerce as T\n}\n\n/**\n * Read live Weaverse theme settings. The Studio bridge updates the provider's\n * external store via `updateThemeSettings`, so components re-render during live\n * design-mode edits.\n */\nexport function useThemeSettings<T = Record<string, unknown>>(): T {\n let { themeSettingsStore } = useWeaverseNextContext('useThemeSettings')\n return useSyncExternalStore(\n themeSettingsStore.subscribe,\n themeSettingsStore.getSnapshot,\n themeSettingsStore.getServerSnapshot\n ) as T\n}\n","import type {\n WeaverseNextClient,\n WeaverseNextCommerceContext,\n WeaverseNextComponent,\n WeaverseNextComponentData,\n WeaverseNextLoaderData,\n WeaverseNextRequestContext,\n} from './types'\nimport { generateDataFromSchema } from './utils'\n\nexport interface RunComponentLoadersArgs {\n client: WeaverseNextClient\n commerce?: WeaverseNextCommerceContext\n context?: WeaverseNextRequestContext\n /** Page payload to walk; defaults to `client.data`. */\n data?: WeaverseNextLoaderData | null\n}\n\nfunction isItemNode(node: unknown): node is WeaverseNextComponentData {\n return (\n typeof node === 'object' &&\n node !== null &&\n typeof (node as WeaverseNextComponentData).type === 'string'\n )\n}\n\nfunction cloneItem(item: WeaverseNextComponentData): WeaverseNextComponentData {\n return {\n ...item,\n children: Array.isArray(item.children)\n ? item.children.map((child) =>\n isItemNode(child) ? cloneItem(child) : { ...child }\n )\n : item.children,\n }\n}\n\n/**\n * Walk a serialized page tree and run each registered component's `loader`,\n * attaching the result to the item as `loaderData`.\n *\n * Loaders receive explicit `commerce.storefront` (and `weaverse.storefront` as\n * a compatibility alias via the client). Children are walked recursively when\n * they are inline item objects; flat `items` arrays are covered by the\n * top-level walk.\n *\n * @returns a cloned `data` object with `loaderData` attached to cloned items.\n */\nexport async function runWeaverseComponentLoaders(\n args: RunComponentLoadersArgs\n): Promise<WeaverseNextLoaderData | null> {\n let { client, context, commerce } = args\n let sourceData = args.data ?? client.data\n if (!sourceData) {\n return null\n }\n if (!sourceData.page.items.length) {\n return sourceData\n }\n\n let data: WeaverseNextLoaderData = {\n ...sourceData,\n page: {\n ...sourceData.page,\n items: sourceData.page.items.map(cloneItem),\n },\n }\n let items = data.page.items\n\n let componentMap = new Map<string, WeaverseNextComponent>()\n for (let component of client.components) {\n if (component?.schema?.type) {\n componentMap.set(component.schema.type, component)\n }\n }\n\n let visited = new Set<string>()\n let resolvedContext = context ?? client.requestContext\n let resolvedCommerce = commerce ?? client.commerce\n\n // Per-call `weaverse` alias. When a request-scoped `commerce` is passed, the\n // `weaverse.storefront` compatibility alias must resolve to *that* storefront,\n // not the client's construction-time commerce. Pilot-style loaders call\n // `weaverse.storefront.query(...)`, so a stale alias would query the wrong\n // (or an undefined) storefront. When no override is given we reuse the client\n // as-is to preserve its prototype getters.\n let resolvedWeaverse: WeaverseNextClient =\n resolvedCommerce === client.commerce\n ? client\n : {\n ...client,\n commerce: resolvedCommerce,\n storefront: resolvedCommerce?.storefront,\n }\n\n async function walk(nodes: WeaverseNextComponentData[]) {\n for (let item of nodes) {\n if (!item || visited.has(item.id)) {\n continue\n }\n visited.add(item.id)\n\n let component = componentMap.get(item.type)\n if (component?.loader) {\n try {\n item.loaderData = await component.loader({\n data: { ...generateDataFromSchema(component.schema), ...item.data },\n weaverse: resolvedWeaverse,\n context: resolvedContext,\n commerce: resolvedCommerce,\n })\n } catch (error) {\n console.warn('❌ Item loader run failed.', item.type, item.id, error)\n }\n }\n\n let children = item.children\n if (Array.isArray(children)) {\n let inlineChildren = children.filter(\n isItemNode\n ) as WeaverseNextComponentData[]\n if (inlineChildren.length) {\n await walk(inlineChildren)\n }\n }\n }\n }\n\n await walk(items)\n return data\n}\n","import type {\n WeaverseNextRequestContext,\n WeaverseNextRequestInfo,\n} from './types'\n\nfunction toUrl(value: string | URL): URL {\n return typeof value === 'string' ? new URL(value, 'http://localhost') : value\n}\n\nfunction getSearchParamsFromContext(\n context?: WeaverseNextRequestContext\n): URLSearchParams {\n if (context?.searchParams) {\n return new URLSearchParams(context.searchParams)\n }\n\n if (context?.url) {\n let url = toUrl(context.url)\n return new URLSearchParams(url.searchParams)\n }\n\n return new URLSearchParams()\n}\n\nfunction getPathnameFromContext(context?: WeaverseNextRequestContext): string {\n if (context?.pathname) {\n return context.pathname\n }\n\n if (context?.url) {\n let url = toUrl(context.url)\n return url.pathname || '/'\n }\n\n return '/'\n}\n\nfunction coerceQueryValue(value: string): string | boolean {\n if (value === 'true') {\n return true\n }\n if (value === 'false') {\n return false\n }\n return value\n}\n\nfunction toQueryRecord(\n searchParams: URLSearchParams\n): Record<string, string | boolean> {\n let queries: Record<string, string | boolean> = {}\n for (let [key, value] of searchParams.entries()) {\n queries[key] = coerceQueryValue(value)\n }\n return queries\n}\n\nconst TRANSIENT_STUDIO_PARAMS = new Set([\n 'weaverseDraftItem',\n // Legacy name from the original design-mode draft-item spike. Keep it out of\n // runtime requestInfo too, in case an older Builder bundle is in front of a\n // newer Next storefront.\n '__weaverseDraftItem',\n])\n\nfunction getRequestInfoSearchParams(\n context?: WeaverseNextRequestContext\n): URLSearchParams {\n let searchParams = new URLSearchParams(getSearchParamsFromContext(context))\n for (let key of TRANSIENT_STUDIO_PARAMS) {\n searchParams.delete(key)\n }\n return searchParams\n}\n\n/**\n * Build the Hydrogen-like request info shape consumed by the Studio bridge.\n * Duplicate query keys keep the last value, matching `URLSearchParams` iteration\n * assignment and Hydrogen's practical query-object behavior.\n */\nexport function buildWeaverseNextRequestInfo(\n context?: WeaverseNextRequestContext\n): WeaverseNextRequestInfo {\n let searchParams = getRequestInfoSearchParams(context)\n let search = searchParams.toString()\n\n return {\n pathname: getPathnameFromContext(context),\n search: search ? `?${search}` : '',\n queries: toQueryRecord(searchParams),\n ...(context?.i18n ? { i18n: context.i18n } : {}),\n }\n}\n","import { Weaverse } from '@weaverse/react'\nimport { ensureNextItemConstructor } from './item'\nimport { buildWeaverseNextRequestInfo } from './request-info'\nimport { createWeaverseNextThemeSettingsStore } from './theme-settings-store'\nimport type {\n WeaverseNextClient,\n WeaverseNextLoaderData,\n WeaverseNextPageData,\n WeaverseNextRequestInfo,\n WeaverseNextRuntimeConfig,\n WeaverseNextRuntimeInternal,\n} from './types'\n\ndeclare global {\n interface Window {\n __weaverse?: WeaverseNextRuntime\n __weaverses?: Record<string, WeaverseNextRuntime>\n }\n}\n\ntype StudioBoundRuntime = WeaverseNextRuntime & {\n __weaverseNextStudioBound?: boolean\n __weaverseNextRequestKey?: string\n __weaverseNextLatestData?: WeaverseNextPageData & { rootId: string }\n}\n\nfunction getRuntimeWindow(): Window | undefined {\n return typeof window === 'undefined' ? undefined : window\n}\n\nfunction getRenderablePage(\n data: WeaverseNextLoaderData\n): WeaverseNextPageData & { rootId: string } {\n let page = data.page\n let rootId =\n page.rootId ??\n page.items.find((item) => item.type === 'main')?.id ??\n page.items[0]?.id ??\n page.id\n return { ...page, rootId }\n}\n\nfunction getConfigString(\n configs: Record<string, unknown> | undefined,\n key: string\n): string | undefined {\n let value = configs?.[key]\n return typeof value === 'string' ? value : undefined\n}\n\nfunction getRecordString(\n record: Record<string, unknown> | undefined,\n key: string\n): string | undefined {\n let value = record?.[key]\n return typeof value === 'string' ? value : undefined\n}\n\nfunction resolveProjectId(\n client: WeaverseNextClient | undefined,\n data: WeaverseNextLoaderData,\n fallback: string\n): string {\n let projectId = client?.projectId\n if (projectId) {\n return projectId\n }\n\n let configProjectId = getConfigString(data.configs, 'projectId')\n if (configProjectId) {\n return configProjectId\n }\n\n return getRecordString(data.project, 'id') ?? fallback\n}\n\nfunction resolveDataContext(config: WeaverseNextRuntimeConfig) {\n if (config.dataContext) {\n return config.dataContext\n }\n if (config.client?.dataContext) {\n return config.client.dataContext\n }\n return {}\n}\n\nfunction getRuntimeKey(pageId: string, requestInfo: WeaverseNextRequestInfo) {\n return `${pageId}:${requestInfo.pathname}:${requestInfo.search}`\n}\n\nfunction registerRuntime(runtime: WeaverseNextRuntime) {\n let runtimeWindow = getRuntimeWindow()\n if (!runtimeWindow) {\n return\n }\n\n runtimeWindow.__weaverses ??= {}\n runtimeWindow.__weaverses[runtime.pageId] = runtime\n runtimeWindow.__weaverse = runtime\n}\n\nexport class WeaverseNextRuntime extends Weaverse {\n pageId: string\n internal: WeaverseNextRuntimeInternal\n requestInfo: WeaverseNextRequestInfo\n isPreviewMode: boolean\n isRevisionPreview: boolean\n sectionType?: string\n translationMap: Record<string, unknown> = {}\n translationLocale = ''\n translationLanguageId = ''\n\n constructor(config: WeaverseNextRuntimeConfig) {\n let { client, data } = config\n let page = getRenderablePage(data)\n let configs = data.configs\n let requestContext = client?.requestContext\n let projectId = resolveProjectId(client, data, page.id)\n\n ensureNextItemConstructor()\n super({\n projectId,\n data: page,\n isDesignMode: requestContext?.isDesignMode ?? false,\n weaverseHost: getConfigString(configs, 'weaverseHost'),\n weaverseVersion: getConfigString(configs, 'weaverseVersion'),\n })\n\n this.pageId = page.id\n this.dataContext = resolveDataContext(config)\n this.requestInfo = buildWeaverseNextRequestInfo(requestContext)\n this.isDesignMode = requestContext?.isDesignMode ?? false\n this.isPreviewMode = requestContext?.isPreviewMode ?? false\n this.isRevisionPreview = requestContext?.isRevisionPreview ?? false\n this.sectionType = requestContext?.sectionType\n\n this.internal = {\n navigate: config.navigate,\n pageAssignment: data.pageAssignment,\n project: data.project,\n revalidate: config.revalidate,\n themeSettingsStore:\n config.themeSettingsStore ??\n createWeaverseNextThemeSettingsStore({\n schema: client?.themeSchema,\n settings: client?.themeSettings,\n }),\n }\n }\n\n extractTranslationSidecar = () => undefined\n setTranslationSidecar = (\n map: Record<string, unknown> = {},\n locale = '',\n languageId = ''\n ) => {\n this.translationMap = map\n this.translationLocale = locale\n this.translationLanguageId = languageId\n }\n updateTranslation = () => undefined\n getTranslationChanges = () => undefined\n}\n\nexport function createWeaverseNextRuntime(\n config: WeaverseNextRuntimeConfig\n): WeaverseNextRuntime {\n let requestInfo = buildWeaverseNextRequestInfo(config.client?.requestContext)\n let page = getRenderablePage(config.data)\n let runtimeWindow = getRuntimeWindow()\n let existing = runtimeWindow?.__weaverses?.[page.id] as\n | StudioBoundRuntime\n | undefined\n let requestKey = getRuntimeKey(page.id, requestInfo)\n\n if (existing?.__weaverseNextRequestKey === requestKey) {\n let nextIsDesignMode = config.client?.requestContext?.isDesignMode ?? false\n // In design mode the live Studio runtime owns the page tree, including\n // unsaved drafts. Reapplying loader `page` data here would clobber those\n // edits, so leave the project data untouched and let\n // `bindWeaverseNextStudioRuntime` push the latest state via `refreshStudio`.\n // Published / preview reuse has no draft state, so fresh data still wins.\n if (!(existing.isDesignMode || nextIsDesignMode)) {\n existing.setProjectData(page)\n }\n // Always capture the latest server payload. In design mode the live tree\n // (`existing.data`) is deliberately left untouched above, so it goes stale\n // after an RSC refresh — `bindWeaverseNextStudioRuntime` must report this\n // fresh payload to `refreshStudio`, not the stale tree, or a revalidation\n // (e.g. resource-picker pick) merges back old per-item `loaderData` and the\n // preview keeps rendering the previous resource. Mirrors Hydrogen, which\n // always passes the fresh loader params to `refreshStudio`.\n existing.__weaverseNextLatestData = page\n existing.dataContext = resolveDataContext(config)\n existing.requestInfo = requestInfo\n existing.projectId = resolveProjectId(config.client, config.data, page.id)\n existing.isDesignMode = nextIsDesignMode\n existing.isPreviewMode =\n config.client?.requestContext?.isPreviewMode ?? false\n existing.isRevisionPreview =\n config.client?.requestContext?.isRevisionPreview ?? false\n existing.sectionType = config.client?.requestContext?.sectionType\n existing.weaverseHost =\n getConfigString(config.data.configs, 'weaverseHost') ??\n existing.weaverseHost\n existing.weaverseVersion =\n getConfigString(config.data.configs, 'weaverseVersion') ??\n existing.weaverseVersion\n existing.internal.pageAssignment = config.data.pageAssignment\n existing.internal.project = config.data.project\n if (config.navigate) {\n existing.internal.navigate = config.navigate\n }\n if (config.revalidate) {\n existing.internal.revalidate = config.revalidate\n }\n if (config.themeSettingsStore) {\n existing.internal.themeSettingsStore = config.themeSettingsStore\n }\n registerRuntime(existing)\n return existing\n }\n\n let runtime = new WeaverseNextRuntime(config) as StudioBoundRuntime\n runtime.__weaverseNextRequestKey = requestKey\n runtime.__weaverseNextLatestData = page\n registerRuntime(runtime)\n return runtime\n}\n\nexport function bindWeaverseNextStudioRuntime(runtime: WeaverseNextRuntime) {\n if (!runtime.isDesignMode) {\n return false\n }\n\n let studio = getRuntimeWindow()?.weaverseStudio\n if (!studio) {\n return false\n }\n\n let boundRuntime = runtime as StudioBoundRuntime\n if (!boundRuntime.__weaverseNextStudioBound) {\n studio.init?.(runtime)\n boundRuntime.__weaverseNextStudioBound = true\n return true\n }\n\n // Report the latest server payload (fresh per-item `loaderData`), not the\n // live tree: Builder's `refreshStudio` merges the editor draft's structural\n // edits back on top and only takes the loader payload from this data.\n studio.refreshStudio?.({\n data: boundRuntime.__weaverseNextLatestData ?? runtime.data,\n pageId: runtime.pageId,\n requestInfo: runtime.requestInfo,\n })\n return true\n}\n","import type { WeaverseNextComponentData } from './types'\n\nexport const DEFAULT_REVALIDATE_ENDPOINT = '/api/weaverse/revalidate'\n\n/**\n * Minimal runtime surface the in-place apply needs. Structural (not the\n * concrete `WeaverseNextRuntime` class) so unit tests can drive it with a\n * plain mock.\n */\nexport interface RevalidateItemRuntimeLike {\n itemInstances: Map<\n string,\n {\n setData: (update: Record<string, unknown>) => unknown\n }\n >\n}\n\n/**\n * Studio per-item loader revalidation: POST the unsaved draft item to the\n * app's revalidate route (see `createWeaverseNextRevalidateHandler`) and apply\n * the returned `loaderData` to the live item instance in place.\n *\n * No `router.refresh()` is involved, so the RSC tree is never re-applied — no\n * page remount, no scroll reset, and the draft payload never touches the URL.\n *\n * Throws on any failure (missing route, non-OK response, unknown item) so the\n * Builder Studio bridge can detect the miss and fall back to its legacy\n * refresh-based revalidation for this window.\n */\nexport async function revalidateWeaverseNextItem(\n runtime: RevalidateItemRuntimeLike,\n draftItem: WeaverseNextComponentData,\n endpoint: string = DEFAULT_REVALIDATE_ENDPOINT\n): Promise<void> {\n let instance = runtime.itemInstances.get(draftItem.id)\n if (!instance) {\n throw new Error(\n `[weaverse-next] No live item instance for \"${draftItem.id}\".`\n )\n }\n\n let response = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ draftItem }),\n })\n if (!response.ok) {\n throw new Error(\n `[weaverse-next] Revalidate endpoint responded ${response.status}.`\n )\n }\n\n let { loaderData } = (await response.json()) as { loaderData?: unknown }\n // The item's settings were already mutated by the Studio edit; only the\n // loader payload needs applying. `setData` merges and notifies subscribers,\n // and the new `loaderData` identity is what Builder's revalidation poll\n // observes for completion.\n instance.setData({ loaderData: loaderData ?? null })\n}\n","'use client'\n\nimport { useEffect, useRef } from 'react'\nimport {\n bindWeaverseNextStudioRuntime,\n type WeaverseNextRuntime,\n} from './runtime'\nimport type { WeaverseNextRuntimeInternal } from './types'\n\nconst STUDIO_BIND_RETRY_INTERVAL_MS = 50\nconst STUDIO_BIND_MAX_ATTEMPTS = 100\n\nexport interface WeaverseNextStudioBridgeProps {\n navigate?: WeaverseNextRuntimeInternal['navigate']\n revalidate?: WeaverseNextRuntimeInternal['revalidate']\n revalidateItem?: WeaverseNextRuntimeInternal['revalidateItem']\n runtime: WeaverseNextRuntime\n}\n\n/** Page-level Studio runtime binder. */\nexport function WeaverseNextStudioBridge(props: WeaverseNextStudioBridgeProps) {\n let { runtime, navigate, revalidate, revalidateItem } = props\n let lastRuntimeRef = useRef(runtime)\n let lastRuntimeDataRef = useRef(runtime.data)\n let lastRequestInfoRef = useRef(runtime.requestInfo)\n\n useEffect(() => {\n if (navigate) {\n runtime.internal.navigate = navigate\n }\n if (revalidate) {\n runtime.internal.revalidate = revalidate\n }\n if (revalidateItem) {\n runtime.internal.revalidateItem = revalidateItem\n }\n\n if (bindWeaverseNextStudioRuntime(runtime) || !runtime.isDesignMode) {\n return\n }\n\n let attempts = 0\n let interval = window.setInterval(() => {\n attempts += 1\n if (\n bindWeaverseNextStudioRuntime(runtime) ||\n attempts >= STUDIO_BIND_MAX_ATTEMPTS\n ) {\n window.clearInterval(interval)\n }\n }, STUDIO_BIND_RETRY_INTERVAL_MS)\n\n return () => window.clearInterval(interval)\n }, [runtime, navigate, revalidate, revalidateItem])\n\n useEffect(() => {\n if (lastRuntimeRef.current !== runtime) {\n lastRuntimeRef.current = runtime\n lastRuntimeDataRef.current = runtime.data\n lastRequestInfoRef.current = runtime.requestInfo\n return\n }\n\n if (\n lastRuntimeDataRef.current === runtime.data &&\n lastRequestInfoRef.current === runtime.requestInfo\n ) {\n return\n }\n\n lastRuntimeDataRef.current = runtime.data\n lastRequestInfoRef.current = runtime.requestInfo\n bindWeaverseNextStudioRuntime(runtime)\n }, [runtime, runtime.data, runtime.requestInfo])\n\n return null\n}\n","import type { WeaverseNextRuntimeInternal } from './types'\n\n/**\n * Minimal structural shape of the Next App Router returned by `useRouter()`\n * (`next/navigation`) that the Studio bridge needs. Declared locally — rather\n * than importing `AppRouterInstance` from `next` — so the adapter stays a pure\n * function that unit tests can drive with a plain mock and never pulls\n * `next/navigation` into the test graph.\n */\nexport interface WeaverseNextRouterLike {\n push: (href: string, options?: { scroll?: boolean }) => void\n refresh: () => void\n replace: (href: string, options?: { scroll?: boolean }) => void\n}\n\n/** Resolved Studio navigation/revalidation callbacks for a Next runtime. */\nexport interface WeaverseNextStudioInternals {\n navigate: NonNullable<WeaverseNextRuntimeInternal['navigate']>\n revalidate: NonNullable<WeaverseNextRuntimeInternal['revalidate']>\n}\n\nexport interface CreateWeaverseNextStudioInternalsOptions {\n /** Use `router.replace` instead of `router.push` for navigation. */\n replace?: boolean\n}\n\nfunction shouldResetScroll(\n options?: { preventScrollReset?: boolean } | Record<string, unknown>\n): boolean {\n if (!options || typeof options !== 'object') {\n return true\n }\n return !(options as { preventScrollReset?: boolean }).preventScrollReset\n}\n\n/**\n * Build Studio `navigate` / `revalidate` callbacks from a Next App Router.\n *\n * Maps Hydrogen's React Router semantics onto Next App Router:\n * - `navigate(to, { preventScrollReset })` → `router.push(to, { scroll })`,\n * where `scroll` is the inverse of `preventScrollReset`. Studio passes\n * `preventScrollReset` for in-place edits so the preview viewport is kept,\n * matching React Router's `navigate({ preventScrollReset })`.\n * - `revalidate()` → `router.refresh()`, the App Router's loader-backed refresh\n * and the closest equivalent to React Router's `useRevalidator`.\n *\n * Pure (no React, no `next/navigation`) so it is unit-testable with a mock\n * router; the {@link WeaverseNextRouterLike} contract is the only coupling.\n */\nexport function createWeaverseNextStudioInternals(\n router: WeaverseNextRouterLike,\n options: CreateWeaverseNextStudioInternalsOptions = {}\n): WeaverseNextStudioInternals {\n return {\n navigate: (to, navigateOptions) => {\n let scroll = shouldResetScroll(navigateOptions)\n if (options.replace) {\n router.replace(to, { scroll })\n } else {\n router.push(to, { scroll })\n }\n },\n revalidate: () => {\n router.refresh()\n },\n }\n}\n","'use client'\n\nimport { useRouter } from 'next/navigation'\nimport { useRef } from 'react'\nimport {\n DEFAULT_REVALIDATE_ENDPOINT,\n revalidateWeaverseNextItem,\n} from './revalidate-item'\nimport type { WeaverseNextRuntime } from './runtime'\nimport { WeaverseNextStudioBridge } from './studio-bridge'\nimport {\n type CreateWeaverseNextStudioInternalsOptions,\n createWeaverseNextStudioInternals,\n type WeaverseNextStudioInternals,\n} from './studio-router'\nimport type { WeaverseNextRuntimeInternal } from './types'\n\n/**\n * Resolve stable Studio `navigate` / `revalidate` callbacks from the Next App\n * Router. `useRouter()` is stable across renders, but the derived callbacks are\n * cached in a ref keyed on the router instance so the bridge's bind effect\n * (which depends on `navigate` / `revalidate` identity) doesn't re-run — and\n * re-`refreshStudio` — on every render.\n */\nexport function useWeaverseNextStudioInternals(\n options?: CreateWeaverseNextStudioInternalsOptions\n): WeaverseNextStudioInternals {\n let router = useRouter()\n let ref = useRef<{\n internals: WeaverseNextStudioInternals\n replace: boolean | undefined\n router: typeof router\n } | null>(null)\n\n if (\n !ref.current ||\n ref.current.router !== router ||\n ref.current.replace !== options?.replace\n ) {\n ref.current = {\n internals: createWeaverseNextStudioInternals(router, options),\n replace: options?.replace,\n router,\n }\n }\n\n return ref.current.internals\n}\n\nexport interface WeaverseNextStudioProps\n extends CreateWeaverseNextStudioInternalsOptions {\n /**\n * Route the app mounted with `createWeaverseNextRevalidateHandler`.\n * Defaults to `/api/weaverse/revalidate`.\n */\n revalidateEndpoint?: string\n runtime: WeaverseNextRuntime\n}\n\n/**\n * Page-level Studio binder wired to the Next App Router. Mirrors Hydrogen's\n * `useStudio` (which binds the runtime and feeds it React Router's `navigate` /\n * `revalidate`): it resolves the App Router callbacks via\n * {@link useWeaverseNextStudioInternals} and hands them to\n * {@link WeaverseNextStudioBridge}, so consuming apps get Studio navigation and\n * revalidation without manually wiring `next/navigation`.\n *\n * Client-only — it is the single place `@weaverse/next` touches\n * `next/navigation`, keeping the runtime/renderer and `@weaverse/next/server`\n * free of router imports.\n */\nexport function WeaverseNextStudio(props: WeaverseNextStudioProps) {\n let { runtime, replace, revalidateEndpoint } = props\n let { navigate, revalidate } = useWeaverseNextStudioInternals({ replace })\n let endpoint = revalidateEndpoint ?? DEFAULT_REVALIDATE_ENDPOINT\n // Cache per runtime+endpoint so the bridge bind effect (keyed on callback\n // identity) doesn't re-run — and re-`refreshStudio` — on every render.\n // `itemInstances` is a static registry shared by all Weaverse runtimes, so\n // any live runtime reference resolves the edited item.\n let revalidateItemRef = useRef<{\n endpoint: string\n revalidateItem: NonNullable<WeaverseNextRuntimeInternal['revalidateItem']>\n runtime: WeaverseNextRuntime\n } | null>(null)\n if (\n revalidateItemRef.current?.endpoint !== endpoint ||\n revalidateItemRef.current.runtime !== runtime\n ) {\n revalidateItemRef.current = {\n endpoint,\n revalidateItem: (draftItem) =>\n revalidateWeaverseNextItem(runtime, draftItem, endpoint),\n runtime,\n }\n }\n return (\n <WeaverseNextStudioBridge\n navigate={navigate}\n revalidate={revalidate}\n revalidateItem={revalidateItemRef.current.revalidateItem}\n runtime={runtime}\n />\n )\n}\n","'use client'\n\nimport { WeaverseRoot } from '@weaverse/react'\nimport { memo, useContext, useMemo } from 'react'\nimport { WeaverseNextContext } from './provider'\nimport { createWeaverseNextRuntime } from './runtime'\nimport type {\n WeaverseNextClient,\n WeaverseNextLoaderData,\n WeaverseNextPageData,\n} from './types'\nimport { WeaverseNextStudio } from './use-weaverse-next-studio'\n\nconst EMPTY_DATA_CONTEXT: Record<string, unknown> = {}\n\nfunction getRenderablePage(\n data: WeaverseNextLoaderData | null | undefined\n): (WeaverseNextPageData & { rootId: string }) | null {\n let page = data?.page\n if (!page) {\n return null\n }\n let rootId =\n page.rootId ??\n page.items.find((item) => item.type === 'main')?.id ??\n page.items[0]?.id ??\n page.id\n return { ...page, rootId }\n}\n\nexport interface WeaverseNextRendererProps {\n /** Client to render from. Defaults to the provider's client. */\n client?: WeaverseNextClient\n /** Page payload to render. Defaults to `client.data`. */\n data?: WeaverseNextLoaderData | null\n /** Data-connector context for `{{...}}` template replacement. */\n dataContext?: Record<string, unknown>\n}\n\n/**\n * Render a serialized Weaverse page tree through `@weaverse/react` primitives.\n *\n * Reads the client/page data from {@link WeaverseNextContext} when no props are\n * passed, or accepts an explicit `client` + `data` for standalone use. Builds a\n * framework-neutral `Weaverse` core instance (no React Router hooks) and hands\n * it to the shared `WeaverseRoot`.\n */\nexport const WeaverseNextRenderer = memo(function WeaverseNextRendererComponent(\n props: WeaverseNextRendererProps\n) {\n let context = useContext(WeaverseNextContext)\n let client = props.client ?? context?.client\n let data = props.data ?? client?.data ?? null\n let dataContext =\n props.dataContext ?? client?.dataContext ?? EMPTY_DATA_CONTEXT\n\n let page = useMemo(() => getRenderablePage(data), [data])\n\n let weaverse = useMemo(() => {\n if (!page) {\n return null\n }\n\n return createWeaverseNextRuntime({\n client,\n data: { ...(data as WeaverseNextLoaderData), page },\n dataContext,\n themeSettingsStore: context?.themeSettingsStore,\n })\n }, [client, page, data, dataContext, context?.themeSettingsStore])\n\n if (!weaverse) {\n return null\n }\n\n return (\n <>\n <WeaverseRoot context={weaverse} />\n <WeaverseNextStudio runtime={weaverse} />\n </>\n )\n})\n","import type { PageSEOData } from '@weaverse/schema'\nimport type { WeaverseNextLoaderData, WeaverseNextPageData } from './types'\n\nexport interface WeaverseNextSeoMetadata {\n alternates?: { canonical?: string }\n description?: string\n keywords?: string\n openGraph?: {\n description?: string\n images?: string[]\n title?: string\n type?: string\n }\n robots: {\n follow: boolean\n index: boolean\n }\n title?: string\n twitter?: {\n card?: string\n description?: string\n images?: string[]\n title?: string\n }\n}\n\nfunction hasOpenGraphContent(seo: PageSEOData['openGraph']): boolean {\n return Boolean(seo?.title || seo?.description || seo?.image || seo?.type)\n}\n\nfunction hasTwitterContent(seo: PageSEOData['twitter']): boolean {\n return Boolean(seo?.title || seo?.description || seo?.image || seo?.cardType)\n}\n\nexport function formatWeaverseNextSeoMetadata(\n seo: PageSEOData | null | undefined\n): WeaverseNextSeoMetadata {\n let index = seo?.robots?.index !== false\n let follow = seo?.robots?.follow !== false\n let metadata: WeaverseNextSeoMetadata = {\n robots: { index, follow },\n }\n\n if (!seo) {\n return metadata\n }\n\n if (seo.title) {\n metadata.title = seo.title\n }\n if (seo.description) {\n metadata.description = seo.description\n }\n if (seo.keywords) {\n metadata.keywords = seo.keywords\n }\n if (seo.canonicalUrl) {\n metadata.alternates = { canonical: seo.canonicalUrl }\n }\n\n let openGraph = seo.openGraph\n if (hasOpenGraphContent(openGraph)) {\n metadata.openGraph = {\n title: openGraph?.title,\n description: openGraph?.description,\n images: openGraph?.image ? [openGraph.image] : undefined,\n type: openGraph?.type || 'website',\n }\n }\n\n let twitter = seo.twitter\n if (hasTwitterContent(twitter)) {\n metadata.twitter = {\n card: twitter?.cardType || 'summary',\n title: twitter?.title,\n description: twitter?.description,\n images: twitter?.image ? [twitter.image] : undefined,\n }\n }\n\n return metadata\n}\n\nexport function getWeaverseNextSeoMetadata(\n data:\n | WeaverseNextLoaderData\n | WeaverseNextPageData\n | { page?: WeaverseNextPageData | null }\n | null\n | undefined\n): WeaverseNextSeoMetadata {\n if (!data) {\n return formatWeaverseNextSeoMetadata(null)\n }\n let page =\n 'items' in data && 'id' in data\n ? (data as WeaverseNextPageData)\n : ((data as { page?: WeaverseNextPageData | null }).page ?? null)\n return formatWeaverseNextSeoMetadata(page?.seo ?? null)\n}\n","import type { WeaverseNextRequestContext } from './types'\n\n/**\n * Weaverse-controlled apex domains the Studio bridge may be served from\n * (matched on the host itself and any subdomain), mirroring Hydrogen's\n * `TRUSTED_STUDIO_DOMAINS`.\n */\nconst TRUSTED_STUDIO_DOMAINS = ['weaverse.io', 'weaverse.dev']\n\nfunction isLoopbackHostname(hostname: string): boolean {\n return (\n hostname === 'localhost' ||\n hostname === '127.0.0.1' ||\n hostname.endsWith('.localhost')\n )\n}\n\nfunction normalizeOrigin(value: string | null): string | null {\n if (!value) {\n return null\n }\n\n try {\n return new URL(value).origin\n } catch {\n return null\n }\n}\n\n/**\n * Whether `origin` is one we trust to serve the Studio bridge script. Matches\n * Hydrogen's `isTrustedStudioHost`: trusts `weaverse.io` / `weaverse.dev` and\n * their subdomains over https, plus loopback (`localhost` / `*.localhost` /\n * `127.0.0.1`) — but only when the storefront itself is loopback (genuine\n * local-builder dev). Loopback is the only place http is allowed; every other\n * trusted host must be https. Arbitrary origins are rejected.\n */\nfunction isTrustedStudioOrigin(\n origin: string,\n storefrontHostname: string\n): boolean {\n let parsed: URL\n try {\n parsed = new URL(origin)\n } catch {\n return false\n }\n\n let { hostname, protocol } = parsed\n if (isLoopbackHostname(storefrontHostname) && isLoopbackHostname(hostname)) {\n return protocol === 'http:' || protocol === 'https:'\n }\n\n if (protocol !== 'https:') {\n return false\n }\n\n return TRUSTED_STUDIO_DOMAINS.some(\n (domain) => hostname === domain || hostname.endsWith(`.${domain}`)\n )\n}\n\nfunction toSearchParams(context?: WeaverseNextRequestContext): URLSearchParams {\n if (context?.searchParams) {\n return new URLSearchParams(context.searchParams)\n }\n\n if (context?.url) {\n let url =\n typeof context.url === 'string'\n ? new URL(context.url, 'http://localhost')\n : context.url\n return new URLSearchParams(url.searchParams)\n }\n\n return new URLSearchParams()\n}\n\nfunction last(searchParams: URLSearchParams, key: string): string | null {\n let values = searchParams.getAll(key)\n return values.length ? (values.at(-1) ?? null) : null\n}\n\nexport interface ResolveWeaverseNextStudioScriptSrcOptions {\n storefrontHostname?: string\n}\n\n/**\n * Resolve the Studio script URL from request/search context. `@weaverse/next`\n * uses the dedicated Next bridge path served by Builder.\n */\nexport function resolveWeaverseNextStudioScriptSrc(\n context?: WeaverseNextRequestContext,\n options: ResolveWeaverseNextStudioScriptSrcOptions = {}\n): string | null {\n let searchParams = toSearchParams(context)\n\n let isDesignMode =\n context?.isDesignMode ?? last(searchParams, 'isDesignMode') === 'true'\n let isPreviewMode =\n context?.isPreviewMode ?? last(searchParams, 'isPreviewMode') === 'true'\n let isRevisionPreview =\n context?.isRevisionPreview ?? Boolean(last(searchParams, '__revisionId'))\n\n if (!(isDesignMode || isPreviewMode || isRevisionPreview)) {\n return null\n }\n\n let origin = normalizeOrigin(last(searchParams, 'weaverseHost'))\n if (!origin) {\n return null\n }\n\n let storefrontHostname = options.storefrontHostname ?? ''\n if (!isTrustedStudioOrigin(origin, storefrontHostname)) {\n return null\n }\n\n let bundle = isDesignMode ? 'index.js' : 'preview.js'\n let version = last(searchParams, 'weaverseVersion')\n let url = `${origin}/static/studio/next/${bundle}`\n return version ? `${url}?v=${encodeURIComponent(version)}` : url\n}\n","'use client'\n\nimport { useEffect } from 'react'\nimport { resolveWeaverseNextStudioScriptSrc } from './studio-script-src'\nimport type { WeaverseNextRequestContext } from './types'\n\nconst loadedScriptSrcs = new Set<string>()\n\nfunction loadScript(src: string) {\n if (typeof document === 'undefined') {\n return\n }\n\n if (loadedScriptSrcs.has(src)) {\n return\n }\n\n let existing = document.querySelector(`script[src=\"${src}\"]`)\n if (existing) {\n loadedScriptSrcs.add(src)\n return\n }\n\n let script = document.createElement('script')\n script.async = true\n script.src = src\n document.head.appendChild(script)\n loadedScriptSrcs.add(src)\n}\n\nexport interface LoadWeaverseNextStudioScriptOptions {\n storefrontHostname?: string\n}\n\n/**\n * Resolve and append the Next Studio bridge script for the given request\n * context, deduping by src. SSR-safe (no-op without `document`) so it can run\n * unconditionally from a root layout/error boundary before any page tree or\n * runtime exists — e.g. App Router `not-found.tsx` / `error.tsx` routes.\n */\nexport function loadWeaverseNextStudioScript(\n context?: WeaverseNextRequestContext,\n options: LoadWeaverseNextStudioScriptOptions = {}\n) {\n let resolvedContext = context\n if (!resolvedContext && typeof window !== 'undefined') {\n resolvedContext = {\n searchParams: new URLSearchParams(window.location.search),\n url: window.location.href,\n }\n }\n\n let src = resolveWeaverseNextStudioScriptSrc(resolvedContext, {\n storefrontHostname:\n options.storefrontHostname ??\n (typeof window === 'undefined' ? undefined : window.location.hostname),\n })\n if (src) {\n loadScript(src)\n }\n}\n\nexport interface WeaverseNextStudioConnectProps {\n context?: WeaverseNextRequestContext\n storefrontHostname?: string\n}\n\n/**\n * Root-level Studio script connector for Next client boundaries. Mount once\n * near the app root (e.g. root layout) so it also covers routes that never\n * render `WeaverseNextRenderer`, such as `not-found.tsx` / `error.tsx`.\n */\nexport function WeaverseNextStudioConnect(\n props: WeaverseNextStudioConnectProps\n) {\n useEffect(() => {\n loadWeaverseNextStudioScript(props.context, {\n storefrontHostname: props.storefrontHostname,\n })\n }, [props.context, props.storefrontHostname])\n\n return null\n}\n"]}
1
+ {"version":3,"sources":["../src/utils.ts","../src/item.ts","../src/main.tsx","../src/registry.ts","../src/client.ts","../src/theme-settings-store.ts","../src/translation-context.tsx","../src/translation-store.ts","../src/root-provider.tsx","../src/provider.tsx","../src/hooks.ts","../src/loader.ts","../src/request-info.ts","../src/runtime.ts","../src/revalidate-item.ts","../src/studio-bridge.tsx","../src/studio-router.ts","../src/use-weaverse-next-studio.tsx","../src/renderer.tsx","../src/seo.ts","../src/studio-script-src.ts","../src/studio-connect.tsx"],"names":["WeaverseItemStore","Weaverse","jsx","createSchema","createContext","useSafeExternalStore","useMemo","useContext","useRef","useEffect","useSyncExternalStore","useRouter","useLayoutEffect","getRenderablePage","memo","jsxs","Fragment","WeaverseRoot"],"mappings":"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","file":"index.js","sourcesContent":["import type { SchemaType } from '@weaverse/schema'\n\n/**\n * Generate default component data from a schema's `settings` inputs.\n *\n * Mirrors Hydrogen's `generateDataFromSchema` (settings → `{ [name]:\n * defaultValue }`) but is kept local so `@weaverse/next` doesn't depend on\n * `@weaverse/hydrogen`. Falls back to the deprecated `inspector` array when a\n * schema predates `settings`.\n */\nexport function generateDataFromSchema(\n schema: SchemaType | undefined\n): Record<string, unknown> {\n let data: Record<string, unknown> = {}\n if (!schema) {\n return data\n }\n\n let groups =\n (schema.settings as {\n inputs?: { name?: string; defaultValue?: unknown }[]\n }[]) ??\n (schema as { inspector?: typeof groups }).inspector ??\n []\n\n for (let group of groups) {\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 return data\n}\n","import type { ElementData } from '@weaverse/react'\nimport { Weaverse, WeaverseItemStore } from '@weaverse/react'\nimport type { WeaverseNextRuntime } from './runtime'\nimport type {\n WeaverseNextComponentData,\n WeaverseNextTranslationItemEntry,\n} from './types'\nimport { generateDataFromSchema } from './utils'\n\n/**\n * Spread a serialized item's nested `data` field into top-level props — the\n * shape the shared `@weaverse/react` renderer expects. Top-level fields win\n * over nested ones, matching the constructor's original\n * `Object.assign(store, schemaDefaults, data, rest)` merge order. Flat payloads\n * with no nested `data` pass through unchanged.\n */\nfunction flattenItemData(update: Omit<ElementData, 'id' | 'type'>) {\n let { data, ...rest } = update\n if (!(data && typeof data === 'object' && !Array.isArray(data))) {\n return rest\n }\n return { ...data, ...rest }\n}\n\n/**\n * While set, item `setData()` queues its subscriber notification here instead\n * of emitting synchronously. `createWeaverseNextRuntime()` runs during React\n * render (the renderer's `useMemo`), and constructing a runtime makes core's\n * `initProject()` call `setData()` on reused item instances (locale/client\n * navigation) — emitting to `useSyncExternalStore` subscribers mid-render\n * trips React's setState-in-render warning. Data is still applied\n * synchronously; only the emit is deferred.\n */\nlet deferredItemUpdates: Set<WeaverseNextItem> | null = null\n\n/**\n * Run `create` with item update emissions deferred, returning its result and\n * the items whose `setData()` fired meanwhile. The caller is responsible for\n * calling `triggerUpdate()` on them once React has committed.\n */\nexport function collectDeferredItemUpdates<T>(\n create: () => T\n): [T, WeaverseNextItem[]] {\n let previousQueue = deferredItemUpdates\n let queue = new Set<WeaverseNextItem>()\n deferredItemUpdates = queue\n try {\n return [create(), [...queue]]\n } finally {\n deferredItemUpdates = previousQueue\n }\n}\n\n/**\n * Item store that flattens the serialized item's nested `data` field onto the\n * store and seeds schema defaults — same shape Hydrogen produces, so the\n * shared `@weaverse/react` renderer can spread props at the top level.\n */\nexport class WeaverseNextItem extends WeaverseItemStore {\n declare weaverse: WeaverseNextRuntime\n\n /**\n * Cached merged snapshot (base `_store` + translations). Reset whenever the\n * `_store` ref or the item's translation entry ref changes, so\n * `useSyncExternalStore` sees a stable object between unrelated re-renders.\n */\n private _cachedSnapshot: ElementData | null = null\n private _snapshotStoreRef: ElementData | null = null\n private _snapshotTranslationRef: WeaverseNextTranslationItemEntry | null =\n null\n\n constructor(initialData: WeaverseNextComponentData, weaverse: Weaverse) {\n super(initialData as ElementData, weaverse)\n let schemaData = generateDataFromSchema(this.Element?.schema)\n Object.assign(this._store, schemaData, flattenItemData(initialData))\n }\n\n /**\n * Flatten nested `data` on updates exactly like the constructor does. Core's\n * `initProject()` calls `setData(item)` when a new runtime serves a page\n * whose item instances already exist (e.g. locale/client navigation), and\n * the inherited shallow merge would leave stale top-level props behind.\n * Assigning through the inherited `data` setter swaps the `_store` ref,\n * which invalidates the memoized snapshot below. The subscriber emit is\n * queued instead of fired when a render-phase deferral is active (see\n * `collectDeferredItemUpdates`).\n */\n setData = (update: Omit<ElementData, 'id' | 'type'>) => {\n this.data = flattenItemData(update)\n if (deferredItemUpdates) {\n deferredItemUpdates.add(this)\n } else {\n this.triggerUpdate()\n }\n return this.data\n }\n\n /**\n * Overlay item-level translations onto the base store when the runtime is in\n * translation mode. Mirrors Hydrogen's `WeaverseHydrogenItem.getSnapShot()`:\n * memoized by `_store` ref + translation entry ref so the returned object is\n * referentially stable, and a fast path that returns the base store untouched\n * when the item has no translations.\n */\n getSnapShot = (): ElementData => {\n let base = this._store\n let translations = this.weaverse.translationMap[this._id]\n\n // No translations → return the base store directly (fast path).\n if (!translations) {\n return base\n }\n\n // Reuse the cached merge while both the store and translation refs hold.\n if (\n this._cachedSnapshot &&\n this._snapshotStoreRef === base &&\n this._snapshotTranslationRef === translations\n ) {\n return this._cachedSnapshot\n }\n\n let merged = { ...base }\n for (let [key, entry] of Object.entries(translations)) {\n if (entry.translatedValue !== undefined) {\n merged[key] = entry.translatedValue\n }\n }\n\n this._cachedSnapshot = merged\n this._snapshotStoreRef = base\n this._snapshotTranslationRef = translations\n return merged\n }\n}\n\n/**\n * Register the Next item constructor globally. Idempotent: calling it more than\n * once is safe. Invoked by the renderer before it builds a Weaverse instance.\n */\nexport function ensureNextItemConstructor() {\n if (\n !Weaverse.ItemConstructor ||\n Weaverse.ItemConstructor === WeaverseItemStore ||\n Weaverse.ItemConstructor === WeaverseNextItem\n ) {\n Weaverse.ItemConstructor = WeaverseNextItem\n }\n}\n","import { createSchema, type SchemaType } from '@weaverse/schema'\nimport type { HTMLAttributes, RefObject } from 'react'\nimport type { WeaverseNextComponent, WeaverseNextComponentProps } from './types'\n\n/**\n * Default `main` root component.\n *\n * A Weaverse page tree is a flat `items` array with a single root item of type\n * `main` whose `children` are the page's top-level sections. Hydrogen ships its\n * own `main`; the Next adapter provides this minimal, framework-neutral\n * equivalent so consumers don't have to register one just to render a basic\n * page tree (omitting it would leave child sections unrendered).\n *\n * It renders `children` and forwards the Weaverse DOM attributes the shared\n * renderer injects (`data-wv-id`, `data-wv-type`, `ref`, `className`, ...rest)\n * onto the root element. `loaderData` is adapter-internal and stripped so it\n * never lands on the DOM node.\n */\nfunction Main(\n props: WeaverseNextComponentProps & {\n ref?: RefObject<HTMLDivElement | null>\n }\n) {\n let { children, loaderData, ...rest } = props\n // `rest` carries the Weaverse-injected DOM attributes (data-wv-*, ref,\n // className). They are all valid div attributes, so the cast is safe.\n return <div {...(rest as HTMLAttributes<HTMLDivElement>)}>{children}</div>\n}\nMain.displayName = 'main'\n\n/** Schema for the default {@link Main} root component. Type is exactly `main`. */\nexport const mainSchema: SchemaType = createSchema({\n type: 'main',\n title: 'Main',\n})\n\n/**\n * Default `main` component module, registered ahead of user components by\n * {@link registerWeaverseNextComponents}. Kept package-internal — consumers\n * override it simply by registering their own component with `type: 'main'`.\n */\nexport const defaultMainComponent: WeaverseNextComponent = {\n default: Main,\n schema: mainSchema,\n}\n","import { Weaverse } from '@weaverse/react'\nimport { ensureNextItemConstructor } from './item'\nimport { defaultMainComponent } from './main'\nimport type { WeaverseNextComponent } from './types'\n\nconst MAIN_TYPE = 'main'\n\n/**\n * Component types already pushed into the element registry. Registration is\n * idempotent by `schema.type`, so callers may pass fresh arrays per request\n * without causing repeated global registry writes.\n */\nconst registeredComponentTypes = new Set<string>()\n\n/**\n * Register Next adapter components with the shared Weaverse element registry.\n *\n * This mutates global Weaverse runtime state, so callers should run it while\n * creating their app/client wiring, not from a React render body.\n *\n * A default `main` root component is always registered first so consumers don't\n * have to register one for basic page-tree rendering. If the consumer registers\n * their own `main`, that one is preferred: we only prepend the default when the\n * provided components don't already include a `main`, so a user-provided `main`\n * never collides with (or is shadowed by) the default.\n */\nexport function registerWeaverseNextComponents(\n components: WeaverseNextComponent[]\n) {\n ensureNextItemConstructor()\n\n let hasUserMain = components.some(\n (component) => component.schema?.type === MAIN_TYPE\n )\n let effectiveComponents = hasUserMain\n ? components\n : [defaultMainComponent, ...components]\n\n for (let component of effectiveComponents) {\n let type = component.schema.type\n let element = {\n type,\n Component: component.default,\n schema: component.schema,\n loader: component.loader,\n }\n\n if (type === MAIN_TYPE && hasUserMain) {\n // `main` is the only built-in default. If a consumer registers their own\n // root component after the default was already installed by another\n // client/test/request, prefer the consumer version by replacing the global\n // registry entry explicitly.\n Weaverse.elementRegistry.set(type, element)\n registeredComponentTypes.add(type)\n continue\n }\n\n if (type && !registeredComponentTypes.has(type)) {\n Weaverse.registerElement(element)\n registeredComponentTypes.add(type)\n }\n }\n}\n","import type { SchemaType } from '@weaverse/schema'\nimport { registerWeaverseNextComponents } from './registry'\nimport type {\n WeaverseNextClient,\n WeaverseNextClientConfig,\n WeaverseNextCommerceContext,\n WeaverseNextComponent,\n WeaverseNextLoaderData,\n WeaverseNextLoadPageInput,\n WeaverseNextRequestContext,\n WeaverseNextStorefront,\n} from './types'\nimport { generateDataFromSchema } from './utils'\n\n/**\n * Request-safe Weaverse client for Next.js. Holds the component registry, theme\n * data, request/commerce context, and the currently loaded page payload.\n *\n * Unlike Hydrogen's `WeaverseClient`, it never receives a React Router\n * `Request`/`LoaderFunctionArgs`. Network I/O is delegated to `fetchPage` /\n * `fetchThemeSettings` injected through config, keeping v0 testable without\n * real Weaverse API calls.\n */\nclass NextClient implements WeaverseNextClient {\n projectId: string\n components: WeaverseNextComponent[]\n themeSchema?: unknown\n themeSettings: Record<string, unknown>\n requestContext?: WeaverseNextRequestContext\n commerce?: WeaverseNextCommerceContext\n data: WeaverseNextLoaderData | null = null\n dataContext: Record<string, unknown> = {}\n\n private readonly _fetchPage?: WeaverseNextClientConfig['fetchPage']\n private readonly _fetchThemeSettings?: WeaverseNextClientConfig['fetchThemeSettings']\n\n constructor(config: WeaverseNextClientConfig) {\n this.projectId = config.projectId\n this.components = config.components\n registerWeaverseNextComponents(this.components)\n this.themeSchema = config.themeSchema\n // Seed `themeSchema` defaults before merchant-provided overrides, mirroring\n // Hydrogen's `loadThemeSettings` (schema defaults under remote `theme`).\n // Without this, `useThemeSettings()` would miss any setting the merchant\n // never explicitly overrode.\n this.themeSettings = {\n ...generateDataFromSchema(config.themeSchema as SchemaType | undefined),\n ...config.themeSettings,\n }\n this.requestContext = config.requestContext\n this.commerce = config.commerce\n this._fetchPage = config.fetchPage\n this._fetchThemeSettings = config.fetchThemeSettings\n }\n\n /** Compatibility alias so loaders can call `weaverse.storefront.query(...)`. */\n get storefront(): WeaverseNextStorefront | undefined {\n return this.commerce?.storefront\n }\n\n loadPage = (\n input: WeaverseNextLoadPageInput = {}\n ): Promise<WeaverseNextLoaderData | null> => {\n if (!this._fetchPage) {\n throw new Error(\n '[WeaverseNextClient] loadPage requires a `fetchPage` function in client config.'\n )\n }\n return this._fetchPage(input)\n }\n\n loadThemeSettings = (\n context?: WeaverseNextRequestContext\n ): Promise<unknown> => {\n if (!this._fetchThemeSettings) {\n throw new Error(\n '[WeaverseNextClient] loadThemeSettings requires a `fetchThemeSettings` function in client config.'\n )\n }\n return this._fetchThemeSettings(context ?? this.requestContext)\n }\n}\n\n/**\n * Create a {@link WeaverseNextClient} from explicit config.\n *\n * @example\n * ```ts\n * let client = createWeaverseNextClient({\n * projectId: process.env.WEAVERSE_PROJECT_ID!,\n * components,\n * commerce: { storefront },\n * fetchPage: async ({ type, handle }) => fetchWeaversePage({ type, handle }),\n * })\n * ```\n */\nexport function createWeaverseNextClient(\n config: WeaverseNextClientConfig\n): WeaverseNextClient {\n return new NextClient(config)\n}\n","import type { WeaverseNextThemeSettingsStore } from './types'\n\nexport interface CreateWeaverseNextThemeSettingsStoreOptions {\n publicEnv?: Record<string, string | undefined>\n schema?: unknown\n settings?: Record<string, unknown>\n}\n\n/**\n * Small external store shape compatible with the Studio bridge and React's\n * `useSyncExternalStore` contract. The bridge calls `updateThemeSettings` during\n * live theme edits, so keep that method name stable.\n */\nexport function createWeaverseNextThemeSettingsStore(\n options: CreateWeaverseNextThemeSettingsStoreOptions = {}\n): WeaverseNextThemeSettingsStore {\n let listeners = new Set<() => void>()\n let store: WeaverseNextThemeSettingsStore = {\n publicEnv: options.publicEnv,\n schema: options.schema,\n settings: { ...(options.settings ?? {}) },\n getServerSnapshot: () => store.settings,\n getSnapshot: () => store.settings,\n subscribe: (listener: () => void) => {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n },\n updateThemeSettings: (next: Record<string, unknown>) => {\n store.settings = { ...store.settings, ...next }\n for (let listener of listeners) {\n listener()\n }\n },\n }\n\n return store\n}\n","'use client'\n\nimport { useSafeExternalStore } from '@weaverse/react'\nimport { createContext, type ReactNode, useContext, useMemo } from 'react'\nimport type { TranslationStore } from './translation-store'\n\n/**\n * Traverse a nested object by dot-path.\n *\n * @example\n * getNestedKey({ cart: { title: 'Cart' } }, 'cart.title') // => 'Cart'\n * getNestedKey({}, 'cart.title', 'fallback') // => 'fallback'\n */\nexport function getNestedKey(\n obj: Record<string, unknown>,\n path: string,\n fallback?: string\n): string | undefined {\n let keys = path.split('.')\n let current: unknown = obj\n\n for (let key of keys) {\n if (current == null || typeof current !== 'object') {\n return fallback\n }\n current = (current as Record<string, unknown>)[key]\n }\n\n if (typeof current === 'string') {\n return current\n }\n\n return fallback\n}\n\n/**\n * Replace `{{variable}}` patterns in a string with provided values.\n *\n * @example\n * interpolate('Hello {{name}}!', { name: 'World' }) // => 'Hello World!'\n * interpolate('-{{percentage}}% Off', { percentage: 15 }) // => '-15% Off'\n */\nexport function interpolate(\n template: string,\n variables?: Record<string, string | number>\n): string {\n if (!variables) {\n return template\n }\n\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key: string) => {\n let value = variables[key]\n return value === undefined ? match : String(value)\n })\n}\n\n// ---------------------------------------------------------------------------\n// Context & Provider\n// ---------------------------------------------------------------------------\n\n/**\n * Signature for a translation function.\n */\nexport type TranslateFunction = (\n key: string,\n variables?: Record<string, string | number>\n) => string\n\nexport interface TranslationValue {\n /** Active-locale translated keys loaded from the storefront API. */\n merchantOverrides: Record<string, unknown> | null\n /**\n * Translate a key with optional variable interpolation.\n *\n * Priority chain (highest wins):\n * 1. External `t` (passed into `WeaverseNextRootProvider` / `TranslationProvider`)\n * 2. Design overrides (live Builder edits from `TranslationStore`)\n * 3. `merchantOverrides` (DB/API overrides for the current locale)\n * 4. `staticContent` (theme default JSON)\n * 5. The key itself (fallback)\n *\n * @example\n * t('cart.title') // => \"Cart\"\n * t('badge.sale', { percentage: 15 }) // => \"-15% Off\"\n */\n t: TranslateFunction\n /**\n * @deprecated Use {@link TranslationValue.translationStore} instead. Kept as a\n * backward-compatible alias pointing at the same store instance.\n */\n themeTextStore: TranslationStore | null\n /** Exposed so the runtime/Studio bridge can attach it to `internal`. */\n translationStore: TranslationStore | null\n}\n\nconst TranslationContext = createContext<TranslationValue | null>(null)\nTranslationContext.displayName = 'WeaverseNextTranslationContext'\n\nexport interface TranslationProviderProps {\n children: ReactNode\n merchantOverrides?: Record<string, unknown>\n staticContent: Record<string, unknown>\n /**\n * Optional external translation function.\n * When provided it becomes the **highest-priority** source:\n * if it returns a non-empty string that differs from the raw key,\n * that value is used; otherwise the internal resolution chain continues.\n */\n t?: TranslateFunction\n /**\n * @deprecated Use {@link TranslationProviderProps.translationStore} instead.\n * Still accepted for backward compatibility; ignored when `translationStore`\n * is also provided.\n */\n themeTextStore?: TranslationStore | null\n /** Optional store for live design-mode text overrides from the builder. */\n translationStore?: TranslationStore | null\n}\n\n/**\n * Build the `t()` translation function over a fixed set of sources.\n *\n * Resolution order, highest priority first:\n * 1. `externalT` – host i18n (e.g. Shopify), unless it echoes the key\n * 2. `designOverrides` – live design-mode edits, flat dot-path keys\n * 3. `merchantOverrides` – locale overrides from the API, nested\n * 4. `staticContent` – the theme's default locale JSON\n * 5. the key itself\n *\n * Design overrides are looked up per-key (own properties only) rather than\n * merged into `merchantOverrides`: a flat key like `cart.title` must override\n * exactly that leaf without wiping sibling keys (`cart.subtitle`), and a\n * per-key own-property lookup never builds nested objects from\n * merchant-controlled keys, so it cannot pollute `Object.prototype`.\n */\nexport function createTranslate(sources: {\n staticContent: Record<string, unknown>\n merchantOverrides?: Record<string, unknown>\n designOverrides?: Record<string, string>\n externalT?: TranslateFunction\n}): TranslateFunction {\n let { staticContent, merchantOverrides, designOverrides, externalT } = sources\n return (key, variables) => {\n // Priority 1: external t (e.g. Shopify i18n, third-party library).\n if (externalT) {\n let external = externalT(key, variables)\n // Accept the external value unless it echoed the key unchanged.\n if (external && external !== key) {\n return external\n }\n }\n\n // Priority 2: live design-mode override (flat, keyed by exact dot-path,\n // own properties only so inherited keys never resolve to functions).\n let design =\n designOverrides && Object.hasOwn(designOverrides, key)\n ? designOverrides[key]\n : undefined\n // Priority 3: merchant overrides (nested). Priority 4: static content.\n let override = merchantOverrides\n ? getNestedKey(merchantOverrides, key)\n : undefined\n let staticValue = getNestedKey(staticContent, key)\n\n // Priority 5: the key itself as the final fallback.\n let raw = design ?? override ?? staticValue ?? key\n return interpolate(raw, variables)\n }\n}\n\n// No-op fallback for useSafeExternalStore when store is null (production).\n// Module-level constants — stable references, zero allocation per render.\nconst EMPTY: Record<string, string> = {}\nconst NOOP_SUBSCRIBE = () => () => {\n // No-op unsubscribe for production/static renders without a translation store.\n}\nconst NOOP_SNAPSHOT = () => EMPTY\n\n/**\n * Provider that wraps the app to expose the `t()` function.\n *\n * - `staticContent` – the theme's default locale JSON (from themeSchema.i18n)\n * - `merchantOverrides` – locale-specific overrides fetched from the API\n * - `translationStore` – optional store for live design-mode text overrides\n * (the deprecated `themeTextStore` prop is accepted as a fallback)\n */\nexport function TranslationProvider({\n staticContent,\n merchantOverrides,\n t: externalT,\n translationStore,\n themeTextStore,\n children,\n}: TranslationProviderProps) {\n // Canonical store, falling back to the deprecated `themeTextStore` prop.\n let store = translationStore ?? themeTextStore ?? null\n\n // Subscribe to design-mode overrides. No-op when store is null (production).\n let designOverrides = useSafeExternalStore(\n store?.subscribe ?? NOOP_SUBSCRIBE,\n store?.getSnapshot ?? NOOP_SNAPSHOT,\n store?.getServerSnapshot ?? NOOP_SNAPSHOT\n )\n\n let value = useMemo<TranslationValue>(\n () => ({\n t: createTranslate({\n staticContent,\n merchantOverrides,\n designOverrides,\n externalT,\n }),\n translationStore: store,\n // Deprecated alias — same instance, kept for backward compatibility.\n themeTextStore: store,\n merchantOverrides: merchantOverrides ?? null,\n }),\n [staticContent, merchantOverrides, designOverrides, externalT, store]\n )\n\n return (\n <TranslationContext.Provider value={value}>\n {children}\n </TranslationContext.Provider>\n )\n}\n\n/**\n * Hook to access the translation `t()` function.\n *\n * Must be used inside a component wrapped by `WeaverseNextRootProvider` or\n * `TranslationProvider`.\n *\n * @example\n * ```tsx\n * function CartTitle() {\n * let { t } = useTranslation()\n * return <h2>{t('cart.title')}</h2>\n * }\n * ```\n */\nexport function useTranslation(): TranslationValue {\n let ctx = useContext(TranslationContext)\n if (!ctx) {\n throw new Error(\n 'useTranslation must be used within <TranslationProvider>. Wrap your app with <WeaverseNextRootProvider>.'\n )\n }\n return ctx\n}\n\n// ---------------------------------------------------------------------------\n// Deprecated aliases (backward compatibility — kept exported indefinitely)\n// ---------------------------------------------------------------------------\n\n/**\n * @deprecated Use {@link TranslationProvider} instead.\n */\nexport const ThemeTextProvider = TranslationProvider\n/**\n * @deprecated Use {@link useTranslation} instead.\n */\nexport const useThemeText = useTranslation\n/**\n * @deprecated Use {@link TranslationValue} instead.\n */\nexport type ThemeTextValue = TranslationValue\n/**\n * @deprecated Use {@link TranslationProviderProps} instead.\n */\nexport type ThemeTextProviderProps = TranslationProviderProps\n","/**\n * Minimal mutable store for design-mode static text overrides.\n *\n * `useSyncExternalStore`-compatible. Passed into {@link TranslationProvider}\n * (from `./translation-context`) which subscribes internally and layers\n * overrides on top of `merchantOverrides`/`staticContent`. The Studio bridge\n * calls `updateOverrides()` via `runtime.internal.translationStore` (also\n * exposed as the deprecated `runtime.internal.themeTextStore` alias) so live\n * static-text edits reach the runtime — identical surface to Hydrogen's store,\n * so Builder's existing static-text RPC works with `@weaverse/next` unchanged.\n *\n * Shape: flat `Record<string, string>` — dot-notation keys map to values\n * (e.g. \"cart.title\" → \"Shopping Cart\").\n */\nexport class TranslationStore {\n overrides: Record<string, string> = {}\n private readonly listeners: Set<() => void> = new Set()\n\n setOverrides = (overrides: Record<string, string>) => {\n this.overrides = { ...overrides }\n this.emit()\n }\n\n updateOverrides = (newOverrides: Record<string, string>) => {\n this.overrides = { ...this.overrides, ...newOverrides }\n this.emit()\n }\n\n getSnapshot = () => this.overrides\n\n getServerSnapshot = () => this.overrides\n\n subscribe = (callback: () => void) => {\n this.listeners.add(callback)\n return () => {\n this.listeners.delete(callback)\n }\n }\n\n private readonly emit = () => {\n for (const listener of Array.from(this.listeners)) {\n try {\n listener()\n } catch (error) {\n console.error('TranslationStore: Listener error', error)\n }\n }\n }\n}\n\n/**\n * @deprecated Use {@link TranslationStore} instead. Kept as a backward-compatible\n * alias and will remain exported for existing integrations.\n */\nexport const ThemeTextStore = TranslationStore\n/**\n * @deprecated Use {@link TranslationStore} instead. Kept as a backward-compatible\n * alias and will remain exported for existing integrations.\n */\nexport type ThemeTextStore = TranslationStore\n","'use client'\n\nimport {\n createContext,\n type ReactNode,\n useEffect,\n useMemo,\n useRef,\n} from 'react'\nimport {\n getSchemaStaticContent,\n WeaverseNextContext,\n type WeaverseNextContextValue,\n} from './provider'\nimport { createWeaverseNextThemeSettingsStore } from './theme-settings-store'\nimport {\n type TranslateFunction,\n TranslationProvider,\n} from './translation-context'\nimport { TranslationStore } from './translation-store'\nimport type { WeaverseNextThemeSettingsStore } from './types'\n\nexport interface WeaverseNextRootContextValue {\n /** Active-locale static-text overrides shared with route-level providers. */\n merchantOverrides?: Record<string, unknown>\n /** Theme default locale JSON shared with route-level providers. */\n staticContent: Record<string, unknown>\n themeSettingsStore: WeaverseNextThemeSettingsStore\n /** Single live design-mode static-text override store for the whole session. */\n translationStore: TranslationStore\n}\n\n/**\n * Ambient root-scoped context. Route-level `WeaverseNextProvider` reads this to\n * adopt the shared theme settings store instead of creating its own.\n */\nexport const WeaverseNextRootContext =\n createContext<WeaverseNextRootContextValue | null>(null)\n\nexport interface WeaverseNextRootProviderProps {\n children: ReactNode\n /** Root-loaded theme settings (published-mode fetch, no design-mode context). */\n initialThemeSettings?: Record<string, unknown>\n /** Active-locale static-text overrides from `loadThemeSettings().merchantOverrides`. */\n merchantOverrides?: Record<string, unknown>\n publicEnv?: Record<string, string | undefined>\n /**\n * Theme default locale JSON (`loadThemeSettings().staticContent`). Falls back\n * to `themeSchema.i18n.staticContent` when omitted.\n */\n staticContent?: Record<string, unknown>\n /** Optional external translation function (host i18n); highest priority in `t()`. */\n t?: TranslateFunction\n themeSchema?: unknown\n}\n\n/**\n * Root-scoped client boundary that owns the single `WeaverseNextThemeSettingsStore`\n * for the whole app session, matching Hydrogen's `withWeaverse()` root store.\n * Mount once in `app/layout.tsx`, above `Header`/`Footer`/global modules and any\n * route-level `WeaverseNextProvider`.\n *\n * Also renders `WeaverseNextContext` with a minimal value so `useThemeSettings()`\n * works for components mounted directly under this provider, even without a\n * route-level `WeaverseNextProvider` above them.\n *\n * @example\n * ```tsx\n * <WeaverseNextRootProvider initialThemeSettings={theme.theme} themeSchema={theme.schema}>\n * <Header />\n * {children}\n * <Footer />\n * </WeaverseNextRootProvider>\n * ```\n */\nexport function WeaverseNextRootProvider(props: WeaverseNextRootProviderProps) {\n let {\n children,\n initialThemeSettings,\n merchantOverrides,\n staticContent,\n t,\n themeSchema,\n publicEnv,\n } = props\n\n // `useRef`, not `useMemo`: a parent re-render must never replace this store —\n // it is the single instance Studio's `updateThemeSettings()` mutates in place.\n let storeRef = useRef<WeaverseNextThemeSettingsStore | null>(null)\n if (!storeRef.current) {\n storeRef.current = createWeaverseNextThemeSettingsStore({\n publicEnv,\n schema: themeSchema,\n settings: initialThemeSettings,\n })\n }\n let themeSettingsStore = storeRef.current\n\n // Same `useRef` rationale as the theme store: one live static-text store for\n // the whole session, which Builder's `updateStaticText()` RPC mutates in place\n // via `runtime.internal.translationStore`. A parent re-render must never swap\n // it, or design-mode overrides would be lost.\n let translationStoreRef = useRef<TranslationStore | null>(null)\n if (!translationStoreRef.current) {\n translationStoreRef.current = new TranslationStore()\n }\n let translationStore = translationStoreRef.current\n\n // If `initialThemeSettings` changes after mount (e.g. root revalidation),\n // update the existing store in place instead of replacing it. This is an\n // effect because external store updates are side effects; the initial render\n // is already seeded synchronously by store construction above.\n let appliedThemeSettingsRef = useRef(initialThemeSettings)\n useEffect(() => {\n if (\n initialThemeSettings &&\n appliedThemeSettingsRef.current !== initialThemeSettings\n ) {\n themeSettingsStore.updateThemeSettings(initialThemeSettings)\n appliedThemeSettingsRef.current = initialThemeSettings\n }\n }, [initialThemeSettings, themeSettingsStore])\n\n // Prefer an explicit `staticContent` prop (from `loadThemeSettings()`); fall\n // back to `themeSchema.i18n.staticContent`. Both resolve to referentially\n // stable objects, so memoizing the context values below stays effective.\n let resolvedStaticContent =\n staticContent ?? getSchemaStaticContent(themeSchema)\n\n // `themeSettingsStore` / `translationStore` are `useRef`-stable, so memoizing\n // on them (rather than recreating these plain objects every render) keeps\n // `useThemeSettings()` / `useTranslation()` consumers (Header, Footer, ...)\n // from re-rendering on every root re-render.\n let rootContextValue = useMemo<WeaverseNextRootContextValue>(\n () => ({\n merchantOverrides,\n staticContent: resolvedStaticContent,\n themeSettingsStore,\n translationStore,\n }),\n [\n merchantOverrides,\n resolvedStaticContent,\n themeSettingsStore,\n translationStore,\n ]\n )\n let contextValue = useMemo<WeaverseNextContextValue>(\n () => ({\n merchantOverrides,\n themeSettings: themeSettingsStore.getSnapshot(),\n themeSettingsStore,\n translationStore,\n }),\n [merchantOverrides, themeSettingsStore, translationStore]\n )\n\n return (\n <WeaverseNextRootContext.Provider value={rootContextValue}>\n <WeaverseNextContext.Provider value={contextValue}>\n <TranslationProvider\n merchantOverrides={merchantOverrides}\n staticContent={resolvedStaticContent}\n t={t}\n translationStore={translationStore}\n >\n {children}\n </TranslationProvider>\n </WeaverseNextContext.Provider>\n </WeaverseNextRootContext.Provider>\n )\n}\n","'use client'\n\nimport {\n createContext,\n type ReactNode,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from 'react'\nimport { WeaverseNextRootContext } from './root-provider'\nimport { createWeaverseNextThemeSettingsStore } from './theme-settings-store'\nimport {\n type TranslateFunction,\n TranslationProvider,\n} from './translation-context'\nimport { TranslationStore } from './translation-store'\nimport type {\n WeaverseNextClient,\n WeaverseNextCommerceContext,\n WeaverseNextThemeSettingsStore,\n} from './types'\n\nconst EMPTY_THEME_SETTINGS: Record<string, unknown> = {}\nconst EMPTY_STATIC_CONTENT: Record<string, unknown> = {}\n\n/** Read `themeSchema.i18n.staticContent` for the fallback (no-root) provider. */\nexport function getSchemaStaticContent(\n schema: unknown\n): Record<string, unknown> {\n let i18n = (schema as { i18n?: { staticContent?: Record<string, unknown> } })\n ?.i18n\n return i18n?.staticContent ?? EMPTY_STATIC_CONTENT\n}\n\n/**\n * Value carried by {@link WeaverseNextContext}. Holds the explicit data\n * boundaries that replace React Router's `useLoaderData` /\n * `useRouteLoaderData` inside sections.\n */\nexport interface WeaverseNextContextValue {\n client?: WeaverseNextClient\n commerce?: WeaverseNextCommerceContext\n /** Active-locale static-text overrides, threaded into the runtime. */\n merchantOverrides?: Record<string, unknown>\n pageData?: unknown\n rootData?: unknown\n themeSettings: Record<string, unknown>\n themeSettingsStore: WeaverseNextThemeSettingsStore\n /** Live design-mode static-text override store, threaded into the runtime. */\n translationStore: TranslationStore\n}\n\n/**\n * Null sentinel default lets hooks detect usage outside the provider and throw\n * a clear error instead of silently returning empty data.\n */\nexport const WeaverseNextContext =\n createContext<WeaverseNextContextValue | null>(null)\n\nexport interface WeaverseNextProviderProps {\n children: ReactNode\n client?: WeaverseNextClient\n /** App-provided commerce context (storefront/cart/customer). */\n commerce?: WeaverseNextCommerceContext\n /**\n * Active-locale static-text overrides (nested, from `loadThemeSettings()`).\n * Adopts the root provider's `merchantOverrides` when omitted.\n */\n merchantOverrides?: Record<string, unknown>\n /** Explicit page/route commerce data (replaces section-level `useLoaderData`). */\n pageData?: unknown\n /** Explicit root/global data (replaces `useRouteLoaderData('root')`). */\n rootData?: unknown\n /**\n * Theme default locale JSON (`loadThemeSettings().staticContent`). Adopts the\n * root provider's `staticContent` when omitted, then falls back to\n * `client.themeSchema.i18n.staticContent`.\n */\n staticContent?: Record<string, unknown>\n /** Optional external translation function (host i18n); highest priority in `t()`. */\n t?: TranslateFunction\n /** Theme settings override; falls back to `client.themeSettings`. */\n themeSettings?: Record<string, unknown>\n}\n\n/**\n * Client boundary that supplies explicit root/page/commerce data to Weaverse\n * sections. Next-native replacement for `withWeaverse` + route loader data —\n * no React Router route matches are emulated.\n *\n * In App Router, create/pass `client` only from a client component wrapper. A\n * `WeaverseNextClient` contains functions and component references, so it is\n * not serializable across a Server Component → Client Component boundary.\n *\n * @example\n * ```tsx\n * 'use client'\n *\n * <WeaverseNextProvider client={client} rootData={rootData} pageData={pageData} commerce={commerce}>\n * <WeaverseNextRenderer />\n * </WeaverseNextProvider>\n * ```\n */\nexport function WeaverseNextProvider(props: WeaverseNextProviderProps) {\n let { children, client, rootData, pageData, commerce, themeSettings } = props\n let rootContext = useContext(WeaverseNextRootContext)\n\n let themeSettingsValue =\n themeSettings ?? client?.themeSettings ?? EMPTY_THEME_SETTINGS\n\n // Fallback translation store when no `WeaverseNextRootProvider` is mounted.\n // Otherwise the ambient root store is adopted, so exactly one live static-text\n // store backs Builder's `updateStaticText()` RPC per page load — mirroring the\n // theme-settings store adoption below. `useRef`, not `useMemo`: React may\n // evict memoized values, but this store must survive every re-render so\n // design-mode overrides already applied by Builder are never dropped.\n let ownTranslationStoreRef = useRef<TranslationStore | null>(null)\n if (!(rootContext || ownTranslationStoreRef.current)) {\n ownTranslationStoreRef.current = new TranslationStore()\n }\n let translationStore =\n rootContext?.translationStore ??\n (ownTranslationStoreRef.current as TranslationStore)\n\n // Static content / merchant overrides feeding `useTranslation()`. Precedence:\n // explicit prop → ambient root value → (static content only) schema default.\n let staticContent =\n props.staticContent ??\n rootContext?.staticContent ??\n getSchemaStaticContent(client?.themeSchema)\n let merchantOverrides =\n props.merchantOverrides ?? rootContext?.merchantOverrides\n\n // Fallback store for apps that don't mount `WeaverseNextRootProvider`. Not\n // created at all when a root store is present, so exactly one\n // `WeaverseNextThemeSettingsStore` exists per page load either way.\n let ownThemeSettingsStore = useMemo(() => {\n if (rootContext) {\n return null\n }\n return createWeaverseNextThemeSettingsStore({\n schema: client?.themeSchema,\n settings: themeSettingsValue,\n })\n }, [rootContext, client?.themeSchema, themeSettingsValue])\n\n let themeSettingsStore =\n rootContext?.themeSettingsStore ??\n (ownThemeSettingsStore as WeaverseNextThemeSettingsStore)\n\n // When adopting the root store, route-supplied theme data augments it in\n // place (merge), never replaces it — Studio and root `Header`/`Footer` must\n // keep observing the same instance. Guarded so a stable `themeSettingsValue`\n // across re-renders doesn't re-merge/re-notify every render.\n //\n // This runs in an effect, not render: mutating a store shared outside this\n // component's subtree is a side effect, and render functions must stay\n // pure under concurrent React (retried/discarded renders, StrictMode\n // double-invocation). The root's initial theme is authoritative for SSR;\n // a route's `themeSettings`/`client.themeSettings` override applies after\n // client mount instead of racing a render-phase store mutation. Apps that\n // don't mount `WeaverseNextRootProvider` are unaffected — `themeSettings`\n // still renders synchronously on SSR via `ownThemeSettingsStore` below.\n let mergedIntoRootRef = useRef<Record<string, unknown> | undefined>(undefined)\n useEffect(() => {\n if (\n rootContext &&\n themeSettingsValue !== EMPTY_THEME_SETTINGS &&\n mergedIntoRootRef.current !== themeSettingsValue\n ) {\n rootContext.themeSettingsStore.updateThemeSettings(themeSettingsValue)\n mergedIntoRootRef.current = themeSettingsValue\n }\n }, [rootContext, themeSettingsValue])\n\n // Do not depend on `themeSettingsValue` here. In fallback mode it is already\n // represented by a new `themeSettingsStore`; in root-adoption mode the\n // post-mount merge effect notifies `useThemeSettings()` subscribers. Including\n // it would recreate this context with a stale root snapshot before the effect\n // fires, causing an avoidable extra render.\n let value = useMemo<WeaverseNextContextValue>(\n () => ({\n client,\n rootData,\n pageData,\n commerce: commerce ?? client?.commerce,\n merchantOverrides,\n themeSettings: themeSettingsStore.getSnapshot(),\n themeSettingsStore,\n translationStore,\n }),\n [\n client,\n rootData,\n pageData,\n commerce,\n merchantOverrides,\n themeSettingsStore,\n translationStore,\n ]\n )\n\n return (\n <WeaverseNextContext.Provider value={value}>\n <TranslationProvider\n merchantOverrides={merchantOverrides}\n staticContent={staticContent}\n t={props.t}\n translationStore={translationStore}\n >\n {children}\n </TranslationProvider>\n </WeaverseNextContext.Provider>\n )\n}\n","'use client'\n\nimport { useContext, useSyncExternalStore } from 'react'\nimport { WeaverseNextContext } from './provider'\nimport type { WeaverseNextCommerceContext } from './types'\n\nconst OUTSIDE_PROVIDER_ERROR = 'must be used inside a <WeaverseNextProvider>.'\n\nfunction useWeaverseNextContext(hookName: string) {\n let context = useContext(WeaverseNextContext)\n if (!context) {\n throw new Error(`[@weaverse/next] ${hookName} ${OUTSIDE_PROVIDER_ERROR}`)\n }\n return context\n}\n\n/**\n * Read explicit root/global data passed to the provider. Next-native\n * replacement for `useRouteLoaderData('root')`.\n */\nexport function useWeaverseRootData<T = unknown>(): T {\n return useWeaverseNextContext('useWeaverseRootData').rootData as T\n}\n\n/**\n * Read explicit page/route commerce data passed to the provider. Next-native\n * replacement for section-level `useLoaderData()`.\n */\nexport function useWeaversePageData<T = unknown>(): T {\n return useWeaverseNextContext('useWeaversePageData').pageData as T\n}\n\n/** Read the app-provided commerce context (storefront/cart/customer). */\nexport function useWeaverseCommerce<T = WeaverseNextCommerceContext>(): T {\n return useWeaverseNextContext('useWeaverseCommerce').commerce as T\n}\n\n/**\n * Read live Weaverse theme settings. The Studio bridge updates the provider's\n * external store via `updateThemeSettings`, so components re-render during live\n * design-mode edits.\n */\nexport function useThemeSettings<T = Record<string, unknown>>(): T {\n let { themeSettingsStore } = useWeaverseNextContext('useThemeSettings')\n return useSyncExternalStore(\n themeSettingsStore.subscribe,\n themeSettingsStore.getSnapshot,\n themeSettingsStore.getServerSnapshot\n ) as T\n}\n","import type {\n WeaverseNextClient,\n WeaverseNextCommerceContext,\n WeaverseNextComponent,\n WeaverseNextComponentData,\n WeaverseNextLoaderData,\n WeaverseNextRequestContext,\n} from './types'\nimport { generateDataFromSchema } from './utils'\n\nexport interface RunComponentLoadersArgs {\n client: WeaverseNextClient\n commerce?: WeaverseNextCommerceContext\n context?: WeaverseNextRequestContext\n /** Page payload to walk; defaults to `client.data`. */\n data?: WeaverseNextLoaderData | null\n}\n\nfunction isItemNode(node: unknown): node is WeaverseNextComponentData {\n return (\n typeof node === 'object' &&\n node !== null &&\n typeof (node as WeaverseNextComponentData).type === 'string'\n )\n}\n\nfunction cloneItem(item: WeaverseNextComponentData): WeaverseNextComponentData {\n return {\n ...item,\n children: Array.isArray(item.children)\n ? item.children.map((child) =>\n isItemNode(child) ? cloneItem(child) : { ...child }\n )\n : item.children,\n }\n}\n\n/**\n * Walk a serialized page tree and run each registered component's `loader`,\n * attaching the result to the item as `loaderData`.\n *\n * Loaders receive explicit `commerce.storefront` (and `weaverse.storefront` as\n * a compatibility alias via the client). Children are walked recursively when\n * they are inline item objects; flat `items` arrays are covered by the\n * top-level walk.\n *\n * @returns a cloned `data` object with `loaderData` attached to cloned items.\n */\nexport async function runWeaverseComponentLoaders(\n args: RunComponentLoadersArgs\n): Promise<WeaverseNextLoaderData | null> {\n let { client, context, commerce } = args\n let sourceData = args.data ?? client.data\n if (!sourceData) {\n return null\n }\n if (!sourceData.page.items.length) {\n return sourceData\n }\n\n let data: WeaverseNextLoaderData = {\n ...sourceData,\n page: {\n ...sourceData.page,\n items: sourceData.page.items.map(cloneItem),\n },\n }\n let items = data.page.items\n\n let componentMap = new Map<string, WeaverseNextComponent>()\n for (let component of client.components) {\n if (component?.schema?.type) {\n componentMap.set(component.schema.type, component)\n }\n }\n\n let visited = new Set<string>()\n let resolvedContext = context ?? client.requestContext\n let resolvedCommerce = commerce ?? client.commerce\n\n // Per-call `weaverse` alias. When a request-scoped `commerce` is passed, the\n // `weaverse.storefront` compatibility alias must resolve to *that* storefront,\n // not the client's construction-time commerce. Pilot-style loaders call\n // `weaverse.storefront.query(...)`, so a stale alias would query the wrong\n // (or an undefined) storefront. When no override is given we reuse the client\n // as-is to preserve its prototype getters.\n let resolvedWeaverse: WeaverseNextClient =\n resolvedCommerce === client.commerce\n ? client\n : {\n ...client,\n commerce: resolvedCommerce,\n storefront: resolvedCommerce?.storefront,\n }\n\n async function walk(nodes: WeaverseNextComponentData[]) {\n for (let item of nodes) {\n if (!item || visited.has(item.id)) {\n continue\n }\n visited.add(item.id)\n\n let component = componentMap.get(item.type)\n if (component?.loader) {\n try {\n item.loaderData = await component.loader({\n data: { ...generateDataFromSchema(component.schema), ...item.data },\n weaverse: resolvedWeaverse,\n context: resolvedContext,\n commerce: resolvedCommerce,\n })\n } catch (error) {\n console.warn('❌ Item loader run failed.', item.type, item.id, error)\n }\n }\n\n let children = item.children\n if (Array.isArray(children)) {\n let inlineChildren = children.filter(\n isItemNode\n ) as WeaverseNextComponentData[]\n if (inlineChildren.length) {\n await walk(inlineChildren)\n }\n }\n }\n }\n\n await walk(items)\n return data\n}\n","import type {\n WeaverseNextRequestContext,\n WeaverseNextRequestInfo,\n} from './types'\n\nfunction toUrl(value: string | URL): URL {\n return typeof value === 'string' ? new URL(value, 'http://localhost') : value\n}\n\nfunction getSearchParamsFromContext(\n context?: WeaverseNextRequestContext\n): URLSearchParams {\n if (context?.searchParams) {\n return new URLSearchParams(context.searchParams)\n }\n\n if (context?.url) {\n let url = toUrl(context.url)\n return new URLSearchParams(url.searchParams)\n }\n\n return new URLSearchParams()\n}\n\nfunction getPathnameFromContext(context?: WeaverseNextRequestContext): string {\n if (context?.pathname) {\n return context.pathname\n }\n\n if (context?.url) {\n let url = toUrl(context.url)\n return url.pathname || '/'\n }\n\n return '/'\n}\n\nfunction coerceQueryValue(value: string): string | boolean {\n if (value === 'true') {\n return true\n }\n if (value === 'false') {\n return false\n }\n return value\n}\n\nfunction toQueryRecord(\n searchParams: URLSearchParams\n): Record<string, string | boolean> {\n let queries: Record<string, string | boolean> = {}\n for (let [key, value] of searchParams.entries()) {\n queries[key] = coerceQueryValue(value)\n }\n return queries\n}\n\nconst TRANSIENT_STUDIO_PARAMS = new Set([\n 'weaverseDraftItem',\n // Legacy name from the original design-mode draft-item spike. Keep it out of\n // runtime requestInfo too, in case an older Builder bundle is in front of a\n // newer Next storefront.\n '__weaverseDraftItem',\n])\n\nfunction getRequestInfoSearchParams(\n context?: WeaverseNextRequestContext\n): URLSearchParams {\n let searchParams = new URLSearchParams(getSearchParamsFromContext(context))\n for (let key of TRANSIENT_STUDIO_PARAMS) {\n searchParams.delete(key)\n }\n return searchParams\n}\n\n/**\n * Build the Hydrogen-like request info shape consumed by the Studio bridge.\n * Duplicate query keys keep the last value, matching `URLSearchParams` iteration\n * assignment and Hydrogen's practical query-object behavior.\n */\nexport function buildWeaverseNextRequestInfo(\n context?: WeaverseNextRequestContext\n): WeaverseNextRequestInfo {\n let searchParams = getRequestInfoSearchParams(context)\n let search = searchParams.toString()\n\n return {\n pathname: getPathnameFromContext(context),\n search: search ? `?${search}` : '',\n queries: toQueryRecord(searchParams),\n ...(context?.i18n ? { i18n: context.i18n } : {}),\n }\n}\n","import { Weaverse } from '@weaverse/react'\nimport {\n collectDeferredItemUpdates,\n ensureNextItemConstructor,\n type WeaverseNextItem,\n} from './item'\nimport { buildWeaverseNextRequestInfo } from './request-info'\nimport { createWeaverseNextThemeSettingsStore } from './theme-settings-store'\nimport { TranslationStore } from './translation-store'\nimport type {\n WeaverseNextClient,\n WeaverseNextLoaderData,\n WeaverseNextPageData,\n WeaverseNextRequestInfo,\n WeaverseNextRuntimeConfig,\n WeaverseNextRuntimeInternal,\n WeaverseNextTranslationChanges,\n WeaverseNextTranslationEntry,\n WeaverseNextTranslationMap,\n} from './types'\n\ndeclare global {\n interface Window {\n __weaverse?: WeaverseNextRuntime\n __weaverses?: Record<string, WeaverseNextRuntime>\n }\n}\n\ntype StudioBoundRuntime = WeaverseNextRuntime & {\n __weaverseNextStudioBound?: boolean\n __weaverseNextRequestKey?: string\n __weaverseNextLatestData?: WeaverseNextPageData & { rootId: string }\n}\n\nfunction getRuntimeWindow(): Window | undefined {\n return typeof window === 'undefined' ? undefined : window\n}\n\nfunction getRenderablePage(\n data: WeaverseNextLoaderData\n): WeaverseNextPageData & { rootId: string } {\n let page = data.page\n let rootId =\n page.rootId ??\n page.items.find((item) => item.type === 'main')?.id ??\n page.items[0]?.id ??\n page.id\n return { ...page, rootId }\n}\n\nfunction getConfigString(\n configs: Record<string, unknown> | undefined,\n key: string\n): string | undefined {\n let value = configs?.[key]\n return typeof value === 'string' ? value : undefined\n}\n\nfunction getRecordString(\n record: Record<string, unknown> | undefined,\n key: string\n): string | undefined {\n let value = record?.[key]\n return typeof value === 'string' ? value : undefined\n}\n\nfunction resolveProjectId(\n client: WeaverseNextClient | undefined,\n data: WeaverseNextLoaderData,\n fallback: string\n): string {\n let projectId = client?.projectId\n if (projectId) {\n return projectId\n }\n\n let configProjectId = getConfigString(data.configs, 'projectId')\n if (configProjectId) {\n return configProjectId\n }\n\n return getRecordString(data.project, 'id') ?? fallback\n}\n\nfunction resolveDataContext(config: WeaverseNextRuntimeConfig) {\n if (config.dataContext) {\n return config.dataContext\n }\n if (config.client?.dataContext) {\n return config.client.dataContext\n }\n return {}\n}\n\nfunction getRuntimeKey(pageId: string, requestInfo: WeaverseNextRequestInfo) {\n return `${pageId}:${requestInfo.pathname}:${requestInfo.search}`\n}\n\nfunction registerRuntime(runtime: WeaverseNextRuntime) {\n let runtimeWindow = getRuntimeWindow()\n if (!runtimeWindow) {\n return\n }\n\n runtimeWindow.__weaverses ??= {}\n runtimeWindow.__weaverses[runtime.pageId] = runtime\n runtimeWindow.__weaverse = runtime\n}\n\nexport class WeaverseNextRuntime extends Weaverse {\n pageId: string\n internal: WeaverseNextRuntimeInternal\n requestInfo: WeaverseNextRequestInfo\n isPreviewMode: boolean\n isRevisionPreview: boolean\n sectionType?: string\n\n // ─── Item-level translation sidecar (design mode only) ─────────────\n /**\n * Translation map received from Builder in design mode, keyed by item ID.\n * `WeaverseNextItem.getSnapShot()` overlays these onto the data handed to\n * components, so translations render without mutating the base `_store`.\n */\n translationMap: WeaverseNextTranslationMap = {}\n translationLocale = String()\n translationLanguageId = String()\n\n /**\n * Fresh page data captured while React was rendering. Runtime reuse happens\n * inside the renderer's render phase (`useMemo`), where applying it through\n * `setProjectData()` would emit item updates to `useSyncExternalStore`\n * subscribers mid-render. The renderer applies it post-commit via\n * `flushRenderPhaseUpdates()`. Never set on design-mode runtimes — the live\n * Studio tree owns the page data there.\n */\n pendingProjectData?: WeaverseNextPageData & { rootId: string }\n\n /**\n * Reused item instances whose data was refreshed while this runtime was\n * constructed during render (core `initProject()` calls `setData()` on\n * them). Their data is already fresh; only the subscriber notification was\n * deferred to `flushRenderPhaseUpdates()`.\n */\n pendingItemUpdates: WeaverseNextItem[] = []\n\n constructor(config: WeaverseNextRuntimeConfig) {\n let { client, data } = config\n let page = getRenderablePage(data)\n let configs = data.configs\n let requestContext = client?.requestContext\n let projectId = resolveProjectId(client, data, page.id)\n\n ensureNextItemConstructor()\n super({\n projectId,\n data: page,\n isDesignMode: requestContext?.isDesignMode ?? false,\n weaverseHost: getConfigString(configs, 'weaverseHost'),\n weaverseVersion: getConfigString(configs, 'weaverseVersion'),\n })\n\n this.pageId = page.id\n this.dataContext = resolveDataContext(config)\n this.requestInfo = buildWeaverseNextRequestInfo(requestContext)\n this.isDesignMode = requestContext?.isDesignMode ?? false\n this.isPreviewMode = requestContext?.isPreviewMode ?? false\n this.isRevisionPreview = requestContext?.isRevisionPreview ?? false\n this.sectionType = requestContext?.sectionType\n\n // One store instance backs both the canonical `translationStore` and the\n // deprecated `themeTextStore` alias, so Builder's `updateStaticText()` RPC\n // (which reads `internal.themeTextStore`) mutates the same store the\n // `TranslationProvider` subscribes to.\n let translationStore = config.translationStore ?? new TranslationStore()\n\n this.internal = {\n merchantOverrides: config.merchantOverrides,\n navigate: config.navigate,\n pageAssignment: data.pageAssignment,\n project: data.project,\n revalidate: config.revalidate,\n themeSettingsStore:\n config.themeSettingsStore ??\n createWeaverseNextThemeSettingsStore({\n schema: client?.themeSchema,\n settings: client?.themeSettings,\n }),\n translationStore,\n themeTextStore: translationStore,\n }\n\n // Read any item-level translation sidecar the loader attached to the page\n // data. Runs after `super()` has built `this.data` and the item stores.\n this.extractTranslationSidecar()\n }\n\n /**\n * Pull `translationMap` / `translationLocale` / `translationLanguageId` off\n * the current page data (Builder attaches them in design mode). Unlike\n * Hydrogen, this also clears the sidecar to defaults when the new page data\n * carries none, so a reused runtime / project-data swap can't leave a stale\n * map overlaying the fresh tree.\n */\n extractTranslationSidecar = () => {\n let pageData = this.data as WeaverseNextPageData | undefined\n let translationMap = pageData?.translationMap as\n | WeaverseNextTranslationMap\n | undefined\n if (translationMap) {\n this.translationMap = translationMap\n this.translationLocale = (pageData?.translationLocale as string) || ''\n this.translationLanguageId =\n (pageData?.translationLanguageId as string) || ''\n } else {\n this.translationMap = {}\n this.translationLocale = ''\n this.translationLanguageId = ''\n }\n }\n\n /**\n * Replace the translation sidecar (Builder pushes this when translation data\n * arrives or the active language changes) and refresh every item so their\n * merged snapshots recompute.\n */\n setTranslationSidecar = (\n map: WeaverseNextTranslationMap = {},\n locale = '',\n languageId = ''\n ) => {\n this.translationMap = map\n this.translationLocale = locale\n this.translationLanguageId = languageId\n this.refreshAllItems()\n }\n\n /**\n * Update a single translatable field for one item. Assigns a new per-item\n * entry object so `WeaverseNextItem.getSnapShot()`'s translation-ref cache\n * invalidates, then triggers only that item's subscribers.\n */\n updateTranslation = (\n itemId: string,\n key: string,\n originalValue: string,\n translatedValue: string\n ) => {\n if (!this.translationMap[itemId]) {\n this.translationMap[itemId] = {}\n }\n // New entry reference so the item's snapshot cache detects the change.\n this.translationMap[itemId] = {\n ...this.translationMap[itemId],\n [key]: { originalValue, translatedValue },\n }\n let instance = this.itemInstances.get(itemId)\n if (instance) {\n instance.triggerUpdate()\n }\n }\n\n /**\n * Collect translation changes for the save flow. Returns `undefined` unless\n * both the locale and language ID are set and at least one entry exists;\n * each entry key is namespaced as `data.<field>` to match Builder.\n */\n getTranslationChanges = (): WeaverseNextTranslationChanges | undefined => {\n let languageId = this.translationLanguageId\n if (!(this.translationLocale && languageId)) {\n return\n }\n\n let entries: WeaverseNextTranslationEntry[] = []\n for (let [itemId, fields] of Object.entries(this.translationMap)) {\n for (let [key, entry] of Object.entries(fields)) {\n entries.push({\n itemId,\n key: `data.${key}`,\n originalValue: entry.originalValue,\n translatedValue: entry.translatedValue,\n })\n }\n }\n\n if (entries.length === 0) {\n return\n }\n return { languageId, entries }\n }\n\n /**\n * Re-extract the translation sidecar whenever project data is replaced (route\n * change / non-design reuse), before rebuilding item stores. Takes the\n * renderable page shape (`rootId` resolved) that `getRenderablePage()` and\n * the reuse branch pass in.\n */\n setProjectData = (data: WeaverseNextPageData & { rootId: string }) => {\n this.data = data\n this.extractTranslationSidecar()\n this.initProject()\n }\n\n /**\n * Apply updates deferred off the render phase: swap in any pending page data\n * captured on runtime reuse, then notify items whose data was refreshed\n * during construction. The renderer calls this from a layout effect right\n * after commit, so subscribers re-render before paint (no content flash) and\n * without React's setState-in-render warning.\n */\n flushRenderPhaseUpdates = () => {\n let pendingData = this.pendingProjectData\n if (pendingData) {\n this.pendingProjectData = undefined\n this.setProjectData(pendingData)\n }\n\n let pendingItems = this.pendingItemUpdates\n if (pendingItems.length > 0) {\n this.pendingItemUpdates = []\n for (let item of pendingItems) {\n item.triggerUpdate()\n }\n }\n }\n}\n\nexport function createWeaverseNextRuntime(\n config: WeaverseNextRuntimeConfig\n): WeaverseNextRuntime {\n let requestInfo = buildWeaverseNextRequestInfo(config.client?.requestContext)\n let page = getRenderablePage(config.data)\n let runtimeWindow = getRuntimeWindow()\n let existing = runtimeWindow?.__weaverses?.[page.id] as\n | StudioBoundRuntime\n | undefined\n let requestKey = getRuntimeKey(page.id, requestInfo)\n\n if (existing?.__weaverseNextRequestKey === requestKey) {\n let nextIsDesignMode = config.client?.requestContext?.isDesignMode ?? false\n // In design mode the live Studio runtime owns the page tree, including\n // unsaved drafts. Reapplying loader `page` data here would clobber those\n // edits, so leave the project data untouched and let\n // `bindWeaverseNextStudioRuntime` push the latest state via `refreshStudio`.\n // Published / preview reuse has no draft state, so fresh data still wins —\n // but this factory runs during React render (the renderer's `useMemo`),\n // and `setProjectData()` → `initProject()` → `setData()` would emit item\n // updates to `useSyncExternalStore` subscribers mid-render (React's\n // setState-in-render warning). Stash the page instead; the renderer\n // applies it post-commit via `flushRenderPhaseUpdates()`.\n if (existing.isDesignMode || nextIsDesignMode) {\n existing.pendingProjectData = undefined\n } else {\n existing.pendingProjectData = page\n }\n // Always capture the latest server payload. In design mode the live tree\n // (`existing.data`) is deliberately left untouched above, so it goes stale\n // after an RSC refresh — `bindWeaverseNextStudioRuntime` must report this\n // fresh payload to `refreshStudio`, not the stale tree, or a revalidation\n // (e.g. resource-picker pick) merges back old per-item `loaderData` and the\n // preview keeps rendering the previous resource. Mirrors Hydrogen, which\n // always passes the fresh loader params to `refreshStudio`.\n existing.__weaverseNextLatestData = page\n existing.dataContext = resolveDataContext(config)\n existing.requestInfo = requestInfo\n existing.projectId = resolveProjectId(config.client, config.data, page.id)\n existing.isDesignMode = nextIsDesignMode\n existing.isPreviewMode =\n config.client?.requestContext?.isPreviewMode ?? false\n existing.isRevisionPreview =\n config.client?.requestContext?.isRevisionPreview ?? false\n existing.sectionType = config.client?.requestContext?.sectionType\n existing.weaverseHost =\n getConfigString(config.data.configs, 'weaverseHost') ??\n existing.weaverseHost\n existing.weaverseVersion =\n getConfigString(config.data.configs, 'weaverseVersion') ??\n existing.weaverseVersion\n existing.internal.pageAssignment = config.data.pageAssignment\n existing.internal.project = config.data.project\n if (config.navigate) {\n existing.internal.navigate = config.navigate\n }\n if (config.revalidate) {\n existing.internal.revalidate = config.revalidate\n }\n if (config.themeSettingsStore) {\n existing.internal.themeSettingsStore = config.themeSettingsStore\n }\n if (config.translationStore) {\n existing.internal.translationStore = config.translationStore\n // Keep the deprecated alias pointing at the same adopted instance.\n existing.internal.themeTextStore = config.translationStore\n }\n // Always assign, including `undefined`, so locale/navigation changes can\n // clear previously attached merchant overrides instead of leaking stale\n // static-text values into the next render.\n existing.internal.merchantOverrides = config.merchantOverrides\n registerRuntime(existing)\n return existing\n }\n\n // Constructing a fresh runtime also happens during render, and core\n // `initProject()` reuses process-wide item instances holding the same item\n // ids (locale/client navigation recreates the runtime under a new request\n // key) by calling `setData()` on them. Defer those subscriber emits to the\n // renderer's post-commit `flushRenderPhaseUpdates()` as well.\n let [runtime, refreshedItems] = collectDeferredItemUpdates(\n () => new WeaverseNextRuntime(config) as StudioBoundRuntime\n )\n runtime.pendingItemUpdates = refreshedItems\n runtime.__weaverseNextRequestKey = requestKey\n runtime.__weaverseNextLatestData = page\n registerRuntime(runtime)\n return runtime\n}\n\nexport function bindWeaverseNextStudioRuntime(runtime: WeaverseNextRuntime) {\n if (!runtime.isDesignMode) {\n return false\n }\n\n let studio = getRuntimeWindow()?.weaverseStudio\n if (!studio) {\n return false\n }\n\n let boundRuntime = runtime as StudioBoundRuntime\n if (!boundRuntime.__weaverseNextStudioBound) {\n studio.init?.(runtime)\n boundRuntime.__weaverseNextStudioBound = true\n return true\n }\n\n // Report the latest server payload (fresh per-item `loaderData`), not the\n // live tree: Builder's `refreshStudio` merges the editor draft's structural\n // edits back on top and only takes the loader payload from this data.\n studio.refreshStudio?.({\n data: boundRuntime.__weaverseNextLatestData ?? runtime.data,\n pageId: runtime.pageId,\n requestInfo: runtime.requestInfo,\n })\n return true\n}\n","import type { WeaverseNextComponentData } from './types'\n\nexport const DEFAULT_REVALIDATE_ENDPOINT = '/api/weaverse/revalidate'\n\n/**\n * Minimal runtime surface the in-place apply needs. Structural (not the\n * concrete `WeaverseNextRuntime` class) so unit tests can drive it with a\n * plain mock.\n */\nexport interface RevalidateItemRuntimeLike {\n itemInstances: Map<\n string,\n {\n setData: (update: Record<string, unknown>) => unknown\n }\n >\n}\n\n/**\n * Studio per-item loader revalidation: POST the unsaved draft item to the\n * app's revalidate route (see `createWeaverseNextRevalidateHandler`) and apply\n * the returned `loaderData` to the live item instance in place.\n *\n * No `router.refresh()` is involved, so the RSC tree is never re-applied — no\n * page remount, no scroll reset, and the draft payload never touches the URL.\n *\n * Throws on any failure (missing route, non-OK response, unknown item) so the\n * Builder Studio bridge can detect the miss and fall back to its legacy\n * refresh-based revalidation for this window.\n */\nexport async function revalidateWeaverseNextItem(\n runtime: RevalidateItemRuntimeLike,\n draftItem: WeaverseNextComponentData,\n endpoint: string = DEFAULT_REVALIDATE_ENDPOINT\n): Promise<void> {\n let instance = runtime.itemInstances.get(draftItem.id)\n if (!instance) {\n throw new Error(\n `[weaverse-next] No live item instance for \"${draftItem.id}\".`\n )\n }\n\n let response = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ draftItem }),\n })\n if (!response.ok) {\n throw new Error(\n `[weaverse-next] Revalidate endpoint responded ${response.status}.`\n )\n }\n\n let { loaderData } = (await response.json()) as { loaderData?: unknown }\n // The item's settings were already mutated by the Studio edit; only the\n // loader payload needs applying. `setData` merges and notifies subscribers,\n // and the new `loaderData` identity is what Builder's revalidation poll\n // observes for completion.\n instance.setData({ loaderData: loaderData ?? null })\n}\n","'use client'\n\nimport { useEffect, useRef } from 'react'\nimport {\n bindWeaverseNextStudioRuntime,\n type WeaverseNextRuntime,\n} from './runtime'\nimport type { WeaverseNextRuntimeInternal } from './types'\n\nconst STUDIO_BIND_RETRY_INTERVAL_MS = 50\nconst STUDIO_BIND_MAX_ATTEMPTS = 100\n\nexport interface WeaverseNextStudioBridgeProps {\n navigate?: WeaverseNextRuntimeInternal['navigate']\n revalidate?: WeaverseNextRuntimeInternal['revalidate']\n revalidateItem?: WeaverseNextRuntimeInternal['revalidateItem']\n runtime: WeaverseNextRuntime\n}\n\n/** Page-level Studio runtime binder. */\nexport function WeaverseNextStudioBridge(props: WeaverseNextStudioBridgeProps) {\n let { runtime, navigate, revalidate, revalidateItem } = props\n let lastRuntimeRef = useRef(runtime)\n let lastRuntimeDataRef = useRef(runtime.data)\n let lastRequestInfoRef = useRef(runtime.requestInfo)\n\n useEffect(() => {\n if (navigate) {\n runtime.internal.navigate = navigate\n }\n if (revalidate) {\n runtime.internal.revalidate = revalidate\n }\n if (revalidateItem) {\n runtime.internal.revalidateItem = revalidateItem\n }\n\n if (bindWeaverseNextStudioRuntime(runtime) || !runtime.isDesignMode) {\n return\n }\n\n let attempts = 0\n let interval = window.setInterval(() => {\n attempts += 1\n if (\n bindWeaverseNextStudioRuntime(runtime) ||\n attempts >= STUDIO_BIND_MAX_ATTEMPTS\n ) {\n window.clearInterval(interval)\n }\n }, STUDIO_BIND_RETRY_INTERVAL_MS)\n\n return () => window.clearInterval(interval)\n }, [runtime, navigate, revalidate, revalidateItem])\n\n useEffect(() => {\n if (lastRuntimeRef.current !== runtime) {\n lastRuntimeRef.current = runtime\n lastRuntimeDataRef.current = runtime.data\n lastRequestInfoRef.current = runtime.requestInfo\n return\n }\n\n if (\n lastRuntimeDataRef.current === runtime.data &&\n lastRequestInfoRef.current === runtime.requestInfo\n ) {\n return\n }\n\n lastRuntimeDataRef.current = runtime.data\n lastRequestInfoRef.current = runtime.requestInfo\n bindWeaverseNextStudioRuntime(runtime)\n }, [runtime, runtime.data, runtime.requestInfo])\n\n return null\n}\n","import type { WeaverseNextRuntimeInternal } from './types'\n\n/**\n * Minimal structural shape of the Next App Router returned by `useRouter()`\n * (`next/navigation`) that the Studio bridge needs. Declared locally — rather\n * than importing `AppRouterInstance` from `next` — so the adapter stays a pure\n * function that unit tests can drive with a plain mock and never pulls\n * `next/navigation` into the test graph.\n */\nexport interface WeaverseNextRouterLike {\n push: (href: string, options?: { scroll?: boolean }) => void\n refresh: () => void\n replace: (href: string, options?: { scroll?: boolean }) => void\n}\n\n/** Resolved Studio navigation/revalidation callbacks for a Next runtime. */\nexport interface WeaverseNextStudioInternals {\n navigate: NonNullable<WeaverseNextRuntimeInternal['navigate']>\n revalidate: NonNullable<WeaverseNextRuntimeInternal['revalidate']>\n}\n\nexport interface CreateWeaverseNextStudioInternalsOptions {\n /** Use `router.replace` instead of `router.push` for navigation. */\n replace?: boolean\n}\n\nfunction shouldResetScroll(\n options?: { preventScrollReset?: boolean } | Record<string, unknown>\n): boolean {\n if (!options || typeof options !== 'object') {\n return true\n }\n return !(options as { preventScrollReset?: boolean }).preventScrollReset\n}\n\n/**\n * Build Studio `navigate` / `revalidate` callbacks from a Next App Router.\n *\n * Maps Hydrogen's React Router semantics onto Next App Router:\n * - `navigate(to, { preventScrollReset })` → `router.push(to, { scroll })`,\n * where `scroll` is the inverse of `preventScrollReset`. Studio passes\n * `preventScrollReset` for in-place edits so the preview viewport is kept,\n * matching React Router's `navigate({ preventScrollReset })`.\n * - `revalidate()` → `router.refresh()`, the App Router's loader-backed refresh\n * and the closest equivalent to React Router's `useRevalidator`.\n *\n * Pure (no React, no `next/navigation`) so it is unit-testable with a mock\n * router; the {@link WeaverseNextRouterLike} contract is the only coupling.\n */\nexport function createWeaverseNextStudioInternals(\n router: WeaverseNextRouterLike,\n options: CreateWeaverseNextStudioInternalsOptions = {}\n): WeaverseNextStudioInternals {\n return {\n navigate: (to, navigateOptions) => {\n let scroll = shouldResetScroll(navigateOptions)\n if (options.replace) {\n router.replace(to, { scroll })\n } else {\n router.push(to, { scroll })\n }\n },\n revalidate: () => {\n router.refresh()\n },\n }\n}\n","'use client'\n\nimport { useRouter } from 'next/navigation'\nimport { useRef } from 'react'\nimport {\n DEFAULT_REVALIDATE_ENDPOINT,\n revalidateWeaverseNextItem,\n} from './revalidate-item'\nimport type { WeaverseNextRuntime } from './runtime'\nimport { WeaverseNextStudioBridge } from './studio-bridge'\nimport {\n type CreateWeaverseNextStudioInternalsOptions,\n createWeaverseNextStudioInternals,\n type WeaverseNextStudioInternals,\n} from './studio-router'\nimport type { WeaverseNextRuntimeInternal } from './types'\n\n/**\n * Resolve stable Studio `navigate` / `revalidate` callbacks from the Next App\n * Router. `useRouter()` is stable across renders, but the derived callbacks are\n * cached in a ref keyed on the router instance so the bridge's bind effect\n * (which depends on `navigate` / `revalidate` identity) doesn't re-run — and\n * re-`refreshStudio` — on every render.\n */\nexport function useWeaverseNextStudioInternals(\n options?: CreateWeaverseNextStudioInternalsOptions\n): WeaverseNextStudioInternals {\n let router = useRouter()\n let ref = useRef<{\n internals: WeaverseNextStudioInternals\n replace: boolean | undefined\n router: typeof router\n } | null>(null)\n\n if (\n !ref.current ||\n ref.current.router !== router ||\n ref.current.replace !== options?.replace\n ) {\n ref.current = {\n internals: createWeaverseNextStudioInternals(router, options),\n replace: options?.replace,\n router,\n }\n }\n\n return ref.current.internals\n}\n\nexport interface WeaverseNextStudioProps\n extends CreateWeaverseNextStudioInternalsOptions {\n /**\n * Route the app mounted with `createWeaverseNextRevalidateHandler`.\n * Defaults to `/api/weaverse/revalidate`.\n */\n revalidateEndpoint?: string\n runtime: WeaverseNextRuntime\n}\n\n/**\n * Page-level Studio binder wired to the Next App Router. Mirrors Hydrogen's\n * `useStudio` (which binds the runtime and feeds it React Router's `navigate` /\n * `revalidate`): it resolves the App Router callbacks via\n * {@link useWeaverseNextStudioInternals} and hands them to\n * {@link WeaverseNextStudioBridge}, so consuming apps get Studio navigation and\n * revalidation without manually wiring `next/navigation`.\n *\n * Client-only — it is the single place `@weaverse/next` touches\n * `next/navigation`, keeping the runtime/renderer and `@weaverse/next/server`\n * free of router imports.\n */\nexport function WeaverseNextStudio(props: WeaverseNextStudioProps) {\n let { runtime, replace, revalidateEndpoint } = props\n let { navigate, revalidate } = useWeaverseNextStudioInternals({ replace })\n let endpoint = revalidateEndpoint ?? DEFAULT_REVALIDATE_ENDPOINT\n // Cache per runtime+endpoint so the bridge bind effect (keyed on callback\n // identity) doesn't re-run — and re-`refreshStudio` — on every render.\n // `itemInstances` is a static registry shared by all Weaverse runtimes, so\n // any live runtime reference resolves the edited item.\n let revalidateItemRef = useRef<{\n endpoint: string\n revalidateItem: NonNullable<WeaverseNextRuntimeInternal['revalidateItem']>\n runtime: WeaverseNextRuntime\n } | null>(null)\n if (\n revalidateItemRef.current?.endpoint !== endpoint ||\n revalidateItemRef.current.runtime !== runtime\n ) {\n revalidateItemRef.current = {\n endpoint,\n revalidateItem: (draftItem) =>\n revalidateWeaverseNextItem(runtime, draftItem, endpoint),\n runtime,\n }\n }\n return (\n <WeaverseNextStudioBridge\n navigate={navigate}\n revalidate={revalidate}\n revalidateItem={revalidateItemRef.current.revalidateItem}\n runtime={runtime}\n />\n )\n}\n","'use client'\n\nimport { WeaverseRoot } from '@weaverse/react'\nimport { memo, useContext, useEffect, useLayoutEffect, useMemo } from 'react'\nimport { WeaverseNextContext } from './provider'\nimport { createWeaverseNextRuntime } from './runtime'\nimport type {\n WeaverseNextClient,\n WeaverseNextLoaderData,\n WeaverseNextPageData,\n} from './types'\nimport { WeaverseNextStudio } from './use-weaverse-next-studio'\n\nconst EMPTY_DATA_CONTEXT: Record<string, unknown> = {}\nconst useIsomorphicLayoutEffect =\n typeof window === 'undefined' ? useEffect : useLayoutEffect\n\nfunction getRenderablePage(\n data: WeaverseNextLoaderData | null | undefined\n): (WeaverseNextPageData & { rootId: string }) | null {\n let page = data?.page\n if (!page) {\n return null\n }\n let rootId =\n page.rootId ??\n page.items.find((item) => item.type === 'main')?.id ??\n page.items[0]?.id ??\n page.id\n return { ...page, rootId }\n}\n\nexport interface WeaverseNextRendererProps {\n /** Client to render from. Defaults to the provider's client. */\n client?: WeaverseNextClient\n /** Page payload to render. Defaults to `client.data`. */\n data?: WeaverseNextLoaderData | null\n /** Data-connector context for `{{...}}` template replacement. */\n dataContext?: Record<string, unknown>\n}\n\n/**\n * Render a serialized Weaverse page tree through `@weaverse/react` primitives.\n *\n * Reads the client/page data from {@link WeaverseNextContext} when no props are\n * passed, or accepts an explicit `client` + `data` for standalone use. Builds a\n * framework-neutral `Weaverse` core instance (no React Router hooks) and hands\n * it to the shared `WeaverseRoot`.\n */\nexport const WeaverseNextRenderer = memo(function WeaverseNextRendererComponent(\n props: WeaverseNextRendererProps\n) {\n let context = useContext(WeaverseNextContext)\n let client = props.client ?? context?.client\n let data = props.data ?? client?.data ?? null\n let dataContext =\n props.dataContext ?? client?.dataContext ?? EMPTY_DATA_CONTEXT\n\n let page = useMemo(() => getRenderablePage(data), [data])\n\n let weaverse = useMemo(() => {\n if (!page) {\n return null\n }\n\n return createWeaverseNextRuntime({\n client,\n data: { ...(data as WeaverseNextLoaderData), page },\n dataContext,\n merchantOverrides: context?.merchantOverrides,\n themeSettingsStore: context?.themeSettingsStore,\n translationStore: context?.translationStore,\n })\n }, [\n client,\n page,\n data,\n dataContext,\n context?.merchantOverrides,\n context?.themeSettingsStore,\n context?.translationStore,\n ])\n\n useIsomorphicLayoutEffect(() => {\n weaverse?.flushRenderPhaseUpdates()\n }, [weaverse])\n\n if (!weaverse) {\n return null\n }\n\n return (\n <>\n <WeaverseRoot context={weaverse} />\n <WeaverseNextStudio runtime={weaverse} />\n </>\n )\n})\n","import type { PageSEOData } from '@weaverse/schema'\nimport type { WeaverseNextLoaderData, WeaverseNextPageData } from './types'\n\nexport interface WeaverseNextSeoMetadata {\n alternates?: { canonical?: string }\n description?: string\n keywords?: string\n openGraph?: {\n description?: string\n images?: string[]\n title?: string\n type?: string\n }\n robots: {\n follow: boolean\n index: boolean\n }\n title?: string\n twitter?: {\n card?: string\n description?: string\n images?: string[]\n title?: string\n }\n}\n\nfunction hasOpenGraphContent(seo: PageSEOData['openGraph']): boolean {\n return Boolean(seo?.title || seo?.description || seo?.image || seo?.type)\n}\n\nfunction hasTwitterContent(seo: PageSEOData['twitter']): boolean {\n return Boolean(seo?.title || seo?.description || seo?.image || seo?.cardType)\n}\n\nexport function formatWeaverseNextSeoMetadata(\n seo: PageSEOData | null | undefined\n): WeaverseNextSeoMetadata {\n let index = seo?.robots?.index !== false\n let follow = seo?.robots?.follow !== false\n let metadata: WeaverseNextSeoMetadata = {\n robots: { index, follow },\n }\n\n if (!seo) {\n return metadata\n }\n\n if (seo.title) {\n metadata.title = seo.title\n }\n if (seo.description) {\n metadata.description = seo.description\n }\n if (seo.keywords) {\n metadata.keywords = seo.keywords\n }\n if (seo.canonicalUrl) {\n metadata.alternates = { canonical: seo.canonicalUrl }\n }\n\n let openGraph = seo.openGraph\n if (hasOpenGraphContent(openGraph)) {\n metadata.openGraph = {\n title: openGraph?.title,\n description: openGraph?.description,\n images: openGraph?.image ? [openGraph.image] : undefined,\n type: openGraph?.type || 'website',\n }\n }\n\n let twitter = seo.twitter\n if (hasTwitterContent(twitter)) {\n metadata.twitter = {\n card: twitter?.cardType || 'summary',\n title: twitter?.title,\n description: twitter?.description,\n images: twitter?.image ? [twitter.image] : undefined,\n }\n }\n\n return metadata\n}\n\nexport function getWeaverseNextSeoMetadata(\n data:\n | WeaverseNextLoaderData\n | WeaverseNextPageData\n | { page?: WeaverseNextPageData | null }\n | null\n | undefined\n): WeaverseNextSeoMetadata {\n if (!data) {\n return formatWeaverseNextSeoMetadata(null)\n }\n let page =\n 'items' in data && 'id' in data\n ? (data as WeaverseNextPageData)\n : ((data as { page?: WeaverseNextPageData | null }).page ?? null)\n return formatWeaverseNextSeoMetadata(page?.seo ?? null)\n}\n","import type { WeaverseNextRequestContext } from './types'\n\n/**\n * Weaverse-controlled apex domains the Studio bridge may be served from\n * (matched on the host itself and any subdomain), mirroring Hydrogen's\n * `TRUSTED_STUDIO_DOMAINS`.\n */\nconst TRUSTED_STUDIO_DOMAINS = ['weaverse.io', 'weaverse.dev']\n\nfunction isLoopbackHostname(hostname: string): boolean {\n return (\n hostname === 'localhost' ||\n hostname === '127.0.0.1' ||\n hostname.endsWith('.localhost')\n )\n}\n\nfunction normalizeOrigin(value: string | null): string | null {\n if (!value) {\n return null\n }\n\n try {\n return new URL(value).origin\n } catch {\n return null\n }\n}\n\n/**\n * Whether `origin` is one we trust to serve the Studio bridge script. Matches\n * Hydrogen's `isTrustedStudioHost`: trusts `weaverse.io` / `weaverse.dev` and\n * their subdomains over https, plus loopback (`localhost` / `*.localhost` /\n * `127.0.0.1`) — but only when the storefront itself is loopback (genuine\n * local-builder dev). Loopback is the only place http is allowed; every other\n * trusted host must be https. Arbitrary origins are rejected.\n */\nfunction isTrustedStudioOrigin(\n origin: string,\n storefrontHostname: string\n): boolean {\n let parsed: URL\n try {\n parsed = new URL(origin)\n } catch {\n return false\n }\n\n let { hostname, protocol } = parsed\n if (isLoopbackHostname(storefrontHostname) && isLoopbackHostname(hostname)) {\n return protocol === 'http:' || protocol === 'https:'\n }\n\n if (protocol !== 'https:') {\n return false\n }\n\n return TRUSTED_STUDIO_DOMAINS.some(\n (domain) => hostname === domain || hostname.endsWith(`.${domain}`)\n )\n}\n\nfunction toSearchParams(context?: WeaverseNextRequestContext): URLSearchParams {\n if (context?.searchParams) {\n return new URLSearchParams(context.searchParams)\n }\n\n if (context?.url) {\n let url =\n typeof context.url === 'string'\n ? new URL(context.url, 'http://localhost')\n : context.url\n return new URLSearchParams(url.searchParams)\n }\n\n return new URLSearchParams()\n}\n\nfunction last(searchParams: URLSearchParams, key: string): string | null {\n let values = searchParams.getAll(key)\n return values.length ? (values.at(-1) ?? null) : null\n}\n\nexport interface ResolveWeaverseNextStudioScriptSrcOptions {\n storefrontHostname?: string\n}\n\n/**\n * Resolve the Studio script URL from request/search context. `@weaverse/next`\n * uses the dedicated Next bridge path served by Builder.\n */\nexport function resolveWeaverseNextStudioScriptSrc(\n context?: WeaverseNextRequestContext,\n options: ResolveWeaverseNextStudioScriptSrcOptions = {}\n): string | null {\n let searchParams = toSearchParams(context)\n\n let isDesignMode =\n context?.isDesignMode ?? last(searchParams, 'isDesignMode') === 'true'\n let isPreviewMode =\n context?.isPreviewMode ?? last(searchParams, 'isPreviewMode') === 'true'\n let isRevisionPreview =\n context?.isRevisionPreview ?? Boolean(last(searchParams, '__revisionId'))\n\n if (!(isDesignMode || isPreviewMode || isRevisionPreview)) {\n return null\n }\n\n let origin = normalizeOrigin(last(searchParams, 'weaverseHost'))\n if (!origin) {\n return null\n }\n\n let storefrontHostname = options.storefrontHostname ?? ''\n if (!isTrustedStudioOrigin(origin, storefrontHostname)) {\n return null\n }\n\n let bundle = isDesignMode ? 'index.js' : 'preview.js'\n let version = last(searchParams, 'weaverseVersion')\n let url = `${origin}/static/studio/next/${bundle}`\n return version ? `${url}?v=${encodeURIComponent(version)}` : url\n}\n","'use client'\n\nimport { useEffect } from 'react'\nimport { resolveWeaverseNextStudioScriptSrc } from './studio-script-src'\nimport type { WeaverseNextRequestContext } from './types'\n\nconst loadedScriptSrcs = new Set<string>()\n\nfunction loadScript(src: string) {\n if (typeof document === 'undefined') {\n return\n }\n\n if (loadedScriptSrcs.has(src)) {\n return\n }\n\n let existing = document.querySelector(`script[src=\"${src}\"]`)\n if (existing) {\n loadedScriptSrcs.add(src)\n return\n }\n\n let script = document.createElement('script')\n script.async = true\n script.src = src\n document.head.appendChild(script)\n loadedScriptSrcs.add(src)\n}\n\nexport interface LoadWeaverseNextStudioScriptOptions {\n storefrontHostname?: string\n}\n\n/**\n * Resolve and append the Next Studio bridge script for the given request\n * context, deduping by src. SSR-safe (no-op without `document`) so it can run\n * unconditionally from a root layout/error boundary before any page tree or\n * runtime exists — e.g. App Router `not-found.tsx` / `error.tsx` routes.\n */\nexport function loadWeaverseNextStudioScript(\n context?: WeaverseNextRequestContext,\n options: LoadWeaverseNextStudioScriptOptions = {}\n) {\n let resolvedContext = context\n if (!resolvedContext && typeof window !== 'undefined') {\n resolvedContext = {\n searchParams: new URLSearchParams(window.location.search),\n url: window.location.href,\n }\n }\n\n let src = resolveWeaverseNextStudioScriptSrc(resolvedContext, {\n storefrontHostname:\n options.storefrontHostname ??\n (typeof window === 'undefined' ? undefined : window.location.hostname),\n })\n if (src) {\n loadScript(src)\n }\n}\n\nexport interface WeaverseNextStudioConnectProps {\n context?: WeaverseNextRequestContext\n storefrontHostname?: string\n}\n\n/**\n * Root-level Studio script connector for Next client boundaries. Mount once\n * near the app root (e.g. root layout) so it also covers routes that never\n * render `WeaverseNextRenderer`, such as `not-found.tsx` / `error.tsx`.\n */\nexport function WeaverseNextStudioConnect(\n props: WeaverseNextStudioConnectProps\n) {\n useEffect(() => {\n loadWeaverseNextStudioScript(props.context, {\n storefrontHostname: props.storefrontHostname,\n })\n }, [props.context, props.storefrontHostname])\n\n return null\n}\n"]}