@weaverse/hydrogen 5.13.1 → 5.14.1

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,7 +1,7 @@
1
1
  import { SelectedOptionInput } from '@shopify/hydrogen/storefront-api-types';
2
2
  import { Weaverse, WeaverseItemStore, ElementData, WeaverseElement, WeaverseProjectDataType, WeaverseCoreParams, WeaverseResourcePickerData } from '@weaverse/react';
3
3
  export { PositionInputValue, WeaverseImage, WeaverseVideo, isBrowser, isIframe, useChildInstances, useItemInstance, useParentInstance, useWeaverse } from '@weaverse/react';
4
- import { PageType, InspectorGroup, SchemaType, ComponentPresets, SchemaValidationResult } from '@weaverse/schema';
4
+ import { PageType, InspectorGroup, SchemaType, PageSEOData, ComponentPresets, SchemaValidationResult } from '@weaverse/schema';
5
5
  export * from '@weaverse/schema';
6
6
  export { BasicInput, HeadingInput, InputType, InspectorGroup, PageType, SchemaValidationIssue, SchemaValidationResult } from '@weaverse/schema';
7
7
  import { createWithCache, CachingStrategy, I18nBase, HydrogenContext, HydrogenEnv } from '@shopify/hydrogen';
@@ -9,7 +9,7 @@ export { CachingStrategy } from '@shopify/hydrogen';
9
9
  import { LoaderFunctionArgs, AppLoadContext } from '@shopify/remix-oxygen';
10
10
  import * as React$1 from 'react';
11
11
  import { ReactNode, ComponentType, JSX, ForwardRefExoticComponent } from 'react';
12
- import { NavigateFunction, UIMatch } from 'react-router';
12
+ import { NavigateFunction, UIMatch, MetaDescriptor } from 'react-router';
13
13
  import * as react_jsx_runtime from 'react/jsx-runtime';
14
14
 
15
15
  /**
@@ -622,6 +622,13 @@ interface HydrogenPageData extends WeaverseProjectDataType {
622
622
  id: string;
623
623
  items: HydrogenComponentData[];
624
624
  name: string;
625
+ /**
626
+ * Page-level SEO metadata published by Weaverse Builder. `null` when
627
+ * the page has no `PageSeo` row; absent on revision snapshots that
628
+ * predate the SEO feature. Themes should treat both as "no Weaverse
629
+ * override".
630
+ */
631
+ seo?: PageSEOData | null;
625
632
  [key: string]: any;
626
633
  }
