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

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