@weaverse/hydrogen 1.0.54 → 1.0.56

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 {
@@ -25,16 +41,12 @@ interface HydrogenComponentData extends Omit<ElementData, 'childIds' | 'css'> {
25
41
  createdAt: string;
26
42
  updatedAt: string;
27
43
  deletedAt: string;
28
- parentId: string;
29
44
  children: {
30
45
  id: string;
31
46
  }[];
32
- loaderData: unknown;
33
- data: Record<string, unknown>;
47
+ data: Record<string, any>;
34
48
  }
35
- type ComponentFlags = Partial<Record<'isSection', boolean>>;
36
- interface HydrogenComponentSchema extends Omit<ElementSchema, 'parentTypes' | 'flags' | 'inspector'> {
37
- flags?: ComponentFlags;
49
+ interface HydrogenComponentSchema extends Omit<ElementSchema, 'parentTypes' | 'flags' | 'inspector' | 'gridSize' | 'childElements' | 'catalog'> {
38
50
  childTypes?: string[];
39
51
  inspector: InspectorGroup[];
40
52
  presets?: Omit<HydrogenComponentPresets, 'type'>;
@@ -48,21 +60,40 @@ interface HydrogenComponentProps<L = any> extends WeaverseElement {
48
60
  loaderData?: L;
49
61
  children?: React.JSX.Element[];
50
62
  }
51
- 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'> {
52
69
  itemInstances: Map<string | number, HydrogenComponentInstance>;
53
70
  elementInstances: Map<string, HydrogenElement>;
54
71
  registerElement(element: HydrogenElement): void;
55
72
  internal: WeaverseInternal;
73
+ data: WeaverseStorefrontData;
74
+ requestInfo: WeaverseLoaderRequestInfo;
56
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
+ };
57
92
  type WeaverseInternal = {
58
93
  themeSchema: HydrogenThemeSchema;
59
- pageAssignment: any;
60
- project: {
61
- config: {
62
- theme: Record<string, any>;
63
- };
64
- [key: string]: any;
65
- };
94
+ pageAssignment: HydrogenPageAssignment;
95
+ project: HydrogenProjectType;
96
+ navigate: NavigateFunction;
66
97
  };
67
98
  type HydrogenComponentPresets = {
68
99
  type: string;
@@ -75,7 +106,6 @@ interface HydrogenElement {
75
106
  }
76
107
  interface HydrogenComponentInstance extends Omit<WeaverseItemStore, '_flags' | 'data' | 'Element'> {
77
108
  get _element(): HTMLElement | null;
78
- get _flags(): ComponentFlags;
79
109
  get Element(): HydrogenElement | undefined;
80
110
  get data(): HydrogenComponentData;
81
111
  _store: HydrogenComponentData;
@@ -90,18 +120,56 @@ type HydrogenPageConfigs = {
90
120
  weaverseHost: string;
91
121
  version?: string;
92
122
  isDesignMode?: boolean;
123
+ requestInfo: WeaverseLoaderRequestInfo;
93
124
  [key: string]: any;
94
125
  };
95
- interface HydrogenPageData {
126
+ type HydrogenPageAssignment = {
127
+ projectId: string;
128
+ type: PageType;
129
+ handle: string;
130
+ locale: string;
131
+ };
132
+ interface WeaverseLoaderData {
96
133
  configs: HydrogenPageConfigs;
97
- page: any;
98
- project: any;
99
- pageAssignment: any;
134
+ page: HydrogenPageData;
135
+ project: HydrogenProjectType;
136
+ pageAssignment: HydrogenPageAssignment;
100
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;
101
168
  interface WeaverseHydrogenRootProps {
102
- weaverseData: HydrogenPageData;
103
- components: Record<string, HydrogenComponent>;
169
+ weaverseData: WeaverseLoaderData;
170
+ components: HydrogenComponent[];
104
171
  themeSchema: HydrogenThemeSchema;
172
+ navigate: NavigateFunction;
105
173
  }
106
174
  type HydrogenThemeInfo = {
107
175
  name: string;
@@ -114,26 +182,27 @@ interface HydrogenThemeSchema {
114
182
  info: HydrogenThemeInfo;
115
183
  inspector: InspectorGroup[];
116
184
  }
117
- type PageType = (typeof PageType)[keyof typeof PageType];
185
+ type PageType = keyof typeof STORE_PAGES;
118
186
  type WeaverseLoaderConfigs = {
119
- language?: string;
120
- type?: PageType;
187
+ type: PageType;
188
+ locale?: string;
121
189
  handle?: string;
122
190
  };
123
191
 
124
- declare function useThemeSettings(): any[];
192
+ declare function useThemeSettings(): (Record<string, any> | ((newSettings: any) => void))[];
125
193
 
194
+ type FetchWithServerCacheParams = {
195
+ url: string;
196
+ options?: RequestInit | Request;
197
+ context: AppLoadContext;
198
+ };
126
199
  /**
127
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.
128
201
  */
129
- declare let fetchWithServerCache: ({ url, options, context, }: {
130
- url: string;
131
- options?: Request | RequestInit | undefined;
132
- context: AppLoadContext;
133
- }) => Promise<any>;
202
+ declare function fetchWithServerCache(params: FetchWithServerCacheParams): Promise<any>;
134
203
 
135
- declare function weaverseLoader(args: LoaderArgs, components: Record<string, HydrogenComponent>, loaderConfigs?: WeaverseLoaderConfigs): Promise<HydrogenPageData | null>;
204
+ declare function weaverseLoader(args: LoaderArgs, components: HydrogenComponent[], loaderConfigs?: WeaverseLoaderConfigs): Promise<WeaverseLoaderData | null>;
136
205
 
137
206
  declare function WeaverseHydrogenRoot(props: WeaverseHydrogenRootProps): React.JSX.Element;
138
207
 
139
- export { ComponentFlags, 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 {
@@ -25,16 +41,12 @@ interface HydrogenComponentData extends Omit<ElementData, 'childIds' | 'css'> {
25
41
  createdAt: string;
26
42
  updatedAt: string;
27
43
  deletedAt: string;
28
- parentId: string;
29
44
  children: {
30
45
  id: string;
31
46
  }[];
32
- loaderData: unknown;
33
- data: Record<string, unknown>;
47
+ data: Record<string, any>;
34
48
  }
35
- type ComponentFlags = Partial<Record<'isSection', boolean>>;
36
- interface HydrogenComponentSchema extends Omit<ElementSchema, 'parentTypes' | 'flags' | 'inspector'> {
37
- flags?: ComponentFlags;
49
+ interface HydrogenComponentSchema extends Omit<ElementSchema, 'parentTypes' | 'flags' | 'inspector' | 'gridSize' | 'childElements' | 'catalog'> {
38
50
  childTypes?: string[];
39
51
  inspector: InspectorGroup[];
40
52
  presets?: Omit<HydrogenComponentPresets, 'type'>;
@@ -48,21 +60,40 @@ interface HydrogenComponentProps<L = any> extends WeaverseElement {
48
60
  loaderData?: L;
49
61
  children?: React.JSX.Element[];
50
62
  }
51
- 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'> {
52
69
  itemInstances: Map<string | number, HydrogenComponentInstance>;
53
70
  elementInstances: Map<string, HydrogenElement>;
54
71
  registerElement(element: HydrogenElement): void;
55
72
  internal: WeaverseInternal;
73
+ data: WeaverseStorefrontData;
74
+ requestInfo: WeaverseLoaderRequestInfo;
56
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
+ };
57
92
  type WeaverseInternal = {
58
93
  themeSchema: HydrogenThemeSchema;
59
- pageAssignment: any;
60
- project: {
61
- config: {
62
- theme: Record<string, any>;
63
- };
64
- [key: string]: any;
65
- };
94
+ pageAssignment: HydrogenPageAssignment;
95
+ project: HydrogenProjectType;
96
+ navigate: NavigateFunction;
66
97
  };
67
98
  type HydrogenComponentPresets = {
68
99
  type: string;
@@ -75,7 +106,6 @@ interface HydrogenElement {
75
106
  }
76
107
  interface HydrogenComponentInstance extends Omit<WeaverseItemStore, '_flags' | 'data' | 'Element'> {
77
108
  get _element(): HTMLElement | null;
78
- get _flags(): ComponentFlags;
79
109
  get Element(): HydrogenElement | undefined;
80
110
  get data(): HydrogenComponentData;
81
111
  _store: HydrogenComponentData;
@@ -90,18 +120,56 @@ type HydrogenPageConfigs = {
90
120
  weaverseHost: string;
91
121
  version?: string;
92
122
  isDesignMode?: boolean;
123
+ requestInfo: WeaverseLoaderRequestInfo;
93
124
  [key: string]: any;
94
125
  };
95
- interface HydrogenPageData {
126
+ type HydrogenPageAssignment = {
127
+ projectId: string;
128
+ type: PageType;
129
+ handle: string;
130
+ locale: string;
131
+ };
132
+ interface WeaverseLoaderData {
96
133
  configs: HydrogenPageConfigs;
97
- page: any;
98
- project: any;
99
- pageAssignment: any;
134
+ page: HydrogenPageData;
135
+ project: HydrogenProjectType;
136
+ pageAssignment: HydrogenPageAssignment;
100
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;
101
168
  interface WeaverseHydrogenRootProps {
102
- weaverseData: HydrogenPageData;
103
- components: Record<string, HydrogenComponent>;
169
+ weaverseData: WeaverseLoaderData;
170
+ components: HydrogenComponent[];
104
171
  themeSchema: HydrogenThemeSchema;
172
+ navigate: NavigateFunction;
105
173
  }
106
174
  type HydrogenThemeInfo = {
107
175
  name: string;
@@ -114,26 +182,27 @@ interface HydrogenThemeSchema {
114
182
  info: HydrogenThemeInfo;
115
183
  inspector: InspectorGroup[];
116
184
  }
117
- type PageType = (typeof PageType)[keyof typeof PageType];
185
+ type PageType = keyof typeof STORE_PAGES;
118
186
  type WeaverseLoaderConfigs = {
119
- language?: string;
120
- type?: PageType;
187
+ type: PageType;
188
+ locale?: string;
121
189
  handle?: string;
122
190
  };
123
191
 
124
- declare function useThemeSettings(): any[];
192
+ declare function useThemeSettings(): (Record<string, any> | ((newSettings: any) => void))[];
125
193
 
194
+ type FetchWithServerCacheParams = {
195
+ url: string;
196
+ options?: RequestInit | Request;
197
+ context: AppLoadContext;
198
+ };
126
199
  /**
127
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.
128
201
  */
129
- declare let fetchWithServerCache: ({ url, options, context, }: {
130
- url: string;
131
- options?: Request | RequestInit | undefined;
132
- context: AppLoadContext;
133
- }) => Promise<any>;
202
+ declare function fetchWithServerCache(params: FetchWithServerCacheParams): Promise<any>;
134
203
 
135
- declare function weaverseLoader(args: LoaderArgs, components: Record<string, HydrogenComponent>, loaderConfigs?: WeaverseLoaderConfigs): Promise<HydrogenPageData | null>;
204
+ declare function weaverseLoader(args: LoaderArgs, components: HydrogenComponent[], loaderConfigs?: WeaverseLoaderConfigs): Promise<WeaverseLoaderData | null>;
136
205
 
137
206
  declare function WeaverseHydrogenRoot(props: WeaverseHydrogenRootProps): React.JSX.Element;
138
207
 
139
- export { ComponentFlags, 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
  }
@@ -54,8 +54,10 @@ function createCachedWeaverseInstance(init) {
54
54
  return new import_react.Weaverse(init);
55
55
  }
56
56
  function createWeaverseInstance(weaverseData, components) {
57
- console.log("\u{1F4BF} Weaverse data", weaverseData);
58
- let { page, configs = {}, project, pageAssignment } = weaverseData || {};
57
+ if (import_react.isBrowser) {
58
+ console.log("\u{1F4BF} Weaverse data", weaverseData);
59
+ }
60
+ let { page, configs, project, pageAssignment } = weaverseData || {};
59
61
  let weaverse = createCachedWeaverseInstance({
60
62
  ...configs,
61
63
  data: page || {},
@@ -64,11 +66,11 @@ function createWeaverseInstance(weaverseData, components) {
64
66
  });
65
67
  weaverse.internal.project = project;
66
68
  weaverse.internal.pageAssignment = pageAssignment;
67
- Object.entries(components).forEach(([key, component]) => {
69
+ components.forEach((comp) => {
68
70
  weaverse.registerElement({
69
- type: component?.schema?.type || key,
70
- Component: component?.default,
71
- schema: component?.schema
71
+ type: comp?.schema?.type,
72
+ Component: comp?.default,
73
+ schema: comp?.schema
72
74
  });
73
75
  });
74
76
  return weaverse;
@@ -711,11 +713,13 @@ Weaverse2.WeaverseItemStore = WeaverseItemStore;
711
713
 
712
714
  // src/hooks/use-studio.ts
713
715
  var import_react2 = require("react");
714
- function useStudio(weaverse, themeSchema) {
716
+ function useStudio(weaverse, themeSchema, navigate) {
715
717
  (0, import_react2.useEffect)(() => {
716
- if (isIframe && weaverse.isDesignMode && !window.weaverseStudioInitialized) {
717
- window.weaverseStudioInitialized = true;
718
+ let initialized = checkStudioInitialized(weaverse);
719
+ if (isIframe && weaverse.isDesignMode && !initialized) {
720
+ window.__initializedWeaverseStudios[weaverse.pageId] = true;
718
721
  weaverse.internal.themeSchema = themeSchema;
722
+ weaverse.internal.navigate = navigate;
719
723
  let host = weaverse.weaverseHost;
720
724
  let version = weaverse.weaverseVersion || Date.now();
721
725
  loadScript(`${host}/assets/studio/studio-bridge.js?v=${version}`).then(
@@ -730,6 +734,15 @@ function useStudio(weaverse, themeSchema) {
730
734
  window.__weaverse = weaverse;
731
735
  }, [weaverse]);
732
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
+ }
733
746
 
734
747
  // src/hooks/use-theme-setting.ts
735
748
  var import_react3 = require("@weaverse/react");
@@ -782,11 +795,8 @@ function getRequestQueries(request) {
782
795
 
783
796
  // src/fetch.ts
784
797
  var cacheControl = (0, import_hydrogen.generateCacheControlHeader)((0, import_hydrogen.CacheShort)());
785
- var fetchWithServerCache = async ({
786
- url,
787
- options = {},
788
- context
789
- }) => {
798
+ async function fetchWithServerCache(params) {
799
+ let { url, options = {}, context } = params;
790
800
  let { storefront, waitUntil } = context;
791
801
  if (!storefront?.cache || !waitUntil) {
792
802
  return fetch(url, options);
@@ -806,27 +816,31 @@ var fetchWithServerCache = async ({
806
816
  waitUntil?.(storefront.cache.put(cacheKey, response.clone()));
807
817
  }
808
818
  return response;
809
- };
819
+ }
810
820
 
811
821
  // src/loader.ts
812
- async function weaverseLoader(args, components, loaderConfigs = {}) {
813
- let { request, context } = args;
814
- let queries = getRequestQueries(request);
815
- let { WEAVERSE_PROJECT_ID, WEAVERSE_HOST } = context?.env || {};
816
- let { weaverseProjectId, weaverseHost: hostInQueries } = queries;
817
- let projectId = weaverseProjectId || WEAVERSE_PROJECT_ID;
818
- let weaverseHost = hostInQueries || WEAVERSE_HOST || "https://weaverse.io";
819
- if (!projectId) {
820
- console.log("\u274C Missing `projectId`!");
821
- return null;
822
- }
823
- let configs = {
824
- projectId,
825
- weaverseHost,
826
- ...queries
827
- };
822
+ async function weaverseLoader(args, components, loaderConfigs) {
828
823
  try {
829
- 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({
830
844
  url: `${weaverseHost}/api/public/project`,
831
845
  options: {
832
846
  method: "POST",
@@ -834,19 +848,22 @@ async function weaverseLoader(args, components, loaderConfigs = {}) {
834
848
  projectId,
835
849
  url: request.url,
836
850
  i18n: context?.storefront?.i18n,
837
- ...loaderConfigs
851
+ loaderConfigs
838
852
  })
839
853
  },
840
854
  context
841
- }).then((r2) => r2.json()).catch((err) => {
842
- console.log(`\u274C Error fetching project data: ${err?.toString()}`);
843
- return {};
844
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
+ }
845
861
  if (page?.items) {
846
862
  let items = page.items;
847
863
  page.items = await Promise.all(
848
864
  items.map(async (itemData) => {
849
- let loader = components[itemData.type]?.loader;
865
+ let type = itemData.type;
866
+ let { loader } = components.find(({ schema }) => schema?.type === type) || {};
850
867
  if (loader && typeof loader === "function") {
851
868
  try {
852
869
  return {
@@ -868,7 +885,7 @@ async function weaverseLoader(args, components, loaderConfigs = {}) {
868
885
  }
869
886
  return { page, configs, project, pageAssignment };
870
887
  } catch (err) {
871
- console.log(`\u274C Error fetching Weaverse data: ${err?.toString()}`);
888
+ console.log(`\u274C Error fetching project data: ${err?.toString()}`);
872
889
  return null;
873
890
  }
874
891
  }
@@ -876,9 +893,9 @@ async function weaverseLoader(args, components, loaderConfigs = {}) {
876
893
  // src/index.tsx
877
894
  __reExport(src_exports, require("@weaverse/react"), module.exports);
878
895
  function WeaverseHydrogenRoot(props) {
879
- let { components, weaverseData, themeSchema } = props;
896
+ let { components, weaverseData, themeSchema, navigate } = props;
880
897
  let weaverse = createWeaverseInstance(weaverseData, components);
881
- useStudio(weaverse, themeSchema);
898
+ useStudio(weaverse, themeSchema, navigate);
882
899
  return /* @__PURE__ */ import_react5.default.createElement(import_react4.WeaverseRoot, { context: weaverse });
883
900
  }
884
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
  }
@@ -16,8 +16,10 @@ function createCachedWeaverseInstance(init) {
16
16
  return new Weaverse(init);
17
17
  }
18
18
  function createWeaverseInstance(weaverseData, components) {
19
- console.log("\u{1F4BF} Weaverse data", weaverseData);
20
- let { page, configs = {}, project, pageAssignment } = weaverseData || {};
19
+ if (isBrowser) {
20
+ console.log("\u{1F4BF} Weaverse data", weaverseData);
21
+ }
22
+ let { page, configs, project, pageAssignment } = weaverseData || {};
21
23
  let weaverse = createCachedWeaverseInstance({
22
24
  ...configs,
23
25
  data: page || {},
@@ -26,11 +28,11 @@ function createWeaverseInstance(weaverseData, components) {
26
28
  });
27
29
  weaverse.internal.project = project;
28
30
  weaverse.internal.pageAssignment = pageAssignment;
29
- Object.entries(components).forEach(([key, component]) => {
31
+ components.forEach((comp) => {
30
32
  weaverse.registerElement({
31
- type: component?.schema?.type || key,
32
- Component: component?.default,
33
- schema: component?.schema
33
+ type: comp?.schema?.type,
34
+ Component: comp?.default,
35
+ schema: comp?.schema
34
36
  });
35
37
  });
36
38
  return weaverse;
@@ -673,11 +675,13 @@ Weaverse2.WeaverseItemStore = WeaverseItemStore;
673
675
 
674
676
  // src/hooks/use-studio.ts
675
677
  import { useEffect } from "react";
676
- function useStudio(weaverse, themeSchema) {
678
+ function useStudio(weaverse, themeSchema, navigate) {
677
679
  useEffect(() => {
678
- if (isIframe && weaverse.isDesignMode && !window.weaverseStudioInitialized) {
679
- window.weaverseStudioInitialized = true;
680
+ let initialized = checkStudioInitialized(weaverse);
681
+ if (isIframe && weaverse.isDesignMode && !initialized) {
682
+ window.__initializedWeaverseStudios[weaverse.pageId] = true;
680
683
  weaverse.internal.themeSchema = themeSchema;
684
+ weaverse.internal.navigate = navigate;
681
685
  let host = weaverse.weaverseHost;
682
686
  let version = weaverse.weaverseVersion || Date.now();
683
687
  loadScript(`${host}/assets/studio/studio-bridge.js?v=${version}`).then(
@@ -692,6 +696,15 @@ function useStudio(weaverse, themeSchema) {
692
696
  window.__weaverse = weaverse;
693
697
  }, [weaverse]);
694
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
+ }
695
708
 
696
709
  // src/hooks/use-theme-setting.ts
697
710
  import { useWeaverse } from "@weaverse/react";
@@ -744,11 +757,8 @@ function getRequestQueries(request) {
744
757
 
745
758
  // src/fetch.ts
746
759
  var cacheControl = generateCacheControlHeader(CacheShort());
747
- var fetchWithServerCache = async ({
748
- url,
749
- options = {},
750
- context
751
- }) => {
760
+ async function fetchWithServerCache(params) {
761
+ let { url, options = {}, context } = params;
752
762
  let { storefront, waitUntil } = context;
753
763
  if (!storefront?.cache || !waitUntil) {
754
764
  return fetch(url, options);
@@ -768,27 +778,31 @@ var fetchWithServerCache = async ({
768
778
  waitUntil?.(storefront.cache.put(cacheKey, response.clone()));
769
779
  }
770
780
  return response;
771
- };
781
+ }
772
782
 
773
783
  // src/loader.ts
774
- async function weaverseLoader(args, components, loaderConfigs = {}) {
775
- let { request, context } = args;
776
- let queries = getRequestQueries(request);
777
- let { WEAVERSE_PROJECT_ID, WEAVERSE_HOST } = context?.env || {};
778
- let { weaverseProjectId, weaverseHost: hostInQueries } = queries;
779
- let projectId = weaverseProjectId || WEAVERSE_PROJECT_ID;
780
- let weaverseHost = hostInQueries || WEAVERSE_HOST || "https://weaverse.io";
781
- if (!projectId) {
782
- console.log("\u274C Missing `projectId`!");
783
- return null;
784
- }
785
- let configs = {
786
- projectId,
787
- weaverseHost,
788
- ...queries
789
- };
784
+ async function weaverseLoader(args, components, loaderConfigs) {
790
785
  try {
791
- 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({
792
806
  url: `${weaverseHost}/api/public/project`,
793
807
  options: {
794
808
  method: "POST",
@@ -796,19 +810,22 @@ async function weaverseLoader(args, components, loaderConfigs = {}) {
796
810
  projectId,
797
811
  url: request.url,
798
812
  i18n: context?.storefront?.i18n,
799
- ...loaderConfigs
813
+ loaderConfigs
800
814
  })
801
815
  },
802
816
  context
803
- }).then((r2) => r2.json()).catch((err) => {
804
- console.log(`\u274C Error fetching project data: ${err?.toString()}`);
805
- return {};
806
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
+ }
807
823
  if (page?.items) {
808
824
  let items = page.items;
809
825
  page.items = await Promise.all(
810
826
  items.map(async (itemData) => {
811
- let loader = components[itemData.type]?.loader;
827
+ let type = itemData.type;
828
+ let { loader } = components.find(({ schema }) => schema?.type === type) || {};
812
829
  if (loader && typeof loader === "function") {
813
830
  try {
814
831
  return {
@@ -830,7 +847,7 @@ async function weaverseLoader(args, components, loaderConfigs = {}) {
830
847
  }
831
848
  return { page, configs, project, pageAssignment };
832
849
  } catch (err) {
833
- console.log(`\u274C Error fetching Weaverse data: ${err?.toString()}`);
850
+ console.log(`\u274C Error fetching project data: ${err?.toString()}`);
834
851
  return null;
835
852
  }
836
853
  }
@@ -838,9 +855,9 @@ async function weaverseLoader(args, components, loaderConfigs = {}) {
838
855
  // src/index.tsx
839
856
  export * from "@weaverse/react";
840
857
  function WeaverseHydrogenRoot(props) {
841
- let { components, weaverseData, themeSchema } = props;
858
+ let { components, weaverseData, themeSchema, navigate } = props;
842
859
  let weaverse = createWeaverseInstance(weaverseData, components);
843
- useStudio(weaverse, themeSchema);
860
+ useStudio(weaverse, themeSchema, navigate);
844
861
  return /* @__PURE__ */ React.createElement(WeaverseRoot, { context: weaverse });
845
862
  }
846
863
  export {
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.0.54",
2
+ "version": "1.0.56",
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.54"
36
+ "@weaverse/react": "1.0.56"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@shopify/remix-oxygen": "^1.1.1"