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