@gem-sdk/pages 2.0.0-dev.890 → 2.0.0-staging.118

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 (144) hide show
  1. package/dist/cjs/components/ErrorBoundary.js +41 -1
  2. package/dist/cjs/components/ErrorFallback.js +27 -1
  3. package/dist/cjs/components/FacebookPixel.js +34 -3
  4. package/dist/cjs/components/FooterForPostPurchase.js +35 -1
  5. package/dist/cjs/components/GoogleAnalytic.js +66 -5
  6. package/dist/cjs/components/TikTokPixel.js +20 -3
  7. package/dist/cjs/components/builder/Body.js +37 -0
  8. package/dist/cjs/components/builder/Footer.js +155 -0
  9. package/dist/cjs/components/builder/Header.js +188 -0
  10. package/dist/cjs/components/builder/PopupManager.js +64 -1
  11. package/dist/cjs/components/builder/SwitchView.js +185 -0
  12. package/dist/cjs/components/builder/Toolbar.js +701 -1
  13. package/dist/cjs/components/builder/Toolbox.js +485 -1
  14. package/dist/cjs/components/builder/const.js +56 -0
  15. package/dist/cjs/components/builder/toolbar/const.js +7 -0
  16. package/dist/cjs/components/builder/toolbar/utils/findDOMClosest.js +41 -0
  17. package/dist/cjs/components/builder/toolbar/utils/findOverflowParent.js +20 -0
  18. package/dist/cjs/components/builder/toolbar/utils/getChildrenByAttrSelector.js +18 -0
  19. package/dist/cjs/components/builder/toolbar/utils/getDOMElementParents.js +32 -0
  20. package/dist/cjs/components/builder/toolbar/utils/isOverParent.js +16 -0
  21. package/dist/cjs/components/builder/toolbar/utils/isOverToolbarPosition.js +12 -0
  22. package/dist/cjs/components/builder/toolbar/utils/isSection.js +8 -0
  23. package/dist/cjs/components/builder/toolbar/utils/notVisible.js +8 -0
  24. package/dist/cjs/components/builder/toolbar/utils/waitForElementToExist.js +27 -0
  25. package/dist/cjs/components/image-to-layout/AddSectionImageToLayout.js +151 -1
  26. package/dist/cjs/components/image-to-layout/DropElement.js +167 -1
  27. package/dist/cjs/components/image-to-layout/ImageToLayout.js +42 -1
  28. package/dist/cjs/index.js +80 -1
  29. package/dist/cjs/layouts/main.js +31 -1
  30. package/dist/cjs/libs/api/get-builder-props.js +46 -1
  31. package/dist/cjs/libs/api/get-collection-props.js +68 -1
  32. package/dist/cjs/libs/api/get-home-page-props-v2.js +145 -1
  33. package/dist/cjs/libs/api/get-home-page-props.js +151 -1
  34. package/dist/cjs/libs/api/get-post-purchase-props-preview.js +268 -1
  35. package/dist/cjs/libs/api/get-preview-props.js +18 -1
  36. package/dist/cjs/libs/api/get-product-props.js +73 -1
  37. package/dist/cjs/libs/api/get-static-page-props-preview.js +155 -1
  38. package/dist/cjs/libs/api/get-static-page-props-v2.js +164 -1
  39. package/dist/cjs/libs/api/get-static-page-props.js +148 -1
  40. package/dist/cjs/libs/custom-fonts.js +60 -6
  41. package/dist/cjs/libs/fetcher.js +100 -1
  42. package/dist/cjs/libs/get-layout.js +13 -1
  43. package/dist/cjs/libs/get-storefront-api.js +12 -1
  44. package/dist/cjs/libs/getStaticPaths.js +10 -1
  45. package/dist/cjs/libs/google-fonts.js +118 -1
  46. package/dist/cjs/libs/helpers/check-option-font.js +65 -0
  47. package/dist/cjs/libs/helpers/common.js +27 -1
  48. package/dist/cjs/libs/helpers/gen-css.js +135 -1
  49. package/dist/cjs/libs/helpers/gen-fonts.js +90 -1
  50. package/dist/cjs/libs/helpers/generate-manifres.js +5 -1
  51. package/dist/cjs/libs/helpers/get-fallback.js +34 -1
  52. package/dist/cjs/libs/helpers/normalize.js +111 -1
  53. package/dist/cjs/libs/helpers/parse-json.js +16 -1
  54. package/dist/cjs/libs/helpers/user-agent.js +7 -1
  55. package/dist/cjs/libs/hooks/use-tracking-view.js +43 -1
  56. package/dist/cjs/libs/hooks/usePagePreview.js +92 -1
  57. package/dist/cjs/libs/parse-html.js +34 -1
  58. package/dist/cjs/libs/shopify-cdn-with-google-fonts.js +1845 -1
  59. package/dist/cjs/pages/404.js +43 -1
  60. package/dist/cjs/pages/500.js +74 -1
  61. package/dist/cjs/pages/CollectionGlobalProvider.js +59 -1
  62. package/dist/cjs/pages/builder.js +115 -1
  63. package/dist/cjs/pages/collection-detail.js +64 -1
  64. package/dist/cjs/pages/preview.js +26 -1
  65. package/dist/cjs/pages/product-detail.js +69 -1
  66. package/dist/cjs/pages/static-v2.js +139 -1
  67. package/dist/cjs/pages/static.js +75 -1
  68. package/dist/cjs/store/libs-store.js +14 -0
  69. package/dist/esm/components/ErrorBoundary.js +39 -1
  70. package/dist/esm/components/ErrorFallback.js +25 -1
  71. package/dist/esm/components/FacebookPixel.js +32 -3
  72. package/dist/esm/components/FooterForPostPurchase.js +31 -1
  73. package/dist/esm/components/GoogleAnalytic.js +64 -5
  74. package/dist/esm/components/TikTokPixel.js +18 -3
  75. package/dist/esm/components/builder/Body.js +33 -0
  76. package/dist/esm/components/builder/Footer.js +151 -0
  77. package/dist/esm/components/builder/Header.js +184 -0
  78. package/dist/esm/components/builder/PopupManager.js +60 -1
  79. package/dist/esm/components/builder/SwitchView.js +181 -0
  80. package/dist/esm/components/builder/Toolbar.js +697 -1
  81. package/dist/esm/components/builder/Toolbox.js +481 -1
  82. package/dist/esm/components/builder/const.js +54 -0
  83. package/dist/esm/components/builder/toolbar/const.js +4 -0
  84. package/dist/esm/components/builder/toolbar/utils/findDOMClosest.js +39 -0
  85. package/dist/esm/components/builder/toolbar/utils/findOverflowParent.js +18 -0
  86. package/dist/esm/components/builder/toolbar/utils/getChildrenByAttrSelector.js +16 -0
  87. package/dist/esm/components/builder/toolbar/utils/getDOMElementParents.js +30 -0
  88. package/dist/esm/components/builder/toolbar/utils/isOverParent.js +14 -0
  89. package/dist/esm/components/builder/toolbar/utils/isOverToolbarPosition.js +10 -0
  90. package/dist/esm/components/builder/toolbar/utils/isSection.js +6 -0
  91. package/dist/esm/components/builder/toolbar/utils/notVisible.js +6 -0
  92. package/dist/esm/components/builder/toolbar/utils/waitForElementToExist.js +25 -0
  93. package/dist/esm/components/image-to-layout/AddSectionImageToLayout.js +147 -1
  94. package/dist/esm/components/image-to-layout/DropElement.js +165 -1
  95. package/dist/esm/components/image-to-layout/ImageToLayout.js +38 -1
  96. package/dist/esm/index.js +35 -1
  97. package/dist/esm/layouts/main.js +27 -1
  98. package/dist/esm/libs/api/get-builder-props.js +44 -1
  99. package/dist/esm/libs/api/get-collection-props.js +66 -1
  100. package/dist/esm/libs/api/get-home-page-props-v2.js +143 -1
  101. package/dist/esm/libs/api/get-home-page-props.js +149 -1
  102. package/dist/esm/libs/api/get-post-purchase-props-preview.js +260 -1
  103. package/dist/esm/libs/api/get-preview-props.js +16 -1
  104. package/dist/esm/libs/api/get-product-props.js +71 -1
  105. package/dist/esm/libs/api/get-static-page-props-preview.js +153 -1
  106. package/dist/esm/libs/api/get-static-page-props-v2.js +162 -1
  107. package/dist/esm/libs/api/get-static-page-props.js +146 -1
  108. package/dist/esm/libs/custom-fonts.js +55 -6
  109. package/dist/esm/libs/fetcher.js +96 -1
  110. package/dist/esm/libs/get-layout.js +11 -1
  111. package/dist/esm/libs/get-storefront-api.js +10 -1
  112. package/dist/esm/libs/getStaticPaths.js +8 -1
  113. package/dist/esm/libs/google-fonts.js +112 -1
  114. package/dist/esm/libs/helpers/check-option-font.js +63 -0
  115. package/dist/esm/libs/helpers/common.js +24 -1
  116. package/dist/esm/libs/helpers/gen-css.js +133 -1
  117. package/dist/esm/libs/helpers/gen-fonts.js +87 -1
  118. package/dist/esm/libs/helpers/generate-manifres.js +3 -1
  119. package/dist/esm/libs/helpers/get-fallback.js +32 -1
  120. package/dist/esm/libs/helpers/normalize.js +103 -1
  121. package/dist/esm/libs/helpers/parse-json.js +13 -1
  122. package/dist/esm/libs/helpers/user-agent.js +5 -1
  123. package/dist/esm/libs/hooks/use-tracking-view.js +41 -1
  124. package/dist/esm/libs/hooks/usePagePreview.js +90 -1
  125. package/dist/esm/libs/parse-html.js +32 -1
  126. package/dist/esm/libs/shopify-cdn-with-google-fonts.js +1843 -1
  127. package/dist/esm/pages/404.js +41 -1
  128. package/dist/esm/pages/500.js +72 -1
  129. package/dist/esm/pages/CollectionGlobalProvider.js +55 -1
  130. package/dist/esm/pages/builder.js +113 -1
  131. package/dist/esm/pages/collection-detail.js +60 -1
  132. package/dist/esm/pages/preview.js +24 -1
  133. package/dist/esm/pages/product-detail.js +65 -1
  134. package/dist/esm/pages/static-v2.js +137 -1
  135. package/dist/esm/pages/static.js +71 -1
  136. package/dist/esm/store/libs-store.js +12 -0
  137. package/dist/types/index.d.ts +50 -34
  138. package/package.json +8 -5
  139. package/dist/cjs/components/Footer.js +0 -1
  140. package/dist/cjs/components/Header.js +0 -1
  141. package/dist/cjs/components/builder/toolbar/Onboarding.js +0 -1
  142. package/dist/esm/components/Footer.js +0 -1
  143. package/dist/esm/components/Header.js +0 -1
  144. package/dist/esm/components/builder/toolbar/Onboarding.js +0 -1
