@weaverse/hydrogen 5.15.0 → 5.15.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.js 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,27 @@ 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
+ }
550
571
  var ThemeSettingsStore = class {
551
572
  settings = {};
552
573
  schema;
@@ -651,6 +672,24 @@ function useThemeSettingsStore() {
651
672
  }
652
673
 
653
674
  // src/utils/use-studio.ts
675
+ var STUDIO_READY_POLL_MS = 50;
676
+ var STUDIO_READY_TIMEOUT_MS = 5e3;
677
+ function waitForStudio() {
678
+ return new Promise((resolve) => {
679
+ let startedAt = Date.now();
680
+ function check() {
681
+ if (hasWeaverseStudio(window)) {
682
+ return resolve(window.weaverseStudio);
683
+ }
684
+ if (Date.now() - startedAt >= STUDIO_READY_TIMEOUT_MS) {
685
+ console.warn("[Weaverse] Studio script did not initialize in time");
686
+ return resolve(null);
687
+ }
688
+ setTimeout(check, STUDIO_READY_POLL_MS);
689
+ }
690
+ check();
691
+ });
692
+ }
654
693
  function useStudio(weaverse) {
655
694
  let { revalidate } = reactRouter.useRevalidator();
656
695
  let navigation = reactRouter.useNavigation();
@@ -680,11 +719,7 @@ function useStudio(weaverse) {
680
719
  themeTextStore
681
720
  };
682
721
  let studioSrc = `${weaverseHost}/static/studio/hydrogen/index.js?v=${weaverseVersion}`;
683
- react.loadScript(studioSrc).then(() => {
684
- if (hasWeaverseStudio(window)) {
685
- window.weaverseStudio.init(weaverse);
686
- }
687
- }).catch(console.error);
722
+ react.loadScript(studioSrc).then(waitForStudio).then((studio) => studio?.init(weaverse)).catch(console.error);
688
723
  }
689
724
  }
690
725
  }, [pathname, search, navigation.state]);
@@ -866,19 +901,20 @@ var WeaverseHydrogen = class extends react.Weaverse {
866
901
  };
867
902
  };
868
903
  function createWeaverseInstance(params) {
869
- const normalizedParams = normalizeDesignModeRequestInfo(params);
904
+ const normalizedParams = normalizeRequestInfo(params);
870
905
  if (react.isBrowser) {
871
906
  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) {
907
+ const existing = window.__weaverses[normalizedParams.pageId];
908
+ const isReused = existing?.requestInfo?.pathname === normalizedParams.requestInfo.pathname && existing?.requestInfo?.search === normalizedParams.requestInfo.search;
909
+ const weaverse = isReused ? existing : new WeaverseHydrogen(normalizedParams);
910
+ window.__weaverses[normalizedParams.pageId] = weaverse;
911
+ if (weaverse.isDesignMode) {
878
912
  weaverse.requestInfo = normalizedParams.requestInfo;
879
913
  if (hasWeaverseStudio(window)) {
880
914
  window.weaverseStudio.refreshStudio(normalizedParams);
881
915
  }
916
+ } else if (isReused) {
917
+ syncReusedInstance(weaverse, normalizedParams);
882
918
  }
883
919
  return weaverse;
884
920
  }
@@ -994,6 +1030,25 @@ function useThemeSettings() {
994
1030
  );
995
1031
  return settings;
996
1032
  }
1033
+
1034
+ // src/utils/normalize-page-url.ts
1035
+ var KEPT_PARAM_RE = /^(?:__revisionId|isDesignMode|weaverse)/;
1036
+ function normalizePageUrl(url) {
1037
+ let parsed;
1038
+ try {
1039
+ parsed = new URL(url);
1040
+ } catch {
1041
+ return url;
1042
+ }
1043
+ const kept = [...parsed.searchParams].filter(
1044
+ ([key]) => KEPT_PARAM_RE.test(key)
1045
+ );
1046
+ kept.sort(([a], [b]) => a.localeCompare(b));
1047
+ const search = new URLSearchParams(kept).toString();
1048
+ return `${parsed.origin}${parsed.pathname}${search ? `?${search}` : ""}`;
1049
+ }
1050
+
1051
+ // src/weaverse-client.ts
997
1052
  var CACHE_DURATIONS = {
998
1053
  /** Short browser freshness for content that can change in Builder */
999
1054
  SHORT: 60,
@@ -1661,7 +1716,9 @@ var WeaverseClient = class {
1661
1716
  projectId: effectiveProjectId,
1662
1717
  // Use effective (potentially overridden) projectId
1663
1718
  params: pageLoadParams,
1664
- url: request.url
1719
+ // Stripped to pathname + Weaverse params — tracking params would
1720
+ // fragment the subrequest cache key (see normalizePageUrl).
1721
+ url: normalizePageUrl(request.url)
1665
1722
  };
1666
1723
  const reqInit = {
1667
1724
  method: "POST",