@makeswift/runtime 0.1.2 → 0.1.5

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.
Files changed (140) hide show
  1. package/dist/Box.cjs.js +1 -0
  2. package/dist/Box.cjs.js.map +1 -1
  3. package/dist/Box.es.js +1 -0
  4. package/dist/Box.es.js.map +1 -1
  5. package/dist/Box2.cjs.js +54 -0
  6. package/dist/Box2.cjs.js.map +1 -0
  7. package/dist/Box2.es.js +52 -0
  8. package/dist/Box2.es.js.map +1 -0
  9. package/dist/Button.cjs.js +1 -1
  10. package/dist/Button.es.js +2 -2
  11. package/dist/Carousel.cjs.js +1 -1
  12. package/dist/Carousel.es.js +2 -2
  13. package/dist/Countdown.cjs.js +1 -0
  14. package/dist/Countdown.cjs.js.map +1 -1
  15. package/dist/Countdown.es.js +2 -1
  16. package/dist/Countdown.es.js.map +1 -1
  17. package/dist/Divider.cjs.js +1 -0
  18. package/dist/Divider.cjs.js.map +1 -1
  19. package/dist/Divider.es.js +2 -1
  20. package/dist/Divider.es.js.map +1 -1
  21. package/dist/Embed.cjs.js +1 -0
  22. package/dist/Embed.cjs.js.map +1 -1
  23. package/dist/Embed.es.js +2 -1
  24. package/dist/Embed.es.js.map +1 -1
  25. package/dist/Form.cjs.js +1 -1
  26. package/dist/Form.es.js +2 -2
  27. package/dist/Image.cjs2.js +1 -1
  28. package/dist/Image.es2.js +2 -2
  29. package/dist/Navigation.cjs.js +1 -1
  30. package/dist/Navigation.es.js +2 -2
  31. package/dist/Root.cjs.js +1 -0
  32. package/dist/Root.cjs.js.map +1 -1
  33. package/dist/Root.es.js +1 -0
  34. package/dist/Root.es.js.map +1 -1
  35. package/dist/SocialLinks.es.js +1 -1
  36. package/dist/Text.cjs.js +1 -1
  37. package/dist/Text.es.js +2 -2
  38. package/dist/Video.cjs.js +1 -0
  39. package/dist/Video.cjs.js.map +1 -1
  40. package/dist/Video.es.js +1 -0
  41. package/dist/Video.es.js.map +1 -1
  42. package/dist/components.cjs.js +4 -4
  43. package/dist/components.es.js +4 -4
  44. package/dist/controls.cjs.js +2 -0
  45. package/dist/controls.cjs.js.map +1 -1
  46. package/dist/controls.es.js +1 -1
  47. package/dist/cssMediaRules.es.js +1 -1
  48. package/dist/descriptors.cjs.js.map +1 -1
  49. package/dist/descriptors.es.js.map +1 -1
  50. package/dist/grid-item.cjs.js +594 -0
  51. package/dist/grid-item.cjs.js.map +1 -0
  52. package/dist/grid-item.es.js +585 -0
  53. package/dist/grid-item.es.js.map +1 -0
  54. package/dist/index.cjs.js +128 -10
  55. package/dist/index.cjs.js.map +1 -1
  56. package/dist/index.cjs3.js +1 -12
  57. package/dist/index.cjs3.js.map +1 -1
  58. package/dist/index.es.js +129 -12
  59. package/dist/index.es.js.map +1 -1
  60. package/dist/index.es2.js +1 -1
  61. package/dist/index.es3.js +2 -12
  62. package/dist/index.es3.js.map +1 -1
  63. package/dist/next.cjs.js +1 -0
  64. package/dist/next.cjs.js.map +1 -1
  65. package/dist/next.es.js +1 -0
  66. package/dist/next.es.js.map +1 -1
  67. package/dist/react-builder-preview.cjs.js +1 -0
  68. package/dist/react-builder-preview.cjs.js.map +1 -1
  69. package/dist/react-builder-preview.es.js +1 -0
  70. package/dist/react-builder-preview.es.js.map +1 -1
  71. package/dist/react.cjs.js +1 -0
  72. package/dist/react.cjs.js.map +1 -1
  73. package/dist/react.es.js +1 -0
  74. package/dist/react.es.js.map +1 -1
  75. package/dist/slot.cjs.js +130 -0
  76. package/dist/slot.cjs.js.map +1 -0
  77. package/dist/slot.es.js +123 -0
  78. package/dist/slot.es.js.map +1 -0
  79. package/dist/text-input.cjs.js +6 -0
  80. package/dist/text-input.cjs.js.map +1 -1
  81. package/dist/text-input.es.js +5 -1
  82. package/dist/text-input.es.js.map +1 -1
  83. package/dist/types/api/react.d.ts.map +1 -1
  84. package/dist/types/components/builtin/Box/Box2.d.ts +8 -0
  85. package/dist/types/components/builtin/Box/Box2.d.ts.map +1 -0
  86. package/dist/types/components/experimental/box-placeholder.d.ts +2 -0
  87. package/dist/types/components/experimental/box-placeholder.d.ts.map +1 -0
  88. package/dist/types/components/experimental/box.d.ts +9 -0
  89. package/dist/types/components/experimental/box.d.ts.map +1 -0
  90. package/dist/types/components/experimental/index.d.ts +2 -0
  91. package/dist/types/components/experimental/index.d.ts.map +1 -0
  92. package/dist/types/components/hooks/useTable.d.ts +66 -0
  93. package/dist/types/components/hooks/useTable.d.ts.map +1 -0
  94. package/dist/types/components/shared/grid-item.d.ts +17 -0
  95. package/dist/types/components/shared/grid-item.d.ts.map +1 -0
  96. package/dist/types/controls/control.d.ts +3 -2
  97. package/dist/types/controls/control.d.ts.map +1 -1
  98. package/dist/types/controls/index.d.ts +1 -0
  99. package/dist/types/controls/index.d.ts.map +1 -1
  100. package/dist/types/controls/link.d.ts +50 -0
  101. package/dist/types/controls/link.d.ts.map +1 -0
  102. package/dist/types/controls/slot.d.ts +42 -0
  103. package/dist/types/controls/slot.d.ts.map +1 -0
  104. package/dist/types/css/border-radius.d.ts +20 -0
  105. package/dist/types/css/border-radius.d.ts.map +1 -0
  106. package/dist/types/css/border.d.ts +31 -0
  107. package/dist/types/css/border.d.ts.map +1 -0
  108. package/dist/types/css/box-shadow.d.ts +19 -0
  109. package/dist/types/css/box-shadow.d.ts.map +1 -0
  110. package/dist/types/css/color.d.ts +5 -0
  111. package/dist/types/css/color.d.ts.map +1 -0
  112. package/dist/types/css/length-percentage.d.ts +10 -0
  113. package/dist/types/css/length-percentage.d.ts.map +1 -0
  114. package/dist/types/css/length.d.ts +14 -0
  115. package/dist/types/css/length.d.ts.map +1 -0
  116. package/dist/types/css/margin.d.ts +20 -0
  117. package/dist/types/css/margin.d.ts.map +1 -0
  118. package/dist/types/css/padding.d.ts +20 -0
  119. package/dist/types/css/padding.d.ts.map +1 -0
  120. package/dist/types/next.d.ts.map +1 -1
  121. package/dist/types/prop-controllers/descriptors.d.ts +4 -3
  122. package/dist/types/prop-controllers/descriptors.d.ts.map +1 -1
  123. package/dist/types/runtimes/react/controls/control.d.ts +3 -2
  124. package/dist/types/runtimes/react/controls/control.d.ts.map +1 -1
  125. package/dist/types/runtimes/react/controls/link.d.ts +11 -0
  126. package/dist/types/runtimes/react/controls/link.d.ts.map +1 -0
  127. package/dist/types/runtimes/react/controls/slot.d.ts +26 -0
  128. package/dist/types/runtimes/react/controls/slot.d.ts.map +1 -0
  129. package/dist/types/runtimes/react/controls.d.ts.map +1 -1
  130. package/dist/types/runtimes/react/use-style.d.ts +3 -0
  131. package/dist/types/runtimes/react/use-style.d.ts.map +1 -0
  132. package/dist/types/use-global-style.d.ts +3 -0
  133. package/dist/types/use-global-style.d.ts.map +1 -0
  134. package/dist/types/use-grid-item-style.d.ts +1 -0
  135. package/dist/types/use-grid-item-style.d.ts.map +1 -0
  136. package/dist/types/use-style.d.ts +3 -0
  137. package/dist/types/use-style.d.ts.map +1 -0
  138. package/dist/useBoxShadow.es.js +1 -1
  139. package/dist/useMediaQuery.es.js +1 -1
  140. package/package.json +1 -1
