@weaverse/hydrogen 1.3.3 → 1.5.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
@@ -1,12 +1,183 @@
1
1
  // src/index.ts
2
- export * from "@weaverse/react";
2
+ import {
3
+ Weaverse,
4
+ WeaverseItemStore
5
+ } from "@weaverse/react";
3
6
 
4
- // src/client.ts
5
- import "@shopify/hydrogen";
7
+ // src/WeaverseHydrogenRoot.tsx
8
+ import { Await, useLoaderData } from "@remix-run/react";
9
+ import { WeaverseRoot } from "@weaverse/react";
10
+ import React, { Suspense } from "react";
11
+ import { ErrorBoundary } from "react-error-boundary";
12
+
13
+ // src/context.ts
14
+ import { isBrowser } from "@weaverse/react";
15
+ import { createContext } from "react";
16
+ function createCachedWeaverseInstance(params, components) {
17
+ if (isBrowser) {
18
+ window.__weaverses = window.__weaverses || [];
19
+ let weaverse = window.__weaverses.find((w) => {
20
+ let { pathname, search } = w.requestInfo;
21
+ let { __cachedId } = w.data;
22
+ return pathname === params.requestInfo.pathname && search === params.requestInfo.search && __cachedId === params.data.__cachedId;
23
+ });
24
+ if (!weaverse) {
25
+ weaverse = new WeaverseHydrogen(params, components);
26
+ window.__weaverses.push(weaverse);
27
+ console.log("\u{1F4BF} Weaverse", weaverse);
28
+ }
29
+ return weaverse;
30
+ }
31
+ return new WeaverseHydrogen(params, components);
32
+ }
33
+ function createWeaverseInstance(weaverseData, components) {
34
+ let { page, configs, project, pageAssignment } = weaverseData || {};
35
+ let weaverse = createCachedWeaverseInstance(
36
+ {
37
+ ...configs,
38
+ data: page || {},
39
+ pageId: page?.id,
40
+ internal: { project, pageAssignment }
41
+ },
42
+ components
43
+ );
44
+ return weaverse;
45
+ }
46
+ var ThemeProvider = createContext(null);
47
+ ThemeProvider.displayName = "WeaverseThemeProvider";
48
+
49
+ // src/hooks/use-studio.ts
50
+ import { useNavigate, useRevalidator } from "@remix-run/react";
51
+ import { isIframe, loadScript } from "@weaverse/react";
52
+ import { useEffect } from "react";
53
+
54
+ // src/hooks/use-theme-context.ts
55
+ import { useContext } from "react";
56
+ function useThemeContext() {
57
+ let themeContext = useContext(ThemeProvider);
58
+ if (!themeContext) {
59
+ throw new Error(
60
+ `useThemeContext must be used within a ThemeProvider. Make sure to wrap your app in the withWeaverse HoC.`
61
+ );
62
+ }
63
+ return themeContext;
64
+ }
65
+
66
+ // src/hooks/use-studio.ts
67
+ function useStudio(weaverse) {
68
+ let { revalidate } = useRevalidator();
69
+ let navigate = useNavigate();
70
+ let themeSettingsStore = useThemeContext();
71
+ let { isDesignMode, weaverseHost, weaverseVersion } = weaverse;
72
+ let isStudio = isIframe && isDesignMode && weaverseHost && weaverseVersion;
73
+ useEffect(() => {
74
+ if (isStudio) {
75
+ weaverse.internal = {
76
+ ...weaverse.internal,
77
+ navigate,
78
+ revalidate,
79
+ themeSettingsStore
80
+ };
81
+ window.__weaverse = weaverse;
82
+ if (window.weaverseStudio) {
83
+ window.weaverseStudio.init(weaverse);
84
+ } else {
85
+ let studioSrc = `${weaverseHost}/assets/studio/hydrogen/index.js?v=${weaverseVersion}`;
86
+ loadScript(studioSrc);
87
+ }
88
+ }
89
+ }, [weaverse]);
90
+ }
91
+
92
+ // src/hooks/use-theme-settings.ts
93
+ import { useSyncExternalStore } from "react";
94
+ var ThemeSettingsStore = class {
95
+ settings = null;
96
+ listeners = [];
97
+ countries;
98
+ schema;
99
+ publicEnv;
100
+ constructor(data) {
101
+ let { theme, countries, schema, publicEnv } = data || {};
102
+ this.settings = theme || null;
103
+ this.countries = countries;
104
+ this.schema = schema;
105
+ this.publicEnv = publicEnv;
106
+ }
107
+ updateThemeSettings = (newSettings) => {
108
+ this.settings = { ...this.settings, ...newSettings };
109
+ this.emitChange();
110
+ };
111
+ subscribe = (listener) => {
112
+ this.listeners = [...this.listeners, listener];
113
+ return () => {
114
+ this.listeners = this.listeners.filter((l) => l !== listener);
115
+ };
116
+ };
117
+ getSnapshot = () => {
118
+ return this.settings;
119
+ };
120
+ getServerSnapshot = () => {
121
+ return this.settings;
122
+ };
123
+ emitChange = () => {
124
+ for (let listener of this.listeners) {
125
+ listener();
126
+ }
127
+ };
128
+ };
129
+ function useThemeSettings() {
130
+ let themeSettingsStore = useThemeContext();
131
+ let settings = useSyncExternalStore(
132
+ themeSettingsStore.subscribe,
133
+ themeSettingsStore.getSnapshot,
134
+ themeSettingsStore.getServerSnapshot
135
+ );
136
+ return settings;
137
+ }
138
+
139
+ // src/WeaverseHydrogenRoot.tsx
140
+ function WeaverseHydrogenRoot({
141
+ errorComponent: ErrorComponent = FallbackError,
142
+ components
143
+ }) {
144
+ let loaderData = useLoaderData();
145
+ let data = loaderData?.weaverseData;
146
+ if (data) {
147
+ if (data instanceof Promise) {
148
+ return /* @__PURE__ */ React.createElement(ErrorBoundary, { fallbackRender: ErrorComponent }, /* @__PURE__ */ React.createElement(Suspense, null, /* @__PURE__ */ React.createElement(Await, { resolve: data }, (resolvedData) => {
149
+ return /* @__PURE__ */ React.createElement(RenderRoot, { data: resolvedData, components });
150
+ })));
151
+ }
152
+ return /* @__PURE__ */ React.createElement(RenderRoot, { data, components });
153
+ }
154
+ return /* @__PURE__ */ React.createElement(
155
+ ErrorComponent,
156
+ {
157
+ error: { message: "No Weaverse data return from route loader!" }
158
+ }
159
+ );
160
+ }
161
+ function RenderRoot(props) {
162
+ let { data, components } = props;
163
+ let weaverse = createWeaverseInstance(data, components);
164
+ useStudio(weaverse);
165
+ return /* @__PURE__ */ React.createElement(WeaverseRoot, { context: weaverse });
166
+ }
167
+ function withWeaverse(Component) {
168
+ return (props) => {
169
+ let { weaverseTheme } = useLoaderData();
170
+ let themeSettingsStore = new ThemeSettingsStore(weaverseTheme);
171
+ return /* @__PURE__ */ React.createElement(ThemeProvider.Provider, { value: themeSettingsStore }, /* @__PURE__ */ React.createElement(Component, { ...props }));
172
+ };
173
+ }
174
+ function FallbackError({ error }) {
175
+ return /* @__PURE__ */ React.createElement("div", null, error?.message || "An unexpected error occurred");
176
+ }
6
177
 
