@weaverse/hydrogen 1.0.23 → 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,20 +1,52 @@
1
- import { Weaverse, WeaverseType, WeaverseElement } from '@weaverse/core';
2
- import { LoaderArgs } from '@remix-run/server-runtime';
1
+ import { Weaverse } from '@weaverse/core';
2
+ import { LoaderArgs } from '@shopify/remix-oxygen';
3
3
 
4
- type WHFetchConfigs = {
5
- weaverseHost?: string;
6
- projectId: string;
7
- url: URL;
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;
8
17
  };
9
- declare let fetchPageData: ({ weaverseHost, projectId, url, }: WHFetchConfigs) => Promise<any>;
18
+ type TODO = any;
19
+
10
20
  declare let useStudio: (weaverseCore: Weaverse) => void;
11
21
 
12
- declare function weaverseLoader({ request, context, params, }: LoaderArgs): Promise<any>;
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 & {
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>;
13
43
 
14
- declare let createHydrogenRootContext: (configs: WeaverseType, elements?: {
15
- [key: string]: WeaverseElement;
16
- }) => Weaverse;
17
- declare let createWeaverseHydrogenContext: (configs: WeaverseType) => Weaverse;
18
- declare let WeaverseHydrogenRoot: () => JSX.Element;
44
+ declare let WeaverseHydrogenRoot: ({ components, data, }: {
45
+ components: WeaverseComponentsType;
46
+ data: {
47
+ [key: string]: any;
48
+ weaverseData: any;
49
+ };
50
+ }) => JSX.Element;
19
51
 
20
- export { WHFetchConfigs, WeaverseHydrogenRoot, createHydrogenRootContext, createWeaverseHydrogenContext, fetchPageData, useStudio, weaverseLoader };
52
+ export { WeaverseComponentLoaderArgs, WeaverseHydrogenRoot, fetchWithServerCache, hashKey, useStudio, weaverseLoader };
package/dist/index.js CHANGED
@@ -31,44 +31,16 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var src_exports = {};
32
32
  __export(src_exports, {
33
33
  WeaverseHydrogenRoot: () => WeaverseHydrogenRoot,
34
- createHydrogenRootContext: () => createHydrogenRootContext,
35
- createWeaverseHydrogenContext: () => createWeaverseHydrogenContext,
36
- fetchPageData: () => fetchPageData,
34
+ fetchWithServerCache: () => fetchWithServerCache,
35
+ hashKey: () => hashKey,
37
36
  useStudio: () => useStudio,
38
37
  weaverseLoader: () => weaverseLoader
39
38
  });
40
39
  module.exports = __toCommonJS(src_exports);
41
40
 
42
- // src/elements/index.ts
43
- var elements = {};
44
- var elements_default = elements;
45
-
46
- // src/index.tsx
47
- var import_core2 = require("@weaverse/core");
48
-
49
41
  // src/utils.ts
50
42
  var import_core = require("@weaverse/core");
51
43
  var import_react = require("react");
52
- var fetchPageData = async ({
53
- weaverseHost = "https://studio.weaverse.io",
54
- projectId,
55
- url
56
- }) => {
57
- let handle = url.pathname;
58
- let isDesignMode = url.searchParams.get("isDesignMode") === "true";
59
- let data = await fetch(weaverseHost + "/api/public/project", {
60
- method: "POST",
61
- body: JSON.stringify({
62
- projectId,
63
- handle,
64
- isDesignMode
65
- })
66
- }).then((res) => res.json()).catch((e) => {
67
- console.error(e);
68
- return {};
69
- });
70
- return { ...data, weaverseHost, isDesignMode };
71
- };
72
44
  var useStudio = (weaverseCore) => {
73
45
  (0, import_react.useEffect)(() => {
74
46
  if (weaverseCore.isDesignMode && import_core.isIframe && !window.weaverseStudioInitialized) {
@@ -88,48 +60,167 @@ var useStudio = (weaverseCore) => {
88
60
  };
89
61
 
90
62
  // src/index.tsx
91
- var import_react2 = __toESM(require("react"));
63
+ var import_react3 = __toESM(require("react"));
64
+ var import_react4 = require("@weaverse/react");
65
+
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,
78
+ isDesignMode: true,
79
+ platformType: "shopify-hydrogen"
80
+ });
81
+ Object.entries(components).forEach(([key, component]) => {
82
+ weaverse.registerElement({
83
+ type: component?.schema?.type || key,
84
+ Component: component?.default,
85
+ schema: component?.schema,
86
+ defaultCss: component?.css,
87
+ permanentCss: component?.permanentCss
88
+ });
89
+ });
90
+ return weaverse;
91
+ };
92
92
 
93
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
+ };
94
139
  async function weaverseLoader({
95
140
  request,
141
+ context: { env, storefront, waitUntil },
96
142
  context,
97
143
  params
98
- }) {
99
- return {
100
- foo: "bar"
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
101
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
+ }
102
205
  }
103
206
 
104
207
  // src/index.tsx
105
- var createHydrogenRootContext = (configs, elements2 = {}) => {
106
- let rootContext = new import_core2.Weaverse(configs);
107
- Object.keys(elements2).forEach((key) => {
108
- rootContext.registerElement(elements2[key]);
109
- });
110
- return rootContext;
111
- };
112
- var createWeaverseHydrogenContext = (configs) => {
113
- let context = createHydrogenRootContext(configs);
114
- Object.keys(elements_default).forEach((key) => {
115
- context.registerElement(elements_default[key]);
116
- });
117
- return context;
118
- };
119
- var WeaverseHydrogenRoot = () => {
120
- let weaverse = createHydrogenRootContext({
121
- isDesignMode: true,
122
- platformType: "shopify-hydrogen"
123
- });
208
+ var WeaverseHydrogenRoot = ({
209
+ components,
210
+ data
211
+ }) => {
212
+ let weaverse = createWeaverseHydrogenContext(data, components);
124
213
  useStudio(weaverse);
125
- return /* @__PURE__ */ import_react2.default.createElement("div", null, /* @__PURE__ */ import_react2.default.createElement("div", { id: "weaverse-test" }, "hello world from weaverse hydrogen"));
214
+ if (!weaverse?.data) {
215
+ return /* @__PURE__ */ import_react3.default.createElement("div", null, "404");
216
+ }
217
+ return /* @__PURE__ */ import_react3.default.createElement(import_react4.WeaverseRoot, { context: weaverse });
126
218
  };
127
219
  // Annotate the CommonJS export names for ESM import in node:
128
220
  0 && (module.exports = {
129
221
  WeaverseHydrogenRoot,
130
- createHydrogenRootContext,
131
- createWeaverseHydrogenContext,
132
- fetchPageData,
222
+ fetchWithServerCache,
223
+ hashKey,
133
224
  useStudio,
134
225
  weaverseLoader
135
226
  });
package/dist/index.mjs CHANGED
@@ -1,33 +1,6 @@
1
- // src/elements/index.ts
2
- var elements = {};
3
- var elements_default = elements;
4
-
5
- // src/index.tsx
6
- import { Weaverse } from "@weaverse/core";
7
-
8
1
  // src/utils.ts
9
2
  import { isIframe, loadScript } from "@weaverse/core";
10
3
  import { useEffect } from "react";
11
- var fetchPageData = async ({
12
- weaverseHost = "https://studio.weaverse.io",
13
- projectId,
14
- url
15
- }) => {
16
- let handle = url.pathname;
17
- let isDesignMode = url.searchParams.get("isDesignMode") === "true";
18
- let data = await fetch(weaverseHost + "/api/public/project", {
19
- method: "POST",
20
- body: JSON.stringify({
21
- projectId,
22
- handle,
23
- isDesignMode
24
- })
25
- }).then((res) => res.json()).catch((e) => {
26
- console.error(e);
27
- return {};
28
- });
29
- return { ...data, weaverseHost, isDesignMode };
30
- };
31
4
  var useStudio = (weaverseCore) => {
32
5
  useEffect(() => {
33
6
  if (weaverseCore.isDesignMode && isIframe && !window.weaverseStudioInitialized) {
@@ -48,46 +21,168 @@ var useStudio = (weaverseCore) => {
48
21
 
49
22
  // src/index.tsx
50
23
  import React from "react";
24
+ import { WeaverseRoot } from "@weaverse/react";
25
+
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,
38
+ isDesignMode: true,
39
+ platformType: "shopify-hydrogen"
40
+ });
41
+ Object.entries(components).forEach(([key, component]) => {
42
+ weaverse.registerElement({
43
+ type: component?.schema?.type || key,
44
+ Component: component?.default,
45
+ schema: component?.schema,
46
+ defaultCss: component?.css,
47
+ permanentCss: component?.permanentCss
48
+ });
49
+ });
50
+ return weaverse;
51
+ };
51
52
 
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
+ };
53
102
  async function weaverseLoader({
54
103
  request,
104
+ context: { env, storefront, waitUntil },
55
105
  context,
56
106
  params
57
- }) {
58
- return {
59
- foo: "bar"
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
60
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
+ }
61
168
  }
62
169
 
63
170
  // src/index.tsx
64
- var createHydrogenRootContext = (configs, elements2 = {}) => {
65
- let rootContext = new Weaverse(configs);
66
- Object.keys(elements2).forEach((key) => {
67
- rootContext.registerElement(elements2[key]);
68
- });
69
- return rootContext;
70
- };
71
- var createWeaverseHydrogenContext = (configs) => {
72
- let context = createHydrogenRootContext(configs);
73
- Object.keys(elements_default).forEach((key) => {
74
- context.registerElement(elements_default[key]);
75
- });
76
- return context;
77
- };
78
- var WeaverseHydrogenRoot = () => {
79
- let weaverse = createHydrogenRootContext({
80
- isDesignMode: true,
81
- platformType: "shopify-hydrogen"
82
- });
171
+ var WeaverseHydrogenRoot = ({
172
+ components,
173
+ data
174
+ }) => {
175
+ let weaverse = createWeaverseHydrogenContext(data, components);
83
176
  useStudio(weaverse);
84
- return /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("div", { id: "weaverse-test" }, "hello world from weaverse hydrogen"));
177
+ if (!weaverse?.data) {
178
+ return /* @__PURE__ */ React.createElement("div", null, "404");
179
+ }
180
+ return /* @__PURE__ */ React.createElement(WeaverseRoot, { context: weaverse });
85
181
  };
86
182
  export {
87
183
  WeaverseHydrogenRoot,
88
- createHydrogenRootContext,
89
- createWeaverseHydrogenContext,
90
- fetchPageData,
184
+ fetchWithServerCache,
185
+ hashKey,
91
186
  useStudio,
92
187
  weaverseLoader
93
188
  };
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.0.23",
2
+ "version": "1.0.25",
3
3
  "license": "MIT",
4
4
  "main": "dist/index.js",
5
5
  "typings": "dist/index.d.ts",
@@ -15,8 +15,8 @@
15
15
  },
16
16
  "scripts": {
17
17
  "start": "npm run dev",
18
- "dev": "tsup src/index.tsx --format esm,cjs --dts --outDir dist --watch --external react @shopify/hydrogen",
19
- "build": "tsup src/index.tsx --format esm,cjs --dts --outDir dist --external react @shopify/hydrogen",
18
+ "dev": "tsup src/index.tsx --format esm,cjs --dts --outDir dist --watch --external react",
19
+ "build": "tsup src/index.tsx --format esm,cjs --dts --outDir dist --external react",
20
20
  "clean": "rimraf dist",
21
21
  "prepublish": "npm run build"
22
22
  },
@@ -32,7 +32,11 @@
32
32
  "name": "@weaverse/hydrogen",
33
33
  "author": "Weaverse Team",
34
34
  "dependencies": {
35
- "@weaverse/core": "1.0.23",
36
- "@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"
37
41
  }
38
42
  }