@weaverse/hydrogen 1.3.3 → 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.3",
220
+ version: "1.4.1",
54
221
  license: "MIT",
55
222
  main: "dist/index.js",
56
223
  typings: "dist/index.d.ts",
@@ -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.3",
255
+ "@weaverse/react": "1.4.1",
89
256
  "react-error-boundary": "^4.0.11"
90
257
  },
91
258
  devDependencies: {
@@ -124,43 +291,21 @@ 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 {
154
297
  API = "api/public/project";
155
298
  clientVersion = package_default.version;
299
+ basePageConfigs;
300
+ basePageRequestBody;
156
301
  storefront;
302
+ // storefront: Storefront<I18nLocale>
157
303
  components;
158
304
  countries;
159
305
  themeSchema;
160
306
  configs;
161
- basePageConfigs;
162
- basePageRequestBody;
163
307
  withCache;
308
+ // withCache: ReturnType<typeof createWithCache>
164
309
  constructor(args) {
165
310
  let { configs, storefront, components, countries, withCache, themeSchema } = args;
166
311
  this.storefront = storefront;
@@ -227,7 +372,7 @@ var WeaverseClient = class {
227
372
  return new Promise(async (resolve, reject) => {
228
373
  try {
229
374
  if (!this.configs.projectId) {
230
- reject(new Error("Missing Weaverse projectId!"));
375
+ throw new Error("Missing Weaverse projectId!");
231
376
  }
232
377
  let { request, params } = args;
233
378
  let { strategy, ...pageLoadParams } = configs;
@@ -252,11 +397,9 @@ var WeaverseClient = class {
252
397
  }
253
398
  let { page, project, pageAssignment } = payload;
254
399
  if (!page || !project || !pageAssignment) {
255
- return reject(
256
- new Error(
257
- // @ts-ignore
258
- payload?.error || "Invalid Weaverse project payload!"
259
- )
400
+ throw new Error(
401
+ // @ts-ignore
402
+ payload?.error || "Invalid Weaverse project payload!"
260
403
  );
261
404
  }
262
405
  if (page?.items) {
@@ -310,212 +453,72 @@ var WeaverseClient = class {
310
453
  };
311
454
  };
312
455
 
313
- // src/hooks/use-theme-settings.ts
314
- var import_react4 = require("react");
315
-
316
- // src/hooks/use-theme-context.ts
317
- var import_react3 = require("react");
318
-
319
- // src/context.ts
320
- var import_react = require("@weaverse/react");
321
- var import_react2 = require("react");
322
- function createCachedWeaverseInstance(init) {
323
- if (import_react.isBrowser) {
324
- window.__weaverses = window.__weaverses || [];
325
- let weaverse = window.__weaverses.find((w) => {
326
- let { pathname, search } = w.requestInfo;
327
- let { __cachedId } = w.data;
328
- return pathname === init.requestInfo.pathname && search === init.requestInfo.search && __cachedId === init.data.__cachedId;
329
- });
330
- if (!weaverse) {
331
- weaverse = new import_react.Weaverse(init);
332
- window.__weaverses.push(weaverse);
333
- console.log("\u{1F4BF} Weaverse", weaverse);
334
- }
335
- return weaverse;
336
- }
337
- return new import_react.Weaverse(init);
338
- }
339
- function createWeaverseInstance(weaverseData, components) {
340
- let { page, configs, project, pageAssignment } = weaverseData || {};
341
- let weaverse = createCachedWeaverseInstance({
342
- ...configs,
343
- data: page || {},
344
- pageId: page?.id,
345
- platformType: "shopify-hydrogen",
346
- internal: { project, pageAssignment }
347
- });
348
- components.forEach((comp) => {
349
- weaverse.registerElement({
350
- type: comp?.schema?.type,
351
- Component: comp?.default,
352
- schema: comp?.schema,
353
- loader: comp?.loader
354
- });
355
- });
356
- return weaverse;
357
- }
358
- var ThemeProvider = (0, import_react2.createContext)(null);
359
- ThemeProvider.displayName = "WeaverseThemeProvider";
360
-
361
- // src/hooks/use-theme-context.ts
362
- function useThemeContext() {
363
- let themeContext = (0, import_react3.useContext)(ThemeProvider);
364
- if (!themeContext) {
365
- throw new Error(
366
- `useThemeContext must be used within a ThemeProvider. Make sure to wrap your app in the withWeaverse HoC.`
367
- );
368
- }
369
- return themeContext;
370
- }
371
-
372
- // src/hooks/use-theme-settings.ts
373
- var ThemeSettingsStore = class {
374
- settings = null;
375
- listeners = [];
376
- countries;
377
- schema;
378
- publicEnv;
379
- constructor(data) {
380
- let { theme, countries, schema, publicEnv } = data || {};
381
- this.settings = theme || null;
382
- this.countries = countries;
383
- this.schema = schema;
384
- this.publicEnv = publicEnv;
385
- }
386
- updateThemeSettings = (newSettings) => {
387
- this.settings = { ...this.settings, ...newSettings };
388
- this.emitChange();
389
- };
390
- subscribe = (listener) => {
391
- this.listeners = [...this.listeners, listener];
392
- return () => {
393
- this.listeners = this.listeners.filter((l) => l !== listener);
394
- };
395
- };
396
- getSnapshot = () => {
397
- return this.settings;
398
- };
399
- getServerSnapshot = () => {
400
- return this.settings;
401
- };
402
- emitChange = () => {
403
- for (let listener of this.listeners) {
404
- listener();
405
- }
406
- };
407
- };
408
- function useThemeSettings() {
409
- let themeSettingsStore = useThemeContext();
410
- let settings = (0, import_react4.useSyncExternalStore)(
411
- themeSettingsStore.subscribe,
412
- themeSettingsStore.getSnapshot,
413
- themeSettingsStore.getServerSnapshot
414
- );
415
- return settings;
416
- }
417
-
418
456
  // src/wrappers.ts
419
- var import_hydrogen2 = require("@shopify/hydrogen");
420
- var import_hydrogen3 = require("@shopify/hydrogen");
457
+ var import_hydrogen = require("@shopify/hydrogen");
421
458
  function getSelectedProductOptions(request) {
422
- let options = (0, import_hydrogen2.getSelectedProductOptions)(request);
459
+ let options = (0, import_hydrogen.getSelectedProductOptions)(request);
423
460
  return options.filter(
424
461
  ({ name }) => name !== "isDesignMode" && !name.startsWith("weaverse")
425
462
  );
426
463
  }
427
- function createContentSecurityPolicy(request, directives) {
428
- let weaverseDirectives = getWeaverseCsp(request);
429
- return (0, import_hydrogen3.createContentSecurityPolicy)({
430
- ...directives,
431
- ...weaverseDirectives
432
- });
433
- }
434
-
435
- // src/WeaverseHydrogenRoot.tsx
436
- var import_react8 = require("@remix-run/react");
437
- var import_react9 = require("@weaverse/react");
438
- var import_react10 = __toESM(require("react"));
439
- var import_react_error_boundary = require("react-error-boundary");
440
464
 
441
- // src/hooks/use-studio.ts
442
- var import_react5 = require("@remix-run/react");
443
- var import_react6 = require("@weaverse/react");
444
- var import_react7 = require("react");
445
- function useStudio(weaverse) {
446
- let { revalidate } = (0, import_react5.useRevalidator)();
447
- let navigate = (0, import_react5.useNavigate)();
448
- let themeSettingsStore = useThemeContext();
449
- let { isDesignMode, weaverseHost, weaverseVersion } = weaverse;
450
- let isStudio = import_react6.isIframe && isDesignMode && weaverseHost && weaverseVersion;
451
- (0, import_react7.useEffect)(() => {
452
- if (isStudio) {
453
- weaverse.internal = {
454
- ...weaverse.internal,
455
- navigate,
456
- revalidate,
457
- themeSettingsStore
458
- };
459
- window.__weaverse = weaverse;
460
- if (window.weaverseStudio) {
461
- window.weaverseStudio.init(weaverse);
462
- } else {
463
- let studioSrc = `${weaverseHost}/assets/studio/hydrogen/index.js?v=${weaverseVersion}`;
464
- (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;
465
506
  }
466
- }
467
- }, [weaverse]);
468
- }
469
-
470
- // src/WeaverseHydrogenRoot.tsx
471
- function WeaverseHydrogenRoot({
472
- errorComponent: ErrorComponent = FallbackError,
473
- components
474
- }) {
475
- let loaderData = (0, import_react8.useLoaderData)();
476
- let data = loaderData?.weaverseData;
477
- if (data) {
478
- if (data instanceof Promise) {
479
- 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) => {
480
- return /* @__PURE__ */ import_react10.default.createElement(RenderRoot, { data: resolvedData, components });
481
- })));
482
- }
483
- return /* @__PURE__ */ import_react10.default.createElement(RenderRoot, { data, components });
507
+ return a;
508
+ }, {});
509
+ return { ...defaultData, ...super.data };
484
510
  }
485
- return /* @__PURE__ */ import_react10.default.createElement(
486
- ErrorComponent,
487
- {
488
- error: { message: "No Weaverse data return from route loader!" }
489
- }
490
- );
491
- }
492
- function RenderRoot(props) {
493
- let { data, components } = props;
494
- let weaverse = createWeaverseInstance(data, components);
495
- useStudio(weaverse);
496
- return /* @__PURE__ */ import_react10.default.createElement(import_react9.WeaverseRoot, { context: weaverse });
497
- }
498
- var withWeaverse = (Component) => {
499
- return (props) => {
500
- let { weaverseTheme } = (0, import_react8.useLoaderData)();
501
- let themeSettingsStore = new ThemeSettingsStore(weaverseTheme);
502
- return /* @__PURE__ */ import_react10.default.createElement(ThemeProvider.Provider, { value: themeSettingsStore }, /* @__PURE__ */ import_react10.default.createElement(Component, { ...props }));
503
- };
504
511
  };
505
- function FallbackError({ error }) {
506
- return /* @__PURE__ */ import_react10.default.createElement("div", null, error?.message || "An unexpected error occurred");
507
- }
508
512
  // Annotate the CommonJS export names for ESM import in node:
509
513
  0 && (module.exports = {
510
514
  ThemeSettingsStore,
511
515
  WeaverseClient,
516
+ WeaverseHydrogen,
517
+ WeaverseHydrogenItem,
512
518
  WeaverseHydrogenRoot,
513
- createContentSecurityPolicy,
514
519
  getRequestQueries,
515
520
  getSelectedProductOptions,
516
521
  getWeaverseConfigs,
517
- getWeaverseCsp,
518
522
  useThemeSettings,
519
- withWeaverse,
520
- ...require("@weaverse/react")
523
+ withWeaverse
521
524
  });