package/dist/index.cjs.js CHANGED
@@ -57,6 +57,7 @@ var shape = require("./shape.cjs.js");
57
57
  var image = require("./image.cjs.js");
58
58
  var style = require("./style.cjs.js");
59
59
  var ColorHelper = require("color");
60
+ var scrollIntoView = require("scroll-into-view-if-needed");
60
61
  var reactDom = require("react-dom");
61
62
  var parse = require("html-react-parser");
62
63
  var Head = require("next/head");
@@ -91,6 +92,7 @@ var NextDocument__default = /* @__PURE__ */ _interopDefaultLegacy(NextDocument);
91
92
  var styled__default = /* @__PURE__ */ _interopDefaultLegacy(styled);
92
93
  var createEmotionServer__default = /* @__PURE__ */ _interopDefaultLegacy(createEmotionServer);
93
94
  var ColorHelper__default = /* @__PURE__ */ _interopDefaultLegacy(ColorHelper);
95
+ var scrollIntoView__default = /* @__PURE__ */ _interopDefaultLegacy(scrollIntoView);
94
96
  var parse__default = /* @__PURE__ */ _interopDefaultLegacy(parse);
95
97
  var Head__default = /* @__PURE__ */ _interopDefaultLegacy(Head);
96
98
  var uuid__default = /* @__PURE__ */ _interopDefaultLegacy(uuid);
