@weaverse/hydrogen 5.16.3 → 5.16.4

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
@@ -56,77 +56,70 @@ function interpolate(template, variables) {
56
56
  return value === void 0 ? match : String(value);
57
57
  });
58
58
  }
59
- var ThemeTextContext = createContext(null);
60
- ThemeTextContext.displayName = "WeaverseThemeTextContext";
61
- function unflattenKeys(flat) {
62
- const result = {};
63
- for (const [dotPath, value] of Object.entries(flat)) {
64
- const keys = dotPath.split(".");
65
- let current = result;
66
- for (let i = 0; i < keys.length - 1; i++) {
67
- const k = keys[i];
68
- if (!(k in current) || typeof current[k] !== "object") {
69
- current[k] = {};
59
+ var TranslationContext = createContext(null);
60
+ TranslationContext.displayName = "WeaverseTranslationContext";
61
+ function createTranslate(sources) {
62
+ const { staticContent, merchantOverrides, designOverrides, externalT } = sources;
63
+ return (key, variables) => {
64
+ if (externalT) {
65
+ const external = externalT(key, variables);
66
+ if (external && external !== key) {
67
+ return external;
70
68
  }
71
- current = current[k];
72
69
  }
73
- current[keys[keys.length - 1]] = value;
74
- }
75
- return result;
70
+ const design = designOverrides && Object.hasOwn(designOverrides, key) ? designOverrides[key] : void 0;
71
+ const override = merchantOverrides ? getNestedKey(merchantOverrides, key) : void 0;
72
+ const staticValue = getNestedKey(staticContent, key);
73
+ const raw = design ?? override ?? staticValue ?? key;
74
+ return interpolate(raw, variables);
75
+ };
76
76
  }
77
77
  var EMPTY = {};
78
78
  var NOOP_SUBSCRIBE = () => () => {
79
79
  };
80
80
  var NOOP_SNAPSHOT = () => EMPTY;
81
- function ThemeTextProvider({
81
+ function TranslationProvider({
82
82
  staticContent,
83
83
  merchantOverrides,
84
84
  t: externalT,
85
+ translationStore,
85
86
  themeTextStore,
86
87
  children
87
88
  }) {
89
+ const store = translationStore ?? themeTextStore ?? null;
88
90
  const designOverrides = useSafeExternalStore(
89
- themeTextStore?.subscribe ?? NOOP_SUBSCRIBE,
90
- themeTextStore?.getSnapshot ?? NOOP_SNAPSHOT,
91
- themeTextStore?.getServerSnapshot ?? NOOP_SNAPSHOT
91
+ store?.subscribe ?? NOOP_SUBSCRIBE,
92
+ store?.getSnapshot ?? NOOP_SNAPSHOT,
93
+ store?.getServerSnapshot ?? NOOP_SNAPSHOT
92
94
  );
93
- const mergedOverrides = designOverrides !== EMPTY && Object.keys(designOverrides).length > 0 ? { ...merchantOverrides, ...unflattenKeys(designOverrides) } : merchantOverrides;
94
- const value = useMemo(() => {
95
- const t = (key, variables) => {
96
- if (externalT) {
97
- const external = externalT(key, variables);
98
- if (external && external !== key) {
99
- return external;
100
- }
101
- }
102
- const override = mergedOverrides ? getNestedKey(mergedOverrides, key) : void 0;
103
- const staticValue = getNestedKey(staticContent, key);
104
- const raw = override ?? staticValue ?? key;
105
- return interpolate(raw, variables);
106
- };
107
- return {
108
- t,
109
- themeTextStore: themeTextStore ?? null,
95
+ const value = useMemo(
96
+ () => ({
97
+ t: createTranslate({
98
+ staticContent,
99
+ merchantOverrides,
100
+ designOverrides,
101
+ externalT
102
+ }),
103
+ translationStore: store,
104
+ // Deprecated alias — same instance, kept for backward compatibility.
105
+ themeTextStore: store,
110
106
  merchantOverrides: merchantOverrides ?? null
111
- };
112
- }, [
113
- staticContent,
114
- merchantOverrides,
115
- mergedOverrides,
116
- externalT,
117
- themeTextStore
118
- ]);
119
- return /* @__PURE__ */ jsx(ThemeTextContext.Provider, { value, children });
107
+ }),
108
+ [staticContent, merchantOverrides, designOverrides, externalT, store]
109
+ );
110
+ return /* @__PURE__ */ jsx(TranslationContext.Provider, { value, children });
120
111
  }
121
- function useThemeText() {
122
- const ctx = useContext(ThemeTextContext);
112
+ function useTranslation() {
113
+ const ctx = useContext(TranslationContext);
123
114
  if (!ctx) {
124
115
  throw new Error(
125
- "useThemeText must be used within <ThemeTextProvider>. Wrap your app with withWeaverse()."
116
+ "useTranslation must be used within <TranslationProvider>. Wrap your app with withWeaverse()."
126
117
  );
127
118
  }
128
119
  return ctx;
129
120
  }
121
+ var ThemeTextProvider = TranslationProvider;
122
+ var useThemeText = useTranslation;
130
123
  function createFlatDataContext(matches) {
131
124
  const context = {};
132
125
  for (const match of matches) {
@@ -520,8 +513,8 @@ function getPreviewData(type, components, weaverseHost) {
520
513
  };
521
514
  }
522
515
 
523
- // src/utils/theme-text-store.ts
524
- var ThemeTextStore = class {
516
+ // src/utils/translation-store.ts
517
+ var TranslationStore = class {
525
518
  overrides = {};
526
519
  listeners = /* @__PURE__ */ new Set();
527
520
  setOverrides = (overrides) => {
@@ -545,11 +538,12 @@ var ThemeTextStore = class {
545
538
  try {
546
539
  listener();
547
540
  } catch (error) {
548
- console.error("ThemeTextStore: Listener error", error);
541
+ console.error("TranslationStore: Listener error", error);
549
542
  }
550
543
  }
551
544
  };
552
545
  };
546
+ var ThemeTextStore = TranslationStore;
553
547
 
554
548
  // src/utils/pick-weaverse-data.ts
555
549
  function pickWeaverseData(dataProp, ownLoaderData, matches) {
@@ -639,11 +633,14 @@ function syncReusedInstance(weaverse, params) {
639
633
  var currentNavigationKey = null;
640
634
  var firedPageIds = /* @__PURE__ */ new Set();
641
635
  var mountedInstances = 0;
642
- function shouldFirePixel(navigationKey, pageId) {
636
+ function observeNavigation(navigationKey) {
643
637
  if (navigationKey !== currentNavigationKey) {
644
638
  currentNavigationKey = navigationKey;
645
639
  firedPageIds.clear();
646
640
  }
641
+ }
642
+ function shouldFirePixel(navigationKey, pageId) {
643
+ observeNavigation(navigationKey);
647
644
  if (firedPageIds.has(pageId)) {
648
645
  return false;
649
646
  }
@@ -798,7 +795,7 @@ function useStudio(weaverse) {
798
795
  let { pathname, search } = useLocation();
799
796
  let navigate = useNavigate();
800
797
  let themeSettingsStore = useThemeSettingsStore();
801
- let { themeTextStore, merchantOverrides } = useThemeText();
798
+ let { translationStore, themeTextStore, merchantOverrides } = useTranslation();
802
799
  let {
803
800
  isDesignMode,
804
801
  weaverseHost,
@@ -829,6 +826,8 @@ function useStudio(weaverse) {
829
826
  revalidate,
830
827
  merchantOverrides,
831
828
  themeSettingsStore,
829
+ translationStore,
830
+ // Deprecated alias for existing Studio bridge integrations.
832
831
  themeTextStore
833
832
  };
834
833
  loadScript(src).then(waitForStudio).then((studio) => studio?.init(weaverse)).catch(console.error);
@@ -839,6 +838,12 @@ function useStudio(weaverse) {
839
838
  function usePixel(context) {
840
839
  let { projectId, pageId, isDesignMode, weaverseHost } = context;
841
840
  let { key: navigationKey } = useLocation();
841
+ useEffect(() => {
842
+ if (!(projectId && pageId) || isDesignMode) {
843
+ return;
844
+ }
845
+ observeNavigation(navigationKey);
846
+ }, [navigationKey, projectId, pageId, isDesignMode]);
842
847
  useEffect(() => {
843
848
  if (!(projectId && pageId) || isDesignMode) {
844
849
  return;
@@ -1126,18 +1131,18 @@ var WeaverseHydrogenRoot = memo(
1126
1131
  function withWeaverse(Component, options) {
1127
1132
  return (props) => {
1128
1133
  const themeSettingsStore = useCreateThemeSettingsStore();
1129
- const themeTextData = useThemeTextData();
1130
- const themeTextStoreRef = useRef(null);
1131
- if (!themeTextStoreRef.current) {
1132
- themeTextStoreRef.current = new ThemeTextStore();
1134
+ const translationData = useTranslationData();
1135
+ const translationStoreRef = useRef(null);
1136
+ if (!translationStoreRef.current) {
1137
+ translationStoreRef.current = new TranslationStore();
1133
1138
  }
1134
1139
  return /* @__PURE__ */ jsx(ThemeSettingsStoreContext.Provider, { value: themeSettingsStore, children: /* @__PURE__ */ jsxs(
1135
- ThemeTextProvider,
1140
+ TranslationProvider,
1136
1141
  {
1137
- merchantOverrides: themeTextData.merchantOverrides,
1138
- staticContent: themeTextData.staticContent,
1142
+ merchantOverrides: translationData.merchantOverrides,
1143
+ staticContent: translationData.staticContent,
1139
1144
  t: options?.t,
1140
- themeTextStore: themeTextStoreRef.current,
1145
+ translationStore: translationStoreRef.current,
1141
1146
  children: [
1142
1147
  /* @__PURE__ */ jsx(StudioConnect, {}),
1143
1148
  /* @__PURE__ */ jsx(Component, { ...props })
@@ -1146,7 +1151,7 @@ function withWeaverse(Component, options) {
1146
1151
  ) });
1147
1152
  };
1148
1153
  }
1149
- function useThemeTextData() {
1154
+ function useTranslationData() {
1150
1155
  const data = useRouteLoaderData("root");
1151
1156
  return {
1152
1157
  staticContent: data?.weaverseTheme?.staticContent ?? {},
@@ -1724,6 +1729,9 @@ var WeaverseClient = class {
1724
1729
  try {
1725
1730
  const { projectId, weaverseHost } = this.configs;
1726
1731
  const i18n = this.storefront.i18n;
1732
+ if (!this.themeSchema?.i18n) {
1733
+ return;
1734
+ }
1727
1735
  if (!(projectId && weaverseHost)) {
1728
1736
  return;
1729
1737
  }
@@ -1824,7 +1832,7 @@ var WeaverseClient = class {
1824
1832
  * Fetches page content, executes component loaders, and handles empty items fallback.
1825
1833
  *
1826
1834
  * @param params - Optional page loading parameters
1827
- * @param params.type - Page type (HOME, PAGE, PRODUCT, COLLECTION, etc.)
1835
+ * @param params.type - Page type (INDEX, PAGE, PRODUCT, COLLECTION, etc.)
1828
1836
  * @param params.handle - Page handle for dynamic routes
1829
1837
  * @param params.locale - Locale override
1830
1838
  * @param params.projectId - Route-level project ID override (for multi-project)
@@ -1837,7 +1845,7 @@ var WeaverseClient = class {
1837
1845
  * const data = await weaverse.loadPage()
1838
1846
  *
1839
1847
  * // With page type
1840
- * const data = await weaverse.loadPage({ type: 'HOME' })
1848
+ * const data = await weaverse.loadPage({ type: 'INDEX' })
1841
1849
  *
1842
1850
  * // Route-level project override
1843
1851
  * const data = await weaverse.loadPage({
@@ -2053,6 +2061,6 @@ var IMAGES_PLACEHOLDERS = {
2053
2061
  product_18: "https://cdn.shopify.com/s/files/1/0838/0052/3057/files/fpo-product-watch-2-1024x1024.svg"
2054
2062
  };
2055
2063
 
2056
- 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 };
2064
+ export { IMAGES_PLACEHOLDERS, ThemeTextProvider, ThemeTextStore, TranslationProvider, TranslationStore, 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, useTranslation, useWeaverseDataContext, withWeaverse };
2057
2065
  //# sourceMappingURL=index.mjs.map
2058
2066
  //# sourceMappingURL=index.mjs.map