@weaverse/next 0.1.0-alpha.13 → 0.1.0-alpha.15

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.
Files changed (106) hide show
  1. package/README.md +125 -23
  2. package/dist/{chunk-MQ6N5ODA.mjs → chunk-NL22OVD7.mjs} +93 -4
  3. package/dist/chunk-NL22OVD7.mjs.map +1 -0
  4. package/dist/index.js +86 -5
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.mjs +20 -27
  7. package/dist/index.mjs.map +1 -1
  8. package/dist/server.js +158 -2
  9. package/dist/server.js.map +1 -1
  10. package/dist/server.mjs +126 -5
  11. package/dist/server.mjs.map +1 -1
  12. package/dist/types/client.d.ts +16 -0
  13. package/dist/types/client.d.ts.map +1 -0
  14. package/dist/types/hooks.d.ts +20 -0
  15. package/dist/types/hooks.d.ts.map +1 -0
  16. package/dist/types/index.d.ts +34 -0
  17. package/dist/types/index.d.ts.map +1 -0
  18. package/dist/types/item.d.ts +54 -0
  19. package/dist/types/item.d.ts.map +1 -0
  20. package/dist/types/loader.d.ts +25 -0
  21. package/dist/types/loader.d.ts.map +1 -0
  22. package/dist/types/main.d.ts +11 -0
  23. package/dist/types/main.d.ts.map +1 -0
  24. package/dist/types/provider.d.ts +82 -0
  25. package/dist/types/provider.d.ts.map +1 -0
  26. package/dist/types/registry.d.ts +15 -0
  27. package/dist/types/registry.d.ts.map +1 -0
  28. package/dist/types/renderer.d.ts +20 -0
  29. package/dist/types/renderer.d.ts.map +1 -0
  30. package/dist/types/request-info.d.ts +8 -0
  31. package/dist/types/request-info.d.ts.map +1 -0
  32. package/dist/types/revalidate-item.d.ts +81 -0
  33. package/dist/types/revalidate-item.d.ts.map +1 -0
  34. package/dist/types/root-provider.d.ts +61 -0
  35. package/dist/types/root-provider.d.ts.map +1 -0
  36. package/dist/types/runtime.d.ts +113 -0
  37. package/dist/types/runtime.d.ts.map +1 -0
  38. package/dist/types/seo.d.ts +55 -0
  39. package/dist/types/seo.d.ts.map +1 -0
  40. package/dist/types/server/configs.d.ts +27 -0
  41. package/dist/types/server/configs.d.ts.map +1 -0
  42. package/dist/types/server/normalize-page-url.d.ts +19 -0
  43. package/dist/types/server/normalize-page-url.d.ts.map +1 -0
  44. package/dist/types/server/revalidate-handler.d.ts +55 -0
  45. package/dist/types/server/revalidate-handler.d.ts.map +1 -0
  46. package/dist/types/server/server-client.d.ts +21 -0
  47. package/dist/types/server/server-client.d.ts.map +1 -0
  48. package/dist/types/server.d.ts +19 -0
  49. package/dist/types/server.d.ts.map +1 -0
  50. package/dist/types/studio-bridge.d.ts +16 -0
  51. package/dist/types/studio-bridge.d.ts.map +1 -0
  52. package/dist/types/studio-connect.d.ts +27 -0
  53. package/dist/types/studio-connect.d.ts.map +1 -0
  54. package/dist/types/studio-router.d.ts +50 -0
  55. package/dist/types/studio-router.d.ts.map +1 -0
  56. package/dist/types/studio-script-src.d.ts +12 -0
  57. package/dist/types/studio-script-src.d.ts.map +1 -0
  58. package/dist/types/theme-settings-store.d.ts +17 -0
  59. package/dist/types/theme-settings-store.d.ts.map +1 -0
  60. package/dist/types/translation-context.d.ts +156 -0
  61. package/dist/types/translation-context.d.ts.map +1 -0
  62. package/dist/types/translation-store.d.ts +44 -0
  63. package/dist/types/translation-store.d.ts.map +1 -0
  64. package/dist/types/types.d.ts +661 -0
  65. package/dist/types/types.d.ts.map +1 -0
  66. package/dist/types/use-weaverse-next-studio.d.ts +34 -0
  67. package/dist/types/use-weaverse-next-studio.d.ts.map +1 -0
  68. package/dist/types/utils.d.ts +12 -0
  69. package/dist/types/utils.d.ts.map +1 -0
  70. package/package.json +7 -6
  71. package/src/client.ts +101 -0
  72. package/src/hooks.ts +50 -0
  73. package/src/index.ts +153 -0
  74. package/src/item.ts +151 -0
  75. package/src/loader.ts +135 -0
  76. package/src/main.tsx +45 -0
  77. package/src/provider.tsx +225 -0
  78. package/src/registry.ts +63 -0
  79. package/src/renderer.tsx +99 -0
  80. package/src/request-info.ts +95 -0
  81. package/src/revalidate-item.ts +210 -0
  82. package/src/root-provider.tsx +181 -0
  83. package/src/runtime.ts +521 -0
  84. package/src/seo.ts +157 -0
  85. package/src/server/configs.ts +182 -0
  86. package/src/server/normalize-page-url.ts +65 -0
  87. package/src/server/revalidate-handler.ts +357 -0
  88. package/src/server/server-client.ts +727 -0
  89. package/src/server.ts +67 -0
  90. package/src/studio-bridge.tsx +82 -0
  91. package/src/studio-connect.tsx +88 -0
  92. package/src/studio-router.ts +85 -0
  93. package/src/studio-script-src.ts +128 -0
  94. package/src/theme-settings-store.ts +46 -0
  95. package/src/translation-context.tsx +299 -0
  96. package/src/translation-store.ts +69 -0
  97. package/src/types.ts +748 -0
  98. package/src/use-weaverse-next-studio.tsx +106 -0
  99. package/src/utils.ts +37 -0
  100. package/dist/chunk-MQ6N5ODA.mjs.map +0 -1
  101. package/dist/index.d.mts +0 -592
  102. package/dist/index.d.ts +0 -592
  103. package/dist/seo-CrEFl_Up.d.mts +0 -516
  104. package/dist/seo-CrEFl_Up.d.ts +0 -516
  105. package/dist/server.d.mts +0 -100
  106. package/dist/server.d.ts +0 -100
