@weaverse/hydrogen 1.0.24 → 1.0.25

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();
@@ -60,75 +60,167 @@ var useStudio = (weaverseCore) => {
60
60
  };
61
61
 
62
62
  // src/index.tsx
63
- var import_react2 = __toESM(require("react"));
64
- var import_react3 = require("@weaverse/react");
63
+ var import_react3 = __toESM(require("react"));
64
+ var import_react4 = require("@weaverse/react");
65
65
 
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,
66
+ // src/context.ts
67
+ var import_react2 = require("@weaverse/react");
68
+ var createWeaverseHydrogenContext = ({
69
+ weaverseData: { pageData, config } = {
70
+ pageData: {},
71
+ config: {}
72
+ }
73
+ }, components) => {
74
+ let weaverse = (0, import_react2.createRootContext)({
75
+ ...config,
76
+ data: pageData,
77
+ pageId: pageData?.pageId,
102
78
  isDesignMode: true,
103
79
  platformType: "shopify-hydrogen"
104
80
  });
105
- Object.keys(components).forEach((key) => {
106
- let component = components[key];
81
+ Object.entries(components).forEach(([key, component]) => {
107
82
  weaverse.registerElement({
108
- type: components[key]?.schema?.type || key,
83
+ type: component?.schema?.type || key,
109
84
  Component: component?.default,
110
85
  schema: component?.schema,
111
86
  defaultCss: component?.css,
112
87
  permanentCss: component?.permanentCss
113
88
  });
114
89
  });
115
- useStudio(weaverse);
116
90
  return weaverse;
117
91
  };
92
+
93
+ // src/weaverse-loader.ts
94
+ var import_hydrogen = require("@shopify/hydrogen");
95
+ function hashKey(queryKey) {
96
+ const rawKeys = Array.isArray(queryKey) ? queryKey : [queryKey];
97
+ let hash = "";
98
+ for (const key of rawKeys) {
99
+ if (key != null) {
100
+ if (typeof key === "object") {
101
+ if (!!key.body && typeof key.body === "string") {
102
+ hash += key.body;
103
+ } else {
104
+ hash += JSON.stringify(key);
105
+ }
106
+ } else {
107
+ hash += key;
108
+ }
109
+ }
110
+ }
111
+ return hash;
112
+ }
113
+ var fetchWithServerCache = async ({
114
+ url,
115
+ options = {},
116
+ storefront,
117
+ waitUntil
118
+ }) => {
119
+ const cacheUrl = new URL(url);
120
+ cacheUrl.pathname = "/cache" + cacheUrl.pathname + hashKey([options.body]);
121
+ const cacheKey = new Request(cacheUrl.toString());
122
+ let response = await storefront.cache.match(cacheKey);
123
+ if (!response) {
124
+ let cacheControl = (0, import_hydrogen.generateCacheControlHeader)({
125
+ ...(0, import_hydrogen.CacheShort)()
126
+ });
127
+ console.log("fetchWithServerCache", cacheControl);
128
+ response = await fetch(url, {
129
+ ...options,
130
+ headers: {
131
+ "cache-control": cacheControl,
132
+ ...options.headers
133
+ }
134
+ });
135
+ waitUntil?.(storefront.cache.put(cacheKey, response.clone()));
136
+ }
137
+ return response;
138
+ };
139
+ async function weaverseLoader({
140
+ request,
141
+ context: { env, storefront, waitUntil },
142
+ context,
143
+ params
144
+ }, components) {
145
+ let projectId = env?.WEAVERSE_PROJECT_ID;
146
+ let weaverseHost = env?.WEAVERSE_HOST;
147
+ if (!projectId || !weaverseHost) {
148
+ console.error("WEAVERSE_PROJECT_ID or WEAVERSE_HOST is not set!");
149
+ return {};
150
+ }
151
+ let config = {
152
+ projectId,
153
+ weaverseHost
154
+ };
155
+ let fetchBody = {
156
+ projectId,
157
+ url: request.url
158
+ };
159
+ try {
160
+ let pageData = await fetchWithServerCache({
161
+ url: `${weaverseHost}/api/public/project`,
162
+ options: {
163
+ method: "POST",
164
+ headers: {
165
+ "Content-Type": "application/json"
166
+ },
167
+ body: JSON.stringify(fetchBody)
168
+ },
169
+ storefront,
170
+ waitUntil
171
+ }).then((r) => r.json()).catch((err) => {
172
+ console.error(err);
173
+ return {};
174
+ });
175
+ if (pageData?.items) {
176
+ let items = pageData.items;
177
+ pageData.items = await Promise.all(
178
+ items.map(async (item) => {
179
+ let loader = components[item.type]?.loader;
180
+ if (loader) {
181
+ return {
182
+ ...item,
183
+ ...await loader({
184
+ data: item,
185
+ context,
186
+ params,
187
+ request,
188
+ config
189
+ })
190
+ };
191
+ }
192
+ return item;
193
+ })
194
+ );
195
+ }
196
+ return {
197
+ pageData,
198
+ config,
199
+ components: {}
200
+ };
201
+ } catch (err) {
202
+ console.error(err);
203
+ return {};
204
+ }
205
+ }
206
+
207
+ // src/index.tsx
118
208
  var WeaverseHydrogenRoot = ({
119
- configs,
209
+ components,
120
210
  data
121
211
  }) => {
122
- let weaverse = useWeaverseHydrogen(configs, data);
212
+ let weaverse = createWeaverseHydrogenContext(data, components);
213
+ useStudio(weaverse);
123
214
  if (!weaverse?.data) {
124
- return /* @__PURE__ */ import_react2.default.createElement("div", null, "404");
215
+ return /* @__PURE__ */ import_react3.default.createElement("div", null, "404");
125
216
  }
126
- return /* @__PURE__ */ import_react2.default.createElement(import_react3.WeaverseRoot, { context: weaverse });
217
+ return /* @__PURE__ */ import_react3.default.createElement(import_react4.WeaverseRoot, { context: weaverse });
127
218
  };
128
219
  // Annotate the CommonJS export names for ESM import in node:
129
220
  0 && (module.exports = {
130
221
  WeaverseHydrogenRoot,
222
+ fetchWithServerCache,
223
+ hashKey,
131
224
  useStudio,
132
- useWeaverseHydrogen,
133
225
  weaverseLoader
134
226
  });
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();
@@ -22,65 +21,159 @@ var useStudio = (weaverseCore) => {
22
21
 
23
22
  // src/index.tsx
24
23
  import React from "react";
25
- import { WeaverseRoot, createRootContext } from "@weaverse/react";
24
+ import { WeaverseRoot } from "@weaverse/react";
26
25
 
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,
26
+ // src/context.ts
27
+ import { createRootContext } from "@weaverse/react";
28
+ var createWeaverseHydrogenContext = ({
29
+ weaverseData: { pageData, config } = {
30
+ pageData: {},
31
+ config: {}
32
+ }
33
+ }, components) => {
34
+ let weaverse = createRootContext({
35
+ ...config,
36
+ data: pageData,
37
+ pageId: pageData?.pageId,
63
38
  isDesignMode: true,
64
39
  platformType: "shopify-hydrogen"
65
40
  });
66
- Object.keys(components).forEach((key) => {
67
- let component = components[key];
41
+ Object.entries(components).forEach(([key, component]) => {
68
42
  weaverse.registerElement({
69
- type: components[key]?.schema?.type || key,
43
+ type: component?.schema?.type || key,
70
44
  Component: component?.default,
71
45
  schema: component?.schema,
72
46
  defaultCss: component?.css,
73
47
  permanentCss: component?.permanentCss
74
48
  });
75
49
  });
76
- useStudio(weaverse);
77
50
  return weaverse;
78
51
  };
52
+
53
+ // src/weaverse-loader.ts
54
+ import {
55
+ CacheShort,
56
+ generateCacheControlHeader
57
+ } from "@shopify/hydrogen";
58
+ function hashKey(queryKey) {
59
+ const rawKeys = Array.isArray(queryKey) ? queryKey : [queryKey];
60
+ let hash = "";
61
+ for (const key of rawKeys) {
62
+ if (key != null) {
63
+ if (typeof key === "object") {
64
+ if (!!key.body && typeof key.body === "string") {
65
+ hash += key.body;
66
+ } else {
67
+ hash += JSON.stringify(key);
68
+ }
69
+ } else {
70
+ hash += key;
71
+ }
72
+ }
73
+ }
74
+ return hash;
75
+ }
76
+ var fetchWithServerCache = async ({
77
+ url,
78
+ options = {},
79
+ storefront,
80
+ waitUntil
81
+ }) => {
82
+ const cacheUrl = new URL(url);
83
+ cacheUrl.pathname = "/cache" + cacheUrl.pathname + hashKey([options.body]);
84
+ const cacheKey = new Request(cacheUrl.toString());
85
+ let response = await storefront.cache.match(cacheKey);
86
+ if (!response) {
87
+ let cacheControl = generateCacheControlHeader({
88
+ ...CacheShort()
89
+ });
90
+ console.log("fetchWithServerCache", cacheControl);
91
+ response = await fetch(url, {
92
+ ...options,
93
+ headers: {
94
+ "cache-control": cacheControl,
95
+ ...options.headers
96
+ }
97
+ });
98
+ waitUntil?.(storefront.cache.put(cacheKey, response.clone()));
99
+ }
100
+ return response;
101
+ };
102
+ async function weaverseLoader({
103
+ request,
104
+ context: { env, storefront, waitUntil },
105
+ context,
106
+ params
107
+ }, components) {
108
+ let projectId = env?.WEAVERSE_PROJECT_ID;
109
+ let weaverseHost = env?.WEAVERSE_HOST;
110
+ if (!projectId || !weaverseHost) {
111
+ console.error("WEAVERSE_PROJECT_ID or WEAVERSE_HOST is not set!");
112
+ return {};
113
+ }
114
+ let config = {
115
+ projectId,
116
+ weaverseHost
117
+ };
118
+ let fetchBody = {
119
+ projectId,
120
+ url: request.url
121
+ };
122
+ try {
123
+ let pageData = await fetchWithServerCache({
124
+ url: `${weaverseHost}/api/public/project`,
125
+ options: {
126
+ method: "POST",
127
+ headers: {
128
+ "Content-Type": "application/json"
129
+ },
130
+ body: JSON.stringify(fetchBody)
131
+ },
132
+ storefront,
133
+ waitUntil
134
+ }).then((r) => r.json()).catch((err) => {
135
+ console.error(err);
136
+ return {};
137
+ });
138
+ if (pageData?.items) {
139
+ let items = pageData.items;
140
+ pageData.items = await Promise.all(
141
+ items.map(async (item) => {
142
+ let loader = components[item.type]?.loader;
143
+ if (loader) {
144
+ return {
145
+ ...item,
146
+ ...await loader({
147
+ data: item,
148
+ context,
149
+ params,
150
+ request,
151
+ config
152
+ })
153
+ };
154
+ }
155
+ return item;
156
+ })
157
+ );
158
+ }
159
+ return {
160
+ pageData,
161
+ config,
162
+ components: {}
163
+ };
164
+ } catch (err) {
165
+ console.error(err);
166
+ return {};
167
+ }
168
+ }
169
+
170
+ // src/index.tsx
79
171
  var WeaverseHydrogenRoot = ({
80
- configs,
172
+ components,
81
173
  data
82
174
  }) => {
83
- let weaverse = useWeaverseHydrogen(configs, data);
175
+ let weaverse = createWeaverseHydrogenContext(data, components);
176
+ useStudio(weaverse);
84
177
  if (!weaverse?.data) {
85
178
  return /* @__PURE__ */ React.createElement("div", null, "404");
86
179
  }
@@ -88,7 +181,8 @@ var WeaverseHydrogenRoot = ({
88
181
  };
89
182
  export {
90
183
  WeaverseHydrogenRoot,
184
+ fetchWithServerCache,
185
+ hashKey,
91
186
  useStudio,
92
- useWeaverseHydrogen,
93
187
  weaverseLoader
94
188
  };
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.0.24",
2
+ "version": "1.0.25",
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.25",
37
+ "@weaverse/react": "1.0.25"
38
+ },
39
+ "devDependencies": {
40
+ "@shopify/remix-oxygen": "^1.0.5"
38
41
  }
39
42
  }