@weaverse/hydrogen 5.15.0 → 5.15.2

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
@@ -529,8 +529,8 @@ function getQueriesFromSearch(search) {
529
529
  }
530
530
  return queries;
531
531
  }
532
- function normalizeDesignModeRequestInfo(params, browserLocation = getBrowserLocation()) {
533
- if (!(params.isDesignMode && browserLocation)) {
532
+ function normalizeRequestInfo(params, browserLocation = getBrowserLocation()) {
533
+ if (!browserLocation) {
534
534
  return params;
535
535
  }
536
536
  let { pathname, search } = browserLocation;
@@ -547,6 +547,53 @@ function normalizeDesignModeRequestInfo(params, browserLocation = getBrowserLoca
547
547
  }
548
548
  };
549
549
  }
550
+
551
+ // src/utils/sync-reused-instance.ts
552
+ function syncReusedInstance(weaverse, params) {
553
+ weaverse.requestInfo = params.requestInfo;
554
+ weaverse.internal = params.internal;
555
+ let dataChanged = JSON.stringify(weaverse.data) !== JSON.stringify(params.data);
556
+ let contextChanged = JSON.stringify(weaverse.dataContext ?? null) !== JSON.stringify(params.dataContext ?? null);
557
+ if (contextChanged) {
558
+ weaverse.dataContext = params.dataContext ?? null;
559
+ }
560
+ if (dataChanged) {
561
+ weaverse.setProjectData(params.data);
562
+ } else if (contextChanged) {
563
+ for (const { id } of params.data?.items || []) {
564
+ weaverse.itemInstances.get(id)?.setData({});
565
+ }
566
+ }
567
+ if (dataChanged || contextChanged) {
568
+ weaverse.triggerUpdate();
569
+ }
570
+ }
571
+
572
+ // src/utils/pixel.ts
573
+ var currentNavigationKey = null;
574
+ var firedPageIds = /* @__PURE__ */ new Set();
575
+ var mountedInstances = 0;
576
+ function shouldFirePixel(navigationKey, pageId) {
577
+ if (navigationKey !== currentNavigationKey) {
578
+ currentNavigationKey = navigationKey;
579
+ firedPageIds.clear();
580
+ }
581
+ if (firedPageIds.has(pageId)) {
582
+ return false;
583
+ }
584
+ firedPageIds.add(pageId);
585
+ return true;
586
+ }
587
+ function registerPixelInstance() {
588
+ mountedInstances += 1;
589
+ return () => {
590
+ mountedInstances -= 1;
591
+ if (mountedInstances === 0) {
592
+ currentNavigationKey = null;
593
+ firedPageIds.clear();
594
+ }
595
+ };
596
+ }
550
597
  var ThemeSettingsStore = class {
551
598
  settings = {};
552
599
  schema;
@@ -651,6 +698,24 @@ function useThemeSettingsStore() {
651
698
  }
652
699
 
653
700
  // src/utils/use-studio.ts
701
+ var STUDIO_READY_POLL_MS = 50;
702
+ var STUDIO_READY_TIMEOUT_MS = 5e3;
703
+ function waitForStudio() {
704
+ return new Promise((resolve) => {
705
+ let startedAt = Date.now();
706
+ function check() {
707
+ if (hasWeaverseStudio(window)) {
708
+ return resolve(window.weaverseStudio);
709
+ }
710
+ if (Date.now() - startedAt >= STUDIO_READY_TIMEOUT_MS) {
711
+ console.warn("[Weaverse] Studio script did not initialize in time");
712
+ return resolve(null);
713
+ }
714
+ setTimeout(check, STUDIO_READY_POLL_MS);
715
+ }
716
+ check();
717
+ });
718
+ }
654
719
  function useStudio(weaverse) {
655
720
  let { revalidate } = useRevalidator();
656
721
  let navigation = useNavigation();
@@ -680,11 +745,7 @@ function useStudio(weaverse) {
680
745
  themeTextStore
681
746
  };
682
747
  let studioSrc = `${weaverseHost}/static/studio/hydrogen/index.js?v=${weaverseVersion}`;
683
- loadScript(studioSrc).then(() => {
684
- if (hasWeaverseStudio(window)) {
685
- window.weaverseStudio.init(weaverse);
686
- }
687
- }).catch(console.error);
748
+ loadScript(studioSrc).then(waitForStudio).then((studio) => studio?.init(weaverse)).catch(console.error);
688
749
  }
689
750
  }
690
751
  }, [pathname, search, navigation.state]);
