@weaverse/hydrogen 6.1.2 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/dist/index.js +5 -6
  2. package/dist/index.mjs +1 -2
  3. package/dist/internal.js +18 -29
  4. package/dist/internal.mjs +3 -14
  5. package/dist/next-client-boundary.js +1088 -0
  6. package/dist/next-client-boundary.js.map +1 -0
  7. package/dist/next-client-boundary.mjs +1038 -0
  8. package/dist/next-client-boundary.mjs.map +1 -0
  9. package/dist/next-server.js +669 -13
  10. package/dist/next-server.js.map +1 -0
  11. package/dist/next-server.mjs +666 -2
  12. package/dist/next-server.mjs.map +1 -0
  13. package/dist/next.js +33 -41
  14. package/dist/next.mjs +5 -3
  15. package/dist/react-router.js +6 -7
  16. package/dist/react-router.mjs +2 -3
  17. package/dist/seo-B8u2r3rX.mjs +205 -0
  18. package/dist/seo-B8u2r3rX.mjs.map +1 -0
  19. package/dist/seo-D9A9uRQ4.js +264 -0
  20. package/dist/seo-D9A9uRQ4.js.map +1 -0
  21. package/dist/translate-Celryv8j.mjs +26 -0
  22. package/dist/translate-Celryv8j.mjs.map +1 -0
  23. package/dist/translate-Kt1BYL1n.js +37 -0
  24. package/dist/translate-Kt1BYL1n.js.map +1 -0
  25. package/dist/{nested-key-CR3-YMFi.js → translation-store-BmGxBALf.js} +46 -137
  26. package/dist/translation-store-BmGxBALf.js.map +1 -0
  27. package/dist/{nested-key-_k9aW_Wd.mjs → translation-store-JFs-4lvf.mjs} +35 -138
  28. package/dist/translation-store-JFs-4lvf.mjs.map +1 -0
  29. package/dist/types/hooks/translation-context.d.ts +2 -36
  30. package/dist/types/hooks/translation-context.d.ts.map +1 -1
  31. package/dist/types/next/client-boundary.d.ts +25 -0
  32. package/dist/types/next/client-boundary.d.ts.map +1 -0
  33. package/dist/types/next/client.d.ts +16 -0
  34. package/dist/types/next/client.d.ts.map +1 -0
  35. package/dist/types/next/hooks.d.ts +20 -0
  36. package/dist/types/next/hooks.d.ts.map +1 -0
  37. package/dist/types/next/index.d.ts +34 -0
  38. package/dist/types/next/index.d.ts.map +1 -0
  39. package/dist/types/next/item.d.ts +60 -0
  40. package/dist/types/next/item.d.ts.map +1 -0
  41. package/dist/types/next/loader.d.ts +25 -0
  42. package/dist/types/next/loader.d.ts.map +1 -0
  43. package/dist/types/next/main.d.ts +11 -0
  44. package/dist/types/next/main.d.ts.map +1 -0
  45. package/dist/types/next/provider.d.ts +85 -0
  46. package/dist/types/next/provider.d.ts.map +1 -0
  47. package/dist/types/next/registry.d.ts +15 -0
  48. package/dist/types/next/registry.d.ts.map +1 -0
  49. package/dist/types/next/renderer.d.ts +21 -0
  50. package/dist/types/next/renderer.d.ts.map +1 -0
  51. package/dist/types/next/request-info.d.ts +19 -0
  52. package/dist/types/next/request-info.d.ts.map +1 -0
  53. package/dist/types/next/revalidate-item.d.ts +82 -0
  54. package/dist/types/next/revalidate-item.d.ts.map +1 -0
  55. package/dist/types/next/root-provider.d.ts +65 -0
  56. package/dist/types/next/root-provider.d.ts.map +1 -0
  57. package/dist/types/next/runtime.d.ts +113 -0
  58. package/dist/types/next/runtime.d.ts.map +1 -0
  59. package/dist/types/next/seo.d.ts +55 -0
  60. package/dist/types/next/seo.d.ts.map +1 -0
  61. package/dist/types/next/server/configs.d.ts +27 -0
  62. package/dist/types/next/server/configs.d.ts.map +1 -0
  63. package/dist/types/next/server/normalize-page-url.d.ts +19 -0
  64. package/dist/types/next/server/normalize-page-url.d.ts.map +1 -0
  65. package/dist/types/next/server/revalidate-handler.d.ts +55 -0
  66. package/dist/types/next/server/revalidate-handler.d.ts.map +1 -0
  67. package/dist/types/next/server/server-client.d.ts +21 -0
  68. package/dist/types/next/server/server-client.d.ts.map +1 -0
  69. package/dist/types/next/server.d.ts +19 -0
  70. package/dist/types/next/server.d.ts.map +1 -0
  71. package/dist/types/next/studio-bridge.d.ts +16 -0
  72. package/dist/types/next/studio-bridge.d.ts.map +1 -0
  73. package/dist/types/next/studio-connect.d.ts +27 -0
  74. package/dist/types/next/studio-connect.d.ts.map +1 -0
  75. package/dist/types/next/studio-router.d.ts +50 -0
  76. package/dist/types/next/studio-router.d.ts.map +1 -0
  77. package/dist/types/next/studio-script-src.d.ts +12 -0
  78. package/dist/types/next/studio-script-src.d.ts.map +1 -0
  79. package/dist/types/next/theme-settings-store.d.ts +18 -0
  80. package/dist/types/next/theme-settings-store.d.ts.map +1 -0
  81. package/dist/types/next/translation-context.d.ts +109 -0
  82. package/dist/types/next/translation-context.d.ts.map +1 -0
  83. package/dist/types/next/types.d.ts +674 -0
  84. package/dist/types/next/types.d.ts.map +1 -0
  85. package/dist/types/next/use-weaverse-next-studio.d.ts +34 -0
  86. package/dist/types/next/use-weaverse-next-studio.d.ts.map +1 -0
  87. package/dist/types/next/utils.d.ts +21 -0
  88. package/dist/types/next/utils.d.ts.map +1 -0
  89. package/dist/types/next-server.d.ts +3 -1
  90. package/dist/types/next-server.d.ts.map +1 -1
  91. package/dist/types/next.d.ts +4 -3
  92. package/dist/types/next.d.ts.map +1 -1
  93. package/dist/types/utils/translate.d.ts +51 -0
  94. package/dist/types/utils/translate.d.ts.map +1 -0
  95. package/dist/{weaverse-client-C9IgIH7O.js → weaverse-client-BmceZc5q.js} +49 -771
  96. package/dist/weaverse-client-BmceZc5q.js.map +1 -0
  97. package/dist/{weaverse-client-D59mBW0j.mjs → weaverse-client-CXnM9ayH.mjs} +4 -720
  98. package/dist/weaverse-client-CXnM9ayH.mjs.map +1 -0
  99. package/package.json +13 -7
  100. package/src/hooks/translation-context.tsx +7 -84
  101. package/src/next/client-boundary.ts +51 -0
  102. package/src/next/client.ts +102 -0
  103. package/src/next/hooks.ts +52 -0
  104. package/src/next/index.ts +145 -0
  105. package/src/next/item.ts +167 -0
  106. package/src/next/loader.ts +135 -0
  107. package/src/next/main.tsx +45 -0
  108. package/src/next/provider.tsx +241 -0
  109. package/src/next/registry.ts +63 -0
  110. package/src/next/renderer.tsx +102 -0
  111. package/src/next/request-info.ts +124 -0
  112. package/src/next/revalidate-item.ts +211 -0
  113. package/src/next/root-provider.tsx +201 -0
  114. package/src/next/runtime.ts +559 -0
  115. package/src/next/seo.ts +157 -0
  116. package/src/next/server/configs.ts +178 -0
  117. package/src/next/server/normalize-page-url.ts +73 -0
  118. package/src/next/server/revalidate-handler.ts +357 -0
  119. package/src/next/server/server-client.ts +728 -0
  120. package/src/next/server.ts +67 -0
  121. package/src/next/studio-bridge.tsx +82 -0
  122. package/src/next/studio-connect.tsx +88 -0
  123. package/src/next/studio-router.ts +85 -0
  124. package/src/next/studio-script-src.ts +128 -0
  125. package/src/next/theme-settings-store.ts +47 -0
  126. package/src/next/translation-context.tsx +182 -0
  127. package/src/next/types.ts +764 -0
  128. package/src/next/use-weaverse-next-studio.tsx +106 -0
  129. package/src/next/utils.ts +48 -0
  130. package/src/next-server.ts +41 -1
  131. package/src/next.ts +51 -15
  132. package/src/utils/translate.ts +101 -0
  133. package/dist/internal.js.map +0 -1
  134. package/dist/internal.mjs.map +0 -1
  135. package/dist/nested-key-CR3-YMFi.js.map +0 -1
  136. package/dist/nested-key-_k9aW_Wd.mjs.map +0 -1
  137. package/dist/translation-store-4fAV771j.js +0 -69
  138. package/dist/translation-store-4fAV771j.js.map +0 -1
  139. package/dist/translation-store-BBrw0FOk.mjs +0 -58
  140. package/dist/translation-store-BBrw0FOk.mjs.map +0 -1
  141. package/dist/weaverse-client-C9IgIH7O.js.map +0 -1
  142. package/dist/weaverse-client-D59mBW0j.mjs.map +0 -1
