@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.mjs CHANGED
@@ -1,9 +1,9 @@
1
- import { buildWeaverseNextRequestInfo, generateDataFromSchema } from './chunk-6PMZ77RA.mjs';
2
- export { buildWeaverseNextRequestInfo, formatWeaverseNextSeoMetadata, getWeaverseNextSeoMetadata, runWeaverseComponentLoaders } from './chunk-6PMZ77RA.mjs';
1
+ import { buildWeaverseNextRequestInfo, DEFAULT_REVALIDATE_ENDPOINT, revalidateWeaverseNextItem, generateDataFromSchema } from './chunk-LH6AAEIK.mjs';
2
+ export { DEFAULT_REVALIDATE_ENDPOINT, buildWeaverseNextRequestInfo, buildWeaverseNextRevalidateRouteContext, formatWeaverseNextSeoMetadata, generateDataFromSchema, getWeaverseNextSeoMetadata, revalidateWeaverseNextItem, runWeaverseComponentLoaders } from './chunk-LH6AAEIK.mjs';
3
3
  import { WeaverseRoot, Weaverse, WeaverseItemStore, useSafeExternalStore } from '@weaverse/react';
4
4
  export { isBrowser, isIframe, useChildInstances, useItemInstance, useParentInstance, useWeaverse } from '@weaverse/react';
5
5
  import { createSchema } from '@weaverse/schema';
6
- export { createSchema } from '@weaverse/schema';
6
+ export * from '@weaverse/schema';
7
7
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
8
8
  import { createContext, memo, useContext, useMemo, useEffect, useLayoutEffect, useRef, useSyncExternalStore } from 'react';
9
9
  import { useRouter } from 'next/navigation';
