@weaverse/next 0.1.0-alpha.7 → 0.1.0-alpha.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,8 +1,8 @@
1
- import { Weaverse } from '@weaverse/react';
1
+ import { WeaverseItemStore, Weaverse, ElementData } from '@weaverse/react';
2
2
  export { isBrowser, isIframe, useChildInstances, useItemInstance, useParentInstance, useWeaverse } from '@weaverse/react';
3
3
  export { InspectorGroup, PageType, SchemaType, createSchema } from '@weaverse/schema';
4
- import { g as WeaverseNextClientConfig, f as WeaverseNextClient, h as WeaverseNextCommerceContext, w as WeaverseNextRequestContext, s as WeaverseNextLoaderData, x as WeaverseNextRequestInfo, j as WeaverseNextComponentData, H as WeaverseNextThemeSettingsStore, z as WeaverseNextRuntimeInternal, y as WeaverseNextRuntimeConfig } from './seo-B9yNko4W.mjs';
5
- export { W as WeaverseArticle, a as WeaverseBlog, b as WeaverseCollection, c as WeaverseMetaObject, i as WeaverseNextComponent, k as WeaverseNextComponentLoaderArgs, l as WeaverseNextComponentProps, n as WeaverseNextCustomPageEntry, o as WeaverseNextFetchCustomPagesOptions, q as WeaverseNextI18n, r as WeaverseNextLoadPageInput, t as WeaverseNextPageAssignment, u as WeaverseNextPageData, A as WeaverseNextSeoMetadata, E as WeaverseNextStorefront, I as WeaverseProduct, J as formatWeaverseNextSeoMetadata, K as getWeaverseNextSeoMetadata } from './seo-B9yNko4W.mjs';
4
+ import { h as WeaverseNextClientConfig, g as WeaverseNextClient, i as WeaverseNextCommerceContext, x as WeaverseNextRequestContext, t as WeaverseNextLoaderData, a as TranslationStore, y as WeaverseNextRequestInfo, k as WeaverseNextComponentData, I as WeaverseNextThemeSettingsStore, A as WeaverseNextRuntimeInternal, M as WeaverseNextTranslationMap, v as WeaverseNextPageData, z as WeaverseNextRuntimeConfig, J as WeaverseNextTranslationChanges } from './seo-Dos9t22_.mjs';
5
+ export { T as ThemeTextStore, W as WeaverseArticle, b as WeaverseBlog, c as WeaverseCollection, d as WeaverseMetaObject, j as WeaverseNextComponent, l as WeaverseNextComponentLoaderArgs, m as WeaverseNextComponentProps, o as WeaverseNextCustomPageEntry, p as WeaverseNextFetchCustomPagesOptions, r as WeaverseNextI18n, s as WeaverseNextLoadPageInput, u as WeaverseNextPageAssignment, B as WeaverseNextSeoMetadata, F as WeaverseNextStorefront, K as WeaverseNextTranslationEntry, L as WeaverseNextTranslationItemEntry, N as WeaverseNextTranslationMapEntry, O as WeaverseProduct, P as formatWeaverseNextSeoMetadata, Q as getWeaverseNextSeoMetadata } from './seo-Dos9t22_.mjs';
6
6
  import * as react_jsx_runtime from 'react/jsx-runtime';
7
7
  import * as react from 'react';
8
8
  import { ReactNode } from 'react';
