@weaverse/hydrogen 5.14.0 → 5.15.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
@@ -297,7 +297,6 @@ function getWeaverseConfigs(request, env) {
297
297
  WEAVERSE_PROJECT_ID,
298
298
  WEAVERSE_API_KEY,
299
299
  WEAVERSE_HOST,
300
- WEAVERSE_API_BASE,
301
300
  PUBLIC_STORE_DOMAIN,
302
301
  PUBLIC_STOREFRONT_API_TOKEN
303
302
  } = env || {};
@@ -313,10 +312,11 @@ function getWeaverseConfigs(request, env) {
313
312
  } = queries;
314
313
  let url = new URL(request.url);
315
314
  let isRevisionPreview = url.searchParams.has("__revisionId");
315
+ let resolvedWeaverseHost = weaverseHost || WEAVERSE_HOST || envFromProcess.WEAVERSE_HOST || "https://studio.weaverse.io";
316
316
  return {
317
317
  projectId: weaverseProjectId || WEAVERSE_PROJECT_ID || envFromProcess.WEAVERSE_PROJECT_ID || "",
318
- weaverseHost: weaverseHost || WEAVERSE_HOST || envFromProcess.WEAVERSE_HOST || "https://studio.weaverse.io",
319
- weaverseApiBase: WEAVERSE_API_BASE || envFromProcess.WEAVERSE_API_BASE || WEAVERSE_HOST || envFromProcess.WEAVERSE_HOST || "https://api.weaverse.io",
318
+ weaverseHost: resolvedWeaverseHost,
319
+ weaverseApiBase: resolvedWeaverseHost,
320
320
  weaverseApiKey: weaverseApiKey || WEAVERSE_API_KEY || envFromProcess.WEAVERSE_API_KEY || "",
321
321
  weaverseVersion: weaverseVersion || "",
322
322
  isDesignMode,
@@ -507,6 +507,46 @@ function hasWeaverseData(value) {
507
507
  }
508
508
  return value.weaverseData !== void 0;
509
509
  }
510
+
511
+ // src/utils/studio-request-info.ts
512
+ function getBrowserLocation() {
513
+ if (typeof window === "undefined") {
514
+ return;
515
+ }
516
+ return window.location;
517
+ }
518
+ function getQueriesFromSearch(search) {
519
+ let queries = {};
520
+ let params = new URLSearchParams(search);
521
+ for (let [key, value] of params.entries()) {
522
+ if (value === "true") {
523
+ queries[key] = true;
524
+ } else if (value === "false") {
525
+ queries[key] = false;
526
+ } else {
527
+ queries[key] = value;
528
+ }
529
+ }
530
+ return queries;
531
+ }
532
+ function normalizeDesignModeRequestInfo(params, browserLocation = getBrowserLocation()) {
533
+ if (!(params.isDesignMode && browserLocation)) {
534
+ return params;
535
+ }
536
+ let { pathname, search } = browserLocation;
537
+ if (params.requestInfo.pathname === pathname && params.requestInfo.search === search) {
538
+ return params;
539
+ }
540
+ return {
541
+ ...params,
542
+ requestInfo: {
543
+ ...params.requestInfo,
544
+ pathname,
545
+ queries: getQueriesFromSearch(search),
546
+ search
547
+ }
548
+ };
549
+ }
510
550
  var ThemeSettingsStore = class {
511
551
  settings = {};
512
552
  schema;
@@ -826,22 +866,23 @@ var WeaverseHydrogen = class extends Weaverse {
826
866
  };
827
867
  };
828
868
  function createWeaverseInstance(params) {
869
+ const normalizedParams = normalizeDesignModeRequestInfo(params);
829
870
  if (isBrowser) {
830
871
  window.__weaverses = window.__weaverses || {};
831
- let weaverse = window.__weaverses[params.pageId];
832
- if (!weaverse || weaverse?.requestInfo?.pathname !== params.requestInfo.pathname || weaverse?.requestInfo?.search !== params.requestInfo.search) {
833
- weaverse = new WeaverseHydrogen(params);
834
- window.__weaverses[params.pageId] = weaverse;
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;
835
876
  }
836
877
  if (weaverse?.isDesignMode) {
837
- weaverse.requestInfo = params.requestInfo;
878
+ weaverse.requestInfo = normalizedParams.requestInfo;
838
879
  if (hasWeaverseStudio(window)) {
839
- window.weaverseStudio.refreshStudio(params);
880
+ window.weaverseStudio.refreshStudio(normalizedParams);
840
881
  }
841
882
  }
842
883
  return weaverse;
843
884
  }
844
- return new WeaverseHydrogen(params);
885
+ return new WeaverseHydrogen(normalizedParams);
845
886
  }
