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