@@ -61,15 +61,157 @@ interface RunComponentLoadersArgs {
61
61
  */
62
62
  declare function runWeaverseComponentLoaders(args: RunComponentLoadersArgs): Promise<WeaverseNextLoaderData | null>;
63
63
 
64
+ /**
65
+ * Traverse a nested object by dot-path.
66
+ *
67
+ * @example
68
+ * getNestedKey({ cart: { title: 'Cart' } }, 'cart.title') // => 'Cart'
69
+ * getNestedKey({}, 'cart.title', 'fallback') // => 'fallback'
70
+ */
71
+ declare function getNestedKey(obj: Record<string, unknown>, path: string, fallback?: string): string | undefined;
72
+ /**
73
+ * Replace `{{variable}}` patterns in a string with provided values.
74
+ *
75
+ * @example
76
+ * interpolate('Hello {{name}}!', { name: 'World' }) // => 'Hello World!'
77
+ * interpolate('-{{percentage}}% Off', { percentage: 15 }) // => '-15% Off'
78
+ */
79
+ declare function interpolate(template: string, variables?: Record<string, string | number>): string;
80
+ /**
81
+ * Signature for a translation function.
82
+ */
83
+ type TranslateFunction = (key: string, variables?: Record<string, string | number>) => string;
84
+ interface TranslationValue {
85
+ /** Active-locale translated keys loaded from the storefront API. */
86
+ merchantOverrides: Record<string, unknown> | null;
87
+ /**
88
+ * Translate a key with optional variable interpolation.
89
+ *
90
+ * Priority chain (highest wins):
91
+ * 1. External `t` (passed into `WeaverseNextRootProvider` / `TranslationProvider`)
92
+ * 2. Design overrides (live Builder edits from `TranslationStore`)
93
+ * 3. `merchantOverrides` (DB/API overrides for the current locale)
94
+ * 4. `staticContent` (theme default JSON)
95
+ * 5. The key itself (fallback)
96
+ *
97
+ * @example
98
+ * t('cart.title') // => "Cart"
99
+ * t('badge.sale', { percentage: 15 }) // => "-15% Off"
100
+ */
101
+ t: TranslateFunction;
102
+ /**
103
+ * @deprecated Use {@link TranslationValue.translationStore} instead. Kept as a
104
+ * backward-compatible alias pointing at the same store instance.
105
+ */
106
+ themeTextStore: TranslationStore | null;
107
+ /** Exposed so the runtime/Studio bridge can attach it to `internal`. */
108
+ translationStore: TranslationStore | null;
109
+ }
110
+ interface TranslationProviderProps {
111
+ children: ReactNode;
112
+ merchantOverrides?: Record<string, unknown>;
113
+ staticContent: Record<string, unknown>;
114
+ /**
115
+ * Optional external translation function.
116
+ * When provided it becomes the **highest-priority** source:
117
+ * if it returns a non-empty string that differs from the raw key,
118
+ * that value is used; otherwise the internal resolution chain continues.
119
+ */
120
+ t?: TranslateFunction;
121
+ /**
122
+ * @deprecated Use {@link TranslationProviderProps.translationStore} instead.
123
+ * Still accepted for backward compatibility; ignored when `translationStore`
124
+ * is also provided.
125
+ */
126
+ themeTextStore?: TranslationStore | null;
127
+ /** Optional store for live design-mode text overrides from the builder. */
128
+ translationStore?: TranslationStore | null;
129
+ }
130
+ /**
131
+ * Build the `t()` translation function over a fixed set of sources.
132
+ *
133
+ * Resolution order, highest priority first:
134
+ * 1. `externalT` – host i18n (e.g. Shopify), unless it echoes the key
135
+ * 2. `designOverrides` – live design-mode edits, flat dot-path keys
136
+ * 3. `merchantOverrides` – locale overrides from the API, nested
137
+ * 4. `staticContent` – the theme's default locale JSON
138
+ * 5. the key itself
139
+ *
140
+ * Design overrides are looked up per-key (own properties only) rather than
141
+ * merged into `merchantOverrides`: a flat key like `cart.title` must override
142
+ * exactly that leaf without wiping sibling keys (`cart.subtitle`), and a
143
+ * per-key own-property lookup never builds nested objects from
144
+ * merchant-controlled keys, so it cannot pollute `Object.prototype`.
145
+ */
146
+ declare function createTranslate(sources: {
147
+ staticContent: Record<string, unknown>;
148
+ merchantOverrides?: Record<string, unknown>;
149
+ designOverrides?: Record<string, string>;
150
+ externalT?: TranslateFunction;
151
+ }): TranslateFunction;
152
+ /**
153
+ * Provider that wraps the app to expose the `t()` function.
154
+ *
155
+ * - `staticContent` – the theme's default locale JSON (from themeSchema.i18n)
156
+ * - `merchantOverrides` – locale-specific overrides fetched from the API
157
+ * - `translationStore` – optional store for live design-mode text overrides
158
+ * (the deprecated `themeTextStore` prop is accepted as a fallback)
159
+ */
160
+ declare function TranslationProvider({ staticContent, merchantOverrides, t: externalT, translationStore, themeTextStore, children, }: TranslationProviderProps): react_jsx_runtime.JSX.Element;
161
+ /**
162
+ * Hook to access the translation `t()` function.
163
+ *
164
+ * Must be used inside a component wrapped by `WeaverseNextRootProvider` or
165
+ * `TranslationProvider`.
166
+ *
167
+ * @example
168
+ * ```tsx
169
+ * function CartTitle() {
170
+ * let { t } = useTranslation()
171
+ * return <h2>{t('cart.title')}</h2>
172
+ * }
173
+ * ```
174
+ */
175
+ declare function useTranslation(): TranslationValue;
176
+ /**
177
+ * @deprecated Use {@link TranslationProvider} instead.
178
+ */
179
+ declare const ThemeTextProvider: typeof TranslationProvider;
180
+ /**
181
+ * @deprecated Use {@link useTranslation} instead.
182
+ */
183
+ declare const useThemeText: typeof useTranslation;
184
+ /**
185
+ * @deprecated Use {@link TranslationValue} instead.
186
+ */
187
+ type ThemeTextValue = TranslationValue;
188
+ /**
189
+ * @deprecated Use {@link TranslationProviderProps} instead.
190
+ */
191
+ type ThemeTextProviderProps = TranslationProviderProps;
192
+
64
193
  interface WeaverseNextProviderProps {
65
194
  children: ReactNode;
66
195
  client?: WeaverseNextClient;
67
196
  /** App-provided commerce context (storefront/cart/customer). */
68
197
  commerce?: WeaverseNextCommerceContext;
198
+ /**
199
+ * Active-locale static-text overrides (nested, from `loadThemeSettings()`).
200
+ * Adopts the root provider's `merchantOverrides` when omitted.
201
+ */
202
+ merchantOverrides?: Record<string, unknown>;
69
203
  /** Explicit page/route commerce data (replaces section-level `useLoaderData`). */
70
204
  pageData?: unknown;
71
205
  /** Explicit root/global data (replaces `useRouteLoaderData('root')`). */
72
206
  rootData?: unknown;
207
+ /**
208
+ * Theme default locale JSON (`loadThemeSettings().staticContent`). Adopts the
209
+ * root provider's `staticContent` when omitted, then falls back to
210
+ * `client.themeSchema.i18n.staticContent`.
211
+ */
212
+ staticContent?: Record<string, unknown>;
213
+ /** Optional external translation function (host i18n); highest priority in `t()`. */
214
+ t?: TranslateFunction;
73
215
  /** Theme settings override; falls back to `client.themeSettings`. */
74
216
  themeSettings?: Record<string, unknown>;
75
217
  }
@@ -144,13 +286,28 @@ interface RevalidateItemRuntimeLike {
144
286
  declare function revalidateWeaverseNextItem(runtime: RevalidateItemRuntimeLike, draftItem: WeaverseNextComponentData, endpoint?: string): Promise<void>;
145
287
 
146
288
  interface WeaverseNextRootContextValue {
289
+ /** Active-locale static-text overrides shared with route-level providers. */
290
+ merchantOverrides?: Record<string, unknown>;
291
+ /** Theme default locale JSON shared with route-level providers. */
292
+ staticContent: Record<string, unknown>;
147
293
  themeSettingsStore: WeaverseNextThemeSettingsStore;
294
+ /** Single live design-mode static-text override store for the whole session. */
295
+ translationStore: TranslationStore;
148
296
  }
149
297
  interface WeaverseNextRootProviderProps {
150
298
  children: ReactNode;
151
299
  /** Root-loaded theme settings (published-mode fetch, no design-mode context). */
152
300
  initialThemeSettings?: Record<string, unknown>;
301
+ /** Active-locale static-text overrides from `loadThemeSettings().merchantOverrides`. */
302
+ merchantOverrides?: Record<string, unknown>;
153
303
  publicEnv?: Record<string, string | undefined>;
304
+ /**
305
+ * Theme default locale JSON (`loadThemeSettings().staticContent`). Falls back
306
+ * to `themeSchema.i18n.staticContent` when omitted.
307
+ */
308
+ staticContent?: Record<string, unknown>;
309
+ /** Optional external translation function (host i18n); highest priority in `t()`. */
310
+ t?: TranslateFunction;
154
311
  themeSchema?: unknown;
155
312
  }
156
313
  /**
@@ -174,6 +331,43 @@ interface WeaverseNextRootProviderProps {
174
331
  */
175
332
  declare function WeaverseNextRootProvider(props: WeaverseNextRootProviderProps): react_jsx_runtime.JSX.Element;
176
333
 
334
+ /**
335
+ * Item store that flattens the serialized item's nested `data` field onto the
336
+ * store and seeds schema defaults — same shape Hydrogen produces, so the
337
+ * shared `@weaverse/react` renderer can spread props at the top level.
338
+ */
339
+ declare class WeaverseNextItem extends WeaverseItemStore {
340
+ weaverse: WeaverseNextRuntime;
341
+ /**
342
+ * Cached merged snapshot (base `_store` + translations). Reset whenever the
343
+ * `_store` ref or the item's translation entry ref changes, so
344
+ * `useSyncExternalStore` sees a stable object between unrelated re-renders.
345
+ */
346
+ private _cachedSnapshot;
347
+ private _snapshotStoreRef;
348
+ private _snapshotTranslationRef;
349
+ constructor(initialData: WeaverseNextComponentData, weaverse: Weaverse);
350
+ /**
351
+ * Flatten nested `data` on updates exactly like the constructor does. Core's
352
+ * `initProject()` calls `setData(item)` when a new runtime serves a page
353
+ * whose item instances already exist (e.g. locale/client navigation), and
354
+ * the inherited shallow merge would leave stale top-level props behind.
355
+ * Assigning through the inherited `data` setter swaps the `_store` ref,
356
+ * which invalidates the memoized snapshot below. The subscriber emit is
357
+ * queued instead of fired when a render-phase deferral is active (see
358
+ * `collectDeferredItemUpdates`).
359
+ */
360
+ setData: (update: Omit<ElementData, "id" | "type">) => ElementData;
361
+ /**
362
+ * Overlay item-level translations onto the base store when the runtime is in
363
+ * translation mode. Mirrors Hydrogen's `WeaverseHydrogenItem.getSnapShot()`:
364
+ * memoized by `_store` ref + translation entry ref so the returned object is
365
+ * referentially stable, and a fast path that returns the base store untouched
366
+ * when the item has no translations.
367
+ */
368
+ getSnapShot: () => ElementData;
369
+ }
370
+
177
371
  declare global {
178
372
  interface Window {
179
373
  __weaverse?: WeaverseNextRuntime;
@@ -187,14 +381,76 @@ declare class WeaverseNextRuntime extends Weaverse {
187
381
  isPreviewMode: boolean;
188
382
  isRevisionPreview: boolean;
189
383
  sectionType?: string;
190
- translationMap: Record<string, unknown>;
384
+ /**
385
+ * Translation map received from Builder in design mode, keyed by item ID.
386
+ * `WeaverseNextItem.getSnapShot()` overlays these onto the data handed to
387
+ * components, so translations render without mutating the base `_store`.
388
+ */
389
+ translationMap: WeaverseNextTranslationMap;
191
390
  translationLocale: string;
192
391
  translationLanguageId: string;
392
+ /**
393
+ * Fresh page data captured while React was rendering. Runtime reuse happens
394
+ * inside the renderer's render phase (`useMemo`), where applying it through
395
+ * `setProjectData()` would emit item updates to `useSyncExternalStore`
396
+ * subscribers mid-render. The renderer applies it post-commit via
397
+ * `flushRenderPhaseUpdates()`. Never set on design-mode runtimes — the live
398
+ * Studio tree owns the page data there.
399
+ */
400
+ pendingProjectData?: WeaverseNextPageData & {
401
+ rootId: string;
402
+ };
403
+ /**
404
+ * Reused item instances whose data was refreshed while this runtime was
405
+ * constructed during render (core `initProject()` calls `setData()` on
406
+ * them). Their data is already fresh; only the subscriber notification was
407
+ * deferred to `flushRenderPhaseUpdates()`.
408
+ */
409
+ pendingItemUpdates: WeaverseNextItem[];
193
410
  constructor(config: WeaverseNextRuntimeConfig);
194
- extractTranslationSidecar: () => undefined;
195
- setTranslationSidecar: (map?: Record<string, unknown>, locale?: string, languageId?: string) => void;
196
- updateTranslation: () => undefined;
197
- getTranslationChanges: () => undefined;
411
+ /**
412
+ * Pull `translationMap` / `translationLocale` / `translationLanguageId` off
413
+ * the current page data (Builder attaches them in design mode). Unlike
414
+ * Hydrogen, this also clears the sidecar to defaults when the new page data
415
+ * carries none, so a reused runtime / project-data swap can't leave a stale
416
+ * map overlaying the fresh tree.
417
+ */
418
+ extractTranslationSidecar: () => void;
419
+ /**
420
+ * Replace the translation sidecar (Builder pushes this when translation data
421
+ * arrives or the active language changes) and refresh every item so their
422
+ * merged snapshots recompute.
423
+ */
424
+ setTranslationSidecar: (map?: WeaverseNextTranslationMap, locale?: string, languageId?: string) => void;
425
+ /**
426
+ * Update a single translatable field for one item. Assigns a new per-item
427
+ * entry object so `WeaverseNextItem.getSnapShot()`'s translation-ref cache
428
+ * invalidates, then triggers only that item's subscribers.
429
+ */
430
+ updateTranslation: (itemId: string, key: string, originalValue: string, translatedValue: string) => void;
431
+ /**
432
+ * Collect translation changes for the save flow. Returns `undefined` unless
433
+ * both the locale and language ID are set and at least one entry exists;
434
+ * each entry key is namespaced as `data.<field>` to match Builder.
435
+ */
436
+ getTranslationChanges: () => WeaverseNextTranslationChanges | undefined;
437
+ /**
438
+ * Re-extract the translation sidecar whenever project data is replaced (route
439
+ * change / non-design reuse), before rebuilding item stores. Takes the
440
+ * renderable page shape (`rootId` resolved) that `getRenderablePage()` and
441
+ * the reuse branch pass in.
442
+ */
443
+ setProjectData: (data: WeaverseNextPageData & {
444
+ rootId: string;
445
+ }) => void;
446
+ /**
447
+ * Apply updates deferred off the render phase: swap in any pending page data
448
+ * captured on runtime reuse, then notify items whose data was refreshed
449
+ * during construction. The renderer calls this from a layout effect right
450
+ * after commit, so subscribers re-render before paint (no content flash) and
451
+ * without React's setState-in-render warning.
452
+ */
453
+ flushRenderPhaseUpdates: () => void;
198
454
  }
199
455
  declare function createWeaverseNextRuntime(config: WeaverseNextRuntimeConfig): WeaverseNextRuntime;
200
456
  declare function bindWeaverseNextStudioRuntime(runtime: WeaverseNextRuntime): boolean;
@@ -321,4 +577,4 @@ interface WeaverseNextStudioProps extends CreateWeaverseNextStudioInternalsOptio
321
577
  */
322
578
  declare function WeaverseNextStudio(props: WeaverseNextStudioProps): react_jsx_runtime.JSX.Element;
323
579
 
324
- export { type CreateWeaverseNextStudioInternalsOptions, type CreateWeaverseNextThemeSettingsStoreOptions, DEFAULT_REVALIDATE_ENDPOINT, type LoadWeaverseNextStudioScriptOptions, type ResolveWeaverseNextStudioScriptSrcOptions, type RevalidateItemRuntimeLike, type RunComponentLoadersArgs, WeaverseNextClient, WeaverseNextClientConfig, WeaverseNextCommerceContext, WeaverseNextComponentData, WeaverseNextLoaderData, WeaverseNextProvider, type WeaverseNextProviderProps, WeaverseNextRenderer, type WeaverseNextRendererProps, WeaverseNextRequestContext, WeaverseNextRequestInfo, type WeaverseNextRootContextValue, WeaverseNextRootProvider, type WeaverseNextRootProviderProps, type WeaverseNextRouterLike, WeaverseNextRuntime, WeaverseNextRuntimeConfig, WeaverseNextRuntimeInternal, WeaverseNextStudio, WeaverseNextStudioBridge, type WeaverseNextStudioBridgeProps, WeaverseNextStudioConnect, type WeaverseNextStudioConnectProps, type WeaverseNextStudioInternals, type WeaverseNextStudioProps, WeaverseNextThemeSettingsStore, bindWeaverseNextStudioRuntime, buildWeaverseNextRequestInfo, createWeaverseNextClient, createWeaverseNextRuntime, createWeaverseNextStudioInternals, createWeaverseNextThemeSettingsStore, loadWeaverseNextStudioScript, resolveWeaverseNextStudioScriptSrc, revalidateWeaverseNextItem, runWeaverseComponentLoaders, useThemeSettings, useWeaverseCommerce, useWeaverseNextStudioInternals, useWeaversePageData, useWeaverseRootData };
580
+ export { type CreateWeaverseNextStudioInternalsOptions, type CreateWeaverseNextThemeSettingsStoreOptions, DEFAULT_REVALIDATE_ENDPOINT, type LoadWeaverseNextStudioScriptOptions, type ResolveWeaverseNextStudioScriptSrcOptions, type RevalidateItemRuntimeLike, type RunComponentLoadersArgs, ThemeTextProvider, type ThemeTextProviderProps, type ThemeTextValue, type TranslateFunction, TranslationProvider, type TranslationProviderProps, TranslationStore, type TranslationValue, WeaverseNextClient, WeaverseNextClientConfig, WeaverseNextCommerceContext, WeaverseNextComponentData, WeaverseNextLoaderData, WeaverseNextPageData, WeaverseNextProvider, type WeaverseNextProviderProps, WeaverseNextRenderer, type WeaverseNextRendererProps, WeaverseNextRequestContext, WeaverseNextRequestInfo, type WeaverseNextRootContextValue, WeaverseNextRootProvider, type WeaverseNextRootProviderProps, type WeaverseNextRouterLike, WeaverseNextRuntime, WeaverseNextRuntimeConfig, WeaverseNextRuntimeInternal, WeaverseNextStudio, WeaverseNextStudioBridge, type WeaverseNextStudioBridgeProps, WeaverseNextStudioConnect, type WeaverseNextStudioConnectProps, type WeaverseNextStudioInternals, type WeaverseNextStudioProps, WeaverseNextThemeSettingsStore, WeaverseNextTranslationChanges, WeaverseNextTranslationMap, bindWeaverseNextStudioRuntime, buildWeaverseNextRequestInfo, createTranslate, createWeaverseNextClient, createWeaverseNextRuntime, createWeaverseNextStudioInternals, createWeaverseNextThemeSettingsStore, getNestedKey, interpolate, loadWeaverseNextStudioScript, resolveWeaverseNextStudioScriptSrc, revalidateWeaverseNextItem, runWeaverseComponentLoaders, useThemeSettings, useThemeText, useTranslation, useWeaverseCommerce, useWeaverseNextStudioInternals, useWeaversePageData, useWeaverseRootData };