@@ -0,0 +1,764 @@
1
+ import type {
2
+ StudioSelectionStore,
3
+ WeaverseElement,
4
+ WeaverseResourcePickerData,
5
+ } from '@weaverse/react'
6
+ import type {
7
+ InspectorGroup,
8
+ PageSEOData,
9
+ PageType,
10
+ SchemaType,
11
+ ThemeOutline,
12
+ ThemeRoutes,
13
+ } from '@weaverse/schema'
14
+ import type { ComponentType, ForwardRefExoticComponent, ReactNode } from 'react'
15
+ import type { TranslationStore } from '../utils/translation-store'
16
+
17
+ /** Request metadata exposed to the Studio runtime. */
18
+ export interface WeaverseNextRequestInfo {
19
+ /** Route handle used for page assignment. */
20
+ handle?: string
21
+ /** Locale and market information for the current request. */
22
+ i18n?: WeaverseNextI18n
23
+ /** Weaverse page type resolved by the route. */
24
+ pageType?: PageType
25
+ /** URL pathname without the query string. */
26
+ pathname: string
27
+ /** Query parameters, with `true` and `false` converted to booleans. */
28
+ queries: Record<string, string | boolean>
29
+ /** Serialized query string, including the leading `?` when non-empty. */
30
+ search: string
31
+ }
32
+
33
+ /** External store used by React and Studio for live theme-setting updates. */
34
+ export interface WeaverseNextThemeSettingsStore {
35
+ /** Return the theme-settings snapshot during server rendering. */
36
+ getServerSnapshot: () => Record<string, unknown>
37
+ /** Return the current theme-settings snapshot. */
38
+ getSnapshot: () => Record<string, unknown>
39
+ /** Public environment values exposed with the theme settings. */
40
+ publicEnv?: Record<string, string | undefined>
41
+ /** Theme schema associated with this store. */
42
+ schema?: SchemaType | WeaverseNextThemeSchema
43
+ /** Current merged theme-setting values. */
44
+ settings: Record<string, unknown>
45
+ /** Subscribe to setting changes and return an unsubscribe function. */
46
+ subscribe: (listener: () => void) => () => void
47
+ /** Merge setting changes into the current snapshot and notify subscribers. */
48
+ updateThemeSettings: (next: Record<string, unknown>) => void
49
+ }
50
+
51
+ /**
52
+ * Page assignment payload returned by `/api/public/project` and preserved on
53
+ * loader data so the Builder Studio save pipeline receives the same shape it
54
+ * gets from Hydrogen (`{ projectId, type, locale, handle }`, plus optional
55
+ * inherited/fallback `meta`). Kept framework-neutral: `type` accepts a known
56
+ * `PageType` or any string, and `meta` preserves inherited/fallback metadata
57
+ * (unknown fields included) without asserting a strict shape.
58
+ */
59
+ export interface WeaverseNextPageAssignment {
60
+ /** Assigned page handle. */
61
+ handle: string
62
+ /** Assigned locale, or an empty string when the API omits it. */
63
+ locale: string
64
+ /** Inherited/fallback page metadata; unknown fields preserved as-is. */
65
+ meta?: {
66
+ /** Number of inheritance levels between source and assigned projects. */
67
+ depth?: number
68
+ /** Whether the assignment was inherited from another project. */
69
+ inherited?: boolean
70
+ /** Project that supplied an inherited assignment. */
71
+ sourceProjectId?: string
72
+ /** Additional assignment metadata returned by the API. */
73
+ [key: string]: unknown
74
+ }
75
+ /** Project that owns the assignment. */
76
+ projectId: string
77
+ /** Assigned Weaverse page type. */
78
+ type: PageType | string
79
+ }
80
+
81
+ /** Mutable integration callbacks and data exposed to the Studio bridge. */
82
+ export interface WeaverseNextRuntimeInternal {
83
+ /** Active-locale static-text overrides fetched from the API (nested). */
84
+ merchantOverrides?: Record<string, unknown>
85
+ /** Navigate the preview while preserving React Router-compatible options. */
86
+ navigate?: (
87
+ to: string,
88
+ options?:
89
+ | {
90
+ /** Preserve the current preview scroll position after navigation. */
91
+ preventScrollReset?: boolean
92
+ }
93
+ | Record<string, unknown>
94
+ ) => void
95
+ /** Assignment metadata used by Studio save operations. */
96
+ pageAssignment?: WeaverseNextPageAssignment
97
+ /** Raw project payload associated with the loaded page. */
98
+ project?: unknown
99
+ /** Refresh server-rendered route data. */
100
+ revalidate?: (options?: unknown) => Promise<void> | void
101
+ /**
102
+ * Studio per-item loader revalidation. Builder feature-detects this and
103
+ * prefers it over the legacy `revalidate()` (`router.refresh()`) flow; it
104
+ * must reject on failure so Builder can fall back.
105
+ */
106
+ revalidateItem?: (draftItem: WeaverseNextComponentData) => Promise<void>
107
+ /** Studio selection store the Studio bridge writes; read by `useStudioSelection`. */
108
+ studioSelectionStore?: StudioSelectionStore
109
+ /** Live theme-settings store used by Studio. */
110
+ themeSettingsStore?: WeaverseNextThemeSettingsStore
111
+ /**
112
+ * Legacy name for the live translation store.
113
+ *
114
+ * @deprecated Use {@link WeaverseNextRuntimeInternal.translationStore}
115
+ * instead. Same instance, kept so Builder's existing `updateStaticText()`
116
+ * RPC (which reads `internal.themeTextStore`) works with Next unchanged.
117
+ */
118
+ themeTextStore?: TranslationStore
119
+ /**
120
+ * Live design-mode static-text override store. Builder's `updateStaticText()`
121
+ * RPC mutates it via `updateOverrides()`; the `TranslationProvider` observing
122
+ * the same instance re-renders `useTranslation()` consumers.
123
+ */
124
+ translationStore?: TranslationStore
125
+ }
126
+
127
+ /** Configuration used to create or reuse a browser-side Weaverse runtime. */
128
+ export interface WeaverseNextRuntimeConfig {
129
+ /** Client that supplied the page and request context. */
130
+ client?: WeaverseNextClient
131
+ /** Loaded Weaverse page payload. */
132
+ data: WeaverseNextLoaderData
133
+ /** Data-connector values available while rendering the page. */
134
+ dataContext?: Record<string, unknown>
135
+ /** Active-locale static-text overrides threaded onto `internal`. */
136
+ merchantOverrides?: Record<string, unknown>
137
+ /** Preview navigation callback, normally derived from Next's router. */
138
+ navigate?: WeaverseNextRuntimeInternal['navigate']
139
+ /** Route revalidation callback, normally backed by `router.refresh()`. */
140
+ revalidate?: WeaverseNextRuntimeInternal['revalidate']
141
+ /** Root/route-owned Studio selection store to attach to `internal`. */
142
+ studioSelectionStore?: StudioSelectionStore
143
+ /** Existing root-scoped theme-settings store to reuse. */
144
+ themeSettingsStore?: WeaverseNextThemeSettingsStore
145
+ /** Root/route-owned translation store to attach to `internal`. */
146
+ translationStore?: TranslationStore
147
+ }
148
+
149
+ // ─── Item-level translation sidecar types (design mode) ──────────────
150
+ //
151
+ // Kept structurally aligned with Hydrogen's `TranslationMapEntry` /
152
+ // `TranslationItemEntry` / `TranslationMap` / `TranslationEntry` /
153
+ // `TranslationChanges` so Builder Studio's item-translation RPC contract works
154
+ // against `@weaverse/hydrogen/next` unchanged. Values stay strings for now; broaden to
155
+ // object values only when Builder image handling forces it (with tests).
156
+
157
+ /** A single translated field for one item. */
158
+ export interface WeaverseNextTranslationMapEntry {
159
+ /** Source-language value used to detect changes. */
160
+ originalValue: string
161
+ /** Current translated value. */
162
+ translatedValue: string
163
+ }
164
+
165
+ /** Per-item translation fields, keyed by field name. */
166
+ export interface WeaverseNextTranslationItemEntry {
167
+ /** Translation entry keyed by component setting name. */
168
+ [key: string]: WeaverseNextTranslationMapEntry
169
+ }
170
+
171
+ /**
172
+ * Translation map sent from Builder alongside page data in design mode.
173
+ * Keyed by item ID, each value maps field names to translation entries.
174
+ */
175
+ export interface WeaverseNextTranslationMap {
176
+ /** Translated fields keyed by Weaverse item ID. */
177
+ [itemId: string]: WeaverseNextTranslationItemEntry
178
+ }
179
+
180
+ /** A single translation entry for save payloads. */
181
+ export interface WeaverseNextTranslationEntry {
182
+ /** Whether the persisted translation should be removed. */
183
+ deleted?: boolean
184
+ /** Weaverse item that owns the translated field. */
185
+ itemId: string
186
+ /** Namespaced field key, such as `data.heading`. */
187
+ key: string
188
+ /** Source-language value used to detect changes. */
189
+ originalValue: string
190
+ /** Value to persist for the target language. */
191
+ translatedValue: string
192
+ }
193
+
194
+ /** Result of collecting translation changes for the save flow. */
195
+ export interface WeaverseNextTranslationChanges {
196
+ /** Changed translation entries ready for the Studio save payload. */
197
+ entries: WeaverseNextTranslationEntry[]
198
+ /** Target language identifier used by Weaverse. */
199
+ languageId: string
200
+ }
201
+
202
+ /**
203
+ * Locale/market info passed through to component loaders and the Storefront
204
+ * client. Kept structurally close to Hydrogen's `WeaverseI18n` but without the
205
+ * `@shopify/hydrogen` `I18nBase` dependency so the adapter stays framework
206
+ * neutral.
207
+ */
208
+ export interface WeaverseNextI18n {
209
+ /** ISO country or market code. */
210
+ country?: string
211
+ /** Human-readable locale label. */
212
+ label?: string
213
+ /** ISO language code. */
214
+ language?: string
215
+ /** Combined locale identifier, such as `en-US`. */
216
+ locale?: string
217
+ /** Locale prefix used in storefront paths. */
218
+ pathPrefix?: string
219
+ /** Additional host-defined locale metadata. */
220
+ [key: string]: unknown
221
+ }
222
+
223
+ /** Framework-neutral theme-setting input accepted by the Next adapter. */
224
+ export interface WeaverseNextThemeSchemaInput {
225
+ /** Optional visibility condition evaluated by Builder. */
226
+ condition?: unknown
227
+ /** Default value applied when no merchant value exists. */
228
+ defaultValue?: unknown
229
+ /** Setting key used in the generated theme-settings object. */
230
+ name?: string
231
+ /** Additional schema fields preserved for Builder compatibility. */
232
+ [key: string]: unknown
233
+ }
234
+
235
+ /** Named group of theme-setting inputs displayed in Builder. */
236
+ export interface WeaverseNextThemeSchemaGroup {
237
+ /** Group label displayed in Builder. */
238
+ group?: string
239
+ /** Theme-setting inputs contained in this group. */
240
+ inputs?: WeaverseNextThemeSchemaInput[]
241
+ /** Additional group metadata preserved for Builder compatibility. */
242
+ [key: string]: unknown
243
+ }
244
+
245
+ /**
246
+ * Theme schema shape accepted by the Next adapter. Mirrors Hydrogen's
247
+ * `HydrogenThemeSchema` while keeping locale data framework-neutral via
248
+ * {@link WeaverseNextI18n}.
249
+ */
250
+ export interface WeaverseNextThemeSchema {
251
+ /** Theme localization configuration and default static content. */
252
+ i18n?: {
253
+ /** Locale used when no storefront locale matches. */
254
+ defaultLocale?: WeaverseNextI18n
255
+ /** Locales supported by the storefront. */
256
+ shopLocales?: WeaverseNextI18n[]
257
+ /** Default translated strings keyed by dot path or nested key. */
258
+ staticContent?: Record<string, unknown>
259
+ /** Enable the translation UI in Builder. */
260
+ translation?: boolean
261
+ /** Storefront URL strategy used to distinguish locales. */
262
+ urlStructure?: 'url-path' | 'subdomain' | 'top-level-domain'
263
+ /** Additional localization metadata preserved for compatibility. */
264
+ [key: string]: unknown
265
+ }
266
+ /** Theme identity, version, support, and documentation metadata. */
267
+ info?: {
268
+ /** Theme author or organization name. */
269
+ author?: string
270
+ /** URL of the author's profile image. */
271
+ authorProfilePhoto?: string
272
+ /** URL of the theme documentation. */
273
+ documentationUrl?: string
274
+ /** Display name of the theme. */
275
+ name?: string
276
+ /** URL where merchants can request theme support. */
277
+ supportUrl?: string
278
+ /** Published theme version. */
279
+ version?: string
280
+ /** Additional theme identity metadata preserved for compatibility. */
281
+ [key: string]: unknown
282
+ }
283
+ /**
284
+ * Legacy theme-setting groups.
285
+ *
286
+ * @deprecated Migrate the same groups to {@link WeaverseNextThemeSchema.settings}.
287
+ */
288
+ inspector?: (InspectorGroup | WeaverseNextThemeSchemaGroup)[]
289
+ /**
290
+ * Settings groups listed in the Studio Page Outline, keyed by area. See
291
+ * `ThemeOutline`.
292
+ */
293
+ outline?: ThemeOutline
294
+ /**
295
+ * URL patterns for the page types whose routes differ from the Shopify
296
+ * convention, so Studio can navigate to them, e.g.
297
+ * `{ COLLECTION: '/shop/:handle' }`. See `ThemeRoutes`.
298
+ */
299
+ routes?: ThemeRoutes
300
+ /** Theme-setting groups displayed in Builder. */
301
+ settings?: (InspectorGroup | WeaverseNextThemeSchemaGroup)[]
302
+ /** Additional schema metadata preserved for forward compatibility. */
303
+ [key: string]: unknown
304
+ }
305
+
306
+ /**
307
+ * Minimal Storefront client shape required by component loaders. The host app
308
+ * provides this (public or private token mode); Weaverse never owns it.
309
+ */
310
+ export interface WeaverseNextStorefront {
311
+ /** Locale and market used for Storefront API queries. */
312
+ i18n?: WeaverseNextI18n
313
+ /** Execute a Storefront API GraphQL query. */
314
+ query: (query: string, options?: unknown) => Promise<unknown>
315
+ /** Additional methods supplied by the commerce integration. */
316
+ [key: string]: unknown
317
+ }
318
+
319
+ /**
320
+ * App-provided commerce context. `storefront` is the only v0 must-have; cart
321
+ * and customer-account stay app-owned and are passed through untouched.
322
+ */
323
+ export interface WeaverseNextCommerceContext {
324
+ /** Host-defined cart client or state. */
325
+ cart?: unknown
326
+ /** Host-defined customer account client or state. */
327
+ customerAccount?: unknown
328
+ /** Storefront API client used by component loaders. */
329
+ storefront?: WeaverseNextStorefront
330
+ /** Additional host-defined commerce services. */
331
+ [key: string]: unknown
332
+ }
333
+
334
+ /**
335
+ * Explicit, framework-neutral replacement for React Router's
336
+ * `LoaderFunctionArgs`. Built by the Next route/page from params + headers +
337
+ * searchParams instead of an implicit loader context.
338
+ */
339
+ export interface WeaverseNextRequestContext {
340
+ /** Route handle used for page assignment. */
341
+ handle?: string
342
+ /** Incoming request headers. */
343
+ headers?: Headers
344
+ /** Locale and market information for this request. */
345
+ i18n?: WeaverseNextI18n
346
+ /** Whether the request is rendered inside Builder Studio. */
347
+ isDesignMode?: boolean
348
+ /** Whether the request renders a component preview. */
349
+ isPreviewMode?: boolean
350
+ /** Whether the request renders a saved revision. */
351
+ isRevisionPreview?: boolean
352
+ /** Weaverse page type resolved by the route. */
353
+ pageType?: PageType
354
+ /** Request pathname when a complete URL is unavailable. */
355
+ pathname?: string
356
+ /** Request query parameters. */
357
+ searchParams?: URLSearchParams
358
+ /** Component type requested for section preview mode. */
359
+ sectionType?: string
360
+ /** Complete request URL, when available. */
361
+ url?: URL | string
362
+ /** Additional request-scoped values passed to component loaders. */
363
+ [key: string]: unknown
364
+ }
365
+
366
+ /** A single serialized item in a Weaverse page tree. */
367
+ export interface WeaverseNextComponentData {
368
+ /** Inline child items or references to items in the page's flat item list. */
369
+ children?:
370
+ | WeaverseNextComponentData[]
371
+ | {
372
+ /** ID of the referenced child item. */
373
+ id: string
374
+ }[]
375
+ /** Authored component setting values. */
376
+ data?: Record<string, unknown>
377
+ /** Stable Weaverse item identifier. */
378
+ id: string
379
+ /** Attached by the root-entry `runWeaverseComponentLoaders` after a loader runs. */
380
+ loaderData?: unknown
381
+ /** Registered component schema type. */
382
+ type: string
383
+ /** Additional serialized item metadata. */
384
+ [key: string]: unknown
385
+ }
386
+
387
+ /** Serialized page tree fetched from Weaverse. */
388
+ export interface WeaverseNextPageData {
389
+ /** Stable Weaverse page identifier. */
390
+ id: string
391
+ /** Flat serialized component tree. */
392
+ items: WeaverseNextComponentData[]
393
+ /** Display name assigned in Builder. */
394
+ name?: string
395
+ /** Root component item ID. */
396
+ rootId?: string
397
+ /** Page-level SEO metadata published by Weaverse Builder. */
398
+ seo?: PageSEOData | null
399
+ /** Additional page metadata returned by the API. */
400
+ [key: string]: unknown
401
+ }
402
+
403
+ /**
404
+ * Top-level payload returned by `client.loadPage`. Kept close to Hydrogen's
405
+ * `WeaverseLoaderData` so registered components stay portable.
406
+ */
407
+ export interface WeaverseNextLoaderData {
408
+ /** Client-safe runtime configuration returned with the page. */
409
+ configs?: Record<string, unknown>
410
+ /** Serialized page to render. */
411
+ page: WeaverseNextPageData
412
+ /** Assignment used by Studio when saving the page. */
413
+ pageAssignment?: WeaverseNextPageAssignment
414
+ /** Public project metadata returned by Weaverse. */
415
+ project?: Record<string, unknown>
416
+ /** Additional loader values supplied by the host app. */
417
+ [key: string]: unknown
418
+ }
419
+
420
+ /** Props injected into every registered Weaverse component. */
421
+ export interface WeaverseNextComponentProps<L = unknown>
422
+ extends Partial<WeaverseElement> {
423
+ /** Nested rendered component content. */
424
+ children?: ReactNode
425
+ /** Optional CSS class supplied by the renderer or component settings. */
426
+ className?: string
427
+ /** Result returned by the registered component loader. */
428
+ loaderData?: L
429
+ /** Authored component settings and renderer-provided values. */
430
+ [key: string]: unknown
431
+ }
432
+
433
+ /**
434
+ * Arguments passed to a component `loader`. `commerce.storefront` is the
435
+ * explicit contract; `weaverse.storefront` exists as a compatibility alias for
436
+ * Pilot-style loaders that call `weaverse.storefront.query(...)`.
437
+ */
438
+ export interface WeaverseNextComponentLoaderArgs<TData = unknown> {
439
+ /** Request-scoped commerce clients and state. */
440
+ commerce?: WeaverseNextCommerceContext
441
+ /** Explicit Next request context. */
442
+ context?: WeaverseNextRequestContext
443
+ /** Component settings merged over schema defaults. */
444
+ data: TData
445
+ /** Request-scoped Weaverse client. */
446
+ weaverse: WeaverseNextClient
447
+ }
448
+
449
+ /** Registered component module shape: `default` + `schema` + optional `loader`. */
450
+ export interface WeaverseNextComponent<
451
+ TProps extends WeaverseNextComponentProps = WeaverseNextComponentProps,
452
+ > {
453
+ /** React component rendered for this registration. */
454
+ default: ComponentType<TProps> | ForwardRefExoticComponent<TProps>
455
+ /** Optional server-side data loader for each component item. */
456
+ loader?: (args: WeaverseNextComponentLoaderArgs) => Promise<unknown>
457
+ /** Builder schema identifying the component and its settings. */
458
+ schema: SchemaType
459
+ }
460
+
461
+ /** Input for `client.loadPage`. The Next route maps `params` → `type/handle`. */
462
+ export interface WeaverseNextLoadPageInput {
463
+ /** Page handle resolved from the route. */
464
+ handle?: string
465
+ /** Locale used to select the assigned page. */
466
+ locale?: string
467
+ /** Weaverse page type to load. */
468
+ type?: PageType
469
+ /** Additional page-resolution parameters sent to Weaverse. */
470
+ [key: string]: unknown
471
+ }
472
+
473
+ /** Configuration for the fetcher-injected root-entry client. */
474
+ export interface WeaverseNextClientConfig {
475
+ /** Commerce services passed to component loaders. */
476
+ commerce?: WeaverseNextCommerceContext
477
+ /** Component modules available to the renderer and loaders. */
478
+ components: WeaverseNextComponent[]
479
+ /**
480
+ * Injected page fetcher. v0 delegates network I/O to the host app so the
481
+ * adapter can be tested without real Weaverse API calls.
482
+ */
483
+ fetchPage?: (
484
+ input: WeaverseNextLoadPageInput
485
+ ) => Promise<WeaverseNextLoaderData | null>
486
+ /** Injected theme-settings fetcher. */
487
+ fetchThemeSettings?: (
488
+ context?: WeaverseNextRequestContext
489
+ ) => Promise<unknown>
490
+ /** Weaverse project to load. */
491
+ projectId: string
492
+ /** Request metadata passed to component loaders and the runtime. */
493
+ requestContext?: WeaverseNextRequestContext
494
+ /** Theme schema used to derive default settings. */
495
+ themeSchema?: SchemaType | WeaverseNextThemeSchema
496
+ /** Merchant theme settings merged over schema defaults. */
497
+ themeSettings?: Record<string, unknown>
498
+ }
499
+
500
+ /**
501
+ * Request-safe client returned by the root-entry `createWeaverseNextClient`.
502
+ * Holds the registry/config plus the currently loaded page data and is passed
503
+ * to component loaders as `weaverse`.
504
+ */
505
+ export interface WeaverseNextClient {
506
+ /** Commerce services passed to component loaders. */
507
+ commerce?: WeaverseNextCommerceContext
508
+ /** Registered component modules. */
509
+ components: WeaverseNextComponent[]
510
+ /** Currently loaded page payload (set by `loadPage`). */
511
+ data: WeaverseNextLoaderData | null
512
+ /** Data-connector context handed to the React renderer. */
513
+ dataContext: Record<string, unknown>
514
+ /** Load a page and return its serialized renderer payload. */
515
+ loadPage: (
516
+ input?: WeaverseNextLoadPageInput
517
+ ) => Promise<WeaverseNextLoaderData | null>
518
+ /** Load the project's theme settings. */
519
+ loadThemeSettings: (context?: WeaverseNextRequestContext) => Promise<unknown>
520
+ /** Active Weaverse project identifier. */
521
+ projectId: string
522
+ /** Request metadata associated with this client. */
523
+ requestContext?: WeaverseNextRequestContext
524
+ /** Compatibility alias for `commerce.storefront`. */
525
+ storefront?: WeaverseNextStorefront
526
+ /** Theme schema used by the current project. */
527
+ themeSchema?: SchemaType | WeaverseNextThemeSchema
528
+ /** Theme settings with schema defaults applied. */
529
+ themeSettings: Record<string, unknown>
530
+ }
531
+
532
+ /** Product selected with a Weaverse resource-picker setting. */
533
+ export type WeaverseProduct = WeaverseResourcePickerData
534
+ /** Collection selected with a Weaverse resource-picker setting. */
535
+ export type WeaverseCollection = WeaverseResourcePickerData
536
+ /** Blog selected with a Weaverse resource-picker setting. */
537
+ export type WeaverseBlog = WeaverseResourcePickerData
538
+ /** Article selected with a Weaverse resource-picker setting. */
539
+ export type WeaverseArticle = WeaverseResourcePickerData
540
+ /** Metaobject selected with a Weaverse resource-picker setting. */
541
+ export type WeaverseMetaObject = WeaverseResourcePickerData
542
+
543
+ // ─── Server client (`@weaverse/hydrogen/next/server`) ──────────────────────────────
544
+
545
+ /**
546
+ * Project identifier accepted by {@link WeaverseNextServerClientConfig}. Either
547
+ * a static string or a (possibly async) resolver that reads the request
548
+ * context — matching Hydrogen's static/dynamic projectId support.
549
+ */
550
+ export type WeaverseNextProjectId =
551
+ | string
552
+ | ((
553
+ context?: WeaverseNextRequestContext
554
+ ) => string | Promise<string> | undefined)
555
+
556
+ /** Simple Next.js fetch cache options used for published-mode requests. */
557
+ export interface WeaverseNextCacheConfig {
558
+ /** Maps to Next's `fetch(..., { next: { revalidate } })`. */
559
+ revalidate?: number | false
560
+ /** Maps to Next's `fetch(..., { next: { tags } })`. */
561
+ tags?: string[]
562
+ }
563
+
564
+ /**
565
+ * Per-request fetch options for {@link WeaverseNextServerClient.fetchWithCache}.
566
+ * Plain `RequestInit` plus the same simple Next cache knobs as
567
+ * {@link WeaverseNextCacheConfig}, so callers never need to import `next/*`.
568
+ */
569
+ export interface WeaverseNextFetchOptions extends RequestInit {
570
+ /** Next.js time-based revalidation interval, or `false` for indefinite caching. */
571
+ revalidate?: number | false
572
+ /** Next.js cache tags associated with the request. */
573
+ tags?: string[]
574
+ }
575
+
576
+ /**
577
+ * Public, client-safe Weaverse config bundle. Mirrors Hydrogen's
578
+ * `WeaverseProjectConfigs`, restricted to the fields that are safe to serialize
579
+ * into loader data.
580
+ */
581
+ export interface WeaverseNextConfigs {
582
+ /** Whether the request is rendered inside Builder Studio. */
583
+ isDesignMode: boolean
584
+ /** Whether the request renders a component preview. */
585
+ isPreviewMode: boolean
586
+ /** Whether the request renders a saved revision. */
587
+ isRevisionPreview: boolean
588
+ /** Effective Weaverse project identifier. */
589
+ projectId: string
590
+ /** Environment values safe to expose to client components. */
591
+ publicEnv: Record<string, string | undefined>
592
+ /** Component type requested for section preview mode. */
593
+ sectionType: string
594
+ /** Base URL used for public Weaverse data requests. */
595
+ weaverseApiBase: string
596
+ /** Trusted Studio origin. */
597
+ weaverseHost: string
598
+ /** Public API base retained for Hydrogen-compatible consumers. */
599
+ weaversePublicApiBase: string
600
+ /** Studio asset version requested by Builder. */
601
+ weaverseVersion: string
602
+ }
603
+
604
+ /**
605
+ * Resolved base configs derived from request context + env. Internal to the
606
+ * server client; the client-facing subset is built explicitly by
607
+ * `_buildPublicConfigs` and never includes anything beyond it.
608
+ */
609
+ export interface WeaverseNextBaseConfigs {
610
+ /** Project ID read from `WEAVERSE_PROJECT_ID`. */
611
+ envProjectId: string
612
+ /** Whether the request is rendered inside Builder Studio. */
613
+ isDesignMode: boolean
614
+ /** Whether the request renders a component preview. */
615
+ isPreviewMode: boolean
616
+ /** Whether the request renders a saved revision. */
617
+ isRevisionPreview: boolean
618
+ /** Environment values safe to expose to client components. */
619
+ publicEnv: Record<string, string | undefined>
620
+ /** Project ID read from the request query string. */
621
+ queryProjectId: string
622
+ /** Component type requested for section preview mode. */
623
+ sectionType: string
624
+ /** Base URL used for public Weaverse data requests. */
625
+ weaverseApiBase: string
626
+ /** Trusted Studio origin. */
627
+ weaverseHost: string
628
+ /** Studio asset version requested by Builder. */
629
+ weaverseVersion: string
630
+ }
631
+
632
+ /** Theme settings payload returned by {@link WeaverseNextServerClient.loadThemeSettings}. */
633
+ export interface WeaverseNextThemeSettingsResponse {
634
+ /** Error message returned with fallback settings after a failed load. */
635
+ _error?: string
636
+ /** Whether remote theme settings failed to load. */
637
+ _loadFailed?: boolean
638
+ /** Active-locale static-text overrides. */
639
+ merchantOverrides?: Record<string, unknown>
640
+ /** Environment values safe to expose to the browser in design mode. */
641
+ publicEnv?: Record<string, string | undefined>
642
+ /** Serializable theme schema returned in design mode. */
643
+ schema?: SchemaType | WeaverseNextThemeSchema
644
+ /** Default-locale static content from the theme schema. */
645
+ staticContent?: Record<string, unknown>
646
+ /** Theme-setting values with schema defaults applied. */
647
+ theme?: Record<string, unknown>
648
+ /** Additional project configuration returned by Weaverse. */
649
+ [key: string]: unknown
650
+ }
651
+
652
+ /**
653
+ * Options for {@link WeaverseNextServerClient.loadThemeSettings}. Cache knobs
654
+ * only — the server client always reads the request context it was created
655
+ * with, so there is no per-call context override.
656
+ */
657
+ export interface WeaverseNextThemeSettingsOptions
658
+ extends WeaverseNextCacheConfig {}
659
+
660
+ /** Published custom-page record suitable for a Next.js sitemap entry. */
661
+ export interface WeaverseNextCustomPageEntry {
662
+ /** Suggested sitemap change frequency. */
663
+ changeFrequency?: 'daily' | 'weekly' | 'monthly'
664
+ /** Custom page handle. */
665
+ handle: string
666
+ /** ISO timestamp of the latest page update. */
667
+ lastModified: string
668
+ /** Assigned locale, or `null` for the default locale. */
669
+ locale: string | null
670
+ /** Storefront pathname for the custom page. */
671
+ path: string
672
+ /** Suggested sitemap priority. */
673
+ priority?: number
674
+ }
675
+
676
+ /** Pagination, locale, and cache options for fetching custom pages. */
677
+ export interface WeaverseNextFetchCustomPagesOptions
678
+ extends WeaverseNextCacheConfig {
679
+ /** Maximum number of custom-page results returned per request. */
680
+ limit?: number
681
+ /** Only return custom pages assigned to this locale. */
682
+ locale?: string
683
+ }
684
+
685
+ /**
686
+ * Config for {@link createWeaverseNextServerClient}. Unlike the root-entry
687
+ * `WeaverseNextClientConfig` (which delegates network I/O to injected fetchers),
688
+ * the server client performs the real Weaverse API fetch itself, so
689
+ * it accepts request context, env, and cache options instead.
690
+ */
691
+ export interface WeaverseNextServerClientConfig {
692
+ /** Default Next.js cache options for Weaverse API requests. */
693
+ cache?: WeaverseNextCacheConfig
694
+ /** Commerce services passed to component loaders. */
695
+ commerce?: WeaverseNextCommerceContext
696
+ /** Component modules available to server-side loaders. */
697
+ components: WeaverseNextComponent[]
698
+ /** Plain env map; falls back to `process.env` for any missing key. */
699
+ env?: Record<string, string | undefined>
700
+ /** Custom `fetch` (mainly for tests); defaults to the global `fetch`. */
701
+ fetch?: typeof fetch
702
+ /** Per-request network timeout in ms. Defaults to 10s. */
703
+ fetchTimeoutMs?: number
704
+ /** Static project ID or request-aware project resolver. */
705
+ projectId?: WeaverseNextProjectId
706
+ /** Explicit request metadata used for config and page resolution. */
707
+ requestContext?: WeaverseNextRequestContext
708
+ /** Theme schema used to derive default settings and preview data. */
709
+ themeSchema?: SchemaType | WeaverseNextThemeSchema
710
+ /** Merchant theme settings merged over schema defaults. */
711
+ themeSettings?: Record<string, unknown>
712
+ /** Optional override for the resolved Weaverse public API base. */
713
+ weaverseApiBase?: string
714
+ /** Optional override for the resolved Weaverse host. */
715
+ weaverseHost?: string
716
+ /** Studio asset version override. */
717
+ weaverseVersion?: string
718
+ }
719
+
720
+ /**
721
+ * Server-side Weaverse client returned by {@link createWeaverseNextServerClient}.
722
+ * Closes the gap with Hydrogen's `context.weaverse.loadPage(...)` by performing
723
+ * the real Weaverse API fetch in Next server components/route handlers. It is
724
+ * also assignable to {@link WeaverseNextClient} so it can be passed straight to
725
+ * `runWeaverseComponentLoaders` and the renderer/runtime.
726
+ */
727
+ export interface WeaverseNextServerClient extends WeaverseNextClient {
728
+ /** Public, client-safe resolved configs (no server secrets). */
729
+ configs: WeaverseNextConfigs
730
+ /** Fetch every published custom page, primarily for sitemap generation. */
731
+ fetchCustomPages: (
732
+ options?: WeaverseNextFetchCustomPagesOptions
733
+ ) => Promise<WeaverseNextCustomPageEntry[]>
734
+ /** Fetch JSON with Next.js cache controls and the configured timeout. */
735
+ fetchWithCache: <T = unknown>(
736
+ url: string,
737
+ options?: WeaverseNextFetchOptions
738
+ ) => Promise<T>
739
+ /** Resolve, fetch, and run component loaders for a Weaverse page. */
740
+ loadPage: (
741
+ input?: WeaverseNextLoadPageInput
742
+ ) => Promise<WeaverseNextLoaderData | null>
743
+ /**
744
+ * Load theme settings. Pass cache options (`revalidate` / `tags`) only — the
745
+ * request context is the one the client was created with, so there is no
746
+ * per-call context override. The parameter is typed broadly purely to stay
747
+ * assignable to the base {@link WeaverseNextClient.loadThemeSettings}; any
748
+ * non-cache fields are ignored.
749
+ */
750
+ loadThemeSettings: (
751
+ options?: WeaverseNextThemeSettingsOptions | WeaverseNextRequestContext
752
+ ) => Promise<WeaverseNextThemeSettingsResponse>
753
+ /** Resolve the effective projectId (query → function → string → env). */
754
+ resolveProjectId: () => Promise<string>
755
+ }
756
+
757
+ /** Input for {@link WeaverseNextServerClient.loadPage}. */
758
+ export interface WeaverseNextServerLoadPageInput
759
+ extends WeaverseNextLoadPageInput {
760
+ /** Per-call cache override merged over the client-level `cache` config. */
761
+ cache?: WeaverseNextCacheConfig
762
+ /** Route-level project override (multi-project), like Hydrogen. */
763
+ projectId?: string
764
+ }