@weaverse/next 0.1.0-alpha.9 → 1.0.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.
Files changed (106) hide show
  1. package/README.md +155 -73
  2. package/dist/{chunk-6PMZ77RA.mjs → chunk-LH6AAEIK.mjs} +115 -8
  3. package/dist/chunk-LH6AAEIK.mjs.map +1 -0
  4. package/dist/index.js +180 -32
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.mjs +86 -47
  7. package/dist/index.mjs.map +1 -1
  8. package/dist/server.js +321 -91
  9. package/dist/server.js.map +1 -1
  10. package/dist/server.mjs +205 -28
  11. package/dist/server.mjs.map +1 -1
  12. package/dist/types/client.d.ts +16 -0
  13. package/dist/types/client.d.ts.map +1 -0
  14. package/dist/types/hooks.d.ts +20 -0
  15. package/dist/types/hooks.d.ts.map +1 -0
  16. package/dist/types/index.d.ts +34 -0
  17. package/dist/types/index.d.ts.map +1 -0
  18. package/dist/types/item.d.ts +60 -0
  19. package/dist/types/item.d.ts.map +1 -0
  20. package/dist/types/loader.d.ts +25 -0
  21. package/dist/types/loader.d.ts.map +1 -0
  22. package/dist/types/main.d.ts +11 -0
  23. package/dist/types/main.d.ts.map +1 -0
  24. package/dist/types/provider.d.ts +82 -0
  25. package/dist/types/provider.d.ts.map +1 -0
  26. package/dist/types/registry.d.ts +15 -0
  27. package/dist/types/registry.d.ts.map +1 -0
  28. package/dist/types/renderer.d.ts +21 -0
  29. package/dist/types/renderer.d.ts.map +1 -0
  30. package/dist/types/request-info.d.ts +19 -0
  31. package/dist/types/request-info.d.ts.map +1 -0
  32. package/dist/types/revalidate-item.d.ts +82 -0
  33. package/dist/types/revalidate-item.d.ts.map +1 -0
  34. package/dist/types/root-provider.d.ts +62 -0
  35. package/dist/types/root-provider.d.ts.map +1 -0
  36. package/dist/types/runtime.d.ts +113 -0
  37. package/dist/types/runtime.d.ts.map +1 -0
  38. package/dist/types/seo.d.ts +55 -0
  39. package/dist/types/seo.d.ts.map +1 -0
  40. package/dist/types/server/configs.d.ts +27 -0
  41. package/dist/types/server/configs.d.ts.map +1 -0
  42. package/dist/types/server/normalize-page-url.d.ts +19 -0
  43. package/dist/types/server/normalize-page-url.d.ts.map +1 -0
  44. package/dist/types/server/revalidate-handler.d.ts +55 -0
  45. package/dist/types/server/revalidate-handler.d.ts.map +1 -0
  46. package/dist/types/server/server-client.d.ts +21 -0
  47. package/dist/types/server/server-client.d.ts.map +1 -0
  48. package/dist/types/server.d.ts +19 -0
  49. package/dist/types/server.d.ts.map +1 -0
  50. package/dist/types/studio-bridge.d.ts +16 -0
  51. package/dist/types/studio-bridge.d.ts.map +1 -0
  52. package/dist/types/studio-connect.d.ts +27 -0
  53. package/dist/types/studio-connect.d.ts.map +1 -0
  54. package/dist/types/studio-router.d.ts +50 -0
  55. package/dist/types/studio-router.d.ts.map +1 -0
  56. package/dist/types/studio-script-src.d.ts +12 -0
  57. package/dist/types/studio-script-src.d.ts.map +1 -0
  58. package/dist/types/theme-settings-store.d.ts +18 -0
  59. package/dist/types/theme-settings-store.d.ts.map +1 -0
  60. package/dist/types/translation-context.d.ts +156 -0
  61. package/dist/types/translation-context.d.ts.map +1 -0
  62. package/dist/types/translation-store.d.ts +44 -0
  63. package/dist/types/translation-store.d.ts.map +1 -0
  64. package/dist/types/types.d.ts +665 -0
  65. package/dist/types/types.d.ts.map +1 -0
  66. package/dist/types/use-weaverse-next-studio.d.ts +34 -0
  67. package/dist/types/use-weaverse-next-studio.d.ts.map +1 -0
  68. package/dist/types/utils.d.ts +12 -0
  69. package/dist/types/utils.d.ts.map +1 -0
  70. package/package.json +12 -8
  71. package/src/client.ts +102 -0
  72. package/src/hooks.ts +50 -0
  73. package/src/index.ts +153 -0
  74. package/src/item.ts +167 -0
  75. package/src/loader.ts +135 -0
  76. package/src/main.tsx +45 -0
  77. package/src/provider.tsx +225 -0
  78. package/src/registry.ts +63 -0
  79. package/src/renderer.tsx +100 -0
  80. package/src/request-info.ts +124 -0
  81. package/src/revalidate-item.ts +211 -0
  82. package/src/root-provider.tsx +182 -0
  83. package/src/runtime.ts +555 -0
  84. package/src/seo.ts +157 -0
  85. package/src/server/configs.ts +178 -0
  86. package/src/server/normalize-page-url.ts +73 -0
  87. package/src/server/revalidate-handler.ts +357 -0
  88. package/src/server/server-client.ts +728 -0
  89. package/src/server.ts +67 -0
  90. package/src/studio-bridge.tsx +82 -0
  91. package/src/studio-connect.tsx +88 -0
  92. package/src/studio-router.ts +85 -0
  93. package/src/studio-script-src.ts +128 -0
  94. package/src/theme-settings-store.ts +47 -0
  95. package/src/translation-context.tsx +299 -0
  96. package/src/translation-store.ts +69 -0
  97. package/src/types.ts +753 -0
  98. package/src/use-weaverse-next-studio.tsx +106 -0
  99. package/src/utils.ts +37 -0
  100. package/dist/chunk-6PMZ77RA.mjs.map +0 -1
  101. package/dist/index.d.mts +0 -580
  102. package/dist/index.d.ts +0 -580
  103. package/dist/seo-Dos9t22_.d.mts +0 -477
  104. package/dist/seo-Dos9t22_.d.ts +0 -477
  105. package/dist/server.d.mts +0 -99
  106. package/dist/server.d.ts +0 -99
