@weaverse/hydrogen 1.3.2 → 1.4.1

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.js CHANGED
@@ -17,7 +17,6 @@ var __copyProps = (to, from, except, desc) => {
17
17
  }
18
18
  return to;
19
19
  };
20
- var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
21
20
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
21
  // If the importer is in node compatibility mode or this is not an ESM
23
22
  // file that has been converted to a CommonJS file using a Babel-
@@ -33,24 +32,192 @@ var src_exports = {};
33
32
  __export(src_exports, {
34
33
  ThemeSettingsStore: () => ThemeSettingsStore,
35
34
  WeaverseClient: () => WeaverseClient,
35
+ WeaverseHydrogen: () => WeaverseHydrogen,
36
+ WeaverseHydrogenItem: () => WeaverseHydrogenItem,
36
37
  WeaverseHydrogenRoot: () => WeaverseHydrogenRoot,
37
- createContentSecurityPolicy: () => createContentSecurityPolicy,
38
38
  getRequestQueries: () => getRequestQueries,
39
39
  getSelectedProductOptions: () => getSelectedProductOptions,
40
40
  getWeaverseConfigs: () => getWeaverseConfigs,
41
- getWeaverseCsp: () => getWeaverseCsp,
42
41
  useThemeSettings: () => useThemeSettings,
43
42
  withWeaverse: () => withWeaverse
44
43
  });
45
44
  module.exports = __toCommonJS(src_exports);
46
- __reExport(src_exports, require("@weaverse/react"), module.exports);
45
+ var import_react11 = require("@weaverse/react");
47
46
 