package/dist/index.d.mts DELETED
@@ -1,592 +0,0 @@
1
- import { WeaverseItemStore, Weaverse, ElementData } from '@weaverse/react';
2
- export { isBrowser, isIframe, useChildInstances, useItemInstance, useParentInstance, useWeaverse } from '@weaverse/react';
3
- import { SchemaType } from '@weaverse/schema';
4
- export * from '@weaverse/schema';
5
- import { h as WeaverseNextClientConfig, g as WeaverseNextClient, i as WeaverseNextCommerceContext, x as WeaverseNextRequestContext, t as WeaverseNextLoaderData, a as TranslationStore, y as WeaverseNextRequestInfo, k as WeaverseNextComponentData, J as WeaverseNextThemeSettingsStore, G as WeaverseNextThemeSchema, A as WeaverseNextRuntimeInternal, N as WeaverseNextTranslationMap, v as WeaverseNextPageData, z as WeaverseNextRuntimeConfig, K as WeaverseNextTranslationChanges } from './seo-CrEFl_Up.mjs';
6
- export { T as ThemeTextStore, W as WeaverseArticle, b as WeaverseBlog, c as WeaverseCollection, d as WeaverseMetaObject, j as WeaverseNextComponent, l as WeaverseNextComponentLoaderArgs, m as WeaverseNextComponentProps, o as WeaverseNextCustomPageEntry, p as WeaverseNextFetchCustomPagesOptions, r as WeaverseNextI18n, s as WeaverseNextLoadPageInput, u as WeaverseNextPageAssignment, B as WeaverseNextSeoMetadata, F as WeaverseNextStorefront, L as WeaverseNextTranslationEntry, M as WeaverseNextTranslationItemEntry, O as WeaverseNextTranslationMapEntry, P as WeaverseProduct, Q as formatWeaverseNextSeoMetadata, R as getWeaverseNextSeoMetadata } from './seo-CrEFl_Up.mjs';
7
- import * as react_jsx_runtime from 'react/jsx-runtime';
8
- import * as react from 'react';
9
- import { ReactNode } from 'react';
10
- import 'next';
11
-
12
- /**
13
- * Create a {@link WeaverseNextClient} from explicit config.
14
- *
15
- * @example
16
- * ```ts
17
- * let client = createWeaverseNextClient({
18
- * projectId: process.env.WEAVERSE_PROJECT_ID!,
19
- * components,
20
- * commerce: { storefront },
21
- * fetchPage: async ({ type, handle }) => fetchWeaversePage({ type, handle }),
22
- * })
23
- * ```
24
- */
25
- declare function createWeaverseNextClient(config: WeaverseNextClientConfig): WeaverseNextClient;
26
-
27
- /**
28
- * Read explicit root/global data passed to the provider. Next-native
29
- * replacement for `useRouteLoaderData('root')`.
30
- */
31
- declare function useWeaverseRootData<T = unknown>(): T;
32
- /**
33
- * Read explicit page/route commerce data passed to the provider. Next-native
34
- * replacement for section-level `useLoaderData()`.
35
- */
36
- declare function useWeaversePageData<T = unknown>(): T;
37
- /** Read the app-provided commerce context (storefront/cart/customer). */
38
- declare function useWeaverseCommerce<T = WeaverseNextCommerceContext>(): T;
39
- /**
40
- * Read live Weaverse theme settings. The Studio bridge updates the provider's
41
- * external store via `updateThemeSettings`, so components re-render during live
42
- * design-mode edits.
43
- */
44
- declare function useThemeSettings<T = Record<string, unknown>>(): T;
45
-
46
- interface RunComponentLoadersArgs {
47
- client: WeaverseNextClient;
48
- commerce?: WeaverseNextCommerceContext;
49
- context?: WeaverseNextRequestContext;
50
- /** Page payload to walk; defaults to `client.data`. */
51
- data?: WeaverseNextLoaderData | null;
52
- }
53
- /**
54
- * Walk a serialized page tree and run each registered component's `loader`,
55
- * attaching the result to the item as `loaderData`.
56
- *
57
- * Loaders receive explicit `commerce.storefront` (and `weaverse.storefront` as
58
- * a compatibility alias via the client). Children are walked recursively when
59
- * they are inline item objects; flat `items` arrays are covered by the
60
- * top-level walk.
61
- *
62
- * @returns a cloned `data` object with `loaderData` attached to cloned items.
63
- */
64
- declare function runWeaverseComponentLoaders(args: RunComponentLoadersArgs): Promise<WeaverseNextLoaderData | null>;
65
-
66
- /**
67
- * Traverse a nested object by dot-path.
68
- *
69
- * @example
70
- * getNestedKey({ cart: { title: 'Cart' } }, 'cart.title') // => 'Cart'
71
- * getNestedKey({}, 'cart.title', 'fallback') // => 'fallback'
72
- */
73
- declare function getNestedKey(obj: Record<string, unknown>, path: string, fallback?: string): string | undefined;
74
- /**
75
- * Replace `{{variable}}` patterns in a string with provided values.
76
- *
77
- * @example
78
- * interpolate('Hello {{name}}!', { name: 'World' }) // => 'Hello World!'
79
- * interpolate('-{{percentage}}% Off', { percentage: 15 }) // => '-15% Off'
80
- */
81
- declare function interpolate(template: string, variables?: Record<string, string | number>): string;
82
- /**
83
- * Signature for a translation function.
84
- */
85
- type TranslateFunction = (key: string, variables?: Record<string, string | number>) => string;
86
- interface TranslationValue {
87
- /** Active-locale translated keys loaded from the storefront API. */
88
- merchantOverrides: Record<string, unknown> | null;
89
- /**
90
- * Translate a key with optional variable interpolation.
91
- *
92
- * Priority chain (highest wins):
93
- * 1. External `t` (passed into `WeaverseNextRootProvider` / `TranslationProvider`)
94
- * 2. Design overrides (live Builder edits from `TranslationStore`)
95
- * 3. `merchantOverrides` (DB/API overrides for the current locale)
96
- * 4. `staticContent` (theme default JSON)
97
- * 5. The key itself (fallback)
98
- *
99
- * @example
100
- * t('cart.title') // => "Cart"
101
- * t('badge.sale', { percentage: 15 }) // => "-15% Off"
102
- */
103
- t: TranslateFunction;
104
- /**
105
- * @deprecated Use {@link TranslationValue.translationStore} instead. Kept as a
106
- * backward-compatible alias pointing at the same store instance.
107
- */
108
- themeTextStore: TranslationStore | null;
109
- /** Exposed so the runtime/Studio bridge can attach it to `internal`. */
110
- translationStore: TranslationStore | null;
111
- }
112
- interface TranslationProviderProps {
113
- children: ReactNode;
114
- merchantOverrides?: Record<string, unknown>;
115
- staticContent: Record<string, unknown>;
116
- /**
117
- * Optional external translation function.
118
- * When provided it becomes the **highest-priority** source:
119
- * if it returns a non-empty string that differs from the raw key,
120
- * that value is used; otherwise the internal resolution chain continues.
121
- */
122
- t?: TranslateFunction;
123
- /**
124
- * @deprecated Use {@link TranslationProviderProps.translationStore} instead.
125
- * Still accepted for backward compatibility; ignored when `translationStore`
126
- * is also provided.
127
- */
128
- themeTextStore?: TranslationStore | null;
129
- /** Optional store for live design-mode text overrides from the builder. */
130
- translationStore?: TranslationStore | null;
131
- }
132
- /**
133
- * Build the `t()` translation function over a fixed set of sources.
134
- *
135
- * Resolution order, highest priority first:
136
- * 1. `externalT` – host i18n (e.g. Shopify), unless it echoes the key
137
- * 2. `designOverrides` – live design-mode edits, flat dot-path keys
138
- * 3. `merchantOverrides` – locale overrides from the API, nested
139
- * 4. `staticContent` – the theme's default locale JSON
140
- * 5. the key itself
141
- *
142
- * Design overrides are looked up per-key (own properties only) rather than
143
- * merged into `merchantOverrides`: a flat key like `cart.title` must override
144
- * exactly that leaf without wiping sibling keys (`cart.subtitle`), and a
145
- * per-key own-property lookup never builds nested objects from
146
- * merchant-controlled keys, so it cannot pollute `Object.prototype`.
147
- */
148
- declare function createTranslate(sources: {
149
- staticContent: Record<string, unknown>;
150
- merchantOverrides?: Record<string, unknown>;
151
- designOverrides?: Record<string, string>;
152
- externalT?: TranslateFunction;
153
- }): TranslateFunction;
154
- /**
155
- * Provider that wraps the app to expose the `t()` function.
156
- *
157
- * - `staticContent` – the theme's default locale JSON (from themeSchema.i18n)
158
- * - `merchantOverrides` – locale-specific overrides fetched from the API
159
- * - `translationStore` – optional store for live design-mode text overrides
160
- * (the deprecated `themeTextStore` prop is accepted as a fallback)
161
- */
162
- declare function TranslationProvider({ staticContent, merchantOverrides, t: externalT, translationStore, themeTextStore, children, }: TranslationProviderProps): react_jsx_runtime.JSX.Element;
163
- /**
164
- * Hook to access the translation `t()` function.
165
- *
166
- * Must be used inside a component wrapped by `WeaverseNextRootProvider` or
167
- * `TranslationProvider`.
168
- *
169
- * @example
170
- * ```tsx
171
- * function CartTitle() {
172
- * let { t } = useTranslation()
173
- * return <h2>{t('cart.title')}</h2>
174
- * }
175
- * ```
176
- */
177
- declare function useTranslation(): TranslationValue;
178
- /**
179
- * @deprecated Use {@link TranslationProvider} instead.
180
- */
181
- declare const ThemeTextProvider: typeof TranslationProvider;
182
- /**
183
- * @deprecated Use {@link useTranslation} instead.
184
- */
185
- declare const useThemeText: typeof useTranslation;
186
- /**
187
- * @deprecated Use {@link TranslationValue} instead.
188
- */
189
- type ThemeTextValue = TranslationValue;
190
- /**
191
- * @deprecated Use {@link TranslationProviderProps} instead.
192
- */
193
- type ThemeTextProviderProps = TranslationProviderProps;
194
-
195
- interface WeaverseNextProviderProps {
196
- children: ReactNode;
197
- client?: WeaverseNextClient;
198
- /** App-provided commerce context (storefront/cart/customer). */
199
- commerce?: WeaverseNextCommerceContext;
200
- /**
201
- * Active-locale static-text overrides (nested, from `loadThemeSettings()`).
202
- * Adopts the root provider's `merchantOverrides` when omitted.
203
- */
204
- merchantOverrides?: Record<string, unknown>;
205
- /** Explicit page/route commerce data (replaces section-level `useLoaderData`). */
206
- pageData?: unknown;
207
- /** Explicit root/global data (replaces `useRouteLoaderData('root')`). */
208
- rootData?: unknown;
209
- /**
210
- * Theme default locale JSON (`loadThemeSettings().staticContent`). Adopts the
211
- * root provider's `staticContent` when omitted, then falls back to
212
- * `client.themeSchema.i18n.staticContent`.
213
- */
214
- staticContent?: Record<string, unknown>;
215
- /** Optional external translation function (host i18n); highest priority in `t()`. */
216
- t?: TranslateFunction;
217
- /** Theme settings override; falls back to `client.themeSettings`. */
218
- themeSettings?: Record<string, unknown>;
219
- }
220
- /**
221
- * Client boundary that supplies explicit root/page/commerce data to Weaverse
222
- * sections. Next-native replacement for `withWeaverse` + route loader data —
223
- * no React Router route matches are emulated.
224
- *
225
- * In App Router, create/pass `client` only from a client component wrapper. A
226
- * `WeaverseNextClient` contains functions and component references, so it is
227
- * not serializable across a Server Component → Client Component boundary.
228
- *
229
- * @example
230
- * ```tsx
231
- * 'use client'
232
- *
233
- * <WeaverseNextProvider client={client} rootData={rootData} pageData={pageData} commerce={commerce}>
234
- * <WeaverseNextRenderer />
235
- * </WeaverseNextProvider>
236
- * ```
237
- */
238
- declare function WeaverseNextProvider(props: WeaverseNextProviderProps): react_jsx_runtime.JSX.Element;
239
-
240
- interface WeaverseNextRendererProps {
241
- /** Client to render from. Defaults to the provider's client. */
242
- client?: WeaverseNextClient;
243
- /** Page payload to render. Defaults to `client.data`. */
244
- data?: WeaverseNextLoaderData | null;
245
- /** Data-connector context for `{{...}}` template replacement. */
246
- dataContext?: Record<string, unknown>;
247
- }
248
- /**
249
- * Render a serialized Weaverse page tree through `@weaverse/react` primitives.
250
- *
251
- * Reads the client/page data from {@link WeaverseNextContext} when no props are
252
- * passed, or accepts an explicit `client` + `data` for standalone use. Builds a
253
- * framework-neutral `Weaverse` core instance (no React Router hooks) and hands
254
- * it to the shared `WeaverseRoot`.
255
- */
256
- declare const WeaverseNextRenderer: react.MemoExoticComponent<(props: WeaverseNextRendererProps) => react_jsx_runtime.JSX.Element | null>;
257
-
258
- /**
259
- * Build the Hydrogen-like request info shape consumed by the Studio bridge.
260
- * Duplicate query keys keep the last value, matching `URLSearchParams` iteration
261
- * assignment and Hydrogen's practical query-object behavior.
262
- */
263
- declare function buildWeaverseNextRequestInfo(context?: WeaverseNextRequestContext): WeaverseNextRequestInfo;
264
-
265
- declare const DEFAULT_REVALIDATE_ENDPOINT = "/api/weaverse/revalidate";
266
- /**
267
- * Minimal runtime surface the in-place apply needs. Structural (not the
268
- * concrete `WeaverseNextRuntime` class) so unit tests can drive it with a
269
- * plain mock.
270
- */
271
- interface RevalidateItemRuntimeLike {
272
- itemInstances: Map<string, {
273
- setData: (update: Record<string, unknown>) => unknown;
274
- }>;
275
- }
276
- /**
277
- * Studio per-item loader revalidation: POST the unsaved draft item to the
278
- * app's revalidate route (see `createWeaverseNextRevalidateHandler`) and apply
279
- * the returned `loaderData` to the live item instance in place.
280
- *
281
- * No `router.refresh()` is involved, so the RSC tree is never re-applied — no
282
- * page remount, no scroll reset, and the draft payload never touches the URL.
283
- *
284
- * Throws on any failure (missing route, non-OK response, unknown item) so the
285
- * Builder Studio bridge can detect the miss and fall back to its legacy
286
- * refresh-based revalidation for this window.
287
- */
288
- declare function revalidateWeaverseNextItem(runtime: RevalidateItemRuntimeLike, draftItem: WeaverseNextComponentData, endpoint?: string): Promise<void>;
289
-
290
- interface WeaverseNextRootContextValue {
291
- /** Active-locale static-text overrides shared with route-level providers. */
292
- merchantOverrides?: Record<string, unknown>;
293
- /** Theme default locale JSON shared with route-level providers. */
294
- staticContent: Record<string, unknown>;
295
- themeSettingsStore: WeaverseNextThemeSettingsStore;
296
- /** Single live design-mode static-text override store for the whole session. */
297
- translationStore: TranslationStore;
298
- }
299
- interface WeaverseNextRootProviderProps {
300
- children: ReactNode;
301
- /** Root-loaded theme settings (published-mode fetch, no design-mode context). */
302
- initialThemeSettings?: Record<string, unknown>;
303
- /** Active-locale static-text overrides from `loadThemeSettings().merchantOverrides`. */
304
- merchantOverrides?: Record<string, unknown>;
305
- publicEnv?: Record<string, string | undefined>;
306
- /**
307
- * Theme default locale JSON (`loadThemeSettings().staticContent`). Falls back
308
- * to `themeSchema.i18n.staticContent` when omitted.
309
- */
310
- staticContent?: Record<string, unknown>;
311
- /** Optional external translation function (host i18n); highest priority in `t()`. */
312
- t?: TranslateFunction;
313
- themeSchema?: WeaverseNextThemeSchema;
314
- }
315
- /**
316
- * Root-scoped client boundary that owns the single `WeaverseNextThemeSettingsStore`
317
- * for the whole app session, matching Hydrogen's `withWeaverse()` root store.
318
- * Mount once in `app/layout.tsx`, above `Header`/`Footer`/global modules and any
319
- * route-level `WeaverseNextProvider`.
320
- *
321
- * Also renders `WeaverseNextContext` with a minimal value so `useThemeSettings()`
322
- * works for components mounted directly under this provider, even without a
323
- * route-level `WeaverseNextProvider` above them.
324
- *
325
- * @example
326
- * ```tsx
327
- * <WeaverseNextRootProvider initialThemeSettings={theme.theme} themeSchema={theme.schema}>
328
- * <Header />
329
- * {children}
330
- * <Footer />
331
- * </WeaverseNextRootProvider>
332
- * ```
333
- */
334
- declare function WeaverseNextRootProvider(props: WeaverseNextRootProviderProps): react_jsx_runtime.JSX.Element;
335
-
336
- /**
337
- * Item store that flattens the serialized item's nested `data` field onto the
338
- * store and seeds schema defaults — same shape Hydrogen produces, so the
339
- * shared `@weaverse/react` renderer can spread props at the top level.
340
- */
341
- declare class WeaverseNextItem extends WeaverseItemStore {
342
- weaverse: WeaverseNextRuntime;
343
- /**
344
- * Cached merged snapshot (base `_store` + translations). Reset whenever the
345
- * `_store` ref or the item's translation entry ref changes, so
346
- * `useSyncExternalStore` sees a stable object between unrelated re-renders.
347
- */
348
- private _cachedSnapshot;
349
- private _snapshotStoreRef;
350
- private _snapshotTranslationRef;
351
- constructor(initialData: WeaverseNextComponentData, weaverse: Weaverse);
352
- /**
353
- * Flatten nested `data` on updates exactly like the constructor does. Core's
354
- * `initProject()` calls `setData(item)` when a new runtime serves a page
355
- * whose item instances already exist (e.g. locale/client navigation), and
356
- * the inherited shallow merge would leave stale top-level props behind.
357
- * Assigning through the inherited `data` setter swaps the `_store` ref,
358
- * which invalidates the memoized snapshot below. The subscriber emit is
359
- * queued instead of fired when a render-phase deferral is active (see
360
- * `collectDeferredItemUpdates`).
361
- */
362
- setData: (update: Omit<ElementData, "id" | "type">) => ElementData;
363
- /**
364
- * Overlay item-level translations onto the base store when the runtime is in
365
- * translation mode. Mirrors Hydrogen's `WeaverseHydrogenItem.getSnapShot()`:
366
- * memoized by `_store` ref + translation entry ref so the returned object is
367
- * referentially stable, and a fast path that returns the base store untouched
368
- * when the item has no translations.
369
- */
370
- getSnapShot: () => ElementData;
371
- }
372
-
373
- declare global {
374
- interface Window {
375
- __weaverse?: WeaverseNextRuntime;
376
- __weaverses?: Record<string, WeaverseNextRuntime>;
377
- }
378
- }
379
- declare class WeaverseNextRuntime extends Weaverse {
380
- pageId: string;
381
- internal: WeaverseNextRuntimeInternal;
382
- requestInfo: WeaverseNextRequestInfo;
383
- isPreviewMode: boolean;
384
- isRevisionPreview: boolean;
385
- sectionType?: string;
386
- /**
387
- * Translation map received from Builder in design mode, keyed by item ID.
388
- * `WeaverseNextItem.getSnapShot()` overlays these onto the data handed to
389
- * components, so translations render without mutating the base `_store`.
390
- */
391
- translationMap: WeaverseNextTranslationMap;
392
- translationLocale: string;
393
- translationLanguageId: string;
394
- /**
395
- * Fresh page data captured while React was rendering. Runtime reuse happens
396
- * inside the renderer's render phase (`useMemo`), where applying it through
397
- * `setProjectData()` would emit item updates to `useSyncExternalStore`
398
- * subscribers mid-render. The renderer applies it post-commit via
399
- * `flushRenderPhaseUpdates()`. Never set on design-mode runtimes — the live
400
- * Studio tree owns the page data there.
401
- */
402
- pendingProjectData?: WeaverseNextPageData & {
403
- rootId: string;
404
- };
405
- /**
406
- * Reused item instances whose data was refreshed while this runtime was
407
- * constructed during render (core `initProject()` calls `setData()` on
408
- * them). Their data is already fresh; only the subscriber notification was
409
- * deferred to `flushRenderPhaseUpdates()`.
410
- */
411
- pendingItemUpdates: WeaverseNextItem[];
412
- constructor(config: WeaverseNextRuntimeConfig);
413
- /**
414
- * Pull `translationMap` / `translationLocale` / `translationLanguageId` off
415
- * the current page data (Builder attaches them in design mode). Unlike
416
- * Hydrogen, this also clears the sidecar to defaults when the new page data
417
- * carries none, so a reused runtime / project-data swap can't leave a stale
418
- * map overlaying the fresh tree.
419
- */
420
- extractTranslationSidecar: () => void;
421
- /**
422
- * Replace the translation sidecar (Builder pushes this when translation data
423
- * arrives or the active language changes) and refresh every item so their
424
- * merged snapshots recompute.
425
- */
426
- setTranslationSidecar: (map?: WeaverseNextTranslationMap, locale?: string, languageId?: string) => void;
427
- /**
428
- * Update a single translatable field for one item. Assigns a new per-item
429
- * entry object so `WeaverseNextItem.getSnapShot()`'s translation-ref cache
430
- * invalidates, then triggers only that item's subscribers.
431
- */
432
- updateTranslation: (itemId: string, key: string, originalValue: string, translatedValue: string) => void;
433
- /**
434
- * Collect translation changes for the save flow. Returns `undefined` unless
435
- * both the locale and language ID are set and at least one entry exists;
436
- * each entry key is namespaced as `data.<field>` to match Builder.
437
- */
438
- getTranslationChanges: () => WeaverseNextTranslationChanges | undefined;
439
- /**
440
- * Re-extract the translation sidecar whenever project data is replaced (route
441
- * change / non-design reuse), before rebuilding item stores. Takes the
442
- * renderable page shape (`rootId` resolved) that `getRenderablePage()` and
443
- * the reuse branch pass in.
444
- */
445
- setProjectData: (data: WeaverseNextPageData & {
446
- rootId: string;
447
- }) => void;
448
- /**
449
- * Apply updates deferred off the render phase: swap in any pending page data
450
- * captured on runtime reuse, then notify items whose data was refreshed
451
- * during construction. The renderer calls this from a layout effect right
452
- * after commit, so subscribers re-render before paint (no content flash) and
453
- * without React's setState-in-render warning.
454
- */
455
- flushRenderPhaseUpdates: () => void;
456
- }
457
- declare function createWeaverseNextRuntime(config: WeaverseNextRuntimeConfig): WeaverseNextRuntime;
458
- declare function bindWeaverseNextStudioRuntime(runtime: WeaverseNextRuntime): boolean;
459
-
460
- interface WeaverseNextStudioBridgeProps {
461
- navigate?: WeaverseNextRuntimeInternal['navigate'];
462
- revalidate?: WeaverseNextRuntimeInternal['revalidate'];
463
- revalidateItem?: WeaverseNextRuntimeInternal['revalidateItem'];
464
- runtime: WeaverseNextRuntime;
465
- }
466
- /** Page-level Studio runtime binder. */
467
- declare function WeaverseNextStudioBridge(props: WeaverseNextStudioBridgeProps): null;
468
-
469
- interface LoadWeaverseNextStudioScriptOptions {
470
- storefrontHostname?: string;
471
- }
472
- /**
473
- * Resolve and append the Next Studio bridge script for the given request
474
- * context, deduping by src. SSR-safe (no-op without `document`) so it can run
475
- * unconditionally from a root layout/error boundary before any page tree or
476
- * runtime exists — e.g. App Router `not-found.tsx` / `error.tsx` routes.
477
- */
478
- declare function loadWeaverseNextStudioScript(context?: WeaverseNextRequestContext, options?: LoadWeaverseNextStudioScriptOptions): void;
479
- interface WeaverseNextStudioConnectProps {
480
- context?: WeaverseNextRequestContext;
481
- storefrontHostname?: string;
482
- }
483
- /**
484
- * Root-level Studio script connector for Next client boundaries. Mount once
485
- * near the app root (e.g. root layout) so it also covers routes that never
486
- * render `WeaverseNextRenderer`, such as `not-found.tsx` / `error.tsx`.
487
- */
488
- declare function WeaverseNextStudioConnect(props: WeaverseNextStudioConnectProps): null;
489
-
490
- /**
491
- * Minimal structural shape of the Next App Router returned by `useRouter()`
492
- * (`next/navigation`) that the Studio bridge needs. Declared locally — rather
493
- * than importing `AppRouterInstance` from `next` — so the adapter stays a pure
494
- * function that unit tests can drive with a plain mock and never pulls
495
- * `next/navigation` into the test graph.
496
- */
497
- interface WeaverseNextRouterLike {
498
- push: (href: string, options?: {
499
- scroll?: boolean;
500
- }) => void;
501
- refresh: () => void;
502
- replace: (href: string, options?: {
503
- scroll?: boolean;
504
- }) => void;
505
- }
506
- /** Resolved Studio navigation/revalidation callbacks for a Next runtime. */
507
- interface WeaverseNextStudioInternals {
508
- navigate: NonNullable<WeaverseNextRuntimeInternal['navigate']>;
509
- revalidate: NonNullable<WeaverseNextRuntimeInternal['revalidate']>;
510
- }
511
- interface CreateWeaverseNextStudioInternalsOptions {
512
- /** Use `router.replace` instead of `router.push` for navigation. */
513
- replace?: boolean;
514
- }
515
- /**
516
- * Build Studio `navigate` / `revalidate` callbacks from a Next App Router.
517
- *
518
- * Maps Hydrogen's React Router semantics onto Next App Router:
519
- * - `navigate(to, { preventScrollReset })` → `router.push(to, { scroll })`,
520
- * where `scroll` is the inverse of `preventScrollReset`. Studio passes
521
- * `preventScrollReset` for in-place edits so the preview viewport is kept,
522
- * matching React Router's `navigate({ preventScrollReset })`.
523
- * - `revalidate()` → `router.refresh()`, the App Router's loader-backed refresh
524
- * and the closest equivalent to React Router's `useRevalidator`.
525
- *
526
- * Pure (no React, no `next/navigation`) so it is unit-testable with a mock
527
- * router; the {@link WeaverseNextRouterLike} contract is the only coupling.
528
- */
529
- declare function createWeaverseNextStudioInternals(router: WeaverseNextRouterLike, options?: CreateWeaverseNextStudioInternalsOptions): WeaverseNextStudioInternals;
530
-
531
- interface ResolveWeaverseNextStudioScriptSrcOptions {
532
- storefrontHostname?: string;
533
- }
534
- /**
535
- * Resolve the Studio script URL from request/search context. `@weaverse/next`
536
- * uses the dedicated Next bridge path served by Builder.
537
- */
538
- declare function resolveWeaverseNextStudioScriptSrc(context?: WeaverseNextRequestContext, options?: ResolveWeaverseNextStudioScriptSrcOptions): string | null;
539
-
540
- interface CreateWeaverseNextThemeSettingsStoreOptions {
541
- publicEnv?: Record<string, string | undefined>;
542
- schema?: WeaverseNextThemeSchema;
543
- settings?: Record<string, unknown>;
544
- }
545
- /**
546
- * Small external store shape compatible with the Studio bridge and React's
547
- * `useSyncExternalStore` contract. The bridge calls `updateThemeSettings` during
548
- * live theme edits, so keep that method name stable.
549
- */
550
- declare function createWeaverseNextThemeSettingsStore(options?: CreateWeaverseNextThemeSettingsStoreOptions): WeaverseNextThemeSettingsStore;
551
-
552
- /**
553
- * Resolve stable Studio `navigate` / `revalidate` callbacks from the Next App
554
- * Router. `useRouter()` is stable across renders, but the derived callbacks are
555
- * cached in a ref keyed on the router instance so the bridge's bind effect
556
- * (which depends on `navigate` / `revalidate` identity) doesn't re-run — and
557
- * re-`refreshStudio` — on every render.
558
- */
559
- declare function useWeaverseNextStudioInternals(options?: CreateWeaverseNextStudioInternalsOptions): WeaverseNextStudioInternals;
560
- interface WeaverseNextStudioProps extends CreateWeaverseNextStudioInternalsOptions {
561
- /**
562
- * Route the app mounted with `createWeaverseNextRevalidateHandler`.
563
- * Defaults to `/api/weaverse/revalidate`.
564
- */
565
- revalidateEndpoint?: string;
566
- runtime: WeaverseNextRuntime;
567
- }
568
- /**
569
- * Page-level Studio binder wired to the Next App Router. Mirrors Hydrogen's
570
- * `useStudio` (which binds the runtime and feeds it React Router's `navigate` /
571
- * `revalidate`): it resolves the App Router callbacks via
572
- * {@link useWeaverseNextStudioInternals} and hands them to
573
- * {@link WeaverseNextStudioBridge}, so consuming apps get Studio navigation and
574
- * revalidation without manually wiring `next/navigation`.
575
- *
576
- * Client-only — it is the single place `@weaverse/next` touches
577
- * `next/navigation`, keeping the runtime/renderer and `@weaverse/next/server`
578
- * free of router imports.
579
- */
580
- declare function WeaverseNextStudio(props: WeaverseNextStudioProps): react_jsx_runtime.JSX.Element;
581
-
582
- /**
583
- * Generate default component data from a schema's `settings` inputs.
584
- *
585
- * Mirrors Hydrogen's `generateDataFromSchema` (settings → `{ [name]:
586
- * defaultValue }`) but is kept local so `@weaverse/next` doesn't depend on
587
- * `@weaverse/hydrogen`. Falls back to the deprecated `inspector` array when a
588
- * schema predates `settings`.
589
- */
590
- declare function generateDataFromSchema(schema: SchemaType | WeaverseNextThemeSchema | undefined): Record<string, unknown>;
591
-
592
- export { type CreateWeaverseNextStudioInternalsOptions, type CreateWeaverseNextThemeSettingsStoreOptions, DEFAULT_REVALIDATE_ENDPOINT, type LoadWeaverseNextStudioScriptOptions, type ResolveWeaverseNextStudioScriptSrcOptions, type RevalidateItemRuntimeLike, type RunComponentLoadersArgs, ThemeTextProvider, type ThemeTextProviderProps, type ThemeTextValue, type TranslateFunction, TranslationProvider, type TranslationProviderProps, TranslationStore, type TranslationValue, WeaverseNextClient, WeaverseNextClientConfig, WeaverseNextCommerceContext, WeaverseNextComponentData, WeaverseNextLoaderData, WeaverseNextPageData, WeaverseNextProvider, type WeaverseNextProviderProps, WeaverseNextRenderer, type WeaverseNextRendererProps, WeaverseNextRequestContext, WeaverseNextRequestInfo, type WeaverseNextRootContextValue, WeaverseNextRootProvider, type WeaverseNextRootProviderProps, type WeaverseNextRouterLike, WeaverseNextRuntime, WeaverseNextRuntimeConfig, WeaverseNextRuntimeInternal, WeaverseNextStudio, WeaverseNextStudioBridge, type WeaverseNextStudioBridgeProps, WeaverseNextStudioConnect, type WeaverseNextStudioConnectProps, type WeaverseNextStudioInternals, type WeaverseNextStudioProps, WeaverseNextThemeSchema, WeaverseNextThemeSettingsStore, WeaverseNextTranslationChanges, WeaverseNextTranslationMap, bindWeaverseNextStudioRuntime, buildWeaverseNextRequestInfo, createTranslate, createWeaverseNextClient, createWeaverseNextRuntime, createWeaverseNextStudioInternals, createWeaverseNextThemeSettingsStore, generateDataFromSchema, getNestedKey, interpolate, loadWeaverseNextStudioScript, resolveWeaverseNextStudioScriptSrc, revalidateWeaverseNextItem, runWeaverseComponentLoaders, useThemeSettings, useThemeText, useTranslation, useWeaverseCommerce, useWeaverseNextStudioInternals, useWeaversePageData, useWeaverseRootData };