package/dist/index.js CHANGED
@@ -54,6 +54,7 @@ var WeaverseNextItem = class extends react.WeaverseItemStore {
54
54
  _cachedSnapshot = null;
55
55
  _snapshotStoreRef = null;
56
56
  _snapshotTranslationRef = null;
57
+ /** Create an item store from serialized component data and its runtime. */
57
58
  constructor(initialData, weaverse) {
58
59
  super(initialData, weaverse);
59
60
  let schemaData = generateDataFromSchema(this.Element?.schema);
@@ -62,15 +63,31 @@ var WeaverseNextItem = class extends react.WeaverseItemStore {
62
63
  /**
63
64
  * Flatten nested `data` on updates exactly like the constructor does. Core's
64
65
  * `initProject()` calls `setData(item)` when a new runtime serves a page
65
- * whose item instances already exist (e.g. locale/client navigation), and
66
- * the inherited shallow merge would leave stale top-level props behind.
67
- * Assigning through the inherited `data` setter swaps the `_store` ref,
68
- * which invalidates the memoized snapshot below. The subscriber emit is
69
- * queued instead of fired when a render-phase deferral is active (see
70
- * `collectDeferredItemUpdates`).
66
+ * whose item instances already exist (e.g. locale/client navigation).
67
+ *
68
+ * A complete serialized item (it carries `id` and `type`; core's
69
+ * `initProject()` always passes one) replaces the store the way the
70
+ * constructor builds it: the schema defaults of the item's own `type` — the
71
+ * Builder can replace a section in place, keeping its id — then the item's
72
+ * settings. A payload omits a setting — or the whole optional `data` — when
73
+ * its value equals the schema default, so merging into the previous store
74
+ * would keep the previous locale's value visible. Partial updates still
75
+ * merge. Either way the `_store` ref changes, which invalidates the memoized
76
+ * snapshot below. The subscriber emit is queued instead of fired when a
77
+ * render-phase deferral is active (see `collectDeferredItemUpdates`).
71
78
  */
72
79
  setData = (update) => {
73
- this.data = flattenItemData(update);
80
+ if ("id" in update && "type" in update) {
81
+ let { data, type } = update;
82
+ let schema = this.weaverse.elementRegistry.get(type)?.schema;
83
+ this._store = {
84
+ ...generateDataFromSchema(schema),
85
+ ...data === void 0 ? {} : { data },
86
+ ...flattenItemData(update)
87
+ };
88
+ } else {
89
+ this.data = flattenItemData(update);
90
+ }
74
91
  if (deferredItemUpdates) {
75
92
  deferredItemUpdates.add(this);
76
93
  } else {
@@ -319,18 +336,24 @@ var useThemeText = useTranslation;
319
336
 
320
337
  // src/translation-store.ts
321
338
  var TranslationStore = class {
339
+ /** Current flat translation overrides keyed by dot path. */
322
340
  overrides = {};
323
341
  listeners = /* @__PURE__ */ new Set();
342
+ /** Replace every override and notify subscribers. */
324
343
  setOverrides = (overrides) => {
325
344
  this.overrides = { ...overrides };
326
345
  this.emit();
327
346
  };
347
+ /** Merge changed overrides into the current values and notify subscribers. */
328
348
  updateOverrides = (newOverrides) => {
329
349
  this.overrides = { ...this.overrides, ...newOverrides };
330
350
  this.emit();
331
351
  };
352
+ /** Return the current client-side override snapshot. */
332
353
  getSnapshot = () => this.overrides;
354
+ /** Return the override snapshot used during server rendering. */
333
355
  getServerSnapshot = () => this.overrides;
356
+ /** Subscribe to override changes and return an unsubscribe function. */
334
357
  subscribe = (callback) => {
335
358
  this.listeners.add(callback);
336
359
  return () => {
@@ -601,13 +624,22 @@ function getSearchParamsFromContext(context) {
601
624
  }
602
625
  return new URLSearchParams();
603
626
  }
627
+ function withPathPrefix(pathname, i18n) {
628
+ let raw = typeof i18n?.pathPrefix === "string" ? i18n.pathPrefix : "";
629
+ let segments = raw.split("/").filter(Boolean);
630
+ let prefix = segments.length > 0 ? `/${segments.join("/")}` : "";
631
+ if (prefix === "" || pathname === prefix || pathname.startsWith(`${prefix}/`)) {
632
+ return pathname;
633
+ }
634
+ return pathname === "/" ? prefix : `${prefix}${pathname}`;
635
+ }
604
636
  function getPathnameFromContext(context) {
605
637
  if (context?.pathname) {
606
- return context.pathname;
638
+ return withPathPrefix(context.pathname, context.i18n);
607
639
  }
608
640
  if (context?.url) {
609
641
  let url = toUrl(context.url);
610
- return url.pathname || "/";
642
+ return withPathPrefix(url.pathname || "/", context.i18n);
611
643
  }
612
644
  return "/";
613
645
  }
@@ -648,7 +680,9 @@ function buildWeaverseNextRequestInfo(context) {
648
680
  pathname: getPathnameFromContext(context),
649
681
  search: search ? `?${search}` : "",
650
682
  queries: toQueryRecord(searchParams),
651
- ...context?.i18n ? { i18n: context.i18n } : {}
683
+ ...context?.i18n ? { i18n: context.i18n } : {},
684
+ ...context?.pageType ? { pageType: context.pageType } : {},
685
+ ...context?.handle ? { handle: context.handle } : {}
652
686
  };
653
687
  }
654
688
 
@@ -665,6 +699,12 @@ function getConfigString(configs, key) {
665
699
  let value = configs?.[key];
666
700
  return typeof value === "string" ? value : void 0;
667
701
  }
702
+ function resolveModeFlag(config, key) {
703
+ return config.client?.requestContext?.[key] === true || config.data.configs?.[key] === true;
704
+ }
705
+ function resolveSectionType(config) {
706
+ return config.client?.requestContext?.sectionType || getConfigString(config.data.configs, "sectionType") || void 0;
707
+ }
668
708
  function getRecordString(record, key) {
669
709
  let value = record?.[key];
670
710
  return typeof value === "string" ? value : void 0;
@@ -701,12 +741,30 @@ function registerRuntime(runtime) {
701
741
  runtimeWindow.__weaverses[runtime.pageId] = runtime;
702
742
  runtimeWindow.__weaverse = runtime;
703
743
  }
744
+ function rebindPageItemsToRuntime(runtime) {
745
+ let items = runtime.data?.items;
746
+ if (!items) {
747
+ return;
748
+ }
749
+ for (let { id } of items) {
750
+ let instance = runtime.itemInstances.get(id);
751
+ if (instance && instance.weaverse !== runtime) {
752
+ instance.weaverse = runtime;
753
+ }
754
+ }
755
+ }
704
756
  var WeaverseNextRuntime = class extends react.Weaverse {
757
+ /** Stable ID of the page owned by this runtime. */
705
758
  pageId;
759
+ /** Mutable callbacks and stores consumed by the Studio bridge. */
706
760
  internal;
761
+ /** Path, query, and locale metadata for Studio navigation. */
707
762
  requestInfo;
763
+ /** Whether this runtime renders a component preview. */
708
764
  isPreviewMode;
765
+ /** Whether this runtime renders a saved revision. */
709
766
  isRevisionPreview;
767
+ /** Component type rendered in section preview mode. */
710
768
  sectionType;
711
769
  // ─── Item-level translation sidecar (design mode only) ─────────────
712
770
  /**
@@ -715,7 +773,9 @@ var WeaverseNextRuntime = class extends react.Weaverse {
715
773
  * components, so translations render without mutating the base `_store`.
716
774
  */
717
775
  translationMap = {};
776
+ /** Locale associated with the item-level translation sidecar. */
718
777
  translationLocale = String();
778
+ /** Weaverse language ID used when saving translation changes. */
719
779
  translationLanguageId = String();
720
780
  /**
721
781
  * Fresh page data captured while React was rendering. Runtime reuse happens
@@ -733,27 +793,32 @@ var WeaverseNextRuntime = class extends react.Weaverse {
733
793
  * deferred to `flushRenderPhaseUpdates()`.
734
794
  */
735
795
  pendingItemUpdates = [];
796
+ /** Create a browser runtime from a loaded page and its request context. */
736
797
  constructor(config) {
737
798
  let { client, data } = config;
738
799
  let page = getRenderablePage(data);
739
800
  let configs = data.configs;
740
801
  let requestContext = client?.requestContext;
802
+ let isDesignMode = resolveModeFlag(config, "isDesignMode");
803
+ let isPreviewMode = resolveModeFlag(config, "isPreviewMode");
804
+ let isRevisionPreview = resolveModeFlag(config, "isRevisionPreview");
805
+ let sectionType = resolveSectionType(config);
741
806
  let projectId = resolveProjectId(client, data, page.id);
742
807
  ensureNextItemConstructor();
743
808
  super({
744
809
  projectId,
745
810
  data: page,
746
- isDesignMode: requestContext?.isDesignMode ?? false,
811
+ isDesignMode,
747
812
  weaverseHost: getConfigString(configs, "weaverseHost"),
748
813
  weaverseVersion: getConfigString(configs, "weaverseVersion")
749
814
  });
750
815
  this.pageId = page.id;
751
816
  this.dataContext = resolveDataContext(config);
752
817
  this.requestInfo = buildWeaverseNextRequestInfo(requestContext);
753
- this.isDesignMode = requestContext?.isDesignMode ?? false;
754
- this.isPreviewMode = requestContext?.isPreviewMode ?? false;
755
- this.isRevisionPreview = requestContext?.isRevisionPreview ?? false;
756
- this.sectionType = requestContext?.sectionType;
818
+ this.isDesignMode = isDesignMode;
819
+ this.isPreviewMode = isPreviewMode;
820
+ this.isRevisionPreview = isRevisionPreview;
821
+ this.sectionType = sectionType;
757
822
  let translationStore = config.translationStore ?? new TranslationStore();
758
823
  this.internal = {
759
824
  merchantOverrides: config.merchantOverrides,
@@ -885,7 +950,11 @@ function createWeaverseNextRuntime(config) {
885
950
  let existing = runtimeWindow?.__weaverses?.[page.id];
886
951
  let requestKey = getRuntimeKey(page.id, requestInfo);
887
952
  if (existing?.__weaverseNextRequestKey === requestKey) {
888
- let nextIsDesignMode = config.client?.requestContext?.isDesignMode ?? false;
953
+ let configs = config.data.configs;
954
+ let nextIsDesignMode = resolveModeFlag(config, "isDesignMode");
955
+ let nextIsPreviewMode = resolveModeFlag(config, "isPreviewMode");
956
+ let nextIsRevisionPreview = resolveModeFlag(config, "isRevisionPreview");
957
+ let nextSectionType = resolveSectionType(config);
889
958
  if (existing.isDesignMode || nextIsDesignMode) {
890
959
  existing.pendingProjectData = void 0;
891
960
  } else {
@@ -896,11 +965,11 @@ function createWeaverseNextRuntime(config) {
896
965
  existing.requestInfo = requestInfo;
897
966
  existing.projectId = resolveProjectId(config.client, config.data, page.id);
898
967
  existing.isDesignMode = nextIsDesignMode;
899
- existing.isPreviewMode = config.client?.requestContext?.isPreviewMode ?? false;
900
- existing.isRevisionPreview = config.client?.requestContext?.isRevisionPreview ?? false;
901
- existing.sectionType = config.client?.requestContext?.sectionType;
902
- existing.weaverseHost = getConfigString(config.data.configs, "weaverseHost") ?? existing.weaverseHost;
903
- existing.weaverseVersion = getConfigString(config.data.configs, "weaverseVersion") ?? existing.weaverseVersion;
968
+ existing.isPreviewMode = nextIsPreviewMode;
969
+ existing.isRevisionPreview = nextIsRevisionPreview;
970
+ existing.sectionType = nextSectionType;
971
+ existing.weaverseHost = getConfigString(configs, "weaverseHost") ?? existing.weaverseHost;
972
+ existing.weaverseVersion = getConfigString(configs, "weaverseVersion") ?? existing.weaverseVersion;
904
973
  existing.internal.pageAssignment = config.data.pageAssignment;
905
974
  existing.internal.project = config.data.project;
906
975
  if (config.navigate) {
@@ -924,6 +993,7 @@ function createWeaverseNextRuntime(config) {
924
993
  () => new WeaverseNextRuntime(config)
925
994
  );
926
995
  runtime.pendingItemUpdates = refreshedItems;
996
+ rebindPageItemsToRuntime(runtime);
927
997
  runtime.__weaverseNextRequestKey = requestKey;
928
998
  runtime.__weaverseNextLatestData = page;
929
999
  registerRuntime(runtime);
@@ -938,7 +1008,10 @@ function bindWeaverseNextStudioRuntime(runtime) {
938
1008
  return false;
939
1009
  }
940
1010
  let boundRuntime = runtime;
941
- if (!boundRuntime.__weaverseNextStudioBound) {
1011
+ let activeRuntime = studio.weaverse;
1012
+ let activeRequestInfo = activeRuntime?.requestInfo;
1013
+ let isActiveUrl = !activeRequestInfo || activeRequestInfo.pathname === runtime.requestInfo.pathname && activeRequestInfo.search === runtime.requestInfo.search;
1014
+ if (!(boundRuntime.__weaverseNextStudioBound && isActiveUrl)) {
942
1015
  studio.init?.(runtime);
943
1016
  boundRuntime.__weaverseNextStudioBound = true;
944
1017
  return true;
@@ -950,9 +1023,67 @@ function bindWeaverseNextStudioRuntime(runtime) {
950
1023
  });
951
1024
  return true;
952
1025
  }
953
-
954
- // src/revalidate-item.ts
955
1026
  var DEFAULT_REVALIDATE_ENDPOINT = "/api/weaverse/revalidate";
1027
+ var MAX_ROUTE_CONTEXT_HANDLE_LENGTH = 512;
1028
+ var DENIED_ROUTE_CONTEXT_PARAMS = [
1029
+ "weaverseprojectid",
1030
+ "weaversehost",
1031
+ "weaverseapikey",
1032
+ "weaverseapibase",
1033
+ "weaversepublicapibase",
1034
+ "weaverseversion",
1035
+ "projectid",
1036
+ "weaversedraftitem",
1037
+ "__weaversedraftitem",
1038
+ "_rsc"
1039
+ ];
1040
+ var ROUTE_CONTEXT_I18N_KEYS = [
1041
+ "country",
1042
+ "label",
1043
+ "language",
1044
+ "locale",
1045
+ "pathPrefix"
1046
+ ];
1047
+ function sanitizeRouteContextSearch(search) {
1048
+ let params = new URLSearchParams(search);
1049
+ let denied = new Set(DENIED_ROUTE_CONTEXT_PARAMS);
1050
+ for (let key of [...new Set(params.keys())]) {
1051
+ if (denied.has(key.toLowerCase())) {
1052
+ params.delete(key);
1053
+ }
1054
+ }
1055
+ let serialized = params.toString();
1056
+ return serialized ? `?${serialized}` : "";
1057
+ }
1058
+ function buildWeaverseNextRevalidateRouteContext(requestInfo) {
1059
+ if (!requestInfo || typeof requestInfo.pathname !== "string" || !requestInfo.pathname) {
1060
+ return;
1061
+ }
1062
+ let routeContext = {
1063
+ pathname: requestInfo.pathname,
1064
+ search: sanitizeRouteContextSearch(requestInfo.search ?? "")
1065
+ };
1066
+ let { i18n } = requestInfo;
1067
+ if (i18n && typeof i18n === "object") {
1068
+ let picked = {};
1069
+ for (let key of ROUTE_CONTEXT_I18N_KEYS) {
1070
+ let value = i18n[key];
1071
+ if (typeof value === "string") {
1072
+ picked[key] = value;
1073
+ }
1074
+ }
1075
+ if (Object.keys(picked).length) {
1076
+ routeContext.i18n = picked;
1077
+ }
1078
+ }
1079
+ if (requestInfo.pageType && schema.PageTypeSchema.safeParse(requestInfo.pageType).success) {
1080
+ routeContext.pageType = requestInfo.pageType;
1081
+ }
1082
+ if (typeof requestInfo.handle === "string" && requestInfo.handle && requestInfo.handle.length <= MAX_ROUTE_CONTEXT_HANDLE_LENGTH) {
1083
+ routeContext.handle = requestInfo.handle;
1084
+ }
1085
+ return routeContext;
1086
+ }
956
1087
  async function revalidateWeaverseNextItem(runtime, draftItem, endpoint = DEFAULT_REVALIDATE_ENDPOINT) {
957
1088
  let instance = runtime.itemInstances.get(draftItem.id);
958
1089
  if (!instance) {
@@ -960,10 +1091,14 @@ async function revalidateWeaverseNextItem(runtime, draftItem, endpoint = DEFAULT
960
1091
  `[weaverse-next] No live item instance for "${draftItem.id}".`
961
1092
  );
962
1093
  }
1094
+ let routeContext = buildWeaverseNextRevalidateRouteContext(
1095
+ runtime.requestInfo
1096
+ );
1097
+ let body = routeContext ? { draftItem, routeContext } : { draftItem };
963
1098
  let response = await fetch(endpoint, {
964
1099
  method: "POST",
965
1100
  headers: { "Content-Type": "application/json" },
966
- body: JSON.stringify({ draftItem })
1101
+ body: JSON.stringify(body)
967
1102
  });
968
1103
  if (!response.ok) {
969
1104
  throw new Error(
@@ -1131,6 +1266,15 @@ function hasOpenGraphContent(seo) {
1131
1266
  function hasTwitterContent(seo) {
1132
1267
  return Boolean(seo?.title || seo?.description || seo?.image || seo?.cardType);
1133
1268
  }
1269
+ function normalizeTwitterCard(cardType) {
1270
+ return cardType === "summary_large_image" ? "summary_large_image" : "summary";
1271
+ }
1272
+ function normalizeOpenGraphType(type) {
1273
+ if (type === "article" || type === "profile" || type === "video.other") {
1274
+ return type;
1275
+ }
1276
+ return "website";
1277
+ }
1134
1278
  function formatWeaverseNextSeoMetadata(seo) {
1135
1279
  let index = seo?.robots?.index !== false;
1136
1280
  let follow = seo?.robots?.follow !== false;
@@ -1158,13 +1302,13 @@ function formatWeaverseNextSeoMetadata(seo) {
1158
1302
  title: openGraph?.title,
1159
1303
  description: openGraph?.description,
1160
1304
  images: openGraph?.image ? [openGraph.image] : void 0,
1161
- type: openGraph?.type || "website"
1305
+ type: normalizeOpenGraphType(openGraph?.type)
1162
1306
  };
1163
1307
  }
1164
1308
  let twitter = seo.twitter;
1165
1309
  if (hasTwitterContent(twitter)) {
1166
1310
  metadata.twitter = {
1167
- card: twitter?.cardType || "summary",
1311
+ card: normalizeTwitterCard(twitter?.cardType),
1168
1312
  title: twitter?.title,
1169
1313
  description: twitter?.description,
1170
1314
  images: twitter?.image ? [twitter.image] : void 0
@@ -1243,7 +1387,7 @@ function resolveWeaverseNextStudioScriptSrc(context, options = {}) {
1243
1387
  if (!isTrustedStudioOrigin(origin, storefrontHostname)) {
1244
1388
  return null;
1245
1389
  }
1246
- let bundle = isDesignMode ? "index.js" : "preview.js";
1390
+ let bundle = isPreviewMode || isRevisionPreview ? "preview.js" : "index.js";
1247
1391
  let version = last(searchParams, "weaverseVersion");
1248
1392
  let url = `${origin}/static/studio/next/${bundle}`;
1249
1393
  return version ? `${url}?v=${encodeURIComponent(version)}` : url;
@@ -1317,10 +1461,6 @@ Object.defineProperty(exports, "useWeaverse", {
1317
1461
  enumerable: true,
1318
1462
  get: function () { return react.useWeaverse; }
1319
1463
  });
1320
- Object.defineProperty(exports, "createSchema", {
1321
- enumerable: true,
1322
- get: function () { return schema.createSchema; }
1323
- });
1324
1464
  exports.DEFAULT_REVALIDATE_ENDPOINT = DEFAULT_REVALIDATE_ENDPOINT;
1325
1465
  exports.ThemeTextProvider = ThemeTextProvider;
1326
1466
  exports.ThemeTextStore = ThemeTextStore;
@@ -1335,12 +1475,14 @@ exports.WeaverseNextStudioBridge = WeaverseNextStudioBridge;
1335
1475
  exports.WeaverseNextStudioConnect = WeaverseNextStudioConnect;
1336
1476
  exports.bindWeaverseNextStudioRuntime = bindWeaverseNextStudioRuntime;
1337
1477
  exports.buildWeaverseNextRequestInfo = buildWeaverseNextRequestInfo;
1478
+ exports.buildWeaverseNextRevalidateRouteContext = buildWeaverseNextRevalidateRouteContext;
1338
1479
  exports.createTranslate = createTranslate;
1339
1480
  exports.createWeaverseNextClient = createWeaverseNextClient;
1340
1481
  exports.createWeaverseNextRuntime = createWeaverseNextRuntime;
1341
1482
  exports.createWeaverseNextStudioInternals = createWeaverseNextStudioInternals;
1342
1483
  exports.createWeaverseNextThemeSettingsStore = createWeaverseNextThemeSettingsStore;
1343
1484
  exports.formatWeaverseNextSeoMetadata = formatWeaverseNextSeoMetadata;
1485
+ exports.generateDataFromSchema = generateDataFromSchema;
1344
1486
  exports.getNestedKey = getNestedKey;
1345
1487
  exports.getWeaverseNextSeoMetadata = getWeaverseNextSeoMetadata;
1346
1488
  exports.interpolate = interpolate;
@@ -1355,5 +1497,11 @@ exports.useWeaverseCommerce = useWeaverseCommerce;
1355
1497
  exports.useWeaverseNextStudioInternals = useWeaverseNextStudioInternals;
1356
1498
  exports.useWeaversePageData = useWeaversePageData;
1357
1499
  exports.useWeaverseRootData = useWeaverseRootData;
1500
+ Object.keys(schema).forEach(function (k) {
1501
+ if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
1502
+ enumerable: true,
1503
+ get: function () { return schema[k]; }
1504
+ });
1505
+ });
1358
1506
  //# sourceMappingURL=index.js.map
1359
1507
  //# sourceMappingURL=index.js.map