48
- // src/client.ts
49
- var import_hydrogen = require("@shopify/hydrogen");
47
+ // src/WeaverseHydrogenRoot.tsx
48
+ var import_react8 = require("@remix-run/react");
49
+ var import_react9 = require("@weaverse/react");
50
+ var import_react10 = __toESM(require("react"));
51
+ var import_react_error_boundary = require("react-error-boundary");
52
+
53
+ // src/context.ts
54
+ var import_react = require("@weaverse/react");
55
+ var import_react2 = require("react");
56
+ function createCachedWeaverseInstance(params, components) {
57
+ if (import_react.isBrowser) {
58
+ window.__weaverses = window.__weaverses || [];
59
+ let weaverse = window.__weaverses.find((w) => {
60
+ let { pathname, search } = w.requestInfo;
61
+ let { __cachedId } = w.data;
62
+ return pathname === params.requestInfo.pathname && search === params.requestInfo.search && __cachedId === params.data.__cachedId;
63
+ });
64
+ if (!weaverse) {
65
+ weaverse = new WeaverseHydrogen(params, components);
66
+ window.__weaverses.push(weaverse);
67
+ console.log("\u{1F4BF} Weaverse", weaverse);
68
+ }
69
+ return weaverse;
70
+ }
71
+ return new WeaverseHydrogen(params, components);
72
+ }
73
+ function createWeaverseInstance(weaverseData, components) {
74
+ let { page, configs, project, pageAssignment } = weaverseData || {};
75
+ let weaverse = createCachedWeaverseInstance(
76
+ {
77
+ ...configs,
78
+ data: page || {},
79
+ pageId: page?.id,
80
+ internal: { project, pageAssignment }
81
+ },
82
+ components
83
+ );
84
+ return weaverse;
85
+ }
86
+ var ThemeProvider = (0, import_react2.createContext)(null);
87
+ ThemeProvider.displayName = "WeaverseThemeProvider";
88
+
89
+ // src/hooks/use-studio.ts
90
+ var import_react4 = require("@remix-run/react");
91
+ var import_react5 = require("@weaverse/react");
92
+ var import_react6 = require("react");
93
+
94
+ // src/hooks/use-theme-context.ts
95
+ var import_react3 = require("react");
96
+ function useThemeContext() {
97
+ let themeContext = (0, import_react3.useContext)(ThemeProvider);
98
+ if (!themeContext) {
99
+ throw new Error(
100
+ `useThemeContext must be used within a ThemeProvider. Make sure to wrap your app in the withWeaverse HoC.`
101
+ );
102
+ }
103
+ return themeContext;
104
+ }
105
+
106
+ // src/hooks/use-studio.ts
107
+ function useStudio(weaverse) {
108
+ let { revalidate } = (0, import_react4.useRevalidator)();
109
+ let navigate = (0, import_react4.useNavigate)();
110
+ let themeSettingsStore = useThemeContext();
111
+ let { isDesignMode, weaverseHost, weaverseVersion } = weaverse;
112
+ let isStudio = import_react5.isIframe && isDesignMode && weaverseHost && weaverseVersion;
113
+ (0, import_react6.useEffect)(() => {
114
+ if (isStudio) {
115
+ weaverse.internal = {
116
+ ...weaverse.internal,
117
+ navigate,
118
+ revalidate,
119
+ themeSettingsStore
120
+ };
121
+ window.__weaverse = weaverse;
122
+ if (window.weaverseStudio) {
123
+ window.weaverseStudio.init(weaverse);
124
+ } else {
125
+ let studioSrc = `${weaverseHost}/assets/studio/hydrogen/index.js?v=${weaverseVersion}`;
126
+ (0, import_react5.loadScript)(studioSrc);
127
+ }
128
+ }
129
+ }, [weaverse]);
130
+ }
131
+
132
+ // src/hooks/use-theme-settings.ts
133
+ var import_react7 = require("react");
134
+ var ThemeSettingsStore = class {
135
+ settings = null;
136
+ listeners = [];
137
+ countries;
138
+ schema;
139
+ publicEnv;
140
+ constructor(data) {
141
+ let { theme, countries, schema, publicEnv } = data || {};
142
+ this.settings = theme || null;
143
+ this.countries = countries;
144
+ this.schema = schema;
145
+ this.publicEnv = publicEnv;
146
+ }
147
+ updateThemeSettings = (newSettings) => {
148
+ this.settings = { ...this.settings, ...newSettings };
149
+ this.emitChange();
150
+ };
151
+ subscribe = (listener) => {
152
+ this.listeners = [...this.listeners, listener];
153
+ return () => {
154
+ this.listeners = this.listeners.filter((l) => l !== listener);
155
+ };
156
+ };
157
+ getSnapshot = () => {
158
+ return this.settings;
159
+ };
160
+ getServerSnapshot = () => {
161
+ return this.settings;
162
+ };
163
+ emitChange = () => {
164
+ for (let listener of this.listeners) {
165
+ listener();
166
+ }
167
+ };
168
+ };
169
+ function useThemeSettings() {
170
+ let themeSettingsStore = useThemeContext();
171
+ let settings = (0, import_react7.useSyncExternalStore)(
172
+ themeSettingsStore.subscribe,
173
+ themeSettingsStore.getSnapshot,
174
+ themeSettingsStore.getServerSnapshot
175
+ );
176
+ return settings;
177
+ }
178
+
179
+ // src/WeaverseHydrogenRoot.tsx
180
+ function WeaverseHydrogenRoot({
181
+ errorComponent: ErrorComponent = FallbackError,
182
+ components
183
+ }) {
184
+ let loaderData = (0, import_react8.useLoaderData)();
185
+ let data = loaderData?.weaverseData;
186
+ if (data) {
187
+ if (data instanceof Promise) {
188
+ 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: data }, (resolvedData) => {
189
+ return /* @__PURE__ */ import_react10.default.createElement(RenderRoot, { data: resolvedData, components });
190
+ })));
191
+ }
192
+ return /* @__PURE__ */ import_react10.default.createElement(RenderRoot, { data, components });
193
+ }
194
+ return /* @__PURE__ */ import_react10.default.createElement(
195
+ ErrorComponent,
196
+ {
197
+ error: { message: "No Weaverse data return from route loader!" }
198
+ }
199
+ );
200
+ }
201
+ function RenderRoot(props) {
202
+ let { data, components } = props;
203
+ let weaverse = createWeaverseInstance(data, components);
204
+ useStudio(weaverse);
205
+ return /* @__PURE__ */ import_react10.default.createElement(import_react9.WeaverseRoot, { context: weaverse });
206
+ }
207
+ function withWeaverse(Component) {
208
+ return (props) => {
209
+ let { weaverseTheme } = (0, import_react8.useLoaderData)();
210
+ let themeSettingsStore = new ThemeSettingsStore(weaverseTheme);
211
+ return /* @__PURE__ */ import_react10.default.createElement(ThemeProvider.Provider, { value: themeSettingsStore }, /* @__PURE__ */ import_react10.default.createElement(Component, { ...props }));
212
+ };
213
+ }
214
+ function FallbackError({ error }) {
215
+ return /* @__PURE__ */ import_react10.default.createElement("div", null, error?.message || "An unexpected error occurred");
216
+ }
50
217
 
