@weaverse/hydrogen 5.13.1 → 5.14.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.
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 & {
@@ -1073,6 +1080,41 @@ declare function useWeaverseDataContext(): WeaverseDataContext;
1073
1080
  */
1074
1081
  declare function createWeaverseDataContext(matches: UIMatch<unknown, unknown>[]): WeaverseDataContext;
1075
1082
 
1083
+ /**
1084
+ * Convert a Weaverse page-level SEO payload into React Router
1085
+ * `MetaDescriptor[]`. Pure, synchronous, tree-shakeable — does not fetch.
1086
+ *
1087
+ * Behavior:
1088
+ * - `title` → top-level `{ title }` descriptor.
1089
+ * - `description` / `keywords` → `<meta name="...">`.
1090
+ * - `canonicalUrl` → `<link rel="canonical">`.
1091
+ * - `openGraph.*` → `<meta property="og:*">`. `og:type` defaults to
1092
+ * `'website'` when any other OG field is present.
1093
+ * - `twitter.*` → `<meta name="twitter:*">`. `twitter:card` defaults to
1094
+ * `'summary'` when any other Twitter field is present.
1095
+ * - `robots` is always emitted (defaults to `'index,follow'`) so themes
1096
+ * stacking multiple SEO sources have a deterministic last word on
1097
+ * indexing for Weaverse-managed pages.
1098
+ * - Empty strings / missing fields are filtered before return so empty
1099
+ * descriptors don't override earlier sources (e.g. Hydrogen
1100
+ * `getSeoMeta`).
1101
+ */
1102
+ declare function formatMetaDescriptors(seo: PageSEOData | null | undefined): MetaDescriptor[];
1103
+ /**
1104
+ * Convenience accessor: pull `page.seo` out of a `WeaverseLoaderData`
1105
+ * (or `HydrogenPageData`) and emit `MetaDescriptor[]`. Null-safe.
1106
+ *
1107
+ * @example
1108
+ * ```ts
1109
+ * export const meta: MetaFunction<typeof loader> = ({ data }) => {
1110
+ * return getWeaverseSeoMeta(data?.weaverseData)
1111
+ * }
1112
+ * ```
1113
+ */
1114
+ declare function getWeaverseSeoMeta(data: WeaverseLoaderData | HydrogenPageData | {
1115
+ page?: HydrogenPageData | null;
1116
+ } | null | undefined): MetaDescriptor[];
1117
+
1076
1118
  /**
1077
1119
  * Extract and parse query parameters from a request URL.
1078
1120
  * Supports optional allowlist for security-sensitive applications.
@@ -1155,4 +1197,4 @@ declare const IMAGES_PLACEHOLDERS: {
1155
1197
  product_18: string;
1156
1198
  };
1157
1199
 
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 };
1200
+ 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 & {
@@ -1073,6 +1080,41 @@ declare function useWeaverseDataContext(): WeaverseDataContext;
1073
1080
  */
1074
1081
  declare function createWeaverseDataContext(matches: UIMatch<unknown, unknown>[]): WeaverseDataContext;
1075
1082
 
1083
+ /**
1084
+ * Convert a Weaverse page-level SEO payload into React Router
1085
+ * `MetaDescriptor[]`. Pure, synchronous, tree-shakeable — does not fetch.
1086
+ *
1087
+ * Behavior:
1088
+ * - `title` → top-level `{ title }` descriptor.
1089
+ * - `description` / `keywords` → `<meta name="...">`.
1090
+ * - `canonicalUrl` → `<link rel="canonical">`.
1091
+ * - `openGraph.*` → `<meta property="og:*">`. `og:type` defaults to
1092
+ * `'website'` when any other OG field is present.
1093
+ * - `twitter.*` → `<meta name="twitter:*">`. `twitter:card` defaults to
1094
+ * `'summary'` when any other Twitter field is present.
1095
+ * - `robots` is always emitted (defaults to `'index,follow'`) so themes
1096
+ * stacking multiple SEO sources have a deterministic last word on
1097
+ * indexing for Weaverse-managed pages.
1098
+ * - Empty strings / missing fields are filtered before return so empty
1099
+ * descriptors don't override earlier sources (e.g. Hydrogen
1100
+ * `getSeoMeta`).
1101
+ */
1102
+ declare function formatMetaDescriptors(seo: PageSEOData | null | undefined): MetaDescriptor[];
1103
+ /**
1104
+ * Convenience accessor: pull `page.seo` out of a `WeaverseLoaderData`
1105
+ * (or `HydrogenPageData`) and emit `MetaDescriptor[]`. Null-safe.
1106
+ *
1107
+ * @example
1108
+ * ```ts
1109
+ * export const meta: MetaFunction<typeof loader> = ({ data }) => {
1110
+ * return getWeaverseSeoMeta(data?.weaverseData)
1111
+ * }
1112
+ * ```
1113
+ */
1114
+ declare function getWeaverseSeoMeta(data: WeaverseLoaderData | HydrogenPageData | {
1115
+ page?: HydrogenPageData | null;
1116
+ } | null | undefined): MetaDescriptor[];
1117
+
1076
1118
  /**
1077
1119
  * Extract and parse query parameters from a request URL.
1078
1120
  * Supports optional allowlist for security-sensitive applications.
@@ -1155,4 +1197,4 @@ declare const IMAGES_PLACEHOLDERS: {
1155
1197
  product_18: string;
1156
1198
  };
1157
1199
 
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 };
1200
+ 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
  }
@@ -1735,12 +1802,14 @@ exports.WeaverseHydrogenItem = WeaverseHydrogenItem;
1735
1802
  exports.WeaverseHydrogenRoot = WeaverseHydrogenRoot;
1736
1803
  exports.createWeaverseDataContext = createWeaverseDataContext;
1737
1804
  exports.defaultComponents = defaultComponents;
1805
+ exports.formatMetaDescriptors = formatMetaDescriptors;
1738
1806
  exports.generateDataFromSchema = generateDataFromSchema;
1739
1807
  exports.getNestedKey = getNestedKey;
1740
1808
  exports.getPreviewData = getPreviewData;
1741
1809
  exports.getRequestQueries = getRequestQueries;
1742
1810
  exports.getSelectedProductOptions = getSelectedProductOptions;
1743
1811
  exports.getWeaverseConfigs = getWeaverseConfigs;
1812
+ exports.getWeaverseSeoMeta = getWeaverseSeoMeta;
1744
1813
  exports.hasError = hasError;
1745
1814
  exports.hasWeaverseStudio = hasWeaverseStudio;
1746
1815
  exports.interpolate = interpolate;