@@ -480,6 +482,8 @@ class MakeswiftClient {
480
482
  variables: introspectionData
481
483
  });
482
484
  res.data.pagePathnamesById.forEach((pagePathnameSlice) => {
485
+ if (pagePathnameSlice == null)
486
+ return;
483
487
  const id = Buffer.from(`Page:${pagePathnameSlice.id}`).toString("base64");
484
488
  this.apolloClient.cache.writeFragment({
485
489
  fragment: graphql.PagePathnameSliceFragmentDoc,
@@ -869,29 +873,57 @@ class Document$1 extends NextDocument__default["default"] {
869
873
  }
870
874
  }
871
875
  const REVALIDATE_SECONDS = 1;
876
+ function getApiOrigin() {
877
+ var _a;
878
+ const apiOriginString = (_a = process["env"].MAKESWIFT_API_HOST) != null ? _a : "https://api.makeswift.com";
879
+ try {
880
+ const url = new URL(apiOriginString);
881
+ return url.origin;
882
+ } catch (error) {
883
+ const errorMessage = `"MAKESWIFT_API_HOST" environment variable must be a valid URL. Expected something like "https://api.makeswift.com" but instead received "${apiOriginString}".`;
884
+ throw new Error(errorMessage);
885
+ }
886
+ }
887
+ const uuidRegExp = /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/;
888
+ function getApiKey() {
889
+ const apiKey = process["env"].MAKESWIFT_SITE_API_KEY;
890
+ if (apiKey == null) {
891
+ const errorMessage = '"MAKESWIFT_SITE_API_KEY" environment variable must be set. Please add your site API key to your `.env.local` file. More info: https://www.makeswift.com/docs/guides/manual-setup#add-environment-variables';
892
+ throw new Error(errorMessage);
893
+ }
894
+ if (!uuidRegExp.test(apiKey)) {
895
+ const errorMEssage = `Invalid Makeswift site API key "${apiKey}". Please check your \`.env.local\` file for the "MAKESWIFT_SITE_API_KEY" environment variable. More info: https://www.makeswift.com/docs/guides/manual-setup#add-environment-variables`;
896
+ throw new Error(errorMEssage);
897
+ }
898
+ return apiKey;
899
+ }
872
900
  async function getServerSideProps({
873
901
  query: {
874
902
  pageId
875
903
  }
876
904
  }) {
877
- const url = `${process["env"].MAKESWIFT_API_HOST}/v0/preview-page-data?id=${pageId}`;
905
+ const url = `${getApiOrigin()}/v0/preview-page-data?id=${pageId}`;
878
906
  const res = await fetch(url, {
879
907
  headers: {
880
- "x-api-key": process["env"].MAKESWIFT_SITE_API_KEY
908
+ "x-api-key": getApiKey()
881
909
  }
882
910
  });
883
- if (res.status !== 200) {
911
+ if (res.status === 404) {
884
912
  console.error(await res.json());
885
913
  return {
886
914
  notFound: true
887
915
  };
888
916
  }
917
+ if (!res.ok) {
918
+ const json = await res.json();
919
+ throw new Error(json.message);
920
+ }
889
921
  const page = await res.json();
890
922
  if (page == null)
891
923
  return {
892
924
  notFound: true
893
925
  };
894
- const makeswiftApiEndpoint = `${process["env"].MAKESWIFT_API_HOST}/graphql`;
926
+ const makeswiftApiEndpoint = `${getApiOrigin()}/graphql`;
895
927
  const client2 = new MakeswiftClient({
896
928
  uri: makeswiftApiEndpoint
897
929
  });
@@ -917,26 +949,30 @@ async function getStaticProps({
917
949
  const {
918
950
  path = []
919
951
  } = params;
920
- const url = `${process["env"].MAKESWIFT_API_HOST}/v0/live-page-data?path=${path.join("/")}`;
952
+ const url = `${getApiOrigin()}/v0/live-page-data?path=${path.join("/")}`;
921
953
  const res = await fetch(url, {
922
954
  headers: {
923
- "x-api-key": process["env"].MAKESWIFT_SITE_API_KEY
955
+ "x-api-key": getApiKey()
924
956
  }
925
957
  });
926
- if (res.status !== 200) {
958
+ if (res.status === 404) {
927
959
  console.error(await res.json());
928
960
  return {
929
961
  notFound: true,
930
962
  revalidate: REVALIDATE_SECONDS
931
963
  };
932
964
  }
965
+ if (!res.ok) {
966
+ const json = await res.json();
967
+ throw new Error(json.message);
968
+ }
933
969
  const page = await res.json();
934
970
  if (page == null)
935
971
  return {
936
972
  notFound: true,
937
973
  revalidate: REVALIDATE_SECONDS
938
974
  };
939
- const makeswiftApiEndpoint = `${process["env"].MAKESWIFT_API_HOST}/graphql`;
975
+ const makeswiftApiEndpoint = `${getApiOrigin()}/graphql`;
940
976
  const client2 = new MakeswiftClient({
941
977
  uri: makeswiftApiEndpoint
942
978
  });
@@ -2158,6 +2194,16 @@ function useFile(fileId) {
2158
2194
  }
2159
2195
  const isSSR = typeof window === "undefined" || /ServerSideRendering/.test(window.navigator && window.navigator.userAgent);
2160
2196
  const useIsomorphicLayoutEffect = isSSR ? React.useEffect : React.useLayoutEffect;
2197
+ function usePage(pageId) {
2198
+ const { error, data = {} } = useQuery(PAGE_PATHNAMES_BY_ID, {
2199
+ skip: pageId == null,
2200
+ variables: { ids: [pageId] }
2201
+ });
2202
+ if (pageId == null || error != null)
2203
+ return null;
2204
+ const { pagePathnamesById: [page] = [] } = data;
2205
+ return page;
2206
+ }
2161
2207
  function responsiveStyle(responsiveValues, join$1, strategy) {
2162
2208
  return join(responsiveValues, join$1, strategy).reduce((acc, { deviceId, value }) => {
2163
2209
  const device = getDevice(deviceId);
@@ -2568,6 +2614,71 @@ function useImageControlValue(data, definition) {
2568
2614
  dimensions: { width: file.dimensions.width, height: file.dimensions.height }
2569
2615
  };
2570
2616
  }
2617
+ function useLinkControlValue(link, _definition) {
2618
+ var _a;
2619
+ const page = usePage(link && link.type === "OPEN_PAGE" ? link.payload.pageId : null);
2620
+ const elementKey = (link == null ? void 0 : link.type) === "SCROLL_TO_ELEMENT" ? (_a = link.payload.elementIdConfig) == null ? void 0 : _a.elementKey : null;
2621
+ const elementId = useElementId(elementKey);
2622
+ let href = "#";
2623
+ let target;
2624
+ let block;
2625
+ if (link) {
2626
+ switch (link.type) {
2627
+ case "OPEN_PAGE": {
2628
+ if (page)
2629
+ href = `/${page.pathname}`;
2630
+ target = link.payload.openInNewTab ? "_blank" : "_self";
2631
+ break;
2632
+ }
2633
+ case "OPEN_URL": {
2634
+ href = link.payload.url;
2635
+ target = link.payload.openInNewTab ? "_blank" : "_self";
2636
+ break;
2637
+ }
2638
+ case "SEND_EMAIL": {
2639
+ const { to, subject = "", body = "" } = link.payload;
2640
+ if (to != null)
2641
+ href = `mailto:${to}?subject=${subject}&body=${body}`;
2642
+ break;
2643
+ }
2644
+ case "CALL_PHONE": {
2645
+ href = `tel:${link.payload.phoneNumber}`;
2646
+ break;
2647
+ }
2648
+ case "SCROLL_TO_ELEMENT": {
2649
+ href = `#${elementId != null ? elementId : ""}`;
2650
+ block = link.payload.block;
2651
+ break;
2652
+ }
2653
+ default:
2654
+ throw new RangeError(`Invalid link type "${link.type}."`);
2655
+ }
2656
+ }
2657
+ const handleClick = React.useCallback((event) => {
2658
+ if (event.defaultPrevented)
2659
+ return;
2660
+ if (link && link.type === "SCROLL_TO_ELEMENT") {
2661
+ let hash;
2662
+ try {
2663
+ hash = new URL(`http://www.example.com/${href}`).hash;
2664
+ } catch (error) {
2665
+ console.error(`Link received invalid href: ${href}`, error);
2666
+ }
2667
+ if (href != null && href === hash) {
2668
+ event.preventDefault();
2669
+ const view = event.view;
2670
+ scrollIntoView__default["default"](view.document.querySelector(hash), {
2671
+ behavior: "smooth",
2672
+ block
2673
+ });
2674
+ if (view.location.hash !== hash)
2675
+ view.history.pushState({}, "", hash);
2676
+ }
2677
+ }
2678
+ }, [link, href, block]);
2679
+ const res = React.useMemo(() => ({ href, target, onClick: handleClick }), [href, target, handleClick]);
2680
+ return res;
2681
+ }
2571
2682
  function ListControlValue({
2572
2683
  definition,
2573
2684
  data,
@@ -2652,6 +2763,12 @@ function ControlValue({
2652
2763
  parameters: [data, definition],
2653
2764
  children: (value) => children(value)
2654
2765
  }, definition.type);
2766
+ case textInput.LinkControlType:
2767
+ return /* @__PURE__ */ jsxRuntime.jsx(RenderHook, {
2768
+ hook: useLinkControlValue,
2769
+ parameters: [data, definition],
2770
+ children: (value) => children(value)
2771
+ }, definition.type);
2655
2772
  case shape.ComboboxControlType:
2656
2773
  return /* @__PURE__ */ jsxRuntime.jsx(RenderHook, {
2657
2774
  hook: useComboboxControlValue,
@@ -2702,6 +2819,7 @@ function PropsValue({
2702
2819
  case shape.ComboboxControlType:
2703
2820
  case shape.ShapeControlType:
2704
2821
  case shape.ListControlType:
2822
+ case textInput.LinkControlType:
2705
2823
  return /* @__PURE__ */ jsxRuntime.jsx(ControlValue, {
2706
2824
  definition: descriptor,
2707
2825
  data: props[propName],
@@ -2919,7 +3037,7 @@ const ElementData = React.memo(React.forwardRef(function ElementData2({
2919
3037
  suppressRefWarning(`\`ForwardRef(${ElementData2.name})\``);
2920
3038
  if (Component == null) {
2921
3039
  return /* @__PURE__ */ jsxRuntime.jsx(FallbackComponent, {
2922
- ref,
3040
+ ref: setHandle,
2923
3041
  text: "Component not found"
2924
3042
  });
2925
3043
  }
@@ -3040,7 +3158,6 @@ exports.DocumentReference = DocumentReference;
3040
3158
  exports.Element = Element;
3041
3159
  exports.FILES_BY_ID = FILES_BY_ID;
3042
3160
  exports.MakeswiftClient = MakeswiftClient;
3043
- exports.PAGE_PATHNAMES_BY_ID = PAGE_PATHNAMES_BY_ID;
3044
3161
  exports.PAGE_SNIPPETS_QUERY = PAGE_SNIPPETS_QUERY;
3045
3162
  exports.Page = Page$1;
3046
3163
  exports.Page$1 = Page;
@@ -3074,6 +3191,7 @@ exports.useFormContext = useFormContext;
3074
3191
  exports.useIsInBuilder = useIsInBuilder;
3075
3192
  exports.useIsomorphicLayoutEffect = useIsomorphicLayoutEffect;
3076
3193
  exports.useMutation = useMutation;
3194
+ exports.usePage = usePage;
3077
3195
  exports.usePageId = usePageId;
3078
3196
  exports.useQuery = useQuery;
3079
3197
  exports.useResponsiveColor = useResponsiveColor;