51
218
  // package.json
52
219
  var package_default = {
53
- version: "1.3.2",
220
+ version: "1.4.1",
54
221
  license: "MIT",
55
222
  main: "dist/index.js",
56
223
  typings: "dist/index.d.ts",
@@ -62,7 +229,7 @@ var package_default = {
62
229
  "dist/*"
63
230
  ],
64
231
  engines: {
65
- node: ">=10"
232
+ node: ">=16"
66
233
  },
67
234
  scripts: {
68
235
  start: "npm run dev",
@@ -85,7 +252,7 @@ var package_default = {
85
252
  dependencies: {
86
253
  "@remix-run/react": "1.19.1",
87
254
  "@shopify/hydrogen": "2023.7.8",
88
- "@weaverse/react": "1.3.2",
255
+ "@weaverse/react": "1.4.1",
89
256
  "react-error-boundary": "^4.0.11"
90
257
  },
91
258
  devDependencies: {
@@ -124,51 +291,61 @@ function getWeaverseConfigs(request, env) {
124
291
  }
125
292
  };
126
293
  }
127
- function getWeaverseCsp(request) {
128
- let url = new URL(request.url);
129
- let weaverseHost = url.searchParams.get("weaverseHost");
130
- let weaverseHosts = ["https://*.weaverse.io"];
131
- if (weaverseHost) {
132
- weaverseHosts.push(weaverseHost);
133
- }
134
- return {
135
- frameAncestors: weaverseHosts,
136
- defaultSrc: [
137
- "'self'",
138
- "https://cdn.shopify.com",
139
- "https://shopify.com",
140
- "https://*.youtube.com",
141
- ...weaverseHosts
142
- ],
143
- styleSrc: [
144
- "'self'",
145
- "'unsafe-inline'",
146
- "https://cdn.shopify.com",
147
- ...weaverseHosts
148
- ]
149
- };
150
- }
151
294
 
152
- // src/client.ts
295
+ // src/weaverse-client.ts
153
296
  var WeaverseClient = class {
297
+ API = "api/public/project";
298
+ clientVersion = package_default.version;
299
+ basePageConfigs;
300
+ basePageRequestBody;
301
+ storefront;
302
+ // storefront: Storefront<I18nLocale>
303
+ components;
304
+ countries;
305
+ themeSchema;
306
+ configs;
307
+ withCache;
308
+ // withCache: ReturnType<typeof createWithCache>
154
309
  constructor(args) {
155
- this.API = "api/public/project";
156
- this.clientVersion = package_default.version;
157
- this.fetchWithCache = (url, options) => {
158
- let cacheKey = [url, options.body];
159
- let { strategy = this.storefront.CacheShort(), ...reqInit } = options;
160
- let res = this.withCache(cacheKey, strategy, async () => {
161
- let response = await fetch(url, reqInit);
162
- if (!response.ok) {
163
- throw new Error("Something went wrong. Skipping cache.");
164
- }
165
- return await response.json();
166
- });
167
- return res;
310
+ let { configs, storefront, components, countries, withCache, themeSchema } = args;
311
+ this.storefront = storefront;
312
+ this.components = components;
313
+ this.countries = countries;
314
+ this.themeSchema = themeSchema;
315
+ this.configs = configs;
316
+ this.withCache = withCache;
317
+ this.basePageConfigs = {
318
+ projectId: configs.projectId,
319
+ weaverseHost: configs.weaverseHost,
320
+ weaverseVersion: configs.weaverseVersion,
321
+ isDesignMode: configs.isDesignMode
168
322
  };
169
- this.loadThemeSettings = async (strategy) => {
323
+ this.basePageRequestBody = {
324
+ countries,
325
+ isDesignMode: this.configs.isDesignMode,
326
+ i18n: storefront.i18n,
327
+ projectId: this.configs.projectId
328
+ };
329
+ }
330
+ fetchWithCache = (url, options) => {
331
+ let cacheKey = [url, options.body];
332
+ let { strategy = this.storefront.CacheShort(), ...reqInit } = options;
333
+ let res = this.withCache(cacheKey, strategy, async () => {
334
+ let response = await fetch(url, reqInit);
335
+ if (!response.ok) {
336
+ throw new Error("Something went wrong. Skipping cache.");
337
+ }
338
+ return await response.json();
339
+ });
340
+ return res;
341
+ };
342
+ loadThemeSettings = async (strategy) => {
343
+ try {
170
344
  let { API, configs } = this;
171
345
  let { weaverseHost, projectId } = configs;
346
+ if (!projectId) {
347
+ throw new Error("Missing Weaverse projectId!");
348
+ }
172
349
  let res = await this.fetchWithCache(
173
350
  `${weaverseHost}/${API}/${projectId}/configs`,
174
351
  { strategy }
@@ -186,314 +363,162 @@ var WeaverseClient = class {
186
363
  }
187
364
  }
188
365
  return data;
189
- };
190
- this.loadPage = async (args, configs = {}) => {
191
- return new Promise(async (resolve, reject) => {
192
- try {
193
- let { request, params } = args;
194
- let { strategy, ...pageLoadParams } = configs;
195
- let body = {
196
- ...this.basePageRequestBody,
197
- params: pageLoadParams,
198
- url: request.url
199
- };
200
- let reqInit = {
201
- method: "POST",
202
- body: JSON.stringify(body)
203
- };
204
- let url = `${this.configs.weaverseHost}/${this.API}`;
205
- let payload;
206
- if (this.configs.isDesignMode) {
207
- payload = await fetch(url, reqInit).then((res) => res.json());
208
- } else {
209
- payload = await this.fetchWithCache(url, {
210
- ...reqInit,
211
- strategy
212
- });
213
- }
214
- let { page, project, pageAssignment } = payload;
215
- if (!page || !project || !pageAssignment) {
216
- return reject(
217
- new Error(
218
- // @ts-ignore
219
- payload?.error || "Invalid Weaverse project payload!"
220
- )
221
- );
222
- }
223
- if (page?.items) {
224
- let items = page.items;
225
- page.items = await Promise.all(
226
- items.map((item) => this.execComponentLoader(item, args))
227
- );
228
- }
229
- let data = {
230
- page,
231
- project,
232
- pageAssignment,
233
- configs: {
234
- ...this.basePageConfigs,
235
- requestInfo: {
236
- params,
237
- i18n: this.storefront.i18n,
238
- queries: getRequestQueries(request),
239
- pathname: new URL(request.url).pathname,
240
- search: new URL(request.url).search
241
- }
242
- }
243
- };
244
- return resolve(data);
245
- } catch (err) {
246
- console.log(`\u274C [Weaverse page]`, err);
247
- reject(err);
366
+ } catch (err) {
367
+ console.log(`\u274C [Weaverse theme settings]`, err);
368
+ return null;
369
+ }
370
+ };
371
+ loadPage = async (args, configs = {}) => {
372
+ return new Promise(async (resolve, reject) => {
373
+ try {
374
+ if (!this.configs.projectId) {
375
+ throw new Error("Missing Weaverse projectId!");
248
376
  }
249
- });
250
- };
251
- this.execComponentLoader = async (item, args) => {
252
- let schema = this.components.find(
253
- ({ schema: schema2 }) => schema2?.type === item.type
254
- );
255
- let { loader } = schema || {};
256
- if (loader && typeof loader === "function") {
257
- try {
258
- return {
259
- ...item,
260
- loaderData: await loader({
261
- itemData: item,
262
- ...args
263
- })
264
- };
265
- } catch (err) {
266
- console.log(`\u274C [Weaverse item loader]`, item.id, err);
267
- return item;
377
+ let { request, params } = args;
378
+ let { strategy, ...pageLoadParams } = configs;
379
+ let body = {
380
+ ...this.basePageRequestBody,
381
+ params: pageLoadParams,
382
+ url: request.url
383
+ };
384
+ let reqInit = {
385
+ method: "POST",
386
+ body: JSON.stringify(body)
387
+ };
388
+ let url = `${this.configs.weaverseHost}/${this.API}`;
389
+ let payload;
390
+ if (this.configs.isDesignMode) {
391
+ payload = await fetch(url, reqInit).then((res) => res.json());
392
+ } else {
393
+ payload = await this.fetchWithCache(url, {
394
+ ...reqInit,
395
+ strategy
396
+ });
268
397
  }
398
+ let { page, project, pageAssignment } = payload;
399
+ if (!page || !project || !pageAssignment) {
400
+ throw new Error(
401
+ // @ts-ignore
402
+ payload?.error || "Invalid Weaverse project payload!"
403
+ );
404
+ }
405
+ if (page?.items) {
406
+ let items = page.items;
407
+ page.items = await Promise.all(
408
+ items.map((item) => this.execComponentLoader(item, args))
409
+ );
410
+ }
411
+ let data = {
412
+ page,
413
+ project,
414
+ pageAssignment,
415
+ configs: {
416
+ ...this.basePageConfigs,
417
+ requestInfo: {
418
+ params,
419
+ i18n: this.storefront.i18n,
420
+ queries: getRequestQueries(request),
421
+ pathname: new URL(request.url).pathname,
422
+ search: new URL(request.url).search
423
+ }
424
+ }
425
+ };
426
+ return resolve(data);
427
+ } catch (err) {
428
+ console.log(`\u274C [Weaverse page]`, err);
429
+ reject(err);
269
430
  }
270
- return item;
271
- };
272
- let { configs, storefront, components, countries, withCache, themeSchema } = args;
273
- this.storefront = storefront;
274
- this.components = components;
275
- this.countries = countries;
276
- this.themeSchema = themeSchema;
277
- this.configs = configs;
278
- this.withCache = withCache;
279
- this.basePageConfigs = {
280
- projectId: configs.projectId,
281
- weaverseHost: configs.weaverseHost,
282
- weaverseVersion: configs.weaverseVersion,
283
- isDesignMode: configs.isDesignMode
284
- };
285
- this.basePageRequestBody = {
286
- countries,
287
- isDesignMode: this.configs.isDesignMode,
288
- i18n: storefront.i18n,
289
- projectId: this.configs.projectId
290
- };
291
- }
292
- };
293
-
294
- // src/hooks/use-theme-settings.ts
295
- var import_react4 = require("react");
296
-
297
- // src/hooks/use-theme-context.ts
298
- var import_react3 = require("react");
299
-
300
- // src/context.ts
301
- var import_react = require("@weaverse/react");
302
- var import_react2 = require("react");
303
- function createCachedWeaverseInstance(init) {
304
- if (import_react.isBrowser) {
305
- window.__weaverses = window.__weaverses || [];
306
- let weaverse = window.__weaverses.find((w) => {
307
- let { pathname, search } = w.requestInfo;
308
- let { __cachedId } = w.data;
309
- return pathname === init.requestInfo.pathname && search === init.requestInfo.search && __cachedId === init.data.__cachedId;
310
431
  });
311
- if (!weaverse) {
312
- weaverse = new import_react.Weaverse(init);
313
- window.__weaverses.push(weaverse);
314
- console.log("\u{1F4BF} Weaverse", weaverse);
315
- }
316
- return weaverse;
317
- }
318
- return new import_react.Weaverse(init);
319
- }
320
- function createWeaverseInstance(weaverseData, components) {
321
- let { page, configs, project, pageAssignment } = weaverseData || {};
322
- let weaverse = createCachedWeaverseInstance({
323
- ...configs,
324
- data: page || {},
325
- pageId: page?.id,
326
- platformType: "shopify-hydrogen",
327
- internal: { project, pageAssignment }
328
- });
329
- components.forEach((comp) => {
330
- weaverse.registerElement({
331
- type: comp?.schema?.type,
332
- Component: comp?.default,
333
- schema: comp?.schema,
334
- loader: comp?.loader
335
- });
336
- });
337
- return weaverse;
338
- }
339
- var ThemeProvider = (0, import_react2.createContext)(null);
340
- ThemeProvider.displayName = "WeaverseThemeProvider";
341
-
342
- // src/hooks/use-theme-context.ts
343
- function useThemeContext() {
344
- let themeContext = (0, import_react3.useContext)(ThemeProvider);
345
- if (!themeContext) {
346
- throw new Error(
347
- `useThemeContext must be used within a ThemeProvider. Make sure to wrap your app in the withWeaverse HoC.`
432
+ };
433
+ execComponentLoader = async (item, args) => {
434
+ let schema = this.components.find(
435
+ ({ schema: schema2 }) => schema2?.type === item.type
348
436
  );
349
- }
350
- return themeContext;
351
- }
352
-
353
- // src/hooks/use-theme-settings.ts
354
- var ThemeSettingsStore = class {
355
- constructor(data) {
356
- this.settings = null;
357
- this.listeners = [];
358
- this.updateThemeSettings = (newSettings) => {
359
- this.settings = { ...this.settings, ...newSettings };
360
- this.emitChange();
361
- };
362
- this.subscribe = (listener) => {
363
- this.listeners = [...this.listeners, listener];
364
- return () => {
365
- this.listeners = this.listeners.filter((l) => l !== listener);
366
- };
367
- };
368
- this.getSnapshot = () => {
369
- return this.settings;
370
- };
371
- this.getServerSnapshot = () => {
372
- return this.settings;
373
- };
374
- this.emitChange = () => {
375
- for (let listener of this.listeners) {
376
- listener();
437
+ let { loader } = schema || {};
438
+ if (loader && typeof loader === "function") {
439
+ try {
440
+ return {
441
+ ...item,
442
+ loaderData: await loader({
443
+ itemData: item,
444
+ ...args
445
+ })
446
+ };
447
+ } catch (err) {
448
+ console.log(`\u274C [Weaverse item loader]`, item.id, err);
449
+ return item;
377
450
  }
378
- };
379
- let { theme, countries, schema, publicEnv } = data || {};
380
- this.settings = theme || null;
381
- this.countries = countries;
382
- this.schema = schema;
383
- this.publicEnv = publicEnv;
384
- }
451
+ }
452
+ return item;
453
+ };
385
454
  };
386
- function useThemeSettings() {
387
- let themeSettingsStore = useThemeContext();
388
- let settings = (0, import_react4.useSyncExternalStore)(
389
- themeSettingsStore.subscribe,
390
- themeSettingsStore.getSnapshot,
391
- themeSettingsStore.getServerSnapshot
392
- );
393
- return settings;
394
- }
395
455
 
396
456
  // src/wrappers.ts
397
- var import_hydrogen2 = require("@shopify/hydrogen");
398
- var import_hydrogen3 = require("@shopify/hydrogen");
457
+ var import_hydrogen = require("@shopify/hydrogen");
399
458
  function getSelectedProductOptions(request) {
400
- let options = (0, import_hydrogen2.getSelectedProductOptions)(request);
459
+ let options = (0, import_hydrogen.getSelectedProductOptions)(request);
401
460
  return options.filter(
402
461
  ({ name }) => name !== "isDesignMode" && !name.startsWith("weaverse")
403
462
  );
404
463
  }
405
- function createContentSecurityPolicy(request, directives) {
406
- let weaverseDirectives = getWeaverseCsp(request);
407
- return (0, import_hydrogen3.createContentSecurityPolicy)({
408
- ...directives,
409
- ...weaverseDirectives
410
- });
411
- }
412
464
 
413
- // src/WeaverseHydrogenRoot.tsx
414
- var import_react8 = require("@remix-run/react");
415
- var import_react9 = require("@weaverse/react");
416
- var import_react10 = __toESM(require("react"));
417
- var import_react_error_boundary = require("react-error-boundary");
418
-
419
- // src/hooks/use-studio.ts
420
- var import_react5 = require("@remix-run/react");
421
- var import_react6 = require("@weaverse/react");
422
- var import_react7 = require("react");
423
- function useStudio(weaverse) {
424
- let { revalidate } = (0, import_react5.useRevalidator)();
425
- let navigate = (0, import_react5.useNavigate)();
426
- let themeSettingsStore = useThemeContext();
427
- let { isDesignMode, weaverseHost, weaverseVersion } = weaverse;
428
- let isStudio = import_react6.isIframe && isDesignMode && weaverseHost && weaverseVersion;
429
- (0, import_react7.useEffect)(() => {
430
- if (isStudio) {
431
- weaverse.internal = {
432
- ...weaverse.internal,
433
- navigate,
434
- revalidate,
435
- themeSettingsStore
436
- };
437
- window.__weaverse = weaverse;
438
- if (window.weaverseStudio) {
439
- window.weaverseStudio.init(weaverse);
440
- } else {
441
- let studioSrc = `${weaverseHost}/assets/studio/hydrogen/index.js?v=${weaverseVersion}`;
442
- (0, import_react6.loadScript)(studioSrc);
465
+ // src/index.ts
466
+ var WeaverseHydrogen = class extends import_react11.Weaverse {
467
+ platformType = "shopify-hydrogen";
468
+ pageId;
469
+ internal;
470
+ requestInfo;
471
+ constructor(params, components) {
472
+ let { internal, pageId, requestInfo, ...coreParams } = params;
473
+ super({ ...coreParams, ItemConstructor: WeaverseHydrogenItem });
474
+ this.internal = internal;
475
+ this.pageId = pageId;
476
+ this.requestInfo = requestInfo;
477
+ this.registerComponents(components);
478
+ }
479
+ registerElement(element) {
480
+ super.registerElement(element);
481
+ }
482
+ registerComponents(components) {
483
+ components.forEach((comp) => {
484
+ this.registerElement({
485
+ type: comp?.schema?.type,
486
+ Component: comp?.default,
487
+ schema: comp?.schema,
488
+ loader: comp?.loader
489
+ });
490
+ });
491
+ }
492
+ };
493
+ var WeaverseHydrogenItem = class extends import_react11.WeaverseItemStore {
494
+ constructor(intialData, weaverse) {
495
+ super(intialData, weaverse);
496
+ let { data, ...rest } = intialData;
497
+ this._store = { ...data, ...rest };
498
+ }
499
+ get Element() {
500
+ return super.Element;
501
+ }
502
+ get data() {
503
+ let defaultData = this.Element?.schema?.inspector?.flatMap((group) => group.inputs)?.reduce((a, { defaultValue, name }) => {
504
+ if (name && defaultValue !== null && defaultValue !== void 0) {
505
+ a[name] = defaultValue;
443
506
  }
444
- }
445
- }, [weaverse]);
446
- }
447
-
448
- // src/WeaverseHydrogenRoot.tsx
449
- function WeaverseHydrogenRoot({
450
- errorComponent: ErrorComponent = FallbackError,
451
- components
452
- }) {
453
- let loaderData = (0, import_react8.useLoaderData)();
454
- let data = loaderData?.weaverseData;
455
- if (data) {
456
- if (data instanceof Promise) {
457
- 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: data }, (resolvedData) => {
458
- return /* @__PURE__ */ import_react10.default.createElement(RenderRoot, { data: resolvedData, components });
459
- })));
460
- }
461
- return /* @__PURE__ */ import_react10.default.createElement(RenderRoot, { data, components });
507
+ return a;
508
+ }, {});
509
+ return { ...defaultData, ...super.data };
462
510
  }
463
- return /* @__PURE__ */ import_react10.default.createElement(
464
- ErrorComponent,
465
- {
466
- error: { message: "No Weaverse data return from route loader!" }
467
- }
468
- );
469
- }
470
- function RenderRoot(props) {
471
- let { data, components } = props;
472
- let weaverse = createWeaverseInstance(data, components);
473
- useStudio(weaverse);
474
- return /* @__PURE__ */ import_react10.default.createElement(import_react9.WeaverseRoot, { context: weaverse });
475
- }
476
- var withWeaverse = (Component) => {
477
- return (props) => {
478
- let { weaverseTheme } = (0, import_react8.useLoaderData)();
479
- let themeSettingsStore = new ThemeSettingsStore(weaverseTheme);
480
- return /* @__PURE__ */ import_react10.default.createElement(ThemeProvider.Provider, { value: themeSettingsStore }, /* @__PURE__ */ import_react10.default.createElement(Component, { ...props }));
481
- };
482
511
  };
483
- function FallbackError({ error }) {
484
- return /* @__PURE__ */ import_react10.default.createElement("div", null, error?.message || "An unexpected error occurred");
485
- }
486
512
  // Annotate the CommonJS export names for ESM import in node:
487
513
  0 && (module.exports = {
488
514
  ThemeSettingsStore,
489
515
  WeaverseClient,
516
+ WeaverseHydrogen,
517
+ WeaverseHydrogenItem,
490
518
  WeaverseHydrogenRoot,
491
- createContentSecurityPolicy,
492
519
  getRequestQueries,
493
520
  getSelectedProductOptions,
494
521
  getWeaverseConfigs,
495
- getWeaverseCsp,
496
522
  useThemeSettings,
497
- withWeaverse,
498
- ...require("@weaverse/react")
523
+ withWeaverse
499
524
  });