@weaverse/hydrogen 5.0.0 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -5,6 +5,7 @@ import { memo, Suspense, createContext, useEffect } from 'react';
5
5
  import { ErrorBoundary } from 'react-error-boundary';
6
6
  import { useLoaderData, Await, useRevalidator, useNavigation, useLocation, useNavigate, useRouteLoaderData } from 'react-router';
7
7
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
+ export * from '@weaverse/schema';
8
9
 
9
10
  var __defProp = Object.defineProperty;
10
11
  var __export = (target, all) => {
@@ -12,7 +13,52 @@ var __export = (target, all) => {
12
13
  __defProp(target, name, { get: all[name], enumerable: true });
13
14
  };
14
15
 
16
+ // src/components/main.tsx
17
+ var main_exports = {};
18
+ __export(main_exports, {
19
+ default: () => main_default,
20
+ schema: () => schema
21
+ });
22
+ function Main(props) {
23
+ let { children, dangerouslySetInnerHTML, ...rest } = props;
24
+ return /* @__PURE__ */ jsx(
25
+ "div",
26
+ {
27
+ ...rest,
28
+ children,
29
+ dangerouslySetInnerHTML: children ? void 0 : dangerouslySetInnerHTML
30
+ }
31
+ );
32
+ }
33
+ var main_default = Main;
34
+ var schema = {
35
+ type: "main",
36
+ title: "Main",
37
+ settings: []
38
+ };
39
+
40
+ // src/components/index.ts
41
+ var defaultComponents = [main_exports];
42
+
15
43
  // src/utils/index.ts
44
+ var warnedTypes = /* @__PURE__ */ new Set();
45
+ function logOnce(type, message) {
46
+ if (!warnedTypes.has(type)) {
47
+ console.warn(message);
48
+ warnedTypes.add(type);
49
+ }
50
+ }
51
+ function deepMergeArrays(target, source) {
52
+ return [...target, ...source];
53
+ }
54
+ function mergeInspectorSettings(settings, inspector, type) {
55
+ if (!inspector?.length) return settings;
56
+ if (!settings?.length) return inspector;
57
+ console.info(
58
+ `Schema "${type}": Both 'settings' and 'inspector' found. Using 'settings' with 'inspector' as fallback.`
59
+ );
60
+ return deepMergeArrays(settings, inspector);
61
+ }
16
62
  function getRequestQueries(request) {
17
63
  let url = new URL(request.url);
18
64
  return Array.from(url.searchParams.entries()).reduce(
@@ -58,9 +104,53 @@ function getWeaverseConfigs(request, env) {
58
104
  }
59
105
  function generateDataFromSchema(schema2) {
60
106
  let data = {};
61
- let inspector = schema2?.inspector;
62
- if (inspector) {
63
- for (let group of inspector) {
107
+ let inspectorGroups = [];
108
+ const isComponentSchema = (s) => {
109
+ return "type" in s && typeof s.type === "string";
110
+ };
111
+ if (isComponentSchema(schema2)) {
112
+ if (schema2.settings) {
113
+ inspectorGroups = schema2.settings;
114
+ }
115
+ if (schema2.inspector) {
116
+ if (schema2.settings?.length) {
117
+ inspectorGroups = mergeInspectorSettings(
118
+ schema2.settings,
119
+ schema2.inspector,
120
+ schema2.type || "unknown"
121
+ );
122
+ } else {
123
+ inspectorGroups = schema2.inspector;
124
+ if (schema2.type) {
125
+ logOnce(
126
+ schema2.type,
127
+ `\u26A0\uFE0F Schema "${schema2.type}": The 'inspector' property is deprecated. Please use 'settings' instead.`
128
+ );
129
+ }
130
+ }
131
+ }
132
+ } else {
133
+ if (schema2.settings) {
134
+ inspectorGroups = schema2.settings;
135
+ }
136
+ if (schema2.inspector) {
137
+ if (schema2.settings?.length) {
138
+ inspectorGroups = mergeInspectorSettings(
139
+ schema2.settings,
140
+ schema2.inspector,
141
+ "Theme Schema"
142
+ );
143
+ } else {
144
+ inspectorGroups = schema2.inspector;
145
+ logOnce(
146
+ "ThemeSchema",
147
+ `\u26A0\uFE0F Theme Schema: The 'inspector' property is deprecated. Please use 'settings' instead.`
148
+ );
149
+ }
150
+ }
151
+ }
152
+ if (inspectorGroups?.length) {
153
+ for (let group of inspectorGroups) {
64
154
  for (let input of group.inputs) {
65
155
  let { name, defaultValue } = input;
66
156
  if (name && defaultValue !== null && defaultValue !== void 0) {
@@ -132,8 +222,195 @@ function getPreviewData(type, components, weaverseHost) {
132
222
  }
133
223
  };
134
224
  }
225
+ var ThemeSettingsStore = class extends EventEmitter {
226
+ settings = {};
227
+ schema;
228
+ publicEnv;
229
+ constructor(data) {
230
+ super();
231
+ let { theme, schema: schema2, publicEnv } = data || {};
232
+ this.settings = { ...theme };
233
+ this.schema = schema2;
234
+ this.publicEnv = publicEnv;
235
+ if (isBrowser) {
236
+ window.__weaverseThemeSettingsStore = this;
237
+ }
238
+ }
239
+ updateThemeSettings = (newSettings) => {
240
+ this.settings = {
241
+ ...this.settings,
242
+ ...newSettings
243
+ };
244
+ this.emit(this.settings);
245
+ };
246
+ getSnapshot = () => {
247
+ return this.settings;
248
+ };
249
+ getServerSnapshot = () => {
250
+ return this.settings;
251
+ };
252
+ };
253
+ function useThemeSettingsStore() {
254
+ let data = useRouteLoaderData("root");
255
+ if (isBrowser && window.__weaverseThemeSettingsStore) {
256
+ return window.__weaverseThemeSettingsStore;
257
+ }
258
+ return new ThemeSettingsStore(data?.weaverseTheme);
259
+ }
135
260
 
136
- // src/weaverse-client.ts
261
+ // src/utils/use-studio.ts
262
+ function useStudio(weaverse) {
263
+ let { revalidate } = useRevalidator();
264
+ let navigation = useNavigation();
265
+ let { pathname, search } = useLocation();
266
+ let navigate = useNavigate();
267
+ let themeSettingsStore = useThemeSettingsStore();
268
+ let { isDesignMode, weaverseHost, weaverseVersion, isPreviewMode } = weaverse;
269
+ useEffect(() => {
270
+ if (navigation.state === "idle") {
271
+ if (isPreviewMode) {
272
+ let previewSrc = `${weaverseHost}/static/studio/hydrogen/preview.js?v=${weaverseVersion}`;
273
+ loadScript(previewSrc).catch(console.error);
274
+ } else if (isDesignMode) {
275
+ weaverse.internal = {
276
+ ...weaverse.internal,
277
+ navigate,
278
+ revalidate,
279
+ themeSettingsStore
280
+ };
281
+ let studioSrc = `${weaverseHost}/static/studio/hydrogen/index.js?v=${weaverseVersion}`;
282
+ loadScript(studioSrc).then(() => {
283
+ window.weaverseStudio?.init(weaverse);
284
+ }).catch(console.error);
285
+ }
286
+ }
287
+ }, [pathname, search, navigation.state]);
288
+ usePixel(weaverse);
289
+ }
290
+ function usePixel(context) {
291
+ let { projectId, pageId, weaverseHost, isDesignMode } = context;
292
+ useEffect(() => {
293
+ if (!projectId || !pageId || !weaverseHost || isDesignMode) return;
294
+ let url = `${weaverseHost}/api/public/px`;
295
+ let img = new Image();
296
+ img.onload = () => img.remove();
297
+ img.src = `${url}?projectId=${projectId}&pageId=${pageId}`;
298
+ }, []);
299
+ }
300
+ var WeaverseHydrogenItem = class extends WeaverseItemStore {
301
+ constructor(initialData, weaverse) {
302
+ super(initialData, weaverse);
303
+ let { data, ...rest } = initialData;
304
+ if (!this.Element?.schema) {
305
+ console.error("Element is missing schema or not found!");
306
+ return;
307
+ }
308
+ let schemaData = generateDataFromSchema(this.Element.schema);
309
+ Object.assign(this._store, schemaData, data, rest);
310
+ }
311
+ get Element() {
312
+ return super.Element;
313
+ }
314
+ };
315
+ Weaverse.ItemConstructor = WeaverseHydrogenItem;
316
+ var WeaverseHydrogen = class extends Weaverse {
317
+ platformType = "shopify-hydrogen";
318
+ pageId;
319
+ internal;
320
+ requestInfo;
321
+ static itemInstances;
322
+ static elementRegistry;
323
+ constructor(params) {
324
+ let { internal, pageId, requestInfo, ...coreParams } = params;
325
+ super({ ...coreParams });
326
+ this.internal = internal;
327
+ this.pageId = pageId;
328
+ this.requestInfo = requestInfo;
329
+ }
330
+ };
331
+ function createWeaverseInstance(params) {
332
+ if (isBrowser) {
333
+ window.__weaverses = window.__weaverses || {};
334
+ let weaverse = window.__weaverses[params.pageId];
335
+ if (!weaverse || weaverse?.requestInfo?.pathname !== params.requestInfo.pathname || weaverse?.requestInfo?.search !== params.requestInfo.search) {
336
+ weaverse = new WeaverseHydrogen(params);
337
+ window.__weaverses[params.pageId] = weaverse;
338
+ }
339
+ if (weaverse?.isDesignMode) {
340
+ weaverse.requestInfo = params.requestInfo;
341
+ window.weaverseStudio?.refreshStudio(params);
342
+ }
343
+ return weaverse;
344
+ }
345
+ return new WeaverseHydrogen(params);
346
+ }
347
+ var StudioBridge = memo(({ context }) => {
348
+ useStudio(context);
349
+ return null;
350
+ });
351
+ function RenderRoot(props) {
352
+ let { data, components } = props;
353
+ for (let comp of [...components, ...defaultComponents]) {
354
+ comp?.schema?.type && registerComponent({
355
+ type: comp?.schema.type,
356
+ Component: comp.default,
357
+ schema: comp.schema,
358
+ loader: comp.loader
359
+ });
360
+ }
361
+ let { page, configs, project, pageAssignment } = data || {};
362
+ let weaverse = createWeaverseInstance({
363
+ ...configs,
364
+ data: page,
365
+ pageId: page?.id,
366
+ internal: { project, pageAssignment }
367
+ });
368
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
369
+ /* @__PURE__ */ jsx(WeaverseRoot, { context: weaverse }),
370
+ /* @__PURE__ */ jsx(StudioBridge, { context: weaverse })
371
+ ] });
372
+ }
373
+ function registerComponent(element) {
374
+ WeaverseHydrogen.registerElement(element);
375
+ }
376
+ var WeaverseHydrogenRoot = memo(
377
+ ({
378
+ components,
379
+ errorComponent: ErrorComponent = ({ error }) => /* @__PURE__ */ jsx("div", { children: error?.message || "An unexpected error occurred" })
380
+ }) => {
381
+ let loaderData = useLoaderData();
382
+ let data = loaderData?.weaverseData;
383
+ if (data) {
384
+ if (data instanceof Promise) {
385
+ return /* @__PURE__ */ jsx(ErrorBoundary, { fallbackRender: ErrorComponent, children: /* @__PURE__ */ jsx(Suspense, { children: /* @__PURE__ */ jsx(Await, { resolve: data, children: (resolvedData) => /* @__PURE__ */ jsx(RenderRoot, { data: resolvedData, components }) }) }) });
386
+ }
387
+ return /* @__PURE__ */ jsx(RenderRoot, { data, components });
388
+ }
389
+ return /* @__PURE__ */ jsx(
390
+ ErrorComponent,
391
+ {
392
+ error: { message: "No Weaverse data return from route loader!" }
393
+ }
394
+ );
395
+ }
396
+ );
397
+ var ThemeSettingsProvider = createContext(null);
398
+ ThemeSettingsProvider.displayName = "WeaverseThemeSettingsProvider";
399
+ function withWeaverse(Component) {
400
+ return (props) => {
401
+ let { settings } = useThemeSettingsStore();
402
+ return /* @__PURE__ */ jsx(ThemeSettingsProvider.Provider, { value: settings, children: /* @__PURE__ */ jsx(Component, { ...props }) });
403
+ };
404
+ }
405
+ function useThemeSettings() {
406
+ let themeSettingsStore = useThemeSettingsStore();
407
+ let settings = useSafeExternalStore(
408
+ themeSettingsStore.subscribe,
409
+ themeSettingsStore.getSnapshot,
410
+ themeSettingsStore.getServerSnapshot
411
+ );
412
+ return settings;
413
+ }
137
414
  var API_PATH = "api/public";
138
415
  var DEFAULT_CACHE_STRATEGY = {
139
416
  maxAge: 10,
@@ -381,224 +658,6 @@ var WeaverseClient = class {
381
658
  return item;
382
659
  };
383
660
  };
384
-
385
- // src/components/main.tsx
386
- var main_exports = {};
387
- __export(main_exports, {
388
- default: () => main_default,
389
- schema: () => schema
390
- });
391
- function Main(props) {
392
- let { children, dangerouslySetInnerHTML, ...rest } = props;
393
- return /* @__PURE__ */ jsx(
394
- "div",
395
- {
396
- ...rest,
397
- children,
398
- dangerouslySetInnerHTML: children ? void 0 : dangerouslySetInnerHTML
399
- }
400
- );
401
- }
402
- var main_default = Main;
403
- var schema = {
404
- type: "main",
405
- title: "Main",
406
- inspector: []
407
- };
408
-
409
- // src/components/index.ts
410
- var defaultComponents = [main_exports];
411
- var ThemeSettingsStore = class extends EventEmitter {
412
- settings = {};
413
- schema;
414
- publicEnv;
415
- constructor(data) {
416
- super();
417
- let { theme, schema: schema2, publicEnv } = data || {};
418
- this.settings = { ...theme };
419
- this.schema = schema2;
420
- this.publicEnv = publicEnv;
421
- if (isBrowser) {
422
- window.__weaverseThemeSettingsStore = this;
423
- }
424
- }
425
- updateThemeSettings = (newSettings) => {
426
- this.settings = {
427
- ...this.settings,
428
- ...newSettings
429
- };
430
- this.emit(this.settings);
431
- };
432
- getSnapshot = () => {
433
- return this.settings;
434
- };
435
- getServerSnapshot = () => {
436
- return this.settings;
437
- };
438
- };
439
- function useThemeSettingsStore() {
440
- let data = useRouteLoaderData("root");
441
- if (isBrowser && window.__weaverseThemeSettingsStore) {
442
- return window.__weaverseThemeSettingsStore;
443
- }
444
- return new ThemeSettingsStore(data?.weaverseTheme);
445
- }
446
-
447
- // src/utils/use-studio.ts
448
- function useStudio(weaverse) {
449
- let { revalidate } = useRevalidator();
450
- let navigation = useNavigation();
451
- let { pathname, search } = useLocation();
452
- let navigate = useNavigate();
453
- let themeSettingsStore = useThemeSettingsStore();
454
- let { isDesignMode, weaverseHost, weaverseVersion, isPreviewMode } = weaverse;
455
- useEffect(() => {
456
- if (navigation.state === "idle") {
457
- if (isPreviewMode) {
458
- let previewSrc = `${weaverseHost}/static/studio/hydrogen/preview.js?v=${weaverseVersion}`;
459
- loadScript(previewSrc).catch(console.error);
460
- } else if (isDesignMode) {
461
- weaverse.internal = {
462
- ...weaverse.internal,
463
- navigate,
464
- revalidate,
465
- themeSettingsStore
466
- };
467
- let studioSrc = `${weaverseHost}/static/studio/hydrogen/index.js?v=${weaverseVersion}`;
468
- loadScript(studioSrc).then(() => {
469
- window.weaverseStudio?.init(weaverse);
470
- }).catch(console.error);
471
- }
472
- }
473
- }, [pathname, search, navigation.state]);
474
- usePixel(weaverse);
475
- }
476
- function usePixel(context) {
477
- let { projectId, pageId, weaverseHost, isDesignMode } = context;
478
- useEffect(() => {
479
- if (!projectId || !pageId || !weaverseHost || isDesignMode) return;
480
- let url = `${weaverseHost}/api/public/px`;
481
- let img = new Image();
482
- img.onload = () => img.remove();
483
- img.src = `${url}?projectId=${projectId}&pageId=${pageId}`;
484
- }, []);
485
- }
486
- var WeaverseHydrogenItem = class extends WeaverseItemStore {
487
- constructor(initialData, weaverse) {
488
- super(initialData, weaverse);
489
- let { data, ...rest } = initialData;
490
- if (!this.Element?.schema) {
491
- console.error("Element is missing schema or not found!");
492
- return;
493
- }
494
- let schemaData = generateDataFromSchema(this.Element.schema);
495
- Object.assign(this._store, schemaData, data, rest);
496
- }
497
- get Element() {
498
- return super.Element;
499
- }
500
- };
501
- Weaverse.ItemConstructor = WeaverseHydrogenItem;
502
- var WeaverseHydrogen = class extends Weaverse {
503
- platformType = "shopify-hydrogen";
504
- pageId;
505
- internal;
506
- requestInfo;
507
- static itemInstances;
508
- static elementRegistry;
509
- constructor(params) {
510
- let { internal, pageId, requestInfo, ...coreParams } = params;
511
- super({ ...coreParams });
512
- this.internal = internal;
513
- this.pageId = pageId;
514
- this.requestInfo = requestInfo;
515
- }
516
- };
517
- function createWeaverseInstance(params) {
518
- if (isBrowser) {
519
- window.__weaverses = window.__weaverses || {};
520
- let weaverse = window.__weaverses[params.pageId];
521
- if (!weaverse || weaverse?.requestInfo?.pathname !== params.requestInfo.pathname || weaverse?.requestInfo?.search !== params.requestInfo.search) {
522
- weaverse = new WeaverseHydrogen(params);
523
- window.__weaverses[params.pageId] = weaverse;
524
- }
525
- if (weaverse?.isDesignMode) {
526
- weaverse.requestInfo = params.requestInfo;
527
- window.weaverseStudio?.refreshStudio(params);
528
- }
529
- return weaverse;
530
- }
531
- return new WeaverseHydrogen(params);
532
- }
533
- var StudioBridge = memo(({ context }) => {
534
- useStudio(context);
535
- return null;
536
- });
537
- function RenderRoot(props) {
538
- let { data, components } = props;
539
- for (let comp of [...components, ...defaultComponents]) {
540
- comp?.schema?.type && registerComponent({
541
- type: comp?.schema.type,
542
- Component: comp.default,
543
- schema: comp.schema,
544
- loader: comp.loader
545
- });
546
- }
547
- let { page, configs, project, pageAssignment } = data || {};
548
- let weaverse = createWeaverseInstance({
549
- ...configs,
550
- data: page,
551
- pageId: page?.id,
552
- internal: { project, pageAssignment }
553
- });
554
- return /* @__PURE__ */ jsxs(Fragment, { children: [
555
- /* @__PURE__ */ jsx(WeaverseRoot, { context: weaverse }),
556
- /* @__PURE__ */ jsx(StudioBridge, { context: weaverse })
557
- ] });
558
- }
559
- function registerComponent(element) {
560
- WeaverseHydrogen.registerElement(element);
561
- }
562
- var WeaverseHydrogenRoot = memo(
563
- ({
564
- components,
565
- errorComponent: ErrorComponent = ({ error }) => /* @__PURE__ */ jsx("div", { children: error?.message || "An unexpected error occurred" })
566
- }) => {
567
- let loaderData = useLoaderData();
568
- let data = loaderData?.weaverseData;
569
- if (data) {
570
- if (data instanceof Promise) {
571
- return /* @__PURE__ */ jsx(ErrorBoundary, { fallbackRender: ErrorComponent, children: /* @__PURE__ */ jsx(Suspense, { children: /* @__PURE__ */ jsx(Await, { resolve: data, children: (resolvedData) => /* @__PURE__ */ jsx(RenderRoot, { data: resolvedData, components }) }) }) });
572
- }
573
- return /* @__PURE__ */ jsx(RenderRoot, { data, components });
574
- }
575
- return /* @__PURE__ */ jsx(
576
- ErrorComponent,
577
- {
578
- error: { message: "No Weaverse data return from route loader!" }
579
- }
580
- );
581
- }
582
- );
583
- var ThemeSettingsProvider = createContext(null);
584
- ThemeSettingsProvider.displayName = "WeaverseThemeSettingsProvider";
585
- function withWeaverse(Component) {
586
- return (props) => {
587
- let { settings } = useThemeSettingsStore();
588
- return /* @__PURE__ */ jsx(ThemeSettingsProvider.Provider, { value: settings, children: /* @__PURE__ */ jsx(Component, { ...props }) });
589
- };
590
- }
591
- function useThemeSettings() {
592
- let themeSettingsStore = useThemeSettingsStore();
593
- let settings = useSafeExternalStore(
594
- themeSettingsStore.subscribe,
595
- themeSettingsStore.getSnapshot,
596
- themeSettingsStore.getServerSnapshot
597
- );
598
- return settings;
599
- }
600
-
601
- // src/index.ts
602
661
  function getSelectedProductOptions(request) {
603
662
  let options = getSelectedProductOptions$1(request);
604
663
  return options.filter(