@@ -35,6 +35,7 @@ var WeaverseNextItem = class extends WeaverseItemStore {
35
35
  _cachedSnapshot = null;
36
36
  _snapshotStoreRef = null;
37
37
  _snapshotTranslationRef = null;
38
+ /** Create an item store from serialized component data and its runtime. */
38
39
  constructor(initialData, weaverse) {
39
40
  super(initialData, weaverse);
40
41
  let schemaData = generateDataFromSchema(this.Element?.schema);
@@ -43,15 +44,31 @@ var WeaverseNextItem = class extends WeaverseItemStore {
43
44
  /**
44
45
  * Flatten nested `data` on updates exactly like the constructor does. Core's
45
46
  * `initProject()` calls `setData(item)` when a new runtime serves a page
46
- * whose item instances already exist (e.g. locale/client navigation), and
47
- * the inherited shallow merge would leave stale top-level props behind.
48
- * Assigning through the inherited `data` setter swaps the `_store` ref,
49
- * which invalidates the memoized snapshot below. The subscriber emit is
50
- * queued instead of fired when a render-phase deferral is active (see
51
- * `collectDeferredItemUpdates`).
47
+ * whose item instances already exist (e.g. locale/client navigation).
48
+ *
49
+ * A complete serialized item (it carries `id` and `type`; core's
50
+ * `initProject()` always passes one) replaces the store the way the
51
+ * constructor builds it: the schema defaults of the item's own `type` — the
52
+ * Builder can replace a section in place, keeping its id — then the item's
53
+ * settings. A payload omits a setting — or the whole optional `data` — when
54
+ * its value equals the schema default, so merging into the previous store
55
+ * would keep the previous locale's value visible. Partial updates still
56
+ * merge. Either way the `_store` ref changes, which invalidates the memoized
57
+ * snapshot below. The subscriber emit is queued instead of fired when a
58
+ * render-phase deferral is active (see `collectDeferredItemUpdates`).
52
59
  */
53
60
  setData = (update) => {
54
- this.data = flattenItemData(update);
61
+ if ("id" in update && "type" in update) {
62
+ let { data, type } = update;
63
+ let schema = this.weaverse.elementRegistry.get(type)?.schema;
64
+ this._store = {
65
+ ...generateDataFromSchema(schema),
66
+ ...data === void 0 ? {} : { data },
67
+ ...flattenItemData(update)
68
+ };
69
+ } else {
70
+ this.data = flattenItemData(update);
71
+ }
55
72
  if (deferredItemUpdates) {
56
73
  deferredItemUpdates.add(this);
57
74
  } else {
@@ -300,18 +317,24 @@ var useThemeText = useTranslation;
300
317
 
301
318
  // src/translation-store.ts
302
319
  var TranslationStore = class {
320
+ /** Current flat translation overrides keyed by dot path. */
303
321
  overrides = {};
304
322
  listeners = /* @__PURE__ */ new Set();
323
+ /** Replace every override and notify subscribers. */
305
324
  setOverrides = (overrides) => {
306
325
  this.overrides = { ...overrides };
307
326
  this.emit();
308
327
  };
328
+ /** Merge changed overrides into the current values and notify subscribers. */
309
329
  updateOverrides = (newOverrides) => {
310
330
  this.overrides = { ...this.overrides, ...newOverrides };
311
331
  this.emit();
312
332
  };
333
+ /** Return the current client-side override snapshot. */
313
334
  getSnapshot = () => this.overrides;
335
+ /** Return the override snapshot used during server rendering. */
314
336
  getServerSnapshot = () => this.overrides;
337
+ /** Subscribe to override changes and return an unsubscribe function. */
315
338
  subscribe = (callback) => {
316
339
  this.listeners.add(callback);
317
340
  return () => {
@@ -502,6 +525,12 @@ function getConfigString(configs, key) {
502
525
  let value = configs?.[key];
503
526
  return typeof value === "string" ? value : void 0;
504
527
  }
528
+ function resolveModeFlag(config, key) {
529
+ return config.client?.requestContext?.[key] === true || config.data.configs?.[key] === true;
530
+ }
531
+ function resolveSectionType(config) {
532
+ return config.client?.requestContext?.sectionType || getConfigString(config.data.configs, "sectionType") || void 0;
533
+ }
505
534
  function getRecordString(record, key) {
506
535
  let value = record?.[key];
507
536
  return typeof value === "string" ? value : void 0;
@@ -538,12 +567,30 @@ function registerRuntime(runtime) {
538
567
  runtimeWindow.__weaverses[runtime.pageId] = runtime;
539
568
  runtimeWindow.__weaverse = runtime;
540
569
  }
570
+ function rebindPageItemsToRuntime(runtime) {
571
+ let items = runtime.data?.items;
572
+ if (!items) {
573
+ return;
574
+ }
575
+ for (let { id } of items) {
576
+ let instance = runtime.itemInstances.get(id);
577
+ if (instance && instance.weaverse !== runtime) {
578
+ instance.weaverse = runtime;
579
+ }
580
+ }
581
+ }
541
582
  var WeaverseNextRuntime = class extends Weaverse {
583
+ /** Stable ID of the page owned by this runtime. */
542
584
  pageId;
585
+ /** Mutable callbacks and stores consumed by the Studio bridge. */
543
586
  internal;
587
+ /** Path, query, and locale metadata for Studio navigation. */
544
588
  requestInfo;
589
+ /** Whether this runtime renders a component preview. */
545
590
  isPreviewMode;
591
+ /** Whether this runtime renders a saved revision. */
546
592
  isRevisionPreview;
593
+ /** Component type rendered in section preview mode. */
547
594
  sectionType;
548
595
  // ─── Item-level translation sidecar (design mode only) ─────────────
549
596
  /**
@@ -552,7 +599,9 @@ var WeaverseNextRuntime = class extends Weaverse {
552
599
  * components, so translations render without mutating the base `_store`.
553
600
  */
554
601
  translationMap = {};
602
+ /** Locale associated with the item-level translation sidecar. */
555
603
  translationLocale = String();
604
+ /** Weaverse language ID used when saving translation changes. */
556
605
  translationLanguageId = String();
557
606
  /**
558
607
  * Fresh page data captured while React was rendering. Runtime reuse happens
@@ -570,27 +619,32 @@ var WeaverseNextRuntime = class extends Weaverse {
570
619
  * deferred to `flushRenderPhaseUpdates()`.
571
620
  */
572
621
  pendingItemUpdates = [];
622
+ /** Create a browser runtime from a loaded page and its request context. */
573
623
  constructor(config) {
574
624
  let { client, data } = config;
575
625
  let page = getRenderablePage(data);
576
626
  let configs = data.configs;
577
627
  let requestContext = client?.requestContext;
628
+ let isDesignMode = resolveModeFlag(config, "isDesignMode");
629
+ let isPreviewMode = resolveModeFlag(config, "isPreviewMode");
630
+ let isRevisionPreview = resolveModeFlag(config, "isRevisionPreview");
631
+ let sectionType = resolveSectionType(config);
578
632
  let projectId = resolveProjectId(client, data, page.id);
579
633
  ensureNextItemConstructor();
580
634
  super({
581
635
  projectId,
582
636
  data: page,
583
- isDesignMode: requestContext?.isDesignMode ?? false,
637
+ isDesignMode,
584
638
  weaverseHost: getConfigString(configs, "weaverseHost"),
585
639
  weaverseVersion: getConfigString(configs, "weaverseVersion")
586
640
  });
587
641
  this.pageId = page.id;
588
642
  this.dataContext = resolveDataContext(config);
589
643
  this.requestInfo = buildWeaverseNextRequestInfo(requestContext);
590
- this.isDesignMode = requestContext?.isDesignMode ?? false;
591
- this.isPreviewMode = requestContext?.isPreviewMode ?? false;
592
- this.isRevisionPreview = requestContext?.isRevisionPreview ?? false;
593
- this.sectionType = requestContext?.sectionType;
644
+ this.isDesignMode = isDesignMode;
645
+ this.isPreviewMode = isPreviewMode;
646
+ this.isRevisionPreview = isRevisionPreview;
647
+ this.sectionType = sectionType;
594
648
  let translationStore = config.translationStore ?? new TranslationStore();
595
649
  this.internal = {
596
650
  merchantOverrides: config.merchantOverrides,
@@ -722,7 +776,11 @@ function createWeaverseNextRuntime(config) {
722
776
  let existing = runtimeWindow?.__weaverses?.[page.id];
723
777
  let requestKey = getRuntimeKey(page.id, requestInfo);
724
778
  if (existing?.__weaverseNextRequestKey === requestKey) {
725
- let nextIsDesignMode = config.client?.requestContext?.isDesignMode ?? false;
779
+ let configs = config.data.configs;
780
+ let nextIsDesignMode = resolveModeFlag(config, "isDesignMode");
781
+ let nextIsPreviewMode = resolveModeFlag(config, "isPreviewMode");
782
+ let nextIsRevisionPreview = resolveModeFlag(config, "isRevisionPreview");
783
+ let nextSectionType = resolveSectionType(config);
726
784
  if (existing.isDesignMode || nextIsDesignMode) {
727
785
  existing.pendingProjectData = void 0;
728
786
  } else {
@@ -733,11 +791,11 @@ function createWeaverseNextRuntime(config) {
733
791
  existing.requestInfo = requestInfo;
734
792
  existing.projectId = resolveProjectId(config.client, config.data, page.id);
735
793
  existing.isDesignMode = nextIsDesignMode;
736
- existing.isPreviewMode = config.client?.requestContext?.isPreviewMode ?? false;
737
- existing.isRevisionPreview = config.client?.requestContext?.isRevisionPreview ?? false;
738
- existing.sectionType = config.client?.requestContext?.sectionType;
739
- existing.weaverseHost = getConfigString(config.data.configs, "weaverseHost") ?? existing.weaverseHost;
740
- existing.weaverseVersion = getConfigString(config.data.configs, "weaverseVersion") ?? existing.weaverseVersion;
794
+ existing.isPreviewMode = nextIsPreviewMode;
795
+ existing.isRevisionPreview = nextIsRevisionPreview;
796
+ existing.sectionType = nextSectionType;
797
+ existing.weaverseHost = getConfigString(configs, "weaverseHost") ?? existing.weaverseHost;
798
+ existing.weaverseVersion = getConfigString(configs, "weaverseVersion") ?? existing.weaverseVersion;
741
799
  existing.internal.pageAssignment = config.data.pageAssignment;
742
800
  existing.internal.project = config.data.project;
743
801
  if (config.navigate) {
@@ -761,6 +819,7 @@ function createWeaverseNextRuntime(config) {
761
819
  () => new WeaverseNextRuntime(config)
762
820
  );
763
821
  runtime.pendingItemUpdates = refreshedItems;
822
+ rebindPageItemsToRuntime(runtime);
764
823
  runtime.__weaverseNextRequestKey = requestKey;
765
824
  runtime.__weaverseNextLatestData = page;
766
825
  registerRuntime(runtime);
@@ -775,7 +834,10 @@ function bindWeaverseNextStudioRuntime(runtime) {
775
834
  return false;
776
835
  }
777
836
  let boundRuntime = runtime;
778
- if (!boundRuntime.__weaverseNextStudioBound) {
837
+ let activeRuntime = studio.weaverse;
838
+ let activeRequestInfo = activeRuntime?.requestInfo;
839
+ let isActiveUrl = !activeRequestInfo || activeRequestInfo.pathname === runtime.requestInfo.pathname && activeRequestInfo.search === runtime.requestInfo.search;
840
+ if (!(boundRuntime.__weaverseNextStudioBound && isActiveUrl)) {
779
841
  studio.init?.(runtime);
780
842
  boundRuntime.__weaverseNextStudioBound = true;
781
843
  return true;
@@ -787,29 +849,6 @@ function bindWeaverseNextStudioRuntime(runtime) {
787
849
  });
788
850
  return true;
789
851
  }
790
-
791
- // src/revalidate-item.ts
792
- var DEFAULT_REVALIDATE_ENDPOINT = "/api/weaverse/revalidate";
793
- async function revalidateWeaverseNextItem(runtime, draftItem, endpoint = DEFAULT_REVALIDATE_ENDPOINT) {
794
- let instance = runtime.itemInstances.get(draftItem.id);
795
- if (!instance) {
796
- throw new Error(
797
- `[weaverse-next] No live item instance for "${draftItem.id}".`
798
- );
799
- }
800
- let response = await fetch(endpoint, {
801
- method: "POST",
802
- headers: { "Content-Type": "application/json" },
803
- body: JSON.stringify({ draftItem })
804
- });
805
- if (!response.ok) {
806
- throw new Error(
807
- `[weaverse-next] Revalidate endpoint responded ${response.status}.`
808
- );
809
- }
810
- let { loaderData } = await response.json();
811
- instance.setData({ loaderData: loaderData ?? null });
812
- }
813
852
  var STUDIO_BIND_RETRY_INTERVAL_MS = 50;
814
853
  var STUDIO_BIND_MAX_ATTEMPTS = 100;
815
854
  function WeaverseNextStudioBridge(props) {
@@ -1024,7 +1063,7 @@ function resolveWeaverseNextStudioScriptSrc(context, options = {}) {
1024
1063
  if (!isTrustedStudioOrigin(origin, storefrontHostname)) {
1025
1064
  return null;
1026
1065
  }
1027
- let bundle = isDesignMode ? "index.js" : "preview.js";
1066
+ let bundle = isPreviewMode || isRevisionPreview ? "preview.js" : "index.js";
1028
1067
  let version = last(searchParams, "weaverseVersion");
1029
1068
  let url = `${origin}/static/studio/next/${bundle}`;
1030
1069
  return version ? `${url}?v=${encodeURIComponent(version)}` : url;
@@ -1074,6 +1113,6 @@ function WeaverseNextStudioConnect(props) {
1074
1113
  return null;
1075
1114
  }
1076
1115
 
1077
- export { DEFAULT_REVALIDATE_ENDPOINT, ThemeTextProvider, ThemeTextStore, TranslationProvider, TranslationStore, WeaverseNextProvider, WeaverseNextRenderer, WeaverseNextRootProvider, WeaverseNextRuntime, WeaverseNextStudio, WeaverseNextStudioBridge, WeaverseNextStudioConnect, bindWeaverseNextStudioRuntime, createTranslate, createWeaverseNextClient, createWeaverseNextRuntime, createWeaverseNextStudioInternals, createWeaverseNextThemeSettingsStore, getNestedKey, interpolate, loadWeaverseNextStudioScript, resolveWeaverseNextStudioScriptSrc, revalidateWeaverseNextItem, useThemeSettings, useThemeText, useTranslation, useWeaverseCommerce, useWeaverseNextStudioInternals, useWeaversePageData, useWeaverseRootData };
1116
+ export { ThemeTextProvider, ThemeTextStore, TranslationProvider, TranslationStore, WeaverseNextProvider, WeaverseNextRenderer, WeaverseNextRootProvider, WeaverseNextRuntime, WeaverseNextStudio, WeaverseNextStudioBridge, WeaverseNextStudioConnect, bindWeaverseNextStudioRuntime, createTranslate, createWeaverseNextClient, createWeaverseNextRuntime, createWeaverseNextStudioInternals, createWeaverseNextThemeSettingsStore, getNestedKey, interpolate, loadWeaverseNextStudioScript, resolveWeaverseNextStudioScriptSrc, useThemeSettings, useThemeText, useTranslation, useWeaverseCommerce, useWeaverseNextStudioInternals, useWeaversePageData, useWeaverseRootData };
1078
1117
  //# sourceMappingURL=index.mjs.map
1079
1118
  //# sourceMappingURL=index.mjs.map