@@ -1 +1,143 @@
1
- import{PublishedThemePagesDocument as e,StorePropertyDocument as o}from"@gem-sdk/core";import{ShopMetaDocument as a}from"@gem-sdk/adapter-shopify";import{getFontStyleFromPageTemplate as t,getFontFromGlobalStyle as r}from"../google-fonts.js";import{genCSS as s}from"../helpers/gen-css.js";import{generateManifest as l}from"../helpers/generate-manifres.js";import{getFallbackV2 as i}from"../helpers/get-fallback.js";import{parseBuilderTemplateV2 as n}from"../helpers/normalize.js";import{parseJson as m,serializableJson as p}from"../helpers/parse-json.js";import{captureException as c}from"@sentry/nextjs";let getHomePagePropsV2=(d,h)=>async()=>{try{let c={slugType:"STATIC"},[u,g,f]=await Promise.allSettled([d([e,c]),d([o]),h([a])]);if("rejected"===u.status)throw Error(u.reason?.[0]);let y=u.value?.publishedThemePages?.[0];if(!y)throw Error("No data builder found for Home page");let P=n(y),[x,k,z]=await Promise.all([t(P),r(y?.pageStyle?.data),i(d,P)]),b=y.isMobile??!1,C=y?.themePageDataSEO?.find(e=>e?.key==="global-meta-description")?.value,v=m(y?.themePageDataSEO?.find(e=>e?.key==="global-meta-thumbnail")?.value),_="fulfilled"===f.status?f.value:void 0,j="fulfilled"===g.status?g.value:void 0,T=j?.storeProperty?.favicon??"/favicon/favicon-32x32.png",w={defaultTitle:_?.shop.name,title:y?.name??"Home",description:C??_?.shop.description,openGraph:{site_name:_?.shop.name,locale:_?.localization.country.isoCode,title:y?.name??_?.shop.name,description:C??_?.shop.description,images:v?[v]:[]},additionalMetaTags:[{name:"theme-color",content:"#000000"}],canonical:`https://${j?.storeProperty?.primaryDomain}/`,additionalLinkTags:[{rel:"icon",sizes:"32x32",href:`${T}-/crop/1:1/center/-/smart_resize/32x32/`},{rel:"icon",sizes:"16x16",href:`${T}-/crop/1:1/center/-/smart_resize/16x16/`},{rel:"apple-touch-icon",sizes:"180x180",href:`${T}-/crop/1:1/center/-/smart_resize/180x180/`},{rel:"manifest",href:l({theme_color:"#000000",background_color:"#ffffff",display:"standalone",scope:"/",start_url:"/",name:_?.shop.name,short_name:_?.shop.name,description:_?.shop.description,icons:[{src:`${T}-/crop/1:1/center/-/smart_resize/192x192/`,sizes:"192x192",type:"image/png",purpose:"any maskable"},{src:`${T}-/crop/1:1/center/-/smart_resize/512x512/`,sizes:"512x512",type:"image/png"}]})}]},$=_?.localization.language.isoCode??null,D=_?.localization.country.isoCode??null,I=$&&D?`${$}-${D}`:null;return p({themeStyle:s(y?.pageStyle?.data,b),fontStyle:k,elementFontStyle:x,builderData:P,swr:{fallback:z},moneyFormat:_?.shop.moneyFormat??null,currency:_?.localization.country.currency.isoCode??null,languageIsoCode:$,countryIsoCode:D,locale:I,swatches:m(j?.storeProperty?.swatchesConfig),seo:w,mobileOnly:b,gaTrackingId:y.themePageAnalytic?.gaTrackingID??null,facebookPixelId:y.themePageAnalytic?.fbPixelID??null,tiktokPixelId:y.themePageAnalytic?.tiktokPixelID??null,customCodeHeader:y.themePageCustomCode?.header??null,customCodeBody:y.themePageCustomCode?.body??null,pageHandle:y.handle??null})}catch(e){throw c(e),e}};export{getHomePagePropsV2};
1
+ import { PublishedThemePagesDocument, StorePropertyDocument } from '@gem-sdk/core';
2
+ import { ShopMetaDocument } from '@gem-sdk/adapter-shopify';
3
+ import { getFontStyleFromPageTemplate, getFontFromGlobalStyle } from '../google-fonts.js';
4
+ import { genCSS } from '../helpers/gen-css.js';
5
+ import { generateManifest } from '../helpers/generate-manifres.js';
6
+ import { getFallbackV2 } from '../helpers/get-fallback.js';
7
+ import { parseBuilderTemplateV2 } from '../helpers/normalize.js';
8
+ import { parseJson, serializableJson } from '../helpers/parse-json.js';
9
+ import { captureException } from '@sentry/nextjs';
10
+
11
+ const getHomePagePropsV2 = (fetcher, shopifyFetcher)=>async ()=>{
12
+ try {
13
+ const variables = {
14
+ slugType: 'STATIC'
15
+ };
16
+ const [theme, storeProperty, shopifyMeta] = await Promise.allSettled([
17
+ fetcher([
18
+ PublishedThemePagesDocument,
19
+ variables
20
+ ]),
21
+ fetcher([
22
+ StorePropertyDocument
23
+ ]),
24
+ shopifyFetcher([
25
+ ShopMetaDocument
26
+ ])
27
+ ]);
28
+ if (theme.status === 'rejected') {
29
+ throw new Error(theme.reason?.[0]);
30
+ }
31
+ const dataBuilder = theme.value?.publishedThemePages?.[0];
32
+ if (!dataBuilder) {
33
+ throw new Error(`No data builder found for Home page`);
34
+ }
35
+ const homeTemplate = parseBuilderTemplateV2(dataBuilder);
36
+ const [elementFontStyle, fontStyle, fallback] = await Promise.all([
37
+ getFontStyleFromPageTemplate(homeTemplate),
38
+ getFontFromGlobalStyle(dataBuilder?.pageStyle?.data),
39
+ getFallbackV2(fetcher, homeTemplate)
40
+ ]);
41
+ const mobileOnly = dataBuilder.isMobile ?? false;
42
+ const description = dataBuilder?.themePageDataSEO?.find((item)=>item?.key === 'global-meta-description')?.value;
43
+ const thumbnail = parseJson(dataBuilder?.themePageDataSEO?.find((item)=>item?.key === 'global-meta-thumbnail')?.value);
44
+ const shopMeta = shopifyMeta.status === 'fulfilled' ? shopifyMeta.value : undefined;
45
+ const shopData = storeProperty.status === 'fulfilled' ? storeProperty.value : undefined;
46
+ const favicon = shopData?.storeProperty?.favicon ?? '/favicon/favicon-32x32.png';
47
+ const seo = {
48
+ defaultTitle: shopMeta?.shop.name,
49
+ title: dataBuilder?.name ?? 'Home',
50
+ description: description ?? shopMeta?.shop.description,
51
+ openGraph: {
52
+ site_name: shopMeta?.shop.name,
53
+ locale: shopMeta?.localization.country.isoCode,
54
+ title: dataBuilder?.name ?? shopMeta?.shop.name,
55
+ description: description ?? shopMeta?.shop.description,
56
+ images: thumbnail ? [
57
+ thumbnail
58
+ ] : []
59
+ },
60
+ additionalMetaTags: [
61
+ {
62
+ name: 'theme-color',
63
+ content: '#000000'
64
+ }
65
+ ],
66
+ canonical: `https://${shopData?.storeProperty?.primaryDomain}/`,
67
+ additionalLinkTags: [
68
+ {
69
+ rel: 'icon',
70
+ sizes: '32x32',
71
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/32x32/`
72
+ },
73
+ {
74
+ rel: 'icon',
75
+ sizes: '16x16',
76
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/16x16/`
77
+ },
78
+ {
79
+ rel: 'apple-touch-icon',
80
+ sizes: '180x180',
81
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/180x180/`
82
+ },
83
+ {
84
+ rel: 'manifest',
85
+ href: generateManifest({
86
+ theme_color: '#000000',
87
+ background_color: '#ffffff',
88
+ display: 'standalone',
89
+ scope: '/',
90
+ start_url: '/',
91
+ name: shopMeta?.shop.name,
92
+ short_name: shopMeta?.shop.name,
93
+ description: shopMeta?.shop.description,
94
+ icons: [
95
+ {
96
+ src: `${favicon}-/crop/1:1/center/-/smart_resize/192x192/`,
97
+ sizes: '192x192',
98
+ type: 'image/png',
99
+ purpose: 'any maskable'
100
+ },
101
+ {
102
+ src: `${favicon}-/crop/1:1/center/-/smart_resize/512x512/`,
103
+ sizes: '512x512',
104
+ type: 'image/png'
105
+ }
106
+ ]
107
+ })
108
+ }
109
+ ]
110
+ };
111
+ const languageIsoCode = shopMeta?.localization.language.isoCode ?? null;
112
+ const countryIsoCode = shopMeta?.localization.country.isoCode ?? null;
113
+ const locale = !languageIsoCode || !countryIsoCode ? null : `${languageIsoCode}-${countryIsoCode}`;
114
+ return serializableJson({
115
+ themeStyle: genCSS(dataBuilder?.pageStyle?.data, mobileOnly),
116
+ fontStyle,
117
+ elementFontStyle,
118
+ builderData: homeTemplate,
119
+ swr: {
120
+ fallback
121
+ },
122
+ moneyFormat: shopMeta?.shop.moneyFormat ?? null,
123
+ currency: shopMeta?.localization.country.currency.isoCode ?? null,
124
+ languageIsoCode,
125
+ countryIsoCode,
126
+ locale,
127
+ swatches: parseJson(shopData?.storeProperty?.swatchesConfig),
128
+ seo,
129
+ mobileOnly,
130
+ gaTrackingId: dataBuilder.themePageAnalytic?.gaTrackingID ?? null,
131
+ facebookPixelId: dataBuilder.themePageAnalytic?.fbPixelID ?? null,
132
+ tiktokPixelId: dataBuilder.themePageAnalytic?.tiktokPixelID ?? null,
133
+ customCodeHeader: dataBuilder.themePageCustomCode?.header ?? null,
134
+ customCodeBody: dataBuilder.themePageCustomCode?.body ?? null,
135
+ pageHandle: dataBuilder.handle ?? null
136
+ });
137
+ } catch (err) {
138
+ captureException(err);
139
+ throw err;
140
+ }
141
+ };
142
+
143
+ export { getHomePagePropsV2 };
@@ -1 +1,149 @@
1
- import{PublishedThemePagesDocument as e,StorePropertyDocument as o,prefetchQueries as a}from"@gem-sdk/core";import{ShopMetaDocument as t}from"@gem-sdk/adapter-shopify";import{getFontFromGlobalStyle as r}from"../google-fonts.js";import{genCSS as s}from"../helpers/gen-css.js";import{generateManifest as i}from"../helpers/generate-manifres.js";import{parseBuilderTemplate as l}from"../helpers/normalize.js";import{parseJson as n,serializableJson as m}from"../helpers/parse-json.js";let getHomePageProps=(p,c)=>async()=>{let d="STATIC",u={slugType:d},[f,h,g]=await Promise.allSettled([p([e,u]),p([o]),c([t])]);if("rejected"===f.status)return{pageType:d};let y=f.value.publishedThemePages?.[0],z=l(y),x=await r(y?.pageStyle?.data),v=a(z),P=await Promise.allSettled(v.map(({query:e,variables:o,func:a})=>a?a(p,o):e?p([e,o]):{})),_=v.reduce((e,{key:o},a)=>{let t=P[a];return t?.status==="fulfilled"?{...e,[o]:t.value}:e},{}),S=y?.themePageDataSEO?.find(e=>e?.key==="global-meta-description")?.value,b=n(y?.themePageDataSEO?.find(e=>e?.key==="global-meta-thumbnail")?.value),j="fulfilled"===g.status?g.value:void 0,k="fulfilled"===h.status?h.value:void 0,T=k?.storeProperty?.favicon??"/favicon/favicon-32x32.png",$={defaultTitle:j?.shop.name,title:y?.name??"Home",description:S??j?.shop.description,openGraph:{site_name:j?.shop.name,locale:j?.localization.country.isoCode,title:y?.name??j?.shop.name,description:S??j?.shop.description,images:b?[b]:[]},additionalMetaTags:[{name:"theme-color",content:"#000000"}],canonical:"/",additionalLinkTags:[{rel:"icon",sizes:"32x32",href:`${T}-/crop/1:1/center/-/smart_resize/32x32/`},{rel:"icon",sizes:"16x16",href:`${T}-/crop/1:1/center/-/smart_resize/16x16/`},{rel:"apple-touch-icon",sizes:"180x180",href:`${T}-/crop/1:1/center/-/smart_resize/180x180/`},{rel:"manifest",href:i({theme_color:"#000000",background_color:"#ffffff",display:"standalone",scope:"/",start_url:"/",name:j?.shop.name,short_name:j?.shop.name,description:j?.shop.description,icons:[{src:`${T}-/crop/1:1/center/-/smart_resize/192x192/`,sizes:"192x192",type:"image/png",purpose:"any maskable"},{src:`${T}-/crop/1:1/center/-/smart_resize/512x512/`,sizes:"512x512",type:"image/png"}]})}]},w=j?.localization.language.isoCode??null,C=j?.localization.country.isoCode??null,D=w&&C?`${w}-${C}`:null;return m({themeStyle:s(y?.pageStyle?.data),fontStyle:x,builderData:z,pageType:d,swr:{fallback:_},moneyFormat:j?.shop.moneyFormat??null,currency:j?.localization.country.currency.isoCode??null,locale:D,languageIsoCode:w,countryIsoCode:C,swatches:n(k?.storeProperty?.swatchesConfig),seo:$})};export{getHomePageProps};
1
+ import { PublishedThemePagesDocument, StorePropertyDocument, prefetchQueries } from '@gem-sdk/core';
2
+ import { ShopMetaDocument } from '@gem-sdk/adapter-shopify';
3
+ import { getFontFromGlobalStyle } from '../google-fonts.js';
4
+ import { genCSS } from '../helpers/gen-css.js';
5
+ import { generateManifest } from '../helpers/generate-manifres.js';
6
+ import { parseBuilderTemplate } from '../helpers/normalize.js';
7
+ import { parseJson, serializableJson } from '../helpers/parse-json.js';
8
+
9
+ const getHomePageProps = (fetcher, shopifyFetcher)=>async ()=>{
10
+ const pageType = 'STATIC';
11
+ const variables = {
12
+ slugType: pageType
13
+ };
14
+ // const theme = await fetcher<PublishedThemePagesQueryResponse, PublishedThemePagesQueryVariables>([
15
+ // PublishedThemePagesDocument,
16
+ // variables,
17
+ // ]);
18
+ const [theme, storeProperty, shopifyMeta] = await Promise.allSettled([
19
+ fetcher([
20
+ PublishedThemePagesDocument,
21
+ variables
22
+ ]),
23
+ fetcher([
24
+ StorePropertyDocument
25
+ ]),
26
+ shopifyFetcher([
27
+ ShopMetaDocument
28
+ ])
29
+ ]);
30
+ if (theme.status === 'rejected') {
31
+ return {
32
+ pageType
33
+ };
34
+ }
35
+ const dataBuilder = theme.value.publishedThemePages?.[0];
36
+ const homeTemplate = parseBuilderTemplate(dataBuilder);
37
+ const fontStyle = await getFontFromGlobalStyle(dataBuilder?.pageStyle?.data);
38
+ const queries = prefetchQueries(homeTemplate);
39
+ const datas = await Promise.allSettled(queries.map(({ query, variables, func })=>{
40
+ if (func) {
41
+ return func(fetcher, variables);
42
+ }
43
+ if (query) return fetcher([
44
+ query,
45
+ variables
46
+ ]);
47
+ return {};
48
+ }));
49
+ const fallback = queries.reduce((acc, { key }, index)=>{
50
+ const res = datas[index];
51
+ if (res?.status === 'fulfilled') {
52
+ return {
53
+ ...acc,
54
+ [key]: res.value
55
+ };
56
+ }
57
+ return acc;
58
+ }, {});
59
+ const description = dataBuilder?.themePageDataSEO?.find((item)=>item?.key === 'global-meta-description')?.value;
60
+ const thumbnail = parseJson(dataBuilder?.themePageDataSEO?.find((item)=>item?.key === 'global-meta-thumbnail')?.value);
61
+ const shopMeta = shopifyMeta.status === 'fulfilled' ? shopifyMeta.value : undefined;
62
+ const shopData = storeProperty.status === 'fulfilled' ? storeProperty.value : undefined;
63
+ const favicon = shopData?.storeProperty?.favicon ?? '/favicon/favicon-32x32.png';
64
+ const seo = {
65
+ defaultTitle: shopMeta?.shop.name,
66
+ title: dataBuilder?.name ?? 'Home',
67
+ description: description ?? shopMeta?.shop.description,
68
+ openGraph: {
69
+ site_name: shopMeta?.shop.name,
70
+ locale: shopMeta?.localization.country.isoCode,
71
+ title: dataBuilder?.name ?? shopMeta?.shop.name,
72
+ description: description ?? shopMeta?.shop.description,
73
+ images: thumbnail ? [
74
+ thumbnail
75
+ ] : []
76
+ },
77
+ additionalMetaTags: [
78
+ {
79
+ name: 'theme-color',
80
+ content: '#000000'
81
+ }
82
+ ],
83
+ canonical: '/',
84
+ additionalLinkTags: [
85
+ {
86
+ rel: 'icon',
87
+ sizes: '32x32',
88
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/32x32/`
89
+ },
90
+ {
91
+ rel: 'icon',
92
+ sizes: '16x16',
93
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/16x16/`
94
+ },
95
+ {
96
+ rel: 'apple-touch-icon',
97
+ sizes: '180x180',
98
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/180x180/`
99
+ },
100
+ {
101
+ rel: 'manifest',
102
+ href: generateManifest({
103
+ theme_color: '#000000',
104
+ background_color: '#ffffff',
105
+ display: 'standalone',
106
+ scope: '/',
107
+ start_url: '/',
108
+ name: shopMeta?.shop.name,
109
+ short_name: shopMeta?.shop.name,
110
+ description: shopMeta?.shop.description,
111
+ icons: [
112
+ {
113
+ src: `${favicon}-/crop/1:1/center/-/smart_resize/192x192/`,
114
+ sizes: '192x192',
115
+ type: 'image/png',
116
+ purpose: 'any maskable'
117
+ },
118
+ {
119
+ src: `${favicon}-/crop/1:1/center/-/smart_resize/512x512/`,
120
+ sizes: '512x512',
121
+ type: 'image/png'
122
+ }
123
+ ]
124
+ })
125
+ }
126
+ ]
127
+ };
128
+ const languageIsoCode = shopMeta?.localization.language.isoCode ?? null;
129
+ const countryIsoCode = shopMeta?.localization.country.isoCode ?? null;
130
+ const locale = !languageIsoCode || !countryIsoCode ? null : `${languageIsoCode}-${countryIsoCode}`;
131
+ return serializableJson({
132
+ themeStyle: genCSS(dataBuilder?.pageStyle?.data),
133
+ fontStyle,
134
+ builderData: homeTemplate,
135
+ pageType,
136
+ swr: {
137
+ fallback
138
+ },
139
+ moneyFormat: shopMeta?.shop.moneyFormat ?? null,
140
+ currency: shopMeta?.localization.country.currency.isoCode ?? null,
141
+ locale,
142
+ languageIsoCode,
143
+ countryIsoCode,
144
+ swatches: parseJson(shopData?.storeProperty?.swatchesConfig),
145
+ seo
146
+ });
147
+ };
148
+
149
+ export { getHomePageProps };
@@ -1 +1,260 @@
1
- import{ThemePageDocument as e,StorePropertyDocument as t,SaleFunnelDiscountsDocument as a,LibraryTemplateDocument as r,LibrarySaleFunnelDocument as l}from"@gem-sdk/core";import{captureException as s}from"@sentry/nextjs";import{getFontStyleFromPageTemplate as o,getFontFromGlobalStyle as i}from"../google-fonts.js";import{getFallbackV2 as f}from"../helpers/get-fallback.js";import{parseBuilderLibraryTemplate as d,parseBuilderTemplateV2 as m}from"../helpers/normalize.js";import{usePagePreview as h}from"../hooks/usePagePreview.js";import{serializableJson as u}from"../helpers/parse-json.js";import{genCSS as P}from"../helpers/gen-css.js";let fetchSalePageDataByID=async(a,r)=>{let l={themePageId:a.themePageId,first:1,where:{default:!0}},[s,o]=await Promise.allSettled([r([e,l]),r([t])]);if("rejected"===s.status)throw Error(s.reason?.[0]);return{dataBuilder:s.value.themePage,pageStyle:s.value.themePage?.theme?.themeStyles?.edges?.[0]?.node?.data,storeProperty:o,productOffers:[]}},fetchPostPurchasePageDataByID=async(r,l)=>{let s={themePageId:r.themePageId,first:1,where:{default:!0}},[o,i,f]=await Promise.allSettled([l([e,s]),l([t]),l([a,{where:{saleFunnelOfferID:r.currentOfferID}}])]);if("rejected"===o.status)throw Error(o.reason?.[0]);if("rejected"===f.status)throw Error(f.reason?.[0]);return{dataBuilder:o.value.themePage,pageStyle:o.value.themePage?.theme?.themeStyles?.edges?.[0]?.node?.data,storeProperty:i,productOffers:f.value.saleFunnelDiscounts?.edges?.filter(e=>e?.node?.objectType==="PRODUCT"&&e?.node?.type==="ORDER_VALUE")||[]}},fetchThemePageDataByTemplateID=async(e,a)=>{let s={libraryTemplateId:e.libraryTemplateId},o=[],[i,f]=await Promise.allSettled([a([r,s]),a([t])]);if(e.currentOfferID){let[t]=await Promise.allSettled([a([l,{librarySaleFunnelId:e.librarySaleFunnelID}])]);if("rejected"===t.status)throw Error(t.reason?.[0]);let r=t.value.librarySaleFunnel?.offers?.find(t=>t?.id===e.currentOfferID);r&&(o=r.discounts?.filter(e=>e?.objectType==="PRODUCT"&&"ORDER_VALUE"===e.type).map(e=>({node:{...e}}))||[])}if("rejected"===i.status)throw Error(i.reason?.[0]);return{dataBuilder:i.value.libraryTemplate,pageStyle:void 0,storeProperty:f,productOffers:o}},getPostPurchasePropsPreview=(e,t,a)=>async(r,l)=>{try{let{dataBuilder:s,storeProperty:n,productOffers:c,pageStyle:p}=t?await fetchThemePageDataByTemplateID({libraryTemplateId:r,currentOfferID:l,librarySaleFunnelID:t},e):l?await fetchPostPurchasePageDataByID({themePageId:r,currentOfferID:l},e):await fetchSalePageDataByID({themePageId:r},e);if(!s)throw Error(`No data builder found for slug: /preview/${r}`);let g=t?d(s):m(s),y=a||e,[D,I,w]=await Promise.all([o(g),i(p),f(y,g,!1)]),{seo:S,pageConfig:j}=h(s,n);return u({themeStyle:P(p),seo:S,...j,elementFontStyle:D,fontStyle:I,builderData:g,swr:{fallback:w},productOffers:c})}catch(e){throw s(e),e}};export{fetchPostPurchasePageDataByID,fetchSalePageDataByID,fetchThemePageDataByTemplateID,getPostPurchasePropsPreview};
1
+ import { ThemePageDocument, StorePropertyDocument, SaleFunnelDiscountsDocument, LibraryTemplateDocument, LibrarySaleFunnelDocument, ShopLibraryPageDocument } from '@gem-sdk/core';
2
+ import { captureException } from '@sentry/nextjs';
3
+ import { getFontStyleFromPageTemplate, getFontFromGlobalStyle } from '../google-fonts.js';
4
+ import { getFallbackV2 } from '../helpers/get-fallback.js';
5
+ import { parseBuilderLibraryTemplate, parseShopLibraryPageTemplate, parseBuilderTemplateV2 } from '../helpers/normalize.js';
6
+ import { usePagePreview } from '../hooks/usePagePreview.js';
7
+ import { serializableJson } from '../helpers/parse-json.js';
8
+ import { genCSS } from '../helpers/gen-css.js';
9
+
10
+ const fetchSalePageDataByID = async (data, fetcher)=>{
11
+ const variables = {
12
+ themePageId: data.themePageId,
13
+ first: 1,
14
+ where: {
15
+ default: true
16
+ }
17
+ };
18
+ const [theme, storeProperty] = await Promise.allSettled([
19
+ fetcher([
20
+ ThemePageDocument,
21
+ variables
22
+ ]),
23
+ fetcher([
24
+ StorePropertyDocument
25
+ ])
26
+ ]);
27
+ if (theme.status === 'rejected') {
28
+ throw new Error(theme.reason?.[0]);
29
+ }
30
+ return {
31
+ dataBuilder: theme.value.themePage,
32
+ pageStyle: theme.value.themePage?.theme?.themeStyles?.edges?.[0]?.node?.data,
33
+ storeProperty,
34
+ productOffers: []
35
+ };
36
+ };
37
+ const fetchPostPurchasePageDataByID = async (data, fetcher)=>{
38
+ const variables = {
39
+ themePageId: data.themePageId,
40
+ first: 1,
41
+ where: {
42
+ default: true
43
+ }
44
+ };
45
+ const [theme, storeProperty, saleFunnelDiscounts] = await Promise.allSettled([
46
+ fetcher([
47
+ ThemePageDocument,
48
+ variables
49
+ ]),
50
+ fetcher([
51
+ StorePropertyDocument
52
+ ]),
53
+ fetcher([
54
+ SaleFunnelDiscountsDocument,
55
+ {
56
+ where: {
57
+ saleFunnelOfferID: data.currentOfferID
58
+ }
59
+ }
60
+ ])
61
+ ]);
62
+ if (theme.status === 'rejected') {
63
+ throw new Error(theme.reason?.[0]);
64
+ }
65
+ if (saleFunnelDiscounts.status === 'rejected') {
66
+ throw new Error(saleFunnelDiscounts.reason?.[0]);
67
+ }
68
+ return {
69
+ dataBuilder: theme.value.themePage,
70
+ pageStyle: theme.value.themePage?.theme?.themeStyles?.edges?.[0]?.node?.data,
71
+ storeProperty,
72
+ productOffers: saleFunnelDiscounts.value.saleFunnelDiscounts?.edges?.filter((item)=>item?.node?.objectType === 'PRODUCT' && item?.node?.type === 'ORDER_VALUE') || []
73
+ };
74
+ };
75
+ const fetchThemePageDataByTemplateID = async (data, fetcher)=>{
76
+ const variables = {
77
+ libraryTemplateId: data.libraryTemplateId
78
+ };
79
+ let productOffers = [];
80
+ const [theme, storeProperty] = await Promise.allSettled([
81
+ fetcher([
82
+ LibraryTemplateDocument,
83
+ variables
84
+ ]),
85
+ fetcher([
86
+ StorePropertyDocument
87
+ ])
88
+ ]);
89
+ if (data.currentOfferID) {
90
+ const [librarySaleFunnel] = await Promise.allSettled([
91
+ fetcher([
92
+ LibrarySaleFunnelDocument,
93
+ {
94
+ librarySaleFunnelId: data.librarySaleFunnelID
95
+ }
96
+ ])
97
+ ]);
98
+ if (librarySaleFunnel.status === 'rejected') {
99
+ throw new Error(librarySaleFunnel.reason?.[0]);
100
+ }
101
+ const offer = librarySaleFunnel.value.librarySaleFunnel?.offers?.find((offer)=>offer?.id === data.currentOfferID);
102
+ if (offer) {
103
+ productOffers = offer.discounts?.filter((item)=>item?.objectType === 'PRODUCT' && item.type === 'ORDER_VALUE').map((item)=>({
104
+ node: {
105
+ ...item
106
+ }
107
+ })) || [];
108
+ }
109
+ }
110
+ if (theme.status === 'rejected') {
111
+ throw new Error(theme.reason?.[0]);
112
+ }
113
+ return {
114
+ dataBuilder: theme.value.libraryTemplate,
115
+ pageStyle: undefined,
116
+ storeProperty,
117
+ productOffers: productOffers
118
+ };
119
+ };
120
+ const fetchShopLibraryPageDataByID = async (data, fetcher)=>{
121
+ const variables = {
122
+ shopLibraryPageId: data.shopLibraryPageId
123
+ };
124
+ const [theme, storeProperty, saleFunnelDiscounts] = await Promise.allSettled([
125
+ fetcher([
126
+ ShopLibraryPageDocument,
127
+ variables
128
+ ]),
129
+ fetcher([
130
+ StorePropertyDocument
131
+ ]),
132
+ fetcher([
133
+ SaleFunnelDiscountsDocument,
134
+ {
135
+ where: {
136
+ saleFunnelOfferID: data.currentOfferID
137
+ }
138
+ }
139
+ ])
140
+ ]);
141
+ if (theme.status === 'rejected') {
142
+ throw new Error(theme.reason?.[0]);
143
+ }
144
+ if (saleFunnelDiscounts.status === 'rejected') {
145
+ throw new Error(saleFunnelDiscounts.reason?.[0]);
146
+ }
147
+ return {
148
+ dataBuilder: theme.value.shopLibraryPage,
149
+ pageStyle: undefined,
150
+ storeProperty,
151
+ productOffers: saleFunnelDiscounts.value.saleFunnelDiscounts?.edges?.filter((item)=>item?.node?.objectType === 'PRODUCT' && item?.node?.type === 'ORDER_VALUE') || []
152
+ };
153
+ };
154
+ const fetchLibraryTemplateDataByID = async (data, fetcher)=>{
155
+ const variables = {
156
+ libraryTemplateId: data.libraryTemplateId
157
+ };
158
+ const [theme, storeProperty, saleFunnelDiscounts] = await Promise.allSettled([
159
+ fetcher([
160
+ LibraryTemplateDocument,
161
+ variables
162
+ ]),
163
+ fetcher([
164
+ StorePropertyDocument
165
+ ]),
166
+ fetcher([
167
+ SaleFunnelDiscountsDocument,
168
+ {
169
+ where: {
170
+ saleFunnelOfferID: data.currentOfferID
171
+ }
172
+ }
173
+ ])
174
+ ]);
175
+ if (theme.status === 'rejected') {
176
+ throw new Error(theme.reason?.[0]);
177
+ }
178
+ if (saleFunnelDiscounts.status === 'rejected') {
179
+ throw new Error(saleFunnelDiscounts.reason?.[0]);
180
+ }
181
+ return {
182
+ dataBuilder: theme.value.libraryTemplate,
183
+ pageStyle: undefined,
184
+ storeProperty,
185
+ productOffers: saleFunnelDiscounts.value.saleFunnelDiscounts?.edges?.filter((item)=>item?.node?.objectType === 'PRODUCT' && item?.node?.type === 'ORDER_VALUE') || []
186
+ };
187
+ };
188
+ const getRelevantPageData = async (data)=>{
189
+ const { id, currentOfferID, fetcher, isLibraryTemplate, librarySaleFunnelID, isShopLibraryPage } = data;
190
+ if (librarySaleFunnelID) {
191
+ return await fetchThemePageDataByTemplateID({
192
+ libraryTemplateId: id,
193
+ currentOfferID,
194
+ librarySaleFunnelID
195
+ }, fetcher);
196
+ }
197
+ if (isShopLibraryPage && currentOfferID) {
198
+ return await fetchShopLibraryPageDataByID({
199
+ shopLibraryPageId: id,
200
+ currentOfferID
201
+ }, fetcher);
202
+ }
203
+ if (isLibraryTemplate && currentOfferID) {
204
+ return await fetchLibraryTemplateDataByID({
205
+ libraryTemplateId: id,
206
+ currentOfferID
207
+ }, fetcher);
208
+ }
209
+ if (currentOfferID) {
210
+ return await fetchPostPurchasePageDataByID({
211
+ themePageId: id,
212
+ currentOfferID
213
+ }, fetcher);
214
+ }
215
+ return await fetchSalePageDataByID({
216
+ themePageId: id
217
+ }, fetcher);
218
+ };
219
+ const getPostPurchasePropsPreview = (fetcher, librarySaleFunnelID, storeFrontFetcher)=>async (data)=>{
220
+ try {
221
+ const { id, currentOfferID, isLibraryTemplate, isShopLibraryPage } = data;
222
+ const { dataBuilder, storeProperty, productOffers, pageStyle } = await getRelevantPageData({
223
+ id,
224
+ currentOfferID,
225
+ fetcher,
226
+ isLibraryTemplate,
227
+ isShopLibraryPage,
228
+ librarySaleFunnelID
229
+ });
230
+ if (!dataBuilder) {
231
+ throw new Error(`No data builder found for slug: /preview/${id}`);
232
+ }
233
+ const pageTemplate = librarySaleFunnelID || isLibraryTemplate && currentOfferID ? parseBuilderLibraryTemplate(dataBuilder) : isShopLibraryPage ? parseShopLibraryPageTemplate(dataBuilder) : parseBuilderTemplateV2(dataBuilder);
234
+ const gemPagesStoreFrontFetcher = storeFrontFetcher || fetcher;
235
+ const [elementFontStyle, fontStyle, fallback] = await Promise.all([
236
+ getFontStyleFromPageTemplate(pageTemplate),
237
+ getFontFromGlobalStyle(pageStyle),
238
+ getFallbackV2(gemPagesStoreFrontFetcher, pageTemplate, false)
239
+ ]);
240
+ const { seo, pageConfig } = usePagePreview(dataBuilder, storeProperty);
241
+ return serializableJson({
242
+ themeStyle: genCSS(pageStyle),
243
+ seo,
244
+ ...pageConfig,
245
+ elementFontStyle,
246
+ fontStyle,
247
+ builderData: pageTemplate,
248
+ swr: {
249
+ fallback
250
+ },
251
+ productOffers
252
+ });
253
+ } catch (err) {
254
+ console.log('error', err);
255
+ captureException(err);
256
+ throw err;
257
+ }
258
+ };
259
+
260
+ export { fetchLibraryTemplateDataByID, fetchPostPurchasePageDataByID, fetchSalePageDataByID, fetchShopLibraryPageDataByID, fetchThemePageDataByTemplateID, getPostPurchasePropsPreview, getRelevantPageData };
@@ -1 +1,16 @@
1
- import{getCollectionProps as r}from"./get-collection-props.js";import{getProductProps as e}from"./get-product-props.js";import{getStaticPageProps as t}from"./get-static-page-props.js";let getPreviewProps=(o,p)=>async(s,c)=>{switch(s){case"COLLECTION":return r(o)(c);case"PRODUCT":return e(o)(c);default:return t(o,p)(c)}};export{getPreviewProps};
1
+ import { getCollectionProps } from './get-collection-props.js';
2
+ import { getProductProps } from './get-product-props.js';
3
+ import { getStaticPageProps } from './get-static-page-props.js';
4
+
5
+ const getPreviewProps = (fetcher, shopifyFetcher)=>async (pageType, slug)=>{
6
+ switch(pageType){
7
+ case 'COLLECTION':
8
+ return getCollectionProps(fetcher)(slug);
9
+ case 'PRODUCT':
10
+ return getProductProps(fetcher)(slug);
11
+ default:
12
+ return getStaticPageProps(fetcher, shopifyFetcher)(slug);
13
+ }
14
+ };
15
+
16
+ export { getPreviewProps };
@@ -1 +1,71 @@
1
- import{getProductBySlug as e,PublishedThemePagesDocument as t,prefetchQueries as r}from"@gem-sdk/core";import{genCSS as a}from"../helpers/gen-css.js";import{parseBuilderTemplate as s}from"../helpers/normalize.js";import{serializableJson as l}from"../helpers/parse-json.js";let getProductProps=o=>async i=>{let m="PRODUCT",d={slug:i,slugType:m},[p,u]=await Promise.all([e(o,i),o([t,d])]),g=u.publishedThemePages?.[0];if(!p||!g)throw Error("Product not found");let f=s(g),h=r(f),n=await Promise.allSettled(h.map(({query:e,variables:t,func:r})=>r?r(o,t):e?o([e,t]):{})),c=h.reduce((e,{key:t},r)=>{let a=n[r];return a?.status==="fulfilled"?{...e,[t]:a.value}:e},{});return l({builderData:f,themeStyle:a(g.pageStyle?.data),pageType:m,swr:{fallback:c},seo:{title:p.title,description:p.description,openGraph:{images:p.featuredImage?.src?[{url:p.featuredImage.src,alt:p.featuredImage?.alt,height:p.featuredImage?.height,width:p.featuredImage?.width,type:p.featuredImage?.contentType}]:[]}},product:p})};export{getProductProps};
1
+ import { getProductBySlug, PublishedThemePagesDocument, prefetchQueries } from '@gem-sdk/core';
2
+ import { genCSS } from '../helpers/gen-css.js';
3
+ import { parseBuilderTemplate } from '../helpers/normalize.js';
4
+ import { serializableJson } from '../helpers/parse-json.js';
5
+
6
+ const getProductProps = (fetcher)=>async (handle)=>{
7
+ const pageType = 'PRODUCT';
8
+ const variables = {
9
+ slug: handle,
10
+ slugType: pageType
11
+ };
12
+ const [product, theme] = await Promise.all([
13
+ getProductBySlug(fetcher, handle),
14
+ fetcher([
15
+ PublishedThemePagesDocument,
16
+ variables
17
+ ])
18
+ ]);
19
+ const dataBuilder = theme.publishedThemePages?.[0];
20
+ if (!product || !dataBuilder) {
21
+ throw new Error('Product not found');
22
+ }
23
+ const productTemplate = parseBuilderTemplate(dataBuilder);
24
+ const queries = prefetchQueries(productTemplate);
25
+ const datas = await Promise.allSettled(queries.map(({ query, variables, func })=>{
26
+ if (func) {
27
+ return func(fetcher, variables);
28
+ }
29
+ if (query) return fetcher([
30
+ query,
31
+ variables
32
+ ]);
33
+ return {};
34
+ }));
35
+ const fallback = queries.reduce((acc, { key }, index)=>{
36
+ const res = datas[index];
37
+ if (res?.status === 'fulfilled') {
38
+ return {
39
+ ...acc,
40
+ [key]: res.value
41
+ };
42
+ }
43
+ return acc;
44
+ }, {});
45
+ return serializableJson({
46
+ builderData: productTemplate,
47
+ themeStyle: genCSS(dataBuilder.pageStyle?.data),
48
+ pageType,
49
+ swr: {
50
+ fallback
51
+ },
52
+ seo: {
53
+ title: product.title,
54
+ description: product.description,
55
+ openGraph: {
56
+ images: product.featuredImage?.src ? [
57
+ {
58
+ url: product.featuredImage.src,
59
+ alt: product.featuredImage?.alt,
60
+ height: product.featuredImage?.height,
61
+ width: product.featuredImage?.width,
62
+ type: product.featuredImage?.contentType
63
+ }
64
+ ] : []
65
+ }
66
+ },
67
+ product
68
+ });
69
+ };
70
+
71
+ export { getProductProps };