@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.d.mts +59 -71
- package/dist/index.d.ts +59 -71
- package/dist/index.js +356 -331
- package/dist/index.mjs +354 -324
- package/package.json +3 -3
package/dist/index.mjs
CHANGED
|
@@ -1,12 +1,183 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
|
-
|
|
2
|
+
import {
|
|
3
|
+
Weaverse,
|
|
4
|
+
WeaverseItemStore
|
|
5
|
+
} from "@weaverse/react";
|
|
3
6
|
|
|
4
|
-
// src/
|
|
5
|
-
import "@
|
|
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.
|
|
180
|
+
version: "1.4.1",
|
|
10
181
|
license: "MIT",
|
|
11
182
|
main: "dist/index.js",
|
|
12
183
|
typings: "dist/index.d.ts",
|
|
@@ -18,7 +189,7 @@ var package_default = {
|
|
|
18
189
|
"dist/*"
|
|
19
190
|
],
|
|
20
191
|
engines: {
|
|
21
|
-
node: ">=
|
|
192
|
+
node: ">=16"
|
|
22
193
|
},
|
|
23
194
|
scripts: {
|
|
24
195
|
start: "npm run dev",
|
|
@@ -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.
|
|
215
|
+
"@weaverse/react": "1.4.1",
|
|
45
216
|
"react-error-boundary": "^4.0.11"
|
|
46
217
|
},
|
|
47
218
|
devDependencies: {
|
|
@@ -80,51 +251,61 @@ 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 {
|
|
257
|
+
API = "api/public/project";
|
|
258
|
+
clientVersion = package_default.version;
|
|
259
|
+
basePageConfigs;
|
|
260
|
+
basePageRequestBody;
|
|
261
|
+
storefront;
|
|
262
|
+
// storefront: Storefront<I18nLocale>
|
|
263
|
+
components;
|
|
264
|
+
countries;
|
|
265
|
+
themeSchema;
|
|
266
|
+
configs;
|
|
267
|
+
withCache;
|
|
268
|
+
// withCache: ReturnType<typeof createWithCache>
|
|
110
269
|
constructor(args) {
|
|
111
|
-
|
|
112
|
-
this.
|
|
113
|
-
this.
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
return res;
|
|
270
|
+
let { configs, storefront, components, countries, withCache, themeSchema } = args;
|
|
271
|
+
this.storefront = storefront;
|
|
272
|
+
this.components = components;
|
|
273
|
+
this.countries = countries;
|
|
274
|
+
this.themeSchema = themeSchema;
|
|
275
|
+
this.configs = configs;
|
|
276
|
+
this.withCache = withCache;
|
|
277
|
+
this.basePageConfigs = {
|
|
278
|
+
projectId: configs.projectId,
|
|
279
|
+
weaverseHost: configs.weaverseHost,
|
|
280
|
+
weaverseVersion: configs.weaverseVersion,
|
|
281
|
+
isDesignMode: configs.isDesignMode
|
|
124
282
|
};
|
|
125
|
-
this.
|
|
283
|
+
this.basePageRequestBody = {
|
|
284
|
+
countries,
|
|
285
|
+
isDesignMode: this.configs.isDesignMode,
|
|
286
|
+
i18n: storefront.i18n,
|
|
287
|
+
projectId: this.configs.projectId
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
fetchWithCache = (url, options) => {
|
|
291
|
+
let cacheKey = [url, options.body];
|
|
292
|
+
let { strategy = this.storefront.CacheShort(), ...reqInit } = options;
|
|
293
|
+
let res = this.withCache(cacheKey, strategy, async () => {
|
|
294
|
+
let response = await fetch(url, reqInit);
|
|
295
|
+
if (!response.ok) {
|
|
296
|
+
throw new Error("Something went wrong. Skipping cache.");
|
|
297
|
+
}
|
|
298
|
+
return await response.json();
|
|
299
|
+
});
|
|
300
|
+
return res;
|
|
301
|
+
};
|
|
302
|
+
loadThemeSettings = async (strategy) => {
|
|
303
|
+
try {
|
|
126
304
|
let { API, configs } = this;
|
|
127
305
|
let { weaverseHost, projectId } = configs;
|
|
306
|
+
if (!projectId) {
|
|
307
|
+
throw new Error("Missing Weaverse projectId!");
|
|
308
|
+
}
|
|
128
309
|
let res = await this.fetchWithCache(
|
|
129
310
|
`${weaverseHost}/${API}/${projectId}/configs`,
|
|
130
311
|
{ strategy }
|
|
@@ -142,312 +323,161 @@ var WeaverseClient = class {
|
|
|
142
323
|
}
|
|
143
324
|
}
|
|
144
325
|
return data;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
return
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
};
|
|
156
|
-
let reqInit = {
|
|
157
|
-
method: "POST",
|
|
158
|
-
body: JSON.stringify(body)
|
|
159
|
-
};
|
|
160
|
-
let url = `${this.configs.weaverseHost}/${this.API}`;
|
|
161
|
-
let payload;
|
|
162
|
-
if (this.configs.isDesignMode) {
|
|
163
|
-
payload = await fetch(url, reqInit).then((res) => res.json());
|
|
164
|
-
} else {
|
|
165
|
-
payload = await this.fetchWithCache(url, {
|
|
166
|
-
...reqInit,
|
|
167
|
-
strategy
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
let { page, project, pageAssignment } = payload;
|
|
171
|
-
if (!page || !project || !pageAssignment) {
|
|
172
|
-
return reject(
|
|
173
|
-
new Error(
|
|
174
|
-
// @ts-ignore
|
|
175
|
-
payload?.error || "Invalid Weaverse project payload!"
|
|
176
|
-
)
|
|
177
|
-
);
|
|
178
|
-
}
|
|
179
|
-
if (page?.items) {
|
|
180
|
-
let items = page.items;
|
|
181
|
-
page.items = await Promise.all(
|
|
182
|
-
items.map((item) => this.execComponentLoader(item, args))
|
|
183
|
-
);
|
|
184
|
-
}
|
|
185
|
-
let data = {
|
|
186
|
-
page,
|
|
187
|
-
project,
|
|
188
|
-
pageAssignment,
|
|
189
|
-
configs: {
|
|
190
|
-
...this.basePageConfigs,
|
|
191
|
-
requestInfo: {
|
|
192
|
-
params,
|
|
193
|
-
i18n: this.storefront.i18n,
|
|
194
|
-
queries: getRequestQueries(request),
|
|
195
|
-
pathname: new URL(request.url).pathname,
|
|
196
|
-
search: new URL(request.url).search
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
};
|
|
200
|
-
return resolve(data);
|
|
201
|
-
} catch (err) {
|
|
202
|
-
console.log(`\u274C [Weaverse page]`, err);
|
|
203
|
-
reject(err);
|
|
326
|
+
} catch (err) {
|
|
327
|
+
console.log(`\u274C [Weaverse theme settings]`, err);
|
|
328
|
+
return null;
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
loadPage = async (args, configs = {}) => {
|
|
332
|
+
return new Promise(async (resolve, reject) => {
|
|
333
|
+
try {
|
|
334
|
+
if (!this.configs.projectId) {
|
|
335
|
+
throw new Error("Missing Weaverse projectId!");
|
|
204
336
|
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
337
|
+
let { request, params } = args;
|
|
338
|
+
let { strategy, ...pageLoadParams } = configs;
|
|
339
|
+
let body = {
|
|
340
|
+
...this.basePageRequestBody,
|
|
341
|
+
params: pageLoadParams,
|
|
342
|
+
url: request.url
|
|
343
|
+
};
|
|
344
|
+
let reqInit = {
|
|
345
|
+
method: "POST",
|
|
346
|
+
body: JSON.stringify(body)
|
|
347
|
+
};
|
|
348
|
+
let url = `${this.configs.weaverseHost}/${this.API}`;
|
|
349
|
+
let payload;
|
|
350
|
+
if (this.configs.isDesignMode) {
|
|
351
|
+
payload = await fetch(url, reqInit).then((res) => res.json());
|
|
352
|
+
} else {
|
|
353
|
+
payload = await this.fetchWithCache(url, {
|
|
354
|
+
...reqInit,
|
|
355
|
+
strategy
|
|
356
|
+
});
|
|
224
357
|
}
|
|
358
|
+
let { page, project, pageAssignment } = payload;
|
|
359
|
+
if (!page || !project || !pageAssignment) {
|
|
360
|
+
throw new Error(
|
|
361
|
+
// @ts-ignore
|
|
362
|
+
payload?.error || "Invalid Weaverse project payload!"
|
|
363
|
+
);
|
|
364
|
+
}
|
|
365
|
+
if (page?.items) {
|
|
366
|
+
let items = page.items;
|
|
367
|
+
page.items = await Promise.all(
|
|
368
|
+
items.map((item) => this.execComponentLoader(item, args))
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
let data = {
|
|
372
|
+
page,
|
|
373
|
+
project,
|
|
374
|
+
pageAssignment,
|
|
375
|
+
configs: {
|
|
376
|
+
...this.basePageConfigs,
|
|
377
|
+
requestInfo: {
|
|
378
|
+
params,
|
|
379
|
+
i18n: this.storefront.i18n,
|
|
380
|
+
queries: getRequestQueries(request),
|
|
381
|
+
pathname: new URL(request.url).pathname,
|
|
382
|
+
search: new URL(request.url).search
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
};
|
|
386
|
+
return resolve(data);
|
|
387
|
+
} catch (err) {
|
|
388
|
+
console.log(`\u274C [Weaverse page]`, err);
|
|
389
|
+
reject(err);
|
|
225
390
|
}
|
|
226
|
-
return item;
|
|
227
|
-
};
|
|
228
|
-
let { configs, storefront, components, countries, withCache, themeSchema } = args;
|
|
229
|
-
this.storefront = storefront;
|
|
230
|
-
this.components = components;
|
|
231
|
-
this.countries = countries;
|
|
232
|
-
this.themeSchema = themeSchema;
|
|
233
|
-
this.configs = configs;
|
|
234
|
-
this.withCache = withCache;
|
|
235
|
-
this.basePageConfigs = {
|
|
236
|
-
projectId: configs.projectId,
|
|
237
|
-
weaverseHost: configs.weaverseHost,
|
|
238
|
-
weaverseVersion: configs.weaverseVersion,
|
|
239
|
-
isDesignMode: configs.isDesignMode
|
|
240
|
-
};
|
|
241
|
-
this.basePageRequestBody = {
|
|
242
|
-
countries,
|
|
243
|
-
isDesignMode: this.configs.isDesignMode,
|
|
244
|
-
i18n: storefront.i18n,
|
|
245
|
-
projectId: this.configs.projectId
|
|
246
|
-
};
|
|
247
|
-
}
|
|
248
|
-
};
|
|
249
|
-
|
|
250
|
-
// src/hooks/use-theme-settings.ts
|
|
251
|
-
import { useSyncExternalStore } from "react";
|
|
252
|
-
|
|
253
|
-
// src/hooks/use-theme-context.ts
|
|
254
|
-
import { useContext } from "react";
|
|
255
|
-
|
|
256
|
-
// src/context.ts
|
|
257
|
-
import { Weaverse, isBrowser } from "@weaverse/react";
|
|
258
|
-
import { createContext } from "react";
|
|
259
|
-
function createCachedWeaverseInstance(init) {
|
|
260
|
-
if (isBrowser) {
|
|
261
|
-
window.__weaverses = window.__weaverses || [];
|
|
262
|
-
let weaverse = window.__weaverses.find((w) => {
|
|
263
|
-
let { pathname, search } = w.requestInfo;
|
|
264
|
-
let { __cachedId } = w.data;
|
|
265
|
-
return pathname === init.requestInfo.pathname && search === init.requestInfo.search && __cachedId === init.data.__cachedId;
|
|
266
|
-
});
|
|
267
|
-
if (!weaverse) {
|
|
268
|
-
weaverse = new Weaverse(init);
|
|
269
|
-
window.__weaverses.push(weaverse);
|
|
270
|
-
console.log("\u{1F4BF} Weaverse", weaverse);
|
|
271
|
-
}
|
|
272
|
-
return weaverse;
|
|
273
|
-
}
|
|
274
|
-
return new Weaverse(init);
|
|
275
|
-
}
|
|
276
|
-
function createWeaverseInstance(weaverseData, components) {
|
|
277
|
-
let { page, configs, project, pageAssignment } = weaverseData || {};
|
|
278
|
-
let weaverse = createCachedWeaverseInstance({
|
|
279
|
-
...configs,
|
|
280
|
-
data: page || {},
|
|
281
|
-
pageId: page?.id,
|
|
282
|
-
platformType: "shopify-hydrogen",
|
|
283
|
-
internal: { project, pageAssignment }
|
|
284
|
-
});
|
|
285
|
-
components.forEach((comp) => {
|
|
286
|
-
weaverse.registerElement({
|
|
287
|
-
type: comp?.schema?.type,
|
|
288
|
-
Component: comp?.default,
|
|
289
|
-
schema: comp?.schema,
|
|
290
|
-
loader: comp?.loader
|
|
291
391
|
});
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
ThemeProvider.displayName = "WeaverseThemeProvider";
|
|
297
|
-
|
|
298
|
-
// src/hooks/use-theme-context.ts
|
|
299
|
-
function useThemeContext() {
|
|
300
|
-
let themeContext = useContext(ThemeProvider);
|
|
301
|
-
if (!themeContext) {
|
|
302
|
-
throw new Error(
|
|
303
|
-
`useThemeContext must be used within a ThemeProvider. Make sure to wrap your app in the withWeaverse HoC.`
|
|
392
|
+
};
|
|
393
|
+
execComponentLoader = async (item, args) => {
|
|
394
|
+
let schema = this.components.find(
|
|
395
|
+
({ schema: schema2 }) => schema2?.type === item.type
|
|
304
396
|
);
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
this.subscribe = (listener) => {
|
|
319
|
-
this.listeners = [...this.listeners, listener];
|
|
320
|
-
return () => {
|
|
321
|
-
this.listeners = this.listeners.filter((l) => l !== listener);
|
|
322
|
-
};
|
|
323
|
-
};
|
|
324
|
-
this.getSnapshot = () => {
|
|
325
|
-
return this.settings;
|
|
326
|
-
};
|
|
327
|
-
this.getServerSnapshot = () => {
|
|
328
|
-
return this.settings;
|
|
329
|
-
};
|
|
330
|
-
this.emitChange = () => {
|
|
331
|
-
for (let listener of this.listeners) {
|
|
332
|
-
listener();
|
|
397
|
+
let { loader } = schema || {};
|
|
398
|
+
if (loader && typeof loader === "function") {
|
|
399
|
+
try {
|
|
400
|
+
return {
|
|
401
|
+
...item,
|
|
402
|
+
loaderData: await loader({
|
|
403
|
+
itemData: item,
|
|
404
|
+
...args
|
|
405
|
+
})
|
|
406
|
+
};
|
|
407
|
+
} catch (err) {
|
|
408
|
+
console.log(`\u274C [Weaverse item loader]`, item.id, err);
|
|
409
|
+
return item;
|
|
333
410
|
}
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
this.countries = countries;
|
|
338
|
-
this.schema = schema;
|
|
339
|
-
this.publicEnv = publicEnv;
|
|
340
|
-
}
|
|
411
|
+
}
|
|
412
|
+
return item;
|
|
413
|
+
};
|
|
341
414
|
};
|
|
342
|
-
function useThemeSettings() {
|
|
343
|
-
let themeSettingsStore = useThemeContext();
|
|
344
|
-
let settings = useSyncExternalStore(
|
|
345
|
-
themeSettingsStore.subscribe,
|
|
346
|
-
themeSettingsStore.getSnapshot,
|
|
347
|
-
themeSettingsStore.getServerSnapshot
|
|
348
|
-
);
|
|
349
|
-
return settings;
|
|
350
|
-
}
|
|
351
415
|
|
|
352
416
|
// src/wrappers.ts
|
|
353
417
|
import { getSelectedProductOptions as hydrogen_getSelectedProductOptions } from "@shopify/hydrogen";
|
|
354
|
-
import { createContentSecurityPolicy as hydrogen_createContentSecurityPolicy } from "@shopify/hydrogen";
|
|
355
418
|
function getSelectedProductOptions(request) {
|
|
356
419
|
let options = hydrogen_getSelectedProductOptions(request);
|
|
357
420
|
return options.filter(
|
|
358
421
|
({ name }) => name !== "isDesignMode" && !name.startsWith("weaverse")
|
|
359
422
|
);
|
|
360
423
|
}
|
|
361
|
-
function createContentSecurityPolicy(request, directives) {
|
|
362
|
-
let weaverseDirectives = getWeaverseCsp(request);
|
|
363
|
-
return hydrogen_createContentSecurityPolicy({
|
|
364
|
-
...directives,
|
|
365
|
-
...weaverseDirectives
|
|
366
|
-
});
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
// src/WeaverseHydrogenRoot.tsx
|
|
370
|
-
import { Await, useLoaderData } from "@remix-run/react";
|
|
371
|
-
import { WeaverseRoot } from "@weaverse/react";
|
|
372
|
-
import React, { Suspense } from "react";
|
|
373
|
-
import { ErrorBoundary } from "react-error-boundary";
|
|
374
424
|
|
|
375
|
-
// src/
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
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;
|
|
399
466
|
}
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
// src/WeaverseHydrogenRoot.tsx
|
|
405
|
-
function WeaverseHydrogenRoot({
|
|
406
|
-
errorComponent: ErrorComponent = FallbackError,
|
|
407
|
-
components
|
|
408
|
-
}) {
|
|
409
|
-
let loaderData = useLoaderData();
|
|
410
|
-
let data = loaderData?.weaverseData;
|
|
411
|
-
if (data) {
|
|
412
|
-
if (data instanceof Promise) {
|
|
413
|
-
return /* @__PURE__ */ React.createElement(ErrorBoundary, { fallbackRender: ErrorComponent }, /* @__PURE__ */ React.createElement(Suspense, null, /* @__PURE__ */ React.createElement(Await, { resolve: data }, (resolvedData) => {
|
|
414
|
-
return /* @__PURE__ */ React.createElement(RenderRoot, { data: resolvedData, components });
|
|
415
|
-
})));
|
|
416
|
-
}
|
|
417
|
-
return /* @__PURE__ */ React.createElement(RenderRoot, { data, components });
|
|
467
|
+
return a;
|
|
468
|
+
}, {});
|
|
469
|
+
return { ...defaultData, ...super.data };
|
|
418
470
|
}
|
|
419
|
-
return /* @__PURE__ */ React.createElement(
|
|
420
|
-
ErrorComponent,
|
|
421
|
-
{
|
|
422
|
-
error: { message: "No Weaverse data return from route loader!" }
|
|
423
|
-
}
|
|
424
|
-
);
|
|
425
|
-
}
|
|
426
|
-
function RenderRoot(props) {
|
|
427
|
-
let { data, components } = props;
|
|
428
|
-
let weaverse = createWeaverseInstance(data, components);
|
|
429
|
-
useStudio(weaverse);
|
|
430
|
-
return /* @__PURE__ */ React.createElement(WeaverseRoot, { context: weaverse });
|
|
431
|
-
}
|
|
432
|
-
var withWeaverse = (Component) => {
|
|
433
|
-
return (props) => {
|
|
434
|
-
let { weaverseTheme } = useLoaderData();
|
|
435
|
-
let themeSettingsStore = new ThemeSettingsStore(weaverseTheme);
|
|
436
|
-
return /* @__PURE__ */ React.createElement(ThemeProvider.Provider, { value: themeSettingsStore }, /* @__PURE__ */ React.createElement(Component, { ...props }));
|
|
437
|
-
};
|
|
438
471
|
};
|
|
439
|
-
function FallbackError({ error }) {
|
|
440
|
-
return /* @__PURE__ */ React.createElement("div", null, error?.message || "An unexpected error occurred");
|
|
441
|
-
}
|
|
442
472
|
export {
|
|
443
473
|
ThemeSettingsStore,
|
|
444
474
|
WeaverseClient,
|
|
475
|
+
WeaverseHydrogen,
|
|
476
|
+
WeaverseHydrogenItem,
|
|
445
477
|
WeaverseHydrogenRoot,
|
|
446
|
-
createContentSecurityPolicy,
|
|
447
478
|
getRequestQueries,
|
|
448
479
|
getSelectedProductOptions,
|
|
449
480
|
getWeaverseConfigs,
|
|
450
|
-
getWeaverseCsp,
|
|
451
481
|
useThemeSettings,
|
|
452
482
|
withWeaverse
|
|
453
483
|
};
|