@weaverse/hydrogen 1.0.24 → 1.0.26

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.ts CHANGED
@@ -1,22 +1,52 @@
1
1
  import { Weaverse } from '@weaverse/core';
2
- import { LoaderArgs } from '@remix-run/server-runtime';
2
+ import { LoaderArgs } from '@shopify/remix-oxygen';
3
3
 
4
- type WeaverseHydrogenConfigs = {
5
- projectId: string;
6
- weaverseHost: string;
7
- components: {
8
- [key: string]: any;
9
- };
4
+ /**
5
+ * Declare local additions to `AppLoadContext` to include the session utilities we injected in `server.ts`.
6
+ */
7
+ declare module '@shopify/remix-oxygen' {
8
+ interface AppLoadContext {
9
+ waitUntil: ExecutionContext['waitUntil'];
10
+ session: TODO;
11
+ storefront: TODO;
12
+ env: TODO;
13
+ }
14
+ }
15
+ type WeaverseComponentsType = {
16
+ [key: string]: any;
10
17
  };
18
+ type TODO = any;
11
19
 
12
20
  declare let useStudio: (weaverseCore: Weaverse) => void;
13
21
 
14
- declare function weaverseLoader({ request, context, params }: LoaderArgs, weaverseConfig: WeaverseHydrogenConfigs): Promise<any>;
15
-
16
- declare let useWeaverseHydrogen: (weaverseHydrogenConfigs: WeaverseHydrogenConfigs, data: any) => Weaverse;
17
- declare let WeaverseHydrogenRoot: ({ configs, data, }: {
18
- configs: WeaverseHydrogenConfigs;
22
+ type QueryKey = string | readonly unknown[];
23
+ declare function hashKey(queryKey: QueryKey): string;
24
+ declare let fetchWithServerCache: ({ url, options, storefront, waitUntil, }: {
25
+ url: string;
26
+ options: RequestInit | Request;
27
+ storefront: any;
28
+ waitUntil?: any;
29
+ }) => Promise<any>;
30
+ type WeaverseComponentLoaderArgs = LoaderArgs & {
19
31
  data: any;
32
+ config: {
33
+ projectId: string;
34
+ weaverseHost: string;
35
+ };
36
+ };
37
+ declare function weaverseLoader({ request, context: { env, storefront, waitUntil }, context, params, }: LoaderArgs, components: {
38
+ [key: string]: {
39
+ [key: string]: any;
40
+ loader?: (loaderArgs: WeaverseComponentLoaderArgs) => Promise<any>;
41
+ };
42
+ }): Promise<any>;
43
+
44
+ declare let WeaverseHydrogenRoot: ({ components, data, }: {
45
+ components: WeaverseComponentsType;
46
+ data: {
47
+ [key: string]: any;
48
+ weaverseData: any;
49
+ };
20
50
  }) => JSX.Element;
21
51
 
22
- export { WeaverseHydrogenRoot, useStudio, useWeaverseHydrogen, weaverseLoader };
52
+ export { WeaverseComponentLoaderArgs, WeaverseHydrogenRoot, fetchWithServerCache, hashKey, useStudio, weaverseLoader };
package/dist/index.js CHANGED
@@ -31,8 +31,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var src_exports = {};
32
32
  __export(src_exports, {
33
33
  WeaverseHydrogenRoot: () => WeaverseHydrogenRoot,
34
+ fetchWithServerCache: () => fetchWithServerCache,
35
+ hashKey: () => hashKey,
34
36
  useStudio: () => useStudio,
35
- useWeaverseHydrogen: () => useWeaverseHydrogen,
36
37
  weaverseLoader: () => weaverseLoader
37
38
  });
38
39
  module.exports = __toCommonJS(src_exports);
@@ -43,7 +44,6 @@ var import_react = require("react");
43
44
  var useStudio = (weaverseCore) => {
44
45
  (0, import_react.useEffect)(() => {
45
46
  if (weaverseCore.isDesignMode && import_core.isIframe && !window.weaverseStudioInitialized) {
46
- console.log("useStudio", weaverseCore);
47
47
  window.weaverseStudioInitialized = true;
48
48
  let host = weaverseCore.weaverseHost;
49
49
  let version = weaverseCore.weaverseVersion || Date.now();
@@ -56,79 +56,175 @@ var useStudio = (weaverseCore) => {
56
56
  }
57
57
  );
58
58
  }
59
+ setTimeout(() => {
60
+ weaverseCore.stitchesInstance?.reset();
61
+ window.__weaverse = weaverseCore;
62
+ }, 1);
59
63
  }, []);
60
64
  };
61
65
 
62
66
  // src/index.tsx
63
- var import_react2 = __toESM(require("react"));
64
- var import_react3 = require("@weaverse/react");
67
+ var import_react3 = __toESM(require("react"));
68
+ var import_react4 = require("@weaverse/react");
65
69
 
66
- // src/weaverse-loader.ts
67
- async function weaverseLoader({ request, context, params }, weaverseConfig) {
68
- let fetchBody = {
69
- projectId: weaverseConfig.projectId,
70
- url: request.url
71
- };
72
- let response = await fetch(
73
- `${weaverseConfig.weaverseHost}/api/public/project`,
74
- {
75
- method: "POST",
76
- headers: {
77
- "Content-Type": "application/json"
78
- },
79
- body: JSON.stringify(fetchBody)
80
- }
81
- ).then((res) => res.json());
82
- return {
83
- weaversePageData: response
84
- };
85
- }
86
-
87
- // src/index.tsx
88
- var createHydrogenRootContext = (configs, elements = {}) => {
89
- let rootContext = (0, import_react3.createRootContext)(configs);
90
- Object.keys(elements).forEach((key) => {
91
- rootContext.registerElement(elements[key]);
92
- });
93
- return rootContext;
94
- };
95
- var useWeaverseHydrogen = (weaverseHydrogenConfigs, data) => {
96
- let weaversePageData = data?.weaverseData?.weaversePageData;
97
- let { components, ...rest } = weaverseHydrogenConfigs;
98
- let weaverse = createHydrogenRootContext({
99
- ...rest,
100
- data: weaversePageData,
101
- pageId: weaversePageData?.pageId,
70
+ // src/context.ts
71
+ var import_react2 = require("@weaverse/react");
72
+ var createWeaverseHydrogenContext = ({
73
+ weaverseData: { pageData, config } = {
74
+ pageData: {},
75
+ config: {}
76
+ }
77
+ }, components) => {
78
+ let weaverse = (0, import_react2.createRootContext)({
79
+ ...config,
80
+ data: pageData,
81
+ pageId: pageData?.pageId,
102
82
  isDesignMode: true,
103
83
  platformType: "shopify-hydrogen"
104
84
  });
105
- Object.keys(components).forEach((key) => {
106
- let component = components[key];
85
+ Object.entries(components).forEach(([key, component]) => {
107
86
  weaverse.registerElement({
108
- type: components[key]?.schema?.type || key,
87
+ type: component?.schema?.type || key,
109
88
  Component: component?.default,
110
89
  schema: component?.schema,
111
90
  defaultCss: component?.css,
112
91
  permanentCss: component?.permanentCss
113
92
  });
114
93
  });
115
- useStudio(weaverse);
116
94
  return weaverse;
117
95
  };
96
+
97
+ // src/weaverse-loader.ts
98
+ var import_hydrogen = require("@shopify/hydrogen");
99
+ function hashKey(queryKey) {
100
+ const rawKeys = Array.isArray(queryKey) ? queryKey : [queryKey];
101
+ let hash = "";
102
+ for (const key of rawKeys) {
103
+ if (key != null) {
104
+ if (typeof key === "object") {
105
+ if (!!key.body && typeof key.body === "string") {
106
+ hash += key.body;
107
+ } else {
108
+ hash += JSON.stringify(key);
109
+ }
110
+ } else {
111
+ hash += key;
112
+ }
113
+ }
114
+ }
115
+ return hash;
116
+ }
117
+ var fetchWithServerCache = async ({
118
+ url,
119
+ options = {},
120
+ storefront,
121
+ waitUntil
122
+ }) => {
123
+ const cacheUrl = new URL(url);
124
+ cacheUrl.pathname = "/cache" + cacheUrl.pathname + hashKey([options.body]);
125
+ const cacheKey = new Request(cacheUrl.toString());
126
+ let response = await storefront.cache.match(cacheKey);
127
+ if (!response) {
128
+ let cacheControl = (0, import_hydrogen.generateCacheControlHeader)({
129
+ ...(0, import_hydrogen.CacheShort)()
130
+ });
131
+ console.log("fetchWithServerCache", cacheControl);
132
+ response = await fetch(url, {
133
+ ...options,
134
+ headers: {
135
+ "cache-control": cacheControl,
136
+ ...options.headers
137
+ }
138
+ });
139
+ waitUntil?.(storefront.cache.put(cacheKey, response.clone()));
140
+ }
141
+ return response;
142
+ };
143
+ async function weaverseLoader({
144
+ request,
145
+ context: { env, storefront, waitUntil },
146
+ context,
147
+ params
148
+ }, components) {
149
+ let projectId = env?.WEAVERSE_PROJECT_ID;
150
+ let weaverseHost = env?.WEAVERSE_HOST;
151
+ if (!projectId || !weaverseHost) {
152
+ console.error("WEAVERSE_PROJECT_ID or WEAVERSE_HOST is not set!");
153
+ return {};
154
+ }
155
+ let config = {
156
+ projectId,
157
+ weaverseHost
158
+ };
159
+ let fetchBody = {
160
+ projectId,
161
+ url: request.url
162
+ };
163
+ try {
164
+ let pageData = await fetchWithServerCache({
165
+ url: `${weaverseHost}/api/public/project`,
166
+ options: {
167
+ method: "POST",
168
+ headers: {
169
+ "Content-Type": "application/json"
170
+ },
171
+ body: JSON.stringify(fetchBody)
172
+ },
173
+ storefront,
174
+ waitUntil
175
+ }).then((r) => r.json()).catch((err) => {
176
+ console.error(err);
177
+ return {};
178
+ });
179
+ if (pageData?.items) {
180
+ let items = pageData.items;
181
+ pageData.items = await Promise.all(
182
+ items.map(async (item) => {
183
+ let loader = components[item.type]?.loader;
184
+ if (loader) {
185
+ return {
186
+ ...item,
187
+ ...await loader({
188
+ data: item,
189
+ context,
190
+ params,
191
+ request,
192
+ config
193
+ })
194
+ };
195
+ }
196
+ return item;
197
+ })
198
+ );
199
+ }
200
+ return {
201
+ pageData,
202
+ config,
203
+ components: {}
204
+ };
205
+ } catch (err) {
206
+ console.error(err);
207
+ return {};
208
+ }
209
+ }
210
+
211
+ // src/index.tsx
118
212
  var WeaverseHydrogenRoot = ({
119
- configs,
213
+ components,
120
214
  data
121
215
  }) => {
122
- let weaverse = useWeaverseHydrogen(configs, data);
216
+ let weaverse = createWeaverseHydrogenContext(data, components);
217
+ useStudio(weaverse);
123
218
  if (!weaverse?.data) {
124
- return /* @__PURE__ */ import_react2.default.createElement("div", null, "404");
219
+ return /* @__PURE__ */ import_react3.default.createElement("div", null, "404");
125
220
  }
126
- return /* @__PURE__ */ import_react2.default.createElement(import_react3.WeaverseRoot, { context: weaverse });
221
+ return /* @__PURE__ */ import_react3.default.createElement(import_react4.WeaverseRoot, { context: weaverse });
127
222
  };
128
223
  // Annotate the CommonJS export names for ESM import in node:
129
224
  0 && (module.exports = {
130
225
  WeaverseHydrogenRoot,
226
+ fetchWithServerCache,
227
+ hashKey,
131
228
  useStudio,
132
- useWeaverseHydrogen,
133
229
  weaverseLoader
134
230
  });
package/dist/index.mjs CHANGED
@@ -4,7 +4,6 @@ import { useEffect } from "react";
4
4
  var useStudio = (weaverseCore) => {
5
5
  useEffect(() => {
6
6
  if (weaverseCore.isDesignMode && isIframe && !window.weaverseStudioInitialized) {
7
- console.log("useStudio", weaverseCore);
8
7
  window.weaverseStudioInitialized = true;
9
8
  let host = weaverseCore.weaverseHost;
10
9
  let version = weaverseCore.weaverseVersion || Date.now();
@@ -17,70 +16,168 @@ var useStudio = (weaverseCore) => {
17
16
  }
18
17
  );
19
18
  }
19
+ setTimeout(() => {
20
+ weaverseCore.stitchesInstance?.reset();
21
+ window.__weaverse = weaverseCore;
22
+ }, 1);
20
23
  }, []);
21
24
  };
22
25
 
23
26
  // src/index.tsx
24
27
  import React from "react";
25
- import { WeaverseRoot, createRootContext } from "@weaverse/react";
28
+ import { WeaverseRoot } from "@weaverse/react";
26
29
 
27
- // src/weaverse-loader.ts
28
- async function weaverseLoader({ request, context, params }, weaverseConfig) {
29
- let fetchBody = {
30
- projectId: weaverseConfig.projectId,
31
- url: request.url
32
- };
33
- let response = await fetch(
34
- `${weaverseConfig.weaverseHost}/api/public/project`,
35
- {
36
- method: "POST",
37
- headers: {
38
- "Content-Type": "application/json"
39
- },
40
- body: JSON.stringify(fetchBody)
41
- }
42
- ).then((res) => res.json());
43
- return {
44
- weaversePageData: response
45
- };
46
- }
47
-
48
- // src/index.tsx
49
- var createHydrogenRootContext = (configs, elements = {}) => {
50
- let rootContext = createRootContext(configs);
51
- Object.keys(elements).forEach((key) => {
52
- rootContext.registerElement(elements[key]);
53
- });
54
- return rootContext;
55
- };
56
- var useWeaverseHydrogen = (weaverseHydrogenConfigs, data) => {
57
- let weaversePageData = data?.weaverseData?.weaversePageData;
58
- let { components, ...rest } = weaverseHydrogenConfigs;
59
- let weaverse = createHydrogenRootContext({
60
- ...rest,
61
- data: weaversePageData,
62
- pageId: weaversePageData?.pageId,
30
+ // src/context.ts
31
+ import { createRootContext } from "@weaverse/react";
32
+ var createWeaverseHydrogenContext = ({
33
+ weaverseData: { pageData, config } = {
34
+ pageData: {},
35
+ config: {}
36
+ }
37
+ }, components) => {
38
+ let weaverse = createRootContext({
39
+ ...config,
40
+ data: pageData,
41
+ pageId: pageData?.pageId,
63
42
  isDesignMode: true,
64
43
  platformType: "shopify-hydrogen"
65
44
  });
66
- Object.keys(components).forEach((key) => {
67
- let component = components[key];
45
+ Object.entries(components).forEach(([key, component]) => {
68
46
  weaverse.registerElement({
69
- type: components[key]?.schema?.type || key,
47
+ type: component?.schema?.type || key,
70
48
  Component: component?.default,
71
49
  schema: component?.schema,
72
50
  defaultCss: component?.css,
73
51
  permanentCss: component?.permanentCss
74
52
  });
75
53
  });
76
- useStudio(weaverse);
77
54
  return weaverse;
78
55
  };
56
+
57
+ // src/weaverse-loader.ts
58
+ import {
59
+ CacheShort,
60
+ generateCacheControlHeader
61
+ } from "@shopify/hydrogen";
62
+ function hashKey(queryKey) {
63
+ const rawKeys = Array.isArray(queryKey) ? queryKey : [queryKey];
64
+ let hash = "";
65
+ for (const key of rawKeys) {
66
+ if (key != null) {
67
+ if (typeof key === "object") {
68
+ if (!!key.body && typeof key.body === "string") {
69
+ hash += key.body;
70
+ } else {
71
+ hash += JSON.stringify(key);
72
+ }
73
+ } else {
74
+ hash += key;
75
+ }
76
+ }
77
+ }
78
+ return hash;
79
+ }
80
+ var fetchWithServerCache = async ({
81
+ url,
82
+ options = {},
83
+ storefront,
84
+ waitUntil
85
+ }) => {
86
+ const cacheUrl = new URL(url);
87
+ cacheUrl.pathname = "/cache" + cacheUrl.pathname + hashKey([options.body]);
88
+ const cacheKey = new Request(cacheUrl.toString());
89
+ let response = await storefront.cache.match(cacheKey);
90
+ if (!response) {
91
+ let cacheControl = generateCacheControlHeader({
92
+ ...CacheShort()
93
+ });
94
+ console.log("fetchWithServerCache", cacheControl);
95
+ response = await fetch(url, {
96
+ ...options,
97
+ headers: {
98
+ "cache-control": cacheControl,
99
+ ...options.headers
100
+ }
101
+ });
102
+ waitUntil?.(storefront.cache.put(cacheKey, response.clone()));
103
+ }
104
+ return response;
105
+ };
106
+ async function weaverseLoader({
107
+ request,
108
+ context: { env, storefront, waitUntil },
109
+ context,
110
+ params
111
+ }, components) {
112
+ let projectId = env?.WEAVERSE_PROJECT_ID;
113
+ let weaverseHost = env?.WEAVERSE_HOST;
114
+ if (!projectId || !weaverseHost) {
115
+ console.error("WEAVERSE_PROJECT_ID or WEAVERSE_HOST is not set!");
116
+ return {};
117
+ }
118
+ let config = {
119
+ projectId,
120
+ weaverseHost
121
+ };
122
+ let fetchBody = {
123
+ projectId,
124
+ url: request.url
125
+ };
126
+ try {
127
+ let pageData = await fetchWithServerCache({
128
+ url: `${weaverseHost}/api/public/project`,
129
+ options: {
130
+ method: "POST",
131
+ headers: {
132
+ "Content-Type": "application/json"
133
+ },
134
+ body: JSON.stringify(fetchBody)
135
+ },
136
+ storefront,
137
+ waitUntil
138
+ }).then((r) => r.json()).catch((err) => {
139
+ console.error(err);
140
+ return {};
141
+ });
142
+ if (pageData?.items) {
143
+ let items = pageData.items;
144
+ pageData.items = await Promise.all(
145
+ items.map(async (item) => {
146
+ let loader = components[item.type]?.loader;
147
+ if (loader) {
148
+ return {
149
+ ...item,
150
+ ...await loader({
151
+ data: item,
152
+ context,
153
+ params,
154
+ request,
155
+ config
156
+ })
157
+ };
158
+ }
159
+ return item;
160
+ })
161
+ );
162
+ }
163
+ return {
164
+ pageData,
165
+ config,
166
+ components: {}
167
+ };
168
+ } catch (err) {
169
+ console.error(err);
170
+ return {};
171
+ }
172
+ }
173
+
174
+ // src/index.tsx
79
175
  var WeaverseHydrogenRoot = ({
80
- configs,
176
+ components,
81
177
  data
82
178
  }) => {
83
- let weaverse = useWeaverseHydrogen(configs, data);
179
+ let weaverse = createWeaverseHydrogenContext(data, components);
180
+ useStudio(weaverse);
84
181
  if (!weaverse?.data) {
85
182
  return /* @__PURE__ */ React.createElement("div", null, "404");
86
183
  }
@@ -88,7 +185,8 @@ var WeaverseHydrogenRoot = ({
88
185
  };
89
186
  export {
90
187
  WeaverseHydrogenRoot,
188
+ fetchWithServerCache,
189
+ hashKey,
91
190
  useStudio,
92
- useWeaverseHydrogen,
93
191
  weaverseLoader
94
192
  };
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.0.24",
2
+ "version": "1.0.26",
3
3
  "license": "MIT",
4
4
  "main": "dist/index.js",
5
5
  "typings": "dist/index.d.ts",
@@ -32,8 +32,11 @@
32
32
  "name": "@weaverse/hydrogen",
33
33
  "author": "Weaverse Team",
34
34
  "dependencies": {
35
- "@weaverse/react": "1.0.24",
36
- "@weaverse/core": "1.0.24",
37
- "@shopify/hydrogen": "2023.1.6"
35
+ "@shopify/hydrogen": "2023.4.0",
36
+ "@weaverse/core": "1.0.26",
37
+ "@weaverse/react": "1.0.26"
38
+ },
39
+ "devDependencies": {
40
+ "@shopify/remix-oxygen": "^1.0.5"
38
41
  }
39
42
  }