@weaverse/hydrogen 1.0.55 → 1.0.57

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.d.mts CHANGED
@@ -3,6 +3,22 @@ import { LoaderArgs, AppLoadContext } from '@shopify/remix-oxygen';
3
3
  import { ElementData, ElementSchema, BasicInput, WeaverseElement, Weaverse, WeaverseItemStore } from '@weaverse/react';
4
4
  export * from '@weaverse/react';
5
5
 
6
+ declare let STORE_PAGES: {
7
+ INDEX: string;
8
+ PRODUCT: string;
9
+ COLLECTION: string;
10
+ COLLECTION_LIST: string;
11
+ PAGE: string;
12
+ BLOG: string;
13
+ ARTICLE: string;
14
+ CART: string;
15
+ CUSTOMER: string;
16
+ NOT_FOUND: string;
17
+ PASSWORD: string;
18
+ SEARCH: string;
19
+ CUSTOM: string;
20
+ };
21
+
6
22
  type TODO = any;
7
23
  declare module '@shopify/remix-oxygen' {
8
24
  interface AppLoadContext {
@@ -28,8 +44,7 @@ interface HydrogenComponentData extends Omit<ElementData, 'childIds' | 'css'> {
28
44
  children: {
29
45
  id: string;
30
46
  }[];
31
- loaderData: unknown;
32
- data: Record<string, unknown>;
47
+ data: Record<string, any>;
33
48
  }
34
49
  interface HydrogenComponentSchema extends Omit<ElementSchema, 'parentTypes' | 'flags' | 'inspector' | 'gridSize' | 'childElements' | 'catalog'> {
35
50
  childTypes?: string[];
@@ -45,21 +60,40 @@ interface HydrogenComponentProps<L = any> extends WeaverseElement {
45
60
  loaderData?: L;
46
61
  children?: React.JSX.Element[];
47
62
  }
48
- interface WeaverseHydrogen extends Omit<Weaverse, 'itemInstances' | 'elementInstances' | 'registerElement'> {
63
+ type WeaverseLoaderRequestInfo = {
64
+ params: any;
65
+ pathname: string;
66
+ search: string;
67
+ };
68
+ interface WeaverseHydrogen extends Omit<Weaverse, 'itemInstances' | 'elementInstances' | 'registerElement' | 'data'> {
49
69
  itemInstances: Map<string | number, HydrogenComponentInstance>;
50
70
  elementInstances: Map<string, HydrogenElement>;
51
71
  registerElement(element: HydrogenElement): void;
52
72
  internal: WeaverseInternal;
73
+ data: WeaverseStorefrontData;
74
+ requestInfo: WeaverseLoaderRequestInfo;
53
75
  }
76
+ type WeaverseStorefrontData = {
77
+ id?: string;
78
+ rootId: string;
79
+ name: string;
80
+ items: HydrogenComponentData[];
81
+ };
82
+ type HydrogenProjectConfig = {
83
+ theme: Record<string, any>;
84
+ };
85
+ type HydrogenProjectType = {
86
+ id: string;
87
+ weaverseShopId: string;
88
+ name: string;
89
+ config: HydrogenProjectConfig;
90
+ [key: string]: any;
91
+ };
54
92
  type WeaverseInternal = {
55
93
  themeSchema: HydrogenThemeSchema;
56
- pageAssignment: any;
57
- project: {
58
- config: {
59
- theme: Record<string, any>;
60
- };
61
- [key: string]: any;
62
- };
94
+ pageAssignment: HydrogenPageAssignment;
95
+ project: HydrogenProjectType;
96
+ navigate: NavigateFunction;
63
97
  };
64
98
  type HydrogenComponentPresets = {
65
99
  type: string;
@@ -86,18 +120,56 @@ type HydrogenPageConfigs = {
86
120
  weaverseHost: string;
87
121
  version?: string;
88
122
  isDesignMode?: boolean;
123
+ requestInfo: WeaverseLoaderRequestInfo;
89
124
  [key: string]: any;
90
125
  };
91
- interface HydrogenPageData {
126
+ type HydrogenPageAssignment = {
127
+ projectId: string;
128
+ type: PageType;
129
+ handle: string;
130
+ locale: string;
131
+ };
132
+ interface WeaverseLoaderData {
92
133
  configs: HydrogenPageConfigs;
93
- page: any;
94
- project: any;
95
- pageAssignment: any;
134
+ page: HydrogenPageData;
135
+ project: HydrogenProjectType;
136
+ pageAssignment: HydrogenPageAssignment;
96
137
  }
138
+ type HydrogenPageData = {
139
+ id: string;
140
+ name: string;
141
+ rootId: string;
142
+ items: HydrogenComponentData[];
143
+ [key: string]: any;
144
+ };
145
+ type RelativeRoutingType = 'route' | 'path';
146
+ type To = string | Partial<Path>;
147
+ type Path = {
148
+ /**
149
+ * A URL pathname, beginning with a /.
150
+ */
151
+ pathname: string;
152
+ /**
153
+ * A URL search string, beginning with a ?.
154
+ */
155
+ search: string;
156
+ /**
157
+ * A URL fragment identifier, beginning with a #.
158
+ */
159
+ hash: string;
160
+ };
161
+ type NavigateOptions = {
162
+ replace?: boolean;
163
+ state?: any;
164
+ preventScrollReset?: boolean;
165
+ relative?: RelativeRoutingType;
166
+ };
167
+ type NavigateFunction = (to: To, options?: NavigateOptions) => void;
97
168
  interface WeaverseHydrogenRootProps {
98
- weaverseData: HydrogenPageData;
169
+ weaverseData: WeaverseLoaderData;
99
170
  components: HydrogenComponent[];
100
171
  themeSchema: HydrogenThemeSchema;
172
+ navigate: NavigateFunction;
101
173
  }
102
174
  type HydrogenThemeInfo = {
103
175
  name: string;
@@ -110,26 +182,27 @@ interface HydrogenThemeSchema {
110
182
  info: HydrogenThemeInfo;
111
183
  inspector: InspectorGroup[];
112
184
  }
113
- type PageType = (typeof PageType)[keyof typeof PageType];
185
+ type PageType = keyof typeof STORE_PAGES;
114
186
  type WeaverseLoaderConfigs = {
115
- language?: string;
116
- type?: PageType;
187
+ type: PageType;
188
+ locale?: string;
117
189
  handle?: string;
118
190
  };
119
191
 
120
- declare function useThemeSettings(): any[];
192
+ declare function useThemeSettings(): (Record<string, any> | ((newSettings: any) => void))[];
121
193
 
194
+ type FetchWithServerCacheParams = {
195
+ url: string;
196
+ options?: RequestInit | Request;
197
+ context: AppLoadContext;
198
+ };
122
199
  /**
123
200
  * Fetch with server cache requires a storefront.cache instance which is Cloudflare Cache and a waitUntil function, otherwise it will just fetch the url.
124
201
  */
125
- declare let fetchWithServerCache: ({ url, options, context, }: {
126
- url: string;
127
- options?: Request | RequestInit | undefined;
128
- context: AppLoadContext;
129
- }) => Promise<any>;
202
+ declare function fetchWithServerCache(params: FetchWithServerCacheParams): Promise<any>;
130
203
 
131
- declare function weaverseLoader(args: LoaderArgs, components: HydrogenComponent[], loaderConfigs?: WeaverseLoaderConfigs): Promise<HydrogenPageData | null>;
204
+ declare function weaverseLoader(args: LoaderArgs, components: HydrogenComponent[], loaderConfigs?: WeaverseLoaderConfigs): Promise<WeaverseLoaderData | null>;
132
205
 
133
206
  declare function WeaverseHydrogenRoot(props: WeaverseHydrogenRootProps): React.JSX.Element;
134
207
 
135
- export { HydrogenComponent, HydrogenComponentData, HydrogenComponentInstance, HydrogenComponentPresets, HydrogenComponentProps, HydrogenComponentSchema, HydrogenElement, HydrogenPageConfigs, HydrogenPageData, HydrogenThemeInfo, HydrogenThemeSchema, InspectorGroup, PageType, TODO, WeaverseHydrogen, WeaverseHydrogenRoot, WeaverseHydrogenRootProps, WeaverseInternal, WeaverseLoaderArgs, WeaverseLoaderConfigs, fetchWithServerCache, useThemeSettings, weaverseLoader };
208
+ export { HydrogenComponent, HydrogenComponentData, HydrogenComponentInstance, HydrogenComponentPresets, HydrogenComponentProps, HydrogenComponentSchema, HydrogenElement, HydrogenPageAssignment, HydrogenPageConfigs, HydrogenPageData, HydrogenProjectConfig, HydrogenProjectType, HydrogenThemeInfo, HydrogenThemeSchema, InspectorGroup, NavigateFunction, PageType, TODO, WeaverseHydrogen, WeaverseHydrogenRoot, WeaverseHydrogenRootProps, WeaverseInternal, WeaverseLoaderArgs, WeaverseLoaderConfigs, WeaverseLoaderData, WeaverseLoaderRequestInfo, WeaverseStorefrontData, fetchWithServerCache, useThemeSettings, weaverseLoader };
package/dist/index.d.ts CHANGED
@@ -3,6 +3,22 @@ import { LoaderArgs, AppLoadContext } from '@shopify/remix-oxygen';
3
3
  import { ElementData, ElementSchema, BasicInput, WeaverseElement, Weaverse, WeaverseItemStore } from '@weaverse/react';
4
4
  export * from '@weaverse/react';
5
5
 
6
+ declare let STORE_PAGES: {
7
+ INDEX: string;
8
+ PRODUCT: string;
9
+ COLLECTION: string;
10
+ COLLECTION_LIST: string;
11
+ PAGE: string;
12
+ BLOG: string;
13
+ ARTICLE: string;
14
+ CART: string;
15
+ CUSTOMER: string;
16
+ NOT_FOUND: string;
17
+ PASSWORD: string;
18
+ SEARCH: string;
19
+ CUSTOM: string;
20
+ };
21
+
6
22
  type TODO = any;
7
23
  declare module '@shopify/remix-oxygen' {
8
24
  interface AppLoadContext {
@@ -28,8 +44,7 @@ interface HydrogenComponentData extends Omit<ElementData, 'childIds' | 'css'> {
28
44
  children: {
29
45
  id: string;
30
46
  }[];
31
- loaderData: unknown;
32
- data: Record<string, unknown>;
47
+ data: Record<string, any>;
33
48
  }
34
49
  interface HydrogenComponentSchema extends Omit<ElementSchema, 'parentTypes' | 'flags' | 'inspector' | 'gridSize' | 'childElements' | 'catalog'> {
35
50
  childTypes?: string[];
@@ -45,21 +60,40 @@ interface HydrogenComponentProps<L = any> extends WeaverseElement {
45
60
  loaderData?: L;
46
61
  children?: React.JSX.Element[];
47
62
  }
48
- interface WeaverseHydrogen extends Omit<Weaverse, 'itemInstances' | 'elementInstances' | 'registerElement'> {
63
+ type WeaverseLoaderRequestInfo = {
64
+ params: any;
65
+ pathname: string;
66
+ search: string;
67
+ };
68
+ interface WeaverseHydrogen extends Omit<Weaverse, 'itemInstances' | 'elementInstances' | 'registerElement' | 'data'> {
49
69
  itemInstances: Map<string | number, HydrogenComponentInstance>;
50
70
  elementInstances: Map<string, HydrogenElement>;
51
71
  registerElement(element: HydrogenElement): void;
52
72
  internal: WeaverseInternal;
73
+ data: WeaverseStorefrontData;
74
+ requestInfo: WeaverseLoaderRequestInfo;
53
75
  }
76
+ type WeaverseStorefrontData = {
77
+ id?: string;
78
+ rootId: string;
79
+ name: string;
80
+ items: HydrogenComponentData[];
81
+ };
82
+ type HydrogenProjectConfig = {
83
+ theme: Record<string, any>;
84
+ };
85
+ type HydrogenProjectType = {
86
+ id: string;
87
+ weaverseShopId: string;
88
+ name: string;
89
+ config: HydrogenProjectConfig;
90
+ [key: string]: any;
91
+ };
54
92
  type WeaverseInternal = {
55
93
  themeSchema: HydrogenThemeSchema;
56
- pageAssignment: any;
57
- project: {
58
- config: {
59
- theme: Record<string, any>;
60
- };
61
- [key: string]: any;
62
- };
94
+ pageAssignment: HydrogenPageAssignment;
95
+ project: HydrogenProjectType;
96
+ navigate: NavigateFunction;
63
97
  };
64
98
  type HydrogenComponentPresets = {
65
99
  type: string;
@@ -86,18 +120,56 @@ type HydrogenPageConfigs = {
86
120
  weaverseHost: string;
87
121
  version?: string;
88
122
  isDesignMode?: boolean;
123
+ requestInfo: WeaverseLoaderRequestInfo;
89
124
  [key: string]: any;
90
125
  };
91
- interface HydrogenPageData {
126
+ type HydrogenPageAssignment = {
127
+ projectId: string;
128
+ type: PageType;
129
+ handle: string;
130
+ locale: string;
131
+ };
132
+ interface WeaverseLoaderData {
92
133
  configs: HydrogenPageConfigs;
93
- page: any;
94
- project: any;
95
- pageAssignment: any;
134
+ page: HydrogenPageData;
135
+ project: HydrogenProjectType;
136
+ pageAssignment: HydrogenPageAssignment;
96
137
  }
138
+ type HydrogenPageData = {
139
+ id: string;
140
+ name: string;
141
+ rootId: string;
142
+ items: HydrogenComponentData[];
143
+ [key: string]: any;
144
+ };
145
+ type RelativeRoutingType = 'route' | 'path';
146
+ type To = string | Partial<Path>;
147
+ type Path = {
148
+ /**
149
+ * A URL pathname, beginning with a /.
150
+ */
151
+ pathname: string;
152
+ /**
153
+ * A URL search string, beginning with a ?.
154
+ */
155
+ search: string;
156
+ /**
157
+ * A URL fragment identifier, beginning with a #.
158
+ */
159
+ hash: string;
160
+ };
161
+ type NavigateOptions = {
162
+ replace?: boolean;
163
+ state?: any;
164
+ preventScrollReset?: boolean;
165
+ relative?: RelativeRoutingType;
166
+ };
167
+ type NavigateFunction = (to: To, options?: NavigateOptions) => void;
97
168
  interface WeaverseHydrogenRootProps {
98
- weaverseData: HydrogenPageData;
169
+ weaverseData: WeaverseLoaderData;
99
170
  components: HydrogenComponent[];
100
171
  themeSchema: HydrogenThemeSchema;
172
+ navigate: NavigateFunction;
101
173
  }
102
174
  type HydrogenThemeInfo = {
103
175
  name: string;
@@ -110,26 +182,27 @@ interface HydrogenThemeSchema {
110
182
  info: HydrogenThemeInfo;
111
183
  inspector: InspectorGroup[];
112
184
  }
113
- type PageType = (typeof PageType)[keyof typeof PageType];
185
+ type PageType = keyof typeof STORE_PAGES;
114
186
  type WeaverseLoaderConfigs = {
115
- language?: string;
116
- type?: PageType;
187
+ type: PageType;
188
+ locale?: string;
117
189
  handle?: string;
118
190
  };
119
191
 
120
- declare function useThemeSettings(): any[];
192
+ declare function useThemeSettings(): (Record<string, any> | ((newSettings: any) => void))[];
121
193
 
194
+ type FetchWithServerCacheParams = {
195
+ url: string;
196
+ options?: RequestInit | Request;
197
+ context: AppLoadContext;
198
+ };
122
199
  /**
123
200
  * Fetch with server cache requires a storefront.cache instance which is Cloudflare Cache and a waitUntil function, otherwise it will just fetch the url.
124
201
  */
125
- declare let fetchWithServerCache: ({ url, options, context, }: {
126
- url: string;
127
- options?: Request | RequestInit | undefined;
128
- context: AppLoadContext;
129
- }) => Promise<any>;
202
+ declare function fetchWithServerCache(params: FetchWithServerCacheParams): Promise<any>;
130
203
 
131
- declare function weaverseLoader(args: LoaderArgs, components: HydrogenComponent[], loaderConfigs?: WeaverseLoaderConfigs): Promise<HydrogenPageData | null>;
204
+ declare function weaverseLoader(args: LoaderArgs, components: HydrogenComponent[], loaderConfigs?: WeaverseLoaderConfigs): Promise<WeaverseLoaderData | null>;
132
205
 
133
206
  declare function WeaverseHydrogenRoot(props: WeaverseHydrogenRootProps): React.JSX.Element;
134
207
 
135
- export { HydrogenComponent, HydrogenComponentData, HydrogenComponentInstance, HydrogenComponentPresets, HydrogenComponentProps, HydrogenComponentSchema, HydrogenElement, HydrogenPageConfigs, HydrogenPageData, HydrogenThemeInfo, HydrogenThemeSchema, InspectorGroup, PageType, TODO, WeaverseHydrogen, WeaverseHydrogenRoot, WeaverseHydrogenRootProps, WeaverseInternal, WeaverseLoaderArgs, WeaverseLoaderConfigs, fetchWithServerCache, useThemeSettings, weaverseLoader };
208
+ export { HydrogenComponent, HydrogenComponentData, HydrogenComponentInstance, HydrogenComponentPresets, HydrogenComponentProps, HydrogenComponentSchema, HydrogenElement, HydrogenPageAssignment, HydrogenPageConfigs, HydrogenPageData, HydrogenProjectConfig, HydrogenProjectType, HydrogenThemeInfo, HydrogenThemeSchema, InspectorGroup, NavigateFunction, PageType, TODO, WeaverseHydrogen, WeaverseHydrogenRoot, WeaverseHydrogenRootProps, WeaverseInternal, WeaverseLoaderArgs, WeaverseLoaderConfigs, WeaverseLoaderData, WeaverseLoaderRequestInfo, WeaverseStorefrontData, fetchWithServerCache, useThemeSettings, weaverseLoader };
package/dist/index.js CHANGED
@@ -45,7 +45,7 @@ var import_react = require("@weaverse/react");
45
45
  function createCachedWeaverseInstance(init) {
46
46
  if (import_react.isBrowser) {
47
47
  window.__weaverses = window.__weaverses || {};
48
- let pathname = window.location.pathname;
48
+ let { pathname } = init.requestInfo;
49
49
  if (!window.__weaverses[pathname]) {
50
50
  window.__weaverses[pathname] = new import_react.Weaverse(init);
51
51
  }
@@ -57,7 +57,7 @@ function createWeaverseInstance(weaverseData, components) {
57
57
  if (import_react.isBrowser) {
58
58
  console.log("\u{1F4BF} Weaverse data", weaverseData);
59
59
  }
60
- let { page, configs = {}, project, pageAssignment } = weaverseData || {};
60
+ let { page, configs, project, pageAssignment } = weaverseData || {};
61
61
  let weaverse = createCachedWeaverseInstance({
62
62
  ...configs,
63
63
  data: page || {},
@@ -713,11 +713,13 @@ Weaverse2.WeaverseItemStore = WeaverseItemStore;
713
713
 
714
714
  // src/hooks/use-studio.ts
715
715
  var import_react2 = require("react");
716
- function useStudio(weaverse, themeSchema) {
716
+ function useStudio(weaverse, themeSchema, navigate) {
717
717
  (0, import_react2.useEffect)(() => {
718
- if (isIframe && weaverse.isDesignMode && !window.weaverseStudioInitialized) {
719
- window.weaverseStudioInitialized = true;
718
+ let initialized = checkStudioInitialized(weaverse);
719
+ if (isIframe && weaverse.isDesignMode && !initialized) {
720
+ window.__initializedWeaverseStudios[weaverse.pageId] = true;
720
721
  weaverse.internal.themeSchema = themeSchema;
722
+ weaverse.internal.navigate = navigate;
721
723
  let host = weaverse.weaverseHost;
722
724
  let version = weaverse.weaverseVersion || Date.now();
723
725
  loadScript(`${host}/assets/studio/studio-bridge.js?v=${version}`).then(
@@ -732,6 +734,15 @@ function useStudio(weaverse, themeSchema) {
732
734
  window.__weaverse = weaverse;
733
735
  }, [weaverse]);
734
736
  }
737
+ function checkStudioInitialized(weaverseInit) {
738
+ window.__initializedWeaverseStudios = window.__initializedWeaverseStudios || {};
739
+ let { pageId } = weaverseInit;
740
+ let initialized = window.__initializedWeaverseStudios?.[pageId];
741
+ if (initialized) {
742
+ return true;
743
+ }
744
+ return false;
745
+ }
735
746
 
736
747
  // src/hooks/use-theme-setting.ts
737
748
  var import_react3 = require("@weaverse/react");
@@ -784,11 +795,8 @@ function getRequestQueries(request) {
784
795
 
785
796
  // src/fetch.ts
786
797
  var cacheControl = (0, import_hydrogen.generateCacheControlHeader)((0, import_hydrogen.CacheShort)());
787
- var fetchWithServerCache = async ({
788
- url,
789
- options = {},
790
- context
791
- }) => {
798
+ async function fetchWithServerCache(params) {
799
+ let { url, options = {}, context } = params;
792
800
  let { storefront, waitUntil } = context;
793
801
  if (!storefront?.cache || !waitUntil) {
794
802
  return fetch(url, options);
@@ -808,27 +816,31 @@ var fetchWithServerCache = async ({
808
816
  waitUntil?.(storefront.cache.put(cacheKey, response.clone()));
809
817
  }
810
818
  return response;
811
- };
819
+ }
812
820
 
813
821
  // src/loader.ts
814
- async function weaverseLoader(args, components, loaderConfigs = {}) {
815
- let { request, context } = args;
816
- let queries = getRequestQueries(request);
817
- let { WEAVERSE_PROJECT_ID, WEAVERSE_HOST } = context?.env || {};
818
- let { weaverseProjectId, weaverseHost: hostInQueries } = queries;
819
- let projectId = weaverseProjectId || WEAVERSE_PROJECT_ID;
820
- let weaverseHost = hostInQueries || WEAVERSE_HOST || "https://weaverse.io";
821
- if (!projectId) {
822
- console.log("\u274C Missing `projectId`!");
823
- return null;
824
- }
825
- let configs = {
826
- projectId,
827
- weaverseHost,
828
- ...queries
829
- };
822
+ async function weaverseLoader(args, components, loaderConfigs) {
830
823
  try {
831
- let { page, project, pageAssignment } = await fetchWithServerCache({
824
+ let { request, context, params } = args;
825
+ let queries = getRequestQueries(request);
826
+ let { WEAVERSE_PROJECT_ID, WEAVERSE_HOST } = context?.env || {};
827
+ let { weaverseProjectId, weaverseHost } = queries;
828
+ let projectId = weaverseProjectId || WEAVERSE_PROJECT_ID;
829
+ weaverseHost = weaverseHost || WEAVERSE_HOST || "https://weaverse.io";
830
+ if (!projectId) {
831
+ throw new Error("Missing project id");
832
+ }
833
+ let configs = {
834
+ projectId,
835
+ weaverseHost,
836
+ ...queries,
837
+ requestInfo: {
838
+ params,
839
+ pathname: new URL(request.url).pathname,
840
+ search: new URL(request.url).search
841
+ }
842
+ };
843
+ let res = await fetchWithServerCache({
832
844
  url: `${weaverseHost}/api/public/project`,
833
845
  options: {
834
846
  method: "POST",
@@ -836,14 +848,16 @@ async function weaverseLoader(args, components, loaderConfigs = {}) {
836
848
  projectId,
837
849
  url: request.url,
838
850
  i18n: context?.storefront?.i18n,
839
- ...loaderConfigs
851
+ loaderConfigs
840
852
  })
841
853
  },
842
854
  context
843
- }).then((r2) => r2.json()).catch((err) => {
844
- console.log(`\u274C Error fetching project data: ${err?.toString()}`);
845
- return {};
846
855
  });
856
+ let payload = await res.json();
857
+ let { page, project, pageAssignment } = payload;
858
+ if (!page || !project || !pageAssignment) {
859
+ throw new Error(payload?.error || "Invalid payload");
860
+ }
847
861
  if (page?.items) {
848
862
  let items = page.items;
849
863
  page.items = await Promise.all(
@@ -871,7 +885,7 @@ async function weaverseLoader(args, components, loaderConfigs = {}) {
871
885
  }
872
886
  return { page, configs, project, pageAssignment };
873
887
  } catch (err) {
874
- console.log(`\u274C Error fetching Weaverse data: ${err?.toString()}`);
888
+ console.log(`\u274C Error fetching project data: ${err?.toString()}`);
875
889
  return null;
876
890
  }
877
891
  }
@@ -879,9 +893,9 @@ async function weaverseLoader(args, components, loaderConfigs = {}) {
879
893
  // src/index.tsx
880
894
  __reExport(src_exports, require("@weaverse/react"), module.exports);
881
895
  function WeaverseHydrogenRoot(props) {
882
- let { components, weaverseData, themeSchema } = props;
896
+ let { components, weaverseData, themeSchema, navigate } = props;
883
897
  let weaverse = createWeaverseInstance(weaverseData, components);
884
- useStudio(weaverse, themeSchema);
898
+ useStudio(weaverse, themeSchema, navigate);
885
899
  return /* @__PURE__ */ import_react5.default.createElement(import_react4.WeaverseRoot, { context: weaverse });
886
900
  }
887
901
  // Annotate the CommonJS export names for ESM import in node:
package/dist/index.mjs CHANGED
@@ -7,7 +7,7 @@ import { Weaverse, isBrowser } from "@weaverse/react";
7
7
  function createCachedWeaverseInstance(init) {
8
8
  if (isBrowser) {
9
9
  window.__weaverses = window.__weaverses || {};
10
- let pathname = window.location.pathname;
10
+ let { pathname } = init.requestInfo;
11
11
  if (!window.__weaverses[pathname]) {
12
12
  window.__weaverses[pathname] = new Weaverse(init);
13
13
  }
@@ -19,7 +19,7 @@ function createWeaverseInstance(weaverseData, components) {
19
19
  if (isBrowser) {
20
20
  console.log("\u{1F4BF} Weaverse data", weaverseData);
21
21
  }
22
- let { page, configs = {}, project, pageAssignment } = weaverseData || {};
22
+ let { page, configs, project, pageAssignment } = weaverseData || {};
23
23
  let weaverse = createCachedWeaverseInstance({
24
24
  ...configs,
25
25
  data: page || {},
@@ -675,11 +675,13 @@ Weaverse2.WeaverseItemStore = WeaverseItemStore;
675
675
 
676
676
  // src/hooks/use-studio.ts
677
677
  import { useEffect } from "react";
678
- function useStudio(weaverse, themeSchema) {
678
+ function useStudio(weaverse, themeSchema, navigate) {
679
679
  useEffect(() => {
680
- if (isIframe && weaverse.isDesignMode && !window.weaverseStudioInitialized) {
681
- window.weaverseStudioInitialized = true;
680
+ let initialized = checkStudioInitialized(weaverse);
681
+ if (isIframe && weaverse.isDesignMode && !initialized) {
682
+ window.__initializedWeaverseStudios[weaverse.pageId] = true;
682
683
  weaverse.internal.themeSchema = themeSchema;
684
+ weaverse.internal.navigate = navigate;
683
685
  let host = weaverse.weaverseHost;
684
686
  let version = weaverse.weaverseVersion || Date.now();
685
687
  loadScript(`${host}/assets/studio/studio-bridge.js?v=${version}`).then(
@@ -694,6 +696,15 @@ function useStudio(weaverse, themeSchema) {
694
696
  window.__weaverse = weaverse;
695
697
  }, [weaverse]);
696
698
  }
699
+ function checkStudioInitialized(weaverseInit) {
700
+ window.__initializedWeaverseStudios = window.__initializedWeaverseStudios || {};
701
+ let { pageId } = weaverseInit;
702
+ let initialized = window.__initializedWeaverseStudios?.[pageId];
703
+ if (initialized) {
704
+ return true;
705
+ }
706
+ return false;
707
+ }
697
708
 
698
709
  // src/hooks/use-theme-setting.ts
699
710
  import { useWeaverse } from "@weaverse/react";
@@ -746,11 +757,8 @@ function getRequestQueries(request) {
746
757
 
747
758
  // src/fetch.ts
748
759
  var cacheControl = generateCacheControlHeader(CacheShort());
749
- var fetchWithServerCache = async ({
750
- url,
751
- options = {},
752
- context
753
- }) => {
760
+ async function fetchWithServerCache(params) {
761
+ let { url, options = {}, context } = params;
754
762
  let { storefront, waitUntil } = context;
755
763
  if (!storefront?.cache || !waitUntil) {
756
764
  return fetch(url, options);
@@ -770,27 +778,31 @@ var fetchWithServerCache = async ({
770
778
  waitUntil?.(storefront.cache.put(cacheKey, response.clone()));
771
779
  }
772
780
  return response;
773
- };
781
+ }
774
782
 
775
783
  // src/loader.ts
776
- async function weaverseLoader(args, components, loaderConfigs = {}) {
777
- let { request, context } = args;
778
- let queries = getRequestQueries(request);
779
- let { WEAVERSE_PROJECT_ID, WEAVERSE_HOST } = context?.env || {};
780
- let { weaverseProjectId, weaverseHost: hostInQueries } = queries;
781
- let projectId = weaverseProjectId || WEAVERSE_PROJECT_ID;
782
- let weaverseHost = hostInQueries || WEAVERSE_HOST || "https://weaverse.io";
783
- if (!projectId) {
784
- console.log("\u274C Missing `projectId`!");
785
- return null;
786
- }
787
- let configs = {
788
- projectId,
789
- weaverseHost,
790
- ...queries
791
- };
784
+ async function weaverseLoader(args, components, loaderConfigs) {
792
785
  try {
793
- let { page, project, pageAssignment } = await fetchWithServerCache({
786
+ let { request, context, params } = args;
787
+ let queries = getRequestQueries(request);
788
+ let { WEAVERSE_PROJECT_ID, WEAVERSE_HOST } = context?.env || {};
789
+ let { weaverseProjectId, weaverseHost } = queries;
790
+ let projectId = weaverseProjectId || WEAVERSE_PROJECT_ID;
791
+ weaverseHost = weaverseHost || WEAVERSE_HOST || "https://weaverse.io";
792
+ if (!projectId) {
793
+ throw new Error("Missing project id");
794
+ }
795
+ let configs = {
796
+ projectId,
797
+ weaverseHost,
798
+ ...queries,
799
+ requestInfo: {
800
+ params,
801
+ pathname: new URL(request.url).pathname,
802
+ search: new URL(request.url).search
803
+ }
804
+ };
805
+ let res = await fetchWithServerCache({
794
806
  url: `${weaverseHost}/api/public/project`,
795
807
  options: {
796
808
  method: "POST",
@@ -798,14 +810,16 @@ async function weaverseLoader(args, components, loaderConfigs = {}) {
798
810
  projectId,
799
811
  url: request.url,
800
812
  i18n: context?.storefront?.i18n,
801
- ...loaderConfigs
813
+ loaderConfigs
802
814
  })
803
815
  },
804
816
  context
805
- }).then((r2) => r2.json()).catch((err) => {
806
- console.log(`\u274C Error fetching project data: ${err?.toString()}`);
807
- return {};
808
817
  });
818
+ let payload = await res.json();
819
+ let { page, project, pageAssignment } = payload;
820
+ if (!page || !project || !pageAssignment) {
821
+ throw new Error(payload?.error || "Invalid payload");
822
+ }
809
823
  if (page?.items) {
810
824
  let items = page.items;
811
825
  page.items = await Promise.all(
@@ -833,7 +847,7 @@ async function weaverseLoader(args, components, loaderConfigs = {}) {
833
847
  }
834
848
  return { page, configs, project, pageAssignment };
835
849
  } catch (err) {
836
- console.log(`\u274C Error fetching Weaverse data: ${err?.toString()}`);
850
+ console.log(`\u274C Error fetching project data: ${err?.toString()}`);
837
851
  return null;
838
852
  }
839
853
  }
@@ -841,9 +855,9 @@ async function weaverseLoader(args, components, loaderConfigs = {}) {
841
855
  // src/index.tsx
842
856
  export * from "@weaverse/react";
843
857
  function WeaverseHydrogenRoot(props) {
844
- let { components, weaverseData, themeSchema } = props;
858
+ let { components, weaverseData, themeSchema, navigate } = props;
845
859
  let weaverse = createWeaverseInstance(weaverseData, components);
846
- useStudio(weaverse, themeSchema);
860
+ useStudio(weaverse, themeSchema, navigate);
847
861
  return /* @__PURE__ */ React.createElement(WeaverseRoot, { context: weaverse });
848
862
  }
849
863
  export {
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.0.55",
2
+ "version": "1.0.57",
3
3
  "license": "MIT",
4
4
  "main": "dist/index.js",
5
5
  "typings": "dist/index.d.ts",
@@ -33,7 +33,7 @@
33
33
  "author": "Weaverse Team",
34
34
  "dependencies": {
35
35
  "@shopify/hydrogen": "2023.4.6",
36
- "@weaverse/react": "1.0.55"
36
+ "@weaverse/react": "1.0.57"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@shopify/remix-oxygen": "^1.1.1"