7
178
  // package.json
8
179
  var package_default = {
9
- version: "1.3.3",
180
+ version: "1.5.0",
10
181
  license: "MIT",
11
182
  main: "dist/index.js",
12
183
  typings: "dist/index.d.ts",
@@ -41,7 +212,7 @@ var package_default = {
41
212
  dependencies: {
42
213
  "@remix-run/react": "1.19.1",
43
214
  "@shopify/hydrogen": "2023.7.8",
44
- "@weaverse/react": "1.3.3",
215
+ "@weaverse/react": "1.5.0",
45
216
  "react-error-boundary": "^4.0.11"
46
217
  },
47
218
  devDependencies: {
@@ -80,43 +251,21 @@ function getWeaverseConfigs(request, env) {
80
251
  }
81
252
  };
82
253
  }
83
- function getWeaverseCsp(request) {
84
- let url = new URL(request.url);
85
- let weaverseHost = url.searchParams.get("weaverseHost");
86
- let weaverseHosts = ["https://*.weaverse.io"];
87
- if (weaverseHost) {
88
- weaverseHosts.push(weaverseHost);
89
- }
90
- return {
91
- frameAncestors: weaverseHosts,
92
- defaultSrc: [
93
- "'self'",
94
- "https://cdn.shopify.com",
95
- "https://shopify.com",
96
- "https://*.youtube.com",
97
- ...weaverseHosts
98
- ],
99
- styleSrc: [
100
- "'self'",
101
- "'unsafe-inline'",
102
- "https://cdn.shopify.com",
103
- ...weaverseHosts
104
- ]
105
- };
106
- }
107
254
 
108
- // src/client.ts
255
+ // src/weaverse-client.ts
109
256
  var WeaverseClient = class {
110
257
  API = "api/public/project";
111
258
  clientVersion = package_default.version;
259
+ basePageConfigs;
260
+ basePageRequestBody;
112
261
  storefront;
262
+ // storefront: Storefront<I18nLocale>
113
263
  components;
114
264
  countries;
115
265
  themeSchema;
116
266
  configs;
117
- basePageConfigs;
118
- basePageRequestBody;
119
267
  withCache;
268
+ // withCache: ReturnType<typeof createWithCache>
120
269
  constructor(args) {
121
270
  let { configs, storefront, components, countries, withCache, themeSchema } = args;
122
271
  this.storefront = storefront;
@@ -183,7 +332,7 @@ var WeaverseClient = class {
183
332
  return new Promise(async (resolve, reject) => {
184
333
  try {
185
334
  if (!this.configs.projectId) {
186
- reject(new Error("Missing Weaverse projectId!"));
335
+ throw new Error("Missing Weaverse projectId!");
187
336
  }
188
337
  let { request, params } = args;
189
338
  let { strategy, ...pageLoadParams } = configs;
@@ -208,11 +357,9 @@ var WeaverseClient = class {
208
357
  }
209
358
  let { page, project, pageAssignment } = payload;
210
359
  if (!page || !project || !pageAssignment) {
211
- return reject(
212
- new Error(
213
- // @ts-ignore
214
- payload?.error || "Invalid Weaverse project payload!"
215
- )
360
+ throw new Error(
361
+ // @ts-ignore
362
+ payload?.error || "Invalid Weaverse project payload!"
216
363
  );
217
364
  }
218
365
  if (page?.items) {
@@ -266,210 +413,71 @@ var WeaverseClient = class {
266
413
  };
267
414
  };
268
415
 
269
- // src/hooks/use-theme-settings.ts
270
- import { useSyncExternalStore } from "react";
271
-
272
- // src/hooks/use-theme-context.ts
273
- import { useContext } from "react";
274
-
275
- // src/context.ts
276
- import { Weaverse, isBrowser } from "@weaverse/react";
277
- import { createContext } from "react";
278
- function createCachedWeaverseInstance(init) {
279
- if (isBrowser) {
280
- window.__weaverses = window.__weaverses || [];
281
- let weaverse = window.__weaverses.find((w) => {
282
- let { pathname, search } = w.requestInfo;
283
- let { __cachedId } = w.data;
284
- return pathname === init.requestInfo.pathname && search === init.requestInfo.search && __cachedId === init.data.__cachedId;
285
- });
286
- if (!weaverse) {
287
- weaverse = new Weaverse(init);
288
- window.__weaverses.push(weaverse);
289
- console.log("\u{1F4BF} Weaverse", weaverse);
290
- }
291
- return weaverse;
292
- }
293
- return new Weaverse(init);
294
- }
295
- function createWeaverseInstance(weaverseData, components) {
296
- let { page, configs, project, pageAssignment } = weaverseData || {};
297
- let weaverse = createCachedWeaverseInstance({
298
- ...configs,
299
- data: page || {},
300
- pageId: page?.id,
301
- platformType: "shopify-hydrogen",
302
- internal: { project, pageAssignment }
303
- });
304
- components.forEach((comp) => {
305
- weaverse.registerElement({
306
- type: comp?.schema?.type,
307
- Component: comp?.default,
308
- schema: comp?.schema,
309
- loader: comp?.loader
310
- });
311
- });
312
- return weaverse;
313
- }
314
- var ThemeProvider = createContext(null);
315
- ThemeProvider.displayName = "WeaverseThemeProvider";
316
-
317
- // src/hooks/use-theme-context.ts
318
- function useThemeContext() {
319
- let themeContext = useContext(ThemeProvider);
320
- if (!themeContext) {
321
- throw new Error(
322
- `useThemeContext must be used within a ThemeProvider. Make sure to wrap your app in the withWeaverse HoC.`
323
- );
324
- }
325
- return themeContext;
326
- }
327
-
328
- // src/hooks/use-theme-settings.ts
329
- var ThemeSettingsStore = class {
330
- settings = null;
331
- listeners = [];
332
- countries;
333
- schema;
334
- publicEnv;
335
- constructor(data) {
336
- let { theme, countries, schema, publicEnv } = data || {};
337
- this.settings = theme || null;
338
- this.countries = countries;
339
- this.schema = schema;
340
- this.publicEnv = publicEnv;
341
- }
342
- updateThemeSettings = (newSettings) => {
343
- this.settings = { ...this.settings, ...newSettings };
344
- this.emitChange();
345
- };
346
- subscribe = (listener) => {
347
- this.listeners = [...this.listeners, listener];
348
- return () => {
349
- this.listeners = this.listeners.filter((l) => l !== listener);
350
- };
351
- };
352
- getSnapshot = () => {
353
- return this.settings;
354
- };
355
- getServerSnapshot = () => {
356
- return this.settings;
357
- };
358
- emitChange = () => {
359
- for (let listener of this.listeners) {
360
- listener();
361
- }
362
- };
363
- };
364
- function useThemeSettings() {
365
- let themeSettingsStore = useThemeContext();
366
- let settings = useSyncExternalStore(
367
- themeSettingsStore.subscribe,
368
- themeSettingsStore.getSnapshot,
369
- themeSettingsStore.getServerSnapshot
370
- );
371
- return settings;
372
- }
373
-
374
416
  // src/wrappers.ts
375
417
  import { getSelectedProductOptions as hydrogen_getSelectedProductOptions } from "@shopify/hydrogen";
376
- import { createContentSecurityPolicy as hydrogen_createContentSecurityPolicy } from "@shopify/hydrogen";
377
418
  function getSelectedProductOptions(request) {
378
419
  let options = hydrogen_getSelectedProductOptions(request);
379
420
  return options.filter(
380
421
  ({ name }) => name !== "isDesignMode" && !name.startsWith("weaverse")
381
422
  );
382
423
  }
383
- function createContentSecurityPolicy(request, directives) {
384
- let weaverseDirectives = getWeaverseCsp(request);
385
- return hydrogen_createContentSecurityPolicy({
386
- ...directives,
387
- ...weaverseDirectives
388
- });
389
- }
390
-
391
- // src/WeaverseHydrogenRoot.tsx
392
- import { Await, useLoaderData } from "@remix-run/react";
393
- import { WeaverseRoot } from "@weaverse/react";
394
- import React, { Suspense } from "react";
395
- import { ErrorBoundary } from "react-error-boundary";
396
424
 
397
- // src/hooks/use-studio.ts
398
- import { useNavigate, useRevalidator } from "@remix-run/react";
399
- import { isIframe, loadScript } from "@weaverse/react";
400
- import { useEffect } from "react";
401
- function useStudio(weaverse) {
402
- let { revalidate } = useRevalidator();
403
- let navigate = useNavigate();
404
- let themeSettingsStore = useThemeContext();
405
- let { isDesignMode, weaverseHost, weaverseVersion } = weaverse;
406
- let isStudio = isIframe && isDesignMode && weaverseHost && weaverseVersion;
407
- useEffect(() => {
408
- if (isStudio) {
409
- weaverse.internal = {
410
- ...weaverse.internal,
411
- navigate,
412
- revalidate,
413
- themeSettingsStore
414
- };
415
- window.__weaverse = weaverse;
416
- if (window.weaverseStudio) {
417
- window.weaverseStudio.init(weaverse);
418
- } else {
419
- let studioSrc = `${weaverseHost}/assets/studio/hydrogen/index.js?v=${weaverseVersion}`;
420
- loadScript(studioSrc);
425
+ // src/index.ts
426
+ var WeaverseHydrogen = class extends Weaverse {
427
+ platformType = "shopify-hydrogen";
428
+ pageId;
429
+ internal;
430
+ requestInfo;
431
+ constructor(params, components) {
432
+ let { internal, pageId, requestInfo, ...coreParams } = params;
433
+ super({ ...coreParams, ItemConstructor: WeaverseHydrogenItem });
434
+ this.internal = internal;
435
+ this.pageId = pageId;
436
+ this.requestInfo = requestInfo;
437
+ this.registerComponents(components);
438
+ }
439
+ registerElement(element) {
440
+ super.registerElement(element);
441
+ }
442
+ registerComponents(components) {
443
+ components.forEach((comp) => {
444
+ this.registerElement({
445
+ type: comp?.schema?.type,
446
+ Component: comp?.default,
447
+ schema: comp?.schema,
448
+ loader: comp?.loader
449
+ });
450
+ });
451
+ }
452
+ };
453
+ var WeaverseHydrogenItem = class extends WeaverseItemStore {
454
+ constructor(intialData, weaverse) {
455
+ super(intialData, weaverse);
456
+ let { data, ...rest } = intialData;
457
+ this._store = { ...data, ...rest };
458
+ }
459
+ get Element() {
460
+ return super.Element;
461
+ }
462
+ get data() {
463
+ let defaultData = this.Element?.schema?.inspector?.flatMap((group) => group.inputs)?.reduce((a, { defaultValue, name }) => {
464
+ if (name && defaultValue !== null && defaultValue !== void 0) {
465
+ a[name] = defaultValue;
421
466
  }
422
- }
423
- }, [weaverse]);
424
- }
425
-
426
- // src/WeaverseHydrogenRoot.tsx
427
- function WeaverseHydrogenRoot({
428
- errorComponent: ErrorComponent = FallbackError,
429
- components
430
- }) {
431
- let loaderData = useLoaderData();
432
- let data = loaderData?.weaverseData;
433
- if (data) {
434
- if (data instanceof Promise) {
435
- return /* @__PURE__ */ React.createElement(ErrorBoundary, { fallbackRender: ErrorComponent }, /* @__PURE__ */ React.createElement(Suspense, null, /* @__PURE__ */ React.createElement(Await, { resolve: data }, (resolvedData) => {
436
- return /* @__PURE__ */ React.createElement(RenderRoot, { data: resolvedData, components });
437
- })));
438
- }
439
- return /* @__PURE__ */ React.createElement(RenderRoot, { data, components });
467
+ return a;
468
+ }, {});
469
+ return { ...defaultData, ...super.data };
440
470
  }
441
- return /* @__PURE__ */ React.createElement(
442
- ErrorComponent,
443
- {
444
- error: { message: "No Weaverse data return from route loader!" }
445
- }
446
- );
447
- }
448
- function RenderRoot(props) {
449
- let { data, components } = props;
450
- let weaverse = createWeaverseInstance(data, components);
451
- useStudio(weaverse);
452
- return /* @__PURE__ */ React.createElement(WeaverseRoot, { context: weaverse });
453
- }
454
- var withWeaverse = (Component) => {
455
- return (props) => {
456
- let { weaverseTheme } = useLoaderData();
457
- let themeSettingsStore = new ThemeSettingsStore(weaverseTheme);
458
- return /* @__PURE__ */ React.createElement(ThemeProvider.Provider, { value: themeSettingsStore }, /* @__PURE__ */ React.createElement(Component, { ...props }));
459
- };
460
471
  };
461
- function FallbackError({ error }) {
462
- return /* @__PURE__ */ React.createElement("div", null, error?.message || "An unexpected error occurred");
463
- }
464
472
  export {
465
473
  ThemeSettingsStore,
466
474
  WeaverseClient,
475
+ WeaverseHydrogen,
476
+ WeaverseHydrogenItem,
467
477
  WeaverseHydrogenRoot,
468
- createContentSecurityPolicy,
469
478
  getRequestQueries,
470
479
  getSelectedProductOptions,
471
480
  getWeaverseConfigs,
472
- getWeaverseCsp,
473
481
  useThemeSettings,
474
482
  withWeaverse
475
483
  };
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.3.3",
2
+ "version": "1.5.0",
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.8",
37
- "@weaverse/react": "1.3.3",
37
+ "@weaverse/react": "1.5.0",
38
38
  "react-error-boundary": "^4.0.11"
39
39
  },
40
40
  "devDependencies": {