@@ -692,13 +753,18 @@ function useStudio(weaverse) {
692
753
  }
693
754
  function usePixel(context) {
694
755
  let { projectId, pageId, isDesignMode, weaverseHost } = context;
756
+ let { key: navigationKey } = useLocation();
695
757
  useEffect(() => {
696
758
  if (!(projectId && pageId) || isDesignMode) {
697
759
  return;
698
760
  }
699
- let img = new Image();
700
- img.onload = () => img.remove();
701
- img.src = `${weaverseHost}/api/public/px?projectId=${projectId}&pageId=${pageId}`;
761
+ let unregister = registerPixelInstance();
762
+ if (shouldFirePixel(navigationKey, pageId)) {
763
+ let img = new Image();
764
+ img.onload = () => img.remove();
765
+ img.src = `${weaverseHost}/api/public/px?projectId=${projectId}&pageId=${pageId}`;
766
+ }
767
+ return unregister;
702
768
  }, []);
703
769
  }
704
770
  var WeaverseHydrogenItem = class extends WeaverseItemStore {
@@ -866,19 +932,20 @@ var WeaverseHydrogen = class extends Weaverse {
866
932
  };
867
933
  };
868
934
  function createWeaverseInstance(params) {
869
- const normalizedParams = normalizeDesignModeRequestInfo(params);
935
+ const normalizedParams = normalizeRequestInfo(params);
870
936
  if (isBrowser) {
871
937
  window.__weaverses = window.__weaverses || {};
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;
876
- }
877
- if (weaverse?.isDesignMode) {
938
+ const existing = window.__weaverses[normalizedParams.pageId];
939
+ const isReused = existing?.requestInfo?.pathname === normalizedParams.requestInfo.pathname && existing?.requestInfo?.search === normalizedParams.requestInfo.search;
940
+ const weaverse = isReused ? existing : new WeaverseHydrogen(normalizedParams);
941
+ window.__weaverses[normalizedParams.pageId] = weaverse;
942
+ if (weaverse.isDesignMode) {
878
943
  weaverse.requestInfo = normalizedParams.requestInfo;
879
944
  if (hasWeaverseStudio(window)) {
880
945
  window.weaverseStudio.refreshStudio(normalizedParams);
881
946
  }
947
+ } else if (isReused) {
948
+ syncReusedInstance(weaverse, normalizedParams);
882
949
  }
883
950
  return weaverse;
884
951
  }
@@ -994,6 +1061,25 @@ function useThemeSettings() {
994
1061
  );
995
1062
  return settings;
996
1063
  }
1064
+
1065
+ // src/utils/normalize-page-url.ts
1066
+ var KEPT_PARAM_RE = /^(?:__revisionId|isDesignMode|weaverse)/;
1067
+ function normalizePageUrl(url) {
1068
+ let parsed;
1069
+ try {
1070
+ parsed = new URL(url);
1071
+ } catch {
1072
+ return url;
1073
+ }
1074
+ const kept = [...parsed.searchParams].filter(
1075
+ ([key]) => KEPT_PARAM_RE.test(key)
1076
+ );
1077
+ kept.sort(([a], [b]) => a.localeCompare(b));
1078
+ const search = new URLSearchParams(kept).toString();
1079
+ return `${parsed.origin}${parsed.pathname}${search ? `?${search}` : ""}`;
1080
+ }
1081
+
1082
+ // src/weaverse-client.ts
997
1083
  var CACHE_DURATIONS = {
998
1084
  /** Short browser freshness for content that can change in Builder */
999
1085
  SHORT: 60,
@@ -1661,7 +1747,9 @@ var WeaverseClient = class {
1661
1747
  projectId: effectiveProjectId,
1662
1748
  // Use effective (potentially overridden) projectId
1663
1749
  params: pageLoadParams,
1664
- url: request.url
1750
+ // Stripped to pathname + Weaverse params — tracking params would
1751
+ // fragment the subrequest cache key (see normalizePageUrl).
1752
+ url: normalizePageUrl(request.url)
1665
1753
  };
1666
1754
  const reqInit = {
1667
1755
  method: "POST",