@weaverse/next 0.1.0-alpha.1 → 0.1.0-alpha.2
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/README.md +17 -1
- package/dist/index.d.mts +67 -1
- package/dist/index.d.ts +67 -1
- package/dist/index.js +52 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +50 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -2
package/README.md
CHANGED
|
@@ -61,9 +61,25 @@ packages/next/src/
|
|
|
61
61
|
## Server API (`@weaverse/next/server`)
|
|
62
62
|
|
|
63
63
|
`createWeaverseNextServerClient(config)` returns a client that performs the real
|
|
64
|
-
Weaverse public API fetch — the equivalent of Hydrogen's
|
|
64
|
+
Weaverse public API fetch — the equivalent of Hydrogen/Pilot's
|
|
65
65
|
`context.weaverse.loadPage(...)`.
|
|
66
66
|
|
|
67
|
+
### Next App Router server context model
|
|
68
|
+
|
|
69
|
+
Hydrogen's classic storefront runtime is built on React Router. Its request
|
|
70
|
+
handler accepts `getLoadContext(request)`, creates a Hydrogen context, and React
|
|
71
|
+
Router injects that object into every route loader. That is why a Pilot route can
|
|
72
|
+
call `context.weaverse.loadPage(...)` directly.
|
|
73
|
+
|
|
74
|
+
Next App Router does not inject an app-defined global loader context into
|
|
75
|
+
`app/page.tsx`. A page is a Server Component whose framework-provided inputs are
|
|
76
|
+
`params` and `searchParams`; request-scoped data is read with Next functions such
|
|
77
|
+
as `headers()` / `cookies()`. Hydrogen preview follows that framework model for
|
|
78
|
+
Next examples: fetch in `app/page.tsx` or a server helper, then pass the snapshot
|
|
79
|
+
to client components.
|
|
80
|
+
|
|
81
|
+
So the Next equivalent is explicit server-client creation at the route boundary:
|
|
82
|
+
|
|
67
83
|
```ts
|
|
68
84
|
import { createWeaverseNextServerClient } from '@weaverse/next/server'
|
|
69
85
|
import { components } from '@/weaverse/components'
|
package/dist/index.d.mts
CHANGED
|
@@ -158,6 +158,47 @@ interface WeaverseNextStudioConnectProps {
|
|
|
158
158
|
/** Root-level Studio script connector for Next client boundaries. */
|
|
159
159
|
declare function WeaverseNextStudioConnect(props: WeaverseNextStudioConnectProps): null;
|
|
160
160
|
|
|
161
|
+
/**
|
|
162
|
+
* Minimal structural shape of the Next App Router returned by `useRouter()`
|
|
163
|
+
* (`next/navigation`) that the Studio bridge needs. Declared locally — rather
|
|
164
|
+
* than importing `AppRouterInstance` from `next` — so the adapter stays a pure
|
|
165
|
+
* function that unit tests can drive with a plain mock and never pulls
|
|
166
|
+
* `next/navigation` into the test graph.
|
|
167
|
+
*/
|
|
168
|
+
interface WeaverseNextRouterLike {
|
|
169
|
+
push: (href: string, options?: {
|
|
170
|
+
scroll?: boolean;
|
|
171
|
+
}) => void;
|
|
172
|
+
refresh: () => void;
|
|
173
|
+
replace: (href: string, options?: {
|
|
174
|
+
scroll?: boolean;
|
|
175
|
+
}) => void;
|
|
176
|
+
}
|
|
177
|
+
/** Resolved Studio navigation/revalidation callbacks for a Next runtime. */
|
|
178
|
+
interface WeaverseNextStudioInternals {
|
|
179
|
+
navigate: NonNullable<WeaverseNextRuntimeInternal['navigate']>;
|
|
180
|
+
revalidate: NonNullable<WeaverseNextRuntimeInternal['revalidate']>;
|
|
181
|
+
}
|
|
182
|
+
interface CreateWeaverseNextStudioInternalsOptions {
|
|
183
|
+
/** Use `router.replace` instead of `router.push` for navigation. */
|
|
184
|
+
replace?: boolean;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Build Studio `navigate` / `revalidate` callbacks from a Next App Router.
|
|
188
|
+
*
|
|
189
|
+
* Maps Hydrogen's React Router semantics onto Next App Router:
|
|
190
|
+
* - `navigate(to, { preventScrollReset })` → `router.push(to, { scroll })`,
|
|
191
|
+
* where `scroll` is the inverse of `preventScrollReset`. Studio passes
|
|
192
|
+
* `preventScrollReset` for in-place edits so the preview viewport is kept,
|
|
193
|
+
* matching React Router's `navigate({ preventScrollReset })`.
|
|
194
|
+
* - `revalidate()` → `router.refresh()`, the App Router's loader-backed refresh
|
|
195
|
+
* and the closest equivalent to React Router's `useRevalidator`.
|
|
196
|
+
*
|
|
197
|
+
* Pure (no React, no `next/navigation`) so it is unit-testable with a mock
|
|
198
|
+
* router; the {@link WeaverseNextRouterLike} contract is the only coupling.
|
|
199
|
+
*/
|
|
200
|
+
declare function createWeaverseNextStudioInternals(router: WeaverseNextRouterLike, options?: CreateWeaverseNextStudioInternalsOptions): WeaverseNextStudioInternals;
|
|
201
|
+
|
|
161
202
|
interface ResolveWeaverseNextStudioScriptSrcOptions {
|
|
162
203
|
framework?: 'hydrogen' | 'next';
|
|
163
204
|
storefrontHostname?: string;
|
|
@@ -181,4 +222,29 @@ interface CreateWeaverseNextThemeSettingsStoreOptions {
|
|
|
181
222
|
*/
|
|
182
223
|
declare function createWeaverseNextThemeSettingsStore(options?: CreateWeaverseNextThemeSettingsStoreOptions): WeaverseNextThemeSettingsStore;
|
|
183
224
|
|
|
184
|
-
|
|
225
|
+
/**
|
|
226
|
+
* Resolve stable Studio `navigate` / `revalidate` callbacks from the Next App
|
|
227
|
+
* Router. `useRouter()` is stable across renders, but the derived callbacks are
|
|
228
|
+
* cached in a ref keyed on the router instance so the bridge's bind effect
|
|
229
|
+
* (which depends on `navigate` / `revalidate` identity) doesn't re-run — and
|
|
230
|
+
* re-`refreshStudio` — on every render.
|
|
231
|
+
*/
|
|
232
|
+
declare function useWeaverseNextStudioInternals(options?: CreateWeaverseNextStudioInternalsOptions): WeaverseNextStudioInternals;
|
|
233
|
+
interface WeaverseNextStudioProps extends CreateWeaverseNextStudioInternalsOptions {
|
|
234
|
+
runtime: WeaverseNextRuntime;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Page-level Studio binder wired to the Next App Router. Mirrors Hydrogen's
|
|
238
|
+
* `useStudio` (which binds the runtime and feeds it React Router's `navigate` /
|
|
239
|
+
* `revalidate`): it resolves the App Router callbacks via
|
|
240
|
+
* {@link useWeaverseNextStudioInternals} and hands them to
|
|
241
|
+
* {@link WeaverseNextStudioBridge}, so consuming apps get Studio navigation and
|
|
242
|
+
* revalidation without manually wiring `next/navigation`.
|
|
243
|
+
*
|
|
244
|
+
* Client-only — it is the single place `@weaverse/next` touches
|
|
245
|
+
* `next/navigation`, keeping the runtime/renderer and `@weaverse/next/server`
|
|
246
|
+
* free of router imports.
|
|
247
|
+
*/
|
|
248
|
+
declare function WeaverseNextStudio(props: WeaverseNextStudioProps): react_jsx_runtime.JSX.Element;
|
|
249
|
+
|
|
250
|
+
export { type CreateWeaverseNextStudioInternalsOptions, type CreateWeaverseNextThemeSettingsStoreOptions, type ResolveWeaverseNextStudioScriptSrcOptions, type RunComponentLoadersArgs, WeaverseNextClient, WeaverseNextClientConfig, WeaverseNextCommerceContext, WeaverseNextLoaderData, WeaverseNextProvider, type WeaverseNextProviderProps, WeaverseNextRenderer, type WeaverseNextRendererProps, WeaverseNextRequestContext, WeaverseNextRequestInfo, type WeaverseNextRouterLike, WeaverseNextRuntime, WeaverseNextRuntimeConfig, WeaverseNextRuntimeInternal, WeaverseNextStudio, WeaverseNextStudioBridge, type WeaverseNextStudioBridgeProps, WeaverseNextStudioConnect, type WeaverseNextStudioConnectProps, type WeaverseNextStudioInternals, type WeaverseNextStudioProps, WeaverseNextThemeSettingsStore, bindWeaverseNextStudioRuntime, buildWeaverseNextRequestInfo, createWeaverseNextClient, createWeaverseNextRuntime, createWeaverseNextStudioInternals, createWeaverseNextThemeSettingsStore, resolveWeaverseNextStudioScriptSrc, runWeaverseComponentLoaders, useThemeSettings, useWeaverseCommerce, useWeaverseNextStudioInternals, useWeaversePageData, useWeaverseRootData };
|
package/dist/index.d.ts
CHANGED
|
@@ -158,6 +158,47 @@ interface WeaverseNextStudioConnectProps {
|
|
|
158
158
|
/** Root-level Studio script connector for Next client boundaries. */
|
|
159
159
|
declare function WeaverseNextStudioConnect(props: WeaverseNextStudioConnectProps): null;
|
|
160
160
|
|
|
161
|
+
/**
|
|
162
|
+
* Minimal structural shape of the Next App Router returned by `useRouter()`
|
|
163
|
+
* (`next/navigation`) that the Studio bridge needs. Declared locally — rather
|
|
164
|
+
* than importing `AppRouterInstance` from `next` — so the adapter stays a pure
|
|
165
|
+
* function that unit tests can drive with a plain mock and never pulls
|
|
166
|
+
* `next/navigation` into the test graph.
|
|
167
|
+
*/
|
|
168
|
+
interface WeaverseNextRouterLike {
|
|
169
|
+
push: (href: string, options?: {
|
|
170
|
+
scroll?: boolean;
|
|
171
|
+
}) => void;
|
|
172
|
+
refresh: () => void;
|
|
173
|
+
replace: (href: string, options?: {
|
|
174
|
+
scroll?: boolean;
|
|
175
|
+
}) => void;
|
|
176
|
+
}
|
|
177
|
+
/** Resolved Studio navigation/revalidation callbacks for a Next runtime. */
|
|
178
|
+
interface WeaverseNextStudioInternals {
|
|
179
|
+
navigate: NonNullable<WeaverseNextRuntimeInternal['navigate']>;
|
|
180
|
+
revalidate: NonNullable<WeaverseNextRuntimeInternal['revalidate']>;
|
|
181
|
+
}
|
|
182
|
+
interface CreateWeaverseNextStudioInternalsOptions {
|
|
183
|
+
/** Use `router.replace` instead of `router.push` for navigation. */
|
|
184
|
+
replace?: boolean;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Build Studio `navigate` / `revalidate` callbacks from a Next App Router.
|
|
188
|
+
*
|
|
189
|
+
* Maps Hydrogen's React Router semantics onto Next App Router:
|
|
190
|
+
* - `navigate(to, { preventScrollReset })` → `router.push(to, { scroll })`,
|
|
191
|
+
* where `scroll` is the inverse of `preventScrollReset`. Studio passes
|
|
192
|
+
* `preventScrollReset` for in-place edits so the preview viewport is kept,
|
|
193
|
+
* matching React Router's `navigate({ preventScrollReset })`.
|
|
194
|
+
* - `revalidate()` → `router.refresh()`, the App Router's loader-backed refresh
|
|
195
|
+
* and the closest equivalent to React Router's `useRevalidator`.
|
|
196
|
+
*
|
|
197
|
+
* Pure (no React, no `next/navigation`) so it is unit-testable with a mock
|
|
198
|
+
* router; the {@link WeaverseNextRouterLike} contract is the only coupling.
|
|
199
|
+
*/
|
|
200
|
+
declare function createWeaverseNextStudioInternals(router: WeaverseNextRouterLike, options?: CreateWeaverseNextStudioInternalsOptions): WeaverseNextStudioInternals;
|
|
201
|
+
|
|
161
202
|
interface ResolveWeaverseNextStudioScriptSrcOptions {
|
|
162
203
|
framework?: 'hydrogen' | 'next';
|
|
163
204
|
storefrontHostname?: string;
|
|
@@ -181,4 +222,29 @@ interface CreateWeaverseNextThemeSettingsStoreOptions {
|
|
|
181
222
|
*/
|
|
182
223
|
declare function createWeaverseNextThemeSettingsStore(options?: CreateWeaverseNextThemeSettingsStoreOptions): WeaverseNextThemeSettingsStore;
|
|
183
224
|
|
|
184
|
-
|
|
225
|
+
/**
|
|
226
|
+
* Resolve stable Studio `navigate` / `revalidate` callbacks from the Next App
|
|
227
|
+
* Router. `useRouter()` is stable across renders, but the derived callbacks are
|
|
228
|
+
* cached in a ref keyed on the router instance so the bridge's bind effect
|
|
229
|
+
* (which depends on `navigate` / `revalidate` identity) doesn't re-run — and
|
|
230
|
+
* re-`refreshStudio` — on every render.
|
|
231
|
+
*/
|
|
232
|
+
declare function useWeaverseNextStudioInternals(options?: CreateWeaverseNextStudioInternalsOptions): WeaverseNextStudioInternals;
|
|
233
|
+
interface WeaverseNextStudioProps extends CreateWeaverseNextStudioInternalsOptions {
|
|
234
|
+
runtime: WeaverseNextRuntime;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Page-level Studio binder wired to the Next App Router. Mirrors Hydrogen's
|
|
238
|
+
* `useStudio` (which binds the runtime and feeds it React Router's `navigate` /
|
|
239
|
+
* `revalidate`): it resolves the App Router callbacks via
|
|
240
|
+
* {@link useWeaverseNextStudioInternals} and hands them to
|
|
241
|
+
* {@link WeaverseNextStudioBridge}, so consuming apps get Studio navigation and
|
|
242
|
+
* revalidation without manually wiring `next/navigation`.
|
|
243
|
+
*
|
|
244
|
+
* Client-only — it is the single place `@weaverse/next` touches
|
|
245
|
+
* `next/navigation`, keeping the runtime/renderer and `@weaverse/next/server`
|
|
246
|
+
* free of router imports.
|
|
247
|
+
*/
|
|
248
|
+
declare function WeaverseNextStudio(props: WeaverseNextStudioProps): react_jsx_runtime.JSX.Element;
|
|
249
|
+
|
|
250
|
+
export { type CreateWeaverseNextStudioInternalsOptions, type CreateWeaverseNextThemeSettingsStoreOptions, type ResolveWeaverseNextStudioScriptSrcOptions, type RunComponentLoadersArgs, WeaverseNextClient, WeaverseNextClientConfig, WeaverseNextCommerceContext, WeaverseNextLoaderData, WeaverseNextProvider, type WeaverseNextProviderProps, WeaverseNextRenderer, type WeaverseNextRendererProps, WeaverseNextRequestContext, WeaverseNextRequestInfo, type WeaverseNextRouterLike, WeaverseNextRuntime, WeaverseNextRuntimeConfig, WeaverseNextRuntimeInternal, WeaverseNextStudio, WeaverseNextStudioBridge, type WeaverseNextStudioBridgeProps, WeaverseNextStudioConnect, type WeaverseNextStudioConnectProps, type WeaverseNextStudioInternals, type WeaverseNextStudioProps, WeaverseNextThemeSettingsStore, bindWeaverseNextStudioRuntime, buildWeaverseNextRequestInfo, createWeaverseNextClient, createWeaverseNextRuntime, createWeaverseNextStudioInternals, createWeaverseNextThemeSettingsStore, resolveWeaverseNextStudioScriptSrc, runWeaverseComponentLoaders, useThemeSettings, useWeaverseCommerce, useWeaverseNextStudioInternals, useWeaversePageData, useWeaverseRootData };
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,7 @@ var react = require('@weaverse/react');
|
|
|
4
4
|
var schema = require('@weaverse/schema');
|
|
5
5
|
var jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
var react$1 = require('react');
|
|
7
|
+
var navigation = require('next/navigation');
|
|
7
8
|
|
|
8
9
|
// src/index.ts
|
|
9
10
|
|
|
@@ -540,6 +541,53 @@ function WeaverseNextStudioBridge(props) {
|
|
|
540
541
|
}, [runtime, runtime.data, runtime.requestInfo]);
|
|
541
542
|
return null;
|
|
542
543
|
}
|
|
544
|
+
|
|
545
|
+
// src/studio-router.ts
|
|
546
|
+
function shouldResetScroll(options) {
|
|
547
|
+
if (!options || typeof options !== "object") {
|
|
548
|
+
return true;
|
|
549
|
+
}
|
|
550
|
+
return !options.preventScrollReset;
|
|
551
|
+
}
|
|
552
|
+
function createWeaverseNextStudioInternals(router, options = {}) {
|
|
553
|
+
return {
|
|
554
|
+
navigate: (to, navigateOptions) => {
|
|
555
|
+
let scroll = shouldResetScroll(navigateOptions);
|
|
556
|
+
if (options.replace) {
|
|
557
|
+
router.replace(to, { scroll });
|
|
558
|
+
} else {
|
|
559
|
+
router.push(to, { scroll });
|
|
560
|
+
}
|
|
561
|
+
},
|
|
562
|
+
revalidate: () => {
|
|
563
|
+
router.refresh();
|
|
564
|
+
}
|
|
565
|
+
};
|
|
566
|
+
}
|
|
567
|
+
function useWeaverseNextStudioInternals(options) {
|
|
568
|
+
let router = navigation.useRouter();
|
|
569
|
+
let ref = react$1.useRef(null);
|
|
570
|
+
if (!ref.current || ref.current.router !== router || ref.current.replace !== options?.replace) {
|
|
571
|
+
ref.current = {
|
|
572
|
+
internals: createWeaverseNextStudioInternals(router, options),
|
|
573
|
+
replace: options?.replace,
|
|
574
|
+
router
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
return ref.current.internals;
|
|
578
|
+
}
|
|
579
|
+
function WeaverseNextStudio(props) {
|
|
580
|
+
let { runtime, replace } = props;
|
|
581
|
+
let { navigate, revalidate } = useWeaverseNextStudioInternals({ replace });
|
|
582
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
583
|
+
WeaverseNextStudioBridge,
|
|
584
|
+
{
|
|
585
|
+
navigate,
|
|
586
|
+
revalidate,
|
|
587
|
+
runtime
|
|
588
|
+
}
|
|
589
|
+
);
|
|
590
|
+
}
|
|
543
591
|
var EMPTY_DATA_CONTEXT = {};
|
|
544
592
|
function getRenderablePage2(data) {
|
|
545
593
|
let page = data?.page;
|
|
@@ -571,7 +619,7 @@ var WeaverseNextRenderer = react$1.memo(function WeaverseNextRendererComponent(p
|
|
|
571
619
|
}
|
|
572
620
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
573
621
|
/* @__PURE__ */ jsxRuntime.jsx(react.WeaverseRoot, { context: weaverse }),
|
|
574
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
622
|
+
/* @__PURE__ */ jsxRuntime.jsx(WeaverseNextStudio, { runtime: weaverse })
|
|
575
623
|
] });
|
|
576
624
|
});
|
|
577
625
|
|
|
@@ -715,17 +763,20 @@ Object.defineProperty(exports, "createSchema", {
|
|
|
715
763
|
exports.WeaverseNextProvider = WeaverseNextProvider;
|
|
716
764
|
exports.WeaverseNextRenderer = WeaverseNextRenderer;
|
|
717
765
|
exports.WeaverseNextRuntime = WeaverseNextRuntime;
|
|
766
|
+
exports.WeaverseNextStudio = WeaverseNextStudio;
|
|
718
767
|
exports.WeaverseNextStudioBridge = WeaverseNextStudioBridge;
|
|
719
768
|
exports.WeaverseNextStudioConnect = WeaverseNextStudioConnect;
|
|
720
769
|
exports.bindWeaverseNextStudioRuntime = bindWeaverseNextStudioRuntime;
|
|
721
770
|
exports.buildWeaverseNextRequestInfo = buildWeaverseNextRequestInfo;
|
|
722
771
|
exports.createWeaverseNextClient = createWeaverseNextClient;
|
|
723
772
|
exports.createWeaverseNextRuntime = createWeaverseNextRuntime;
|
|
773
|
+
exports.createWeaverseNextStudioInternals = createWeaverseNextStudioInternals;
|
|
724
774
|
exports.createWeaverseNextThemeSettingsStore = createWeaverseNextThemeSettingsStore;
|
|
725
775
|
exports.resolveWeaverseNextStudioScriptSrc = resolveWeaverseNextStudioScriptSrc;
|
|
726
776
|
exports.runWeaverseComponentLoaders = runWeaverseComponentLoaders;
|
|
727
777
|
exports.useThemeSettings = useThemeSettings;
|
|
728
778
|
exports.useWeaverseCommerce = useWeaverseCommerce;
|
|
779
|
+
exports.useWeaverseNextStudioInternals = useWeaverseNextStudioInternals;
|
|
729
780
|
exports.useWeaversePageData = useWeaversePageData;
|
|
730
781
|
exports.useWeaverseRootData = useWeaverseRootData;
|
|
731
782
|
//# sourceMappingURL=index.js.map
|
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/provider.tsx","../src/hooks.ts","../src/loader.ts","../src/request-info.ts","../src/runtime.ts","../src/studio-bridge.tsx","../src/renderer.tsx","../src/studio-script-src.ts","../src/studio-connect.tsx"],"names":["WeaverseItemStore","Weaverse","jsx","createSchema","createContext","useMemo","useContext","useSyncExternalStore","useRef","useEffect","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 { createContext, type ReactNode, useMemo } from 'react'\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\n let themeSettingsValue =\n themeSettings ?? client?.themeSettings ?? EMPTY_THEME_SETTINGS\n let themeSettingsStore = useMemo(\n () =>\n createWeaverseNextThemeSettingsStore({\n schema: client?.themeSchema,\n settings: themeSettingsValue,\n }),\n [client?.themeSchema, themeSettingsValue]\n )\n\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\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 = getSearchParamsFromContext(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}\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 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 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 studio.refreshStudio?.({\n data: runtime.data,\n pageId: runtime.pageId,\n requestInfo: runtime.requestInfo,\n })\n return true\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 runtime: WeaverseNextRuntime\n}\n\n/** Page-level Studio runtime binder. */\nexport function WeaverseNextStudioBridge(props: WeaverseNextStudioBridgeProps) {\n let { runtime, navigate, revalidate } = 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\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])\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","'use client'\n\nimport { WeaverseRoot } from '@weaverse/react'\nimport { memo, useContext, useMemo } from 'react'\nimport { WeaverseNextContext } from './provider'\nimport { createWeaverseNextRuntime } from './runtime'\nimport { WeaverseNextStudioBridge } from './studio-bridge'\nimport type {\n WeaverseNextClient,\n WeaverseNextLoaderData,\n WeaverseNextPageData,\n} from './types'\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 <WeaverseNextStudioBridge runtime={weaverse} />\n </>\n )\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 framework?: 'hydrogen' | 'next'\n storefrontHostname?: string\n}\n\n/**\n * Resolve the Studio script URL from request/search context. v0 intentionally\n * reuses the existing structural Hydrogen bridge script until a concrete Builder\n * incompatibility requires a dedicated Next bundle.\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 framework = options.framework ?? 'hydrogen'\n let bundle = isDesignMode ? 'index.js' : 'preview.js'\n let version = last(searchParams, 'weaverseVersion')\n let url = `${origin}/static/studio/${framework}/${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 WeaverseNextStudioConnectProps {\n context?: WeaverseNextRequestContext\n storefrontHostname?: string\n}\n\n/** Root-level Studio script connector for Next client boundaries. */\nexport function WeaverseNextStudioConnect(\n props: WeaverseNextStudioConnectProps\n) {\n useEffect(() => {\n let context = props.context\n if (!context && typeof window !== 'undefined') {\n context = {\n searchParams: new URLSearchParams(window.location.search),\n url: window.location.href,\n }\n }\n\n let src = resolveWeaverseNextStudioScriptSrc(context, {\n storefrontHostname:\n props.storefrontHostname ??\n (typeof window === 'undefined' ? undefined : window.location.hostname),\n })\n if (src) {\n loadScript(src)\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/provider.tsx","../src/hooks.ts","../src/loader.ts","../src/request-info.ts","../src/runtime.ts","../src/studio-bridge.tsx","../src/studio-router.ts","../src/use-weaverse-next-studio.tsx","../src/renderer.tsx","../src/studio-script-src.ts","../src/studio-connect.tsx"],"names":["WeaverseItemStore","Weaverse","jsx","createSchema","createContext","useMemo","useContext","useSyncExternalStore","useRef","useEffect","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 { createContext, type ReactNode, useMemo } from 'react'\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\n let themeSettingsValue =\n themeSettings ?? client?.themeSettings ?? EMPTY_THEME_SETTINGS\n let themeSettingsStore = useMemo(\n () =>\n createWeaverseNextThemeSettingsStore({\n schema: client?.themeSchema,\n settings: themeSettingsValue,\n }),\n [client?.themeSchema, themeSettingsValue]\n )\n\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\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 = getSearchParamsFromContext(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}\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 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 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 studio.refreshStudio?.({\n data: runtime.data,\n pageId: runtime.pageId,\n requestInfo: runtime.requestInfo,\n })\n return true\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 runtime: WeaverseNextRuntime\n}\n\n/** Page-level Studio runtime binder. */\nexport function WeaverseNextStudioBridge(props: WeaverseNextStudioBridgeProps) {\n let { runtime, navigate, revalidate } = 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\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])\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 type { WeaverseNextRuntime } from './runtime'\nimport { WeaverseNextStudioBridge } from './studio-bridge'\nimport {\n type CreateWeaverseNextStudioInternalsOptions,\n createWeaverseNextStudioInternals,\n type WeaverseNextStudioInternals,\n} from './studio-router'\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 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 } = props\n let { navigate, revalidate } = useWeaverseNextStudioInternals({ replace })\n return (\n <WeaverseNextStudioBridge\n navigate={navigate}\n revalidate={revalidate}\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 { 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 framework?: 'hydrogen' | 'next'\n storefrontHostname?: string\n}\n\n/**\n * Resolve the Studio script URL from request/search context. v0 intentionally\n * reuses the existing structural Hydrogen bridge script until a concrete Builder\n * incompatibility requires a dedicated Next bundle.\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 framework = options.framework ?? 'hydrogen'\n let bundle = isDesignMode ? 'index.js' : 'preview.js'\n let version = last(searchParams, 'weaverseVersion')\n let url = `${origin}/static/studio/${framework}/${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 WeaverseNextStudioConnectProps {\n context?: WeaverseNextRequestContext\n storefrontHostname?: string\n}\n\n/** Root-level Studio script connector for Next client boundaries. */\nexport function WeaverseNextStudioConnect(\n props: WeaverseNextStudioConnectProps\n) {\n useEffect(() => {\n let context = props.context\n if (!context && typeof window !== 'undefined') {\n context = {\n searchParams: new URLSearchParams(window.location.search),\n url: window.location.href,\n }\n }\n\n let src = resolveWeaverseNextStudioScriptSrc(context, {\n storefrontHostname:\n props.storefrontHostname ??\n (typeof window === 'undefined' ? undefined : window.location.hostname),\n })\n if (src) {\n loadScript(src)\n }\n }, [props.context, props.storefrontHostname])\n\n return null\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -6,6 +6,7 @@ import { createSchema } from '@weaverse/schema';
|
|
|
6
6
|
export { createSchema } from '@weaverse/schema';
|
|
7
7
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
8
8
|
import { createContext, memo, useContext, useMemo, useRef, useEffect, useSyncExternalStore } from 'react';
|
|
9
|
+
import { useRouter } from 'next/navigation';
|
|
9
10
|
|
|
10
11
|
var WeaverseNextItem = class extends WeaverseItemStore {
|
|
11
12
|
constructor(initialData, weaverse) {
|
|
@@ -391,6 +392,53 @@ function WeaverseNextStudioBridge(props) {
|
|
|
391
392
|
}, [runtime, runtime.data, runtime.requestInfo]);
|
|
392
393
|
return null;
|
|
393
394
|
}
|
|
395
|
+
|
|
396
|
+
// src/studio-router.ts
|
|
397
|
+
function shouldResetScroll(options) {
|
|
398
|
+
if (!options || typeof options !== "object") {
|
|
399
|
+
return true;
|
|
400
|
+
}
|
|
401
|
+
return !options.preventScrollReset;
|
|
402
|
+
}
|
|
403
|
+
function createWeaverseNextStudioInternals(router, options = {}) {
|
|
404
|
+
return {
|
|
405
|
+
navigate: (to, navigateOptions) => {
|
|
406
|
+
let scroll = shouldResetScroll(navigateOptions);
|
|
407
|
+
if (options.replace) {
|
|
408
|
+
router.replace(to, { scroll });
|
|
409
|
+
} else {
|
|
410
|
+
router.push(to, { scroll });
|
|
411
|
+
}
|
|
412
|
+
},
|
|
413
|
+
revalidate: () => {
|
|
414
|
+
router.refresh();
|
|
415
|
+
}
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
function useWeaverseNextStudioInternals(options) {
|
|
419
|
+
let router = useRouter();
|
|
420
|
+
let ref = useRef(null);
|
|
421
|
+
if (!ref.current || ref.current.router !== router || ref.current.replace !== options?.replace) {
|
|
422
|
+
ref.current = {
|
|
423
|
+
internals: createWeaverseNextStudioInternals(router, options),
|
|
424
|
+
replace: options?.replace,
|
|
425
|
+
router
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
return ref.current.internals;
|
|
429
|
+
}
|
|
430
|
+
function WeaverseNextStudio(props) {
|
|
431
|
+
let { runtime, replace } = props;
|
|
432
|
+
let { navigate, revalidate } = useWeaverseNextStudioInternals({ replace });
|
|
433
|
+
return /* @__PURE__ */ jsx(
|
|
434
|
+
WeaverseNextStudioBridge,
|
|
435
|
+
{
|
|
436
|
+
navigate,
|
|
437
|
+
revalidate,
|
|
438
|
+
runtime
|
|
439
|
+
}
|
|
440
|
+
);
|
|
441
|
+
}
|
|
394
442
|
var EMPTY_DATA_CONTEXT = {};
|
|
395
443
|
function getRenderablePage2(data) {
|
|
396
444
|
let page = data?.page;
|
|
@@ -422,7 +470,7 @@ var WeaverseNextRenderer = memo(function WeaverseNextRendererComponent(props) {
|
|
|
422
470
|
}
|
|
423
471
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
424
472
|
/* @__PURE__ */ jsx(WeaverseRoot, { context: weaverse }),
|
|
425
|
-
/* @__PURE__ */ jsx(
|
|
473
|
+
/* @__PURE__ */ jsx(WeaverseNextStudio, { runtime: weaverse })
|
|
426
474
|
] });
|
|
427
475
|
});
|
|
428
476
|
|
|
@@ -535,6 +583,6 @@ function WeaverseNextStudioConnect(props) {
|
|
|
535
583
|
return null;
|
|
536
584
|
}
|
|
537
585
|
|
|
538
|
-
export { WeaverseNextProvider, WeaverseNextRenderer, WeaverseNextRuntime, WeaverseNextStudioBridge, WeaverseNextStudioConnect, bindWeaverseNextStudioRuntime, createWeaverseNextClient, createWeaverseNextRuntime, createWeaverseNextThemeSettingsStore, resolveWeaverseNextStudioScriptSrc, useThemeSettings, useWeaverseCommerce, useWeaversePageData, useWeaverseRootData };
|
|
586
|
+
export { WeaverseNextProvider, WeaverseNextRenderer, WeaverseNextRuntime, WeaverseNextStudio, WeaverseNextStudioBridge, WeaverseNextStudioConnect, bindWeaverseNextStudioRuntime, createWeaverseNextClient, createWeaverseNextRuntime, createWeaverseNextStudioInternals, createWeaverseNextThemeSettingsStore, resolveWeaverseNextStudioScriptSrc, useThemeSettings, useWeaverseCommerce, useWeaverseNextStudioInternals, useWeaversePageData, useWeaverseRootData };
|
|
539
587
|
//# sourceMappingURL=index.mjs.map
|
|
540
588
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/item.ts","../src/main.tsx","../src/registry.ts","../src/client.ts","../src/theme-settings-store.ts","../src/provider.tsx","../src/hooks.ts","../src/runtime.ts","../src/studio-bridge.tsx","../src/renderer.tsx","../src/studio-script-src.ts","../src/studio-connect.tsx"],"names":["Weaverse","jsx","getRenderablePage","useContext","useMemo","useEffect"],"mappings":"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","file":"index.mjs","sourcesContent":["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 { createContext, type ReactNode, useMemo } from 'react'\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\n let themeSettingsValue =\n themeSettings ?? client?.themeSettings ?? EMPTY_THEME_SETTINGS\n let themeSettingsStore = useMemo(\n () =>\n createWeaverseNextThemeSettingsStore({\n schema: client?.themeSchema,\n settings: themeSettingsValue,\n }),\n [client?.themeSchema, themeSettingsValue]\n )\n\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 { 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}\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 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 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 studio.refreshStudio?.({\n data: runtime.data,\n pageId: runtime.pageId,\n requestInfo: runtime.requestInfo,\n })\n return true\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 runtime: WeaverseNextRuntime\n}\n\n/** Page-level Studio runtime binder. */\nexport function WeaverseNextStudioBridge(props: WeaverseNextStudioBridgeProps) {\n let { runtime, navigate, revalidate } = 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\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])\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","'use client'\n\nimport { WeaverseRoot } from '@weaverse/react'\nimport { memo, useContext, useMemo } from 'react'\nimport { WeaverseNextContext } from './provider'\nimport { createWeaverseNextRuntime } from './runtime'\nimport { WeaverseNextStudioBridge } from './studio-bridge'\nimport type {\n WeaverseNextClient,\n WeaverseNextLoaderData,\n WeaverseNextPageData,\n} from './types'\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 <WeaverseNextStudioBridge runtime={weaverse} />\n </>\n )\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 framework?: 'hydrogen' | 'next'\n storefrontHostname?: string\n}\n\n/**\n * Resolve the Studio script URL from request/search context. v0 intentionally\n * reuses the existing structural Hydrogen bridge script until a concrete Builder\n * incompatibility requires a dedicated Next bundle.\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 framework = options.framework ?? 'hydrogen'\n let bundle = isDesignMode ? 'index.js' : 'preview.js'\n let version = last(searchParams, 'weaverseVersion')\n let url = `${origin}/static/studio/${framework}/${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 WeaverseNextStudioConnectProps {\n context?: WeaverseNextRequestContext\n storefrontHostname?: string\n}\n\n/** Root-level Studio script connector for Next client boundaries. */\nexport function WeaverseNextStudioConnect(\n props: WeaverseNextStudioConnectProps\n) {\n useEffect(() => {\n let context = props.context\n if (!context && typeof window !== 'undefined') {\n context = {\n searchParams: new URLSearchParams(window.location.search),\n url: window.location.href,\n }\n }\n\n let src = resolveWeaverseNextStudioScriptSrc(context, {\n storefrontHostname:\n props.storefrontHostname ??\n (typeof window === 'undefined' ? undefined : window.location.hostname),\n })\n if (src) {\n loadScript(src)\n }\n }, [props.context, props.storefrontHostname])\n\n return null\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/item.ts","../src/main.tsx","../src/registry.ts","../src/client.ts","../src/theme-settings-store.ts","../src/provider.tsx","../src/hooks.ts","../src/runtime.ts","../src/studio-bridge.tsx","../src/studio-router.ts","../src/use-weaverse-next-studio.tsx","../src/renderer.tsx","../src/studio-script-src.ts","../src/studio-connect.tsx"],"names":["Weaverse","jsx","useRef","getRenderablePage","useContext","useMemo","useEffect"],"mappings":";;;;;;;;;;AAUO,IAAM,gBAAA,GAAN,cAA+B,iBAAA,CAAkB;AAAA,EACtD,WAAA,CAAY,aAAwC,QAAA,EAAoB;AACtE,IAAA,KAAA,CAAM,aAA4B,QAAQ,CAAA;AAC1C,IAAA,IAAI,EAAE,IAAA,EAAM,GAAG,IAAA,EAAK,GAAI,WAAA;AACxB,IAAA,IAAI,UAAA,GAAa,sBAAA,CAAuB,IAAA,CAAK,OAAA,EAAS,MAAM,CAAA;AAC5D,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,MAAA,EAAQ,UAAA,EAAY,MAAM,IAAI,CAAA;AAAA,EACnD;AACF,CAAA;AAMO,SAAS,yBAAA,GAA4B;AAC1C,EAAA,IACE,CAAC,SAAS,eAAA,IACV,QAAA,CAAS,oBAAoB,iBAAA,IAC7B,QAAA,CAAS,oBAAoB,gBAAA,EAC7B;AACA,IAAA,QAAA,CAAS,eAAA,GAAkB,gBAAA;AAAA,EAC7B;AACF;ACbA,SAAS,KACP,KAAA,EAGA;AACA,EAAA,IAAI,EAAE,QAAA,EAAU,UAAA,EAAY,GAAG,MAAK,GAAI,KAAA;AAGxC,EAAA,uBAAO,GAAA,CAAC,KAAA,EAAA,EAAK,GAAI,IAAA,EAA0C,QAAA,EAAS,CAAA;AACtE;AACA,IAAA,CAAK,WAAA,GAAc,MAAA;AAGZ,IAAM,aAAyB,YAAA,CAAa;AAAA,EACjD,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAC,CAAA;AAOM,IAAM,oBAAA,GAA8C;AAAA,EACzD,OAAA,EAAS,IAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;;;ACvCA,IAAM,SAAA,GAAY,MAAA;AAOlB,IAAM,wBAAA,uBAA+B,GAAA,EAAY;AAc1C,SAAS,+BACd,UAAA,EACA;AACA,EAAA,yBAAA,EAA0B;AAE1B,EAAA,IAAI,cAAc,UAAA,CAAW,IAAA;AAAA,IAC3B,CAAC,SAAA,KAAc,SAAA,CAAU,MAAA,EAAQ,IAAA,KAAS;AAAA,GAC5C;AACA,EAAA,IAAI,sBAAsB,WAAA,GACtB,UAAA,GACA,CAAC,oBAAA,EAAsB,GAAG,UAAU,CAAA;AAExC,EAAA,KAAA,IAAS,aAAa,mBAAA,EAAqB;AACzC,IAAA,IAAI,IAAA,GAAO,UAAU,MAAA,CAAO,IAAA;AAC5B,IAAA,IAAI,OAAA,GAAU;AAAA,MACZ,IAAA;AAAA,MACA,WAAW,SAAA,CAAU,OAAA;AAAA,MACrB,QAAQ,SAAA,CAAU,MAAA;AAAA,MAClB,QAAQ,SAAA,CAAU;AAAA,KACpB;AAEA,IAAA,IAAI,IAAA,KAAS,aAAa,WAAA,EAAa;AAKrC,MAAAA,QAAAA,CAAS,eAAA,CAAgB,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AAC1C,MAAA,wBAAA,CAAyB,IAAI,IAAI,CAAA;AACjC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,IAAQ,CAAC,wBAAA,CAAyB,GAAA,CAAI,IAAI,CAAA,EAAG;AAC/C,MAAAA,QAAAA,CAAS,gBAAgB,OAAO,CAAA;AAChC,MAAA,wBAAA,CAAyB,IAAI,IAAI,CAAA;AAAA,IACnC;AAAA,EACF;AACF;;;ACvCA,IAAM,aAAN,MAA+C;AAAA,EAC7C,SAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA,GAAsC,IAAA;AAAA,EACtC,cAAuC,EAAC;AAAA,EAEvB,UAAA;AAAA,EACA,mBAAA;AAAA,EAEjB,YAAY,MAAA,EAAkC;AAC5C,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AACxB,IAAA,IAAA,CAAK,aAAa,MAAA,CAAO,UAAA;AACzB,IAAA,8BAAA,CAA+B,KAAK,UAAU,CAAA;AAC9C,IAAA,IAAA,CAAK,cAAc,MAAA,CAAO,WAAA;AAK1B,IAAA,IAAA,CAAK,aAAA,GAAgB;AAAA,MACnB,GAAG,sBAAA,CAAuB,MAAA,CAAO,WAAqC,CAAA;AAAA,MACtE,GAAG,MAAA,CAAO;AAAA,KACZ;AACA,IAAA,IAAA,CAAK,iBAAiB,MAAA,CAAO,cAAA;AAC7B,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AACvB,IAAA,IAAA,CAAK,aAAa,MAAA,CAAO,SAAA;AACzB,IAAA,IAAA,CAAK,sBAAsB,MAAA,CAAO,kBAAA;AAAA,EACpC;AAAA;AAAA,EAGA,IAAI,UAAA,GAAiD;AACnD,IAAA,OAAO,KAAK,QAAA,EAAU,UAAA;AAAA,EACxB;AAAA,EAEA,QAAA,GAAW,CACT,KAAA,GAAmC,EAAC,KACO;AAC3C,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA,EAC9B,CAAA;AAAA,EAEA,iBAAA,GAAoB,CAClB,OAAA,KACqB;AACrB,IAAA,IAAI,CAAC,KAAK,mBAAA,EAAqB;AAC7B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,OAAA,IAAW,IAAA,CAAK,cAAc,CAAA;AAAA,EAChE,CAAA;AACF,CAAA;AAeO,SAAS,yBACd,MAAA,EACoB;AACpB,EAAA,OAAO,IAAI,WAAW,MAAM,CAAA;AAC9B;;;ACvFO,SAAS,oCAAA,CACd,OAAA,GAAuD,EAAC,EACxB;AAChC,EAAA,IAAI,SAAA,uBAAgB,GAAA,EAAgB;AACpC,EAAA,IAAI,KAAA,GAAwC;AAAA,IAC1C,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,UAAU,EAAE,GAAI,OAAA,CAAQ,QAAA,IAAY,EAAC,EAAG;AAAA,IACxC,iBAAA,EAAmB,MAAM,KAAA,CAAM,QAAA;AAAA,IAC/B,WAAA,EAAa,MAAM,KAAA,CAAM,QAAA;AAAA,IACzB,SAAA,EAAW,CAAC,QAAA,KAAyB;AACnC,MAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,MAAA,OAAO,MAAM;AACX,QAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,MAC3B,CAAA;AAAA,IACF,CAAA;AAAA,IACA,mBAAA,EAAqB,CAAC,IAAA,KAAkC;AACtD,MAAA,KAAA,CAAM,WAAW,EAAE,GAAG,KAAA,CAAM,QAAA,EAAU,GAAG,IAAA,EAAK;AAC9C,MAAA,KAAA,IAAS,YAAY,SAAA,EAAW;AAC9B,QAAA,QAAA,EAAS;AAAA,MACX;AAAA,IACF;AAAA,GACF;AAEA,EAAA,OAAO,KAAA;AACT;AC5BA,IAAM,uBAAgD,EAAC;AAoBhD,IAAM,mBAAA,GACX,cAA+C,IAAI,CAAA;AAiC9C,SAAS,qBAAqB,KAAA,EAAkC;AACrE,EAAA,IAAI,EAAE,QAAA,EAAU,MAAA,EAAQ,UAAU,QAAA,EAAU,QAAA,EAAU,eAAc,GAAI,KAAA;AAExE,EAAA,IAAI,kBAAA,GACF,aAAA,IAAiB,MAAA,EAAQ,aAAA,IAAiB,oBAAA;AAC5C,EAAA,IAAI,kBAAA,GAAqB,OAAA;AAAA,IACvB,MACE,oCAAA,CAAqC;AAAA,MACnC,QAAQ,MAAA,EAAQ,WAAA;AAAA,MAChB,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,IACH,CAAC,MAAA,EAAQ,WAAA,EAAa,kBAAkB;AAAA,GAC1C;AAEA,EAAA,IAAI,KAAA,GAAQ,OAAA;AAAA,IACV,OAAO;AAAA,MACL,MAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA,EAAU,YAAY,MAAA,EAAQ,QAAA;AAAA,MAC9B,aAAA,EAAe,mBAAmB,WAAA,EAAY;AAAA,MAC9C;AAAA,KACF,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,QAAA,EAAU,QAAA,EAAU,UAAU,kBAAkB;AAAA,GAC3D;AAEA,EAAA,uBACEC,GAAAA,CAAC,mBAAA,CAAoB,QAAA,EAApB,EAA6B,OAC3B,QAAA,EACH,CAAA;AAEJ;;;ACzFA,IAAM,sBAAA,GAAyB,+CAAA;AAE/B,SAAS,uBAAuB,QAAA,EAAkB;AAChD,EAAA,IAAI,OAAA,GAAU,WAAW,mBAAmB,CAAA;AAC5C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,QAAQ,CAAA,CAAA,EAAI,sBAAsB,CAAA,CAAE,CAAA;AAAA,EAC1E;AACA,EAAA,OAAO,OAAA;AACT;AAMO,SAAS,mBAAA,GAAsC;AACpD,EAAA,OAAO,sBAAA,CAAuB,qBAAqB,CAAA,CAAE,QAAA;AACvD;AAMO,SAAS,mBAAA,GAAsC;AACpD,EAAA,OAAO,sBAAA,CAAuB,qBAAqB,CAAA,CAAE,QAAA;AACvD;AAGO,SAAS,mBAAA,GAA0D;AACxE,EAAA,OAAO,sBAAA,CAAuB,qBAAqB,CAAA,CAAE,QAAA;AACvD;AAOO,SAAS,gBAAA,GAAmD;AACjE,EAAA,IAAI,EAAE,kBAAA,EAAmB,GAAI,sBAAA,CAAuB,kBAAkB,CAAA;AACtE,EAAA,OAAO,oBAAA;AAAA,IACL,kBAAA,CAAmB,SAAA;AAAA,IACnB,kBAAA,CAAmB,WAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA,GACrB;AACF;ACxBA,SAAS,gBAAA,GAAuC;AAC9C,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,GAAY,MAAA;AACrD;AAEA,SAAS,kBACP,IAAA,EAC2C;AAC3C,EAAA,IAAI,OAAO,IAAA,CAAK,IAAA;AAChB,EAAA,IAAI,SACF,IAAA,CAAK,MAAA,IACL,KAAK,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,KAAS,MAAM,GAAG,EAAA,IACjD,IAAA,CAAK,MAAM,CAAC,CAAA,EAAG,MACf,IAAA,CAAK,EAAA;AACP,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAO;AAC3B;AAEA,SAAS,eAAA,CACP,SACA,GAAA,EACoB;AACpB,EAAA,IAAI,KAAA,GAAQ,UAAU,GAAG,CAAA;AACzB,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAC7C;AAEA,SAAS,eAAA,CACP,QACA,GAAA,EACoB;AACpB,EAAA,IAAI,KAAA,GAAQ,SAAS,GAAG,CAAA;AACxB,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAC7C;AAEA,SAAS,gBAAA,CACP,MAAA,EACA,IAAA,EACA,QAAA,EACQ;AACR,EAAA,IAAI,YAAY,MAAA,EAAQ,SAAA;AACxB,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,SAAA;AAAA,EACT;AAEA,EAAA,IAAI,eAAA,GAAkB,eAAA,CAAgB,IAAA,CAAK,OAAA,EAAS,WAAW,CAAA;AAC/D,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,OAAO,eAAA;AAAA,EACT;AAEA,EAAA,OAAO,eAAA,CAAgB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA,IAAK,QAAA;AAChD;AAEA,SAAS,mBAAmB,MAAA,EAAmC;AAC7D,EAAA,IAAI,OAAO,WAAA,EAAa;AACtB,IAAA,OAAO,MAAA,CAAO,WAAA;AAAA,EAChB;AACA,EAAA,IAAI,MAAA,CAAO,QAAQ,WAAA,EAAa;AAC9B,IAAA,OAAO,OAAO,MAAA,CAAO,WAAA;AAAA,EACvB;AACA,EAAA,OAAO,EAAC;AACV;AAEA,SAAS,aAAA,CAAc,QAAgB,WAAA,EAAsC;AAC3E,EAAA,OAAO,GAAG,MAAM,CAAA,CAAA,EAAI,YAAY,QAAQ,CAAA,CAAA,EAAI,YAAY,MAAM,CAAA,CAAA;AAChE;AAEA,SAAS,gBAAgB,OAAA,EAA8B;AACrD,EAAA,IAAI,gBAAgB,gBAAA,EAAiB;AACrC,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA;AAAA,EACF;AAEA,EAAA,aAAA,CAAc,gBAAgB,EAAC;AAC/B,EAAA,aAAA,CAAc,WAAA,CAAY,OAAA,CAAQ,MAAM,CAAA,GAAI,OAAA;AAC5C,EAAA,aAAA,CAAc,UAAA,GAAa,OAAA;AAC7B;AAEO,IAAM,mBAAA,GAAN,cAAkCD,QAAAA,CAAS;AAAA,EAChD,MAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAA0C,EAAC;AAAA,EAC3C,iBAAA,GAAoB,EAAA;AAAA,EACpB,qBAAA,GAAwB,EAAA;AAAA,EAExB,YAAY,MAAA,EAAmC;AAC7C,IAAA,IAAI,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,MAAA;AACvB,IAAA,IAAI,IAAA,GAAO,kBAAkB,IAAI,CAAA;AACjC,IAAA,IAAI,UAAU,IAAA,CAAK,OAAA;AACnB,IAAA,IAAI,iBAAiB,MAAA,EAAQ,cAAA;AAC7B,IAAA,IAAI,SAAA,GAAY,gBAAA,CAAiB,MAAA,EAAQ,IAAA,EAAM,KAAK,EAAE,CAAA;AAEtD,IAAA,yBAAA,EAA0B;AAC1B,IAAA,KAAA,CAAM;AAAA,MACJ,SAAA;AAAA,MACA,IAAA,EAAM,IAAA;AAAA,MACN,YAAA,EAAc,gBAAgB,YAAA,IAAgB,KAAA;AAAA,MAC9C,YAAA,EAAc,eAAA,CAAgB,OAAA,EAAS,cAAc,CAAA;AAAA,MACrD,eAAA,EAAiB,eAAA,CAAgB,OAAA,EAAS,iBAAiB;AAAA,KAC5D,CAAA;AAED,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,EAAA;AACnB,IAAA,IAAA,CAAK,WAAA,GAAc,mBAAmB,MAAM,CAAA;AAC5C,IAAA,IAAA,CAAK,WAAA,GAAc,6BAA6B,cAAc,CAAA;AAC9D,IAAA,IAAA,CAAK,YAAA,GAAe,gBAAgB,YAAA,IAAgB,KAAA;AACpD,IAAA,IAAA,CAAK,aAAA,GAAgB,gBAAgB,aAAA,IAAiB,KAAA;AACtD,IAAA,IAAA,CAAK,iBAAA,GAAoB,gBAAgB,iBAAA,IAAqB,KAAA;AAC9D,IAAA,IAAA,CAAK,cAAc,cAAA,EAAgB,WAAA;AAEnC,IAAA,IAAA,CAAK,QAAA,GAAW;AAAA,MACd,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,gBAAgB,IAAA,CAAK,cAAA;AAAA,MACrB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,kBAAA,EACE,MAAA,CAAO,kBAAA,IACP,oCAAA,CAAqC;AAAA,QACnC,QAAQ,MAAA,EAAQ,WAAA;AAAA,QAChB,UAAU,MAAA,EAAQ;AAAA,OACnB;AAAA,KACL;AAAA,EACF;AAAA,EAEA,4BAA4B,MAAM,MAAA;AAAA,EAClC,qBAAA,GAAwB,CACtB,GAAA,GAA+B,IAC/B,MAAA,GAAS,EAAA,EACT,aAAa,EAAA,KACV;AACH,IAAA,IAAA,CAAK,cAAA,GAAiB,GAAA;AACtB,IAAA,IAAA,CAAK,iBAAA,GAAoB,MAAA;AACzB,IAAA,IAAA,CAAK,qBAAA,GAAwB,UAAA;AAAA,EAC/B,CAAA;AAAA,EACA,oBAAoB,MAAM,MAAA;AAAA,EAC1B,wBAAwB,MAAM,MAAA;AAChC;AAEO,SAAS,0BACd,MAAA,EACqB;AACrB,EAAA,IAAI,WAAA,GAAc,4BAAA,CAA6B,MAAA,CAAO,MAAA,EAAQ,cAAc,CAAA;AAC5E,EAAA,IAAI,IAAA,GAAO,iBAAA,CAAkB,MAAA,CAAO,IAAI,CAAA;AACxC,EAAA,IAAI,gBAAgB,gBAAA,EAAiB;AACrC,EAAA,IAAI,QAAA,GAAW,aAAA,EAAe,WAAA,GAAc,IAAA,CAAK,EAAE,CAAA;AAGnD,EAAA,IAAI,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,EAAA,EAAI,WAAW,CAAA;AAEnD,EAAA,IAAI,QAAA,EAAU,6BAA6B,UAAA,EAAY;AACrD,IAAA,IAAI,gBAAA,GAAmB,MAAA,CAAO,MAAA,EAAQ,cAAA,EAAgB,YAAA,IAAgB,KAAA;AAMtE,IAAA,IAAI,EAAE,QAAA,CAAS,YAAA,IAAgB,gBAAA,CAAA,EAAmB;AAChD,MAAA,QAAA,CAAS,eAAe,IAAI,CAAA;AAAA,IAC9B;AACA,IAAA,QAAA,CAAS,WAAA,GAAc,mBAAmB,MAAM,CAAA;AAChD,IAAA,QAAA,CAAS,WAAA,GAAc,WAAA;AACvB,IAAA,QAAA,CAAS,YAAY,gBAAA,CAAiB,MAAA,CAAO,QAAQ,MAAA,CAAO,IAAA,EAAM,KAAK,EAAE,CAAA;AACzE,IAAA,QAAA,CAAS,YAAA,GAAe,gBAAA;AACxB,IAAA,QAAA,CAAS,aAAA,GACP,MAAA,CAAO,MAAA,EAAQ,cAAA,EAAgB,aAAA,IAAiB,KAAA;AAClD,IAAA,QAAA,CAAS,iBAAA,GACP,MAAA,CAAO,MAAA,EAAQ,cAAA,EAAgB,iBAAA,IAAqB,KAAA;AACtD,IAAA,QAAA,CAAS,WAAA,GAAc,MAAA,CAAO,MAAA,EAAQ,cAAA,EAAgB,WAAA;AACtD,IAAA,QAAA,CAAS,eACP,eAAA,CAAgB,MAAA,CAAO,KAAK,OAAA,EAAS,cAAc,KACnD,QAAA,CAAS,YAAA;AACX,IAAA,QAAA,CAAS,kBACP,eAAA,CAAgB,MAAA,CAAO,KAAK,OAAA,EAAS,iBAAiB,KACtD,QAAA,CAAS,eAAA;AACX,IAAA,QAAA,CAAS,QAAA,CAAS,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,cAAA;AAC/C,IAAA,QAAA,CAAS,QAAA,CAAS,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,OAAA;AACxC,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,QAAA,CAAS,QAAA,CAAS,WAAW,MAAA,CAAO,QAAA;AAAA,IACtC;AACA,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,QAAA,CAAS,QAAA,CAAS,aAAa,MAAA,CAAO,UAAA;AAAA,IACxC;AACA,IAAA,IAAI,OAAO,kBAAA,EAAoB;AAC7B,MAAA,QAAA,CAAS,QAAA,CAAS,qBAAqB,MAAA,CAAO,kBAAA;AAAA,IAChD;AACA,IAAA,eAAA,CAAgB,QAAQ,CAAA;AACxB,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAA,GAAU,IAAI,mBAAA,CAAoB,MAAM,CAAA;AAC5C,EAAA,OAAA,CAAQ,wBAAA,GAA2B,UAAA;AACnC,EAAA,eAAA,CAAgB,OAAO,CAAA;AACvB,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,8BAA8B,OAAA,EAA8B;AAC1E,EAAA,IAAI,CAAC,QAAQ,YAAA,EAAc;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,GAAS,kBAAiB,EAAG,cAAA;AACjC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,YAAA,GAAe,OAAA;AACnB,EAAA,IAAI,CAAC,aAAa,yBAAA,EAA2B;AAC3C,IAAA,MAAA,CAAO,OAAO,OAAO,CAAA;AACrB,IAAA,YAAA,CAAa,yBAAA,GAA4B,IAAA;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAA,CAAO,aAAA,GAAgB;AAAA,IACrB,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,aAAa,OAAA,CAAQ;AAAA,GACtB,CAAA;AACD,EAAA,OAAO,IAAA;AACT;AC1OA,IAAM,6BAAA,GAAgC,EAAA;AACtC,IAAM,wBAAA,GAA2B,GAAA;AAS1B,SAAS,yBAAyB,KAAA,EAAsC;AAC7E,EAAA,IAAI,EAAE,OAAA,EAAS,QAAA,EAAU,UAAA,EAAW,GAAI,KAAA;AACxC,EAAA,IAAI,cAAA,GAAiB,OAAO,OAAO,CAAA;AACnC,EAAA,IAAI,kBAAA,GAAqB,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA;AAC5C,EAAA,IAAI,kBAAA,GAAqB,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA;AAEnD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAA,CAAQ,SAAS,QAAA,GAAW,QAAA;AAAA,IAC9B;AACA,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,OAAA,CAAQ,SAAS,UAAA,GAAa,UAAA;AAAA,IAChC;AAEA,IAAA,IAAI,6BAAA,CAA8B,OAAO,CAAA,IAAK,CAAC,QAAQ,YAAA,EAAc;AACnE,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,IAAI,QAAA,GAAW,MAAA,CAAO,WAAA,CAAY,MAAM;AACtC,MAAA,QAAA,IAAY,CAAA;AACZ,MAAA,IACE,6BAAA,CAA8B,OAAO,CAAA,IACrC,QAAA,IAAY,wBAAA,EACZ;AACA,QAAA,MAAA,CAAO,cAAc,QAAQ,CAAA;AAAA,MAC/B;AAAA,IACF,GAAG,6BAA6B,CAAA;AAEhC,IAAA,OAAO,MAAM,MAAA,CAAO,aAAA,CAAc,QAAQ,CAAA;AAAA,EAC5C,CAAA,EAAG,CAAC,OAAA,EAAS,QAAA,EAAU,UAAU,CAAC,CAAA;AAElC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,cAAA,CAAe,YAAY,OAAA,EAAS;AACtC,MAAA,cAAA,CAAe,OAAA,GAAU,OAAA;AACzB,MAAA,kBAAA,CAAmB,UAAU,OAAA,CAAQ,IAAA;AACrC,MAAA,kBAAA,CAAmB,UAAU,OAAA,CAAQ,WAAA;AACrC,MAAA;AAAA,IACF;AAEA,IAAA,IACE,mBAAmB,OAAA,KAAY,OAAA,CAAQ,QACvC,kBAAA,CAAmB,OAAA,KAAY,QAAQ,WAAA,EACvC;AACA,MAAA;AAAA,IACF;AAEA,IAAA,kBAAA,CAAmB,UAAU,OAAA,CAAQ,IAAA;AACrC,IAAA,kBAAA,CAAmB,UAAU,OAAA,CAAQ,WAAA;AACrC,IAAA,6BAAA,CAA8B,OAAO,CAAA;AAAA,EACvC,GAAG,CAAC,OAAA,EAAS,QAAQ,IAAA,EAAM,OAAA,CAAQ,WAAW,CAAC,CAAA;AAE/C,EAAA,OAAO,IAAA;AACT;;;AC9CA,SAAS,kBACP,OAAA,EACS;AACT,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC3C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAE,OAAA,CAA6C,kBAAA;AACxD;AAgBO,SAAS,iCAAA,CACd,MAAA,EACA,OAAA,GAAoD,EAAC,EACxB;AAC7B,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,CAAC,EAAA,EAAI,eAAA,KAAoB;AACjC,MAAA,IAAI,MAAA,GAAS,kBAAkB,eAAe,CAAA;AAC9C,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAA,MAAA,CAAO,OAAA,CAAQ,EAAA,EAAI,EAAE,MAAA,EAAQ,CAAA;AAAA,MAC/B,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,IAAA,CAAK,EAAA,EAAI,EAAE,MAAA,EAAQ,CAAA;AAAA,MAC5B;AAAA,IACF,CAAA;AAAA,IACA,YAAY,MAAM;AAChB,MAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,IACjB;AAAA,GACF;AACF;AC/CO,SAAS,+BACd,OAAA,EAC6B;AAC7B,EAAA,IAAI,SAAS,SAAA,EAAU;AACvB,EAAA,IAAI,GAAA,GAAME,OAIA,IAAI,CAAA;AAEd,EAAA,IACE,CAAC,GAAA,CAAI,OAAA,IACL,GAAA,CAAI,OAAA,CAAQ,MAAA,KAAW,MAAA,IACvB,GAAA,CAAI,OAAA,CAAQ,OAAA,KAAY,OAAA,EAAS,OAAA,EACjC;AACA,IAAA,GAAA,CAAI,OAAA,GAAU;AAAA,MACZ,SAAA,EAAW,iCAAA,CAAkC,MAAA,EAAQ,OAAO,CAAA;AAAA,MAC5D,SAAS,OAAA,EAAS,OAAA;AAAA,MAClB;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAI,OAAA,CAAQ,SAAA;AACrB;AAmBO,SAAS,mBAAmB,KAAA,EAAgC;AACjE,EAAA,IAAI,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,KAAA;AAC3B,EAAA,IAAI,EAAE,QAAA,EAAU,UAAA,KAAe,8BAAA,CAA+B,EAAE,SAAS,CAAA;AACzE,EAAA,uBACED,GAAAA;AAAA,IAAC,wBAAA;AAAA,IAAA;AAAA,MACC,QAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;AC1DA,IAAM,qBAA8C,EAAC;AAErD,SAASE,mBACP,IAAA,EACoD;AACpD,EAAA,IAAI,OAAO,IAAA,EAAM,IAAA;AACjB,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,SACF,IAAA,CAAK,MAAA,IACL,KAAK,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,KAAS,MAAM,GAAG,EAAA,IACjD,IAAA,CAAK,MAAM,CAAC,CAAA,EAAG,MACf,IAAA,CAAK,EAAA;AACP,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAO;AAC3B;AAmBO,IAAM,oBAAA,GAAuB,IAAA,CAAK,SAAS,6BAAA,CAChD,KAAA,EACA;AACA,EAAA,IAAI,OAAA,GAAUC,WAAW,mBAAmB,CAAA;AAC5C,EAAA,IAAI,MAAA,GAAS,KAAA,CAAM,MAAA,IAAU,OAAA,EAAS,MAAA;AACtC,EAAA,IAAI,IAAA,GAAO,KAAA,CAAM,IAAA,IAAQ,MAAA,EAAQ,IAAA,IAAQ,IAAA;AACzC,EAAA,IAAI,WAAA,GACF,KAAA,CAAM,WAAA,IAAe,MAAA,EAAQ,WAAA,IAAe,kBAAA;AAE9C,EAAA,IAAI,IAAA,GAAOC,QAAQ,MAAMF,kBAAAA,CAAkB,IAAI,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAExD,EAAA,IAAI,QAAA,GAAWE,QAAQ,MAAM;AAC3B,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,yBAAA,CAA0B;AAAA,MAC/B,MAAA;AAAA,MACA,IAAA,EAAM,EAAE,GAAI,IAAA,EAAiC,IAAA,EAAK;AAAA,MAClD,WAAA;AAAA,MACA,oBAAoB,OAAA,EAAS;AAAA,KAC9B,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,MAAA,EAAQ,IAAA,EAAM,MAAM,WAAA,EAAa,OAAA,EAAS,kBAAkB,CAAC,CAAA;AAEjE,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAJ,GAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,QAAA,EAAU,CAAA;AAAA,oBACjCA,GAAAA,CAAC,kBAAA,EAAA,EAAmB,OAAA,EAAS,QAAA,EAAU;AAAA,GAAA,EACzC,CAAA;AAEJ,CAAC;;;AC1ED,IAAM,sBAAA,GAAyB,CAAC,aAAA,EAAe,cAAc,CAAA;AAE7D,SAAS,mBAAmB,QAAA,EAA2B;AACrD,EAAA,OACE,aAAa,WAAA,IACb,QAAA,KAAa,WAAA,IACb,QAAA,CAAS,SAAS,YAAY,CAAA;AAElC;AAEA,SAAS,gBAAgB,KAAA,EAAqC;AAC5D,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,GAAA,CAAI,KAAK,CAAA,CAAE,MAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAUA,SAAS,qBAAA,CACP,QACA,kBAAA,EACS;AACT,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAI,IAAI,MAAM,CAAA;AAAA,EACzB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,MAAA;AAC7B,EAAA,IAAI,kBAAA,CAAmB,kBAAkB,CAAA,IAAK,kBAAA,CAAmB,QAAQ,CAAA,EAAG;AAC1E,IAAA,OAAO,QAAA,KAAa,WAAW,QAAA,KAAa,QAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,aAAa,QAAA,EAAU;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,sBAAA,CAAuB,IAAA;AAAA,IAC5B,CAAC,WAAW,QAAA,KAAa,MAAA,IAAU,SAAS,QAAA,CAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE;AAAA,GACnE;AACF;AAEA,SAAS,eAAe,OAAA,EAAuD;AAC7E,EAAA,IAAI,SAAS,YAAA,EAAc;AACzB,IAAA,OAAO,IAAI,eAAA,CAAgB,OAAA,CAAQ,YAAY,CAAA;AAAA,EACjD;AAEA,EAAA,IAAI,SAAS,GAAA,EAAK;AAChB,IAAA,IAAI,GAAA,GACF,OAAO,OAAA,CAAQ,GAAA,KAAQ,QAAA,GACnB,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAA,EAAK,kBAAkB,CAAA,GACvC,OAAA,CAAQ,GAAA;AACd,IAAA,OAAO,IAAI,eAAA,CAAgB,GAAA,CAAI,YAAY,CAAA;AAAA,EAC7C;AAEA,EAAA,OAAO,IAAI,eAAA,EAAgB;AAC7B;AAEA,SAAS,IAAA,CAAK,cAA+B,GAAA,EAA4B;AACvE,EAAA,IAAI,MAAA,GAAS,YAAA,CAAa,MAAA,CAAO,GAAG,CAAA;AACpC,EAAA,OAAO,OAAO,MAAA,GAAU,MAAA,CAAO,EAAA,CAAG,EAAE,KAAK,IAAA,GAAQ,IAAA;AACnD;AAYO,SAAS,kCAAA,CACd,OAAA,EACA,OAAA,GAAqD,EAAC,EACvC;AACf,EAAA,IAAI,YAAA,GAAe,eAAe,OAAO,CAAA;AAEzC,EAAA,IAAI,eACF,OAAA,EAAS,YAAA,IAAgB,IAAA,CAAK,YAAA,EAAc,cAAc,CAAA,KAAM,MAAA;AAClE,EAAA,IAAI,gBACF,OAAA,EAAS,aAAA,IAAiB,IAAA,CAAK,YAAA,EAAc,eAAe,CAAA,KAAM,MAAA;AACpE,EAAA,IAAI,oBACF,OAAA,EAAS,iBAAA,IAAqB,QAAQ,IAAA,CAAK,YAAA,EAAc,cAAc,CAAC,CAAA;AAE1E,EAAA,IAAI,EAAE,YAAA,IAAgB,aAAA,IAAiB,iBAAA,CAAA,EAAoB;AACzD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,GAAS,eAAA,CAAgB,IAAA,CAAK,YAAA,EAAc,cAAc,CAAC,CAAA;AAC/D,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,kBAAA,GAAqB,QAAQ,kBAAA,IAAsB,EAAA;AACvD,EAAA,IAAI,CAAC,qBAAA,CAAsB,MAAA,EAAQ,kBAAkB,CAAA,EAAG;AACtD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAA,GAAY,QAAQ,SAAA,IAAa,UAAA;AACrC,EAAA,IAAI,MAAA,GAAS,eAAe,UAAA,GAAa,YAAA;AACzC,EAAA,IAAI,OAAA,GAAU,IAAA,CAAK,YAAA,EAAc,iBAAiB,CAAA;AAClD,EAAA,IAAI,MAAM,CAAA,EAAG,MAAM,CAAA,eAAA,EAAkB,SAAS,IAAI,MAAM,CAAA,CAAA;AACxD,EAAA,OAAO,UAAU,CAAA,EAAG,GAAG,MAAM,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA,GAAK,GAAA;AAC/D;;;ACvHA,IAAM,gBAAA,uBAAuB,GAAA,EAAY;AAEzC,SAAS,WAAW,GAAA,EAAa;AAC/B,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,gBAAA,CAAiB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC7B,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,CAAA,YAAA,EAAe,GAAG,CAAA,EAAA,CAAI,CAAA;AAC5D,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,gBAAA,CAAiB,IAAI,GAAG,CAAA;AACxB,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC5C,EAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AACf,EAAA,MAAA,CAAO,GAAA,GAAM,GAAA;AACb,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAChC,EAAA,gBAAA,CAAiB,IAAI,GAAG,CAAA;AAC1B;AAQO,SAAS,0BACd,KAAA,EACA;AACA,EAAAK,UAAU,MAAM;AACd,IAAA,IAAI,UAAU,KAAA,CAAM,OAAA;AACpB,IAAA,IAAI,CAAC,OAAA,IAAW,OAAO,MAAA,KAAW,WAAA,EAAa;AAC7C,MAAA,OAAA,GAAU;AAAA,QACR,YAAA,EAAc,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AAAA,QACxD,GAAA,EAAK,OAAO,QAAA,CAAS;AAAA,OACvB;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,GAAM,mCAAmC,OAAA,EAAS;AAAA,MACpD,kBAAA,EACE,MAAM,kBAAA,KACL,OAAO,WAAW,WAAA,GAAc,MAAA,GAAY,OAAO,QAAA,CAAS,QAAA;AAAA,KAChE,CAAA;AACD,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,UAAA,CAAW,GAAG,CAAA;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,kBAAkB,CAAC,CAAA;AAE5C,EAAA,OAAO,IAAA;AACT","file":"index.mjs","sourcesContent":["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 { createContext, type ReactNode, useMemo } from 'react'\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\n let themeSettingsValue =\n themeSettings ?? client?.themeSettings ?? EMPTY_THEME_SETTINGS\n let themeSettingsStore = useMemo(\n () =>\n createWeaverseNextThemeSettingsStore({\n schema: client?.themeSchema,\n settings: themeSettingsValue,\n }),\n [client?.themeSchema, themeSettingsValue]\n )\n\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 { 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}\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 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 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 studio.refreshStudio?.({\n data: runtime.data,\n pageId: runtime.pageId,\n requestInfo: runtime.requestInfo,\n })\n return true\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 runtime: WeaverseNextRuntime\n}\n\n/** Page-level Studio runtime binder. */\nexport function WeaverseNextStudioBridge(props: WeaverseNextStudioBridgeProps) {\n let { runtime, navigate, revalidate } = 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\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])\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 type { WeaverseNextRuntime } from './runtime'\nimport { WeaverseNextStudioBridge } from './studio-bridge'\nimport {\n type CreateWeaverseNextStudioInternalsOptions,\n createWeaverseNextStudioInternals,\n type WeaverseNextStudioInternals,\n} from './studio-router'\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 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 } = props\n let { navigate, revalidate } = useWeaverseNextStudioInternals({ replace })\n return (\n <WeaverseNextStudioBridge\n navigate={navigate}\n revalidate={revalidate}\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 { 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 framework?: 'hydrogen' | 'next'\n storefrontHostname?: string\n}\n\n/**\n * Resolve the Studio script URL from request/search context. v0 intentionally\n * reuses the existing structural Hydrogen bridge script until a concrete Builder\n * incompatibility requires a dedicated Next bundle.\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 framework = options.framework ?? 'hydrogen'\n let bundle = isDesignMode ? 'index.js' : 'preview.js'\n let version = last(searchParams, 'weaverseVersion')\n let url = `${origin}/static/studio/${framework}/${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 WeaverseNextStudioConnectProps {\n context?: WeaverseNextRequestContext\n storefrontHostname?: string\n}\n\n/** Root-level Studio script connector for Next client boundaries. */\nexport function WeaverseNextStudioConnect(\n props: WeaverseNextStudioConnectProps\n) {\n useEffect(() => {\n let context = props.context\n if (!context && typeof window !== 'undefined') {\n context = {\n searchParams: new URLSearchParams(window.location.search),\n url: window.location.href,\n }\n }\n\n let src = resolveWeaverseNextStudioScriptSrc(context, {\n storefrontHostname:\n props.storefrontHostname ??\n (typeof window === 'undefined' ? undefined : window.location.hostname),\n })\n if (src) {\n loadScript(src)\n }\n }, [props.context, props.storefrontHostname])\n\n return null\n}\n"]}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@weaverse/next",
|
|
3
3
|
"author": "Weaverse Team",
|
|
4
4
|
"description": "Next.js App Router integration for building Weaverse-powered storefronts",
|
|
5
|
-
"version": "0.1.0-alpha.
|
|
5
|
+
"version": "0.1.0-alpha.2",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"main": "dist/index.js",
|
|
8
8
|
"typings": "dist/index.d.ts",
|
|
@@ -54,13 +54,18 @@
|
|
|
54
54
|
"sourcemap": true,
|
|
55
55
|
"clean": true,
|
|
56
56
|
"outDir": "dist",
|
|
57
|
-
"treeshake": true
|
|
57
|
+
"treeshake": true,
|
|
58
|
+
"external": [
|
|
59
|
+
"next",
|
|
60
|
+
"next/navigation"
|
|
61
|
+
]
|
|
58
62
|
},
|
|
59
63
|
"dependencies": {
|
|
60
64
|
"@weaverse/react": "5.16.3",
|
|
61
65
|
"@weaverse/schema": "0.10.0"
|
|
62
66
|
},
|
|
63
67
|
"peerDependencies": {
|
|
68
|
+
"next": ">=14",
|
|
64
69
|
"react": ">=19",
|
|
65
70
|
"react-dom": ">=19"
|
|
66
71
|
}
|