@weaverse/hydrogen 1.1.3 → 1.1.5

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
@@ -2,6 +2,7 @@ import React, { ForwardRefExoticComponent } from 'react';
2
2
  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
+ import { LanguageCode, CountryCode, CurrencyCode } from '@shopify/hydrogen/storefront-api-types';
5
6
  import * as _shopify_hydrogen_react_storefront_api_types from '@shopify/hydrogen-react/storefront-api-types';
6
7
 
7
8
  declare let STORE_PAGES: {
@@ -21,6 +22,13 @@ declare let STORE_PAGES: {
21
22
  CUSTOM: string;
22
23
  };
23
24
 
25
+ type Locale = {
26
+ language: LanguageCode;
27
+ country: CountryCode;
28
+ label: string;
29
+ currency: CurrencyCode;
30
+ };
31
+ type Localizations = Record<string, Locale>;
24
32
  type TODO = any;
25
33
  declare module '@shopify/remix-oxygen' {
26
34
  interface AppLoadContext {
@@ -29,6 +37,7 @@ declare module '@shopify/remix-oxygen' {
29
37
  storefront: TODO;
30
38
  env: TODO;
31
39
  cart: TODO;
40
+ withCache?: TODO;
32
41
  }
33
42
  }
34
43
  type WeaverseLoaderArgs = LoaderArgs & {
@@ -70,11 +79,7 @@ interface HydrogenComponentProps<L = any> extends WeaverseElement {
70
79
  loaderData?: L;
71
80
  children?: React.JSX.Element[];
72
81
  }
73
- type I18nLocale = {
74
- country: string;
75
- currency: string;
76
- language: string;
77
- label: string;
82
+ type I18nLocale = Locale & {
78
83
  pathPrefix: string;
79
84
  };
80
85
  type WeaverseLoaderRequestInfo = {
@@ -108,8 +113,12 @@ type HydrogenProjectType = {
108
113
  config: HydrogenProjectConfig;
109
114
  [key: string]: any;
110
115
  };
116
+ type WeaverseThemeConfigs = {
117
+ schema: HydrogenThemeSchema;
118
+ countries: Localizations;
119
+ };
111
120
  type WeaverseInternal = {
112
- themeSchema: HydrogenThemeSchema;
121
+ themeConfigs: WeaverseThemeConfigs;
113
122
  pageAssignment: HydrogenPageAssignment;
114
123
  project: HydrogenProjectType;
115
124
  navigate: NavigateFunction;
@@ -166,17 +175,8 @@ type HydrogenPageData = {
166
175
  type RelativeRoutingType = 'route' | 'path';
167
176
  type To = string | Partial<Path>;
168
177
  type Path = {
169
- /**
170
- * A URL pathname, beginning with a /.
171
- */
172
178
  pathname: string;
173
- /**
174
- * A URL search string, beginning with a ?.
175
- */
176
179
  search: string;
177
- /**
178
- * A URL fragment identifier, beginning with a #.
179
- */
180
180
  hash: string;
181
181
  };
182
182
  type NavigateOptions = {
@@ -188,6 +188,8 @@ type NavigateOptions = {
188
188
  type NavigateFunction = (to: To, options?: NavigateOptions) => void;
189
189
  interface WeaverseHydrogenRootProps {
190
190
  components: HydrogenComponent[];
191
+ countries: Localizations;
192
+ themeSchema: HydrogenThemeSchema;
191
193
  errorComponent: React.FC<{
192
194
  error: {
193
195
  message: string;
@@ -213,11 +215,17 @@ type WeaverseLoaderConfigs = {
213
215
  locale?: string;
214
216
  handle?: string;
215
217
  };
218
+ type FetchProjectRequestBody = {
219
+ projectId: string;
220
+ url: string;
221
+ countries: Localizations;
222
+ i18n?: I18nLocale;
223
+ loaderConfigs?: WeaverseLoaderConfigs;
224
+ };
216
225
  declare global {
217
226
  interface Window {
218
227
  __weaverse: WeaverseHydrogen;
219
228
  __weaverses: WeaverseHydrogen[];
220
- __weaverseHydrogenThemeSchema: HydrogenThemeSchema;
221
229
  }
222
230
  }
223
231
 
@@ -231,17 +239,14 @@ type FetchWithServerCacheParams = {
231
239
  */
232
240
  declare function fetchWithServerCache(params: FetchWithServerCacheParams): Promise<any>;
233
241
 
234
- declare function useThemeSettings(): (Record<string, any> | ((newSettings: any) => void))[];
242
+ declare function weaverseLoader(args: LoaderArgs, components: HydrogenComponent[], countries: Localizations, loaderConfigs?: WeaverseLoaderConfigs): Promise<WeaverseLoaderData | null>;
235
243
 
236
- declare function getSelectedProductOptions(request: Request): _shopify_hydrogen_react_storefront_api_types.SelectedOptionInput[];
244
+ declare function getRequestQueries<T = Record<string, string | boolean>>(request: Request): T;
237
245
 
238
- declare function weaverseLoader(args: LoaderArgs, components: HydrogenComponent[], loaderConfigs?: WeaverseLoaderConfigs): Promise<WeaverseLoaderData | null>;
246
+ declare function getSelectedProductOptions(request: Request): _shopify_hydrogen_react_storefront_api_types.SelectedOptionInput[];
239
247
 
240
- type StudioProps = {
241
- themeSchema: HydrogenThemeSchema;
242
- };
243
- declare function HydrogenStudio({ themeSchema }: StudioProps): React.JSX.Element | null;
248
+ declare function useThemeSettings(): (Record<string, any> | ((newSettings: any) => void))[];
244
249
 
245
- declare function WeaverseHydrogenRoot({ components, errorComponent: ErrorComponent, }: WeaverseHydrogenRootProps): React.JSX.Element;
250
+ declare function WeaverseHydrogenRoot({ errorComponent: ErrorComponent, ...themeConfigs }: WeaverseHydrogenRootProps): React.JSX.Element;
246
251
 
247
- export { HydrogenComponent, HydrogenComponentData, HydrogenComponentInstance, HydrogenComponentPresets, HydrogenComponentProps, HydrogenComponentSchema, HydrogenElement, HydrogenPageAssignment, HydrogenPageConfigs, HydrogenPageData, HydrogenProjectConfig, HydrogenProjectType, HydrogenStudio, HydrogenThemeInfo, HydrogenThemeSchema, HydrogenToolbarAction, InspectorGroup, NavigateFunction, PageType, TODO, WeaverseHydrogen, WeaverseHydrogenRoot, WeaverseHydrogenRootProps, WeaverseInternal, WeaverseLoaderArgs, WeaverseLoaderConfigs, WeaverseLoaderData, WeaverseLoaderRequestInfo, WeaverseStorefrontData, fetchWithServerCache, getSelectedProductOptions, useThemeSettings, weaverseLoader };
252
+ export { FetchProjectRequestBody, HydrogenComponent, HydrogenComponentData, HydrogenComponentInstance, HydrogenComponentPresets, HydrogenComponentProps, HydrogenComponentSchema, HydrogenElement, HydrogenPageAssignment, HydrogenPageConfigs, HydrogenPageData, HydrogenProjectConfig, HydrogenProjectType, HydrogenThemeInfo, HydrogenThemeSchema, HydrogenToolbarAction, I18nLocale, InspectorGroup, Locale, Localizations, NavigateFunction, PageType, TODO, WeaverseHydrogen, WeaverseHydrogenRoot, WeaverseHydrogenRootProps, WeaverseInternal, WeaverseLoaderArgs, WeaverseLoaderConfigs, WeaverseLoaderData, WeaverseLoaderRequestInfo, WeaverseStorefrontData, WeaverseThemeConfigs, fetchWithServerCache, getRequestQueries, getSelectedProductOptions, useThemeSettings, weaverseLoader };
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ import React, { ForwardRefExoticComponent } from 'react';
2
2
  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
+ import { LanguageCode, CountryCode, CurrencyCode } from '@shopify/hydrogen/storefront-api-types';
5
6
  import * as _shopify_hydrogen_react_storefront_api_types from '@shopify/hydrogen-react/storefront-api-types';
6
7
 
7
8
  declare let STORE_PAGES: {
@@ -21,6 +22,13 @@ declare let STORE_PAGES: {
21
22
  CUSTOM: string;
22
23
  };
23
24
 
25
+ type Locale = {
26
+ language: LanguageCode;
27
+ country: CountryCode;
28
+ label: string;
29
+ currency: CurrencyCode;
30
+ };
31
+ type Localizations = Record<string, Locale>;
24
32
  type TODO = any;
25
33
  declare module '@shopify/remix-oxygen' {
26
34
  interface AppLoadContext {
@@ -29,6 +37,7 @@ declare module '@shopify/remix-oxygen' {
29
37
  storefront: TODO;
30
38
  env: TODO;
31
39
  cart: TODO;
40
+ withCache?: TODO;
32
41
  }
33
42
  }
34
43
  type WeaverseLoaderArgs = LoaderArgs & {
@@ -70,11 +79,7 @@ interface HydrogenComponentProps<L = any> extends WeaverseElement {
70
79
  loaderData?: L;
71
80
  children?: React.JSX.Element[];
72
81
  }
73
- type I18nLocale = {
74
- country: string;
75
- currency: string;
76
- language: string;
77
- label: string;
82
+ type I18nLocale = Locale & {
78
83
  pathPrefix: string;
79
84
  };
80
85
  type WeaverseLoaderRequestInfo = {
@@ -108,8 +113,12 @@ type HydrogenProjectType = {
108
113
  config: HydrogenProjectConfig;
109
114
  [key: string]: any;
110
115
  };
116
+ type WeaverseThemeConfigs = {
117
+ schema: HydrogenThemeSchema;
118
+ countries: Localizations;
119
+ };
111
120
  type WeaverseInternal = {
112
- themeSchema: HydrogenThemeSchema;
121
+ themeConfigs: WeaverseThemeConfigs;
113
122
  pageAssignment: HydrogenPageAssignment;
114
123
  project: HydrogenProjectType;
115
124
  navigate: NavigateFunction;
@@ -166,17 +175,8 @@ type HydrogenPageData = {
166
175
  type RelativeRoutingType = 'route' | 'path';
167
176
  type To = string | Partial<Path>;
168
177
  type Path = {
169
- /**
170
- * A URL pathname, beginning with a /.
171
- */
172
178
  pathname: string;
173
- /**
174
- * A URL search string, beginning with a ?.
175
- */
176
179
  search: string;
177
- /**
178
- * A URL fragment identifier, beginning with a #.
179
- */
180
180
  hash: string;
181
181
  };
182
182
  type NavigateOptions = {
@@ -188,6 +188,8 @@ type NavigateOptions = {
188
188
  type NavigateFunction = (to: To, options?: NavigateOptions) => void;
189
189
  interface WeaverseHydrogenRootProps {
190
190
  components: HydrogenComponent[];
191
+ countries: Localizations;
192
+ themeSchema: HydrogenThemeSchema;
191
193
  errorComponent: React.FC<{
192
194
  error: {
193
195
  message: string;
@@ -213,11 +215,17 @@ type WeaverseLoaderConfigs = {
213
215
  locale?: string;
214
216
  handle?: string;
215
217
  };
218
+ type FetchProjectRequestBody = {
219
+ projectId: string;
220
+ url: string;
221
+ countries: Localizations;
222
+ i18n?: I18nLocale;
223
+ loaderConfigs?: WeaverseLoaderConfigs;
224
+ };
216
225
  declare global {
217
226
  interface Window {
218
227
  __weaverse: WeaverseHydrogen;
219
228
  __weaverses: WeaverseHydrogen[];
220
- __weaverseHydrogenThemeSchema: HydrogenThemeSchema;
221
229
  }
222
230
  }
223
231
 
@@ -231,17 +239,14 @@ type FetchWithServerCacheParams = {
231
239
  */
232
240
  declare function fetchWithServerCache(params: FetchWithServerCacheParams): Promise<any>;
233
241
 
234
- declare function useThemeSettings(): (Record<string, any> | ((newSettings: any) => void))[];
242
+ declare function weaverseLoader(args: LoaderArgs, components: HydrogenComponent[], countries: Localizations, loaderConfigs?: WeaverseLoaderConfigs): Promise<WeaverseLoaderData | null>;
235
243
 
236
- declare function getSelectedProductOptions(request: Request): _shopify_hydrogen_react_storefront_api_types.SelectedOptionInput[];
244
+ declare function getRequestQueries<T = Record<string, string | boolean>>(request: Request): T;
237
245
 
238
- declare function weaverseLoader(args: LoaderArgs, components: HydrogenComponent[], loaderConfigs?: WeaverseLoaderConfigs): Promise<WeaverseLoaderData | null>;
246
+ declare function getSelectedProductOptions(request: Request): _shopify_hydrogen_react_storefront_api_types.SelectedOptionInput[];
239
247
 
240
- type StudioProps = {
241
- themeSchema: HydrogenThemeSchema;
242
- };
243
- declare function HydrogenStudio({ themeSchema }: StudioProps): React.JSX.Element | null;
248
+ declare function useThemeSettings(): (Record<string, any> | ((newSettings: any) => void))[];
244
249
 
245
- declare function WeaverseHydrogenRoot({ components, errorComponent: ErrorComponent, }: WeaverseHydrogenRootProps): React.JSX.Element;
250
+ declare function WeaverseHydrogenRoot({ errorComponent: ErrorComponent, ...themeConfigs }: WeaverseHydrogenRootProps): React.JSX.Element;
246
251
 
247
- export { HydrogenComponent, HydrogenComponentData, HydrogenComponentInstance, HydrogenComponentPresets, HydrogenComponentProps, HydrogenComponentSchema, HydrogenElement, HydrogenPageAssignment, HydrogenPageConfigs, HydrogenPageData, HydrogenProjectConfig, HydrogenProjectType, HydrogenStudio, HydrogenThemeInfo, HydrogenThemeSchema, HydrogenToolbarAction, InspectorGroup, NavigateFunction, PageType, TODO, WeaverseHydrogen, WeaverseHydrogenRoot, WeaverseHydrogenRootProps, WeaverseInternal, WeaverseLoaderArgs, WeaverseLoaderConfigs, WeaverseLoaderData, WeaverseLoaderRequestInfo, WeaverseStorefrontData, fetchWithServerCache, getSelectedProductOptions, useThemeSettings, weaverseLoader };
252
+ export { FetchProjectRequestBody, HydrogenComponent, HydrogenComponentData, HydrogenComponentInstance, HydrogenComponentPresets, HydrogenComponentProps, HydrogenComponentSchema, HydrogenElement, HydrogenPageAssignment, HydrogenPageConfigs, HydrogenPageData, HydrogenProjectConfig, HydrogenProjectType, HydrogenThemeInfo, HydrogenThemeSchema, HydrogenToolbarAction, I18nLocale, InspectorGroup, Locale, Localizations, NavigateFunction, PageType, TODO, WeaverseHydrogen, WeaverseHydrogenRoot, WeaverseHydrogenRootProps, WeaverseInternal, WeaverseLoaderArgs, WeaverseLoaderConfigs, WeaverseLoaderData, WeaverseLoaderRequestInfo, WeaverseStorefrontData, WeaverseThemeConfigs, fetchWithServerCache, getRequestQueries, getSelectedProductOptions, useThemeSettings, weaverseLoader };
package/dist/index.js CHANGED
@@ -31,17 +31,17 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  // src/index.tsx
32
32
  var src_exports = {};
33
33
  __export(src_exports, {
34
- HydrogenStudio: () => HydrogenStudio,
35
34
  WeaverseHydrogenRoot: () => WeaverseHydrogenRoot,
36
35
  fetchWithServerCache: () => fetchWithServerCache,
36
+ getRequestQueries: () => getRequestQueries,
37
37
  getSelectedProductOptions: () => getSelectedProductOptions,
38
38
  useThemeSettings: () => useThemeSettings,
39
39
  weaverseLoader: () => weaverseLoader
40
40
  });
41
41
  module.exports = __toCommonJS(src_exports);
42
- var import_react8 = require("@remix-run/react");
43
- var import_react9 = require("@weaverse/react");
44
- var import_react10 = __toESM(require("react"));
42
+ var import_react6 = require("@remix-run/react");
43
+ var import_react7 = require("@weaverse/react");
44
+ var import_react8 = __toESM(require("react"));
45
45
  var import_react_error_boundary = require("react-error-boundary");
46
46
 
47
47
  // src/context.ts
@@ -70,10 +70,9 @@ function createWeaverseInstance(weaverseData, components) {
70
70
  ...configs,
71
71
  data: page || {},
72
72
  pageId: page?.id,
73
- platformType: "shopify-hydrogen"
73
+ platformType: "shopify-hydrogen",
74
+ internal: { project, pageAssignment }
74
75
  });
75
- weaverse.internal.project = project;
76
- weaverse.internal.pageAssignment = pageAssignment;
77
76
  components.forEach((comp) => {
78
77
  weaverse.registerElement({
79
78
  type: comp?.schema?.type,
@@ -88,19 +87,26 @@ function createWeaverseInstance(weaverseData, components) {
88
87
  var import_react2 = require("@remix-run/react");
89
88
  var import_react3 = require("@weaverse/react");
90
89
  var import_react4 = require("react");
91
- function useStudio(weaverse) {
90
+ function useStudio(weaverse, countries, schema) {
92
91
  let navigate = (0, import_react2.useNavigate)();
93
92
  let revalidator = (0, import_react2.useRevalidator)();
93
+ let { isDesignMode, weaverseHost, weaverseVersion } = weaverse;
94
+ let isStudio = import_react3.isIframe && isDesignMode && weaverseHost && weaverseVersion;
94
95
  (0, import_react4.useEffect)(() => {
95
- if (import_react3.isIframe && weaverse.isDesignMode) {
96
+ if (isStudio) {
96
97
  weaverse.internal = {
97
98
  ...weaverse.internal,
98
99
  navigate,
99
- revalidator
100
+ revalidator,
101
+ themeConfigs: { schema, countries }
100
102
  };
101
103
  window.__weaverse = weaverse;
102
104
  if (window.weaverseStudio) {
103
105
  window.weaverseStudio.init(weaverse);
106
+ } else {
107
+ (0, import_react3.loadScript)(
108
+ `${weaverseHost}/assets/studio/hydrogen/index.js?v=${weaverseVersion}`
109
+ );
104
110
  }
105
111
  }
106
112
  }, [weaverse]);
@@ -111,26 +117,21 @@ __reExport(src_exports, require("@weaverse/react"), module.exports);
111
117
 
112
118
  // src/fetch.ts
113
119
  var import_hydrogen = require("@shopify/hydrogen");
120
+ async function fetchWithServerCache(params) {
121
+ let { url, options = {}, context } = params;
122
+ let { storefront } = context;
123
+ let withCache = (0, import_hydrogen.createWithCache)(storefront);
124
+ let cacheKey = [url, options.body];
125
+ let data = await withCache(cacheKey, storefront.CacheShort(), async () => {
126
+ let response = await fetch(url, options);
127
+ if (!response.ok)
128
+ throw new Error("Something went wrong. Skipping cache.");
129
+ return await response.json();
130
+ });
131
+ return data;
132
+ }
114
133
 
115
134
  // src/utils.ts
116
- function hashKey(queryKey) {
117
- const rawKeys = Array.isArray(queryKey) ? queryKey : [queryKey];
118
- let hash = "";
119
- for (const key of rawKeys) {
120
- if (key != null) {
121
- if (typeof key === "object") {
122
- if (!!key.body && typeof key.body === "string") {
123
- hash += key.body;
124
- } else {
125
- hash += JSON.stringify(key);
126
- }
127
- } else {
128
- hash += key;
129
- }
130
- }
131
- }
132
- return hash;
133
- }
134
135
  function getRequestQueries(request) {
135
136
  let url = new URL(request.url);
136
137
  return Array.from(url.searchParams.entries()).reduce(
@@ -142,65 +143,14 @@ function getRequestQueries(request) {
142
143
  );
143
144
  }
144
145
 
145
- // src/fetch.ts
146
- var cacheControl = (0, import_hydrogen.generateCacheControlHeader)((0, import_hydrogen.CacheShort)());
147
- async function fetchWithServerCache(params) {
148
- let { url, options = {}, context } = params;
149
- let { storefront, waitUntil } = context;
150
- if (!storefront?.cache || !waitUntil) {
151
- return fetch(url, options);
152
- }
153
- let cacheUrl = new URL(url);
154
- cacheUrl.pathname = "/cache" + cacheUrl.pathname + hashKey([options.body]);
155
- let cacheKey = new Request(cacheUrl.toString());
156
- let response = await storefront.cache.match(cacheKey);
157
- if (!response) {
158
- response = await fetch(url, {
159
- ...options,
160
- headers: {
161
- "cache-control": cacheControl,
162
- ...options.headers
163
- }
164
- });
165
- waitUntil?.(storefront.cache.put(cacheKey, response.clone()));
166
- }
167
- return response;
168
- }
169
-
170
- // src/hooks/use-theme-settings.ts
171
- var import_react5 = require("@weaverse/react");
172
- function useThemeSettings() {
173
- let weaverse = (0, import_react5.useWeaverse)();
174
- let settings = weaverse?.internal?.project?.config?.theme;
175
- let updateSettings = (newSettings) => {
176
- weaverse.internal.project.config.theme = Object.assign(
177
- {},
178
- settings,
179
- newSettings
180
- );
181
- weaverse.triggerUpdate();
182
- };
183
- return [settings, updateSettings];
184
- }
185
-
186
- // src/hydrogen-wrappers.ts
187
- var import_hydrogen2 = require("@shopify/hydrogen");
188
- function getSelectedProductOptions(request) {
189
- let options = (0, import_hydrogen2.getSelectedProductOptions)(request);
190
- return options.filter(
191
- ({ name }) => name !== "isDesignMode" && !name.startsWith("weaverse")
192
- );
193
- }
194
-
195
146
  // src/loader.ts
196
- async function weaverseLoader(args, components, loaderConfigs) {
147
+ async function weaverseLoader(args, components, countries, loaderConfigs) {
197
148
  return new Promise(async (resolve, reject) => {
198
149
  try {
199
150
  let { request, context, params } = args;
200
- let i18n = context?.storefront?.i18n;
201
151
  let queries = getRequestQueries(request);
202
152
  let { WEAVERSE_PROJECT_ID, WEAVERSE_HOST } = context?.env || {};
203
- let { weaverseProjectId, weaverseHost, weaverseVersion, isDesignMode } = queries;
153
+ let { weaverseProjectId, weaverseHost } = queries;
204
154
  let projectId = weaverseProjectId || WEAVERSE_PROJECT_ID;
205
155
  weaverseHost = weaverseHost || WEAVERSE_HOST || "https://weaverse.io";
206
156
  if (!projectId) {
@@ -208,33 +158,19 @@ async function weaverseLoader(args, components, loaderConfigs) {
208
158
  `Missing Weaverse project's id. Try adding WEAVERSE_PROJECT_ID to your .env file then restart the server.`
209
159
  );
210
160
  }
211
- let configs = {
161
+ let i18n = context?.storefront?.i18n;
162
+ let reqBody = {
163
+ i18n,
164
+ countries,
212
165
  projectId,
213
- weaverseHost,
214
- weaverseVersion,
215
- isDesignMode,
216
- requestInfo: {
217
- i18n,
218
- params,
219
- queries,
220
- pathname: new URL(request.url).pathname,
221
- search: new URL(request.url).search
222
- }
166
+ loaderConfigs,
167
+ url: request.url
223
168
  };
224
- let res = await fetchWithServerCache({
169
+ let payload = await fetchWithServerCache({
225
170
  url: `${weaverseHost}/api/public/project`,
226
- options: {
227
- method: "POST",
228
- body: JSON.stringify({
229
- i18n,
230
- projectId,
231
- loaderConfigs,
232
- url: request.url
233
- })
234
- },
171
+ options: { method: "POST", body: JSON.stringify(reqBody) },
235
172
  context
236
173
  });
237
- let payload = await res.json();
238
174
  let { page, project, pageAssignment } = payload;
239
175
  if (!page || !project || !pageAssignment) {
240
176
  throw new Error(
@@ -242,30 +178,22 @@ async function weaverseLoader(args, components, loaderConfigs) {
242
178
  payload?.error || "Invalid Weaverse project payload!"
243
179
  );
244
180
  }
181
+ let configs = {
182
+ projectId,
183
+ weaverseHost,
184
+ weaverseVersion: queries.weaverseVersion,
185
+ isDesignMode: queries.isDesignMode,
186
+ requestInfo: {
187
+ i18n,
188
+ params,
189
+ queries,
190
+ pathname: new URL(request.url).pathname,
191
+ search: new URL(request.url).search
192
+ }
193
+ };
245
194
  if (page?.items) {
246
195
  let items = page.items;
247
- page.items = await Promise.all(
248
- items.map(async (itemData) => {
249
- let type = itemData.type;
250
- let { loader } = components.find(({ schema }) => schema?.type === type) || {};
251
- if (loader && typeof loader === "function") {
252
- try {
253
- return {
254
- ...itemData,
255
- loaderData: await loader({
256
- itemData,
257
- configs,
258
- ...args
259
- })
260
- };
261
- } catch (err) {
262
- console.log(`\u274C Loader run failed! Item: ${itemData}: ${err}`);
263
- return itemData;
264
- }
265
- }
266
- return itemData;
267
- })
268
- );
196
+ page.items = await withLoaderData(items, components, configs, args);
269
197
  }
270
198
  resolve({ page, configs, project, pageAssignment });
271
199
  } catch (err) {
@@ -274,67 +202,78 @@ async function weaverseLoader(args, components, loaderConfigs) {
274
202
  }
275
203
  });
276
204
  }
277
-
278
- // src/studio.tsx
279
- var import_react6 = require("@remix-run/react");
280
- var import_react7 = __toESM(require("react"));
281
- function HydrogenStudio({ themeSchema }) {
282
- let { search } = (0, import_react6.useLocation)();
283
- let params = new URLSearchParams(search);
284
- if (params) {
285
- let isDesignMode = params.get("isDesignMode") === "true";
286
- let weaverseHost = params.get("weaverseHost");
287
- let weaverseVersion = params.get("weaverseVersion");
288
- if (isDesignMode && weaverseHost && weaverseVersion) {
289
- return /* @__PURE__ */ import_react7.default.createElement(import_react7.default.Fragment, null, /* @__PURE__ */ import_react7.default.createElement(
290
- "script",
291
- {
292
- src: `${weaverseHost}/assets/studio/hydrogen/index.js?v=${weaverseVersion}`,
293
- async: true
205
+ async function withLoaderData(items, components, configs, args) {
206
+ return await Promise.all(
207
+ items.map(async (itemData) => {
208
+ let type = itemData.type;
209
+ let { loader } = components.find(({ schema }) => schema?.type === type) || {};
210
+ if (loader && typeof loader === "function") {
211
+ try {
212
+ return {
213
+ ...itemData,
214
+ loaderData: await loader({
215
+ itemData,
216
+ configs,
217
+ ...args
218
+ })
219
+ };
220
+ } catch (err) {
221
+ console.log(`\u274C Loader run failed! Item: ${itemData}: ${err}`);
222
+ return itemData;
294
223
  }
295
- ), /* @__PURE__ */ import_react7.default.createElement(
296
- "script",
297
- {
298
- dangerouslySetInnerHTML: {
299
- __html: `window.__weaverseHydrogenThemeSchema = ${JSON.stringify(
300
- themeSchema
301
- )}`
302
- }
303
- }
304
- ));
305
- }
306
- }
307
- return null;
224
+ }
225
+ return itemData;
226
+ })
227
+ );
228
+ }
229
+
230
+ // src/hydrogen-wrappers.ts
231
+ var import_hydrogen2 = require("@shopify/hydrogen");
232
+ function getSelectedProductOptions(request) {
233
+ let options = (0, import_hydrogen2.getSelectedProductOptions)(request);
234
+ return options.filter(
235
+ ({ name }) => name !== "isDesignMode" && !name.startsWith("weaverse")
236
+ );
237
+ }
238
+
239
+ // src/hooks/use-theme-settings.ts
240
+ var import_react5 = require("@weaverse/react");
241
+ function useThemeSettings() {
242
+ let weaverse = (0, import_react5.useWeaverse)();
243
+ let settings = weaverse?.internal?.project?.config?.theme;
244
+ let updateSettings = (newSettings) => {
245
+ weaverse.internal.project.config.theme = Object.assign(
246
+ {},
247
+ settings,
248
+ newSettings
249
+ );
250
+ weaverse.triggerUpdate();
251
+ };
252
+ return [settings, updateSettings];
308
253
  }
309
254
 
310
255
  // src/index.tsx
311
256
  function WeaverseHydrogenRoot({
312
- components,
313
- errorComponent: ErrorComponent
257
+ errorComponent: ErrorComponent,
258
+ ...themeConfigs
314
259
  }) {
315
- let data = (0, import_react8.useLoaderData)();
316
- let weaverseDataFromLoader = data?.weaverseData;
317
- if (weaverseDataFromLoader) {
318
- if (weaverseDataFromLoader instanceof Promise) {
319
- return /* @__PURE__ */ import_react10.default.createElement(import_react_error_boundary.ErrorBoundary, { fallbackRender: ErrorComponent }, /* @__PURE__ */ import_react10.default.createElement(import_react10.Suspense, null, /* @__PURE__ */ import_react10.default.createElement(import_react8.Await, { resolve: weaverseDataFromLoader }, (resolvedData) => {
320
- return /* @__PURE__ */ import_react10.default.createElement(
260
+ let data = (0, import_react6.useLoaderData)();
261
+ let weaverseData = data?.weaverseData;
262
+ if (weaverseData) {
263
+ if (weaverseData instanceof Promise) {
264
+ return /* @__PURE__ */ import_react8.default.createElement(import_react_error_boundary.ErrorBoundary, { fallbackRender: ErrorComponent }, /* @__PURE__ */ import_react8.default.createElement(import_react8.Suspense, null, /* @__PURE__ */ import_react8.default.createElement(import_react6.Await, { resolve: weaverseData }, (resolvedData) => {
265
+ return /* @__PURE__ */ import_react8.default.createElement(
321
266
  RenderWeaverseRoot,
322
267
  {
323
268
  weaverseData: resolvedData,
324
- components
269
+ ...themeConfigs
325
270
  }
326
271
  );
327
272
  })));
328
273
  }
329
- return /* @__PURE__ */ import_react10.default.createElement(
330
- RenderWeaverseRoot,
331
- {
332
- weaverseData: weaverseDataFromLoader,
333
- components
334
- }
335
- );
274
+ return /* @__PURE__ */ import_react8.default.createElement(RenderWeaverseRoot, { weaverseData, ...themeConfigs });
336
275
  }
337
- return /* @__PURE__ */ import_react10.default.createElement(
276
+ return /* @__PURE__ */ import_react8.default.createElement(
338
277
  ErrorComponent,
339
278
  {
340
279
  error: { message: "No Weaverse data return from route loader!" }
@@ -342,16 +281,16 @@ function WeaverseHydrogenRoot({
342
281
  );
343
282
  }
344
283
  function RenderWeaverseRoot(props) {
345
- let { components, weaverseData } = props;
284
+ let { weaverseData, components, countries, themeSchema } = props;
346
285
  let weaverse = createWeaverseInstance(weaverseData, components);
347
- useStudio(weaverse);
348
- return /* @__PURE__ */ import_react10.default.createElement(import_react9.WeaverseRoot, { context: weaverse });
286
+ useStudio(weaverse, countries, themeSchema);
287
+ return /* @__PURE__ */ import_react8.default.createElement(import_react7.WeaverseRoot, { context: weaverse });
349
288
  }
350
289
  // Annotate the CommonJS export names for ESM import in node:
351
290
  0 && (module.exports = {
352
- HydrogenStudio,
353
291
  WeaverseHydrogenRoot,
354
292
  fetchWithServerCache,
293
+ getRequestQueries,
355
294
  getSelectedProductOptions,
356
295
  useThemeSettings,
357
296
  weaverseLoader,
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  // src/index.tsx
2
2
  import { Await, useLoaderData } from "@remix-run/react";
3
3
  import { WeaverseRoot } from "@weaverse/react";
4
- import React2, { Suspense } from "react";
4
+ import React, { Suspense } from "react";
5
5
  import { ErrorBoundary } from "react-error-boundary";
6
6
 
7
7
  // src/context.ts
@@ -30,10 +30,9 @@ function createWeaverseInstance(weaverseData, components) {
30
30
  ...configs,
31
31
  data: page || {},
32
32
  pageId: page?.id,
33
- platformType: "shopify-hydrogen"
33
+ platformType: "shopify-hydrogen",
34
+ internal: { project, pageAssignment }
34
35
  });
35
- weaverse.internal.project = project;
36
- weaverse.internal.pageAssignment = pageAssignment;
37
36
  components.forEach((comp) => {
38
37
  weaverse.registerElement({
39
38
  type: comp?.schema?.type,
@@ -46,21 +45,28 @@ function createWeaverseInstance(weaverseData, components) {
46
45
 
47
46
  // src/hooks/use-studio.ts
48
47
  import { useNavigate, useRevalidator } from "@remix-run/react";
49
- import { isIframe } from "@weaverse/react";
48
+ import { isIframe, loadScript } from "@weaverse/react";
50
49
  import { useEffect } from "react";
51
- function useStudio(weaverse) {
50
+ function useStudio(weaverse, countries, schema) {
52
51
  let navigate = useNavigate();
53
52
  let revalidator = useRevalidator();
53
+ let { isDesignMode, weaverseHost, weaverseVersion } = weaverse;
54
+ let isStudio = isIframe && isDesignMode && weaverseHost && weaverseVersion;
54
55
  useEffect(() => {
55
- if (isIframe && weaverse.isDesignMode) {
56
+ if (isStudio) {
56
57
  weaverse.internal = {
57
58
  ...weaverse.internal,
58
59
  navigate,
59
- revalidator
60
+ revalidator,
61
+ themeConfigs: { schema, countries }
60
62
  };
61
63
  window.__weaverse = weaverse;
62
64
  if (window.weaverseStudio) {
63
65
  window.weaverseStudio.init(weaverse);
66
+ } else {
67
+ loadScript(
68
+ `${weaverseHost}/assets/studio/hydrogen/index.js?v=${weaverseVersion}`
69
+ );
64
70
  }
65
71
  }
66
72
  }, [weaverse]);
@@ -70,27 +76,22 @@ function useStudio(weaverse) {
70
76
  export * from "@weaverse/react";
71
77
 
72
78
  // src/fetch.ts
73
- import { CacheShort, generateCacheControlHeader } from "@shopify/hydrogen";
79
+ import { createWithCache } from "@shopify/hydrogen";
80
+ async function fetchWithServerCache(params) {
81
+ let { url, options = {}, context } = params;
82
+ let { storefront } = context;
83
+ let withCache = createWithCache(storefront);
84
+ let cacheKey = [url, options.body];
85
+ let data = await withCache(cacheKey, storefront.CacheShort(), async () => {
86
+ let response = await fetch(url, options);
87
+ if (!response.ok)
88
+ throw new Error("Something went wrong. Skipping cache.");
89
+ return await response.json();
90
+ });
91
+ return data;
92
+ }
74
93
 
75
94
  // src/utils.ts
76
- function hashKey(queryKey) {
77
- const rawKeys = Array.isArray(queryKey) ? queryKey : [queryKey];
78
- let hash = "";
79
- for (const key of rawKeys) {
80
- if (key != null) {
81
- if (typeof key === "object") {
82
- if (!!key.body && typeof key.body === "string") {
83
- hash += key.body;
84
- } else {
85
- hash += JSON.stringify(key);
86
- }
87
- } else {
88
- hash += key;
89
- }
90
- }
91
- }
92
- return hash;
93
- }
94
95
  function getRequestQueries(request) {
95
96
  let url = new URL(request.url);
96
97
  return Array.from(url.searchParams.entries()).reduce(
@@ -102,65 +103,14 @@ function getRequestQueries(request) {
102
103
  );
103
104
  }
104
105
 
105
- // src/fetch.ts
106
- var cacheControl = generateCacheControlHeader(CacheShort());
107
- async function fetchWithServerCache(params) {
108
- let { url, options = {}, context } = params;
109
- let { storefront, waitUntil } = context;
110
- if (!storefront?.cache || !waitUntil) {
111
- return fetch(url, options);
112
- }
113
- let cacheUrl = new URL(url);
114
- cacheUrl.pathname = "/cache" + cacheUrl.pathname + hashKey([options.body]);
115
- let cacheKey = new Request(cacheUrl.toString());
116
- let response = await storefront.cache.match(cacheKey);
117
- if (!response) {
118
- response = await fetch(url, {
119
- ...options,
120
- headers: {
121
- "cache-control": cacheControl,
122
- ...options.headers
123
- }
124
- });
125
- waitUntil?.(storefront.cache.put(cacheKey, response.clone()));
126
- }
127
- return response;
128
- }
129
-
130
- // src/hooks/use-theme-settings.ts
131
- import { useWeaverse } from "@weaverse/react";
132
- function useThemeSettings() {
133
- let weaverse = useWeaverse();
134
- let settings = weaverse?.internal?.project?.config?.theme;
135
- let updateSettings = (newSettings) => {
136
- weaverse.internal.project.config.theme = Object.assign(
137
- {},
138
- settings,
139
- newSettings
140
- );
141
- weaverse.triggerUpdate();
142
- };
143
- return [settings, updateSettings];
144
- }
145
-
146
- // src/hydrogen-wrappers.ts
147
- import { getSelectedProductOptions as hydrogen_getSelectedProductOptions } from "@shopify/hydrogen";
148
- function getSelectedProductOptions(request) {
149
- let options = hydrogen_getSelectedProductOptions(request);
150
- return options.filter(
151
- ({ name }) => name !== "isDesignMode" && !name.startsWith("weaverse")
152
- );
153
- }
154
-
155
106
  // src/loader.ts
156
- async function weaverseLoader(args, components, loaderConfigs) {
107
+ async function weaverseLoader(args, components, countries, loaderConfigs) {
157
108
  return new Promise(async (resolve, reject) => {
158
109
  try {
159
110
  let { request, context, params } = args;
160
- let i18n = context?.storefront?.i18n;
161
111
  let queries = getRequestQueries(request);
162
112
  let { WEAVERSE_PROJECT_ID, WEAVERSE_HOST } = context?.env || {};
163
- let { weaverseProjectId, weaverseHost, weaverseVersion, isDesignMode } = queries;
113
+ let { weaverseProjectId, weaverseHost } = queries;
164
114
  let projectId = weaverseProjectId || WEAVERSE_PROJECT_ID;
165
115
  weaverseHost = weaverseHost || WEAVERSE_HOST || "https://weaverse.io";
166
116
  if (!projectId) {
@@ -168,33 +118,19 @@ async function weaverseLoader(args, components, loaderConfigs) {
168
118
  `Missing Weaverse project's id. Try adding WEAVERSE_PROJECT_ID to your .env file then restart the server.`
169
119
  );
170
120
  }
171
- let configs = {
121
+ let i18n = context?.storefront?.i18n;
122
+ let reqBody = {
123
+ i18n,
124
+ countries,
172
125
  projectId,
173
- weaverseHost,
174
- weaverseVersion,
175
- isDesignMode,
176
- requestInfo: {
177
- i18n,
178
- params,
179
- queries,
180
- pathname: new URL(request.url).pathname,
181
- search: new URL(request.url).search
182
- }
126
+ loaderConfigs,
127
+ url: request.url
183
128
  };
184
- let res = await fetchWithServerCache({
129
+ let payload = await fetchWithServerCache({
185
130
  url: `${weaverseHost}/api/public/project`,
186
- options: {
187
- method: "POST",
188
- body: JSON.stringify({
189
- i18n,
190
- projectId,
191
- loaderConfigs,
192
- url: request.url
193
- })
194
- },
131
+ options: { method: "POST", body: JSON.stringify(reqBody) },
195
132
  context
196
133
  });
197
- let payload = await res.json();
198
134
  let { page, project, pageAssignment } = payload;
199
135
  if (!page || !project || !pageAssignment) {
200
136
  throw new Error(
@@ -202,30 +138,22 @@ async function weaverseLoader(args, components, loaderConfigs) {
202
138
  payload?.error || "Invalid Weaverse project payload!"
203
139
  );
204
140
  }
141
+ let configs = {
142
+ projectId,
143
+ weaverseHost,
144
+ weaverseVersion: queries.weaverseVersion,
145
+ isDesignMode: queries.isDesignMode,
146
+ requestInfo: {
147
+ i18n,
148
+ params,
149
+ queries,
150
+ pathname: new URL(request.url).pathname,
151
+ search: new URL(request.url).search
152
+ }
153
+ };
205
154
  if (page?.items) {
206
155
  let items = page.items;
207
- page.items = await Promise.all(
208
- items.map(async (itemData) => {
209
- let type = itemData.type;
210
- let { loader } = components.find(({ schema }) => schema?.type === type) || {};
211
- if (loader && typeof loader === "function") {
212
- try {
213
- return {
214
- ...itemData,
215
- loaderData: await loader({
216
- itemData,
217
- configs,
218
- ...args
219
- })
220
- };
221
- } catch (err) {
222
- console.log(`\u274C Loader run failed! Item: ${itemData}: ${err}`);
223
- return itemData;
224
- }
225
- }
226
- return itemData;
227
- })
228
- );
156
+ page.items = await withLoaderData(items, components, configs, args);
229
157
  }
230
158
  resolve({ page, configs, project, pageAssignment });
231
159
  } catch (err) {
@@ -234,67 +162,78 @@ async function weaverseLoader(args, components, loaderConfigs) {
234
162
  }
235
163
  });
236
164
  }
237
-
238
- // src/studio.tsx
239
- import { useLocation } from "@remix-run/react";
240
- import React from "react";
241
- function HydrogenStudio({ themeSchema }) {
242
- let { search } = useLocation();
243
- let params = new URLSearchParams(search);
244
- if (params) {
245
- let isDesignMode = params.get("isDesignMode") === "true";
246
- let weaverseHost = params.get("weaverseHost");
247
- let weaverseVersion = params.get("weaverseVersion");
248
- if (isDesignMode && weaverseHost && weaverseVersion) {
249
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
250
- "script",
251
- {
252
- src: `${weaverseHost}/assets/studio/hydrogen/index.js?v=${weaverseVersion}`,
253
- async: true
254
- }
255
- ), /* @__PURE__ */ React.createElement(
256
- "script",
257
- {
258
- dangerouslySetInnerHTML: {
259
- __html: `window.__weaverseHydrogenThemeSchema = ${JSON.stringify(
260
- themeSchema
261
- )}`
262
- }
165
+ async function withLoaderData(items, components, configs, args) {
166
+ return await Promise.all(
167
+ items.map(async (itemData) => {
168
+ let type = itemData.type;
169
+ let { loader } = components.find(({ schema }) => schema?.type === type) || {};
170
+ if (loader && typeof loader === "function") {
171
+ try {
172
+ return {
173
+ ...itemData,
174
+ loaderData: await loader({
175
+ itemData,
176
+ configs,
177
+ ...args
178
+ })
179
+ };
180
+ } catch (err) {
181
+ console.log(`\u274C Loader run failed! Item: ${itemData}: ${err}`);
182
+ return itemData;
263
183
  }
264
- ));
265
- }
266
- }
267
- return null;
184
+ }
185
+ return itemData;
186
+ })
187
+ );
188
+ }
189
+
190
+ // src/hydrogen-wrappers.ts
191
+ import { getSelectedProductOptions as hydrogen_getSelectedProductOptions } from "@shopify/hydrogen";
192
+ function getSelectedProductOptions(request) {
193
+ let options = hydrogen_getSelectedProductOptions(request);
194
+ return options.filter(
195
+ ({ name }) => name !== "isDesignMode" && !name.startsWith("weaverse")
196
+ );
197
+ }
198
+
199
+ // src/hooks/use-theme-settings.ts
200
+ import { useWeaverse } from "@weaverse/react";
201
+ function useThemeSettings() {
202
+ let weaverse = useWeaverse();
203
+ let settings = weaverse?.internal?.project?.config?.theme;
204
+ let updateSettings = (newSettings) => {
205
+ weaverse.internal.project.config.theme = Object.assign(
206
+ {},
207
+ settings,
208
+ newSettings
209
+ );
210
+ weaverse.triggerUpdate();
211
+ };
212
+ return [settings, updateSettings];
268
213
  }
269
214
 
270
215
  // src/index.tsx
271
216
  function WeaverseHydrogenRoot({
272
- components,
273
- errorComponent: ErrorComponent
217
+ errorComponent: ErrorComponent,
218
+ ...themeConfigs
274
219
  }) {
275
220
  let data = useLoaderData();
276
- let weaverseDataFromLoader = data?.weaverseData;
277
- if (weaverseDataFromLoader) {
278
- if (weaverseDataFromLoader instanceof Promise) {
279
- return /* @__PURE__ */ React2.createElement(ErrorBoundary, { fallbackRender: ErrorComponent }, /* @__PURE__ */ React2.createElement(Suspense, null, /* @__PURE__ */ React2.createElement(Await, { resolve: weaverseDataFromLoader }, (resolvedData) => {
280
- return /* @__PURE__ */ React2.createElement(
221
+ let weaverseData = data?.weaverseData;
222
+ if (weaverseData) {
223
+ if (weaverseData instanceof Promise) {
224
+ return /* @__PURE__ */ React.createElement(ErrorBoundary, { fallbackRender: ErrorComponent }, /* @__PURE__ */ React.createElement(Suspense, null, /* @__PURE__ */ React.createElement(Await, { resolve: weaverseData }, (resolvedData) => {
225
+ return /* @__PURE__ */ React.createElement(
281
226
  RenderWeaverseRoot,
282
227
  {
283
228
  weaverseData: resolvedData,
284
- components
229
+ ...themeConfigs
285
230
  }
286
231
  );
287
232
  })));
288
233
  }
289
- return /* @__PURE__ */ React2.createElement(
290
- RenderWeaverseRoot,
291
- {
292
- weaverseData: weaverseDataFromLoader,
293
- components
294
- }
295
- );
234
+ return /* @__PURE__ */ React.createElement(RenderWeaverseRoot, { weaverseData, ...themeConfigs });
296
235
  }
297
- return /* @__PURE__ */ React2.createElement(
236
+ return /* @__PURE__ */ React.createElement(
298
237
  ErrorComponent,
299
238
  {
300
239
  error: { message: "No Weaverse data return from route loader!" }
@@ -302,15 +241,15 @@ function WeaverseHydrogenRoot({
302
241
  );
303
242
  }
304
243
  function RenderWeaverseRoot(props) {
305
- let { components, weaverseData } = props;
244
+ let { weaverseData, components, countries, themeSchema } = props;
306
245
  let weaverse = createWeaverseInstance(weaverseData, components);
307
- useStudio(weaverse);
308
- return /* @__PURE__ */ React2.createElement(WeaverseRoot, { context: weaverse });
246
+ useStudio(weaverse, countries, themeSchema);
247
+ return /* @__PURE__ */ React.createElement(WeaverseRoot, { context: weaverse });
309
248
  }
310
249
  export {
311
- HydrogenStudio,
312
250
  WeaverseHydrogenRoot,
313
251
  fetchWithServerCache,
252
+ getRequestQueries,
314
253
  getSelectedProductOptions,
315
254
  useThemeSettings,
316
255
  weaverseLoader
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.1.3",
2
+ "version": "1.1.5",
3
3
  "license": "MIT",
4
4
  "main": "dist/index.js",
5
5
  "typings": "dist/index.d.ts",
@@ -34,7 +34,7 @@
34
34
  "dependencies": {
35
35
  "@remix-run/react": "1.19.1",
36
36
  "@shopify/hydrogen": "2023.7.1",
37
- "@weaverse/react": "1.1.3",
37
+ "@weaverse/react": "1.1.5",
38
38
  "react-error-boundary": "^4.0.10"
39
39
  },
40
40
  "devDependencies": {