846
887
  var StudioBridge = memo(({ context }) => {
847
888
  useStudio(context);
@@ -954,19 +995,34 @@ function useThemeSettings() {
954
995
  return settings;
955
996
  }
956
997
  var CACHE_DURATIONS = {
957
- /** Short cache for frequently changing content (10 seconds) */
958
- SHORT: 10,
959
- /** Long cache duration - 23 hours to maximize CDN hits before daily refresh */
960
- LONG: 82800
998
+ /** Short browser freshness for content that can change in Builder */
999
+ SHORT: 60,
1000
+ /** Shared cache freshness for anonymous storefront traffic */
1001
+ SHARED_SHORT: 300,
1002
+ /** Long stale window so slow Builder responses do not block storefront rendering */
1003
+ LONG: 86400,
1004
+ /** Extra freshness for sitemap-like index data */
1005
+ STATIC: 3600
961
1006
  };
962
1007
  var DEFAULT_FETCH_TIMEOUT_MS = 1e4;
963
1008
  var API_PATH = "v1";
964
1009
  var DEFAULT_CACHE_STRATEGY = {
965
1010
  maxAge: CACHE_DURATIONS.SHORT,
966
- sMaxAge: CACHE_DURATIONS.SHORT,
1011
+ sMaxAge: CACHE_DURATIONS.SHARED_SHORT,
967
1012
  staleWhileRevalidate: CACHE_DURATIONS.LONG,
968
1013
  staleIfError: CACHE_DURATIONS.LONG
969
1014
  };
1015
+ var SMART_CACHE_STRATEGIES = {
1016
+ project: DEFAULT_CACHE_STRATEGY,
1017
+ "theme-settings": DEFAULT_CACHE_STRATEGY,
1018
+ "merchant-overrides": DEFAULT_CACHE_STRATEGY,
1019
+ "custom-pages": {
1020
+ maxAge: CACHE_DURATIONS.SHORT,
1021
+ sMaxAge: CACHE_DURATIONS.STATIC,
1022
+ staleWhileRevalidate: CACHE_DURATIONS.LONG,
1023
+ staleIfError: CACHE_DURATIONS.LONG
1024
+ }
1025
+ };
970
1026
  var WeaverseClient = class {
971
1027
  API = API_PATH;
972
1028
  basePageConfigs;
@@ -1286,11 +1342,8 @@ var WeaverseClient = class {
1286
1342
  }
1287
1343
  };
1288
1344
  // Helper method for building API URLs consistently
1289
- getApiUrl(endpoint, useProxy = !this.configs.isDesignMode) {
1290
- const { weaverseHost, weaverseApiBase, projectId } = this.configs;
1291
- if (useProxy) {
1292
- return `${weaverseApiBase}/v1/${endpoint}?projectId=${projectId}`;
1293
- }
1345
+ getApiUrl(endpoint) {
1346
+ const { weaverseHost } = this.configs;
1294
1347
  return `${weaverseHost}/api/public/${endpoint}`;
1295
1348
  }
1296
1349
  /**
@@ -1311,19 +1364,23 @@ var WeaverseClient = class {
1311
1364
  * ```
1312
1365
  */
1313
1366
  fetchWithCache = async (url, options = {}) => {
1314
- const strategy = options.strategy || CacheCustom(DEFAULT_CACHE_STRATEGY);
1367
+ const { cacheTarget, strategy: strategyOverride, ...fetchOptions } = options;
1368
+ const strategy = strategyOverride || CacheCustom(
1369
+ cacheTarget ? SMART_CACHE_STRATEGIES[cacheTarget] : DEFAULT_CACHE_STRATEGY
1370
+ );
1315
1371
  const cacheKey = [
1316
1372
  "weaverse-fetch",
1317
1373
  url,
1318
1374
  options.method || "GET",
1319
- options.body,
1320
- this.configs.projectId
1375
+ fetchOptions.body,
1376
+ this.configs.projectId,
1377
+ cacheTarget || "default"
1321
1378
  ];
1322
1379
  let result;
1323
- if (this.configs.isDesignMode) {
1324
- result = await this.directFetch(url, options);
1380
+ if (this.configs.isDesignMode || this.configs.isRevisionPreview) {
1381
+ result = await this.directFetch(url, fetchOptions);
1325
1382
  } else {
1326
- result = await this.withCache.fetch(url, options, {
1383
+ result = await this.withCache.fetch(url, fetchOptions, {
1327
1384
  cacheKey,
1328
1385
  cacheStrategy: strategy,
1329
1386
  shouldCacheResponse: (response) => {
@@ -1360,6 +1417,7 @@ var WeaverseClient = class {
1360
1417
  const [data, merchantOverrides] = await Promise.all([
1361
1418
  this.fetchWithCache(url, {
1362
1419
  method: "POST",
1420
+ cacheTarget: "theme-settings",
1363
1421
  strategy,
1364
1422
  body,
1365
1423
  headers: {
@@ -1454,6 +1512,7 @@ var WeaverseClient = class {
1454
1512
  url,
1455
1513
  {
1456
1514
  method: "GET",
1515
+ cacheTarget: "merchant-overrides",
1457
1516
  strategy,
1458
1517
  headers: {
1459
1518
  Accept: "application/json"
@@ -1517,7 +1576,7 @@ var WeaverseClient = class {
1517
1576
  const qs = params.toString();
1518
1577
  const url = `${weaverseHost}/api/public/v1/projects/${projectId}/custom-pages${qs ? `?${qs}` : ""}`;
1519
1578
  try {
1520
- const result = await this.fetchWithCache(url);
1579
+ const result = await this.fetchWithCache(url, { cacheTarget: "custom-pages" });
1521
1580
  entries.push(...result.data || []);
1522
1581
  if (!result.nextCursor) {
1523
1582
  return entries;
@@ -1617,6 +1676,7 @@ var WeaverseClient = class {
1617
1676
  const url = this.getApiUrl("project");
1618
1677
  const projectData = await this.fetchWithCache(url, {
1619
1678
  ...reqInit,
1679
+ cacheTarget: "project",
1620
1680
  strategy
1621
1681
  });
1622
1682
  if (hasError(projectData)) {