@weaverse/hydrogen 1.0.38 → 1.0.39

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,36 +815,25 @@ 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",
@@ -843,54 +845,53 @@ async function weaverseLoader({
843
845
  url: request.url
844
846
  })
845
847
  },
846
- storefront,
847
- waitUntil
848
+ context
848
849
  }).then((r2) => r2.json()).catch((err) => {
849
- console.log(`\u274C Error fetching page data: ${err?.toString()}`);
850
+ console.log(`\u274C Error fetching project data: ${err?.toString()}`);
850
851
  return {};
851
852
  });
852
- if (pageData?.items) {
853
- let items = pageData.items;
854
- pageData.items = await Promise.all(
853
+ if (page?.items) {
854
+ let items = page.items;
855
+ page.items = await Promise.all(
855
856
  items.map(async (item) => {
856
857
  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
- };
858
+ if (loader && typeof loader === "function") {
859
+ try {
860
+ return {
861
+ ...item,
862
+ loaderData: await loader({
863
+ data: item,
864
+ context,
865
+ params,
866
+ request,
867
+ config: configs
868
+ })
869
+ };
870
+ } catch (err) {
871
+ console.log(
872
+ `\u274C Loader run failed! Item: ${item}: ${err}`
873
+ );
874
+ return item;
875
+ }
868
876
  }
869
877
  return item;
870
878
  })
871
879
  );
872
880
  }
873
- return {
874
- pageData,
875
- config,
876
- components: {}
877
- };
881
+ return { page, configs };
878
882
  } catch (err) {
879
- console.error(err);
880
- return {};
883
+ console.log(`\u274C Error fetching Weaverse data: ${err?.toString()}`);
884
+ return null;
881
885
  }
882
886
  }
883
887
 
884
888
  // src/index.tsx
885
- var WeaverseHydrogenRoot = ({
886
- components,
887
- data
888
- }) => {
889
+ var WeaverseHydrogenRoot = (props) => {
890
+ let { components, data } = props;
889
891
  let weaverse = createWeaverseHydrogenContext(data, components);
890
892
  useStudio(weaverse);
891
- if (!weaverse?.data) {
892
- return /* @__PURE__ */ import_react4.default.createElement("div", null, "404");
893
- }
893
+ if (!weaverse?.data)
894
+ return /* @__PURE__ */ import_react4.default.createElement("div", null, "No Weaverse data!");
894
895
  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
896
  };
896
897
  var StitchesStyle = (0, import_react4.memo)(
@@ -913,8 +914,5 @@ var StitchesStyle = (0, import_react4.memo)(
913
914
  0 && (module.exports = {
914
915
  WeaverseHydrogenRoot,
915
916
  fetchWithServerCache,
916
- getRequestQueries,
917
- hashKey,
918
- useStudio,
919
917
  weaverseLoader
920
918
  });
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,36 +779,25 @@ 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",
@@ -804,54 +809,53 @@ async function weaverseLoader({
804
809
  url: request.url
805
810
  })
806
811
  },
807
- storefront,
808
- waitUntil
812
+ context
809
813
  }).then((r2) => r2.json()).catch((err) => {
810
- console.log(`\u274C Error fetching page data: ${err?.toString()}`);
814
+ console.log(`\u274C Error fetching project data: ${err?.toString()}`);
811
815
  return {};
812
816
  });
813
- if (pageData?.items) {
814
- let items = pageData.items;
815
- pageData.items = await Promise.all(
817
+ if (page?.items) {
818
+ let items = page.items;
819
+ page.items = await Promise.all(
816
820
  items.map(async (item) => {
817
821
  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
- };
822
+ if (loader && typeof loader === "function") {
823
+ try {
824
+ return {
825
+ ...item,
826
+ loaderData: await loader({
827
+ data: item,
828
+ context,
829
+ params,
830
+ request,
831
+ config: configs
832
+ })
833
+ };
834
+ } catch (err) {
835
+ console.log(
836
+ `\u274C Loader run failed! Item: ${item}: ${err}`
837
+ );
838
+ return item;
839
+ }
829
840
  }
830
841
  return item;
831
842
  })
832
843
  );
833
844
  }
834
- return {
835
- pageData,
836
- config,
837
- components: {}
838
- };
845
+ return { page, configs };
839
846
  } catch (err) {
840
- console.error(err);
841
- return {};
847
+ console.log(`\u274C Error fetching Weaverse data: ${err?.toString()}`);
848
+ return null;
842
849
  }
843
850
  }
844
851
 
845
852
  // src/index.tsx
846
- var WeaverseHydrogenRoot = ({
847
- components,
848
- data
849
- }) => {
853
+ var WeaverseHydrogenRoot = (props) => {
854
+ let { components, data } = props;
850
855
  let weaverse = createWeaverseHydrogenContext(data, components);
851
856
  useStudio(weaverse);
852
- if (!weaverse?.data) {
853
- return /* @__PURE__ */ React.createElement("div", null, "404");
854
- }
857
+ if (!weaverse?.data)
858
+ return /* @__PURE__ */ React.createElement("div", null, "No Weaverse data!");
855
859
  return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(WeaverseRoot, { context: weaverse }), weaverse.isDesignMode ? null : /* @__PURE__ */ React.createElement(StitchesStyle, { weaverse }));
856
860
  };
857
861
  var StitchesStyle = memo(
@@ -873,8 +877,5 @@ var StitchesStyle = memo(
873
877
  export {
874
878
  WeaverseHydrogenRoot,
875
879
  fetchWithServerCache,
876
- getRequestQueries,
877
- hashKey,
878
- useStudio,
879
880
  weaverseLoader
880
881
  };
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.0.38",
2
+ "version": "1.0.39",
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.39"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@shopify/remix-oxygen": "^1.0.5"