627
634
  type WeaverseI18n = I18nBase & {
@@ -923,7 +930,6 @@ declare module '@shopify/hydrogen' {
923
930
  PUBLIC_SHOPIFY_INBOX_SHOP_ID: string;
924
931
  PUBLIC_STORE_DOMAIN: string;
925
932
  PUBLIC_STOREFRONT_API_TOKEN: string;
926
- WEAVERSE_API_BASE?: string;
927
933
  WEAVERSE_API_KEY: string;
928
934
  WEAVERSE_HOST?: string;
929
935
  WEAVERSE_PROJECT_ID: string;
@@ -1073,6 +1079,41 @@ declare function useWeaverseDataContext(): WeaverseDataContext;
1073
1079
  */
1074
1080
  declare function createWeaverseDataContext(matches: UIMatch<unknown, unknown>[]): WeaverseDataContext;
1075
1081
 
1082
+ /**
1083
+ * Convert a Weaverse page-level SEO payload into React Router
1084
+ * `MetaDescriptor[]`. Pure, synchronous, tree-shakeable — does not fetch.
1085
+ *
1086
+ * Behavior:
1087
+ * - `title` → top-level `{ title }` descriptor.
1088
+ * - `description` / `keywords` → `<meta name="...">`.
1089
+ * - `canonicalUrl` → `<link rel="canonical">`.
1090
+ * - `openGraph.*` → `<meta property="og:*">`. `og:type` defaults to
1091
+ * `'website'` when any other OG field is present.
1092
+ * - `twitter.*` → `<meta name="twitter:*">`. `twitter:card` defaults to
1093
+ * `'summary'` when any other Twitter field is present.
1094
+ * - `robots` is always emitted (defaults to `'index,follow'`) so themes
1095
+ * stacking multiple SEO sources have a deterministic last word on
1096
+ * indexing for Weaverse-managed pages.
1097
+ * - Empty strings / missing fields are filtered before return so empty
1098
+ * descriptors don't override earlier sources (e.g. Hydrogen
1099
+ * `getSeoMeta`).
1100
+ */
1101
+ declare function formatMetaDescriptors(seo: PageSEOData | null | undefined): MetaDescriptor[];
1102
+ /**
1103
+ * Convenience accessor: pull `page.seo` out of a `WeaverseLoaderData`
1104
+ * (or `HydrogenPageData`) and emit `MetaDescriptor[]`. Null-safe.
1105
+ *
1106
+ * @example
1107
+ * ```ts
1108
+ * export const meta: MetaFunction<typeof loader> = ({ data }) => {
1109
+ * return getWeaverseSeoMeta(data?.weaverseData)
1110
+ * }
1111
+ * ```
1112
+ */
1113
+ declare function getWeaverseSeoMeta(data: WeaverseLoaderData | HydrogenPageData | {
1114
+ page?: HydrogenPageData | null;
1115
+ } | null | undefined): MetaDescriptor[];
1116
+
1076
1117
  /**
1077
1118
  * Extract and parse query parameters from a request URL.
1078
1119
  * Supports optional allowlist for security-sensitive applications.
@@ -1155,4 +1196,4 @@ declare const IMAGES_PLACEHOLDERS: {
1155
1196
  product_18: string;
1156
1197
  };
1157
1198
 
1158
- export { type CacheResponseValidator, type ComponentDataValue, type ComponentLoaderArgs, type CreateHydrogenSchemaOptions, type CustomPageEntry, type DirectFetchResponse, type FetchProjectPayload, type FetchProjectRequestBody, type HydrogenComponent, type HydrogenComponentData, type HydrogenComponentPresets, type HydrogenComponentProps, type HydrogenComponentSchema, type HydrogenElement, type HydrogenPageAssignment, type HydrogenPageData, type HydrogenProjectType, type HydrogenSchemaValidationResult, type HydrogenThemeSchema, type HydrogenThemeSettings, IMAGES_PLACEHOLDERS, type LoadPageParams, type ProjectIdValidationResult, type ProjectIdValue, type PublicEnv, type RouteLoaderArgs, type ThemeSettingsResponse, ThemeTextProvider, type ThemeTextProviderProps, ThemeTextStore, type ThemeTextValue, type TranslateFunction, type TranslationChanges, type TranslationEntry, type TranslationItemEntry, type TranslationMap, type TranslationMapEntry, type WeaverseArticle, type WeaverseBlog, WeaverseClient, type WeaverseClientArgs, type WeaverseCollection, type WeaverseDataContext, WeaverseError, WeaverseHydrogen, WeaverseHydrogenItem, type WeaverseHydrogenParams, WeaverseHydrogenRoot, type WeaverseI18n, type WeaverseInternal, type WeaverseLoaderData, type WeaverseLoaderRequestInfo, type WeaverseMetaObject, type WeaverseProduct, type WeaverseProjectConfigs, type WeaverseStudioQueries, type WithCacheFetchResponse, type WithWeaverseOptions, createWeaverseDataContext, defaultComponents, generateDataFromSchema, getNestedKey, getPreviewData, getRequestQueries, getSelectedProductOptions, getWeaverseConfigs, hasError, hasWeaverseStudio, interpolate, isFetchProjectPayload, isProjectIdFunction, isThemeSettingsResponse, isValidHydrogenSchema, isWithCacheFetchResponse, registerComponent, useThemeSettings, useThemeText, useWeaverseDataContext, withWeaverse };
1199
+ export { type CacheResponseValidator, type ComponentDataValue, type ComponentLoaderArgs, type CreateHydrogenSchemaOptions, type CustomPageEntry, type DirectFetchResponse, type FetchProjectPayload, type FetchProjectRequestBody, type HydrogenComponent, type HydrogenComponentData, type HydrogenComponentPresets, type HydrogenComponentProps, type HydrogenComponentSchema, type HydrogenElement, type HydrogenPageAssignment, type HydrogenPageData, type HydrogenProjectType, type HydrogenSchemaValidationResult, type HydrogenThemeSchema, type HydrogenThemeSettings, IMAGES_PLACEHOLDERS, type LoadPageParams, type ProjectIdValidationResult, type ProjectIdValue, type PublicEnv, type RouteLoaderArgs, type ThemeSettingsResponse, ThemeTextProvider, type ThemeTextProviderProps, ThemeTextStore, type ThemeTextValue, type TranslateFunction, type TranslationChanges, type TranslationEntry, type TranslationItemEntry, type TranslationMap, type TranslationMapEntry, type WeaverseArticle, type WeaverseBlog, WeaverseClient, type WeaverseClientArgs, type WeaverseCollection, type WeaverseDataContext, WeaverseError, WeaverseHydrogen, WeaverseHydrogenItem, type WeaverseHydrogenParams, WeaverseHydrogenRoot, type WeaverseI18n, type WeaverseInternal, type WeaverseLoaderData, type WeaverseLoaderRequestInfo, type WeaverseMetaObject, type WeaverseProduct, type WeaverseProjectConfigs, type WeaverseStudioQueries, type WithCacheFetchResponse, type WithWeaverseOptions, createWeaverseDataContext, defaultComponents, formatMetaDescriptors, generateDataFromSchema, getNestedKey, getPreviewData, getRequestQueries, getSelectedProductOptions, getWeaverseConfigs, getWeaverseSeoMeta, hasError, hasWeaverseStudio, interpolate, isFetchProjectPayload, isProjectIdFunction, isThemeSettingsResponse, isValidHydrogenSchema, isWithCacheFetchResponse, registerComponent, useThemeSettings, useThemeText, useWeaverseDataContext, withWeaverse };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { SelectedOptionInput } from '@shopify/hydrogen/storefront-api-types';
2
2
  import { Weaverse, WeaverseItemStore, ElementData, WeaverseElement, WeaverseProjectDataType, WeaverseCoreParams, WeaverseResourcePickerData } from '@weaverse/react';
3
3
  export { PositionInputValue, WeaverseImage, WeaverseVideo, isBrowser, isIframe, useChildInstances, useItemInstance, useParentInstance, useWeaverse } from '@weaverse/react';
4
- import { PageType, InspectorGroup, SchemaType, ComponentPresets, SchemaValidationResult } from '@weaverse/schema';
4
+ import { PageType, InspectorGroup, SchemaType, PageSEOData, ComponentPresets, SchemaValidationResult } from '@weaverse/schema';
5
5
  export * from '@weaverse/schema';
6
6
  export { BasicInput, HeadingInput, InputType, InspectorGroup, PageType, SchemaValidationIssue, SchemaValidationResult } from '@weaverse/schema';
7
7
  import { createWithCache, CachingStrategy, I18nBase, HydrogenContext, HydrogenEnv } from '@shopify/hydrogen';
@@ -9,7 +9,7 @@ export { CachingStrategy } from '@shopify/hydrogen';
9
9
  import { LoaderFunctionArgs, AppLoadContext } from '@shopify/remix-oxygen';
10
10
  import * as React$1 from 'react';
11
11
  import { ReactNode, ComponentType, JSX, ForwardRefExoticComponent } from 'react';
12
- import { NavigateFunction, UIMatch } from 'react-router';
12
+ import { NavigateFunction, UIMatch, MetaDescriptor } from 'react-router';
13
13
  import * as react_jsx_runtime from 'react/jsx-runtime';
14
14
 
15
15
  /**
@@ -622,6 +622,13 @@ interface HydrogenPageData extends WeaverseProjectDataType {
622
622
  id: string;
623
623
  items: HydrogenComponentData[];
624
624
  name: string;
625
+ /**
626
+ * Page-level SEO metadata published by Weaverse Builder. `null` when
627
+ * the page has no `PageSeo` row; absent on revision snapshots that
628
+ * predate the SEO feature. Themes should treat both as "no Weaverse
629
+ * override".
630
+ */
631
+ seo?: PageSEOData | null;
625
632
  [key: string]: any;
626
633
  }
627
634
  type WeaverseI18n = I18nBase & {
@@ -923,7 +930,6 @@ declare module '@shopify/hydrogen' {
923
930
  PUBLIC_SHOPIFY_INBOX_SHOP_ID: string;
924
931
  PUBLIC_STORE_DOMAIN: string;
925
932
  PUBLIC_STOREFRONT_API_TOKEN: string;
926
- WEAVERSE_API_BASE?: string;
927
933
  WEAVERSE_API_KEY: string;
928
934
  WEAVERSE_HOST?: string;
929
935
  WEAVERSE_PROJECT_ID: string;
@@ -1073,6 +1079,41 @@ declare function useWeaverseDataContext(): WeaverseDataContext;
1073
1079
  */
1074
1080
  declare function createWeaverseDataContext(matches: UIMatch<unknown, unknown>[]): WeaverseDataContext;
1075
1081
 
1082
+ /**
1083
+ * Convert a Weaverse page-level SEO payload into React Router
1084
+ * `MetaDescriptor[]`. Pure, synchronous, tree-shakeable — does not fetch.
1085
+ *
1086
+ * Behavior:
1087
+ * - `title` → top-level `{ title }` descriptor.
1088
+ * - `description` / `keywords` → `<meta name="...">`.
1089
+ * - `canonicalUrl` → `<link rel="canonical">`.
1090
+ * - `openGraph.*` → `<meta property="og:*">`. `og:type` defaults to
1091
+ * `'website'` when any other OG field is present.
1092
+ * - `twitter.*` → `<meta name="twitter:*">`. `twitter:card` defaults to
1093
+ * `'summary'` when any other Twitter field is present.
1094
+ * - `robots` is always emitted (defaults to `'index,follow'`) so themes
1095
+ * stacking multiple SEO sources have a deterministic last word on
1096
+ * indexing for Weaverse-managed pages.
1097
+ * - Empty strings / missing fields are filtered before return so empty
1098
+ * descriptors don't override earlier sources (e.g. Hydrogen
1099
+ * `getSeoMeta`).
1100
+ */
1101
+ declare function formatMetaDescriptors(seo: PageSEOData | null | undefined): MetaDescriptor[];
1102
+ /**
1103
+ * Convenience accessor: pull `page.seo` out of a `WeaverseLoaderData`
1104
+ * (or `HydrogenPageData`) and emit `MetaDescriptor[]`. Null-safe.
1105
+ *
1106
+ * @example
1107
+ * ```ts
1108
+ * export const meta: MetaFunction<typeof loader> = ({ data }) => {
1109
+ * return getWeaverseSeoMeta(data?.weaverseData)
1110
+ * }
1111
+ * ```
1112
+ */
1113
+ declare function getWeaverseSeoMeta(data: WeaverseLoaderData | HydrogenPageData | {
1114
+ page?: HydrogenPageData | null;
1115
+ } | null | undefined): MetaDescriptor[];
1116
+
1076
1117
  /**
1077
1118
  * Extract and parse query parameters from a request URL.
1078
1119
  * Supports optional allowlist for security-sensitive applications.
@@ -1155,4 +1196,4 @@ declare const IMAGES_PLACEHOLDERS: {
1155
1196
  product_18: string;
1156
1197
  };
1157
1198
 
1158
- export { type CacheResponseValidator, type ComponentDataValue, type ComponentLoaderArgs, type CreateHydrogenSchemaOptions, type CustomPageEntry, type DirectFetchResponse, type FetchProjectPayload, type FetchProjectRequestBody, type HydrogenComponent, type HydrogenComponentData, type HydrogenComponentPresets, type HydrogenComponentProps, type HydrogenComponentSchema, type HydrogenElement, type HydrogenPageAssignment, type HydrogenPageData, type HydrogenProjectType, type HydrogenSchemaValidationResult, type HydrogenThemeSchema, type HydrogenThemeSettings, IMAGES_PLACEHOLDERS, type LoadPageParams, type ProjectIdValidationResult, type ProjectIdValue, type PublicEnv, type RouteLoaderArgs, type ThemeSettingsResponse, ThemeTextProvider, type ThemeTextProviderProps, ThemeTextStore, type ThemeTextValue, type TranslateFunction, type TranslationChanges, type TranslationEntry, type TranslationItemEntry, type TranslationMap, type TranslationMapEntry, type WeaverseArticle, type WeaverseBlog, WeaverseClient, type WeaverseClientArgs, type WeaverseCollection, type WeaverseDataContext, WeaverseError, WeaverseHydrogen, WeaverseHydrogenItem, type WeaverseHydrogenParams, WeaverseHydrogenRoot, type WeaverseI18n, type WeaverseInternal, type WeaverseLoaderData, type WeaverseLoaderRequestInfo, type WeaverseMetaObject, type WeaverseProduct, type WeaverseProjectConfigs, type WeaverseStudioQueries, type WithCacheFetchResponse, type WithWeaverseOptions, createWeaverseDataContext, defaultComponents, generateDataFromSchema, getNestedKey, getPreviewData, getRequestQueries, getSelectedProductOptions, getWeaverseConfigs, hasError, hasWeaverseStudio, interpolate, isFetchProjectPayload, isProjectIdFunction, isThemeSettingsResponse, isValidHydrogenSchema, isWithCacheFetchResponse, registerComponent, useThemeSettings, useThemeText, useWeaverseDataContext, withWeaverse };
1199
+ export { type CacheResponseValidator, type ComponentDataValue, type ComponentLoaderArgs, type CreateHydrogenSchemaOptions, type CustomPageEntry, type DirectFetchResponse, type FetchProjectPayload, type FetchProjectRequestBody, type HydrogenComponent, type HydrogenComponentData, type HydrogenComponentPresets, type HydrogenComponentProps, type HydrogenComponentSchema, type HydrogenElement, type HydrogenPageAssignment, type HydrogenPageData, type HydrogenProjectType, type HydrogenSchemaValidationResult, type HydrogenThemeSchema, type HydrogenThemeSettings, IMAGES_PLACEHOLDERS, type LoadPageParams, type ProjectIdValidationResult, type ProjectIdValue, type PublicEnv, type RouteLoaderArgs, type ThemeSettingsResponse, ThemeTextProvider, type ThemeTextProviderProps, ThemeTextStore, type ThemeTextValue, type TranslateFunction, type TranslationChanges, type TranslationEntry, type TranslationItemEntry, type TranslationMap, type TranslationMapEntry, type WeaverseArticle, type WeaverseBlog, WeaverseClient, type WeaverseClientArgs, type WeaverseCollection, type WeaverseDataContext, WeaverseError, WeaverseHydrogen, WeaverseHydrogenItem, type WeaverseHydrogenParams, WeaverseHydrogenRoot, type WeaverseI18n, type WeaverseInternal, type WeaverseLoaderData, type WeaverseLoaderRequestInfo, type WeaverseMetaObject, type WeaverseProduct, type WeaverseProjectConfigs, type WeaverseStudioQueries, type WithCacheFetchResponse, type WithWeaverseOptions, createWeaverseDataContext, defaultComponents, formatMetaDescriptors, generateDataFromSchema, getNestedKey, getPreviewData, getRequestQueries, getSelectedProductOptions, getWeaverseConfigs, getWeaverseSeoMeta, hasError, hasWeaverseStudio, interpolate, isFetchProjectPayload, isProjectIdFunction, isThemeSettingsResponse, isValidHydrogenSchema, isWithCacheFetchResponse, registerComponent, useThemeSettings, useThemeText, useWeaverseDataContext, withWeaverse };
package/dist/index.js CHANGED
@@ -143,6 +143,73 @@ function useWeaverseDataContext() {
143
143
  function createWeaverseDataContext(matches) {
144
144
  return createFlatDataContext(matches);
145
145
  }
146
+
147
+ // src/seo.ts
148
+ function formatMetaDescriptors(seo) {
149
+ if (!seo) {
150
+ return [{ name: "robots", content: "index,follow" }];
151
+ }
152
+ let descriptors = [];
153
+ if (seo.title) {
154
+ descriptors.push({ title: seo.title });
155
+ }
156
+ if (seo.description) {
157
+ descriptors.push({ name: "description", content: seo.description });
158
+ }
159
+ if (seo.keywords) {
160
+ descriptors.push({ name: "keywords", content: seo.keywords });
161
+ }
162
+ if (seo.canonicalUrl) {
163
+ descriptors.push({
164
+ tagName: "link",
165
+ rel: "canonical",
166
+ href: seo.canonicalUrl
167
+ });
168
+ }
169
+ let og = seo.openGraph;
170
+ if (og && (og.title || og.description || og.image || og.type)) {
171
+ if (og.title) {
172
+ descriptors.push({ property: "og:title", content: og.title });
173
+ }
174
+ if (og.description) {
175
+ descriptors.push({ property: "og:description", content: og.description });
176
+ }
177
+ if (og.image) {
178
+ descriptors.push({ property: "og:image", content: og.image });
179
+ }
180
+ descriptors.push({ property: "og:type", content: og.type || "website" });
181
+ }
182
+ let tw = seo.twitter;
183
+ if (tw && (tw.title || tw.description || tw.image || tw.cardType)) {
184
+ descriptors.push({
185
+ name: "twitter:card",
186
+ content: tw.cardType || "summary"
187
+ });
188
+ if (tw.title) {
189
+ descriptors.push({ name: "twitter:title", content: tw.title });
190
+ }
191
+ if (tw.description) {
192
+ descriptors.push({ name: "twitter:description", content: tw.description });
193
+ }
194
+ if (tw.image) {
195
+ descriptors.push({ name: "twitter:image", content: tw.image });
196
+ }
197
+ }
198
+ let index = seo.robots?.index !== false;
199
+ let follow = seo.robots?.follow !== false;
200
+ descriptors.push({
201
+ name: "robots",
202
+ content: `${index ? "index" : "noindex"},${follow ? "follow" : "nofollow"}`
203
+ });
204
+ return descriptors;
205
+ }
206
+ function getWeaverseSeoMeta(data) {
207
+ if (!data) {
208
+ return formatMetaDescriptors(null);
209
+ }
210
+ let page = "items" in data && "id" in data ? data : data.page ?? null;
211
+ return formatMetaDescriptors(page?.seo ?? null);
212
+ }
146
213
  function isProjectIdFunction(projectId) {
147
214
  return typeof projectId === "function";
148
215
  }
@@ -230,7 +297,6 @@ function getWeaverseConfigs(request, env) {
230
297
  WEAVERSE_PROJECT_ID,
231
298
  WEAVERSE_API_KEY,
232
299
  WEAVERSE_HOST,
233
- WEAVERSE_API_BASE,
234
300
  PUBLIC_STORE_DOMAIN,
235
301
  PUBLIC_STOREFRONT_API_TOKEN
236
302
  } = env || {};
@@ -246,10 +312,11 @@ function getWeaverseConfigs(request, env) {
246
312
  } = queries;
247
313
  let url = new URL(request.url);
248
314
  let isRevisionPreview = url.searchParams.has("__revisionId");
315
+ let resolvedWeaverseHost = weaverseHost || WEAVERSE_HOST || envFromProcess.WEAVERSE_HOST || "https://studio.weaverse.io";
249
316
  return {
250
317
  projectId: weaverseProjectId || WEAVERSE_PROJECT_ID || envFromProcess.WEAVERSE_PROJECT_ID || "",
251
- weaverseHost: weaverseHost || WEAVERSE_HOST || envFromProcess.WEAVERSE_HOST || "https://studio.weaverse.io",
252
- weaverseApiBase: WEAVERSE_API_BASE || envFromProcess.WEAVERSE_API_BASE || WEAVERSE_HOST || envFromProcess.WEAVERSE_HOST || "https://api.weaverse.io",
318
+ weaverseHost: resolvedWeaverseHost,
319
+ weaverseApiBase: resolvedWeaverseHost,
253
320
  weaverseApiKey: weaverseApiKey || WEAVERSE_API_KEY || envFromProcess.WEAVERSE_API_KEY || "",
254
321
  weaverseVersion: weaverseVersion || "",
255
322
  isDesignMode,
@@ -440,6 +507,46 @@ function hasWeaverseData(value) {
440
507
  }
441
508
  return value.weaverseData !== void 0;
442
509
  }
510
+
511
+ // src/utils/studio-request-info.ts
512
+ function getBrowserLocation() {
513
+ if (typeof window === "undefined") {
514
+ return;
515
+ }
516
+ return window.location;
517
+ }
518
+ function getQueriesFromSearch(search) {
519
+ let queries = {};
520
+ let params = new URLSearchParams(search);
521
+ for (let [key, value] of params.entries()) {
522
+ if (value === "true") {
523
+ queries[key] = true;
524
+ } else if (value === "false") {
525
+ queries[key] = false;
526
+ } else {
527
+ queries[key] = value;
528
+ }
529
+ }
530
+ return queries;
531
+ }
532
+ function normalizeDesignModeRequestInfo(params, browserLocation = getBrowserLocation()) {
533
+ if (!(params.isDesignMode && browserLocation)) {
534
+ return params;
535
+ }
536
+ let { pathname, search } = browserLocation;
537
+ if (params.requestInfo.pathname === pathname && params.requestInfo.search === search) {
538
+ return params;
539
+ }
540
+ return {
541
+ ...params,
542
+ requestInfo: {
543
+ ...params.requestInfo,
544
+ pathname,
545
+ queries: getQueriesFromSearch(search),
546
+ search
547
+ }
548
+ };
549
+ }
443
550
  var ThemeSettingsStore = class {
444
551
  settings = {};
445
552
  schema;
@@ -759,22 +866,23 @@ var WeaverseHydrogen = class extends react.Weaverse {
759
866
  };
760
867
  };
761
868
  function createWeaverseInstance(params) {
869
+ const normalizedParams = normalizeDesignModeRequestInfo(params);
762
870
  if (react.isBrowser) {
763
871
  window.__weaverses = window.__weaverses || {};
764
- let weaverse = window.__weaverses[params.pageId];
765
- if (!weaverse || weaverse?.requestInfo?.pathname !== params.requestInfo.pathname || weaverse?.requestInfo?.search !== params.requestInfo.search) {
766
- weaverse = new WeaverseHydrogen(params);
767
- window.__weaverses[params.pageId] = weaverse;
872
+ let weaverse = window.__weaverses[normalizedParams.pageId];
873
+ if (!weaverse || weaverse?.requestInfo?.pathname !== normalizedParams.requestInfo.pathname || weaverse?.requestInfo?.search !== normalizedParams.requestInfo.search) {
874
+ weaverse = new WeaverseHydrogen(normalizedParams);
875
+ window.__weaverses[normalizedParams.pageId] = weaverse;
768
876
  }
769
877
  if (weaverse?.isDesignMode) {
770
- weaverse.requestInfo = params.requestInfo;
878
+ weaverse.requestInfo = normalizedParams.requestInfo;
771
879
  if (hasWeaverseStudio(window)) {
772
- window.weaverseStudio.refreshStudio(params);
880
+ window.weaverseStudio.refreshStudio(normalizedParams);
773
881
  }
774
882
  }
775
883
  return weaverse;
776
884
  }
777
- return new WeaverseHydrogen(params);
885
+ return new WeaverseHydrogen(normalizedParams);
778
886
  }
779
887
  var StudioBridge = react$1.memo(({ context }) => {
780
888
  useStudio(context);
@@ -1219,11 +1327,8 @@ var WeaverseClient = class {
1219
1327
  }
1220
1328
  };
1221
1329
  // Helper method for building API URLs consistently
1222
- getApiUrl(endpoint, useProxy = !this.configs.isDesignMode) {
1223
- const { weaverseHost, weaverseApiBase, projectId } = this.configs;
1224
- if (useProxy) {
1225
- return `${weaverseApiBase}/v1/${endpoint}?projectId=${projectId}`;
1226
- }
1330
+ getApiUrl(endpoint) {
1331
+ const { weaverseHost } = this.configs;
1227
1332
  return `${weaverseHost}/api/public/${endpoint}`;
1228
1333
  }
1229
1334
  /**
@@ -1735,12 +1840,14 @@ exports.WeaverseHydrogenItem = WeaverseHydrogenItem;
1735
1840
  exports.WeaverseHydrogenRoot = WeaverseHydrogenRoot;
1736
1841
  exports.createWeaverseDataContext = createWeaverseDataContext;
1737
1842
  exports.defaultComponents = defaultComponents;
1843
+ exports.formatMetaDescriptors = formatMetaDescriptors;
1738
1844
  exports.generateDataFromSchema = generateDataFromSchema;
1739
1845
  exports.getNestedKey = getNestedKey;
1740
1846
  exports.getPreviewData = getPreviewData;
1741
1847
  exports.getRequestQueries = getRequestQueries;
1742
1848
  exports.getSelectedProductOptions = getSelectedProductOptions;
1743
1849
  exports.getWeaverseConfigs = getWeaverseConfigs;
1850
+ exports.getWeaverseSeoMeta = getWeaverseSeoMeta;
1744
1851
  exports.hasError = hasError;
1745
1852
  exports.hasWeaverseStudio = hasWeaverseStudio;
1746
1853
  exports.interpolate = interpolate;