@weaverse/hydrogen 1.0.38 → 1.0.40

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,10 +1,11 @@
1
- import React from 'react';
2
- import { Weaverse } from '@weaverse/core';
3
- import { LoaderArgs } from '@shopify/remix-oxygen';
1
+ import React, { ForwardRefExoticComponent } from 'react';
2
+ import { ElementSchema, WeaverseElement } from '@weaverse/react';
3
+ import { LoaderArgs, AppLoadContext } from '@shopify/remix-oxygen';
4
4
 
5
5
  /**
6
6
  * Declare local additions to `AppLoadContext` to include the session utilities we injected in `server.ts`.
7
7
  */
8
+ type TODO = any;
8
9
  declare module '@shopify/remix-oxygen' {
9
10
  interface AppLoadContext {
10
11
  waitUntil: ExecutionContext['waitUntil'];
@@ -13,42 +14,54 @@ declare module '@shopify/remix-oxygen' {
13
14
  env: TODO;
14
15
  }
15
16
  }
16
- type WeaverseComponentsType = {
17
- [key: string]: any;
18
- };
19
- type TODO = any;
20
-
21
- declare let useStudio: (weaverseCore: Weaverse) => void;
22
-
23
- type QueryKey = string | readonly unknown[];
24
- declare function hashKey(queryKey: QueryKey): string;
25
- declare let fetchWithServerCache: ({ url, options, storefront, waitUntil, }: {
26
- url: string;
27
- options: RequestInit | Request;
28
- storefront: any;
29
- waitUntil?: any;
30
- }) => Promise<any>;
31
- type WeaverseComponentLoaderArgs = LoaderArgs & {
17
+ type WeaverseLoaderArgs = LoaderArgs & {
32
18
  data: any;
33
19
  config: {
34
20
  projectId: string;
35
21
  weaverseHost: string;
36
22
  };
37
23
  };
38
- declare function getRequestQueries<T = Record<string, string>>(request: Request): T;
39
- declare function weaverseLoader({ request, context: { env, storefront, waitUntil }, context, params, }: LoaderArgs, components: {
40
- [key: string]: {
41
- [key: string]: any;
42
- loader?: (loaderArgs: WeaverseComponentLoaderArgs) => Promise<any>;
43
- };
44
- }): Promise<any>;
24
+ interface HydrogenComponentSchema extends ElementSchema {
25
+ isSection?: boolean;
26
+ }
27
+ interface HydrogenComponentProps<T = unknown> extends WeaverseElement {
28
+ loaderData?: T;
29
+ children?: React.JSX.Element[];
30
+ }
31
+ interface HydrogenComponent<T = HydrogenComponentProps> {
32
+ default: ForwardRefExoticComponent<T>;
33
+ schema: ElementSchema;
34
+ loader?: (args: WeaverseLoaderArgs) => Promise<unknown>;
35
+ }
36
+ type HydrogenPageConfigs = {
37
+ projectId: string;
38
+ weaverseHost: string;
39
+ isDesignMode?: boolean;
40
+ [key: string]: any;
41
+ };
42
+ interface HydrogenPageData {
43
+ page: any;
44
+ configs: HydrogenPageConfigs;
45
+ }
45
46
 
46
- declare let WeaverseHydrogenRoot: ({ components, data, }: {
47
- components: WeaverseComponentsType;
47
+ /**
48
+ * Fetch with server cache requires a storefront.cache instance which is Cloudflare Cache and a waitUntil function, otherwise it will just fetch the url.
49
+ */
50
+ declare let fetchWithServerCache: ({ url, options, context, }: {
51
+ url: string;
52
+ options?: Request | RequestInit | undefined;
53
+ context: AppLoadContext;
54
+ }) => Promise<any>;
55
+
56
+ declare function weaverseLoader(args: LoaderArgs, components: Record<string, HydrogenComponent>): Promise<HydrogenPageData | null>;
57
+
58
+ interface WeaverseHydrogenRootProps {
59
+ components: Record<string, HydrogenComponent>;
48
60
  data: {
61
+ weaverseData: HydrogenPageData;
49
62
  [key: string]: any;
50
- weaverseData: any;
51
63
  };
52
- }) => React.JSX.Element;
64
+ }
65
+ declare let WeaverseHydrogenRoot: (props: WeaverseHydrogenRootProps) => React.JSX.Element;
53
66
 
54
- export { WeaverseComponentLoaderArgs, WeaverseHydrogenRoot, fetchWithServerCache, getRequestQueries, hashKey, useStudio, weaverseLoader };
67
+ export { HydrogenComponent, HydrogenComponentProps, HydrogenComponentSchema, HydrogenPageConfigs, HydrogenPageData, TODO, WeaverseHydrogenRoot, WeaverseLoaderArgs, fetchWithServerCache, weaverseLoader };
package/dist/index.js CHANGED
@@ -32,9 +32,6 @@ var src_exports = {};
32
32
  __export(src_exports, {
33
33
  WeaverseHydrogenRoot: () => WeaverseHydrogenRoot,
34
34
  fetchWithServerCache: () => fetchWithServerCache,
35
- getRequestQueries: () => getRequestQueries,
36
- hashKey: () => hashKey,
37
- useStudio: () => useStudio,
38
35
  weaverseLoader: () => weaverseLoader
39
36
  });
40
37
  module.exports = __toCommonJS(src_exports);
@@ -43,7 +40,7 @@ var import_react4 = __toESM(require("react"));
43
40
 
44
41
  // src/context.ts
45
42
  var import_react = require("@weaverse/react");
46
- var createCachedWeaverseContext = (init) => {
43
+ function createCachedContext(init) {
47
44
  if (import_react.isBrowser && init.pageId) {
48
45
  window.__weaverses = window.__weaverses || {};
49
46
  if (!window.__weaverses[init.pageId]) {
@@ -52,26 +49,25 @@ var createCachedWeaverseContext = (init) => {
52
49
  return window.__weaverses[init.pageId];
53
50
  }
54
51
  return (0, import_react.createRootContext)(init);
55
- };
56
- var createWeaverseHydrogenContext = ({ weaverseData }, components) => {
57
- let { pageData = {}, config = {} } = weaverseData || {};
58
- let weaverse = createCachedWeaverseContext({
59
- ...config,
60
- data: pageData,
61
- pageId: pageData?.id,
52
+ }
53
+ function createWeaverseHydrogenContext({ weaverseData }, components) {
54
+ let { page = {}, configs = {} } = weaverseData || {};
55
+ let weaverse = createCachedContext({
56
+ ...configs,
57
+ data: page,
58
+ pageId: page?.id,
62
59
  platformType: "shopify-hydrogen"
63
60
  });
64
61
  Object.entries(components).forEach(([key, component]) => {
65
62
  weaverse.registerElement({
66
63
  type: component?.schema?.type || key,
67
64
  Component: component?.default,
68
- schema: component?.schema,
69
- defaultCss: component?.css,
70
- permanentCss: component?.permanentCss
65
+ schema: component?.schema
66
+ // defaultCss: component?.css,
71
67
  });
72
68
  });
73
69
  return weaverse;
74
- };
70
+ }
75
71
 
76
72
  // ../../node_modules/@stitches/core/dist/index.mjs
77
73
  var t = "colors";
@@ -736,9 +732,9 @@ var Weaverse = class {
736
732
  };
737
733
  Weaverse.WeaverseItemStore = WeaverseItemStore;
738
734
 
739
- // src/utils.ts
735
+ // src/hooks/use-studio.ts
740
736
  var import_react2 = require("react");
741
- var useStudio = (weaverseCore) => {
737
+ function useStudio(weaverseCore) {
742
738
  (0, import_react2.useEffect)(() => {
743
739
  if (weaverseCore.isDesignMode && isIframe && !window.weaverseStudioInitialized) {
744
740
  window.weaverseStudioInitialized = true;
@@ -753,14 +749,16 @@ var useStudio = (weaverseCore) => {
753
749
  }
754
750
  );
755
751
  }
756
- setTimeout(() => {
752
+ window.requestAnimationFrame(() => {
757
753
  window.__weaverse = weaverseCore;
758
- }, 1);
754
+ });
759
755
  }, []);
760
- };
756
+ }
761
757
 
762
- // src/weaverse-loader.ts
758
+ // src/fetch.ts
763
759
  var import_hydrogen = require("@shopify/hydrogen");
760
+
761
+ // src/utils.ts
764
762
  function hashKey(queryKey) {
765
763
  const rawKeys = Array.isArray(queryKey) ? queryKey : [queryKey];
766
764
  let hash = "";
@@ -779,16 +777,31 @@ function hashKey(queryKey) {
779
777
  }
780
778
  return hash;
781
779
  }
780
+ function getRequestQueries(request) {
781
+ let url = new URL(request.url);
782
+ return Array.from(url.searchParams.entries()).reduce(
783
+ (q, [k2, v2]) => {
784
+ q[k2] = v2 === "true" ? true : v2 === "false" ? false : v2;
785
+ return q;
786
+ },
787
+ {}
788
+ );
789
+ }
790
+
791
+ // src/fetch.ts
782
792
  var cacheControl = (0, import_hydrogen.generateCacheControlHeader)((0, import_hydrogen.CacheShort)());
783
793
  var fetchWithServerCache = async ({
784
794
  url,
785
795
  options = {},
786
- storefront,
787
- waitUntil
796
+ context
788
797
  }) => {
789
- const cacheUrl = new URL(url);
798
+ let { storefront, waitUntil } = context;
799
+ if (!storefront?.cache || !waitUntil) {
800
+ return fetch(url, options);
801
+ }
802
+ let cacheUrl = new URL(url);
790
803
  cacheUrl.pathname = "/cache" + cacheUrl.pathname + hashKey([options.body]);
791
- const cacheKey = new Request(cacheUrl.toString());
804
+ let cacheKey = new Request(cacheUrl.toString());
792
805
  let response = await storefront.cache.match(cacheKey);
793
806
  if (!response) {
794
807
  response = await fetch(url, {
@@ -802,95 +815,78 @@ var fetchWithServerCache = async ({
802
815
  }
803
816
  return response;
804
817
  };
805
- function getRequestQueries(request) {
806
- let url = new URL(request.url);
807
- return Array.from(url.searchParams.entries()).reduce(
808
- (q, [k2, v2]) => {
809
- q[k2] = v2 === "true" ? true : v2 === "false" ? false : v2;
810
- return q;
811
- },
812
- {}
813
- );
814
- }
815
- async function weaverseLoader({
816
- request,
817
- context: { env, storefront, waitUntil },
818
- context,
819
- params
820
- }, components) {
818
+
819
+ // src/loader.ts
820
+ async function weaverseLoader(args, components) {
821
+ let { request, context, params } = args;
822
+ let { env } = context;
821
823
  let queries = getRequestQueries(request);
822
824
  let projectId = env?.WEAVERSE_PROJECT_ID;
823
825
  let weaverseHost = env?.WEAVERSE_HOST;
824
826
  if (!projectId || !weaverseHost) {
825
- console.error("WEAVERSE_PROJECT_ID or WEAVERSE_HOST is not set!");
826
- return {};
827
+ console.log("\u274C Missing `WEAVERSE_PROJECT_ID` or `WEAVERSE_HOST`!");
828
+ return null;
827
829
  }
828
- let config = {
830
+ let configs = {
829
831
  projectId,
830
832
  weaverseHost,
831
833
  ...queries
832
834
  };
833
835
  try {
834
- let pageData = await fetchWithServerCache({
836
+ let page = await fetchWithServerCache({
835
837
  url: `${weaverseHost}/api/public/project`,
836
838
  options: {
837
839
  method: "POST",
838
- headers: {
839
- "Content-Type": "application/json"
840
- },
841
840
  body: JSON.stringify({
842
841
  projectId,
843
842
  url: request.url
844
843
  })
845
844
  },
846
- storefront,
847
- waitUntil
845
+ context
848
846
  }).then((r2) => r2.json()).catch((err) => {
849
- console.log(`\u274C Error fetching page data: ${err?.toString()}`);
847
+ console.log(`\u274C Error fetching project data: ${err?.toString()}`);
850
848
  return {};
851
849
  });
852
- if (pageData?.items) {
853
- let items = pageData.items;
854
- pageData.items = await Promise.all(
850
+ if (page?.items) {
851
+ let items = page.items;
852
+ page.items = await Promise.all(
855
853
  items.map(async (item) => {
856
854
  let loader = components[item.type]?.loader;
857
- if (loader) {
858
- return {
859
- ...item,
860
- ...await loader({
861
- data: item,
862
- context,
863
- params,
864
- request,
865
- config
866
- })
867
- };
855
+ if (loader && typeof loader === "function") {
856
+ try {
857
+ return {
858
+ ...item,
859
+ loaderData: await loader({
860
+ data: item,
861
+ context,
862
+ params,
863
+ request,
864
+ config: configs
865
+ })
866
+ };
867
+ } catch (err) {
868
+ console.log(`\u274C Loader run failed! Item: ${item}: ${err}`);
869
+ return item;
870
+ }
868
871
  }
869
872
  return item;
870
873
  })
871
874
  );
872
875
  }
873
- return {
874
- pageData,
875
- config,
876
- components: {}
877
- };
876
+ return { page, configs };
878
877
  } catch (err) {
879
- console.error(err);
880
- return {};
878
+ console.log(`\u274C Error fetching Weaverse data: ${err?.toString()}`);
879
+ return null;
881
880
  }
882
881
  }
883
882
 
884
883
  // src/index.tsx
885
- var WeaverseHydrogenRoot = ({
886
- components,
887
- data
888
- }) => {
884
+ var WeaverseHydrogenRoot = (props) => {
885
+ let { components, data } = props;
889
886
  let weaverse = createWeaverseHydrogenContext(data, components);
890
887
  useStudio(weaverse);
891
- if (!weaverse?.data) {
892
- return /* @__PURE__ */ import_react4.default.createElement("div", null, "404");
893
- }
888
+ if (!weaverse?.data)
889
+ return /* @__PURE__ */ import_react4.default.createElement("div", null, "No Weaverse data!");
894
890
  return /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, null, /* @__PURE__ */ import_react4.default.createElement(import_react3.WeaverseRoot, { context: weaverse }), weaverse.isDesignMode ? null : /* @__PURE__ */ import_react4.default.createElement(StitchesStyle, { weaverse }));
895
891
  };
896
892
  var StitchesStyle = (0, import_react4.memo)(
@@ -913,8 +909,5 @@ var StitchesStyle = (0, import_react4.memo)(
913
909
  0 && (module.exports = {
914
910
  WeaverseHydrogenRoot,
915
911
  fetchWithServerCache,
916
- getRequestQueries,
917
- hashKey,
918
- useStudio,
919
912
  weaverseLoader
920
913
  });
package/dist/index.mjs CHANGED
@@ -4,7 +4,7 @@ import React, { memo } from "react";
4
4
 
5
5
  // src/context.ts
6
6
  import { createRootContext, isBrowser } from "@weaverse/react";
7
- var createCachedWeaverseContext = (init) => {
7
+ function createCachedContext(init) {
8
8
  if (isBrowser && init.pageId) {
9
9
  window.__weaverses = window.__weaverses || {};
10
10
  if (!window.__weaverses[init.pageId]) {
@@ -13,26 +13,25 @@ var createCachedWeaverseContext = (init) => {
13
13
  return window.__weaverses[init.pageId];
14
14
  }
15
15
  return createRootContext(init);
16
- };
17
- var createWeaverseHydrogenContext = ({ weaverseData }, components) => {
18
- let { pageData = {}, config = {} } = weaverseData || {};
19
- let weaverse = createCachedWeaverseContext({
20
- ...config,
21
- data: pageData,
22
- pageId: pageData?.id,
16
+ }
17
+ function createWeaverseHydrogenContext({ weaverseData }, components) {
18
+ let { page = {}, configs = {} } = weaverseData || {};
19
+ let weaverse = createCachedContext({
20
+ ...configs,
21
+ data: page,
22
+ pageId: page?.id,
23
23
  platformType: "shopify-hydrogen"
24
24
  });
25
25
  Object.entries(components).forEach(([key, component]) => {
26
26
  weaverse.registerElement({
27
27
  type: component?.schema?.type || key,
28
28
  Component: component?.default,
29
- schema: component?.schema,
30
- defaultCss: component?.css,
31
- permanentCss: component?.permanentCss
29
+ schema: component?.schema
30
+ // defaultCss: component?.css,
32
31
  });
33
32
  });
34
33
  return weaverse;
35
- };
34
+ }
36
35
 
37
36
  // ../../node_modules/@stitches/core/dist/index.mjs
38
37
  var t = "colors";
@@ -697,9 +696,9 @@ var Weaverse = class {
697
696
  };
698
697
  Weaverse.WeaverseItemStore = WeaverseItemStore;
699
698
 
700
- // src/utils.ts
699
+ // src/hooks/use-studio.ts
701
700
  import { useEffect } from "react";
702
- var useStudio = (weaverseCore) => {
701
+ function useStudio(weaverseCore) {
703
702
  useEffect(() => {
704
703
  if (weaverseCore.isDesignMode && isIframe && !window.weaverseStudioInitialized) {
705
704
  window.weaverseStudioInitialized = true;
@@ -714,14 +713,16 @@ var useStudio = (weaverseCore) => {
714
713
  }
715
714
  );
716
715
  }
717
- setTimeout(() => {
716
+ window.requestAnimationFrame(() => {
718
717
  window.__weaverse = weaverseCore;
719
- }, 1);
718
+ });
720
719
  }, []);
721
- };
720
+ }
722
721
 
723
- // src/weaverse-loader.ts
722
+ // src/fetch.ts
724
723
  import { CacheShort, generateCacheControlHeader } from "@shopify/hydrogen";
724
+
725
+ // src/utils.ts
725
726
  function hashKey(queryKey) {
726
727
  const rawKeys = Array.isArray(queryKey) ? queryKey : [queryKey];
727
728
  let hash = "";
@@ -740,16 +741,31 @@ function hashKey(queryKey) {
740
741
  }
741
742
  return hash;
742
743
  }
744
+ function getRequestQueries(request) {
745
+ let url = new URL(request.url);
746
+ return Array.from(url.searchParams.entries()).reduce(
747
+ (q, [k2, v2]) => {
748
+ q[k2] = v2 === "true" ? true : v2 === "false" ? false : v2;
749
+ return q;
750
+ },
751
+ {}
752
+ );
753
+ }
754
+
755
+ // src/fetch.ts
743
756
  var cacheControl = generateCacheControlHeader(CacheShort());
744
757
  var fetchWithServerCache = async ({
745
758
  url,
746
759
  options = {},
747
- storefront,
748
- waitUntil
760
+ context
749
761
  }) => {
750
- const cacheUrl = new URL(url);
762
+ let { storefront, waitUntil } = context;
763
+ if (!storefront?.cache || !waitUntil) {
764
+ return fetch(url, options);
765
+ }
766
+ let cacheUrl = new URL(url);
751
767
  cacheUrl.pathname = "/cache" + cacheUrl.pathname + hashKey([options.body]);
752
- const cacheKey = new Request(cacheUrl.toString());
768
+ let cacheKey = new Request(cacheUrl.toString());
753
769
  let response = await storefront.cache.match(cacheKey);
754
770
  if (!response) {
755
771
  response = await fetch(url, {
@@ -763,95 +779,78 @@ var fetchWithServerCache = async ({
763
779
  }
764
780
  return response;
765
781
  };
766
- function getRequestQueries(request) {
767
- let url = new URL(request.url);
768
- return Array.from(url.searchParams.entries()).reduce(
769
- (q, [k2, v2]) => {
770
- q[k2] = v2 === "true" ? true : v2 === "false" ? false : v2;
771
- return q;
772
- },
773
- {}
774
- );
775
- }
776
- async function weaverseLoader({
777
- request,
778
- context: { env, storefront, waitUntil },
779
- context,
780
- params
781
- }, components) {
782
+
783
+ // src/loader.ts
784
+ async function weaverseLoader(args, components) {
785
+ let { request, context, params } = args;
786
+ let { env } = context;
782
787
  let queries = getRequestQueries(request);
783
788
  let projectId = env?.WEAVERSE_PROJECT_ID;
784
789
  let weaverseHost = env?.WEAVERSE_HOST;
785
790
  if (!projectId || !weaverseHost) {
786
- console.error("WEAVERSE_PROJECT_ID or WEAVERSE_HOST is not set!");
787
- return {};
791
+ console.log("\u274C Missing `WEAVERSE_PROJECT_ID` or `WEAVERSE_HOST`!");
792
+ return null;
788
793
  }
789
- let config = {
794
+ let configs = {
790
795
  projectId,
791
796
  weaverseHost,
792
797
  ...queries
793
798
  };
794
799
  try {
795
- let pageData = await fetchWithServerCache({
800
+ let page = await fetchWithServerCache({
796
801
  url: `${weaverseHost}/api/public/project`,
797
802
  options: {
798
803
  method: "POST",
799
- headers: {
800
- "Content-Type": "application/json"
801
- },
802
804
  body: JSON.stringify({
803
805
  projectId,
804
806
  url: request.url
805
807
  })
806
808
  },
807
- storefront,
808
- waitUntil
809
+ context
809
810
  }).then((r2) => r2.json()).catch((err) => {
810
- console.log(`\u274C Error fetching page data: ${err?.toString()}`);
811
+ console.log(`\u274C Error fetching project data: ${err?.toString()}`);
811
812
  return {};
812
813
  });
813
- if (pageData?.items) {
814
- let items = pageData.items;
815
- pageData.items = await Promise.all(
814
+ if (page?.items) {
815
+ let items = page.items;
816
+ page.items = await Promise.all(
816
817
  items.map(async (item) => {
817
818
  let loader = components[item.type]?.loader;
818
- if (loader) {
819
- return {
820
- ...item,
821
- ...await loader({
822
- data: item,
823
- context,
824
- params,
825
- request,
826
- config
827
- })
828
- };
819
+ if (loader && typeof loader === "function") {
820
+ try {
821
+ return {
822
+ ...item,
823
+ loaderData: await loader({
824
+ data: item,
825
+ context,
826
+ params,
827
+ request,
828
+ config: configs
829
+ })
830
+ };
831
+ } catch (err) {
832
+ console.log(`\u274C Loader run failed! Item: ${item}: ${err}`);
833
+ return item;
834
+ }
829
835
  }
830
836
  return item;
831
837
  })
832
838
  );
833
839
  }
834
- return {
835
- pageData,
836
- config,
837
- components: {}
838
- };
840
+ return { page, configs };
839
841
  } catch (err) {
840
- console.error(err);
841
- return {};
842
+ console.log(`\u274C Error fetching Weaverse data: ${err?.toString()}`);
843
+ return null;
842
844
  }
843
845
  }
844
846
 
845
847
  // src/index.tsx
846
- var WeaverseHydrogenRoot = ({
847
- components,
848
- data
849
- }) => {
848
+ var WeaverseHydrogenRoot = (props) => {
849
+ let { components, data } = props;
850
850
  let weaverse = createWeaverseHydrogenContext(data, components);
851
851
  useStudio(weaverse);
852
- if (!weaverse?.data) {
853
- return /* @__PURE__ */ React.createElement("div", null, "404");
854
- }
852
+ if (!weaverse?.data)
853
+ return /* @__PURE__ */ React.createElement("div", null, "No Weaverse data!");
855
854
  return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(WeaverseRoot, { context: weaverse }), weaverse.isDesignMode ? null : /* @__PURE__ */ React.createElement(StitchesStyle, { weaverse }));
856
855
  };
857
856
  var StitchesStyle = memo(
@@ -873,8 +872,5 @@ var StitchesStyle = memo(
873
872
  export {
874
873
  WeaverseHydrogenRoot,
875
874
  fetchWithServerCache,
876
- getRequestQueries,
877
- hashKey,
878
- useStudio,
879
875
  weaverseLoader
880
876
  };
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.0.38",
2
+ "version": "1.0.40",
3
3
  "license": "MIT",
4
4
  "main": "dist/index.js",
5
5
  "typings": "dist/index.d.ts",
@@ -33,7 +33,7 @@
33
33
  "author": "Weaverse Team",
34
34
  "dependencies": {
35
35
  "@shopify/hydrogen": "2023.4.0",
36
- "@weaverse/react": "1.0.38"
36
+ "@weaverse/react": "1.0.40"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@shopify/remix-oxygen": "^1.0.5"