@weaverse/hydrogen 5.13.0 → 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.mjs CHANGED
@@ -5,7 +5,7 @@ import { createSchema, isValidSchema } from '@weaverse/schema';
5
5
  export * from '@weaverse/schema';
6
6
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
7
7
  import { createContext, memo, useMemo, Suspense, useEffect, useContext, useRef } from 'react';
8
- import { useMatches, Await, useRevalidator, useNavigation, useLocation, useNavigate, useRouteLoaderData } from 'react-router';
8
+ import { useMatches, useLoaderData, Await, useRevalidator, useNavigation, useLocation, useNavigate, useRouteLoaderData } from 'react-router';
9
9
  import { ErrorBoundary } from 'react-error-boundary';
10
10
 
11
11
  // src/index.ts
@@ -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
  }
@@ -417,6 +484,29 @@ var ThemeTextStore = class {
417
484
  }
418
485
  };
419
486
  };
487
+
488
+ // src/utils/pick-weaverse-data.ts
489
+ function pickWeaverseData(dataProp, ownLoaderData, matches) {
490
+ if (dataProp !== void 0) {
491
+ return dataProp;
492
+ }
493
+ if (hasWeaverseData(ownLoaderData)) {
494
+ return ownLoaderData.weaverseData;
495
+ }
496
+ for (let i = matches.length - 1; i >= 0; i--) {
497
+ const loaderData = matches[i].loaderData;
498
+ if (hasWeaverseData(loaderData)) {
499
+ return loaderData.weaverseData;
500
+ }
501
+ }
502
+ return null;
503
+ }
504
+ function hasWeaverseData(value) {
505
+ if (typeof value !== "object" || value === null || !("weaverseData" in value)) {
506
+ return false;
507
+ }
508
+ return value.weaverseData !== void 0;
509
+ }
420
510
  var ThemeSettingsStore = class {
421
511
  settings = {};
422
512
  schema;
@@ -709,7 +799,7 @@ var WeaverseHydrogen = class extends Weaverse {
709
799
  const entries = [];
710
800
  const languageId = this.translationLanguageId;
711
801
  if (!(this.translationLocale && languageId)) {
712
- return void 0;
802
+ return;
713
803
  }
714
804
  for (const [itemId, fields] of Object.entries(this.translationMap)) {
715
805
  for (const [key, entry] of Object.entries(fields)) {
@@ -722,7 +812,7 @@ var WeaverseHydrogen = class extends Weaverse {
722
812
  }
723
813
  }
724
814
  if (entries.length === 0) {
725
- return void 0;
815
+ return;
726
816
  }
727
817
  return { languageId, entries };
728
818
  };
@@ -786,20 +876,19 @@ function registerComponent(element) {
786
876
  var WeaverseHydrogenRoot = memo(
787
877
  ({
788
878
  components,
879
+ data: dataProp,
789
880
  errorComponent: ErrorComponent = ({ error }) => /* @__PURE__ */ jsx("div", { children: error instanceof Error ? error.message : "An unexpected error occurred" })
790
881
  }) => {
791
882
  const matches = useMatches();
792
883
  const enhancedDataContext = createWeaverseDataContext(matches);
793
- const weaverseData = useMemo(() => {
794
- for (let i = matches.length - 1; i >= 0; i--) {
795
- const match = matches[i];
796
- const loaderData = match.loaderData;
797
- if (loaderData && "weaverseData" in loaderData) {
798
- return loaderData.weaverseData;
799
- }
800
- }
884
+ const ownLoaderData = useLoaderData();
885
+ const weaverseData = useMemo(
886
+ () => pickWeaverseData(dataProp, ownLoaderData, matches),
887
+ [dataProp, ownLoaderData, matches]
888
+ );
889
+ if (dataProp === null) {
801
890
  return null;
802
- }, [matches]);
891
+ }
803
892
  if (weaverseData) {
804
893
  if (weaverseData instanceof Promise) {
805
894
  return /* @__PURE__ */ jsx(ErrorBoundary, { fallbackRender: ErrorComponent, children: /* @__PURE__ */ jsx(Suspense, { children: /* @__PURE__ */ jsx(Await, { resolve: weaverseData, children: (resolvedData) => /* @__PURE__ */ jsx(
@@ -1355,7 +1444,7 @@ var WeaverseClient = class {
1355
1444
  const { projectId, weaverseHost } = this.configs;
1356
1445
  const i18n = this.storefront.i18n;
1357
1446
  if (!(projectId && weaverseHost)) {
1358
- return void 0;
1447
+ return;
1359
1448
  }
1360
1449
  const language = (i18n?.language || "en").toLowerCase();
1361
1450
  const country = (i18n?.country || "us").toLowerCase();
@@ -1374,13 +1463,13 @@ var WeaverseClient = class {
1374
1463
  if (typeof overrides === "object" && overrides !== null) {
1375
1464
  return overrides;
1376
1465
  }
1377
- return void 0;
1466
+ return;
1378
1467
  } catch (error) {
1379
1468
  console.warn(
1380
1469
  "Unable to load merchant overrides, using theme defaults:",
1381
1470
  this.extractErrorMessage(error)
1382
1471
  );
1383
- return void 0;
1472
+ return;
1384
1473
  }
1385
1474
  };
1386
1475
  /**
@@ -1559,7 +1648,9 @@ var WeaverseClient = class {
1559
1648
  };
1560
1649
  }
1561
1650
  if (!page) {
1562
- page = this.generateFallbackPage("Please add new section to start.");
1651
+ page = this.generateFallbackPage(
1652
+ '<div style="text-align: center;">Please add new section to start.</div>'
1653
+ );
1563
1654
  }
1564
1655
  if (page?.items?.length === 0) {
1565
1656
  page.items.push({
@@ -1677,6 +1768,6 @@ var IMAGES_PLACEHOLDERS = {
1677
1768
  product_18: "https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-watch-2-1024x1024.svg"
1678
1769
  };
1679
1770
 
1680
- export { IMAGES_PLACEHOLDERS, ThemeTextProvider, ThemeTextStore, WeaverseClient, WeaverseError, WeaverseHydrogen, WeaverseHydrogenItem, WeaverseHydrogenRoot, createWeaverseDataContext, defaultComponents, generateDataFromSchema, getNestedKey, getPreviewData, getRequestQueries, getSelectedProductOptions, getWeaverseConfigs, hasError, hasWeaverseStudio, interpolate, isFetchProjectPayload, isProjectIdFunction, isThemeSettingsResponse, isValidHydrogenSchema, isWithCacheFetchResponse, registerComponent, useThemeSettings, useThemeText, useWeaverseDataContext, withWeaverse };
1771
+ export { IMAGES_PLACEHOLDERS, ThemeTextProvider, ThemeTextStore, WeaverseClient, WeaverseError, WeaverseHydrogen, WeaverseHydrogenItem, WeaverseHydrogenRoot, createWeaverseDataContext, defaultComponents, formatMetaDescriptors, generateDataFromSchema, getNestedKey, getPreviewData, getRequestQueries, getSelectedProductOptions, getWeaverseConfigs, getWeaverseSeoMeta, hasError, hasWeaverseStudio, interpolate, isFetchProjectPayload, isProjectIdFunction, isThemeSettingsResponse, isValidHydrogenSchema, isWithCacheFetchResponse, registerComponent, useThemeSettings, useThemeText, useWeaverseDataContext, withWeaverse };
1681
1772
  //# sourceMappingURL=index.mjs.map
1682
1773
  //# sourceMappingURL=index.mjs.map